diff --git a/mods-download b/mods-download index 20a21f1c..6ed63888 100755 --- a/mods-download +++ b/mods-download @@ -101,6 +101,30 @@ git clone --depth 1 --branch master https://github.com/Grizzly-Adam/BBQ.git git clone --depth 1 --branch master git://cheapiesystems.com/mail git clone --depth 1 --branch master https://github.com/minetest-mods/mydoors.git git clone --depth 1 --branch master https://github.com/TumeniNodes/angledwalls.git +git clone --depth 1 --branch master https://github.com/pyrollo/display_modpack.git +git clone --depth 1 --branch master https://github.com/Sokomine/cottages.git +git clone --depth 1 --branch master https://github.com/joe7575/techpack.git +git clone --depth 1 --branch master https://github.com/random-geek/morelights.git +git clone --depth 1 --branch master https://repo.or.cz/minetest_mtg_plus.git +git clone --depth 1 --branch master https://github.com/minetest-mods/spectator_mode.git +git clone --depth 1 --branch master https://gitlab.com/h2mm/hiking.git +git clone --depth 1 --branch master https://github.com/Extex101/christmas.git +git clone --depth 1 --branch master https://gitlab.com/VanessaE/gloopblocks.git +git clone --depth 1 --branch master https://github.com/minetest-mods/mylandscaping.git +git clone --depth 1 --branch master https://gitlab.com/VanessaE/minislots.git +git clone --depth 1 --branch master git://cheapiesystems.com/prefab_redo +git clone --depth 1 --branch master https://github.com/v-rob/bridger.git +git clone --depth 1 --branch master https://github.com/AiTechEye/smartshop.git +git clone --depth 1 --branch master https://repo.or.cz/minetest_colorcubes.git +git clone --depth 1 --branch master https://github.com/gejan/cards.git +git clone --depth 1 --branch master https://github.com/DonBatman/myboardgames.git +git clone --depth 1 --branch master https://gitlab.com/VanessaE/ilights.git +git clone --depth 1 --branch master https://github.com/TumeniNodes/angledstairs.git +git clone --depth 1 --branch master https://github.com/TumeniNodes/artdeco.git +git clone --depth 1 --branch master https://github.com/TumeniNodes/facade.git +git clone --depth 1 --branch master https://github.com/TumeniNodes/stoneworks.git +git clone --depth 1 --branch master https://github.com/Delaroyas/simplyslopes.git +git clone --depth 1 --branch master https://github.com/joe7575/tubelib2.git #Clean git stuff rm -rf $(find . -name .git*) diff --git a/mods-list b/mods-list index 331ce1ce..46bf71e9 100644 --- a/mods-list +++ b/mods-list @@ -1,192 +1,253 @@ load_mod_interact = false -load_mod_xdecor = true -load_mod_xban2 = true +load_mod_workbench = true load_mod_wool = true load_mod_wine = true -load_mod_vehicle_mash = true -load_mod_unifieddyes = true -load_mod_unifiedbricks = true -load_mod_workbench = true -load_mod_unified_inventory = true -load_mod_ts_furniture = true -load_mod_ts_doors = true -load_mod_trash_can = true -load_mod_throwing_arrows = true -load_mod_throwing = true -load_mod_stamina = true -load_mod_stairs = true -load_mod_stained_glass = true -load_mod_smartfs = true -load_mod_streetspoles = true -load_mod_streetsmod = true -load_mod_streetsconcrete = true -load_mod_streetlamps = true -load_mod_steelsupport = true -load_mod_roadsigns = true -load_mod_emergencyphone = true -load_mod_delineator = true -load_mod_constructionarea = true -load_mod_asphalt = true -load_mod_regrow = true -load_mod_realchess = true -load_mod_protector = true -load_mod_playerplus = true -load_mod_playeranim = true -load_mod_ts_workshop = true -load_mod_woodsoils = true -load_mod_trunks = true -load_mod_poisonivy = true -load_mod_ferns = true -load_mod_homedecor_books = true -load_mod_homedecor_bathroom = true -load_mod_homedecor_fences = true -load_mod_fake_fire = true -load_mod_mobs_turtles = true -load_mod_mobs_jellyfish = true -load_mod_homedecor_3d_extras = true -load_mod_homedecor_seating = true -load_mod_compost = true -load_mod_homedecor_foyer = true -load_mod_mydeck = true -load_mod_doors = true -load_mod_nature_classic = true -load_mod_mob_horse = true -load_mod_homedecor_pictures_and_paintings = true -load_mod_lavalamp = true -load_mod_mobs_monster = true -load_mod_currency = true -load_mod_cloud_items = true -load_mod_castle = true -load_mod_homedecor_wardrobe = true -load_mod_infrastructure = true -load_mod_3d_armor_sfinv = true -load_mod_dryplants = true -load_mod_3d_armor = true -load_mod_cavestuff = true -load_mod_bonemeal = true -load_mod_trees_lib = true -load_mod_building_blocks = true -load_mod_streetsawards = true -load_mod_mypaths = true -load_mod_manholes = true -load_mod_asphaltstairs = true -load_mod_basic_materials = true -load_mod_bushes = true -load_mod_drinks = true -load_mod_3d_armor_ui = true -load_mod_enchanting = true -load_mod_shields = true -load_mod_3d_armor_ip = true -load_mod_homedecor_misc = true -load_mod_coloredwood = true -load_mod_chat2 = true -load_mod_mobs_fish = true -load_mod_windmill = true -load_mod_carpets = true -load_mod_streetshotfix = true -load_mod_moreores = true -load_mod_signs_lib = true -load_mod_flowers_plus = true -load_mod_worldedit_commands = true -load_mod_death_compass = true -load_mod_wieldview = true -load_mod_font_api = true -load_mod_mobs_sharks = true -load_mod_vines = true -load_mod_worldedit_gui = true -load_mod_display_api = true -load_mod_intllib = true -load_mod_blox = true -load_mod_homedecor_bedroom = true -load_mod_mywalls = true -load_mod_worldedit_brush = true -load_mod_carts = true -load_mod_homedecor_clocks = true -load_mod_mobs_bat = true -load_mod_mywoodslopes = true -load_mod_worldedit_shortcommands = true -load_mod_molehills = true -load_mod_moreblocks = true -load_mod_anvils = true -load_mod_homedecor_gastronomy = true -load_mod_bakedclay = true -load_mod_youngtrees = true -load_mod_biome_lib = true -load_mod_basic_signs = true -load_mod_lib_mount = true -load_mod_ambience = true -load_mod_bees = true -load_mod_homedecor_windows_and_treatments = true -load_mod_farming = true -load_mod_homedecor_furniture_medieval = true -load_mod_homedecor_common = true -load_mod_mobs_animal = true -load_mod_homedecor_doors_and_gates = true -load_mod_homedecor_electrical = true -load_mod_mobs_crocs = true -load_mod_junglegrass = true -load_mod_3d_armor_stand = true -load_mod_homedecor_exterior = true -load_mod_builtin_item = true -load_mod_homedecor_furniture = true -load_mod_labels = true -load_mod_homedecor_electronics = true -load_mod_homedecor_kitchen = true -load_mod_homedecor_lighting = true -load_mod_charcoal = true -load_mod_homedecor_roofing = true -load_mod_ts_paper = true -load_mod_signs_api = true -load_mod_homedecor_tables = true -load_mod_homedecor_trash_cans = true -load_mod_stargate = true -load_mod_homedecor_office = true -load_mod_homedecor_laundry = true -load_mod_inbox = true -load_mod_itemframes = true -load_mod_flowerpot = true -load_mod_mobs_npc = true -load_mod_plasmascreen = true -load_mod_jukebox = true -load_mod_trafficlight = true -load_mod_letters = true -load_mod_worldedit = true -load_mod_mail = true -load_mod_plasticbox = true load_mod_mobs_birds = true -load_mod_mobs = true -load_mod_mobs_butterfly = true -load_mod_concretestairs = true -load_mod_crops = true -load_mod_more_chests = true -load_mod_homedecor_climate_control = true -load_mod_moretrees = true -load_mod_mtfoods = true -load_mod_mycorners = true -load_mod_bbq = true -load_mod_mymasonhammer = true +load_mod_plasticbox = true +load_mod_minislots_golden7s_deluxe = true +load_mod_mail = true +load_mod_worldedit = true +load_mod_letters = true +load_mod_trafficlight = true +load_mod_jukebox = true +load_mod_tubelib_addons1 = true +load_mod_plasmascreen = true +load_mod_mobs_npc = true +load_mod_my_future_doors = true +load_mod_itemframes = true +load_mod_homedecor_office = true +load_mod_stargate = true +load_mod_charcoal = true +load_mod_homedecor_lighting = true +load_mod_angledwalls = true +load_mod_builtin_item = true +load_mod_homedecor_exterior = true +load_mod_flowerpot = true +load_mod_3d_armor_stand = true +load_mod_junglegrass = true +load_mod_mobs_crocs = true +load_mod_homedecor_electrical = true +load_mod_homedecor_doors_and_gates = true +load_mod_homedecor_common = true +load_mod_homedecor_furniture_medieval = true +load_mod_morelights = true +load_mod_homedecor_bedroom = true +load_mod_homedecor_laundry = true +load_mod_blox = true +load_mod_homedecor_3d_extras = true load_mod_computer = true load_mod_mymillwork = true +load_mod_drinks = true +load_mod_angledstairs = true +load_mod_nature_classic = true +load_mod_homedecor_clocks = true +load_mod_signs_road = true +load_mod_homedecor_cobweb = true +load_mod_christmas = true +load_mod_along_shore = true +load_mod_artdeco = true +load_mod_carts = true +load_mod_mobs_butterfly = true +load_mod_mobs_animal = true +load_mod_mobs_monster = true +load_mod_lavalamp = true +load_mod_mtg_plus = true +load_mod_homedecor_gastronomy = true +load_mod_anvils = true +load_mod_moreblocks = true +load_mod_molehills = true +load_mod_ontime_clocks = true +load_mod_mtfoods = true +load_mod_sl_controller = true +load_mod_intllib = true +load_mod_display_api = true +load_mod_worldedit_gui = true +load_mod_bridger = true +load_mod_homedecor_trash_cans = true +load_mod_3d_armor_ui = true +load_mod_gloopblocks = true +load_mod_mobs = true +load_mod_worldedit_shortcommands = true +load_mod_worldedit_brush = true +load_mod_bbq = true +load_mod_wieldview = true +load_mod_death_compass = true +load_mod_facade = true +load_mod_inbox = true +load_mod_cloud_items = true +load_mod_flowers_plus = true load_mod_bows = true load_mod_3dmushrooms = true -load_mod_skinsdb = true -load_mod_mysheetmetal = true -load_mod_new_campfire = true +load_mod_minislots_engine = true +load_mod_ambience = true +load_mod_lib_mount = true +load_mod_streetshotfix = true +load_mod_carpets = true +load_mod_windmill = true +load_mod_chat2 = true +load_mod_xban2 = true +load_mod_coloredwood = true +load_mod_homedecor_misc = true +load_mod_3d_armor_ip = true +load_mod_techpack_stairway = true +load_mod_shields = true +load_mod_morelights_extras = true +load_mod_homedecor_roofing = true +load_mod_mys_n_l = true +load_mod_smartfs = true +load_mod_steles = true +load_mod_homedecor_seating = true +load_mod_enchanting = true +load_mod_mycanadiancheckers = true +load_mod_mychess = true +load_mod_asphaltstairs = true +load_mod_manholes = true +load_mod_building_blocks = true +load_mod_3d_armor = true +load_mod_doors = true +load_mod_dryplants = true +load_mod_stoneworks = true +load_mod_bees = true +load_mod_mymasonhammer = true +load_mod_minislots_golden7s = true +load_mod_3d_armor_sfinv = true +load_mod_morelights_vintage = true +load_mod_infrastructure = true +load_mod_bakedclay = true +load_mod_ilights = true +load_mod_castle = true +load_mod_currency = true +load_mod_basic_signs = true +load_mod_youngtrees = true +load_mod_bonemeal = true +load_mod_minislots_work_files = true +load_mod_mylittle_bg = true +load_mod_vines = true +load_mod_ts_doors = true +load_mod_cards = true +load_mod_moretrees = true +load_mod_smartshop = true +load_mod_mobs_fish = true +load_mod_homedecor_foyer = true +load_mod_colorcubes = true +load_mod_fake_fire = true +load_mod_compost = true +load_mod_concretestairs = true +load_mod_signs_api = true +load_mod_mytrouble = true +load_mod_more_chests = true +load_mod_ts_paper = true +load_mod_crops = true +load_mod_boards = true +load_mod_trees_lib = true +load_mod_mydiamondblock = true +load_mod_signs_lib = true +load_mod_homedecor_climate_control = true +load_mod_protector = true +load_mod_font_metro = true +load_mod_homedecor_kitchen = true +load_mod_homedecor_electronics = true +load_mod_signs = true +load_mod_mobs_jellyfish = true +load_mod_mobs_sharks = true +load_mod_mobs_turtles = true +load_mod_safer_lua = true +load_mod_morelights_modern = true +load_mod_homedecor_pictures_and_paintings = true +load_mod_moreores = true +load_mod_my_game_pieces = true +load_mod_mydraughts = true +load_mod_my_saloon_doors = true +load_mod_throwing_arrows = true +load_mod_basic_materials = true +load_mod_mygomoku = true +load_mod_worldedit_commands = true +load_mod_regrow = true +load_mod_gravelsieve = true +load_mod_homedecor_tables = true +load_mod_mycorners = true +load_mod_homedecor_furniture = true +load_mod_homedecor_fences = true +load_mod_mypachisi = true +load_mod_homedecor_books = true +load_mod_mypirinola = true +load_mod_unified_inventory = true +load_mod_mypitfall = true +load_mod_mys_n_l_mini = true +load_mod_labels = true +load_mod_myuno = true +load_mod_mydeck = true +load_mod_my_castle_doors = true +load_mod_biome_lib = true +load_mod_my_misc_doors = true +load_mod_my_cottage_doors = true +load_mod_woodsoils = true +load_mod_lcdlib = true +load_mod_ts_workshop = true +load_mod_my_default_doors = true +load_mod_ferns = true +load_mod_my_door_wood = true +load_mod_my_fancy_doors = true +load_mod_my_garage_door = true +load_mod_emergencyphone = true +load_mod_my_hidden_doors = true +load_mod_homedecor_wardrobe = true +load_mod_my_old_doors = true +load_mod_homedecor_bathroom = true +load_mod_my_sliding_doors = true +load_mod_homedecor_windows_and_treatments = true +load_mod_bushes = true +load_mod_mylandscaping = true +load_mod_streetsmod = true +load_mod_mypaths = true +load_mod_mob_horse = true +load_mod_streetsawards = true load_mod_myroofs = true load_mod_pie = true -load_mod_homedecor_cobweb = true -load_mod_along_shore = true +load_mod_mysheetmetal = true +load_mod_skinsdb = true +load_mod_mywalls = true +load_mod_mywoodslopes = true +load_mod_tubelib_addons3 = true +load_mod_new_campfire = true load_mod_bushes_classic = true -load_mod_my_old_doors = true -load_mod_my_misc_doors = true -load_mod_my_hidden_doors = true -load_mod_my_fancy_doors = true -load_mod_my_door_wood = true -load_mod_my_castle_doors = true -load_mod_my_future_doors = true -load_mod_my_saloon_doors = true -load_mod_my_cottage_doors = true -load_mod_angledwalls = true -load_mod_my_default_doors = true -load_mod_my_garage_door = true -load_mod_my_sliding_doors = true +load_mod_farming = true +load_mod_cavestuff = true +load_mod_font_api = true +load_mod_poisonivy = true +load_mod_xdecor = true +load_mod_trunks = true +load_mod_mobs_bat = true +load_mod_playeranim = true +load_mod_playerplus = true +load_mod_prefab_redo = true +load_mod_realchess = true +load_mod_asphalt = true +load_mod_constructionarea = true +load_mod_delineator = true +load_mod_roadsigns = true +load_mod_steelsupport = true +load_mod_hiking = true +load_mod_streetlamps = true +load_mod_streetsconcrete = true +load_mod_mymazes = true +load_mod_streetspoles = true +load_mod_simplyslopes = true +load_mod_spectator_mode = true +load_mod_stained_glass = true +load_mod_stairs = true +load_mod_tubelib_addons2 = true +load_mod_stamina = true +load_mod_smartline = true +load_mod_techpack_warehouse = true +load_mod_tubelib = true +load_mod_throwing = true +load_mod_cottages = true +load_mod_trash_can = true +load_mod_myconnect4 = true +load_mod_ts_furniture = true +load_mod_tubelib2 = true +load_mod_mycheckers = true +load_mod_unifiedbricks = true +load_mod_unifieddyes = true +load_mod_vehicle_mash = true diff --git a/mods/angledstairs/README.md b/mods/angledstairs/README.md new file mode 100644 index 00000000..79c7a344 --- /dev/null +++ b/mods/angledstairs/README.md @@ -0,0 +1,4 @@ +# angledstairs +Adds angled stairs to Minetest Game + +![Preview](https://github.com/TumeniNodes/angledstairs/blob/master/screenshot.png) diff --git a/mods/angledstairs/README.txt b/mods/angledstairs/README.txt new file mode 100644 index 00000000..1cf5a714 --- /dev/null +++ b/mods/angledstairs/README.txt @@ -0,0 +1,11 @@ + Angled stairs are useful for placing stairs at angled elevations, as well as to build a useable spiral-like staircase. + They are also manipulated with the screwdriver, which adds some fun building options as well. + Support for default textures. + + Thank you to all who helped with this mod. + +Napiophelios +sofar +pithy +Nathan S. +azekill_DIABLO diff --git a/mods/angledstairs/angled_stairs_inventory.png b/mods/angledstairs/angled_stairs_inventory.png new file mode 100644 index 00000000..05acf3ce Binary files /dev/null and b/mods/angledstairs/angled_stairs_inventory.png differ diff --git a/mods/angledstairs/depends.txt b/mods/angledstairs/depends.txt new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/mods/angledstairs/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/angledstairs/description.txt b/mods/angledstairs/description.txt new file mode 100644 index 00000000..9c1ad968 --- /dev/null +++ b/mods/angledstairs/description.txt @@ -0,0 +1,3 @@ + Adds angled stairs to the Minetest Game. +https://forum.minetest.net/viewtopic.php?f=9&t=14801 +See README.txt for a little more information (very little...) diff --git a/mods/angledstairs/init.lua b/mods/angledstairs/init.lua new file mode 100644 index 00000000..87210c7d --- /dev/null +++ b/mods/angledstairs/init.lua @@ -0,0 +1,475 @@ +-- [Mod] Angled Stairs [angledstairs] (1.2) by TumeniNodes 05-31-2016 + +angledstairs = {} + +-- Register angledstairs. +-- Node will be called angledstairs:angled_stair_ + +function angledstairs.register_angled_stair(subname, recipeitem, groups, images, description, sounds) + groups.angledstair = 1 +minetest.register_node(":angledstairs:angled_stair_right" .. subname, { + description = description, + drawtype = "mesh", + mesh = "angled_stairR.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + facedir = simple, + groups = groups, + sounds = sounds, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.0625, 0.5, 0.5}, + {0.0625, -0.5, 0.0625, 0.125, 0.5, 0.5}, + {0.125, -0.5, 0.125, 0.1875, 0.5, 0.5}, + {0.1875, -0.5, 0.1875, 0.25, 0.5, 0.5}, + {0.25, -0.5, 0.25, 0.3125, 0.5, 0.5}, + {0.3125, -0.5, 0.3125, 0.375, 0.5, 0.5}, + {0.375, -0.5, 0.375, 0.4375, 0.5, 0.5}, + {0.4375, -0.5, 0.4375, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5, -0.4375, 0.5, -0.4375}, + {-0.5, -0.5, -0.4375, -0.375, 0.5, -0.375}, + {-0.5, -0.5, -0.375, -0.3125, 0.5, -0.3125}, + {-0.5, -0.5, -0.3125, -0.25, 0.5, -0.25}, + {-0.5, -0.5, -0.25, -0.1875, 0.5, -0.1875}, + {-0.5, -0.5, -0.1875, -0.125, 0.5, -0.125}, + {-0.5, -0.5, -0.125, -0.0625, 0.5, -0.0625}, + {-0.5, -0.5, -0.0625, 0, 0.5, 0}, + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + } + } +}) + +minetest.register_node(":angledstairs:angled_stair_left" .. subname, { + description = description, + drawtype = "mesh", + mesh = "angled_stairL.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + facedir = simple, + groups = groups, + sounds = sounds, + collision_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 0, 0.5, 0.5, 0.5}, + {-0.125, -0.5, 0.0625, -0.0625, 0.5, 0.5}, + {-0.1875, -0.5, 0.125, -0.125, 0.5, 0.5}, + {-0.25, -0.5, 0.1875, -0.1875, 0.5, 0.5}, + {-0.3125, -0.5, 0.25, -0.25, 0.5, 0.5}, + {-0.375, -0.5, 0.3125, -0.3125, 0.5, 0.5}, + {-0.4375, -0.5, 0.375, -0.375, 0.5, 0.5}, + {-0.5, -0.5, 0.4375, -0.4375, 0.5, 0.5}, + {0.4375, -0.5, -0.5, 0.5, 0.5, -0.4375}, + {0.375, -0.5, -0.4375, 0.5, 0.5, -0.375}, + {0.3125, -0.5, -0.375, 0.5, 0.5, -0.3125}, + {0.25, -0.5, -0.3125, 0.5, 0.5, -0.25}, + {0.1875, -0.5, -0.25, 0.5, 0.5, -0.1875}, + {0.125, -0.5, -0.1875, 0.5, 0.5, -0.125}, + {0.0625, -0.5, -0.125, 0.5, 0.5, -0.0625}, + {0, -0.5, -0.0625, 0.5, 0.5, 0}, + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + } + } +}) +end + +-- Register angledstairs. +-- Node will be called angledstairs:angled_slab_ + +function angledstairs.register_angled_slab(subname, recipeitem, groups, images, description, sounds) + groups.angledslab = 1 +minetest.register_node(":angledstairs:angled_slab_right" .. subname, { + description = description, + drawtype = "mesh", + mesh = "angled_slabR.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + groups = groups, + sounds = sounds, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.0625, 0, 0.5}, + {0.0625, -0.5, 0.0625, 0.125, 0, 0.5}, + {0.125, -0.5, 0.125, 0.1875, 0, 0.5}, + {0.1875, -0.5, 0.1875, 0.25, 0, 0.5}, + {0.25, -0.5, 0.25, 0.3125, 0, 0.5}, + {0.3125, -0.5, 0.3125, 0.375, 0, 0.5}, + {0.375, -0.5, 0.375, 0.4375, 0, 0.5}, + {0.4375, -0.5, 0.4375, 0.5, 0, 0.5}, + {-0.5, -0.5, -0.5, -0.4375, 0, -0.4375}, + {-0.5, -0.5, -0.4375, -0.375, 0, -0.375}, + {-0.5, -0.5, -0.375, -0.3125, 0, -0.3125}, + {-0.5, -0.5, -0.3125, -0.25, 0, -0.25}, + {-0.5, -0.5, -0.25, -0.1875, 0, -0.1875}, + {-0.5, -0.5, -0.1875, -0.125, 0, -0.125}, + {-0.5, -0.5, -0.125, -0.0625, 0, -0.0625}, + {-0.5, -0.5, -0.0625, 0, 0, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-.5, -.5, -.5, .5, 0, .5}, + } + }, +}) + +minetest.register_node(":angledstairs:angled_slab_left" .. subname, { + description = description, + drawtype = "mesh", + mesh = "angled_slabL.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + groups = groups, + sounds = sounds, + collision_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 0, 0.5, 0, 0.5}, + {-0.125, -0.5, 0.0625, -0.0625, 0, 0.5}, + {-0.1875, -0.5, 0.125, -0.125, 0, 0.5}, + {-0.25, -0.5, 0.1875, -0.1875, 0, 0.5}, + {-0.3125, -0.5, 0.25, -0.25, 0, 0.5}, + {-0.375, -0.5, 0.3125, -0.3125, 0, 0.5}, + {-0.4375, -0.5, 0.375, -0.375, 0, 0.5}, + {-0.5, -0.5, 0.4375, -0.4375, 0, 0.5}, + {0.4375, -0.5, -0.5, 0.5, 0, -0.4375}, + {0.375, -0.5, -0.4375, 0.5, 0, -0.375}, + {0.3125, -0.5, -0.375, 0.5, 0, -0.3125}, + {0.25, -0.5, -0.3125, 0.5, 0, -0.25}, + {0.1875, -0.5, -0.25, 0.5, 0, -0.1875}, + {0.125, -0.5, -0.1875, 0.5, 0, -0.125}, + {0.0625, -0.5, -0.125, 0.5, 0, -0.0625}, + {0, -0.5, -0.0625, 0.5, 0, 0}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-.5, -.5, -.5, .5, 0, .5}, + } + }, +}) +end + +-- Angled stair/slab registration function. +-- Nodes will be called angledstairs:{angled_stair,angled_slab}_ + +function angledstairs.register_angled_stair_and_angled_slab(subname, recipeitem, groups, images,desc_angled_stair, desc_angled_slab, sounds) + angledstairs.register_angled_stair(subname, recipeitem, groups, images, desc_angled_stair, sounds) + angledstairs.register_angled_slab(subname, recipeitem, groups, images, desc_angled_slab, sounds) +end + + +-- Register angled stairs and slabs + +angledstairs.register_angled_stair_and_angled_slab("_acacia_wood", "default:acacia_wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_acacia_wood.png"}, + "Acacia Wood Stair", + "Acacia Wood Slab", + default.node_sound_wood_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_aspen_wood", "default:aspen_wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_aspen_wood.png"}, + "Aspen Wood Stair", + "Aspen Wood Slab", + default.node_sound_wood_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_junglewood", "default:junglewood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_junglewood.png"}, + "Junglewood Angled Stair", + "Junglewood Angled Slab", + default.node_sound_wood_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_pine_wood", "default:pine_wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_pine_wood.png"}, + "Pine Wood Stair", + "Pine Wood Slab", + default.node_sound_wood_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_wood", "default:wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_wood.png"}, + "Wooden Angled Stair", + "Wooden Angled Slab", + default.node_sound_wood_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_brick", "default:brick", + {cracky = 3}, + {"default_brick.png"}, + "Brick Stair", + "Brick Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_clay", "default:clay", + {cracky = 3}, + {"default_clay.png"}, + "Clay Stair", + "Clay Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_cobble", "default:cobble", + {cracky = 3}, + {"default_cobble.png"}, + "Cobblestone Stair", + "Cobblestone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_mossycobble", "default:mossycobble", + {cracky = 3}, + {"default_mossycobble.png"}, + "Mossy Cobblestone Stair", + "Mossy Cobblestone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_desert_cobble", "default:desert_cobble", + {cracky = 3}, + {"default_desert_cobble.png"}, + "Desert Cobblestone Stair", + "Desert Cobblestone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_desert_stone", "default:desert_stone", + {cracky = 3}, + {"default_desert_stone.png"}, + "Desertstone Stair", + "Desertstone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_desert_stone_block", "default:desert_stone_block", + {cracky = 3}, + {"default_desert_stone_block.png"}, + "Desert Stone Block Stair", + "Desert Stone Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_desert_stonebrick", "default:desert_stonebrick", + {cracky = 3}, + {"default_desert_stone_brick.png"}, + "Desert Stone Brick Stair", + "Desert Stone Brick Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_desert_sandstone", "default:desert_sandstone", + {cracky = 3}, + {"default_desert_sandstone.png"}, + "Desert Sandstone Stair", + "Desert Sandstone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_desert_sandstone_block", "default:desert_sandstone_block", + {cracky = 3}, + {"default_desert_sandstone_block.png"}, + "Desert Sandstone Block Stair", + "Desert Sandstone Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_desert_sandstone_brick", "default:desert_sandstone_brick", + {cracky = 3}, + {"default_desert_sandstone_brick.png"}, + "Desert Sandstone Brick Stair", + "Desert Sandstone Brick Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_sandstone", "default:sandstone", + {crumbly = 1, cracky = 3}, + {"default_sandstone.png"}, + "Sandstone Stair", + "Sandstone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_sandstone_block", "default:sandstone_block", + {cracky = 2}, + {"default_sandstone_block.png"}, + "Sandstone Block Stair", + "Sandstone Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_sandstonebrick", "default:sandstonebrick", + {cracky = 2}, + {"default_sandstone_brick.png"}, + "Sandstone Brick Stair", + "Sandstone Brick Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_silver_sandstone", "default:silver_sandstone", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone.png"}, + "Silver Sandstone Stair", + "Silver Sandstone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_silver_sandstone_block", "default:silver_sandstone_block", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone_block.png"}, + "Silver Sandstone Block Stair", + "Silver Sandstone Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_silver_sandstone_brick", "default:silver_sandstone_brick", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone_brick.png"}, + "Silver Sandstone Brick Stair", + "Silver Sandstone Brick Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_stone", "default:stone", + {cracky = 3}, + {"default_stone.png"}, + "Stone Stair", + "Stone Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_stone_block", "default:stone_block", + {cracky = 3}, + {"default_stone_block.png"}, + "Stone Block Stair", + "Stone Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_stonebrick", "default:stonebrick", + {cracky = 3}, + {"default_stone_brick.png"}, + "Stone Brick Stair", + "Stone Brick Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_obsidian", "default:obsidian", + {cracky = 1, level = 2}, + {"default_obsidian.png"}, + "Obsidian Stair", + "Obsidian Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_obsidian_block", "default:obsidian_block", + {cracky = 1, level = 2}, + {"default_obsidian_block.png"}, + "Obsidian Block Stair", + "Obsidian Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_obsidianbrick", "default:obsidianbrick", + {cracky = 1, level = 2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick Stair", + "Obsidian Brick Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_bronzeblock", "default:bronzeblock", + {cracky = 1, level = 2}, + {"default_bronze_block.png"}, + "Bronze Block Stair", + "Bronze Block Slab", + default.node_sound_metal_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_copperblock", "default:copperblock", + {cracky = 1, level = 2}, + {"default_copper_block.png"}, + "Copper Block Stair", + "Copper Block Slab", + default.node_sound_metal_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_diamondblock", "default:diamondblock", + {cracky = 1}, + {"default_diamond_block.png"}, + "Diamond Block Stair", + "Diamond Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_goldblock", "default:goldblock", + {cracky = 1}, + {"default_gold_block.png"}, + "Gold Block Stair", + "Gold Block Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_meseblock", "default:meseblock", + {cracky = 1, level = 2}, + {"default_mese_block.png"}, + "Mese Block Stair", + "Mese Block Slab", + default.node_sound_metal_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_steelblock", "default:steelblock", + {cracky = 1, level = 2}, + {"default_steel_block.png"}, + "Steel Block Stair", + "Steel Block Slab", + default.node_sound_metal_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_tinblock", "default:tinblock", + {cracky = 1, level = 2}, + {"default_tin_block.png"}, + "Tin Block Stair", + "Tin Block Slab", + default.node_sound_metal_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_dirt", "default:dirt", + {cracky = 1, level = 2}, + {"default_dirt.png"}, + "Dirt Stair", + "Dirt Slab", + default.node_sound_dirt_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_grass", "default:grass", + {cracky = 1, level = 2}, + {"default_grass.png"}, + "Grass Stair", + "Grass Slab", + default.node_sound_dirt_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_ice", "default:ice", + {cracky = 1, level = 2}, + {"default_ice.png"}, + "Ice Stair", + "Ice Slab", + default.node_sound_glass_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_snow", "default:snow", + {cracky = 1, level = 2}, + {"default_snow.png"}, + "Snow Block Stair", + "Snow Block Slab", + default.node_sound_dirt_defaults()) + +--- placeholders for glass for a later date they look terrible right now. need to work on the models more eventually +--[[angledstairs.register_angled_stair_and_angled_slab("_glass", "default:glass", + {cracky = 1, level = 2}, + {"default_glass.png"}, + "Glass Stair", + "Glass Slab", + default.node_sound_glass_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_obsidian_glass", "default:obsidian_glass", + {cracky = 1, level = 2}, + {"default_obsidian_glass.png"}, + "Obsidian Glass Stair", + "Obsidian Glass Slab", + default.node_sound_glass_defaults())]]-- + +--and lava & water... just because + +angledstairs.register_angled_stair_and_angled_slab("_lava", "default:lava", + {cracky = 1, level = 2}, + {"default_lava.png"}, + "Lava Stair", + "Lava Slab", + default.node_sound_stone_defaults()) + +angledstairs.register_angled_stair_and_angled_slab("_water", "default:water", + {cracky = 1, level = 2}, + {"default_water.png"}, + "Water Stair", + "Water Slab", + default.node_sound_stone_defaults()) + diff --git a/mods/angledstairs/license.txt b/mods/angledstairs/license.txt new file mode 100644 index 00000000..f50419b0 --- /dev/null +++ b/mods/angledstairs/license.txt @@ -0,0 +1,13 @@ +DO WHAT YOU WANT TO PUBLIC LICENSE +or abbreviated DWYWPL + +December 2nd 2015 +License Copyright (C) 2015 Michael Tomaino (PlatinumArts@gmail.com) +www.sandboxgamemaker.com/DWYWPL/ + +DO WHAT YOU WANT TO PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +1. You are allowed to do whatever you want to with what content is using this license. +2. This content is provided 'as-is', without any express or implied warranty. In no event +will the authors be held liable for any damages arising from the use of this content. diff --git a/mods/angledstairs/mod.conf b/mods/angledstairs/mod.conf new file mode 100644 index 00000000..07eb096d --- /dev/null +++ b/mods/angledstairs/mod.conf @@ -0,0 +1 @@ +mod = angledstairs diff --git a/mods/angledstairs/models/angled_slabL.obj b/mods/angledstairs/models/angled_slabL.obj new file mode 100644 index 00000000..f3c7e37d --- /dev/null +++ b/mods/angledstairs/models/angled_slabL.obj @@ -0,0 +1,34 @@ +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.000000 0.500000 +v -0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +vt -0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt -0.0000 1.0000 +vt 1.0000 -0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt -0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt -0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 1.0000 +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 +s off +f 4/1/1 1/2/1 3/3/1 6/4/1 +f 5/5/2 4/6/2 6/7/2 +f 1/8/3 4/9/3 5/10/3 2/11/3 +f 2/12/4 5/13/4 6/14/4 3/15/4 +f 2/12/5 3/16/5 1/2/5 diff --git a/mods/angledstairs/models/angled_slabR.obj b/mods/angledstairs/models/angled_slabR.obj new file mode 100644 index 00000000..e174e24f --- /dev/null +++ b/mods/angledstairs/models/angled_slabR.obj @@ -0,0 +1,34 @@ +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.000000 -0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 0.500000 +vt -0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 1.0000 +vt -0.0000 -0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt -0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt -0.0000 0.5000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +s off +f 4/1/1 1/2/1 3/3/1 6/4/1 +f 5/5/2 4/6/2 6/7/2 +f 1/8/3 4/9/3 5/10/3 2/11/3 +f 2/12/4 5/13/4 6/14/4 3/15/4 +f 2/11/5 3/3/5 1/16/5 diff --git a/mods/angledstairs/models/angled_stairL.obj b/mods/angledstairs/models/angled_stairL.obj new file mode 100644 index 00000000..da61c9a1 --- /dev/null +++ b/mods/angledstairs/models/angled_stairL.obj @@ -0,0 +1,57 @@ +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.000000 0.500000 +v -0.500000 -0.000000 -0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.500000 0.500000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 0.5000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 1.0000 0.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 0.5000 +vt 1.0000 1.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn 0.7071 0.0000 -0.7071 +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.0000 1.0000 0.0000 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 1/9/3 6/6/3 9/10/3 2/11/3 +f 2/12/4 9/13/4 5/5/4 3/3/4 +f 6/14/5 4/4/5 10/15/5 +f 5/16/6 8/17/6 10/18/6 +f 10/15/7 8/8/7 7/19/7 +f 10/15/5 7/20/5 6/14/5 +f 4/4/5 6/14/5 1/21/5 +f 9/22/7 6/23/7 5/24/7 +f 4/25/6 3/26/6 5/16/6 +f 5/16/6 10/18/6 4/25/6 diff --git a/mods/angledstairs/models/angled_stairR.obj b/mods/angledstairs/models/angled_stairR.obj new file mode 100644 index 00000000..20596919 --- /dev/null +++ b/mods/angledstairs/models/angled_stairR.obj @@ -0,0 +1,57 @@ +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.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 0.5000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.5000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 0.5000 +vt 0.0000 0.0000 +vt 0.0000 0.5000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 1.0000 0.5000 +vt 1.0000 1.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 0.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vt 1.0000 1.0000 +vt 0.0000 0.0000 +vt 1.0000 0.0000 +vn 0.0000 -1.0000 -0.0000 +vn -0.7071 0.0000 -0.7071 +vn -1.0000 0.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 0.0000 1.0000 -0.0000 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 7/5/2 5/6/2 8/7/2 9/8/2 +f 1/1/3 5/6/3 6/9/3 2/10/3 +f 2/11/4 6/12/4 7/5/4 3/13/4 +f 5/14/5 4/15/5 10/16/5 +f 7/17/6 9/18/6 10/19/6 +f 10/19/7 9/20/7 8/7/7 +f 10/16/5 8/21/5 5/14/5 +f 4/15/5 5/14/5 1/22/5 +f 6/23/7 5/24/7 7/25/7 +f 4/4/6 3/26/6 7/17/6 +f 7/17/6 10/19/6 4/4/6 diff --git a/mods/angledstairs/models/credits.txt b/mods/angledstairs/models/credits.txt new file mode 100644 index 00000000..26966470 --- /dev/null +++ b/mods/angledstairs/models/credits.txt @@ -0,0 +1,7 @@ +Models in .obj format provided by "pithy" License: DWYWPL +https://forum.minetest.net/memberlist.php?mode=viewprofile&u=19278 + +link to post +https://forum.minetest.net/viewtopic.php?p=220247#p220247 Thank you pithy. + +Additional work on models provided by "sofar" License: CC-BY-SA-4.0 - Auke Kok diff --git a/mods/angledstairs/models/license.txt b/mods/angledstairs/models/license.txt new file mode 100644 index 00000000..f50419b0 --- /dev/null +++ b/mods/angledstairs/models/license.txt @@ -0,0 +1,13 @@ +DO WHAT YOU WANT TO PUBLIC LICENSE +or abbreviated DWYWPL + +December 2nd 2015 +License Copyright (C) 2015 Michael Tomaino (PlatinumArts@gmail.com) +www.sandboxgamemaker.com/DWYWPL/ + +DO WHAT YOU WANT TO PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +1. You are allowed to do whatever you want to with what content is using this license. +2. This content is provided 'as-is', without any express or implied warranty. In no event +will the authors be held liable for any damages arising from the use of this content. diff --git a/mods/angledstairs/screenshot.png b/mods/angledstairs/screenshot.png new file mode 100644 index 00000000..912e642d Binary files /dev/null and b/mods/angledstairs/screenshot.png differ diff --git a/mods/artdeco/LICENSE b/mods/artdeco/LICENSE new file mode 100644 index 00000000..cf1ab25d --- /dev/null +++ b/mods/artdeco/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/mods/artdeco/README.md b/mods/artdeco/README.md new file mode 100644 index 00000000..ac9a3b37 --- /dev/null +++ b/mods/artdeco/README.md @@ -0,0 +1,2 @@ +# artdeco +A mod which adds new building blocks to Minetest diff --git a/mods/artdeco/README.txt b/mods/artdeco/README.txt new file mode 100644 index 00000000..0ee77f2b --- /dev/null +++ b/mods/artdeco/README.txt @@ -0,0 +1,8 @@ + This mod adds new building blocks to Minetest. + Please read the "license.txt" file for license info. + Any credit / mention of author will always be greatly appreciated. + + I want to thank the Minetest creators, devs, and community members who have all put so much work into this free software, and who are always willing and there to help with any questions. All your work is greatly appreciated, and enjoyed. + + The x16 and x32 textures obviously need some tweaking. I will get to them at a later date, I just wanted to make sure they were at least available for users who prefer them. + The stained glass windows are installed by aiming at either the front or back of the arches blocks. If you point at a regular block and set it, this sets the glass inside said block (a funny glich that turned up). diff --git a/mods/artdeco/changelog.txt b/mods/artdeco/changelog.txt new file mode 100644 index 00000000..7a3f4b67 --- /dev/null +++ b/mods/artdeco/changelog.txt @@ -0,0 +1,3 @@ +02/03/2017: +chg-01: Updated with new code and texture for estate door from 0.04.14 default doors mod +chg-02: Update version to 1.1 diff --git a/mods/artdeco/depends.txt b/mods/artdeco/depends.txt new file mode 100644 index 00000000..f2c4494d --- /dev/null +++ b/mods/artdeco/depends.txt @@ -0,0 +1,2 @@ +default +doors diff --git a/mods/artdeco/description.txt b/mods/artdeco/description.txt new file mode 100644 index 00000000..ed393c0c --- /dev/null +++ b/mods/artdeco/description.txt @@ -0,0 +1 @@ +This mod just adds some new building blocks to Minetest. diff --git a/mods/artdeco/init.lua b/mods/artdeco/init.lua new file mode 100644 index 00000000..0601d0e6 --- /dev/null +++ b/mods/artdeco/init.lua @@ -0,0 +1,1074 @@ +-- ArtDeco (1.1) by TumeniNodes + +minetest.register_node("artdeco:lionheart", { + description = "ArtDeco lionheart", + tiles = {"artdeco_lionheart.png", "artdeco_lionheart_bottom.png", "artdeco_lionheart_side.png", "artdeco_lionheart_side.png", "artdeco_lionheart_back.png", "artdeco_lionheart_front.png"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1a", { + description = "ArtDeco 1a", + tiles = {"artdeco_1a.png", "artdeco_1a_bottom.png", + "artdeco_1a_side.png", "artdeco_1a_side.png", + "artdeco_1a_back.png", "artdeco_1a_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1b", { + description = "ArtDeco 1b", + tiles = {"artdeco_1b.png", "artdeco_1b_bottom.png", + "artdeco_1b_rside.png", "artdeco_1b_lside.png", + "artdeco_1b_back.png", "artdeco_1b_front.png"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1c", { + description = "ArtDeco 1c", + tiles = {"artdeco_1c.png", "artdeco_1c_bottom.png", + "artdeco_1c_rside.png", "artdeco_1c_lside.png", + "artdeco_1c_back.png", "artdeco_1c_front.png"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups ={cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1d", { + description = "ArtDeco 1d", + tiles = {"artdeco_1d.png", "artdeco_1d_bottom.png", + "artdeco_1d_rside.png", "artdeco_1d_lside.png", + "artdeco_1d_back.png", "artdeco_1d_front.png"}, + paramtype2 = "facedir", + legacy_facedor_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1e", { + description = "ArtDeco 1e", + tiles = {"artdeco_1e.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1f", { + description = "ArtDeco 1f", + tiles = {"artdeco_1f.png", "artdeco_1f_bottom.png", + "artdeco_1f_rside.png", "artdeco_1f_lside.png", + "artdeco_1f_back.png", "artdeco_1f_front.png"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1g", { + description = "ArtDeco 1g", + tiles = {"artdeco_1g.png", "artdeco_1g_bottom.png", + "artdeco_1g_rside.png", "artdeco_1g_lside.png", + "artdeco_1g_back.png", "artdeco_1g_front.png"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1h", { + description = "ArtDeco 1h", + tiles = {"artdeco_1h.png", "artdeco_1h_bottom.png", + "artdeco_1h_rside.png", "artdeco_1h_lside.png", + "artdeco_1h_back.png", "artdeco_1h_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1i", { + description = "ArtDeco 1i", + tiles = {"artdeco_1i.png", "artdeco_1i_bottom.png", + "artdeco_1i_rside.png", "artdeco_1i_lside.png", + "artdeco_1i_back.png", "artdeco_1i_front.png"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1j", { + description = "ArtDeco 1j", + tiles = {"artdeco_1j.png", "artdeco_1j_bottom.png", + "artdeco_1j_side.png", "artdeco_1j_side.png", + "artdeco_1j_back.png", "artdeco_1j_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1k", { + description = "ArtDeco 1k", + tiles = {"artdeco_1k.png", "artdeco_1k_bottom.png", + "artdeco_1k_side.png", "artdeco_1k_side.png", + "artdeco_1k_back.png", "artdeco_1k_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:1l", { + description = "ArtDeco 1l", + tiles = {"artdeco_1l.png", "artdeco_1l_bottom.png", + "artdeco_1l_side.png", "artdeco_1l_side.png", + "artdeco_1l_side.png", "artdeco_1l_side.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:arch1a", { + description = "ArtDeco arch1a", + tiles = {"artdeco_arch1a.png", "artdeco_arch1a_bottom.png", + "artdeco_arch1a_rside.png", "artdeco_arch1a_lside.png", + "artdeco_arch1a_back.png", "artdeco_arch1a_front.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.0625, -0.5, 0.5, 0.5, 0.5}, + {0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, + {0.3125, -0.25, -0.5, 0.4375, 0, 0.5}, + {-0.5, -0.25, -0.5, -0.3125, 0.5, 0.5}, + {-0.5, -0.125, -0.5, -0.25, 0.5, 0.5}, + {0.25, -0.125, -0.5, 0.4375, 0.5, 0.5}, + {0.1875, -0.0625, -0.5, 0.5, 0.5, 0.5}, + {-0.4375, -0.0625, -0.5, -0.1875, 0.5, 0.5}, + {-0.4375, 0, -0.5, -0.0625, 0.5, 0.5}, + {0.0625, 0, -0.5, 0.4375, 0.5, 0.5}, + {0.1875, -0.0625, -0.5625, 0.3125, 0.0625, 0.5}, + {0.0625, 0, -0.5625, 0.1875, 0.125, 0.5}, + {-0.0625, 0.0625, -0.5625, 0.0625, 0.1875, 0.5}, + {-0.1875, 0, -0.5625, -0.0625, 0.125, 0.5}, + {-0.3125, -0.0625, -0.5625, -0.1875, 0.0625, 0.5}, + {-0.375, -0.125, -0.5625, -0.25, 0, 0.5}, + {-0.4375, -0.25, -0.5625, -0.3125, -0.125, 0.5}, + {-0.5, -0.5, -0.5625, -0.375, -0.25, 0.5}, + {0.375, -0.5, -0.5625, 0.5, -0.25, 0.5}, + {0.3125, -0.25, -0.5625, 0.4375, -0.125, 0.5}, + {0.375, 0, -0.5625, 0.25, -0.125, 0.5}, + } + }, +}) + +minetest.register_node("artdeco:arch2a", { + description = "ArtDeco arch2a", + tiles = {"artdeco_arch2a.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.0625, -0.5, 0.5, 0.5, 0.5}, + {0.375, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, + {0.3125, -0.25, -0.5, 0.4375, 0, 0.5}, + {-0.5, -0.25, -0.5, -0.3125, 0.5, 0.5}, + {-0.5, -0.125, -0.5, -0.25, 0.5, 0.5}, + {0.25, -0.125, -0.5, 0.4375, 0.5, 0.5}, + {0.1875, -0.0625, -0.5, 0.5, 0.5, 0.5}, + {-0.4375, -0.0625, -0.5, -0.1875, 0.5, 0.5}, + {-0.4375, 0, -0.5, -0.0625, 0.5, 0.5}, + {0.0625, 0, -0.5, 0.4375, 0.5, 0.5}, + {0.1875, -0.0625, -0.5625, 0.3125, 0.0625, 0.5}, + {0.0625, 0, -0.5625, 0.1875, 0.125, 0.5}, + {-0.0625, 0.0625, -0.5625, 0.0625, 0.1875, 0.5}, + {-0.1875, 0, -0.5625, -0.0625, 0.125, 0.5}, + {-0.3125, -0.0625, -0.5625, -0.1875, 0.0625, 0.5}, + {-0.375, -0.125, -0.5625, -0.25, 0, 0.5}, + {-0.4375, -0.25, -0.5625, -0.3125, -0.125, 0.5}, + {-0.5, -0.5, -0.5625, -0.375, -0.25, 0.5}, + {0.375, -0.5, -0.5625, 0.5, -0.25, 0.5}, + {0.3125, -0.25, -0.5625, 0.4375, -0.125, 0.5}, + {0.375, 0, -0.5625, 0.25, -0.125, 0.5}, + } + }, +}) + +minetest.register_node("artdeco:arch1b", { + description = "ArtDeco arch1b", + tiles = {"artdeco_arch1b.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {0.375, -0.5, -0.5625, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5625, -0.375, 0.5, 0.5}, + } + } +}) + +minetest.register_node("artdeco:arch1c", { + description = "ArtDeco arch1c", + tiles = {"artdeco_arch1c.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-0.5, 0.4375, -0.625, 0.5, 0.5, -0.5}, + } + } +}) + +minetest.register_node("artdeco:arch1d", { + description = "ArtDeco arch1d", + tiles = {"artdeco_arch1d.png", "artdeco_arch1d_bottom.png", + "artdeco_arch1d_side.png", "artdeco_arch1d_side.png", + "artdeco_arch1d_back.png", "artdeco_arch1d_front.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-0.5, 0.4375, -0.625, 0.5, 0.5, -0.5}, + } + } +}) + +minetest.register_node("artdeco:arch1e", { + description = "ArtDeco arch1e", + tiles = {"artdeco_arch1e.png", "artdeco_arch1e_bottom.png", + "artdeco_arch1e_side.png", "artdeco_arch1e_side.png", + "artdeco_arch1e_back.png", "artdeco_arch1e_front.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-0.5, 0.4375, -0.625, 0.5, 0.5, -0.5}, + } + } +}) + +minetest.register_node("artdeco:dblarch1a", { + description = "ArtDeco dblarch1a", + tiles = {"artdeco_dblarch1a.png", "artdeco_dblarch1a_bottom.png", + "artdeco_dblarch1a_rside.png", "artdeco_dblarch1a_lside.png", + "artdeco_dblarch1a_back.png", "artdeco_dblarch1a_front.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.25, 0.0625, -0.5, 0.5, 0.25, 0.5}, + {0.3125, -0.5, -0.5, 0.5, 0.1875, 0.5}, + {0.25, -0.3125, -0.5, 0.375, 0.1875, 0.5}, + {0.1875, -0.1875, -0.5, 0.3125, 0.1875, 0.5}, + {-0.0625, 0, -0.5, 0.25, 0.1875, 0.5}, + {0.0625, -0.0625, -0.5, 0.375, 0.0625, 0.5}, + {0.125, -0.125, -0.5, 0.25, 0, 0.5}, + {-0.5, 0.125, -0.5, 0.5, 0.5, 0.5}, + } + } +}) + +minetest.register_node("artdeco:dblarch1b", { + description = "ArtDeco dblarch1b", + tiles = {"artdeco_dblarch1b.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, -0.375, 0.5, 0.5}, + } + } +}) + +minetest.register_node("artdeco:dblarchslab", { + description = "ArtDeco dblarchslab", + tiles = {"artdeco_dblarchslab.png", "artdeco_dblarchslab_bottom.png", + "artdeco_dblarchslab_rside.png", "artdeco_dblarchslab_lside.png", + "artdeco_dblarchslab_back.png", "artdeco_dblarchslab_front.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.125, -0.5, 0.5, 0.5, 0.5}, + } + } +}) + +minetest.register_node("artdeco:archwin1a", { + description = "ArtDeco archwin1a", + drawtype = "nodebox", + tiles = {"artdeco_archwin1a.png"}, + inventory_image = "artdeco_archwin1a_inv.png", + paramtype = "light", + sunlight_propogates = true, + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 1, 0.0625, 0.0625, 1.0625}, + {-0.1875, -0.5, 1, -0.0625, 0, 1.0625}, + {0.0625, -0.5, 1, 0.1875, 0, 1.0625}, + {-0.25, -0.5, 1, -0.1875, -0.0625, 1.0625}, + {0.1875, -0.5, 1, 0.25, -0.0625, 1.0625}, + {-0.3125, -0.5, 1, -0.25, -0.125, 1.0625}, + {0.25, -0.5, 1, 0.3125, -0.125, 1.0625}, + {-0.375, -0.5, 1, -0.3125, -0.25, 1.0625}, + {0.3125, -0.5, 1, 0.375, -0.25, 1.0625}, + } + } +}) + +minetest.register_node("artdeco:archwin1b", { + description = "ArtDeco archwin1b", + drawtype = "nodebox", + tiles = {"artdeco_archwin1b.png"}, + inventory_image = "artdeco_archwin1b_inv.png", + paramtype = "light", + sunlight_propogates = true, + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 1, 0.0625, 0.5, 1.0625}, + {-0.1875, -0.5, 1, -0.0625, 0.5, 1.0625}, + {0.0625, -0.5, 1, 0.1875, 0.5, 1.0625}, + {-0.25, -0.5, 1, -0.1875, 0.5, 1.0625}, + {0.1875, -0.5, 1, 0.25, 0.5, 1.0625}, + {-0.3125, -0.5, 1, -0.25, 0.5, 1.0625}, + {0.25, -0.5, 1, 0.3125, 0.5, 1.0625}, + {-0.375, -0.5, 1, -0.3125, 0.5, 1.0625}, + {0.3125, -0.5, 1, 0.375, 0.5, 1.0625}, + } + } +}) + +minetest.register_node("artdeco:archwin1c", { + description = "ArtDeco:archwin1c", + drawtype = "nodebox", + tiles = {"artdeco_archwin1c.png"}, + inventory_image = "artdeco_archwin1c_inv.png", + paramtype = "light", + sunlight_propogates = true, + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 1, 0.0625, 0.5, 1.0625}, + {-0.1875, -0.5, 1, -0.0625, 0.5, 1.0625}, + {0.0625, -0.5, 1, 0.1875, 0.5, 1.0625}, + {-0.25, -0.5, 1, -0.1875, 0.5, 1.0625}, + {0.1875, -0.5, 1, 0.25, 0.5, 1.0625}, + {-0.3125, -0.5, 1, -0.25, 0.5, 1.0625}, + {0.25, -0.5, 1, 0.3125, 0.5, 1.0625}, + {-0.375, -0.5, 1, -0.3125, 0.5, 1.0625}, + {0.3125, -0.5, 1, 0.375, 0.5, 1.0625}, + } + } +}) + +minetest.register_node("artdeco:archwin2a", { + description = "ArtDeco archwin2a", + drawtype = "nodebox", + tiles = {"artdeco_archwin2a.png"}, + inventory_image = "artdeco_archwin2a_inv.png", + paramtype = "light", + sunlight_propogates = true, + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 1, 0.0625, 0.0625, 1.0625}, + {-0.1875, -0.5, 1, -0.0625, 0, 1.0625}, + {0.0625, -0.5, 1, 0.1875, 0, 1.0625}, + {-0.25, -0.5, 1, -0.1875, -0.0625, 1.0625}, + {0.1875, -0.5, 1, 0.25, -0.0625, 1.0625}, + {-0.3125, -0.5, 1, -0.25, -0.125, 1.0625}, + {0.25, -0.5, 1, 0.3125, -0.125, 1.0625}, + {-0.375, -0.5, 1, -0.3125, -0.25, 1.0625}, + {0.3125, -0.5, 1, 0.375, -0.25, 1.0625}, + } + } +}) + +minetest.register_node("artdeco:archwin2b", { + description = "ArtDeco archwin2b", + drawtype = "nodebox", + tiles = {"artdeco_archwin2b.png"}, + inventory_image = "artdeco_archwin2b_inv.png", + paramtype = "light", + sunlight_propogates = true, + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 1, 0.0625, 0.5, 1.0625}, + {-0.1875, -0.5, 1, -0.0625, 0.5, 1.0625}, + {0.0625, -0.5, 1, 0.1875, 0.5, 1.0625}, + {-0.25, -0.5, 1, -0.1875, 0.5, 1.0625}, + {0.1875, -0.5, 1, 0.25, 0.5, 1.0625}, + {-0.3125, -0.5, 1, -0.25, 0.5, 1.0625}, + {0.25, -0.5, 1, 0.3125, 0.5, 1.0625}, + {-0.375, -0.5, 1, -0.3125, 0.5, 1.0625}, + {0.3125, -0.5, 1, 0.375, 0.5, 1.0625}, + } + } +}) + +minetest.register_node("artdeco:archwin2c", { + description = "ArtDeco:archwin2c", + drawtype = "nodebox", + tiles = {"artdeco_archwin2c.png"}, + inventory_image = "artdeco_archwin2c_inv.png", + paramtype = "light", + sunlight_propogates = true, + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.0625, -0.5, 1, 0.0625, 0.5, 1.0625}, + {-0.1875, -0.5, 1, -0.0625, 0.5, 1.0625}, + {0.0625, -0.5, 1, 0.1875, 0.5, 1.0625}, + {-0.25, -0.5, 1, -0.1875, 0.5, 1.0625}, + {0.1875, -0.5, 1, 0.25, 0.5, 1.0625}, + {-0.3125, -0.5, 1, -0.25, 0.5, 1.0625}, + {0.25, -0.5, 1, 0.3125, 0.5, 1.0625}, + {-0.375, -0.5, 1, -0.3125, 0.5, 1.0625}, + {0.3125, -0.5, 1, 0.375, 0.5, 1.0625}, + } + } +}) + +minetest.register_node("artdeco:wincross1a", { + description = "ArtDeco wincross1a", + drawtype = "nodebox", + tiles = {"artdeco_wincross1a.png", "artdeco_wincross1a_bottom.png", + "artdeco_wincross1a_side.png", "artdeco_wincross1a_side.png", + "artdeco_wincross1a_back.png", "artdeco_wincross1a_front.png"}, + paramtype = "light", + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {choppy=2,oddly_breakable_by_hand=2,wood=1}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.3125, 0.3125, 0.125, -0.125, 0.5}, + {-0.375, -0.3125, 0.375, 0.375, -0.1875, 0.4375}, + {-0.0625, -0.5, 0.375, 0.0625, -0.3125, 0.4375}, + {-0.5, -0.25, 0.3125, 0.5, -0.1875, 0.5}, + {-0.4375, -0.5, 0.4375, 0.4375, -0.25, 0.5}, + {-0.5, -0.5, 0.375, 0.5, -0.4375, 0.5}, + } + } + +}) + +minetest.register_node("artdeco:wincross1b", { + description = "ArtDeco wincross1b", + drawtype = "nodebox", + tiles = {"artdeco_wincross1b.png", "artdeco_wincross1b_bottom.png", + "artdeco_wincross1b_rside.png", "artdeco_wincross1b_lside.png", + "artdeco_wincross1b_back.png", "artdeco_wincross1b_front.png"}, + paramtype = "light", + use_texture_alpha = true, + paramtype2 = "facedir", + legacy_facedir_simple = true, + is_ground_content = false, + groups = {choppy=2,oddly_breakable_by_hand=2,wood=1}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.4375, 0.1875, 0.4375, 0.4375, 0.5, 0.5}, + {-0.5, 0.4375, 0.375, 0.5, 0.5, 0.5}, + {-0.4375, 0.375, 0.375, 0.4375, 0.4375, 0.5}, + {-0.5, 0.1875, 0.375, 0.5, 0.25, 0.5}, + } + } +}) + +minetest.register_node("artdeco:2a", { + description = "ArtDeco 2a", + tiles = {"artdeco_2a.png", "artdeco_2a_bottom.png", + "artdeco_2a_rside.png", "artdeco_2a_lside.png", + "artdeco_2a_back.png", "artdeco_2a_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:2b", { + description = "ArtDeco 2b", + tiles = {"artdeco_2b.png", "artdeco_2b_bottom.png", + "artdeco_2b_rside.png", "artdeco_2b_lside.png", + "artdeco_2b_back.png", "artdeco_2b_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:2c", { + description = "ArtDeco 2c", + tiles = {"artdeco_2c.png", "artdeco_2c_bottom.png", + "artdeco_2c_rside.png", "artdeco_2c_lside.png", + "artdeco_2c_back.png", "artdeco_2c_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:2d", { + description = "ArtDeco 2d", + tiles = {"artdeco_2d.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:italianmarble", { + description = "ArtDeco Italian Marble", + tiles = {"artdeco_italian_marble.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:tile1", { + description = "ArtDeco tile1", + tiles = {"artdeco_tile1.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:tile2", { + description = "ArtDeco tile2", + tiles = {"artdeco_tile2.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:tile3", { + description = "ArtDeco tile3", + tiles = {"artdeco_tile3.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:tile4", { + description = "ArtDeco tile4", + tiles = {"artdeco_tile4.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:tile5", { + description = "ArtDeco tile5", + tiles = {"artdeco_tile5.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:lightwin1", { + description = "lightwin 1", + drawtype = "nodebox", + tiles = {"artdeco_lightwin1.png"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "facedir", + light_source = LIGHT_MAX-1, + sunlight_propagates = true, + is_ground_content = false, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1, 0.5,0.5, 0.1}, + }, + }, +}) + +minetest.register_node("artdeco:lightwin2", { + description = "lightwin 2", + drawtype = "nodebox", + tiles = {"artdeco_lightwin2.png"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "facedir", + light_source = LIGHT_MAX-1, + sunlight_propagates = true, + is_ground_content = false, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1, 0.5,0.5, 0.1}, + }, + }, +}) + +minetest.register_node("artdeco:lightwin3", { + description = "lightwin 3", + drawtype = "nodebox", + tiles = {"artdeco_lightwin3.png"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "facedir", + light_source = LIGHT_MAX-1, + sunlight_propagates = true, + is_ground_content = false, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1, 0.5,0.5, 0.1}, + }, + }, +}) + +minetest.register_node("artdeco:irongrating", { + description = "iron grating", + drawtype = "nodebox", + tiles = {"artdeco_irongrating.png"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1, 0.5,0.5, 0.1}, + }, + }, +}) + +minetest.register_node("artdeco:column1a", { + description = "ArtDeco column1a", + drawtype = "nodebox", + tiles = {"artdeco_column1a.png", "artdeco_column1a_bottom.png", + "artdeco_column1a_side.png", "artdeco_column1a_side.png", + "artdeco_column1a_side.png", "artdeco_column1a_side.png"}, + paramtype = "light", + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.5, 0.125, 0.5, 0.5}, + {-0.25, -0.5, -0.4375, -0.0625, 0.5, 0.4375}, + {0.0625, -0.5, -0.4375, 0.25, 0.5, 0.4375}, + {-0.375, -0.5, -0.375, -0.1875, 0.5, 0.375}, + {0.1875, -0.5, -0.375, 0.375, 0.5, 0.375}, + {-0.375, -0.5, -0.3125, -0.3125, 0.5, 0.3125}, + {0.3125, -0.5, -0.3125, 0.375, 0.5, 0.3125}, + {-0.4375, -0.5, -0.25, -0.375, 0.5, 0.25}, + {0.375, -0.5, -0.25, 0.4375, 0.5, 0.25}, + {-0.5, -0.5, -0.125, -0.4375, 0.5, 0.125}, + {0.4375, -0.5, -0.125, 0.5, 0.5, 0.125}, + } + } +}) + +minetest.register_node("artdeco:column1b", { + description = "ArtDeco column1b", + drawtype = "nodebox", + tiles = {"artdeco_column1b.png", "artdeco_column1b_bottom.png", + "artdeco_column1b_side.png", "artdeco_column1b_side.png", + "artdeco_column1b_side.png", "artdeco_column1b_side.png"}, + paramtype = "light", + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.5, 0.125, 0.5, 0.5}, + {-0.25, -0.5, -0.4375, -0.0625, 0.5, 0.4375}, + {0.0625, -0.5, -0.4375, 0.25, 0.5, 0.4375}, + {-0.375, -0.5, -0.375, -0.1875, 0.5, 0.375}, + {0.1875, -0.5, -0.375, 0.375, 0.5, 0.375}, + {-0.375, -0.5, -0.3125, -0.3125, 0.5, 0.3125}, + {0.3125, -0.5, -0.3125, 0.375, 0.5, 0.3125}, + {-0.4375, -0.5, -0.25, -0.375, 0.5, 0.25}, + {0.375, -0.5, -0.25, 0.4375, 0.5, 0.25}, + {-0.5, -0.5, -0.125, -0.4375, 0.5, 0.125}, + {0.4375, -0.5, -0.125, 0.5, 0.5, 0.125}, + } + } +}) + +minetest.register_node("artdeco:column1c", { + description = "ArtDeco column1c", + drawtype = "nodebox", + tiles = {"artdeco_column1c.png", "artdeco_column1c_bottom.png", + "artdeco_column1c_side.png", "artdeco_column1c_side.png", + "artdeco_column1c_side.png", "artdeco_column1c_side.png"}, + paramtype = "light", + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.5, 0.125, 0.5, 0.5}, + {-0.25, -0.5, -0.4375, -0.0625, 0.5, 0.4375}, + {0.0625, -0.5, -0.4375, 0.25, 0.5, 0.4375}, + {-0.375, -0.5, -0.375, -0.1875, 0.5, 0.375}, + {0.1875, -0.5, -0.375, 0.375, 0.5, 0.375}, + {-0.375, -0.5, -0.3125, -0.3125, 0.5, 0.3125}, + {0.3125, -0.5, -0.3125, 0.375, 0.5, 0.3125}, + {-0.4375, -0.5, -0.25, -0.375, 0.5, 0.25}, + {0.375, -0.5, -0.25, 0.4375, 0.5, 0.25}, + {-0.5, -0.5, -0.125, -0.4375, 0.5, 0.125}, + {0.4375, -0.5, -0.125, 0.5, 0.5, 0.125}, + } + } +}) + +minetest.register_node("artdeco:column1d", { + description = "ArtDeco column1d", + drawtype = "nodebox", + tiles = {"artdeco_column1d.png", "artdeco_column1d_bottom.png", + "artdeco_column1d_side.png", "artdeco_column1d_side.png", + "artdeco_column1d_side.png", "artdeco_column1d_side.png"}, + paramtype = "light", + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.5, 0.125, 0.5, 0.5}, + {-0.25, -0.5, -0.4375, -0.0625, 0.5, 0.4375}, + {0.0625, -0.5, -0.4375, 0.25, 0.5, 0.4375}, + {-0.375, -0.5, -0.375, -0.1875, 0.5, 0.375}, + {0.1875, -0.5, -0.375, 0.375, 0.5, 0.375}, + {-0.375, -0.5, -0.3125, -0.3125, 0.5, 0.3125}, + {0.3125, -0.5, -0.3125, 0.375, 0.5, 0.3125}, + {-0.4375, -0.5, -0.25, -0.375, 0.5, 0.25}, + {0.375, -0.5, -0.25, 0.4375, 0.5, 0.25}, + {-0.5, -0.5, -0.125, -0.4375, 0.5, 0.125}, + {0.4375, -0.5, -0.125, 0.5, 0.5, 0.125}, + } + } +}) + +minetest.register_node("artdeco:decoblock1", { + description = "Artdeco decoblock 1", + tiles = {"artdeco_decoblock1.png", "artdeco_decoblock1_bottom.png", + "artdeco_decoblock1_side.png", "artdeco_decoblock1_side.png", + "artdeco_decoblock1_back.png", "artdeco_decoblock1_front.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:decoblock2", { + description = "Artdeco decoblock 2", + tiles = {"artdeco_decoblock2.png", "artdeco_decoblock2_bottom.png", + "artdeco_decoblock2_side.png", "artdeco_decoblock2_side.png", + "artdeco_decoblock2_side.png", "artdeco_decoblock2_side.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:decoblock3", { + description = "Artdeco decoblock 3", + tiles = {"artdeco_decoblock3.png", "artdeco_decoblock3_bottom.png", + "artdeco_decoblock3_side.png", "artdeco_decoblock3_side.png", + "artdeco_decoblock3_side.png", "artdeco_decoblock3_side.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:decoblock4", { + description = "Artdeco decoblock 4", + tiles = {"artdeco_decoblock4.png", "artdeco_decoblock4_bottom.png", + "artdeco_decoblock4_side.png", "artdeco_decoblock4_side.png", + "artdeco_decoblock4_side.png", "artdeco_decoblock4_side.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:decoblock5", { + description = "Artdeco decoblock 5", + tiles = {"artdeco_decoblock5.png", "artdeco_decoblock5_bottom.png", + "artdeco_decoblock5_side.png", "artdeco_decoblock5_side.png", + "artdeco_decoblock5_side.png", "artdeco_decoblock5_side.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:decoblock6", { + description = "Artdeco decoblock 6", + tiles = {"artdeco_decoblock6.png", "artdeco_decoblock6_bottom.png", + "artdeco_decoblock6_side.png", "artdeco_decoblock6_side.png", + "artdeco_decoblock6_side.png", "artdeco_decoblock6_side.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:decostair1", { + description = "ArtDeco decostair1", + drawtype = "nodebox", + tiles = {"artdeco_decostair1.png"}, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.0625, 0.5}, + {-0.5, -0.5, 0.0625, 0.5, 0.5, 0.5}, + } + } +}) + +minetest.register_node("artdeco:decostair2", { + description = "ArtDeco decostair2", + drawtype = "nodebox", + tiles = {"artdeco_decostair2.png"}, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.0625, 0.5}, + {-0.5, -0.5, 0.0625, 0.5, 0.5, 0.5}, + } + } +}) + +minetest.register_node("artdeco:decostair3", { + description = "ArtDeco decostair3", + drawtype = "nodebox", + tiles = {"artdeco_decostair3.png"}, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.0625, 0.5}, + {-0.5, -0.5, 0.0625, 0.5, 0.5, 0.5}, + } + } +}) + +minetest.register_node("artdeco:whitegardenstone", { + description = "ArtDeco white garden stone", + tiles = {"artdeco_whitegardenstone.png"}, + groups = {crumbly=2, falling_node=1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=05}, + dug = {name="default+gravel_footstep", gain=1.0}, + }), +}) + +minetest.register_node("artdeco:stonewall", { + description = "Artdeco stonewall", + tiles = {"artdeco_stonewall.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:thinstonewall", { + description = "ArtDeco thin stone wall", + drawtype = "nodebox", + tiles = {"artdeco_thin_stonewall.png"}, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.125, 0.1875}, + } + } +}) + +minetest.register_node("artdeco:thinstonewallcorner", { + description = "ArtDeco thin stone wall corner", + drawtype = "nodebox", + tiles = {"artdeco_thin_stonewall_corner.png"}, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.1875, 0.5, 0.125, 0.1875}, + {-0.1875, -0.5, -0.1875, 0.1875, 0.125, 0.5}, + } + } +}) + +minetest.register_node("artdeco:brownwalltile", { + description = "ArtDeco brown wall tile", + tiles = {"artdeco_brownwalltile.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:greenwalltile", { + description = "ArtDeco green wall tile", + tiles = {"artdeco_greenwalltile.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("artdeco:ceilingtile", { + description = "ArtDeco ceiling tile", + tiles = {"artdeco_ceiling_tile.png"}, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +doors.register("artdeco:estatedoor", { + description = "ArtDeco estate door", + inventory_image = "artdeco_estatedoor_inv.png", + tiles = {{ name = "artdeco_estate_door.png", backface_culling = true }}, + groups = {choppy=2,cracky=2,door=1}, + protected = false, +sounds = default.node_sound_wood_defaults(), +}) diff --git a/mods/artdeco/license.txt b/mods/artdeco/license.txt new file mode 100644 index 00000000..cf1ab25d --- /dev/null +++ b/mods/artdeco/license.txt @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/mods/artdeco/screenshot.png b/mods/artdeco/screenshot.png new file mode 100644 index 00000000..11edf6a0 Binary files /dev/null and b/mods/artdeco/screenshot.png differ diff --git a/mods/artdeco/textures/artdeco_1a.png b/mods/artdeco/textures/artdeco_1a.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1a.png differ diff --git a/mods/artdeco/textures/artdeco_1a_back.png b/mods/artdeco/textures/artdeco_1a_back.png new file mode 100644 index 00000000..c3ce8131 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1a_back.png differ diff --git a/mods/artdeco/textures/artdeco_1a_bottom.png b/mods/artdeco/textures/artdeco_1a_bottom.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1a_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1a_front.png b/mods/artdeco/textures/artdeco_1a_front.png new file mode 100644 index 00000000..c3ce8131 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1a_front.png differ diff --git a/mods/artdeco/textures/artdeco_1a_side.png b/mods/artdeco/textures/artdeco_1a_side.png new file mode 100644 index 00000000..c3ce8131 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1a_side.png differ diff --git a/mods/artdeco/textures/artdeco_1b.png b/mods/artdeco/textures/artdeco_1b.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1b.png differ diff --git a/mods/artdeco/textures/artdeco_1b_back.png b/mods/artdeco/textures/artdeco_1b_back.png new file mode 100644 index 00000000..7b07da13 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1b_back.png differ diff --git a/mods/artdeco/textures/artdeco_1b_bottom.png b/mods/artdeco/textures/artdeco_1b_bottom.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1b_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1b_front.png b/mods/artdeco/textures/artdeco_1b_front.png new file mode 100644 index 00000000..167c2787 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1b_front.png differ diff --git a/mods/artdeco/textures/artdeco_1b_lside.png b/mods/artdeco/textures/artdeco_1b_lside.png new file mode 100644 index 00000000..467ff718 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1b_lside.png differ diff --git a/mods/artdeco/textures/artdeco_1b_rside.png b/mods/artdeco/textures/artdeco_1b_rside.png new file mode 100644 index 00000000..c3ce8131 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1b_rside.png differ diff --git a/mods/artdeco/textures/artdeco_1c.png b/mods/artdeco/textures/artdeco_1c.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1c.png differ diff --git a/mods/artdeco/textures/artdeco_1c_back.png b/mods/artdeco/textures/artdeco_1c_back.png new file mode 100644 index 00000000..167c2787 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1c_back.png differ diff --git a/mods/artdeco/textures/artdeco_1c_bottom.png b/mods/artdeco/textures/artdeco_1c_bottom.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1c_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1c_front.png b/mods/artdeco/textures/artdeco_1c_front.png new file mode 100644 index 00000000..7b07da13 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1c_front.png differ diff --git a/mods/artdeco/textures/artdeco_1c_lside.png b/mods/artdeco/textures/artdeco_1c_lside.png new file mode 100644 index 00000000..c3ce8131 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1c_lside.png differ diff --git a/mods/artdeco/textures/artdeco_1c_rside.png b/mods/artdeco/textures/artdeco_1c_rside.png new file mode 100644 index 00000000..467ff718 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1c_rside.png differ diff --git a/mods/artdeco/textures/artdeco_1d.png b/mods/artdeco/textures/artdeco_1d.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1d.png differ diff --git a/mods/artdeco/textures/artdeco_1d_back.png b/mods/artdeco/textures/artdeco_1d_back.png new file mode 100644 index 00000000..80dd0b4a Binary files /dev/null and b/mods/artdeco/textures/artdeco_1d_back.png differ diff --git a/mods/artdeco/textures/artdeco_1d_bottom.png b/mods/artdeco/textures/artdeco_1d_bottom.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1d_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1d_front.png b/mods/artdeco/textures/artdeco_1d_front.png new file mode 100644 index 00000000..72743314 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1d_front.png differ diff --git a/mods/artdeco/textures/artdeco_1d_lside.png b/mods/artdeco/textures/artdeco_1d_lside.png new file mode 100644 index 00000000..fde12369 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1d_lside.png differ diff --git a/mods/artdeco/textures/artdeco_1d_rside.png b/mods/artdeco/textures/artdeco_1d_rside.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1d_rside.png differ diff --git a/mods/artdeco/textures/artdeco_1e.png b/mods/artdeco/textures/artdeco_1e.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1e.png differ diff --git a/mods/artdeco/textures/artdeco_1f.png b/mods/artdeco/textures/artdeco_1f.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1f.png differ diff --git a/mods/artdeco/textures/artdeco_1f_back.png b/mods/artdeco/textures/artdeco_1f_back.png new file mode 100644 index 00000000..72743314 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1f_back.png differ diff --git a/mods/artdeco/textures/artdeco_1f_bottom.png b/mods/artdeco/textures/artdeco_1f_bottom.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1f_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1f_front.png b/mods/artdeco/textures/artdeco_1f_front.png new file mode 100644 index 00000000..80dd0b4a Binary files /dev/null and b/mods/artdeco/textures/artdeco_1f_front.png differ diff --git a/mods/artdeco/textures/artdeco_1f_lside.png b/mods/artdeco/textures/artdeco_1f_lside.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1f_lside.png differ diff --git a/mods/artdeco/textures/artdeco_1f_rside.png b/mods/artdeco/textures/artdeco_1f_rside.png new file mode 100644 index 00000000..fde12369 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1f_rside.png differ diff --git a/mods/artdeco/textures/artdeco_1g.png b/mods/artdeco/textures/artdeco_1g.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1g.png differ diff --git a/mods/artdeco/textures/artdeco_1g_back.png b/mods/artdeco/textures/artdeco_1g_back.png new file mode 100644 index 00000000..cff35321 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1g_back.png differ diff --git a/mods/artdeco/textures/artdeco_1g_bottom.png b/mods/artdeco/textures/artdeco_1g_bottom.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1g_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1g_front.png b/mods/artdeco/textures/artdeco_1g_front.png new file mode 100644 index 00000000..edb71914 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1g_front.png differ diff --git a/mods/artdeco/textures/artdeco_1g_lside.png b/mods/artdeco/textures/artdeco_1g_lside.png new file mode 100644 index 00000000..0cea0349 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1g_lside.png differ diff --git a/mods/artdeco/textures/artdeco_1g_rside.png b/mods/artdeco/textures/artdeco_1g_rside.png new file mode 100644 index 00000000..7ddd691e Binary files /dev/null and b/mods/artdeco/textures/artdeco_1g_rside.png differ diff --git a/mods/artdeco/textures/artdeco_1h.png b/mods/artdeco/textures/artdeco_1h.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1h.png differ diff --git a/mods/artdeco/textures/artdeco_1h_back.png b/mods/artdeco/textures/artdeco_1h_back.png new file mode 100644 index 00000000..7ddd691e Binary files /dev/null and b/mods/artdeco/textures/artdeco_1h_back.png differ diff --git a/mods/artdeco/textures/artdeco_1h_bottom.png b/mods/artdeco/textures/artdeco_1h_bottom.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1h_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1h_front.png b/mods/artdeco/textures/artdeco_1h_front.png new file mode 100644 index 00000000..7ddd691e Binary files /dev/null and b/mods/artdeco/textures/artdeco_1h_front.png differ diff --git a/mods/artdeco/textures/artdeco_1h_lside.png b/mods/artdeco/textures/artdeco_1h_lside.png new file mode 100644 index 00000000..7ddd691e Binary files /dev/null and b/mods/artdeco/textures/artdeco_1h_lside.png differ diff --git a/mods/artdeco/textures/artdeco_1h_rside.png b/mods/artdeco/textures/artdeco_1h_rside.png new file mode 100644 index 00000000..7ddd691e Binary files /dev/null and b/mods/artdeco/textures/artdeco_1h_rside.png differ diff --git a/mods/artdeco/textures/artdeco_1i.png b/mods/artdeco/textures/artdeco_1i.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1i.png differ diff --git a/mods/artdeco/textures/artdeco_1i_back.png b/mods/artdeco/textures/artdeco_1i_back.png new file mode 100644 index 00000000..edb71914 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1i_back.png differ diff --git a/mods/artdeco/textures/artdeco_1i_bottom.png b/mods/artdeco/textures/artdeco_1i_bottom.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1i_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1i_front.png b/mods/artdeco/textures/artdeco_1i_front.png new file mode 100644 index 00000000..cff35321 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1i_front.png differ diff --git a/mods/artdeco/textures/artdeco_1i_lside.png b/mods/artdeco/textures/artdeco_1i_lside.png new file mode 100644 index 00000000..7ddd691e Binary files /dev/null and b/mods/artdeco/textures/artdeco_1i_lside.png differ diff --git a/mods/artdeco/textures/artdeco_1i_rside.png b/mods/artdeco/textures/artdeco_1i_rside.png new file mode 100644 index 00000000..0cea0349 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1i_rside.png differ diff --git a/mods/artdeco/textures/artdeco_1j.png b/mods/artdeco/textures/artdeco_1j.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1j.png differ diff --git a/mods/artdeco/textures/artdeco_1j_back.png b/mods/artdeco/textures/artdeco_1j_back.png new file mode 100644 index 00000000..467ff718 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1j_back.png differ diff --git a/mods/artdeco/textures/artdeco_1j_bottom.png b/mods/artdeco/textures/artdeco_1j_bottom.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1j_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1j_front.png b/mods/artdeco/textures/artdeco_1j_front.png new file mode 100644 index 00000000..467ff718 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1j_front.png differ diff --git a/mods/artdeco/textures/artdeco_1j_side.png b/mods/artdeco/textures/artdeco_1j_side.png new file mode 100644 index 00000000..467ff718 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1j_side.png differ diff --git a/mods/artdeco/textures/artdeco_1k.png b/mods/artdeco/textures/artdeco_1k.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1k.png differ diff --git a/mods/artdeco/textures/artdeco_1k_back.png b/mods/artdeco/textures/artdeco_1k_back.png new file mode 100644 index 00000000..fde12369 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1k_back.png differ diff --git a/mods/artdeco/textures/artdeco_1k_bottom.png b/mods/artdeco/textures/artdeco_1k_bottom.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1k_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1k_front.png b/mods/artdeco/textures/artdeco_1k_front.png new file mode 100644 index 00000000..fde12369 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1k_front.png differ diff --git a/mods/artdeco/textures/artdeco_1k_side.png b/mods/artdeco/textures/artdeco_1k_side.png new file mode 100644 index 00000000..fde12369 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1k_side.png differ diff --git a/mods/artdeco/textures/artdeco_1l.png b/mods/artdeco/textures/artdeco_1l.png new file mode 100644 index 00000000..1eaa6d60 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1l.png differ diff --git a/mods/artdeco/textures/artdeco_1l_bottom.png b/mods/artdeco/textures/artdeco_1l_bottom.png new file mode 100644 index 00000000..8cfc66e9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1l_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_1l_side.png b/mods/artdeco/textures/artdeco_1l_side.png new file mode 100644 index 00000000..0cea0349 Binary files /dev/null and b/mods/artdeco/textures/artdeco_1l_side.png differ diff --git a/mods/artdeco/textures/artdeco_2a.png b/mods/artdeco/textures/artdeco_2a.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_2a.png differ diff --git a/mods/artdeco/textures/artdeco_2a_back.png b/mods/artdeco/textures/artdeco_2a_back.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_2a_back.png differ diff --git a/mods/artdeco/textures/artdeco_2a_bottom.png b/mods/artdeco/textures/artdeco_2a_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_2a_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_2a_front.png b/mods/artdeco/textures/artdeco_2a_front.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_2a_front.png differ diff --git a/mods/artdeco/textures/artdeco_2a_lside.png b/mods/artdeco/textures/artdeco_2a_lside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_2a_lside.png differ diff --git a/mods/artdeco/textures/artdeco_2a_rside.png b/mods/artdeco/textures/artdeco_2a_rside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_2a_rside.png differ diff --git a/mods/artdeco/textures/artdeco_2b.png b/mods/artdeco/textures/artdeco_2b.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_2b.png differ diff --git a/mods/artdeco/textures/artdeco_2b_back.png b/mods/artdeco/textures/artdeco_2b_back.png new file mode 100644 index 00000000..0b84822c Binary files /dev/null and b/mods/artdeco/textures/artdeco_2b_back.png differ diff --git a/mods/artdeco/textures/artdeco_2b_bottom.png b/mods/artdeco/textures/artdeco_2b_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_2b_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_2b_front.png b/mods/artdeco/textures/artdeco_2b_front.png new file mode 100644 index 00000000..0b84822c Binary files /dev/null and b/mods/artdeco/textures/artdeco_2b_front.png differ diff --git a/mods/artdeco/textures/artdeco_2b_lside.png b/mods/artdeco/textures/artdeco_2b_lside.png new file mode 100644 index 00000000..0b84822c Binary files /dev/null and b/mods/artdeco/textures/artdeco_2b_lside.png differ diff --git a/mods/artdeco/textures/artdeco_2b_rside.png b/mods/artdeco/textures/artdeco_2b_rside.png new file mode 100644 index 00000000..0b84822c Binary files /dev/null and b/mods/artdeco/textures/artdeco_2b_rside.png differ diff --git a/mods/artdeco/textures/artdeco_2c.png b/mods/artdeco/textures/artdeco_2c.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_2c.png differ diff --git a/mods/artdeco/textures/artdeco_2c_back.png b/mods/artdeco/textures/artdeco_2c_back.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_2c_back.png differ diff --git a/mods/artdeco/textures/artdeco_2c_bottom.png b/mods/artdeco/textures/artdeco_2c_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_2c_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_2c_front.png b/mods/artdeco/textures/artdeco_2c_front.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_2c_front.png differ diff --git a/mods/artdeco/textures/artdeco_2c_lside.png b/mods/artdeco/textures/artdeco_2c_lside.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_2c_lside.png differ diff --git a/mods/artdeco/textures/artdeco_2c_rside.png b/mods/artdeco/textures/artdeco_2c_rside.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_2c_rside.png differ diff --git a/mods/artdeco/textures/artdeco_2d.png b/mods/artdeco/textures/artdeco_2d.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_2d.png differ diff --git a/mods/artdeco/textures/artdeco_arch1a.png b/mods/artdeco/textures/artdeco_arch1a.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1a.png differ diff --git a/mods/artdeco/textures/artdeco_arch1a_back.png b/mods/artdeco/textures/artdeco_arch1a_back.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1a_back.png differ diff --git a/mods/artdeco/textures/artdeco_arch1a_bottom.png b/mods/artdeco/textures/artdeco_arch1a_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1a_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_arch1a_front.png b/mods/artdeco/textures/artdeco_arch1a_front.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1a_front.png differ diff --git a/mods/artdeco/textures/artdeco_arch1a_lside.png b/mods/artdeco/textures/artdeco_arch1a_lside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1a_lside.png differ diff --git a/mods/artdeco/textures/artdeco_arch1a_rside.png b/mods/artdeco/textures/artdeco_arch1a_rside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1a_rside.png differ diff --git a/mods/artdeco/textures/artdeco_arch1b.png b/mods/artdeco/textures/artdeco_arch1b.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1b.png differ diff --git a/mods/artdeco/textures/artdeco_arch1c.png b/mods/artdeco/textures/artdeco_arch1c.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1c.png differ diff --git a/mods/artdeco/textures/artdeco_arch1d.png b/mods/artdeco/textures/artdeco_arch1d.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1d.png differ diff --git a/mods/artdeco/textures/artdeco_arch1d_back.png b/mods/artdeco/textures/artdeco_arch1d_back.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1d_back.png differ diff --git a/mods/artdeco/textures/artdeco_arch1d_bottom.png b/mods/artdeco/textures/artdeco_arch1d_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1d_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_arch1d_front.png b/mods/artdeco/textures/artdeco_arch1d_front.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1d_front.png differ diff --git a/mods/artdeco/textures/artdeco_arch1d_rsidex.png b/mods/artdeco/textures/artdeco_arch1d_rsidex.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1d_rsidex.png differ diff --git a/mods/artdeco/textures/artdeco_arch1d_side.png b/mods/artdeco/textures/artdeco_arch1d_side.png new file mode 100644 index 00000000..fe5a0895 Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1d_side.png differ diff --git a/mods/artdeco/textures/artdeco_arch1e.png b/mods/artdeco/textures/artdeco_arch1e.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1e.png differ diff --git a/mods/artdeco/textures/artdeco_arch1e_back.png b/mods/artdeco/textures/artdeco_arch1e_back.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1e_back.png differ diff --git a/mods/artdeco/textures/artdeco_arch1e_bottom.png b/mods/artdeco/textures/artdeco_arch1e_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1e_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_arch1e_front.png b/mods/artdeco/textures/artdeco_arch1e_front.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1e_front.png differ diff --git a/mods/artdeco/textures/artdeco_arch1e_side.png b/mods/artdeco/textures/artdeco_arch1e_side.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch1e_side.png differ diff --git a/mods/artdeco/textures/artdeco_arch2a.png b/mods/artdeco/textures/artdeco_arch2a.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_arch2a.png differ diff --git a/mods/artdeco/textures/artdeco_archwin1a.png b/mods/artdeco/textures/artdeco_archwin1a.png new file mode 100644 index 00000000..33db1ca9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin1a.png differ diff --git a/mods/artdeco/textures/artdeco_archwin1a_inv.png b/mods/artdeco/textures/artdeco_archwin1a_inv.png new file mode 100644 index 00000000..5bcd353a Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin1a_inv.png differ diff --git a/mods/artdeco/textures/artdeco_archwin1b.png b/mods/artdeco/textures/artdeco_archwin1b.png new file mode 100644 index 00000000..9fa528cb Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin1b.png differ diff --git a/mods/artdeco/textures/artdeco_archwin1b_inv.png b/mods/artdeco/textures/artdeco_archwin1b_inv.png new file mode 100644 index 00000000..14ee0ee8 Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin1b_inv.png differ diff --git a/mods/artdeco/textures/artdeco_archwin1c.png b/mods/artdeco/textures/artdeco_archwin1c.png new file mode 100644 index 00000000..e4776130 Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin1c.png differ diff --git a/mods/artdeco/textures/artdeco_archwin1c_inv.png b/mods/artdeco/textures/artdeco_archwin1c_inv.png new file mode 100644 index 00000000..b3a345d7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin1c_inv.png differ diff --git a/mods/artdeco/textures/artdeco_archwin2a.png b/mods/artdeco/textures/artdeco_archwin2a.png new file mode 100644 index 00000000..bb45b11e Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin2a.png differ diff --git a/mods/artdeco/textures/artdeco_archwin2a_inv.png b/mods/artdeco/textures/artdeco_archwin2a_inv.png new file mode 100644 index 00000000..0eca3180 Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin2a_inv.png differ diff --git a/mods/artdeco/textures/artdeco_archwin2b.png b/mods/artdeco/textures/artdeco_archwin2b.png new file mode 100644 index 00000000..91917319 Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin2b.png differ diff --git a/mods/artdeco/textures/artdeco_archwin2b_inv.png b/mods/artdeco/textures/artdeco_archwin2b_inv.png new file mode 100644 index 00000000..f2b97dad Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin2b_inv.png differ diff --git a/mods/artdeco/textures/artdeco_archwin2c.png b/mods/artdeco/textures/artdeco_archwin2c.png new file mode 100644 index 00000000..d3d1b6d4 Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin2c.png differ diff --git a/mods/artdeco/textures/artdeco_archwin2c_inv.png b/mods/artdeco/textures/artdeco_archwin2c_inv.png new file mode 100644 index 00000000..6e04dd7d Binary files /dev/null and b/mods/artdeco/textures/artdeco_archwin2c_inv.png differ diff --git a/mods/artdeco/textures/artdeco_brownwalltile.png b/mods/artdeco/textures/artdeco_brownwalltile.png new file mode 100644 index 00000000..43551fbf Binary files /dev/null and b/mods/artdeco/textures/artdeco_brownwalltile.png differ diff --git a/mods/artdeco/textures/artdeco_ceiling_tile.png b/mods/artdeco/textures/artdeco_ceiling_tile.png new file mode 100644 index 00000000..aefca313 Binary files /dev/null and b/mods/artdeco/textures/artdeco_ceiling_tile.png differ diff --git a/mods/artdeco/textures/artdeco_column1a.png b/mods/artdeco/textures/artdeco_column1a.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1a.png differ diff --git a/mods/artdeco/textures/artdeco_column1a_bottom.png b/mods/artdeco/textures/artdeco_column1a_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1a_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_column1a_side.png b/mods/artdeco/textures/artdeco_column1a_side.png new file mode 100644 index 00000000..8d7cf2b5 Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1a_side.png differ diff --git a/mods/artdeco/textures/artdeco_column1b.png b/mods/artdeco/textures/artdeco_column1b.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1b.png differ diff --git a/mods/artdeco/textures/artdeco_column1b_bottom.png b/mods/artdeco/textures/artdeco_column1b_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1b_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_column1b_side.png b/mods/artdeco/textures/artdeco_column1b_side.png new file mode 100644 index 00000000..68738110 Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1b_side.png differ diff --git a/mods/artdeco/textures/artdeco_column1c.png b/mods/artdeco/textures/artdeco_column1c.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1c.png differ diff --git a/mods/artdeco/textures/artdeco_column1c_bottom.png b/mods/artdeco/textures/artdeco_column1c_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1c_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_column1c_side.png b/mods/artdeco/textures/artdeco_column1c_side.png new file mode 100644 index 00000000..e596184b Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1c_side.png differ diff --git a/mods/artdeco/textures/artdeco_column1d.png b/mods/artdeco/textures/artdeco_column1d.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1d.png differ diff --git a/mods/artdeco/textures/artdeco_column1d_bottom.png b/mods/artdeco/textures/artdeco_column1d_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1d_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_column1d_side.png b/mods/artdeco/textures/artdeco_column1d_side.png new file mode 100644 index 00000000..130b4743 Binary files /dev/null and b/mods/artdeco/textures/artdeco_column1d_side.png differ diff --git a/mods/artdeco/textures/artdeco_column2a.png b/mods/artdeco/textures/artdeco_column2a.png new file mode 100644 index 00000000..b26ea7cf Binary files /dev/null and b/mods/artdeco/textures/artdeco_column2a.png differ diff --git a/mods/artdeco/textures/artdeco_column2a_bottom.png b/mods/artdeco/textures/artdeco_column2a_bottom.png new file mode 100644 index 00000000..b26ea7cf Binary files /dev/null and b/mods/artdeco/textures/artdeco_column2a_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_column2a_side-1.png b/mods/artdeco/textures/artdeco_column2a_side-1.png new file mode 100644 index 00000000..fde1ee3d Binary files /dev/null and b/mods/artdeco/textures/artdeco_column2a_side-1.png differ diff --git a/mods/artdeco/textures/artdeco_column2b_side.png b/mods/artdeco/textures/artdeco_column2b_side.png new file mode 100644 index 00000000..9c7e5aa5 Binary files /dev/null and b/mods/artdeco/textures/artdeco_column2b_side.png differ diff --git a/mods/artdeco/textures/artdeco_column2c_side.png b/mods/artdeco/textures/artdeco_column2c_side.png new file mode 100644 index 00000000..7f075848 Binary files /dev/null and b/mods/artdeco/textures/artdeco_column2c_side.png differ diff --git a/mods/artdeco/textures/artdeco_dblarch1a.png b/mods/artdeco/textures/artdeco_dblarch1a.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarch1a.png differ diff --git a/mods/artdeco/textures/artdeco_dblarch1a_back.png b/mods/artdeco/textures/artdeco_dblarch1a_back.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarch1a_back.png differ diff --git a/mods/artdeco/textures/artdeco_dblarch1a_bottom.png b/mods/artdeco/textures/artdeco_dblarch1a_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarch1a_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_dblarch1a_front.png b/mods/artdeco/textures/artdeco_dblarch1a_front.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarch1a_front.png differ diff --git a/mods/artdeco/textures/artdeco_dblarch1a_lside.png b/mods/artdeco/textures/artdeco_dblarch1a_lside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarch1a_lside.png differ diff --git a/mods/artdeco/textures/artdeco_dblarch1a_rside.png b/mods/artdeco/textures/artdeco_dblarch1a_rside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarch1a_rside.png differ diff --git a/mods/artdeco/textures/artdeco_dblarch1b.png b/mods/artdeco/textures/artdeco_dblarch1b.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarch1b.png differ diff --git a/mods/artdeco/textures/artdeco_dblarchslab.png b/mods/artdeco/textures/artdeco_dblarchslab.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarchslab.png differ diff --git a/mods/artdeco/textures/artdeco_dblarchslab_back.png b/mods/artdeco/textures/artdeco_dblarchslab_back.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarchslab_back.png differ diff --git a/mods/artdeco/textures/artdeco_dblarchslab_bottom.png b/mods/artdeco/textures/artdeco_dblarchslab_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarchslab_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_dblarchslab_front.png b/mods/artdeco/textures/artdeco_dblarchslab_front.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarchslab_front.png differ diff --git a/mods/artdeco/textures/artdeco_dblarchslab_lside.png b/mods/artdeco/textures/artdeco_dblarchslab_lside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarchslab_lside.png differ diff --git a/mods/artdeco/textures/artdeco_dblarchslab_rside.png b/mods/artdeco/textures/artdeco_dblarchslab_rside.png new file mode 100644 index 00000000..c302458a Binary files /dev/null and b/mods/artdeco/textures/artdeco_dblarchslab_rside.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock1.png b/mods/artdeco/textures/artdeco_decoblock1.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock1.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock1_back.png b/mods/artdeco/textures/artdeco_decoblock1_back.png new file mode 100644 index 00000000..8da8b5d9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock1_back.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock1_bottom.png b/mods/artdeco/textures/artdeco_decoblock1_bottom.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock1_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock1_front.png b/mods/artdeco/textures/artdeco_decoblock1_front.png new file mode 100644 index 00000000..8da8b5d9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock1_front.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock1_side.png b/mods/artdeco/textures/artdeco_decoblock1_side.png new file mode 100644 index 00000000..8da8b5d9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock1_side.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock2.png b/mods/artdeco/textures/artdeco_decoblock2.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock2.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock2_bottom.png b/mods/artdeco/textures/artdeco_decoblock2_bottom.png new file mode 100644 index 00000000..926a44ff Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock2_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock2_side.png b/mods/artdeco/textures/artdeco_decoblock2_side.png new file mode 100644 index 00000000..9aaae25a Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock2_side.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock3.png b/mods/artdeco/textures/artdeco_decoblock3.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock3.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock3_bottom.png b/mods/artdeco/textures/artdeco_decoblock3_bottom.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock3_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock3_side.png b/mods/artdeco/textures/artdeco_decoblock3_side.png new file mode 100644 index 00000000..66db54b0 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock3_side.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock4.png b/mods/artdeco/textures/artdeco_decoblock4.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock4.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock4_bottom.png b/mods/artdeco/textures/artdeco_decoblock4_bottom.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock4_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock4_side.png b/mods/artdeco/textures/artdeco_decoblock4_side.png new file mode 100644 index 00000000..ec357554 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock4_side.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock5.png b/mods/artdeco/textures/artdeco_decoblock5.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock5.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock5_bottom.png b/mods/artdeco/textures/artdeco_decoblock5_bottom.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock5_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock5_side.png b/mods/artdeco/textures/artdeco_decoblock5_side.png new file mode 100644 index 00000000..e2f4757d Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock5_side.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock6.png b/mods/artdeco/textures/artdeco_decoblock6.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock6.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock6_bottom.png b/mods/artdeco/textures/artdeco_decoblock6_bottom.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock6_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_decoblock6_side.png b/mods/artdeco/textures/artdeco_decoblock6_side.png new file mode 100644 index 00000000..9ee063fa Binary files /dev/null and b/mods/artdeco/textures/artdeco_decoblock6_side.png differ diff --git a/mods/artdeco/textures/artdeco_decostair1.png b/mods/artdeco/textures/artdeco_decostair1.png new file mode 100644 index 00000000..8673e6a7 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decostair1.png differ diff --git a/mods/artdeco/textures/artdeco_decostair2.png b/mods/artdeco/textures/artdeco_decostair2.png new file mode 100644 index 00000000..8da8b5d9 Binary files /dev/null and b/mods/artdeco/textures/artdeco_decostair2.png differ diff --git a/mods/artdeco/textures/artdeco_decostair3.png b/mods/artdeco/textures/artdeco_decostair3.png new file mode 100644 index 00000000..52cf90ab Binary files /dev/null and b/mods/artdeco/textures/artdeco_decostair3.png differ diff --git a/mods/artdeco/textures/artdeco_estate_door.png b/mods/artdeco/textures/artdeco_estate_door.png new file mode 100644 index 00000000..7b02ed5a Binary files /dev/null and b/mods/artdeco/textures/artdeco_estate_door.png differ diff --git a/mods/artdeco/textures/artdeco_estatedoor_inv.png b/mods/artdeco/textures/artdeco_estatedoor_inv.png new file mode 100644 index 00000000..65ac311f Binary files /dev/null and b/mods/artdeco/textures/artdeco_estatedoor_inv.png differ diff --git a/mods/artdeco/textures/artdeco_greenwalltile.png b/mods/artdeco/textures/artdeco_greenwalltile.png new file mode 100644 index 00000000..c8893a90 Binary files /dev/null and b/mods/artdeco/textures/artdeco_greenwalltile.png differ diff --git a/mods/artdeco/textures/artdeco_irongrating.png b/mods/artdeco/textures/artdeco_irongrating.png new file mode 100644 index 00000000..e0f811a3 Binary files /dev/null and b/mods/artdeco/textures/artdeco_irongrating.png differ diff --git a/mods/artdeco/textures/artdeco_italian_marble.png b/mods/artdeco/textures/artdeco_italian_marble.png new file mode 100644 index 00000000..d821570c Binary files /dev/null and b/mods/artdeco/textures/artdeco_italian_marble.png differ diff --git a/mods/artdeco/textures/artdeco_lightwin1.png b/mods/artdeco/textures/artdeco_lightwin1.png new file mode 100644 index 00000000..9bd46aab Binary files /dev/null and b/mods/artdeco/textures/artdeco_lightwin1.png differ diff --git a/mods/artdeco/textures/artdeco_lightwin2.png b/mods/artdeco/textures/artdeco_lightwin2.png new file mode 100644 index 00000000..ca7380e2 Binary files /dev/null and b/mods/artdeco/textures/artdeco_lightwin2.png differ diff --git a/mods/artdeco/textures/artdeco_lightwin3.png b/mods/artdeco/textures/artdeco_lightwin3.png new file mode 100644 index 00000000..57bc6dd1 Binary files /dev/null and b/mods/artdeco/textures/artdeco_lightwin3.png differ diff --git a/mods/artdeco/textures/artdeco_lionheart.png b/mods/artdeco/textures/artdeco_lionheart.png new file mode 100644 index 00000000..08f49553 Binary files /dev/null and b/mods/artdeco/textures/artdeco_lionheart.png differ diff --git a/mods/artdeco/textures/artdeco_lionheart_back.png b/mods/artdeco/textures/artdeco_lionheart_back.png new file mode 100644 index 00000000..08f49553 Binary files /dev/null and b/mods/artdeco/textures/artdeco_lionheart_back.png differ diff --git a/mods/artdeco/textures/artdeco_lionheart_bottom.png b/mods/artdeco/textures/artdeco_lionheart_bottom.png new file mode 100644 index 00000000..08f49553 Binary files /dev/null and b/mods/artdeco/textures/artdeco_lionheart_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_lionheart_front.png b/mods/artdeco/textures/artdeco_lionheart_front.png new file mode 100644 index 00000000..7ff67ac3 Binary files /dev/null and b/mods/artdeco/textures/artdeco_lionheart_front.png differ diff --git a/mods/artdeco/textures/artdeco_lionheart_side.png b/mods/artdeco/textures/artdeco_lionheart_side.png new file mode 100644 index 00000000..08f49553 Binary files /dev/null and b/mods/artdeco/textures/artdeco_lionheart_side.png differ diff --git a/mods/artdeco/textures/artdeco_stonewall.png b/mods/artdeco/textures/artdeco_stonewall.png new file mode 100644 index 00000000..52cf90ab Binary files /dev/null and b/mods/artdeco/textures/artdeco_stonewall.png differ diff --git a/mods/artdeco/textures/artdeco_thin_stonewall.png b/mods/artdeco/textures/artdeco_thin_stonewall.png new file mode 100644 index 00000000..52cf90ab Binary files /dev/null and b/mods/artdeco/textures/artdeco_thin_stonewall.png differ diff --git a/mods/artdeco/textures/artdeco_thin_stonewall_corner.png b/mods/artdeco/textures/artdeco_thin_stonewall_corner.png new file mode 100644 index 00000000..52cf90ab Binary files /dev/null and b/mods/artdeco/textures/artdeco_thin_stonewall_corner.png differ diff --git a/mods/artdeco/textures/artdeco_tile1.png b/mods/artdeco/textures/artdeco_tile1.png new file mode 100644 index 00000000..8560458b Binary files /dev/null and b/mods/artdeco/textures/artdeco_tile1.png differ diff --git a/mods/artdeco/textures/artdeco_tile2.png b/mods/artdeco/textures/artdeco_tile2.png new file mode 100644 index 00000000..13d34647 Binary files /dev/null and b/mods/artdeco/textures/artdeco_tile2.png differ diff --git a/mods/artdeco/textures/artdeco_tile3.png b/mods/artdeco/textures/artdeco_tile3.png new file mode 100644 index 00000000..e9864f2b Binary files /dev/null and b/mods/artdeco/textures/artdeco_tile3.png differ diff --git a/mods/artdeco/textures/artdeco_tile4.png b/mods/artdeco/textures/artdeco_tile4.png new file mode 100644 index 00000000..17592260 Binary files /dev/null and b/mods/artdeco/textures/artdeco_tile4.png differ diff --git a/mods/artdeco/textures/artdeco_tile5.png b/mods/artdeco/textures/artdeco_tile5.png new file mode 100644 index 00000000..ae3b3e1d Binary files /dev/null and b/mods/artdeco/textures/artdeco_tile5.png differ diff --git a/mods/artdeco/textures/artdeco_whitegardenstone.png b/mods/artdeco/textures/artdeco_whitegardenstone.png new file mode 100644 index 00000000..4447a77e Binary files /dev/null and b/mods/artdeco/textures/artdeco_whitegardenstone.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1a.png b/mods/artdeco/textures/artdeco_wincross1a.png new file mode 100644 index 00000000..a652eebd Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1a.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1a_back.png b/mods/artdeco/textures/artdeco_wincross1a_back.png new file mode 100644 index 00000000..a652eebd Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1a_back.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1a_bottom.png b/mods/artdeco/textures/artdeco_wincross1a_bottom.png new file mode 100644 index 00000000..a652eebd Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1a_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1a_front-1.png b/mods/artdeco/textures/artdeco_wincross1a_front-1.png new file mode 100644 index 00000000..37b12b86 Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1a_front-1.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1a_front.png b/mods/artdeco/textures/artdeco_wincross1a_front.png new file mode 100644 index 00000000..289054a4 Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1a_front.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1a_side.png b/mods/artdeco/textures/artdeco_wincross1a_side.png new file mode 100644 index 00000000..37b12b86 Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1a_side.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1b.png b/mods/artdeco/textures/artdeco_wincross1b.png new file mode 100644 index 00000000..a652eebd Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1b.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1b_back.png b/mods/artdeco/textures/artdeco_wincross1b_back.png new file mode 100644 index 00000000..a652eebd Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1b_back.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1b_bottom.png b/mods/artdeco/textures/artdeco_wincross1b_bottom.png new file mode 100644 index 00000000..a652eebd Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1b_bottom.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1b_front.png b/mods/artdeco/textures/artdeco_wincross1b_front.png new file mode 100644 index 00000000..9cdbce7f Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1b_front.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1b_lside.png b/mods/artdeco/textures/artdeco_wincross1b_lside.png new file mode 100644 index 00000000..9cdbce7f Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1b_lside.png differ diff --git a/mods/artdeco/textures/artdeco_wincross1b_rside.png b/mods/artdeco/textures/artdeco_wincross1b_rside.png new file mode 100644 index 00000000..9cdbce7f Binary files /dev/null and b/mods/artdeco/textures/artdeco_wincross1b_rside.png differ diff --git a/mods/artdeco/textures/textures.txt b/mods/artdeco/textures/textures.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mods/artdeco/textures/textures.txt @@ -0,0 +1 @@ + diff --git a/mods/artdeco/texturesx16/artdeco_1a.png b/mods/artdeco/texturesx16/artdeco_1a.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1a_back.png b/mods/artdeco/texturesx16/artdeco_1a_back.png new file mode 100644 index 00000000..5bedb255 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1a_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1a_bottom.png b/mods/artdeco/texturesx16/artdeco_1a_bottom.png new file mode 100644 index 00000000..767318e8 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1a_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1a_front.png b/mods/artdeco/texturesx16/artdeco_1a_front.png new file mode 100644 index 00000000..5bedb255 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1a_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1a_side.png b/mods/artdeco/texturesx16/artdeco_1a_side.png new file mode 100644 index 00000000..5bedb255 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1a_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1b.png b/mods/artdeco/texturesx16/artdeco_1b.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1b_back.png b/mods/artdeco/texturesx16/artdeco_1b_back.png new file mode 100644 index 00000000..174d8a63 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1b_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1b_bottom.png b/mods/artdeco/texturesx16/artdeco_1b_bottom.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1b_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1b_front.png b/mods/artdeco/texturesx16/artdeco_1b_front.png new file mode 100644 index 00000000..dffc2754 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1b_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1b_lside.png b/mods/artdeco/texturesx16/artdeco_1b_lside.png new file mode 100644 index 00000000..10337042 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1b_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1b_rside.png b/mods/artdeco/texturesx16/artdeco_1b_rside.png new file mode 100644 index 00000000..5bedb255 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1b_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1c.png b/mods/artdeco/texturesx16/artdeco_1c.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1c.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1c_back.png b/mods/artdeco/texturesx16/artdeco_1c_back.png new file mode 100644 index 00000000..dffc2754 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1c_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1c_bottom.png b/mods/artdeco/texturesx16/artdeco_1c_bottom.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1c_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1c_front.png b/mods/artdeco/texturesx16/artdeco_1c_front.png new file mode 100644 index 00000000..174d8a63 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1c_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1c_lside.png b/mods/artdeco/texturesx16/artdeco_1c_lside.png new file mode 100644 index 00000000..5bedb255 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1c_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1c_rside.png b/mods/artdeco/texturesx16/artdeco_1c_rside.png new file mode 100644 index 00000000..10337042 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1c_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1d.png b/mods/artdeco/texturesx16/artdeco_1d.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1d.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1d_back.png b/mods/artdeco/texturesx16/artdeco_1d_back.png new file mode 100644 index 00000000..80f590a9 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1d_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1d_bottom.png b/mods/artdeco/texturesx16/artdeco_1d_bottom.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1d_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1d_front.png b/mods/artdeco/texturesx16/artdeco_1d_front.png new file mode 100644 index 00000000..5a377b89 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1d_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1d_lside.png b/mods/artdeco/texturesx16/artdeco_1d_lside.png new file mode 100644 index 00000000..4adb7afc Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1d_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1d_rside.png b/mods/artdeco/texturesx16/artdeco_1d_rside.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1d_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1e.png b/mods/artdeco/texturesx16/artdeco_1e.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1e.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1f.png b/mods/artdeco/texturesx16/artdeco_1f.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1f.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1f_back.png b/mods/artdeco/texturesx16/artdeco_1f_back.png new file mode 100644 index 00000000..5a377b89 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1f_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1f_bottom.png b/mods/artdeco/texturesx16/artdeco_1f_bottom.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1f_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1f_front.png b/mods/artdeco/texturesx16/artdeco_1f_front.png new file mode 100644 index 00000000..80f590a9 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1f_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1f_lside.png b/mods/artdeco/texturesx16/artdeco_1f_lside.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1f_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1f_rside.png b/mods/artdeco/texturesx16/artdeco_1f_rside.png new file mode 100644 index 00000000..4adb7afc Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1f_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1g.png b/mods/artdeco/texturesx16/artdeco_1g.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1g.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1g_back.png b/mods/artdeco/texturesx16/artdeco_1g_back.png new file mode 100644 index 00000000..efc01318 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1g_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1g_bottom.png b/mods/artdeco/texturesx16/artdeco_1g_bottom.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1g_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1g_front.png b/mods/artdeco/texturesx16/artdeco_1g_front.png new file mode 100644 index 00000000..bd41c7ad Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1g_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1g_lside.png b/mods/artdeco/texturesx16/artdeco_1g_lside.png new file mode 100644 index 00000000..7b6618b2 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1g_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1g_rside.png b/mods/artdeco/texturesx16/artdeco_1g_rside.png new file mode 100644 index 00000000..bef4ce61 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1g_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1h.png b/mods/artdeco/texturesx16/artdeco_1h.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1h.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1h_back.png b/mods/artdeco/texturesx16/artdeco_1h_back.png new file mode 100644 index 00000000..bef4ce61 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1h_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1h_bottom.png b/mods/artdeco/texturesx16/artdeco_1h_bottom.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1h_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1h_front.png b/mods/artdeco/texturesx16/artdeco_1h_front.png new file mode 100644 index 00000000..bef4ce61 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1h_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1h_lside.png b/mods/artdeco/texturesx16/artdeco_1h_lside.png new file mode 100644 index 00000000..bef4ce61 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1h_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1h_rside.png b/mods/artdeco/texturesx16/artdeco_1h_rside.png new file mode 100644 index 00000000..bef4ce61 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1h_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1i.png b/mods/artdeco/texturesx16/artdeco_1i.png new file mode 100644 index 00000000..976f0384 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1i.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1i_back.png b/mods/artdeco/texturesx16/artdeco_1i_back.png new file mode 100644 index 00000000..bd41c7ad Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1i_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1i_bottom.png b/mods/artdeco/texturesx16/artdeco_1i_bottom.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1i_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1i_front.png b/mods/artdeco/texturesx16/artdeco_1i_front.png new file mode 100644 index 00000000..efc01318 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1i_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1i_lside.png b/mods/artdeco/texturesx16/artdeco_1i_lside.png new file mode 100644 index 00000000..bef4ce61 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1i_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1i_rside.png b/mods/artdeco/texturesx16/artdeco_1i_rside.png new file mode 100644 index 00000000..7b6618b2 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1i_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1j.png b/mods/artdeco/texturesx16/artdeco_1j.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1j.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1j_back.png b/mods/artdeco/texturesx16/artdeco_1j_back.png new file mode 100644 index 00000000..10337042 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1j_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1j_bottom.png b/mods/artdeco/texturesx16/artdeco_1j_bottom.png new file mode 100644 index 00000000..767318e8 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1j_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1j_front.png b/mods/artdeco/texturesx16/artdeco_1j_front.png new file mode 100644 index 00000000..10337042 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1j_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1j_side.png b/mods/artdeco/texturesx16/artdeco_1j_side.png new file mode 100644 index 00000000..10337042 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1j_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1k.png b/mods/artdeco/texturesx16/artdeco_1k.png new file mode 100644 index 00000000..35888a9d Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1k.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1k_back.png b/mods/artdeco/texturesx16/artdeco_1k_back.png new file mode 100644 index 00000000..4adb7afc Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1k_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1k_bottom.png b/mods/artdeco/texturesx16/artdeco_1k_bottom.png new file mode 100644 index 00000000..35888a9d Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1k_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1k_front.png b/mods/artdeco/texturesx16/artdeco_1k_front.png new file mode 100644 index 00000000..4adb7afc Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1k_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1k_side.png b/mods/artdeco/texturesx16/artdeco_1k_side.png new file mode 100644 index 00000000..4adb7afc Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1k_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1l.png b/mods/artdeco/texturesx16/artdeco_1l.png new file mode 100644 index 00000000..35888a9d Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1l.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1l_bottom.png b/mods/artdeco/texturesx16/artdeco_1l_bottom.png new file mode 100644 index 00000000..b8f1ae95 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1l_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_1l_side.png b/mods/artdeco/texturesx16/artdeco_1l_side.png new file mode 100644 index 00000000..7b6618b2 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_1l_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2a.png b/mods/artdeco/texturesx16/artdeco_2a.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2a_back.png b/mods/artdeco/texturesx16/artdeco_2a_back.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2a_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2a_bottom.png b/mods/artdeco/texturesx16/artdeco_2a_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2a_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2a_front.png b/mods/artdeco/texturesx16/artdeco_2a_front.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2a_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2a_lside.png b/mods/artdeco/texturesx16/artdeco_2a_lside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2a_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2a_rside.png b/mods/artdeco/texturesx16/artdeco_2a_rside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2a_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2b.png b/mods/artdeco/texturesx16/artdeco_2b.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2b_back.png b/mods/artdeco/texturesx16/artdeco_2b_back.png new file mode 100644 index 00000000..4967333d Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2b_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2b_bottom.png b/mods/artdeco/texturesx16/artdeco_2b_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2b_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2b_front.png b/mods/artdeco/texturesx16/artdeco_2b_front.png new file mode 100644 index 00000000..4967333d Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2b_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2b_lside.png b/mods/artdeco/texturesx16/artdeco_2b_lside.png new file mode 100644 index 00000000..4967333d Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2b_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2b_rside.png b/mods/artdeco/texturesx16/artdeco_2b_rside.png new file mode 100644 index 00000000..4967333d Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2b_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2c.png b/mods/artdeco/texturesx16/artdeco_2c.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2c.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2c_back.png b/mods/artdeco/texturesx16/artdeco_2c_back.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2c_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2c_bottom.png b/mods/artdeco/texturesx16/artdeco_2c_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2c_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2c_front.png b/mods/artdeco/texturesx16/artdeco_2c_front.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2c_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2c_lside.png b/mods/artdeco/texturesx16/artdeco_2c_lside.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2c_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2c_rside.png b/mods/artdeco/texturesx16/artdeco_2c_rside.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2c_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_2d.png b/mods/artdeco/texturesx16/artdeco_2d.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_2d.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1a.png b/mods/artdeco/texturesx16/artdeco_arch1a.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1a_back.png b/mods/artdeco/texturesx16/artdeco_arch1a_back.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1a_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1a_bottom.png b/mods/artdeco/texturesx16/artdeco_arch1a_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1a_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1a_front.png b/mods/artdeco/texturesx16/artdeco_arch1a_front.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1a_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1a_lside.png b/mods/artdeco/texturesx16/artdeco_arch1a_lside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1a_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1a_rside.png b/mods/artdeco/texturesx16/artdeco_arch1a_rside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1a_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1b.png b/mods/artdeco/texturesx16/artdeco_arch1b.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1c.png b/mods/artdeco/texturesx16/artdeco_arch1c.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1c.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1d.png b/mods/artdeco/texturesx16/artdeco_arch1d.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1d.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1d_back.png b/mods/artdeco/texturesx16/artdeco_arch1d_back.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1d_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1d_bottom.png b/mods/artdeco/texturesx16/artdeco_arch1d_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1d_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1d_front.png b/mods/artdeco/texturesx16/artdeco_arch1d_front.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1d_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1d_rsidex.png b/mods/artdeco/texturesx16/artdeco_arch1d_rsidex.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1d_rsidex.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1d_side.png b/mods/artdeco/texturesx16/artdeco_arch1d_side.png new file mode 100644 index 00000000..87bb80fd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1d_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1e.png b/mods/artdeco/texturesx16/artdeco_arch1e.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1e.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1e_back.png b/mods/artdeco/texturesx16/artdeco_arch1e_back.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1e_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1e_bottom.png b/mods/artdeco/texturesx16/artdeco_arch1e_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1e_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1e_front.png b/mods/artdeco/texturesx16/artdeco_arch1e_front.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1e_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch1e_side.png b/mods/artdeco/texturesx16/artdeco_arch1e_side.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch1e_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_arch2a.png b/mods/artdeco/texturesx16/artdeco_arch2a.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_arch2a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin1a.png b/mods/artdeco/texturesx16/artdeco_archwin1a.png new file mode 100644 index 00000000..14a34365 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin1a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin1a_inv.png b/mods/artdeco/texturesx16/artdeco_archwin1a_inv.png new file mode 100644 index 00000000..bfb2ff51 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin1a_inv.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin1b.png b/mods/artdeco/texturesx16/artdeco_archwin1b.png new file mode 100644 index 00000000..08f19136 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin1b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin1b_inv.png b/mods/artdeco/texturesx16/artdeco_archwin1b_inv.png new file mode 100644 index 00000000..93b46bc2 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin1b_inv.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin1c.png b/mods/artdeco/texturesx16/artdeco_archwin1c.png new file mode 100644 index 00000000..f129a017 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin1c.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin1c_inv.png b/mods/artdeco/texturesx16/artdeco_archwin1c_inv.png new file mode 100644 index 00000000..dad38577 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin1c_inv.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin2a.png b/mods/artdeco/texturesx16/artdeco_archwin2a.png new file mode 100644 index 00000000..e5db07cd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin2a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin2a_inv.png b/mods/artdeco/texturesx16/artdeco_archwin2a_inv.png new file mode 100644 index 00000000..8c376595 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin2a_inv.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin2b.png b/mods/artdeco/texturesx16/artdeco_archwin2b.png new file mode 100644 index 00000000..1b6ae301 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin2b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin2b_inv.png b/mods/artdeco/texturesx16/artdeco_archwin2b_inv.png new file mode 100644 index 00000000..a14b4386 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin2b_inv.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin2c.png b/mods/artdeco/texturesx16/artdeco_archwin2c.png new file mode 100644 index 00000000..22bdc4b4 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin2c.png differ diff --git a/mods/artdeco/texturesx16/artdeco_archwin2c_inv.png b/mods/artdeco/texturesx16/artdeco_archwin2c_inv.png new file mode 100644 index 00000000..ffa4ddf6 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_archwin2c_inv.png differ diff --git a/mods/artdeco/texturesx16/artdeco_brownwalltile.png b/mods/artdeco/texturesx16/artdeco_brownwalltile.png new file mode 100644 index 00000000..0e96ced1 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_brownwalltile.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1a.png b/mods/artdeco/texturesx16/artdeco_column1a.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1a_bottom.png b/mods/artdeco/texturesx16/artdeco_column1a_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1a_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1a_side.png b/mods/artdeco/texturesx16/artdeco_column1a_side.png new file mode 100644 index 00000000..5a196a5b Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1a_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1b.png b/mods/artdeco/texturesx16/artdeco_column1b.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1b_bottom.png b/mods/artdeco/texturesx16/artdeco_column1b_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1b_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1b_side.png b/mods/artdeco/texturesx16/artdeco_column1b_side.png new file mode 100644 index 00000000..a9fe6ac0 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1b_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1c.png b/mods/artdeco/texturesx16/artdeco_column1c.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1c.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1c_bottom.png b/mods/artdeco/texturesx16/artdeco_column1c_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1c_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1c_side.png b/mods/artdeco/texturesx16/artdeco_column1c_side.png new file mode 100644 index 00000000..5c25626e Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1c_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1d.png b/mods/artdeco/texturesx16/artdeco_column1d.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1d.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1d_bottom.png b/mods/artdeco/texturesx16/artdeco_column1d_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1d_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column1d_side.png b/mods/artdeco/texturesx16/artdeco_column1d_side.png new file mode 100644 index 00000000..b11cd3c0 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column1d_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column2a.png b/mods/artdeco/texturesx16/artdeco_column2a.png new file mode 100644 index 00000000..7989d69e Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column2a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column2a_bottom.png b/mods/artdeco/texturesx16/artdeco_column2a_bottom.png new file mode 100644 index 00000000..7989d69e Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column2a_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column2a_side-1.png b/mods/artdeco/texturesx16/artdeco_column2a_side-1.png new file mode 100644 index 00000000..71fd1724 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column2a_side-1.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column2b_side.png b/mods/artdeco/texturesx16/artdeco_column2b_side.png new file mode 100644 index 00000000..48209512 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column2b_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_column2c_side.png b/mods/artdeco/texturesx16/artdeco_column2c_side.png new file mode 100644 index 00000000..ea066292 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_column2c_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarch1a.png b/mods/artdeco/texturesx16/artdeco_dblarch1a.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarch1a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarch1a_back.png b/mods/artdeco/texturesx16/artdeco_dblarch1a_back.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarch1a_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarch1a_bottom.png b/mods/artdeco/texturesx16/artdeco_dblarch1a_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarch1a_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarch1a_front.png b/mods/artdeco/texturesx16/artdeco_dblarch1a_front.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarch1a_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarch1a_lside.png b/mods/artdeco/texturesx16/artdeco_dblarch1a_lside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarch1a_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarch1a_rside.png b/mods/artdeco/texturesx16/artdeco_dblarch1a_rside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarch1a_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarch1b.png b/mods/artdeco/texturesx16/artdeco_dblarch1b.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarch1b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarchslab.png b/mods/artdeco/texturesx16/artdeco_dblarchslab.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarchslab.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarchslab_back.png b/mods/artdeco/texturesx16/artdeco_dblarchslab_back.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarchslab_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarchslab_bottom.png b/mods/artdeco/texturesx16/artdeco_dblarchslab_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarchslab_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarchslab_front.png b/mods/artdeco/texturesx16/artdeco_dblarchslab_front.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarchslab_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarchslab_lside.png b/mods/artdeco/texturesx16/artdeco_dblarchslab_lside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarchslab_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_dblarchslab_rside.png b/mods/artdeco/texturesx16/artdeco_dblarchslab_rside.png new file mode 100644 index 00000000..b2ba2839 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_dblarchslab_rside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock1.png b/mods/artdeco/texturesx16/artdeco_decoblock1.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock1.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock1_back.png b/mods/artdeco/texturesx16/artdeco_decoblock1_back.png new file mode 100644 index 00000000..e3fbde30 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock1_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock1_bottom.png b/mods/artdeco/texturesx16/artdeco_decoblock1_bottom.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock1_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock1_front.png b/mods/artdeco/texturesx16/artdeco_decoblock1_front.png new file mode 100644 index 00000000..e3fbde30 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock1_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock1_side.png b/mods/artdeco/texturesx16/artdeco_decoblock1_side.png new file mode 100644 index 00000000..e3fbde30 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock1_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock2(forall).png b/mods/artdeco/texturesx16/artdeco_decoblock2(forall).png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock2(forall).png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock2.png b/mods/artdeco/texturesx16/artdeco_decoblock2.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock2.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock2_bottom.png b/mods/artdeco/texturesx16/artdeco_decoblock2_bottom.png new file mode 100644 index 00000000..97dc2f4a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock2_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock2_side.png b/mods/artdeco/texturesx16/artdeco_decoblock2_side.png new file mode 100644 index 00000000..4117fa14 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock2_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock3.png b/mods/artdeco/texturesx16/artdeco_decoblock3.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock3.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock3_bottom.png b/mods/artdeco/texturesx16/artdeco_decoblock3_bottom.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock3_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock3_side.png b/mods/artdeco/texturesx16/artdeco_decoblock3_side.png new file mode 100644 index 00000000..b76ca5b0 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock3_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock4.png b/mods/artdeco/texturesx16/artdeco_decoblock4.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock4.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock4_bottom.png b/mods/artdeco/texturesx16/artdeco_decoblock4_bottom.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock4_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock4_side.png b/mods/artdeco/texturesx16/artdeco_decoblock4_side.png new file mode 100644 index 00000000..a983828f Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock4_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock5.png b/mods/artdeco/texturesx16/artdeco_decoblock5.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock5.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock5_bottom.png b/mods/artdeco/texturesx16/artdeco_decoblock5_bottom.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock5_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock5_side.png b/mods/artdeco/texturesx16/artdeco_decoblock5_side.png new file mode 100644 index 00000000..20a847e7 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock5_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock6.png b/mods/artdeco/texturesx16/artdeco_decoblock6.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock6.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock6_bottom.png b/mods/artdeco/texturesx16/artdeco_decoblock6_bottom.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock6_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decoblock6_side.png b/mods/artdeco/texturesx16/artdeco_decoblock6_side.png new file mode 100644 index 00000000..334d468a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decoblock6_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decostair1.png b/mods/artdeco/texturesx16/artdeco_decostair1.png new file mode 100644 index 00000000..1fd38193 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decostair1.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decostair2.png b/mods/artdeco/texturesx16/artdeco_decostair2.png new file mode 100644 index 00000000..e3fbde30 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decostair2.png differ diff --git a/mods/artdeco/texturesx16/artdeco_decostair3.png b/mods/artdeco/texturesx16/artdeco_decostair3.png new file mode 100644 index 00000000..cb6b2897 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_decostair3.png differ diff --git a/mods/artdeco/texturesx16/artdeco_estatedoor_bottom-flat.png b/mods/artdeco/texturesx16/artdeco_estatedoor_bottom-flat.png new file mode 100644 index 00000000..5a986ab3 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_estatedoor_bottom-flat.png differ diff --git a/mods/artdeco/texturesx16/artdeco_estatedoor_bottom.png b/mods/artdeco/texturesx16/artdeco_estatedoor_bottom.png new file mode 100644 index 00000000..db8f0eef Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_estatedoor_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_estatedoor_edge.png b/mods/artdeco/texturesx16/artdeco_estatedoor_edge.png new file mode 100644 index 00000000..0b90297f Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_estatedoor_edge.png differ diff --git a/mods/artdeco/texturesx16/artdeco_estatedoor_inv.png b/mods/artdeco/texturesx16/artdeco_estatedoor_inv.png new file mode 100644 index 00000000..d768e128 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_estatedoor_inv.png differ diff --git a/mods/artdeco/texturesx16/artdeco_estatedoor_top-flat.png b/mods/artdeco/texturesx16/artdeco_estatedoor_top-flat.png new file mode 100644 index 00000000..2aacac05 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_estatedoor_top-flat.png differ diff --git a/mods/artdeco/texturesx16/artdeco_estatedoor_top.png b/mods/artdeco/texturesx16/artdeco_estatedoor_top.png new file mode 100644 index 00000000..12b09163 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_estatedoor_top.png differ diff --git a/mods/artdeco/texturesx16/artdeco_greenwalltile.png b/mods/artdeco/texturesx16/artdeco_greenwalltile.png new file mode 100644 index 00000000..037ded38 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_greenwalltile.png differ diff --git a/mods/artdeco/texturesx16/artdeco_irongrating.png b/mods/artdeco/texturesx16/artdeco_irongrating.png new file mode 100644 index 00000000..9c9a3b75 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_irongrating.png differ diff --git a/mods/artdeco/texturesx16/artdeco_italian_marble.png b/mods/artdeco/texturesx16/artdeco_italian_marble.png new file mode 100644 index 00000000..64bbecf8 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_italian_marble.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lightwin1.png b/mods/artdeco/texturesx16/artdeco_lightwin1.png new file mode 100644 index 00000000..c0737231 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lightwin1.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lightwin2.png b/mods/artdeco/texturesx16/artdeco_lightwin2.png new file mode 100644 index 00000000..3f978c88 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lightwin2.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lightwin3.png b/mods/artdeco/texturesx16/artdeco_lightwin3.png new file mode 100644 index 00000000..06a318cf Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lightwin3.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lionheart.png b/mods/artdeco/texturesx16/artdeco_lionheart.png new file mode 100644 index 00000000..e7c61e5a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lionheart.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lionheart_back.png b/mods/artdeco/texturesx16/artdeco_lionheart_back.png new file mode 100644 index 00000000..e7c61e5a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lionheart_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lionheart_bottom.png b/mods/artdeco/texturesx16/artdeco_lionheart_bottom.png new file mode 100644 index 00000000..e7c61e5a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lionheart_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lionheart_front.png b/mods/artdeco/texturesx16/artdeco_lionheart_front.png new file mode 100644 index 00000000..e68babc2 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lionheart_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_lionheart_side.png b/mods/artdeco/texturesx16/artdeco_lionheart_side.png new file mode 100644 index 00000000..e7c61e5a Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_lionheart_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_stonewall.png b/mods/artdeco/texturesx16/artdeco_stonewall.png new file mode 100644 index 00000000..cb6b2897 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_stonewall.png differ diff --git a/mods/artdeco/texturesx16/artdeco_thin_stonewall.png b/mods/artdeco/texturesx16/artdeco_thin_stonewall.png new file mode 100644 index 00000000..cb6b2897 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_thin_stonewall.png differ diff --git a/mods/artdeco/texturesx16/artdeco_thin_stonewall_corner.png b/mods/artdeco/texturesx16/artdeco_thin_stonewall_corner.png new file mode 100644 index 00000000..cb6b2897 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_thin_stonewall_corner.png differ diff --git a/mods/artdeco/texturesx16/artdeco_tile1.png b/mods/artdeco/texturesx16/artdeco_tile1.png new file mode 100644 index 00000000..8dc3cc18 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_tile1.png differ diff --git a/mods/artdeco/texturesx16/artdeco_tile2.png b/mods/artdeco/texturesx16/artdeco_tile2.png new file mode 100644 index 00000000..c3699fa3 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_tile2.png differ diff --git a/mods/artdeco/texturesx16/artdeco_tile3.png b/mods/artdeco/texturesx16/artdeco_tile3.png new file mode 100644 index 00000000..e54a9c60 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_tile3.png differ diff --git a/mods/artdeco/texturesx16/artdeco_tile4.png b/mods/artdeco/texturesx16/artdeco_tile4.png new file mode 100644 index 00000000..a674a1bd Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_tile4.png differ diff --git a/mods/artdeco/texturesx16/artdeco_tile5.png b/mods/artdeco/texturesx16/artdeco_tile5.png new file mode 100644 index 00000000..3d948e64 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_tile5.png differ diff --git a/mods/artdeco/texturesx16/artdeco_whitegardenstone.png b/mods/artdeco/texturesx16/artdeco_whitegardenstone.png new file mode 100644 index 00000000..ddceb74b Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_whitegardenstone.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1a.png b/mods/artdeco/texturesx16/artdeco_wincross1a.png new file mode 100644 index 00000000..ba50e275 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1a.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1a_back.png b/mods/artdeco/texturesx16/artdeco_wincross1a_back.png new file mode 100644 index 00000000..ba50e275 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1a_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1a_bottom.png b/mods/artdeco/texturesx16/artdeco_wincross1a_bottom.png new file mode 100644 index 00000000..ba50e275 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1a_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1a_front-1.png b/mods/artdeco/texturesx16/artdeco_wincross1a_front-1.png new file mode 100644 index 00000000..1a737642 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1a_front-1.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1a_front.png b/mods/artdeco/texturesx16/artdeco_wincross1a_front.png new file mode 100644 index 00000000..bb4bcea6 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1a_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1a_side.png b/mods/artdeco/texturesx16/artdeco_wincross1a_side.png new file mode 100644 index 00000000..1a737642 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1a_side.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1b.png b/mods/artdeco/texturesx16/artdeco_wincross1b.png new file mode 100644 index 00000000..ba50e275 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1b.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1b_back.png b/mods/artdeco/texturesx16/artdeco_wincross1b_back.png new file mode 100644 index 00000000..ba50e275 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1b_back.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1b_bottom.png b/mods/artdeco/texturesx16/artdeco_wincross1b_bottom.png new file mode 100644 index 00000000..ba50e275 Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1b_bottom.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1b_front.png b/mods/artdeco/texturesx16/artdeco_wincross1b_front.png new file mode 100644 index 00000000..39e5f30f Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1b_front.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1b_lside.png b/mods/artdeco/texturesx16/artdeco_wincross1b_lside.png new file mode 100644 index 00000000..39e5f30f Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1b_lside.png differ diff --git a/mods/artdeco/texturesx16/artdeco_wincross1b_rside.png b/mods/artdeco/texturesx16/artdeco_wincross1b_rside.png new file mode 100644 index 00000000..39e5f30f Binary files /dev/null and b/mods/artdeco/texturesx16/artdeco_wincross1b_rside.png differ diff --git a/mods/artdeco/texturesx16/texturesx16.txt b/mods/artdeco/texturesx16/texturesx16.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mods/artdeco/texturesx16/texturesx16.txt @@ -0,0 +1 @@ + diff --git a/mods/artdeco/texturesx32/artdeco_1a.png b/mods/artdeco/texturesx32/artdeco_1a.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1a_back.png b/mods/artdeco/texturesx32/artdeco_1a_back.png new file mode 100644 index 00000000..e6e9a98e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1a_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1a_bottom.png b/mods/artdeco/texturesx32/artdeco_1a_bottom.png new file mode 100644 index 00000000..9dd6bbec Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1a_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1a_front.png b/mods/artdeco/texturesx32/artdeco_1a_front.png new file mode 100644 index 00000000..e6e9a98e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1a_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1a_side.png b/mods/artdeco/texturesx32/artdeco_1a_side.png new file mode 100644 index 00000000..e6e9a98e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1a_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1b.png b/mods/artdeco/texturesx32/artdeco_1b.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1b_back.png b/mods/artdeco/texturesx32/artdeco_1b_back.png new file mode 100644 index 00000000..62f787ae Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1b_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1b_bottom.png b/mods/artdeco/texturesx32/artdeco_1b_bottom.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1b_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1b_front.png b/mods/artdeco/texturesx32/artdeco_1b_front.png new file mode 100644 index 00000000..afb9ca44 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1b_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1b_lside.png b/mods/artdeco/texturesx32/artdeco_1b_lside.png new file mode 100644 index 00000000..db1d51cb Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1b_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1b_rside.png b/mods/artdeco/texturesx32/artdeco_1b_rside.png new file mode 100644 index 00000000..e6e9a98e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1b_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1c.png b/mods/artdeco/texturesx32/artdeco_1c.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1c.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1c_back.png b/mods/artdeco/texturesx32/artdeco_1c_back.png new file mode 100644 index 00000000..afb9ca44 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1c_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1c_bottom.png b/mods/artdeco/texturesx32/artdeco_1c_bottom.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1c_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1c_front.png b/mods/artdeco/texturesx32/artdeco_1c_front.png new file mode 100644 index 00000000..62f787ae Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1c_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1c_lside.png b/mods/artdeco/texturesx32/artdeco_1c_lside.png new file mode 100644 index 00000000..e6e9a98e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1c_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1c_rside.png b/mods/artdeco/texturesx32/artdeco_1c_rside.png new file mode 100644 index 00000000..db1d51cb Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1c_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1d.png b/mods/artdeco/texturesx32/artdeco_1d.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1d.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1d_back.png b/mods/artdeco/texturesx32/artdeco_1d_back.png new file mode 100644 index 00000000..feed72ad Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1d_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1d_bottom.png b/mods/artdeco/texturesx32/artdeco_1d_bottom.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1d_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1d_front.png b/mods/artdeco/texturesx32/artdeco_1d_front.png new file mode 100644 index 00000000..e27f9c88 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1d_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1d_lside.png b/mods/artdeco/texturesx32/artdeco_1d_lside.png new file mode 100644 index 00000000..4ee84b0c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1d_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1d_rside.png b/mods/artdeco/texturesx32/artdeco_1d_rside.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1d_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1e.png b/mods/artdeco/texturesx32/artdeco_1e.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1e.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1f.png b/mods/artdeco/texturesx32/artdeco_1f.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1f.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1f_back.png b/mods/artdeco/texturesx32/artdeco_1f_back.png new file mode 100644 index 00000000..e27f9c88 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1f_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1f_bottom.png b/mods/artdeco/texturesx32/artdeco_1f_bottom.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1f_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1f_front.png b/mods/artdeco/texturesx32/artdeco_1f_front.png new file mode 100644 index 00000000..feed72ad Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1f_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1f_lside.png b/mods/artdeco/texturesx32/artdeco_1f_lside.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1f_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1f_rside.png b/mods/artdeco/texturesx32/artdeco_1f_rside.png new file mode 100644 index 00000000..4ee84b0c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1f_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1g.png b/mods/artdeco/texturesx32/artdeco_1g.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1g.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1g_back.png b/mods/artdeco/texturesx32/artdeco_1g_back.png new file mode 100644 index 00000000..ace2518c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1g_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1g_bottom.png b/mods/artdeco/texturesx32/artdeco_1g_bottom.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1g_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1g_front.png b/mods/artdeco/texturesx32/artdeco_1g_front.png new file mode 100644 index 00000000..3a80d8e5 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1g_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1g_lside.png b/mods/artdeco/texturesx32/artdeco_1g_lside.png new file mode 100644 index 00000000..3b3c0c88 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1g_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1g_rside.png b/mods/artdeco/texturesx32/artdeco_1g_rside.png new file mode 100644 index 00000000..846246da Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1g_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1h.png b/mods/artdeco/texturesx32/artdeco_1h.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1h.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1h_back.png b/mods/artdeco/texturesx32/artdeco_1h_back.png new file mode 100644 index 00000000..846246da Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1h_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1h_bottom.png b/mods/artdeco/texturesx32/artdeco_1h_bottom.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1h_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1h_front.png b/mods/artdeco/texturesx32/artdeco_1h_front.png new file mode 100644 index 00000000..846246da Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1h_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1h_lside.png b/mods/artdeco/texturesx32/artdeco_1h_lside.png new file mode 100644 index 00000000..846246da Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1h_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1h_rside.png b/mods/artdeco/texturesx32/artdeco_1h_rside.png new file mode 100644 index 00000000..846246da Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1h_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1i.png b/mods/artdeco/texturesx32/artdeco_1i.png new file mode 100644 index 00000000..d73528dc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1i.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1i_back.png b/mods/artdeco/texturesx32/artdeco_1i_back.png new file mode 100644 index 00000000..3a80d8e5 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1i_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1i_bottom.png b/mods/artdeco/texturesx32/artdeco_1i_bottom.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1i_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1i_front.png b/mods/artdeco/texturesx32/artdeco_1i_front.png new file mode 100644 index 00000000..ace2518c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1i_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1i_lside.png b/mods/artdeco/texturesx32/artdeco_1i_lside.png new file mode 100644 index 00000000..846246da Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1i_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1i_rside.png b/mods/artdeco/texturesx32/artdeco_1i_rside.png new file mode 100644 index 00000000..3b3c0c88 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1i_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1j.png b/mods/artdeco/texturesx32/artdeco_1j.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1j.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1j_back.png b/mods/artdeco/texturesx32/artdeco_1j_back.png new file mode 100644 index 00000000..db1d51cb Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1j_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1j_bottom.png b/mods/artdeco/texturesx32/artdeco_1j_bottom.png new file mode 100644 index 00000000..9dd6bbec Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1j_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1j_front.png b/mods/artdeco/texturesx32/artdeco_1j_front.png new file mode 100644 index 00000000..db1d51cb Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1j_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1j_side.png b/mods/artdeco/texturesx32/artdeco_1j_side.png new file mode 100644 index 00000000..db1d51cb Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1j_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1k.png b/mods/artdeco/texturesx32/artdeco_1k.png new file mode 100644 index 00000000..5a789945 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1k.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1k_back.png b/mods/artdeco/texturesx32/artdeco_1k_back.png new file mode 100644 index 00000000..4ee84b0c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1k_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1k_bottom.png b/mods/artdeco/texturesx32/artdeco_1k_bottom.png new file mode 100644 index 00000000..5a789945 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1k_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1k_front.png b/mods/artdeco/texturesx32/artdeco_1k_front.png new file mode 100644 index 00000000..4ee84b0c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1k_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1k_side.png b/mods/artdeco/texturesx32/artdeco_1k_side.png new file mode 100644 index 00000000..4ee84b0c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1k_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1l.png b/mods/artdeco/texturesx32/artdeco_1l.png new file mode 100644 index 00000000..5a789945 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1l.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1l_bottom.png b/mods/artdeco/texturesx32/artdeco_1l_bottom.png new file mode 100644 index 00000000..9d35d25b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1l_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_1l_side.png b/mods/artdeco/texturesx32/artdeco_1l_side.png new file mode 100644 index 00000000..3b3c0c88 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_1l_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2a.png b/mods/artdeco/texturesx32/artdeco_2a.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2a_back.png b/mods/artdeco/texturesx32/artdeco_2a_back.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2a_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2a_bottom.png b/mods/artdeco/texturesx32/artdeco_2a_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2a_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2a_front.png b/mods/artdeco/texturesx32/artdeco_2a_front.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2a_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2a_lside.png b/mods/artdeco/texturesx32/artdeco_2a_lside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2a_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2a_rside.png b/mods/artdeco/texturesx32/artdeco_2a_rside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2a_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2b.png b/mods/artdeco/texturesx32/artdeco_2b.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2b_back.png b/mods/artdeco/texturesx32/artdeco_2b_back.png new file mode 100644 index 00000000..13efd409 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2b_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2b_bottom.png b/mods/artdeco/texturesx32/artdeco_2b_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2b_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2b_front.png b/mods/artdeco/texturesx32/artdeco_2b_front.png new file mode 100644 index 00000000..13efd409 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2b_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2b_lside.png b/mods/artdeco/texturesx32/artdeco_2b_lside.png new file mode 100644 index 00000000..13efd409 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2b_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2b_rside.png b/mods/artdeco/texturesx32/artdeco_2b_rside.png new file mode 100644 index 00000000..13efd409 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2b_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2c.png b/mods/artdeco/texturesx32/artdeco_2c.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2c.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2c_back.png b/mods/artdeco/texturesx32/artdeco_2c_back.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2c_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2c_bottom.png b/mods/artdeco/texturesx32/artdeco_2c_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2c_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2c_front.png b/mods/artdeco/texturesx32/artdeco_2c_front.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2c_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2c_lside.png b/mods/artdeco/texturesx32/artdeco_2c_lside.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2c_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2c_rside.png b/mods/artdeco/texturesx32/artdeco_2c_rside.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2c_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_2d.png b/mods/artdeco/texturesx32/artdeco_2d.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_2d.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1a.png b/mods/artdeco/texturesx32/artdeco_arch1a.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1a_back.png b/mods/artdeco/texturesx32/artdeco_arch1a_back.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1a_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1a_bottom.png b/mods/artdeco/texturesx32/artdeco_arch1a_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1a_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1a_front.png b/mods/artdeco/texturesx32/artdeco_arch1a_front.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1a_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1a_lside.png b/mods/artdeco/texturesx32/artdeco_arch1a_lside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1a_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1a_rside.png b/mods/artdeco/texturesx32/artdeco_arch1a_rside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1a_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1b.png b/mods/artdeco/texturesx32/artdeco_arch1b.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1c.png b/mods/artdeco/texturesx32/artdeco_arch1c.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1c.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1d.png b/mods/artdeco/texturesx32/artdeco_arch1d.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1d.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1d_back.png b/mods/artdeco/texturesx32/artdeco_arch1d_back.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1d_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1d_bottom.png b/mods/artdeco/texturesx32/artdeco_arch1d_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1d_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1d_front.png b/mods/artdeco/texturesx32/artdeco_arch1d_front.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1d_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1d_rsidex.png b/mods/artdeco/texturesx32/artdeco_arch1d_rsidex.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1d_rsidex.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1d_side.png b/mods/artdeco/texturesx32/artdeco_arch1d_side.png new file mode 100644 index 00000000..4ad3ce43 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1d_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1e.png b/mods/artdeco/texturesx32/artdeco_arch1e.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1e.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1e_back.png b/mods/artdeco/texturesx32/artdeco_arch1e_back.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1e_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1e_bottom.png b/mods/artdeco/texturesx32/artdeco_arch1e_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1e_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1e_front.png b/mods/artdeco/texturesx32/artdeco_arch1e_front.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1e_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch1e_side.png b/mods/artdeco/texturesx32/artdeco_arch1e_side.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch1e_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_arch2a.png b/mods/artdeco/texturesx32/artdeco_arch2a.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_arch2a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin1a.png b/mods/artdeco/texturesx32/artdeco_archwin1a.png new file mode 100644 index 00000000..ffedfde6 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin1a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin1a_inv.png b/mods/artdeco/texturesx32/artdeco_archwin1a_inv.png new file mode 100644 index 00000000..296ec0a6 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin1a_inv.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin1b.png b/mods/artdeco/texturesx32/artdeco_archwin1b.png new file mode 100644 index 00000000..405e2fc5 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin1b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin1b_inv.png b/mods/artdeco/texturesx32/artdeco_archwin1b_inv.png new file mode 100644 index 00000000..7fc44ff8 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin1b_inv.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin1c.png b/mods/artdeco/texturesx32/artdeco_archwin1c.png new file mode 100644 index 00000000..e73c9480 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin1c.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin1c_inv.png b/mods/artdeco/texturesx32/artdeco_archwin1c_inv.png new file mode 100644 index 00000000..0d2b0b4f Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin1c_inv.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin2a.png b/mods/artdeco/texturesx32/artdeco_archwin2a.png new file mode 100644 index 00000000..1192c72c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin2a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin2a_inv.png b/mods/artdeco/texturesx32/artdeco_archwin2a_inv.png new file mode 100644 index 00000000..2e607513 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin2a_inv.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin2b.png b/mods/artdeco/texturesx32/artdeco_archwin2b.png new file mode 100644 index 00000000..87fd84a5 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin2b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin2b_inv.png b/mods/artdeco/texturesx32/artdeco_archwin2b_inv.png new file mode 100644 index 00000000..e0de6016 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin2b_inv.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin2c.png b/mods/artdeco/texturesx32/artdeco_archwin2c.png new file mode 100644 index 00000000..cd36c040 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin2c.png differ diff --git a/mods/artdeco/texturesx32/artdeco_archwin2c_inv.png b/mods/artdeco/texturesx32/artdeco_archwin2c_inv.png new file mode 100644 index 00000000..6fc5d798 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_archwin2c_inv.png differ diff --git a/mods/artdeco/texturesx32/artdeco_brownwalltile.png b/mods/artdeco/texturesx32/artdeco_brownwalltile.png new file mode 100644 index 00000000..d49f95df Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_brownwalltile.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1a.png b/mods/artdeco/texturesx32/artdeco_column1a.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1a_bottom.png b/mods/artdeco/texturesx32/artdeco_column1a_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1a_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1a_side.png b/mods/artdeco/texturesx32/artdeco_column1a_side.png new file mode 100644 index 00000000..9e41a07e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1a_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1b.png b/mods/artdeco/texturesx32/artdeco_column1b.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1b_bottom.png b/mods/artdeco/texturesx32/artdeco_column1b_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1b_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1b_side.png b/mods/artdeco/texturesx32/artdeco_column1b_side.png new file mode 100644 index 00000000..37d7d0cf Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1b_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1c.png b/mods/artdeco/texturesx32/artdeco_column1c.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1c.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1c_bottom.png b/mods/artdeco/texturesx32/artdeco_column1c_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1c_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1c_side.png b/mods/artdeco/texturesx32/artdeco_column1c_side.png new file mode 100644 index 00000000..f3df0671 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1c_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1d.png b/mods/artdeco/texturesx32/artdeco_column1d.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1d.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1d_bottom.png b/mods/artdeco/texturesx32/artdeco_column1d_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1d_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column1d_side.png b/mods/artdeco/texturesx32/artdeco_column1d_side.png new file mode 100644 index 00000000..a44a3a8c Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column1d_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column2a.png b/mods/artdeco/texturesx32/artdeco_column2a.png new file mode 100644 index 00000000..a10c3488 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column2a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column2a_bottom.png b/mods/artdeco/texturesx32/artdeco_column2a_bottom.png new file mode 100644 index 00000000..a10c3488 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column2a_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column2a_side-1.png b/mods/artdeco/texturesx32/artdeco_column2a_side-1.png new file mode 100644 index 00000000..a0b94c6a Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column2a_side-1.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column2b_side.png b/mods/artdeco/texturesx32/artdeco_column2b_side.png new file mode 100644 index 00000000..530f57fb Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column2b_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_column2c_side.png b/mods/artdeco/texturesx32/artdeco_column2c_side.png new file mode 100644 index 00000000..30005886 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_column2c_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarch1a.png b/mods/artdeco/texturesx32/artdeco_dblarch1a.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarch1a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarch1a_back.png b/mods/artdeco/texturesx32/artdeco_dblarch1a_back.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarch1a_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarch1a_bottom.png b/mods/artdeco/texturesx32/artdeco_dblarch1a_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarch1a_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarch1a_front.png b/mods/artdeco/texturesx32/artdeco_dblarch1a_front.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarch1a_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarch1a_lside.png b/mods/artdeco/texturesx32/artdeco_dblarch1a_lside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarch1a_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarch1a_rside.png b/mods/artdeco/texturesx32/artdeco_dblarch1a_rside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarch1a_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarch1b.png b/mods/artdeco/texturesx32/artdeco_dblarch1b.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarch1b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarchslab.png b/mods/artdeco/texturesx32/artdeco_dblarchslab.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarchslab.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarchslab_back.png b/mods/artdeco/texturesx32/artdeco_dblarchslab_back.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarchslab_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarchslab_bottom.png b/mods/artdeco/texturesx32/artdeco_dblarchslab_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarchslab_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarchslab_front.png b/mods/artdeco/texturesx32/artdeco_dblarchslab_front.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarchslab_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarchslab_lside.png b/mods/artdeco/texturesx32/artdeco_dblarchslab_lside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarchslab_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_dblarchslab_rside.png b/mods/artdeco/texturesx32/artdeco_dblarchslab_rside.png new file mode 100644 index 00000000..38436322 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_dblarchslab_rside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock1.png b/mods/artdeco/texturesx32/artdeco_decoblock1.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock1.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock1_back.png b/mods/artdeco/texturesx32/artdeco_decoblock1_back.png new file mode 100644 index 00000000..59e0da20 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock1_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock1_bottom.png b/mods/artdeco/texturesx32/artdeco_decoblock1_bottom.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock1_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock1_front.png b/mods/artdeco/texturesx32/artdeco_decoblock1_front.png new file mode 100644 index 00000000..59e0da20 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock1_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock1_side.png b/mods/artdeco/texturesx32/artdeco_decoblock1_side.png new file mode 100644 index 00000000..59e0da20 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock1_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock2(forall).png b/mods/artdeco/texturesx32/artdeco_decoblock2(forall).png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock2(forall).png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock2.png b/mods/artdeco/texturesx32/artdeco_decoblock2.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock2.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock2_bottom.png b/mods/artdeco/texturesx32/artdeco_decoblock2_bottom.png new file mode 100644 index 00000000..b0c7c860 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock2_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock2_side.png b/mods/artdeco/texturesx32/artdeco_decoblock2_side.png new file mode 100644 index 00000000..85792afd Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock2_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock3.png b/mods/artdeco/texturesx32/artdeco_decoblock3.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock3.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock3_bottom.png b/mods/artdeco/texturesx32/artdeco_decoblock3_bottom.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock3_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock3_side.png b/mods/artdeco/texturesx32/artdeco_decoblock3_side.png new file mode 100644 index 00000000..94d2dff3 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock3_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock4.png b/mods/artdeco/texturesx32/artdeco_decoblock4.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock4.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock4_bottom.png b/mods/artdeco/texturesx32/artdeco_decoblock4_bottom.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock4_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock4_side.png b/mods/artdeco/texturesx32/artdeco_decoblock4_side.png new file mode 100644 index 00000000..18d3eb88 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock4_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock5.png b/mods/artdeco/texturesx32/artdeco_decoblock5.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock5.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock5_bottom.png b/mods/artdeco/texturesx32/artdeco_decoblock5_bottom.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock5_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock5_side.png b/mods/artdeco/texturesx32/artdeco_decoblock5_side.png new file mode 100644 index 00000000..49319736 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock5_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock6.png b/mods/artdeco/texturesx32/artdeco_decoblock6.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock6.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock6_bottom.png b/mods/artdeco/texturesx32/artdeco_decoblock6_bottom.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock6_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decoblock6_side.png b/mods/artdeco/texturesx32/artdeco_decoblock6_side.png new file mode 100644 index 00000000..3aa5144e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decoblock6_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decostair1.png b/mods/artdeco/texturesx32/artdeco_decostair1.png new file mode 100644 index 00000000..b1461ca9 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decostair1.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decostair2.png b/mods/artdeco/texturesx32/artdeco_decostair2.png new file mode 100644 index 00000000..59e0da20 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decostair2.png differ diff --git a/mods/artdeco/texturesx32/artdeco_decostair3.png b/mods/artdeco/texturesx32/artdeco_decostair3.png new file mode 100644 index 00000000..3d1ad81b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_decostair3.png differ diff --git a/mods/artdeco/texturesx32/artdeco_estatedoor_bottom-flat.png b/mods/artdeco/texturesx32/artdeco_estatedoor_bottom-flat.png new file mode 100644 index 00000000..f8390b37 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_estatedoor_bottom-flat.png differ diff --git a/mods/artdeco/texturesx32/artdeco_estatedoor_bottom.png b/mods/artdeco/texturesx32/artdeco_estatedoor_bottom.png new file mode 100644 index 00000000..8efa3621 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_estatedoor_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_estatedoor_edge.png b/mods/artdeco/texturesx32/artdeco_estatedoor_edge.png new file mode 100644 index 00000000..cd72a6f0 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_estatedoor_edge.png differ diff --git a/mods/artdeco/texturesx32/artdeco_estatedoor_inv.png b/mods/artdeco/texturesx32/artdeco_estatedoor_inv.png new file mode 100644 index 00000000..482c933a Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_estatedoor_inv.png differ diff --git a/mods/artdeco/texturesx32/artdeco_estatedoor_top-flat.png b/mods/artdeco/texturesx32/artdeco_estatedoor_top-flat.png new file mode 100644 index 00000000..0a4cb3ef Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_estatedoor_top-flat.png differ diff --git a/mods/artdeco/texturesx32/artdeco_estatedoor_top.png b/mods/artdeco/texturesx32/artdeco_estatedoor_top.png new file mode 100644 index 00000000..8e5b994b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_estatedoor_top.png differ diff --git a/mods/artdeco/texturesx32/artdeco_greenwalltile.png b/mods/artdeco/texturesx32/artdeco_greenwalltile.png new file mode 100644 index 00000000..d18517fa Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_greenwalltile.png differ diff --git a/mods/artdeco/texturesx32/artdeco_irongrating.png b/mods/artdeco/texturesx32/artdeco_irongrating.png new file mode 100644 index 00000000..7440e96e Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_irongrating.png differ diff --git a/mods/artdeco/texturesx32/artdeco_italian_marble.png b/mods/artdeco/texturesx32/artdeco_italian_marble.png new file mode 100644 index 00000000..425c67ce Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_italian_marble.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lightwin1.png b/mods/artdeco/texturesx32/artdeco_lightwin1.png new file mode 100644 index 00000000..d0323dd6 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lightwin1.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lightwin2.png b/mods/artdeco/texturesx32/artdeco_lightwin2.png new file mode 100644 index 00000000..742dfa55 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lightwin2.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lightwin3.png b/mods/artdeco/texturesx32/artdeco_lightwin3.png new file mode 100644 index 00000000..1ba13983 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lightwin3.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lionheart.png b/mods/artdeco/texturesx32/artdeco_lionheart.png new file mode 100644 index 00000000..01c3b203 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lionheart.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lionheart_back.png b/mods/artdeco/texturesx32/artdeco_lionheart_back.png new file mode 100644 index 00000000..01c3b203 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lionheart_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lionheart_bottom.png b/mods/artdeco/texturesx32/artdeco_lionheart_bottom.png new file mode 100644 index 00000000..01c3b203 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lionheart_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lionheart_front.png b/mods/artdeco/texturesx32/artdeco_lionheart_front.png new file mode 100644 index 00000000..76520cc1 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lionheart_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_lionheart_side.png b/mods/artdeco/texturesx32/artdeco_lionheart_side.png new file mode 100644 index 00000000..01c3b203 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_lionheart_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_stonewall.png b/mods/artdeco/texturesx32/artdeco_stonewall.png new file mode 100644 index 00000000..3d1ad81b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_stonewall.png differ diff --git a/mods/artdeco/texturesx32/artdeco_thin_stonewall.png b/mods/artdeco/texturesx32/artdeco_thin_stonewall.png new file mode 100644 index 00000000..3d1ad81b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_thin_stonewall.png differ diff --git a/mods/artdeco/texturesx32/artdeco_thin_stonewall_corner.png b/mods/artdeco/texturesx32/artdeco_thin_stonewall_corner.png new file mode 100644 index 00000000..3d1ad81b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_thin_stonewall_corner.png differ diff --git a/mods/artdeco/texturesx32/artdeco_tile1.png b/mods/artdeco/texturesx32/artdeco_tile1.png new file mode 100644 index 00000000..6763ae6a Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_tile1.png differ diff --git a/mods/artdeco/texturesx32/artdeco_tile2.png b/mods/artdeco/texturesx32/artdeco_tile2.png new file mode 100644 index 00000000..87d97b61 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_tile2.png differ diff --git a/mods/artdeco/texturesx32/artdeco_tile3.png b/mods/artdeco/texturesx32/artdeco_tile3.png new file mode 100644 index 00000000..5af9cd2d Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_tile3.png differ diff --git a/mods/artdeco/texturesx32/artdeco_tile4.png b/mods/artdeco/texturesx32/artdeco_tile4.png new file mode 100644 index 00000000..00c9e795 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_tile4.png differ diff --git a/mods/artdeco/texturesx32/artdeco_tile5.png b/mods/artdeco/texturesx32/artdeco_tile5.png new file mode 100644 index 00000000..f3df8471 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_tile5.png differ diff --git a/mods/artdeco/texturesx32/artdeco_whitegardenstone.png b/mods/artdeco/texturesx32/artdeco_whitegardenstone.png new file mode 100644 index 00000000..12ce1dc6 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_whitegardenstone.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1a.png b/mods/artdeco/texturesx32/artdeco_wincross1a.png new file mode 100644 index 00000000..279c3ecc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1a.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1a_back.png b/mods/artdeco/texturesx32/artdeco_wincross1a_back.png new file mode 100644 index 00000000..279c3ecc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1a_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1a_bottom.png b/mods/artdeco/texturesx32/artdeco_wincross1a_bottom.png new file mode 100644 index 00000000..279c3ecc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1a_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1a_front-1.png b/mods/artdeco/texturesx32/artdeco_wincross1a_front-1.png new file mode 100644 index 00000000..186f9131 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1a_front-1.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1a_front.png b/mods/artdeco/texturesx32/artdeco_wincross1a_front.png new file mode 100644 index 00000000..696acd1b Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1a_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1a_side.png b/mods/artdeco/texturesx32/artdeco_wincross1a_side.png new file mode 100644 index 00000000..186f9131 Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1a_side.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1b.png b/mods/artdeco/texturesx32/artdeco_wincross1b.png new file mode 100644 index 00000000..279c3ecc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1b.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1b_back.png b/mods/artdeco/texturesx32/artdeco_wincross1b_back.png new file mode 100644 index 00000000..279c3ecc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1b_back.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1b_bottom.png b/mods/artdeco/texturesx32/artdeco_wincross1b_bottom.png new file mode 100644 index 00000000..279c3ecc Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1b_bottom.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1b_front.png b/mods/artdeco/texturesx32/artdeco_wincross1b_front.png new file mode 100644 index 00000000..0cae740a Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1b_front.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1b_lside.png b/mods/artdeco/texturesx32/artdeco_wincross1b_lside.png new file mode 100644 index 00000000..0cae740a Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1b_lside.png differ diff --git a/mods/artdeco/texturesx32/artdeco_wincross1b_rside.png b/mods/artdeco/texturesx32/artdeco_wincross1b_rside.png new file mode 100644 index 00000000..0cae740a Binary files /dev/null and b/mods/artdeco/texturesx32/artdeco_wincross1b_rside.png differ diff --git a/mods/artdeco/texturesx32/textures.txt b/mods/artdeco/texturesx32/textures.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mods/artdeco/texturesx32/textures.txt @@ -0,0 +1 @@ + diff --git a/mods/bridger/LICENSE b/mods/bridger/LICENSE new file mode 100644 index 00000000..64a2fed6 --- /dev/null +++ b/mods/bridger/LICENSE @@ -0,0 +1,63 @@ +LICENSE FOR CODE: +================= + + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + + +LICENSE FOR MEDIA: +================== + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ \ No newline at end of file diff --git a/mods/bridger/alias.lua b/mods/bridger/alias.lua new file mode 100644 index 00000000..89e17657 --- /dev/null +++ b/mods/bridger/alias.lua @@ -0,0 +1,74 @@ +local bridger_colors = { + "Green", + "Red", + "Steel", + "White" +} + +for _, color in pairs(bridger_colors) do + + local oldname = color + local newname = string.lower(color) + + if minetest.get_modpath("moreblocks") then + stairsplus:register_alias_all("bridges", "block_"..oldname, "bridger", "block_"..newname) + minetest.register_alias("bridges:step_"..oldname, "bridger:panel_block_"..newname) + elseif minetest.get_modpath("stairs") then + minetest.register_alias("stairs:slab_block_"..oldname, "stairs:slab_block_"..newname) + minetest.register_alias("stairs:stair_block_"..oldname, "stairs:stair_block_"..newname) + end + + local bridger_error1 = { + "step_", + "suspension_top_", + "suspension_cable_", + "deck_", + "deck_edge_", + "train_deck_", + "girder_mid_", + "girder_right_", + "truss_superstructure_right_slant_", + "truss_superstructure_left_slant_", + "small_upper_chord_", + "medium_upper_chord_", + "large_upper_chord_", + "small_support_", + "medium_support_", + "large_support_", + "truss_substructure_left_slant_", + "truss_substructure_right_slant_", + "truss_substructure_end_left_slant_", + "truss_substructure_end_right_slant_" + } + + + for _, prefix in pairs (bridger_error1) do + minetest.register_alias("bridges:"..prefix..oldname, "bridger:"..prefix..newname) + end + + local bridger_error2 = { + "truss_substructure_mid", + "truss_substructure_simple", + "truss_superstructure_end_left_slant", + "truss_superstructure_end_right_slant", + "truss_superstructure_right_slant", + "truss_superstructure_left_slant", + "truss_superstructure_mid", + "truss_superstructure_simple", + "truss_superstructure_simple_end_right" + } + + for _, prefix in pairs (bridger_error2) do + minetest.register_alias("bridges:"..prefix..oldname, "bridger:"..prefix.."_"..newname) + end + + minetest.register_alias("bridges:truss_superstructure_simple_end"..oldname, "bridger:truss_superstructure_simple_end_left_"..newname) + minetest.register_alias("bridges:girder_left_end"..oldname, "bridger:girder_left_"..newname) + +end + +minetest.register_alias("bridges:corrugated_steel", "bridger:corrugated_steel_steel") +minetest.register_alias("bridges:corrugated_steel_ceiling", "bridger:corrugated_steel_ceiling_steel") +minetest.register_alias("bridges:scaffolding", "bridger:scaffolding") +minetest.register_alias("bridges:zbridges_diagonal_steel_rod", "bridger:bridges_diagonal_steel_rod") +minetest.register_alias("bridges:zbridges_steel_rod", "bridger:bridges_steel_rod") \ No newline at end of file diff --git a/mods/bridger/crafts.lua b/mods/bridger/crafts.lua new file mode 100644 index 00000000..86aaf318 --- /dev/null +++ b/mods/bridger/crafts.lua @@ -0,0 +1,1017 @@ +minetest.register_craftitem("bridger:bridges_wooden_rod", { + description = "Wooden Rod", + inventory_image = "bridges_wooden_rod.png", +}) + +minetest.register_craft({ + output = 'default:stick', + recipe = { + {'bridger:bridges_wooden_rod'}, + } +}) + +minetest.register_craft({ + output = 'bridger:bridges_wooden_rod 3', + recipe = { + {'group:stick'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'bridger:scaffolding 2', + recipe = { + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + {'','group:stick',''}, + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + } +}) + +if minetest.settings:get_bool("bridger_enable_trusses") then + + minetest.register_craftitem("bridger:bridges_steel_rod", { + description = "Steel Rod", + inventory_image = "bridges_steel_rod.png", + }) + + minetest.register_craftitem("bridger:bridges_diagonal_steel_rod", { + description = "Steel Rod", + inventory_image = "bridges_diagonal_steel_rod.png", + }) + + minetest.register_craft({ + output = 'bridger:bridges_steel_rod 3', + recipe = { + {'default:steel_ingot'}, + } + }) + + minetest.register_craft({ + output = 'bridger:bridges_diagonal_steel_rod 3', + recipe = { + {'','','bridger:bridges_steel_rod'}, + {'','bridger:bridges_steel_rod',''}, + {'bridger:bridges_steel_rod','',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:train_deck_white', + type = 'shapeless', + recipe = {'bridger:bridges_diagonal_steel_rod','bridger:bridges_diagonal_steel_rod'}, + }) + + minetest.register_craft({ + output = 'bridger:block_white', + recipe = { + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + } + }) + + local bridge_colors = { + "green", + "red", + "steel", + "white", + } + + for c in ipairs(bridge_colors) do + local bridge_colors = bridge_colors[c] + + minetest.register_craft({ + output = 'bridger:deck_'..bridge_colors..' 8', + recipe = { + {'bridger:block_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:deck_edge_'..bridge_colors..' 14', + recipe = { + {'','bridger:block_'..bridge_colors}, + {'bridger:block_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:step_'..bridge_colors..' 12', + recipe = { + {'','bridger:block_'..bridge_colors}, + {'bridger:block_'..bridge_colors,'bridger:block_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:step_'..bridge_colors..' 12', + recipe = { + {'bridger:block_'..bridge_colors,''}, + {'bridger:block_'..bridge_colors,'bridger:block_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:block_'..bridge_colors, + recipe = { + {'bridger:step_'..bridge_colors,'bridger:step_'..bridge_colors}, + {'bridger:step_'..bridge_colors,'bridger:step_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:suspension_cable_'..bridge_colors..' 16', + recipe = { + {'bridger:block_'..bridge_colors}, + {'bridger:block_'..bridge_colors}, + {'bridger:block_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:suspension_top_'..bridge_colors..' 8', + recipe = { + {'bridger:block_'..bridge_colors,'bridger:block_'..bridge_colors,'bridger:block_'..bridge_colors}, + {'','bridger:block_'..bridge_colors,''}, + {'','bridger:block_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:girder_mid_'..bridge_colors..' 4', + recipe = { + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod','bridger:block_'..bridge_colors,'bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:girder_left_end_'..bridge_colors..' 4', + recipe = { + {'','','bridger:bridges_steel_rod'}, + {'','bridger:block_'..bridge_colors,'bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:girder_right_'..bridge_colors..' 4', + recipe = { + {'bridger:bridges_steel_rod','',''}, + {'bridger:bridges_steel_rod','bridger:block_'..bridge_colors,''}, + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:corrugated_steel_'..bridge_colors, + type = 'shapeless', + recipe = {'bridger:deck_'..bridge_colors,'default:coal_lump'}, + }) + + minetest.register_craft({ + output = 'bridger:corrugated_steel_ceiling_'..bridge_colors..' 3', + recipe = { + {'bridger:corrugated_steel'..bridge_colors,'bridger:corrugated_steel'..bridge_colors,'bridger:corrugated_steel'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_left_slant_white', + recipe = { + {'','bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod'}, + {'bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod'}, + {'bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_right_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_left_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_left_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_right_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:corrugated_steel_ceiling_'..bridge_colors..' 3', + recipe = { + {'bridger:corrugated_steel'..bridge_colors,'bridger:corrugated_steel'..bridge_colors,'bridger:corrugated_steel'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_left_slant_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_left_slant_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_right_slant_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_right_slant_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_right_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_tall_left_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_left_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_tall_right_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_up_left_slant_'..bridge_colors, + recipe = { + {'','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_left_slant_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_up_right_slant_'..bridge_colors, + recipe = { + {'','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_right_slant_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_down_left_slant_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','',''}, + {'','bridger:truss_superstructure_left_slant_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_down_right_slant_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','',''}, + {'','bridger:truss_superstructure_right_slant_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_up_right_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_up_left_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_up_left_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_up_right_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_down_right_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_down_left_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_down_left_slant_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_down_right_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_end_left_slant_white', + recipe = { + {'','','bridger:bridges_diagonal_steel_rod'}, + {'','bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod'}, + {'bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_end_right_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_end_left_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_end_left_'..bridge_colors, + recipe = { + {'bridger:truss_superstructure_end_right_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_mid_'..bridge_colors, + type = 'shapeless', + recipe = {'bridger:truss_superstructure_left_slant_'..bridge_colors,'bridger:truss_superstructure_right_slant_'..bridge_colors}, + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_mid_'..bridge_colors, + type = 'shapeless', + recipe = {'bridger:truss_superstructure_tall_left_slant_'..bridge_colors,'bridger:truss_superstructure_tall_right_slant_'..bridge_colors}, + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_mid_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_mid_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_up_mid_'..bridge_colors, + recipe = { + {'','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_mid_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_down_mid_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','',''}, + {'','bridger:truss_superstructure_mid_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_left_slant_white', + recipe = { + {'','bridger:bridges_steel_rod',''}, + {'bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod'}, + {'','bridger:bridges_steel_rod',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_right_slant_'..bridge_colors, + recipe = { + {'bridger:truss_substructure_left_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_left_slant_'..bridge_colors, + recipe = { + {'bridger:truss_substructure_right_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_end_left_slant_white', + recipe = { + {'','bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_end_right_'..bridge_colors, + recipe = { + {'bridger:truss_substructure_end_left_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_end_left_'..bridge_colors, + recipe = { + {'bridger:truss_substructure_end_right_slant_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_mid_'..bridge_colors, + type = 'shapeless', + recipe = {'bridger:truss_substructure_left_slant_'..bridge_colors,'bridger:truss_substructure_right_slant_'..bridge_colors}, + }) + + minetest.register_craft({ + output = 'bridger:truss_substructure_simple_white', + recipe = { + {'','bridger:bridges_steel_rod',''}, + {'bridger:bridges_diagonal_steel_rod','','bridger:bridges_diagonal_steel_rod'}, + {'','bridger:bridges_steel_rod',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_upper_chord_white', + recipe = { + {'','bridger:bridges_steel_rod',''}, + {'','bridger:bridges_diagonal_steel_rod',''}, + {'','bridger:bridges_steel_rod',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_upper_chord_white', + recipe = { + {'','bridger:bridges_steel_rod',''}, + {'','bridger:bridges_diagonal_steel_rod',''}, + {'','bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_upper_chord_white', + recipe = { + {'bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod',''}, + {'','bridger:bridges_diagonal_steel_rod',''}, + {'','bridger:bridges_steel_rod',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_upper_chord_slanted_'..bridge_colors, + recipe = { + {'bridger:small_upper_chord_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_upper_chord_slanted_'..bridge_colors, + recipe = { + {'bridger:medium_upper_chord_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_upper_chord_slanted_'..bridge_colors, + recipe = { + {'bridger:medium_upper_chord_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_upper_chord_'..bridge_colors, + recipe = { + {'bridger:small_upper_chord_slanted_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_upper_chord_'..bridge_colors, + recipe = { + {'bridger:medium_upper_chord_slanted_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_upper_chord_'..bridge_colors, + recipe = { + {'bridger:medium_upper_chord_slanted_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_upper_chord_white', + recipe = { + {'bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod',''}, + {'','bridger:bridges_diagonal_steel_rod',''}, + {'','bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_support_white', + recipe = { + {'bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_support_top_'..bridge_colors, + recipe = { + {'bridger:small_support_'..bridge_colors}, + {'bridger:small_support_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_support_white', + recipe = { + {'bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod'}, + {'','','bridger:bridges_diagonal_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_support_white', + recipe = { + {'bridger:bridges_diagonal_steel_rod','',''}, + {'bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:medium_support_bot_white', + recipe = { + {'bridger:bridges_steel_rod','bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_support_white', + recipe = { + {'bridger:bridges_diagonal_steel_rod','',''}, + {'bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod'}, + {'','','bridger:bridges_diagonal_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_support_bot_white', + recipe = { + {'bridger:bridges_steel_rod','','bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_simple_end_right_white', + recipe = { + {'bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod'}, + {'bridger:bridges_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_simple_end_left_white', + recipe = { + {'bridger:bridges_diagonal_steel_rod'}, + {'bridger:bridges_diagonal_steel_rod'}, + {'bridger:bridges_diagonal_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_simple_white', + recipe = { + {'bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod'}, + {'bridger:bridges_diagonal_steel_rod','','bridger:bridges_diagonal_steel_rod'}, + {'bridger:bridges_diagonal_steel_rod','bridger:bridges_steel_rod','bridger:bridges_diagonal_steel_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_simple_end_right_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod'}, + {'bridger:truss_superstructure_tall_simple_end_right_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_simple_end_left_'..bridge_colors, + recipe = { + {'bridger:bridges_diagonal_steel_rod'}, + {'bridger:truss_superstructure_tall_simple_end_left_'..bridge_colors}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_simple_'..bridge_colors, + recipe = { + {'bridger:bridges_diagonal_steel_rod','','bridger:bridges_diagonal_steel_rod'}, + {'','bridger:truss_superstructure_simple_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_tall_simple_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_simple_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_up_simple_'..bridge_colors, + recipe = { + {'','','bridger:bridges_steel_rod'}, + {'','bridger:truss_superstructure_simple_'..bridge_colors,''}, + } + }) + + minetest.register_craft({ + output = 'bridger:truss_superstructure_down_mid_'..bridge_colors, + recipe = { + {'bridger:bridges_steel_rod','',''}, + {'','bridger:truss_superstructure_simple_'..bridge_colors,''}, + } + }) + end + + local bridge_nodes = { + "block_", + "step_", + "suspension_top_", + "suspension_cable_", + "deck_", + "deck_edge_", + "train_deck_", + "girder_mid_", + "girder_right_", + "girder_left_end_", + "truss_superstructure_right_slant_", + "truss_superstructure_left_slant_", + "truss_superstructure_end_right_slant_", + "truss_superstructure_end_left_slant_", + "truss_superstructure_mid_", + "truss_superstructure_simple_", + "truss_superstructure_simple_end_left_", + "truss_superstructure_simple_end_right_", + "truss_superstructure_tall_right_slant_", + "truss_superstructure_tall_left_slant_", + "truss_superstructure_tall_end_right_slant_", + "truss_superstructure_tall_end_left_slant_", + "truss_superstructure_tall_mid_", + "truss_superstructure_tall_simple_", + "truss_superstructure_tall_simple_end_left_", + "truss_superstructure_tall_simple_end_right_", + "truss_superstructure_up_right_slant_", + "truss_superstructure_up_left_slant_", + "truss_superstructure_up_mid_", + "truss_superstructure_up_simple_", + "truss_superstructure_down_right_slant_", + "truss_superstructure_down_left_slant_", + "truss_superstructure_down_mid_", + "truss_superstructure_down_simple_", + "truss_substructure_end_right_slant_", + "truss_substructure_end_left_slant_", + "truss_substructure_right_slant_", + "truss_substructure_left_slant_", + "truss_substructure_simple_", + "truss_substructure_mid_", + "truss_substructure_mid_simple_", + "small_upper_chord_", + "medium_upper_chord_", + "large_upper_chord_", + "small_upper_chord_slanted", + "medium_upper_chord_slanted", + "large_upper_chord_slanted", + "small_support_", + "small_support_top", + "medium_support_", + "large_support_", + "medium_support_bot", + "large_support_bot", + "corrugated_steel_", + "corrugated_steel_ceiling_", + } + + for c in ipairs(bridge_nodes) do + local bridge_nodes = bridge_nodes[c] + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'white', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'yellow','dye:white'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'white', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'steel','dye:white'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'white', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'green','dye:white'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'white', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'red','dye:white'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'red', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'white','dye:red'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'red', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'steel','dye:red'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'red', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'green','dye:red'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'red', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'yellow','dye:red'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'green', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'white','dye:green'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'green', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'steel','dye:green'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'green', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'yellow','dye:green'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'green', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'red','dye:green'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'white','dye:black'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'yellow','dye:black'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'green','dye:black'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'red','dye:black'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'white','dye:dark_grey'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'yellow','dye:dark_grey'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'green','dye:dark_grey'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'steel', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'red','dye:dark_grey'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'yellow', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'white','dye:yellow'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'yellow', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'steel','dye:yellow'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'yellow', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'green','dye:yellow'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'yellow', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'red','dye:yellow'}, + }) + + minetest.register_craft({ + output = 'bridger:'..bridge_nodes..'red', + type = 'shapeless', + recipe = {'bridger:'..bridge_nodes..'yellow','dye:red'}, + }) + end +end + +if minetest.settings:get_bool("bridger_enable_trestles") then + minetest.register_craft({ + output = 'bridger:trestle_support_small', + recipe = { + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:trestle_support_small', + recipe = { + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','group:stick','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:trestle_deck', + recipe = { + {'bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:trestle_side', + recipe = { + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'','group:stick',''}, + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:trestle_substructure_small', + recipe = { + {'group:stick','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'','group:stick','bridger:bridges_wooden_rod'}, + {'','','group:stick'}, + } + }) + + minetest.register_craft({ + output = 'bridger:trestle_substructure_large', + recipe = { + {'group:stick','','bridger:bridges_wooden_rod'}, + {'group:stick','group:stick','bridger:bridges_wooden_rod'}, + {'','group:stick','group:stick'}, + } + }) + + minetest.register_craft({ + output = 'bridger:lattice_truss', + recipe = { + {'group:stick','','group:stick'}, + {'','bridger:bridges_wooden_rod',''}, + {'group:stick','','group:stick'}, + } + }) + + minetest.register_craft({ + output = 'bridger:deck_wood', + recipe = { + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + } + }) +end + +if minetest.settings:get_bool("bridger_enable_wooden_bridges") then + minetest.register_craft({ + output = 'bridger:small_beam', + recipe = { + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'','group:wood',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_beam_mid', + recipe = { + {'','bridger:bridges_wooden_rod',''}, + {'','group:wood',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_beam_end', + recipe = { + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + {'','group:wood',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_beam_3', + recipe = { + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + {'','group:wood',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_beam_4', + recipe = { + {'bridger:bridges_wooden_rod','','bridger:bridges_wooden_rod'}, + {'','',''}, + {'','group:wood',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_beam_stair', + recipe = { + {'','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','','group:wood'}, + {'bridger:bridges_wooden_rod','group:wood',''}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_beam', + recipe = { + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','group:wood','bridger:bridges_wooden_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_fancy_beam', + recipe = { + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','group:wood','bridger:bridges_wooden_rod'}, + {'bridger:bridges_wooden_rod','bridger:bridges_wooden_rod','bridger:bridges_wooden_rod'}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_beam_swivel_normal', + recipe = { + {'bridger:large_beam'}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_beam', + recipe = { + {'bridger:large_beam_swivel_normal'}, + } + }) + + minetest.register_craft({ + output = 'bridger:large_drawbridge_normal', + recipe = { + {'bridger:small_beam','bridger:small_beam'}, + } + }) + + minetest.register_craft({ + output = 'bridger:small_beam 2', + recipe = { + {'bridger:large_drawbridge_normal'}, + } + }) + + minetest.register_craft({ + output = 'bridger:foundation 3', + recipe = { + {'','default:clay',''}, + {'default:clay','default:clay','default:clay'}, + } + }) +end \ No newline at end of file diff --git a/mods/bridger/depends.txt b/mods/bridger/depends.txt new file mode 100644 index 00000000..3adffd5b --- /dev/null +++ b/mods/bridger/depends.txt @@ -0,0 +1,4 @@ +default +stairs? +moreblocks? +mesecons? \ No newline at end of file diff --git a/mods/bridger/description.txt b/mods/bridger/description.txt new file mode 100644 index 00000000..4b827bae --- /dev/null +++ b/mods/bridger/description.txt @@ -0,0 +1 @@ +A mod that adds various bridge nodes to Minetest. \ No newline at end of file diff --git a/mods/bridger/init.lua b/mods/bridger/init.lua new file mode 100644 index 00000000..0cc38830 --- /dev/null +++ b/mods/bridger/init.lua @@ -0,0 +1,20 @@ +minetest.register_node("bridger:scaffolding", { + description = "Scaffolding", + drawtype = "glasslike_framed_optional", + tiles = {"bridges_scaffolding.png", "bridges_scaffolding_detail.png"}, + paramtype = "light", + paramtype2 = "glasslikeliquidlevel", + sunlight_propagates = true, + walkable = false, + climbable = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3, dig_immediate = 3}, + sounds = default.node_sound_wood_defaults(), +}) + + +dofile(minetest.get_modpath("bridger").."/nodes.lua") +dofile(minetest.get_modpath("bridger").."/crafts.lua") + +if minetest.settings:get_bool("Bridger_enable_alias") then + dofile(minetest.get_modpath("bridger").."/alias.lua") +end \ No newline at end of file diff --git a/mods/bridger/mod.conf b/mods/bridger/mod.conf new file mode 100644 index 00000000..2de2cde5 --- /dev/null +++ b/mods/bridger/mod.conf @@ -0,0 +1 @@ +name = bridger \ No newline at end of file diff --git a/mods/bridger/nodes.lua b/mods/bridger/nodes.lua new file mode 100644 index 00000000..418ea0be --- /dev/null +++ b/mods/bridger/nodes.lua @@ -0,0 +1,4810 @@ +local function rotate_and_place(itemstack, placer, pointed_thing) + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos)) + end + + local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing) + local fpos = finepos.y % 1 + + if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) + or (fpos < -0.5 and fpos > -0.999999999) then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + return minetest.item_place(itemstack, placer, pointed_thing, param2) +end + +if not minetest.settings:get_bool("bridger_disable_trusses") then + + local bridge_colors = { + {"Green", "green"}, + {"Red", "red"}, + {"Steel", "steel"}, + {"White", "white"}, + {"Yellow", "yellow"}, + } + + for _, row in ipairs(bridge_colors) do + local bridge_desc = row[1] + local bridge_colors = row[2] + + minetest.register_node("bridger:foundation", { + description = "Bridge Foundation", + drawtype = "nodebox", + tiles = {"default_clay.png"}, + paramtype = "light", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.75, 0.5, 0.501, 0.75}, -- NodeBox1 + {-0.501, -0.5, -0.501, 0.501, 0.6876, 0.501}, -- NodeBox2 + {-0.75, -0.5, -0.5, 0.75, 0.501, 0.5}, -- NodeBox3 + {-0.75, -0.5, -0.75, 0.75, 0.499, 0.75}, -- NodeBox4 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_node("bridger:block_"..bridge_colors, { + description = bridge_desc.." Block", + drawtype = "normal", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + if minetest.get_modpath("moreblocks") then + stairsplus:register_all("bridger", "block_"..bridge_colors, "bridger:block_"..bridge_colors, { + description = bridge_desc, + tiles = {"bridges_"..bridge_colors..".png"}, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_alias("bridger:step_"..bridge_colors, "bridger:panel_block_"..bridge_colors) + elseif minetest.get_modpath("stairs") then + stairs.register_stair_and_slab( + "block_"..bridge_colors, + "bridger:block_"..bridge_colors, + {cracky=3}, + {"bridges_"..bridge_colors..".png"}, + bridge_desc.." Stair", + bridge_desc.." Slab", + default.node_sound_metal_defaults() + ) + + minetest.register_node("bridger:step_"..bridge_colors, { + description = bridge_desc.." Step", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.5, 0, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + end + + minetest.register_node("bridger:suspension_top_"..bridge_colors, { + description = bridge_desc.." Cable Top", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + return rotate_and_place(itemstack, placer, pointed_thing) + end, + }) + + minetest.register_node("bridger:suspension_cable_"..bridge_colors, { + description = bridge_desc.." Cable", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:deck_"..bridge_colors, { + description = bridge_desc.." Deck", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.375, -0.5, 0.5, 0.501, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:deck_edge_"..bridge_colors, { + description = bridge_desc.." Deck Edge", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.375, -0.5, 0.5, 0.501, 0.5}, + {-0.5, 0.375, -0.5, 0.5, 1.0625, -0.625}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:train_deck_"..bridge_colors, { + description = bridge_desc.." Train Deck", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {0.375, 0.375, 0.375, 0.5, 0.501, 0.5}, -- NodeBox1 + {0.3125, 0.375, 0.3125, 0.4375, 0.501, 0.4375}, -- NodeBox2 + {0.25, 0.375, 0.25, 0.375, 0.501, 0.375}, -- NodeBox3 + {0.1875, 0.375, 0.1875, 0.3125, 0.501, 0.3125}, -- NodeBox4 + {0.125, 0.375, 0.125, 0.25, 0.501, 0.25}, -- NodeBox5 + {0.0625, 0.375, 0.0625, 0.1875, 0.501, 0.1875}, -- NodeBox6 + {0, 0.375, 0, 0.125, 0.501, 0.125}, -- NodeBox7 + {-0.0625, 0.375, -0.0625, 0.0625, 0.501, 0.0625}, -- NodeBox8 + {-0.125, 0.375, -0.125, 0, 0.501, 0}, -- NodeBox9 + {-0.1875, 0.375, -0.1875, -0.0625, 0.501, -0.0625}, -- NodeBox10 + {-0.25, 0.375, -0.25, -0.125, 0.501, -0.125}, -- NodeBox11 + {-0.3125, 0.375, -0.3125, -0.1875, 0.501, -0.1875}, -- NodeBox12 + {-0.4375, 0.375, -0.4375, -0.3125, 0.501, -0.3125}, -- NodeBox13 + {-0.375, 0.375, -0.375, -0.25, 0.501, -0.25}, -- NodeBox14 + {-0.5, 0.375, -0.5, -0.375, 0.501, -0.375}, -- NodeBox15 + {-0.5, 0.375, 0.375, -0.375, 0.501, 0.5}, -- NodeBox16 + {-0.4375, 0.375, 0.3125, -0.3125, 0.501, 0.4375}, -- NodeBox17 + {-0.375, 0.375, 0.25, -0.25, 0.501, 0.375}, -- NodeBox18 + {-0.3125, 0.375, 0.1875, -0.1875, 0.501, 0.3125}, -- NodeBox19 + {-0.25, 0.375, 0.125, -0.125, 0.501, 0.25}, -- NodeBox20 + {-0.1875, 0.375, 0.0625, -0.0625, 0.501, 0.1875}, -- NodeBox21 + {-0.125, 0.375, 0, 0, 0.501, 0.125}, -- NodeBox22 + {0, 0.375, -0.125, 0.125, 0.501, 0}, -- NodeBox23 + {0.0625, 0.375, -0.1875, 0.1875, 0.501, -0.0625}, -- NodeBox24 + {0.125, 0.375, -0.25, 0.25, 0.501, -0.125}, -- NodeBox25 + {0.1875, 0.375, -0.3125, 0.3125, 0.501, -0.1875}, -- NodeBox26 + {0.25, 0.375, -0.375, 0.375, 0.501, -0.25}, -- NodeBox27 + {0.3125, 0.375, -0.4375, 0.4375, 0.501, -0.3125}, -- NodeBox28 + {0.375, 0.375, -0.5, 0.5, 0.501, -0.375}, -- NodeBox29 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:girder_mid_"..bridge_colors, { + description = bridge_desc.." Girder Middle", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.4375, 0.5, 0.5, 0.5}, -- NodeBox194 + {-0.5, 0.4375, 0.375, 0.5, 0.5, 0.5}, -- NodeBox195 + {0.46875, -0.5, 0.375, 0.5, 0.5, 0.5}, -- NodeBox196 + {-0.5, -0.5, 0.375, -0.46875, 0.5, 0.5}, -- NodeBox197 + {-0.5, -0.5, 0.375, 0.5, -0.4375, 0.5}, -- NodeBox198 + {-0.5, -0.625, 0.4375, 0.5, -0.5, 0.5}, -- NodeBox213 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:girder_right_"..bridge_colors, { + description = bridge_desc.." Girder Right End", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.4375, 0.375, -0.25, 0.5, 0.5}, -- NodeBox195 + {-0.5, -0.5, 0.375, -0.46875, 0.5, 0.5}, -- NodeBox197 + {-0.5, -0.5, 0.375, 0.5, -0.4375, 0.5}, -- NodeBox198 + {-0.3125, 0.375, 0.375, -0.0625, 0.4375, 0.5}, -- NodeBox199 + {-0.125, 0.3125, 0.375, 0.0625, 0.375, 0.5}, -- NodeBox200 + {0, 0.25, 0.375, 0.125, 0.3125, 0.5}, -- NodeBox201 + {0.4375, -0.5, 0.375, 0.5, -0.25, 0.5}, -- NodeBox202 + {0.375, -0.3125, 0.375, 0.4375, -0.0625, 0.5}, -- NodeBox203 + {0.3125, -0.125, 0.375, 0.375, 0.0625, 0.5}, -- NodeBox204 + {0.25, 0, 0.375, 0.3125, 0.125, 0.5}, -- NodeBox205 + {0.1875, 0.0625, 0.375, 0.25, 0.1875, 0.5}, -- NodeBox206 + {0.125, 0.125, 0.375, 0.1875, 0.25, 0.5}, -- NodeBox207 + {0.0625, 0.1875, 0.375, 0.1875, 0.25, 0.5}, -- NodeBox208 + {-0.5, -0.5, 0.4375, -0.0625, 0.4375, 0.5}, -- NodeBox209 + {-0.5, -0.5, 0.4375, 0.4375, -0.0625, 0.5}, -- NodeBox210 + {-0.5, -0.5, 0.4375, 0.125, 0.3125, 0.5}, -- NodeBox211 + {-0.5, -0.5, 0.4375, 0.3125, 0.125, 0.5}, -- NodeBox212 + {-0.5, -0.625, 0.4375, 0.5, -0.5, 0.5}, -- NodeBox213 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:girder_left_"..bridge_colors, { + description = bridge_desc.." Girder Left End", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {0.25, 0.4375, 0.375, 0.5, 0.5, 0.5}, -- NodeBox195 + {0.46875, -0.5, 0.375, 0.5, 0.5, 0.5}, -- NodeBox197 + {-0.5, -0.5, 0.375, 0.5, -0.4375, 0.5}, -- NodeBox198 + {0.0625, 0.375, 0.375, 0.3125, 0.4375, 0.5}, -- NodeBox199 + {-0.0625, 0.3125, 0.375, 0.125, 0.375, 0.5}, -- NodeBox200 + {-0.125, 0.25, 0.375, -0, 0.3125, 0.5}, -- NodeBox201 + {-0.5, -0.5, 0.375, -0.4375, -0.25, 0.5}, -- NodeBox202 + {-0.4375, -0.3125, 0.375, -0.375, -0.0625, 0.5}, -- NodeBox203 + {-0.375, -0.125, 0.375, -0.3125, 0.0625, 0.5}, -- NodeBox204 + {-0.3125, 0, 0.375, -0.25, 0.125, 0.5}, -- NodeBox205 + {-0.25, 0.0625, 0.375, -0.1875, 0.1875, 0.5}, -- NodeBox206 + {-0.1875, 0.125, 0.375, -0.125, 0.25, 0.5}, -- NodeBox207 + {-0.1875, 0.1875, 0.375, -0.0625, 0.25, 0.5}, -- NodeBox208 + {0.0625, -0.5, 0.4375, 0.5, 0.4375, 0.5}, -- NodeBox209 + {-0.4375, -0.5, 0.4375, 0.5, -0.0625, 0.5}, -- NodeBox210 + {-0.125, -0.5, 0.4375, 0.5, 0.3125, 0.5}, -- NodeBox211 + {-0.3125, -0.5, 0.4375, 0.5, 0.125, 0.5}, -- NodeBox212 + {-0.5, -0.625, 0.4375, 0.5, -0.5, 0.5}, -- NodeBox213 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_right_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox215 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox217 + {-0.5, 2.375, 0.375, 1.5, 2.5, 0.5}, -- NodeBox218 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_left_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox215 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox217 + {-0.5, 2.375, 0.375, 1.5, 2.5, 0.5}, -- NodeBox218 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_end_right_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure End Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_end_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox215 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_end_left_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure End Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_end_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox217 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_mid_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Middle", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_mid.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_mid.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox215 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox217 + {-0.5, 2.375, 0.375, 1.5, 2.5, 0.5}, -- NodeBox218 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_tall_right_slant_"..bridge_colors, { + description = bridge_desc.." Tall Truss Superstructure Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {-0.5, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 3.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 3.5, 0.5}, -- NodeBox4 + {-0.4375, 3.25, 0.375, -0.3125, 3.375, 0.5}, -- NodeBox5 + {-0.375, 3.125, 0.375, -0.25, 3.3125, 0.5}, -- NodeBox6 + {-0.3125, 3, 0.375, -0.1875, 3.1875, 0.5}, -- NodeBox7 + {-0.25, 2.875, 0.375, -0.125, 3.0625, 0.5}, -- NodeBox8 + {-0.1875, 2.75, 0.375, -0.0625, 2.9375, 0.5}, -- NodeBox9 + {-0.125, 2.625, 0.375, 1.11759e-008, 2.8125, 0.5}, -- NodeBox10 + {-0.0625, 2.5625, 0.375, 0.0625, 2.6875, 0.5}, -- NodeBox11 + {0, 2.4375, 0.375, 0.125, 2.625, 0.5}, -- NodeBox12 + {0.0625, 2.3125, 0.375, 0.1875, 2.5, 0.5}, -- NodeBox13 + {0.125, 2.1875, 0.375, 0.25, 2.375, 0.5}, -- NodeBox14 + {0.1875, 2.0625, 0.375, 0.3125, 2.25, 0.5}, -- NodeBox15 + {0.25, 2, 0.375, 0.375, 2.125, 0.5}, -- NodeBox16 + {0.3125, 1.875, 0.375, 0.4375, 2.0625, 0.5}, -- NodeBox17 + {0.375, 1.75, 0.375, 0.5, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.5, 1.5, 0.375, 0.625, 1.6875, 0.5}, -- NodeBox20 + {0.5625, 1.375, 0.375, 0.6875, 1.5625, 0.5}, -- NodeBox21 + {0.625, 1.3125, 0.375, 0.75, 1.4375, 0.5}, -- NodeBox22 + {0.6875, 1.1875, 0.375, 0.8125, 1.375, 0.5}, -- NodeBox23 + {0.75, 1.0625, 0.375, 0.875, 1.25, 0.5}, -- NodeBox24 + {0.8125, 0.9375, 0.375, 0.9375, 1.125, 0.5}, -- NodeBox25 + {0.875, 0.8125, 0.375, 1, 1, 0.5}, -- NodeBox26 + {0.9375, 0.75, 0.375, 1.0625, 0.875, 0.5}, -- NodeBox27 + {1, 0.625, 0.375, 1.125, 0.8125, 0.5}, -- NodeBox28 + {1.0625, 0.5, 0.375, 1.1875, 0.6875, 0.5}, -- NodeBox29 + {1.125, 0.375, 0.375, 1.25, 0.5625, 0.5}, -- NodeBox30 + {1.1875, 0.25, 0.375, 1.3125, 0.4375, 0.5}, -- NodeBox31 + {1.25, 0.125, 0.375, 1.375, 0.3125, 0.5}, -- NodeBox32 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox33 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_tall_left_slant_"..bridge_colors, { + description = bridge_desc.." Tall Truss Superstructure Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {-0.5, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 3.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 3.5, 0.5}, -- NodeBox4 + {1.3125, 3.25, 0.375, 1.4375, 3.375, 0.5}, -- NodeBox5 + {1.25, 3.125, 0.375, 1.375, 3.3125, 0.5}, -- NodeBox6 + {1.1875, 3, 0.375, 1.3125, 3.1875, 0.5}, -- NodeBox7 + {1.125, 2.875, 0.375, 1.25, 3.0625, 0.5}, -- NodeBox8 + {1.0625, 2.75, 0.375, 1.1875, 2.9375, 0.5}, -- NodeBox9 + {1, 2.625, 0.375, 1.125, 2.8125, 0.5}, -- NodeBox10 + {0.9375, 2.5625, 0.375, 1.0625, 2.6875, 0.5}, -- NodeBox11 + {0.875, 2.4375, 0.375, 1, 2.625, 0.5}, -- NodeBox12 + {0.8125, 2.3125, 0.375, 0.9375, 2.5, 0.5}, -- NodeBox13 + {0.75, 2.1875, 0.375, 0.875, 2.375, 0.5}, -- NodeBox14 + {0.6875, 2.0625, 0.375, 0.8125, 2.25, 0.5}, -- NodeBox15 + {0.625, 2, 0.375, 0.75, 2.125, 0.5}, -- NodeBox16 + {0.5625, 1.875, 0.375, 0.6875, 2.0625, 0.5}, -- NodeBox17 + {0.5, 1.75, 0.375, 0.625, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.375, 1.5, 0.375, 0.5, 1.6875, 0.5}, -- NodeBox20 + {0.3125, 1.375, 0.375, 0.4375, 1.5625, 0.5}, -- NodeBox21 + {0.25, 1.3125, 0.375, 0.375, 1.4375, 0.5}, -- NodeBox22 + {0.1875, 1.1875, 0.375, 0.3125, 1.375, 0.5}, -- NodeBox23 + {0.125, 1.0625, 0.375, 0.25, 1.25, 0.5}, -- NodeBox24 + {0.0625, 0.9375, 0.375, 0.1875, 1.125, 0.5}, -- NodeBox25 + {0, 0.8125, 0.375, 0.125, 1, 0.5}, -- NodeBox26 + {-0.0625, 0.75, 0.375, 0.0625, 0.875, 0.5}, -- NodeBox27 + {-0.125, 0.625, 0.375, -3.35276e-008, 0.8125, 0.5}, -- NodeBox28 + {-0.1875, 0.5, 0.375, -0.0625, 0.6875, 0.5}, -- NodeBox29 + {-0.25, 0.375, 0.375, -0.125, 0.5625, 0.5}, -- NodeBox30 + {-0.3125, 0.25, 0.375, -0.1875, 0.4375, 0.5}, -- NodeBox31 + {-0.375, 0.125, 0.375, -0.25, 0.3125, 0.5}, -- NodeBox32 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox33 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_tall_mid_"..bridge_colors, { + description = bridge_desc.." Tall Truss Superstructure Middle", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_mid.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {-0.5, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 3.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 3.5, 0.5}, -- NodeBox4 + {1.3125, 3.25, 0.375, 1.4375, 3.375, 0.5}, -- NodeBox5 + {1.25, 3.125, 0.375, 1.375, 3.3125, 0.5}, -- NodeBox6 + {1.1875, 3, 0.375, 1.3125, 3.1875, 0.5}, -- NodeBox7 + {1.125, 2.875, 0.375, 1.25, 3.0625, 0.5}, -- NodeBox8 + {1.0625, 2.75, 0.375, 1.1875, 2.9375, 0.5}, -- NodeBox9 + {1, 2.625, 0.375, 1.125, 2.8125, 0.5}, -- NodeBox10 + {0.9375, 2.5625, 0.375, 1.0625, 2.6875, 0.5}, -- NodeBox11 + {0.875, 2.4375, 0.375, 1, 2.625, 0.5}, -- NodeBox12 + {0.8125, 2.3125, 0.375, 0.9375, 2.5, 0.5}, -- NodeBox13 + {0.75, 2.1875, 0.375, 0.875, 2.375, 0.5}, -- NodeBox14 + {0.6875, 2.0625, 0.375, 0.8125, 2.25, 0.5}, -- NodeBox15 + {0.625, 2, 0.375, 0.75, 2.125, 0.5}, -- NodeBox16 + {0.5625, 1.875, 0.375, 0.6875, 2.0625, 0.5}, -- NodeBox17 + {0.5, 1.75, 0.375, 0.625, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.375, 1.5, 0.375, 0.5, 1.6875, 0.5}, -- NodeBox20 + {0.3125, 1.375, 0.375, 0.4375, 1.5625, 0.5}, -- NodeBox21 + {0.25, 1.3125, 0.375, 0.375, 1.4375, 0.5}, -- NodeBox22 + {0.1875, 1.1875, 0.375, 0.3125, 1.375, 0.5}, -- NodeBox23 + {0.125, 1.0625, 0.375, 0.25, 1.25, 0.5}, -- NodeBox24 + {0.0625, 0.9375, 0.375, 0.1875, 1.125, 0.5}, -- NodeBox25 + {0, 0.8125, 0.375, 0.125, 1, 0.5}, -- NodeBox26 + {-0.0625, 0.75, 0.375, 0.0625, 0.875, 0.5}, -- NodeBox27 + {-0.125, 0.625, 0.375, -3.35276e-008, 0.8125, 0.5}, -- NodeBox28 + {-0.1875, 0.5, 0.375, -0.0625, 0.6875, 0.5}, -- NodeBox29 + {-0.25, 0.375, 0.375, -0.125, 0.5625, 0.5}, -- NodeBox30 + {-0.3125, 0.25, 0.375, -0.1875, 0.4375, 0.5}, -- NodeBox31 + {-0.375, 0.125, 0.375, -0.25, 0.3125, 0.5}, -- NodeBox32 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox33 + {-0.4375, 3.25, 0.375, -0.3125, 3.375, 0.5}, -- NodeBox5 + {-0.375, 3.125, 0.375, -0.25, 3.3125, 0.5}, -- NodeBox6 + {-0.3125, 3, 0.375, -0.1875, 3.1875, 0.5}, -- NodeBox7 + {-0.25, 2.875, 0.375, -0.125, 3.0625, 0.5}, -- NodeBox8 + {-0.1875, 2.75, 0.375, -0.0625, 2.9375, 0.5}, -- NodeBox9 + {-0.125, 2.625, 0.375, 1.11759e-008, 2.8125, 0.5}, -- NodeBox10 + {-0.0625, 2.5625, 0.375, 0.0625, 2.6875, 0.5}, -- NodeBox11 + {0, 2.4375, 0.375, 0.125, 2.625, 0.5}, -- NodeBox12 + {0.0625, 2.3125, 0.375, 0.1875, 2.5, 0.5}, -- NodeBox13 + {0.125, 2.1875, 0.375, 0.25, 2.375, 0.5}, -- NodeBox14 + {0.1875, 2.0625, 0.375, 0.3125, 2.25, 0.5}, -- NodeBox15 + {0.25, 2, 0.375, 0.375, 2.125, 0.5}, -- NodeBox16 + {0.3125, 1.875, 0.375, 0.4375, 2.0625, 0.5}, -- NodeBox17 + {0.375, 1.75, 0.375, 0.5, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.5, 1.5, 0.375, 0.625, 1.6875, 0.5}, -- NodeBox20 + {0.5625, 1.375, 0.375, 0.6875, 1.5625, 0.5}, -- NodeBox21 + {0.625, 1.3125, 0.375, 0.75, 1.4375, 0.5}, -- NodeBox22 + {0.6875, 1.1875, 0.375, 0.8125, 1.375, 0.5}, -- NodeBox23 + {0.75, 1.0625, 0.375, 0.875, 1.25, 0.5}, -- NodeBox24 + {0.8125, 0.9375, 0.375, 0.9375, 1.125, 0.5}, -- NodeBox25 + {0.875, 0.8125, 0.375, 1, 1, 0.5}, -- NodeBox26 + {0.9375, 0.75, 0.375, 1.0625, 0.875, 0.5}, -- NodeBox27 + {1, 0.625, 0.375, 1.125, 0.8125, 0.5}, -- NodeBox28 + {1.0625, 0.5, 0.375, 1.1875, 0.6875, 0.5}, -- NodeBox29 + {1.125, 0.375, 0.375, 1.25, 0.5625, 0.5}, -- NodeBox30 + {1.1875, 0.25, 0.375, 1.3125, 0.4375, 0.5}, -- NodeBox31 + {1.25, 0.125, 0.375, 1.375, 0.3125, 0.5}, -- NodeBox32 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox33 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_tall_simple_"..bridge_colors, { + description = bridge_desc.." Tall Truss Superstructure Middle Simple", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_simple.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {-0.5, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {1.3125, 3.25, 0.375, 1.4375, 3.375, 0.5}, -- NodeBox5 + {1.25, 3.125, 0.375, 1.375, 3.3125, 0.5}, -- NodeBox6 + {1.1875, 3, 0.375, 1.3125, 3.1875, 0.5}, -- NodeBox7 + {1.125, 2.875, 0.375, 1.25, 3.0625, 0.5}, -- NodeBox8 + {1.0625, 2.75, 0.375, 1.1875, 2.9375, 0.5}, -- NodeBox9 + {1, 2.625, 0.375, 1.125, 2.8125, 0.5}, -- NodeBox10 + {0.9375, 2.5625, 0.375, 1.0625, 2.6875, 0.5}, -- NodeBox11 + {0.875, 2.4375, 0.375, 1, 2.625, 0.5}, -- NodeBox12 + {0.8125, 2.3125, 0.375, 0.9375, 2.5, 0.5}, -- NodeBox13 + {0.75, 2.1875, 0.375, 0.875, 2.375, 0.5}, -- NodeBox14 + {0.6875, 2.0625, 0.375, 0.8125, 2.25, 0.5}, -- NodeBox15 + {0.625, 2, 0.375, 0.75, 2.125, 0.5}, -- NodeBox16 + {0.5625, 1.875, 0.375, 0.6875, 2.0625, 0.5}, -- NodeBox17 + {0.5, 1.75, 0.375, 0.625, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.375, 1.5, 0.375, 0.5, 1.6875, 0.5}, -- NodeBox20 + {0.3125, 1.375, 0.375, 0.4375, 1.5625, 0.5}, -- NodeBox21 + {0.25, 1.3125, 0.375, 0.375, 1.4375, 0.5}, -- NodeBox22 + {0.1875, 1.1875, 0.375, 0.3125, 1.375, 0.5}, -- NodeBox23 + {0.125, 1.0625, 0.375, 0.25, 1.25, 0.5}, -- NodeBox24 + {0.0625, 0.9375, 0.375, 0.1875, 1.125, 0.5}, -- NodeBox25 + {0, 0.8125, 0.375, 0.125, 1, 0.5}, -- NodeBox26 + {-0.0625, 0.75, 0.375, 0.0625, 0.875, 0.5}, -- NodeBox27 + {-0.125, 0.625, 0.375, -3.35276e-008, 0.8125, 0.5}, -- NodeBox28 + {-0.1875, 0.5, 0.375, -0.0625, 0.6875, 0.5}, -- NodeBox29 + {-0.25, 0.375, 0.375, -0.125, 0.5625, 0.5}, -- NodeBox30 + {-0.3125, 0.25, 0.375, -0.1875, 0.4375, 0.5}, -- NodeBox31 + {-0.375, 0.125, 0.375, -0.25, 0.3125, 0.5}, -- NodeBox32 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox33 + {-0.4375, 3.25, 0.375, -0.3125, 3.375, 0.5}, -- NodeBox5 + {-0.375, 3.125, 0.375, -0.25, 3.3125, 0.5}, -- NodeBox6 + {-0.3125, 3, 0.375, -0.1875, 3.1875, 0.5}, -- NodeBox7 + {-0.25, 2.875, 0.375, -0.125, 3.0625, 0.5}, -- NodeBox8 + {-0.1875, 2.75, 0.375, -0.0625, 2.9375, 0.5}, -- NodeBox9 + {-0.125, 2.625, 0.375, 1.11759e-008, 2.8125, 0.5}, -- NodeBox10 + {-0.0625, 2.5625, 0.375, 0.0625, 2.6875, 0.5}, -- NodeBox11 + {0, 2.4375, 0.375, 0.125, 2.625, 0.5}, -- NodeBox12 + {0.0625, 2.3125, 0.375, 0.1875, 2.5, 0.5}, -- NodeBox13 + {0.125, 2.1875, 0.375, 0.25, 2.375, 0.5}, -- NodeBox14 + {0.1875, 2.0625, 0.375, 0.3125, 2.25, 0.5}, -- NodeBox15 + {0.25, 2, 0.375, 0.375, 2.125, 0.5}, -- NodeBox16 + {0.3125, 1.875, 0.375, 0.4375, 2.0625, 0.5}, -- NodeBox17 + {0.375, 1.75, 0.375, 0.5, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.5, 1.5, 0.375, 0.625, 1.6875, 0.5}, -- NodeBox20 + {0.5625, 1.375, 0.375, 0.6875, 1.5625, 0.5}, -- NodeBox21 + {0.625, 1.3125, 0.375, 0.75, 1.4375, 0.5}, -- NodeBox22 + {0.6875, 1.1875, 0.375, 0.8125, 1.375, 0.5}, -- NodeBox23 + {0.75, 1.0625, 0.375, 0.875, 1.25, 0.5}, -- NodeBox24 + {0.8125, 0.9375, 0.375, 0.9375, 1.125, 0.5}, -- NodeBox25 + {0.875, 0.8125, 0.375, 1, 1, 0.5}, -- NodeBox26 + {0.9375, 0.75, 0.375, 1.0625, 0.875, 0.5}, -- NodeBox27 + {1, 0.625, 0.375, 1.125, 0.8125, 0.5}, -- NodeBox28 + {1.0625, 0.5, 0.375, 1.1875, 0.6875, 0.5}, -- NodeBox29 + {1.125, 0.375, 0.375, 1.25, 0.5625, 0.5}, -- NodeBox30 + {1.1875, 0.25, 0.375, 1.3125, 0.4375, 0.5}, -- NodeBox31 + {1.25, 0.125, 0.375, 1.375, 0.3125, 0.5}, -- NodeBox32 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox33 + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_tall_simple_end_left_"..bridge_colors, { + description = bridge_desc.." Tall Truss Superstructure Simple Left End", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_simple_end_left.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {0.375, -0.5, 0.375, 0.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_tall_simple_end_right_"..bridge_colors, { + description = bridge_desc.." Tall Truss Superstructure Simple Right End", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_tall_simple_end_right.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, -0.375, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_simple_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Middle Simple", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_simple.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_simple.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {-0.5, 2.375, 0.375, 1.5, 2.5, 0.5}, -- NodeBox218 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + {-0.5, 2.3125, 0.375, -0.375, 2.4375, 0.5}, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_simple_end_left_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Simple Left End", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_simple_end_left.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {0.375, -0.5, 0.375, 0.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_simple_end_right_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Simple Right End", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_simple_end_right.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, -0.375, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_up_right_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Up Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 3.5, 0.5}, -- NodeBox4 + {1.25, 3.3125, 0.375, 1.375, 3.4375, 0.5}, -- NodeBox34 + {1.125, 3.25, 0.375, 1.25, 3.375, 0.5}, -- NodeBox35 + {1, 3.1875, 0.375, 1.125, 3.3125, 0.5}, -- NodeBox36 + {0.875, 3.125, 0.375, 1, 3.25, 0.5}, -- NodeBox37 + {0.75, 3.0625, 0.375, 0.875, 3.1875, 0.5}, -- NodeBox38 + {0.625, 3, 0.375, 0.75, 3.125, 0.5}, -- NodeBox39 + {0.5, 2.9375, 0.375, 0.625, 3.0625, 0.5}, -- NodeBox40 + {0.375, 2.875, 0.375, 0.5, 3, 0.5}, -- NodeBox41 + {0.25, 2.8125, 0.375, 0.375, 2.9375, 0.5}, -- NodeBox42 + {0.125, 2.75, 0.375, 0.25, 2.875, 0.5}, -- NodeBox43 + {0, 2.6875, 0.375, 0.125, 2.8125, 0.5}, -- NodeBox44 + {-0.125, 2.625, 0.375, -1.2666e-007, 2.75, 0.5}, -- NodeBox45 + {-0.25, 2.5625, 0.375, -0.125, 2.6875, 0.5}, -- NodeBox46 + {-0.375, 2.5, 0.375, -0.25, 2.625, 0.5}, -- NodeBox47 + {-0.5, 2.4375, 0.375, -0.375, 2.5625, 0.5}, -- NodeBox48 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_up_left_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Up Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 3.5, 0.5}, -- NodeBox4 + {1.25, 3.3125, 0.375, 1.375, 3.4375, 0.5}, -- NodeBox34 + {1.125, 3.25, 0.375, 1.25, 3.375, 0.5}, -- NodeBox35 + {1, 3.1875, 0.375, 1.125, 3.3125, 0.5}, -- NodeBox36 + {0.875, 3.125, 0.375, 1, 3.25, 0.5}, -- NodeBox37 + {0.75, 3.0625, 0.375, 0.875, 3.1875, 0.5}, -- NodeBox38 + {0.625, 3, 0.375, 0.75, 3.125, 0.5}, -- NodeBox39 + {0.5, 2.9375, 0.375, 0.625, 3.0625, 0.5}, -- NodeBox40 + {0.375, 2.875, 0.375, 0.5, 3, 0.5}, -- NodeBox41 + {0.25, 2.8125, 0.375, 0.375, 2.9375, 0.5}, -- NodeBox42 + {0.125, 2.75, 0.375, 0.25, 2.875, 0.5}, -- NodeBox43 + {0, 2.6875, 0.375, 0.125, 2.8125, 0.5}, -- NodeBox44 + {-0.125, 2.625, 0.375, -1.2666e-007, 2.75, 0.5}, -- NodeBox45 + {-0.25, 2.5625, 0.375, -0.125, 2.6875, 0.5}, -- NodeBox46 + {-0.375, 2.5, 0.375, -0.25, 2.625, 0.5}, -- NodeBox47 + {-0.5, 2.4375, 0.375, -0.375, 2.5625, 0.5}, -- NodeBox48 + {1.3125, 3.25, 0.375, 1.4375, 3.375, 0.5}, -- NodeBox5 + {1.25, 3.125, 0.375, 1.375, 3.3125, 0.5}, -- NodeBox6 + {1.1875, 3, 0.375, 1.3125, 3.1875, 0.5}, -- NodeBox7 + {1.125, 2.875, 0.375, 1.25, 3.0625, 0.5}, -- NodeBox8 + {1.0625, 2.75, 0.375, 1.1875, 2.9375, 0.5}, -- NodeBox9 + {1, 2.625, 0.375, 1.125, 2.8125, 0.5}, -- NodeBox10 + {0.9375, 2.5625, 0.375, 1.0625, 2.6875, 0.5}, -- NodeBox11 + {0.875, 2.4375, 0.375, 1, 2.625, 0.5}, -- NodeBox12 + {0.8125, 2.3125, 0.375, 0.9375, 2.5, 0.5}, -- NodeBox13 + {0.75, 2.1875, 0.375, 0.875, 2.375, 0.5}, -- NodeBox14 + {0.6875, 2.0625, 0.375, 0.8125, 2.25, 0.5}, -- NodeBox15 + {0.625, 2, 0.375, 0.75, 2.125, 0.5}, -- NodeBox16 + {0.5625, 1.875, 0.375, 0.6875, 2.0625, 0.5}, -- NodeBox17 + {0.5, 1.75, 0.375, 0.625, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.375, 1.5, 0.375, 0.5, 1.6875, 0.5}, -- NodeBox20 + {0.3125, 1.375, 0.375, 0.4375, 1.5625, 0.5}, -- NodeBox21 + {0.25, 1.3125, 0.375, 0.375, 1.4375, 0.5}, -- NodeBox22 + {0.1875, 1.1875, 0.375, 0.3125, 1.375, 0.5}, -- NodeBox23 + {0.125, 1.0625, 0.375, 0.25, 1.25, 0.5}, -- NodeBox24 + {0.0625, 0.9375, 0.375, 0.1875, 1.125, 0.5}, -- NodeBox25 + {0, 0.8125, 0.375, 0.125, 1, 0.5}, -- NodeBox26 + {-0.0625, 0.75, 0.375, 0.0625, 0.875, 0.5}, -- NodeBox27 + {-0.125, 0.625, 0.375, -3.35276e-008, 0.8125, 0.5}, -- NodeBox28 + {-0.1875, 0.5, 0.375, -0.0625, 0.6875, 0.5}, -- NodeBox29 + {-0.25, 0.375, 0.375, -0.125, 0.5625, 0.5}, -- NodeBox30 + {-0.3125, 0.25, 0.375, -0.1875, 0.4375, 0.5}, -- NodeBox31 + {-0.375, 0.125, 0.375, -0.25, 0.3125, 0.5}, -- NodeBox32 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox33 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_up_mid_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Up Middle", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_mid.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 3.5, 0.5}, -- NodeBox4 + {1.25, 3.3125, 0.375, 1.375, 3.4375, 0.5}, -- NodeBox34 + {1.125, 3.25, 0.375, 1.25, 3.375, 0.5}, -- NodeBox35 + {1, 3.1875, 0.375, 1.125, 3.3125, 0.5}, -- NodeBox36 + {0.875, 3.125, 0.375, 1, 3.25, 0.5}, -- NodeBox37 + {0.75, 3.0625, 0.375, 0.875, 3.1875, 0.5}, -- NodeBox38 + {0.625, 3, 0.375, 0.75, 3.125, 0.5}, -- NodeBox39 + {0.5, 2.9375, 0.375, 0.625, 3.0625, 0.5}, -- NodeBox40 + {0.375, 2.875, 0.375, 0.5, 3, 0.5}, -- NodeBox41 + {0.25, 2.8125, 0.375, 0.375, 2.9375, 0.5}, -- NodeBox42 + {0.125, 2.75, 0.375, 0.25, 2.875, 0.5}, -- NodeBox43 + {0, 2.6875, 0.375, 0.125, 2.8125, 0.5}, -- NodeBox44 + {-0.125, 2.625, 0.375, -1.2666e-007, 2.75, 0.5}, -- NodeBox45 + {-0.25, 2.5625, 0.375, -0.125, 2.6875, 0.5}, -- NodeBox46 + {-0.375, 2.5, 0.375, -0.25, 2.625, 0.5}, -- NodeBox47 + {-0.5, 2.4375, 0.375, -0.375, 2.5625, 0.5}, -- NodeBox48 + {1.3125, 3.25, 0.375, 1.4375, 3.375, 0.5}, -- NodeBox5 + {1.25, 3.125, 0.375, 1.375, 3.3125, 0.5}, -- NodeBox6 + {1.1875, 3, 0.375, 1.3125, 3.1875, 0.5}, -- NodeBox7 + {1.125, 2.875, 0.375, 1.25, 3.0625, 0.5}, -- NodeBox8 + {1.0625, 2.75, 0.375, 1.1875, 2.9375, 0.5}, -- NodeBox9 + {1, 2.625, 0.375, 1.125, 2.8125, 0.5}, -- NodeBox10 + {0.9375, 2.5625, 0.375, 1.0625, 2.6875, 0.5}, -- NodeBox11 + {0.875, 2.4375, 0.375, 1, 2.625, 0.5}, -- NodeBox12 + {0.8125, 2.3125, 0.375, 0.9375, 2.5, 0.5}, -- NodeBox13 + {0.75, 2.1875, 0.375, 0.875, 2.375, 0.5}, -- NodeBox14 + {0.6875, 2.0625, 0.375, 0.8125, 2.25, 0.5}, -- NodeBox15 + {0.625, 2, 0.375, 0.75, 2.125, 0.5}, -- NodeBox16 + {0.5625, 1.875, 0.375, 0.6875, 2.0625, 0.5}, -- NodeBox17 + {0.5, 1.75, 0.375, 0.625, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.375, 1.5, 0.375, 0.5, 1.6875, 0.5}, -- NodeBox20 + {0.3125, 1.375, 0.375, 0.4375, 1.5625, 0.5}, -- NodeBox21 + {0.25, 1.3125, 0.375, 0.375, 1.4375, 0.5}, -- NodeBox22 + {0.1875, 1.1875, 0.375, 0.3125, 1.375, 0.5}, -- NodeBox23 + {0.125, 1.0625, 0.375, 0.25, 1.25, 0.5}, -- NodeBox24 + {0.0625, 0.9375, 0.375, 0.1875, 1.125, 0.5}, -- NodeBox25 + {0, 0.8125, 0.375, 0.125, 1, 0.5}, -- NodeBox26 + {-0.0625, 0.75, 0.375, 0.0625, 0.875, 0.5}, -- NodeBox27 + {-0.125, 0.625, 0.375, -3.35276e-008, 0.8125, 0.5}, -- NodeBox28 + {-0.1875, 0.5, 0.375, -0.0625, 0.6875, 0.5}, -- NodeBox29 + {-0.25, 0.375, 0.375, -0.125, 0.5625, 0.5}, -- NodeBox30 + {-0.3125, 0.25, 0.375, -0.1875, 0.4375, 0.5}, -- NodeBox31 + {-0.375, 0.125, 0.375, -0.25, 0.3125, 0.5}, -- NodeBox32 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox33 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_up_simple_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Up Simple", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_up_simple.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 3.375, 0.375, 1.5, 3.5, 0.5}, -- NodeBox2 + {1.25, 3.3125, 0.375, 1.375, 3.4375, 0.5}, -- NodeBox34 + {1.125, 3.25, 0.375, 1.25, 3.375, 0.5}, -- NodeBox35 + {1, 3.1875, 0.375, 1.125, 3.3125, 0.5}, -- NodeBox36 + {0.875, 3.125, 0.375, 1, 3.25, 0.5}, -- NodeBox37 + {0.75, 3.0625, 0.375, 0.875, 3.1875, 0.5}, -- NodeBox38 + {0.625, 3, 0.375, 0.75, 3.125, 0.5}, -- NodeBox39 + {0.5, 2.9375, 0.375, 0.625, 3.0625, 0.5}, -- NodeBox40 + {0.375, 2.875, 0.375, 0.5, 3, 0.5}, -- NodeBox41 + {0.25, 2.8125, 0.375, 0.375, 2.9375, 0.5}, -- NodeBox42 + {0.125, 2.75, 0.375, 0.25, 2.875, 0.5}, -- NodeBox43 + {0, 2.6875, 0.375, 0.125, 2.8125, 0.5}, -- NodeBox44 + {-0.125, 2.625, 0.375, -1.2666e-007, 2.75, 0.5}, -- NodeBox45 + {-0.25, 2.5625, 0.375, -0.125, 2.6875, 0.5}, -- NodeBox46 + {-0.375, 2.5, 0.375, -0.25, 2.625, 0.5}, -- NodeBox47 + {-0.5, 2.4375, 0.375, -0.375, 2.5625, 0.5}, -- NodeBox48 + {1.3125, 3.25, 0.375, 1.4375, 3.375, 0.5}, -- NodeBox5 + {1.25, 3.125, 0.375, 1.375, 3.3125, 0.5}, -- NodeBox6 + {1.1875, 3, 0.375, 1.3125, 3.1875, 0.5}, -- NodeBox7 + {1.125, 2.875, 0.375, 1.25, 3.0625, 0.5}, -- NodeBox8 + {1.0625, 2.75, 0.375, 1.1875, 2.9375, 0.5}, -- NodeBox9 + {1, 2.625, 0.375, 1.125, 2.8125, 0.5}, -- NodeBox10 + {0.9375, 2.5625, 0.375, 1.0625, 2.6875, 0.5}, -- NodeBox11 + {0.875, 2.4375, 0.375, 1, 2.625, 0.5}, -- NodeBox12 + {0.8125, 2.3125, 0.375, 0.9375, 2.5, 0.5}, -- NodeBox13 + {0.75, 2.1875, 0.375, 0.875, 2.375, 0.5}, -- NodeBox14 + {0.6875, 2.0625, 0.375, 0.8125, 2.25, 0.5}, -- NodeBox15 + {0.625, 2, 0.375, 0.75, 2.125, 0.5}, -- NodeBox16 + {0.5625, 1.875, 0.375, 0.6875, 2.0625, 0.5}, -- NodeBox17 + {0.5, 1.75, 0.375, 0.625, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.375, 1.5, 0.375, 0.5, 1.6875, 0.5}, -- NodeBox20 + {0.3125, 1.375, 0.375, 0.4375, 1.5625, 0.5}, -- NodeBox21 + {0.25, 1.3125, 0.375, 0.375, 1.4375, 0.5}, -- NodeBox22 + {0.1875, 1.1875, 0.375, 0.3125, 1.375, 0.5}, -- NodeBox23 + {0.125, 1.0625, 0.375, 0.25, 1.25, 0.5}, -- NodeBox24 + {0.0625, 0.9375, 0.375, 0.1875, 1.125, 0.5}, -- NodeBox25 + {0, 0.8125, 0.375, 0.125, 1, 0.5}, -- NodeBox26 + {-0.0625, 0.75, 0.375, 0.0625, 0.875, 0.5}, -- NodeBox27 + {-0.125, 0.625, 0.375, -3.35276e-008, 0.8125, 0.5}, -- NodeBox28 + {-0.1875, 0.5, 0.375, -0.0625, 0.6875, 0.5}, -- NodeBox29 + {-0.25, 0.375, 0.375, -0.125, 0.5625, 0.5}, -- NodeBox30 + {-0.3125, 0.25, 0.375, -0.1875, 0.4375, 0.5}, -- NodeBox31 + {-0.375, 0.125, 0.375, -0.25, 0.3125, 0.5}, -- NodeBox32 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox33 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_down_right_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Down Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 2.4375, 0.375, 1.5, 2.5625, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 3.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox4 + {1.25, 2.5, 0.375, 1.375, 2.625, 0.5}, -- NodeBox34 + {1.125, 2.5625, 0.375, 1.25, 2.6875, 0.5}, -- NodeBox35 + {1, 2.625, 0.375, 1.125, 2.75, 0.5}, -- NodeBox36 + {0.875, 2.6875, 0.375, 1, 2.8125, 0.5}, -- NodeBox37 + {0.75, 2.75, 0.375, 0.875, 2.875, 0.5}, -- NodeBox38 + {0.625, 2.8125, 0.375, 0.75, 2.9375, 0.5}, -- NodeBox39 + {0.5, 2.875, 0.375, 0.625, 3, 0.5}, -- NodeBox40 + {0.375, 2.9375, 0.375, 0.5, 3.0625, 0.5}, -- NodeBox41 + {0.25, 3, 0.375, 0.375, 3.125, 0.5}, -- NodeBox42 + {0.125, 3.0625, 0.375, 0.25, 3.1875, 0.5}, -- NodeBox43 + {0, 3.125, 0.375, 0.125, 3.25, 0.5}, -- NodeBox44 + {-0.125, 3.1875, 0.375, -1.2666e-007, 3.3125, 0.5}, -- NodeBox45 + {-0.25, 3.25, 0.375, -0.125, 3.375, 0.5}, -- NodeBox46 + {-0.375, 3.3125, 0.375, -0.25, 3.4375, 0.5}, -- NodeBox47 + {-0.5, 3.375, 0.375, -0.375, 3.5, 0.5}, -- NodeBox48 + {-0.4375, 3.25, 0.375, -0.3125, 3.375, 0.5}, -- NodeBox5 + {-0.375, 3.125, 0.375, -0.25, 3.3125, 0.5}, -- NodeBox6 + {-0.3125, 3, 0.375, -0.1875, 3.1875, 0.5}, -- NodeBox7 + {-0.25, 2.875, 0.375, -0.125, 3.0625, 0.5}, -- NodeBox8 + {-0.1875, 2.75, 0.375, -0.0625, 2.9375, 0.5}, -- NodeBox9 + {-0.125, 2.625, 0.375, 1.11759e-008, 2.8125, 0.5}, -- NodeBox10 + {-0.0625, 2.5625, 0.375, 0.0625, 2.6875, 0.5}, -- NodeBox11 + {0, 2.4375, 0.375, 0.125, 2.625, 0.5}, -- NodeBox12 + {0.0625, 2.3125, 0.375, 0.1875, 2.5, 0.5}, -- NodeBox13 + {0.125, 2.1875, 0.375, 0.25, 2.375, 0.5}, -- NodeBox14 + {0.1875, 2.0625, 0.375, 0.3125, 2.25, 0.5}, -- NodeBox15 + {0.25, 2, 0.375, 0.375, 2.125, 0.5}, -- NodeBox16 + {0.3125, 1.875, 0.375, 0.4375, 2.0625, 0.5}, -- NodeBox17 + {0.375, 1.75, 0.375, 0.5, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.5, 1.5, 0.375, 0.625, 1.6875, 0.5}, -- NodeBox20 + {0.5625, 1.375, 0.375, 0.6875, 1.5625, 0.5}, -- NodeBox21 + {0.625, 1.3125, 0.375, 0.75, 1.4375, 0.5}, -- NodeBox22 + {0.6875, 1.1875, 0.375, 0.8125, 1.375, 0.5}, -- NodeBox23 + {0.75, 1.0625, 0.375, 0.875, 1.25, 0.5}, -- NodeBox24 + {0.8125, 0.9375, 0.375, 0.9375, 1.125, 0.5}, -- NodeBox25 + {0.875, 0.8125, 0.375, 1, 1, 0.5}, -- NodeBox26 + {0.9375, 0.75, 0.375, 1.0625, 0.875, 0.5}, -- NodeBox27 + {1, 0.625, 0.375, 1.125, 0.8125, 0.5}, -- NodeBox28 + {1.0625, 0.5, 0.375, 1.1875, 0.6875, 0.5}, -- NodeBox29 + {1.125, 0.375, 0.375, 1.25, 0.5625, 0.5}, -- NodeBox30 + {1.1875, 0.25, 0.375, 1.3125, 0.4375, 0.5}, -- NodeBox31 + {1.25, 0.125, 0.375, 1.375, 0.3125, 0.5}, -- NodeBox32 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox33 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_down_left_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Down Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 2.4375, 0.375, 1.5, 2.5625, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 3.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox4 + {1.25, 2.5, 0.375, 1.375, 2.625, 0.5}, -- NodeBox34 + {1.125, 2.5625, 0.375, 1.25, 2.6875, 0.5}, -- NodeBox35 + {1, 2.625, 0.375, 1.125, 2.75, 0.5}, -- NodeBox36 + {0.875, 2.6875, 0.375, 1, 2.8125, 0.5}, -- NodeBox37 + {0.75, 2.75, 0.375, 0.875, 2.875, 0.5}, -- NodeBox38 + {0.625, 2.8125, 0.375, 0.75, 2.9375, 0.5}, -- NodeBox39 + {0.5, 2.875, 0.375, 0.625, 3, 0.5}, -- NodeBox40 + {0.375, 2.9375, 0.375, 0.5, 3.0625, 0.5}, -- NodeBox41 + {0.25, 3, 0.375, 0.375, 3.125, 0.5}, -- NodeBox42 + {0.125, 3.0625, 0.375, 0.25, 3.1875, 0.5}, -- NodeBox43 + {0, 3.125, 0.375, 0.125, 3.25, 0.5}, -- NodeBox44 + {-0.125, 3.1875, 0.375, -1.2666e-007, 3.3125, 0.5}, -- NodeBox45 + {-0.25, 3.25, 0.375, -0.125, 3.375, 0.5}, -- NodeBox46 + {-0.375, 3.3125, 0.375, -0.25, 3.4375, 0.5}, -- NodeBox47 + {-0.5, 3.375, 0.375, -0.375, 3.5, 0.5}, -- NodeBox48 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_down_mid_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Down Middle", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_mid.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 2.4375, 0.375, 1.5, 2.5625, 0.5}, -- NodeBox2 + {-0.5, -0.5, 0.375, -0.4375, 3.5, 0.5}, -- NodeBox3 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox4 + {1.25, 2.5, 0.375, 1.375, 2.625, 0.5}, -- NodeBox34 + {1.125, 2.5625, 0.375, 1.25, 2.6875, 0.5}, -- NodeBox35 + {1, 2.625, 0.375, 1.125, 2.75, 0.5}, -- NodeBox36 + {0.875, 2.6875, 0.375, 1, 2.8125, 0.5}, -- NodeBox37 + {0.75, 2.75, 0.375, 0.875, 2.875, 0.5}, -- NodeBox38 + {0.625, 2.8125, 0.375, 0.75, 2.9375, 0.5}, -- NodeBox39 + {0.5, 2.875, 0.375, 0.625, 3, 0.5}, -- NodeBox40 + {0.375, 2.9375, 0.375, 0.5, 3.0625, 0.5}, -- NodeBox41 + {0.25, 3, 0.375, 0.375, 3.125, 0.5}, -- NodeBox42 + {0.125, 3.0625, 0.375, 0.25, 3.1875, 0.5}, -- NodeBox43 + {0, 3.125, 0.375, 0.125, 3.25, 0.5}, -- NodeBox44 + {-0.125, 3.1875, 0.375, -1.2666e-007, 3.3125, 0.5}, -- NodeBox45 + {-0.25, 3.25, 0.375, -0.125, 3.375, 0.5}, -- NodeBox46 + {-0.375, 3.3125, 0.375, -0.25, 3.4375, 0.5}, -- NodeBox47 + {-0.5, 3.375, 0.375, -0.375, 3.5, 0.5}, -- NodeBox48 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + {-0.4375, 3.25, 0.375, -0.3125, 3.375, 0.5}, -- NodeBox5 + {-0.375, 3.125, 0.375, -0.25, 3.3125, 0.5}, -- NodeBox6 + {-0.3125, 3, 0.375, -0.1875, 3.1875, 0.5}, -- NodeBox7 + {-0.25, 2.875, 0.375, -0.125, 3.0625, 0.5}, -- NodeBox8 + {-0.1875, 2.75, 0.375, -0.0625, 2.9375, 0.5}, -- NodeBox9 + {-0.125, 2.625, 0.375, 1.11759e-008, 2.8125, 0.5}, -- NodeBox10 + {-0.0625, 2.5625, 0.375, 0.0625, 2.6875, 0.5}, -- NodeBox11 + {0, 2.4375, 0.375, 0.125, 2.625, 0.5}, -- NodeBox12 + {0.0625, 2.3125, 0.375, 0.1875, 2.5, 0.5}, -- NodeBox13 + {0.125, 2.1875, 0.375, 0.25, 2.375, 0.5}, -- NodeBox14 + {0.1875, 2.0625, 0.375, 0.3125, 2.25, 0.5}, -- NodeBox15 + {0.25, 2, 0.375, 0.375, 2.125, 0.5}, -- NodeBox16 + {0.3125, 1.875, 0.375, 0.4375, 2.0625, 0.5}, -- NodeBox17 + {0.375, 1.75, 0.375, 0.5, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.5, 1.5, 0.375, 0.625, 1.6875, 0.5}, -- NodeBox20 + {0.5625, 1.375, 0.375, 0.6875, 1.5625, 0.5}, -- NodeBox21 + {0.625, 1.3125, 0.375, 0.75, 1.4375, 0.5}, -- NodeBox22 + {0.6875, 1.1875, 0.375, 0.8125, 1.375, 0.5}, -- NodeBox23 + {0.75, 1.0625, 0.375, 0.875, 1.25, 0.5}, -- NodeBox24 + {0.8125, 0.9375, 0.375, 0.9375, 1.125, 0.5}, -- NodeBox25 + {0.875, 0.8125, 0.375, 1, 1, 0.5}, -- NodeBox26 + {0.9375, 0.75, 0.375, 1.0625, 0.875, 0.5}, -- NodeBox27 + {1, 0.625, 0.375, 1.125, 0.8125, 0.5}, -- NodeBox28 + {1.0625, 0.5, 0.375, 1.1875, 0.6875, 0.5}, -- NodeBox29 + {1.125, 0.375, 0.375, 1.25, 0.5625, 0.5}, -- NodeBox30 + {1.1875, 0.25, 0.375, 1.3125, 0.4375, 0.5}, -- NodeBox31 + {1.25, 0.125, 0.375, 1.375, 0.3125, 0.5}, -- NodeBox32 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox33 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_down_simple_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Down Simple", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_down_simple.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox1 + {1.375, 2.4375, 0.375, 1.5, 2.5625, 0.5}, -- NodeBox2 + {1.25, 2.5, 0.375, 1.375, 2.625, 0.5}, -- NodeBox34 + {1.125, 2.5625, 0.375, 1.25, 2.6875, 0.5}, -- NodeBox35 + {1, 2.625, 0.375, 1.125, 2.75, 0.5}, -- NodeBox36 + {0.875, 2.6875, 0.375, 1, 2.8125, 0.5}, -- NodeBox37 + {0.75, 2.75, 0.375, 0.875, 2.875, 0.5}, -- NodeBox38 + {0.625, 2.8125, 0.375, 0.75, 2.9375, 0.5}, -- NodeBox39 + {0.5, 2.875, 0.375, 0.625, 3, 0.5}, -- NodeBox40 + {0.375, 2.9375, 0.375, 0.5, 3.0625, 0.5}, -- NodeBox41 + {0.25, 3, 0.375, 0.375, 3.125, 0.5}, -- NodeBox42 + {0.125, 3.0625, 0.375, 0.25, 3.1875, 0.5}, -- NodeBox43 + {0, 3.125, 0.375, 0.125, 3.25, 0.5}, -- NodeBox44 + {-0.125, 3.1875, 0.375, -1.2666e-007, 3.3125, 0.5}, -- NodeBox45 + {-0.25, 3.25, 0.375, -0.125, 3.375, 0.5}, -- NodeBox46 + {-0.375, 3.3125, 0.375, -0.25, 3.4375, 0.5}, -- NodeBox47 + {-0.5, 3.375, 0.375, -0.375, 3.5, 0.5}, -- NodeBox48 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + {-0.4375, 3.25, 0.375, -0.3125, 3.375, 0.5}, -- NodeBox5 + {-0.375, 3.125, 0.375, -0.25, 3.3125, 0.5}, -- NodeBox6 + {-0.3125, 3, 0.375, -0.1875, 3.1875, 0.5}, -- NodeBox7 + {-0.25, 2.875, 0.375, -0.125, 3.0625, 0.5}, -- NodeBox8 + {-0.1875, 2.75, 0.375, -0.0625, 2.9375, 0.5}, -- NodeBox9 + {-0.125, 2.625, 0.375, 1.11759e-008, 2.8125, 0.5}, -- NodeBox10 + {-0.0625, 2.5625, 0.375, 0.0625, 2.6875, 0.5}, -- NodeBox11 + {0, 2.4375, 0.375, 0.125, 2.625, 0.5}, -- NodeBox12 + {0.0625, 2.3125, 0.375, 0.1875, 2.5, 0.5}, -- NodeBox13 + {0.125, 2.1875, 0.375, 0.25, 2.375, 0.5}, -- NodeBox14 + {0.1875, 2.0625, 0.375, 0.3125, 2.25, 0.5}, -- NodeBox15 + {0.25, 2, 0.375, 0.375, 2.125, 0.5}, -- NodeBox16 + {0.3125, 1.875, 0.375, 0.4375, 2.0625, 0.5}, -- NodeBox17 + {0.375, 1.75, 0.375, 0.5, 1.9375, 0.5}, -- NodeBox18 + {0.4375, 1.625, 0.375, 0.5625, 1.8125, 0.5}, -- NodeBox19 + {0.5, 1.5, 0.375, 0.625, 1.6875, 0.5}, -- NodeBox20 + {0.5625, 1.375, 0.375, 0.6875, 1.5625, 0.5}, -- NodeBox21 + {0.625, 1.3125, 0.375, 0.75, 1.4375, 0.5}, -- NodeBox22 + {0.6875, 1.1875, 0.375, 0.8125, 1.375, 0.5}, -- NodeBox23 + {0.75, 1.0625, 0.375, 0.875, 1.25, 0.5}, -- NodeBox24 + {0.8125, 0.9375, 0.375, 0.9375, 1.125, 0.5}, -- NodeBox25 + {0.875, 0.8125, 0.375, 1, 1, 0.5}, -- NodeBox26 + {0.9375, 0.75, 0.375, 1.0625, 0.875, 0.5}, -- NodeBox27 + {1, 0.625, 0.375, 1.125, 0.8125, 0.5}, -- NodeBox28 + {1.0625, 0.5, 0.375, 1.1875, 0.6875, 0.5}, -- NodeBox29 + {1.125, 0.375, 0.375, 1.25, 0.5625, 0.5}, -- NodeBox30 + {1.1875, 0.25, 0.375, 1.3125, 0.4375, 0.5}, -- NodeBox31 + {1.25, 0.125, 0.375, 1.375, 0.3125, 0.5}, -- NodeBox32 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox33 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 3.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_substructure_end_right_slant_"..bridge_colors, { + description = bridge_desc.." Truss Substructure End Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_substructure_end_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 1.375, 0.375, 1.5, 1.5, 0.5}, -- NodeBox122 + {-0.4375, 1.3125, 0.375, -0.3125, 1.4375, 0.5}, -- NodeBox126 + {-0.375, 1.25, 0.375, -0.25, 1.375, 0.5}, -- NodeBox127 + {-0.3125, 1.1875, 0.375, -0.1875, 1.3125, 0.5}, -- NodeBox128 + {-0.25, 1.125, 0.375, -0.125, 1.25, 0.5}, -- NodeBox129 + {-0.1875, 1.0625, 0.375, -0.0625, 1.1875, 0.5}, -- NodeBox130 + {-0.125, 1, 0.375, 0, 1.125, 0.5}, -- NodeBox131 + {-0.0625, 0.9375, 0.375, 0.0625, 1.0625, 0.5}, -- NodeBox132 + {0, 0.875, 0.375, 0.125, 1, 0.5}, -- NodeBox133 + {0.0625, 0.8125, 0.375, 0.1875, 0.9375, 0.5}, -- NodeBox134 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox135 + {0.1875, 0.6875, 0.375, 0.3125, 0.8125, 0.5}, -- NodeBox136 + {0.25, 0.625, 0.375, 0.375, 0.75, 0.5}, -- NodeBox137 + {0.3125, 0.5625, 0.375, 0.4375, 0.6875, 0.5}, -- NodeBox138 + {0.375, 0.5, 0.375, 0.5, 0.625, 0.5}, -- NodeBox139 + {0.4375, 0.4375, 0.375, 0.5625, 0.5625, 0.5}, -- NodeBox140 + {0.5, 0.375, 0.375, 0.625, 0.5, 0.5}, -- NodeBox141 + {0.5625, 0.3125, 0.375, 0.6875, 0.4375, 0.5}, -- NodeBox142 + {0.625, 0.25, 0.375, 0.75, 0.375, 0.5}, -- NodeBox143 + {0.6875, 0.1875, 0.375, 0.8125, 0.3125, 0.5}, -- NodeBox144 + {0.75, 0.125, 0.375, 0.875, 0.25, 0.5}, -- NodeBox145 + {0.8125, 0.0625, 0.375, 0.9375, 0.1875, 0.5}, -- NodeBox146 + {0.875, 0, 0.375, 1, 0.125, 0.5}, -- NodeBox147 + {0.9375, -0.0625, 0.375, 1.0625, 0.0625, 0.5}, -- NodeBox148 + {1, -0.125, 0.375, 1.125, 0, 0.5}, -- NodeBox149 + {1.0625, -0.1875, 0.375, 1.1875, -0.0625, 0.5}, -- NodeBox150 + {1.125, -0.25, 0.375, 1.25, -0.125, 0.5}, -- NodeBox151 + {1.1875, -0.3125, 0.375, 1.3125, -0.1875, 0.5}, -- NodeBox152 + {1.25, -0.375, 0.375, 1.375, -0.25, 0.5}, -- NodeBox153 + {1.3125, -0.4375, 0.375, 1.4375, -0.3125, 0.5}, -- NodeBox154 + {1.375, -0.5, 0.375, 1.5, -0.375, 0.5}, -- NodeBox189 + {1.4375, -0.5, 0.375, 1.5, 1.5, 0.5}, -- NodeBox190 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_substructure_end_left_slant_"..bridge_colors, { + description = bridge_desc.." Truss Substructure End Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_substructure_end_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 1.375, 0.375, 1.5, 1.5, 0.5}, -- NodeBox122 + {1.3125, 1.3125, 0.375, 1.4375, 1.4375, 0.5}, -- NodeBox126 + {1.25, 1.25, 0.375, 1.375, 1.375, 0.5}, -- NodeBox127 + {1.1875, 1.1875, 0.375, 1.3125, 1.3125, 0.5}, -- NodeBox128 + {1.125, 1.125, 0.375, 1.25, 1.25, 0.5}, -- NodeBox129 + {1.0625, 1.0625, 0.375, 1.1875, 1.1875, 0.5}, -- NodeBox130 + {1, 1, 0.375, 1.125, 1.125, 0.5}, -- NodeBox131 + {0.9375, 0.9375, 0.375, 1.0625, 1.0625, 0.5}, -- NodeBox132 + {0.875, 0.875, 0.375, 1, 1, 0.5}, -- NodeBox133 + {0.8125, 0.8125, 0.375, 0.9375, 0.9375, 0.5}, -- NodeBox134 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox135 + {0.6875, 0.6875, 0.375, 0.8125, 0.8125, 0.5}, -- NodeBox136 + {0.625, 0.625, 0.375, 0.75, 0.75, 0.5}, -- NodeBox137 + {0.5625, 0.5625, 0.375, 0.6875, 0.6875, 0.5}, -- NodeBox138 + {0.5, 0.5, 0.375, 0.625, 0.625, 0.5}, -- NodeBox139 + {0.4375, 0.4375, 0.375, 0.5625, 0.5625, 0.5}, -- NodeBox140 + {0.375, 0.375, 0.375, 0.5, 0.5, 0.5}, -- NodeBox141 + {0.3125, 0.3125, 0.375, 0.4375, 0.4375, 0.5}, -- NodeBox142 + {0.25, 0.25, 0.375, 0.375, 0.375, 0.5}, -- NodeBox143 + {0.1875, 0.1875, 0.375, 0.3125, 0.3125, 0.5}, -- NodeBox144 + {0.125, 0.125, 0.375, 0.25, 0.25, 0.5}, -- NodeBox145 + {0.0625, 0.0625, 0.375, 0.1875, 0.1875, 0.5}, -- NodeBox146 + {0, 0, 0.375, 0.125, 0.125, 0.5}, -- NodeBox147 + {-0.0625, -0.0625, 0.375, 0.0625, 0.0625, 0.5}, -- NodeBox148 + {-0.125, -0.125, 0.375, 0, 0, 0.5}, -- NodeBox149 + {-0.1875, -0.1875, 0.375, -0.0625, -0.0625, 0.5}, -- NodeBox150 + {-0.25, -0.25, 0.375, -0.125, -0.125, 0.5}, -- NodeBox151 + {-0.3125, -0.3125, 0.375, -0.1875, -0.1875, 0.5}, -- NodeBox152 + {-0.375, -0.375, 0.375, -0.25, -0.25, 0.5}, -- NodeBox153 + {-0.4375, -0.4375, 0.375, -0.3125, -0.3125, 0.5}, -- NodeBox154 + {-0.5, -0.5, 0.375, -0.4375, 1.5, 0.5}, -- NodeBox188 + {-0.5, -0.5, 0.375, -0.375, -0.375, 0.5}, -- NodeBox192 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_substructure_right_slant_"..bridge_colors, { + description = bridge_desc.." Truss Substructure Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_substructure_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_substructure_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 1.375, 0.375, 1.5, 1.5, 0.5}, -- NodeBox122 + {-0.4375, 1.3125, 0.375, -0.3125, 1.4375, 0.5}, -- NodeBox126 + {-0.375, 1.25, 0.375, -0.25, 1.375, 0.5}, -- NodeBox127 + {-0.3125, 1.1875, 0.375, -0.1875, 1.3125, 0.5}, -- NodeBox128 + {-0.25, 1.125, 0.375, -0.125, 1.25, 0.5}, -- NodeBox129 + {-0.1875, 1.0625, 0.375, -0.0625, 1.1875, 0.5}, -- NodeBox130 + {-0.125, 1, 0.375, 0, 1.125, 0.5}, -- NodeBox131 + {-0.0625, 0.9375, 0.375, 0.0625, 1.0625, 0.5}, -- NodeBox132 + {0, 0.875, 0.375, 0.125, 1, 0.5}, -- NodeBox133 + {0.0625, 0.8125, 0.375, 0.1875, 0.9375, 0.5}, -- NodeBox134 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox135 + {0.1875, 0.6875, 0.375, 0.3125, 0.8125, 0.5}, -- NodeBox136 + {0.25, 0.625, 0.375, 0.375, 0.75, 0.5}, -- NodeBox137 + {0.3125, 0.5625, 0.375, 0.4375, 0.6875, 0.5}, -- NodeBox138 + {0.375, 0.5, 0.375, 0.5, 0.625, 0.5}, -- NodeBox139 + {0.4375, 0.4375, 0.375, 0.5625, 0.5625, 0.5}, -- NodeBox140 + {0.5, 0.375, 0.375, 0.625, 0.5, 0.5}, -- NodeBox141 + {0.5625, 0.3125, 0.375, 0.6875, 0.4375, 0.5}, -- NodeBox142 + {0.625, 0.25, 0.375, 0.75, 0.375, 0.5}, -- NodeBox143 + {0.6875, 0.1875, 0.375, 0.8125, 0.3125, 0.5}, -- NodeBox144 + {0.75, 0.125, 0.375, 0.875, 0.25, 0.5}, -- NodeBox145 + {0.8125, 0.0625, 0.375, 0.9375, 0.1875, 0.5}, -- NodeBox146 + {0.875, 0, 0.375, 1, 0.125, 0.5}, -- NodeBox147 + {0.9375, -0.0625, 0.375, 1.0625, 0.0625, 0.5}, -- NodeBox148 + {1, -0.125, 0.375, 1.125, 0, 0.5}, -- NodeBox149 + {1.0625, -0.1875, 0.375, 1.1875, -0.0625, 0.5}, -- NodeBox150 + {1.125, -0.25, 0.375, 1.25, -0.125, 0.5}, -- NodeBox151 + {1.1875, -0.3125, 0.375, 1.3125, -0.1875, 0.5}, -- NodeBox152 + {1.25, -0.375, 0.375, 1.375, -0.25, 0.5}, -- NodeBox153 + {1.3125, -0.4375, 0.375, 1.4375, -0.3125, 0.5}, -- NodeBox154 + {-0.5, -0.5, 0.375, -0.4375, 1.5, 0.5}, -- NodeBox188 + {-0.5, -0.5, 0.375, 1.5, -0.375, 0.5}, -- NodeBox189 + {1.4375, -0.5, 0.375, 1.5, 1.5, 0.5}, -- NodeBox190 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_substructure_left_slant_"..bridge_colors, { + description = bridge_desc.." Truss Substructure Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_substructure_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_substructure_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 1.375, 0.375, 1.5, 1.5, 0.5}, -- NodeBox122 + {1.3125, 1.3125, 0.375, 1.4375, 1.4375, 0.5}, -- NodeBox126 + {1.25, 1.25, 0.375, 1.375, 1.375, 0.5}, -- NodeBox127 + {1.1875, 1.1875, 0.375, 1.3125, 1.3125, 0.5}, -- NodeBox128 + {1.125, 1.125, 0.375, 1.25, 1.25, 0.5}, -- NodeBox129 + {1.0625, 1.0625, 0.375, 1.1875, 1.1875, 0.5}, -- NodeBox130 + {1, 1, 0.375, 1.125, 1.125, 0.5}, -- NodeBox131 + {0.9375, 0.9375, 0.375, 1.0625, 1.0625, 0.5}, -- NodeBox132 + {0.875, 0.875, 0.375, 1, 1, 0.5}, -- NodeBox133 + {0.8125, 0.8125, 0.375, 0.9375, 0.9375, 0.5}, -- NodeBox134 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox135 + {0.6875, 0.6875, 0.375, 0.8125, 0.8125, 0.5}, -- NodeBox136 + {0.625, 0.625, 0.375, 0.75, 0.75, 0.5}, -- NodeBox137 + {0.5625, 0.5625, 0.375, 0.6875, 0.6875, 0.5}, -- NodeBox138 + {0.5, 0.5, 0.375, 0.625, 0.625, 0.5}, -- NodeBox139 + {0.4375, 0.4375, 0.375, 0.5625, 0.5625, 0.5}, -- NodeBox140 + {0.375, 0.375, 0.375, 0.5, 0.5, 0.5}, -- NodeBox141 + {0.3125, 0.3125, 0.375, 0.4375, 0.4375, 0.5}, -- NodeBox142 + {0.25, 0.25, 0.375, 0.375, 0.375, 0.5}, -- NodeBox143 + {0.1875, 0.1875, 0.375, 0.3125, 0.3125, 0.5}, -- NodeBox144 + {0.125, 0.125, 0.375, 0.25, 0.25, 0.5}, -- NodeBox145 + {0.0625, 0.0625, 0.375, 0.1875, 0.1875, 0.5}, -- NodeBox146 + {0, 0, 0.375, 0.125, 0.125, 0.5}, -- NodeBox147 + {-0.0625, -0.0625, 0.375, 0.0625, 0.0625, 0.5}, -- NodeBox148 + {-0.125, -0.125, 0.375, 0, 0, 0.5}, -- NodeBox149 + {-0.1875, -0.1875, 0.375, -0.0625, -0.0625, 0.5}, -- NodeBox150 + {-0.25, -0.25, 0.375, -0.125, -0.125, 0.5}, -- NodeBox151 + {-0.3125, -0.3125, 0.375, -0.1875, -0.1875, 0.5}, -- NodeBox152 + {-0.375, -0.375, 0.375, -0.25, -0.25, 0.5}, -- NodeBox153 + {-0.4375, -0.4375, 0.375, -0.3125, -0.3125, 0.5}, -- NodeBox154 + {-0.5, -0.5, 0.375, -0.4375, 1.5, 0.5}, -- NodeBox188 + {-0.5, -0.5, 0.375, 1.5, -0.375, 0.5}, -- NodeBox189 + {1.4375, -0.5, 0.375, 1.5, 1.5, 0.5}, -- NodeBox190 + {-0.5, -0.5, 0.375, -0.375, -0.375, 0.5}, -- NodeBox192 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_substructure_simple_"..bridge_colors, { + description = bridge_desc.." Truss Substructure Simple", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_substructure_simple.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_substructure_simple.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, -0.375, 0.5}, -- NodeBox121 + {-0.5, 1.375, 0.375, 1.5, 1.5, 0.5}, -- NodeBox122 + {-0.4375, 1.3125, 0.375, -0.3125, 1.4375, 0.5}, -- NodeBox126 + {-0.375, 1.25, 0.375, -0.25, 1.375, 0.5}, -- NodeBox127 + {-0.3125, 1.1875, 0.375, -0.1875, 1.3125, 0.5}, -- NodeBox128 + {-0.25, 1.125, 0.375, -0.125, 1.25, 0.5}, -- NodeBox129 + {-0.1875, 1.0625, 0.375, -0.0625, 1.1875, 0.5}, -- NodeBox130 + {-0.125, 1, 0.375, 0, 1.125, 0.5}, -- NodeBox131 + {-0.0625, 0.9375, 0.375, 0.0625, 1.0625, 0.5}, -- NodeBox132 + {0, 0.875, 0.375, 0.125, 1, 0.5}, -- NodeBox133 + {0.0625, 0.8125, 0.375, 0.1875, 0.9375, 0.5}, -- NodeBox134 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox135 + {0.1875, 0.6875, 0.375, 0.3125, 0.8125, 0.5}, -- NodeBox136 + {0.25, 0.625, 0.375, 0.375, 0.75, 0.5}, -- NodeBox137 + {0.3125, 0.5625, 0.375, 0.4375, 0.6875, 0.5}, -- NodeBox138 + {0.375, 0.5, 0.375, 0.5, 0.625, 0.5}, -- NodeBox139 + {0.4375, 0.4375, 0.375, 0.5625, 0.5625, 0.5}, -- NodeBox140 + {0.5, 0.375, 0.375, 0.625, 0.5, 0.5}, -- NodeBox141 + {0.5625, 0.3125, 0.375, 0.6875, 0.4375, 0.5}, -- NodeBox142 + {0.625, 0.25, 0.375, 0.75, 0.375, 0.5}, -- NodeBox143 + {0.6875, 0.1875, 0.375, 0.8125, 0.3125, 0.5}, -- NodeBox144 + {0.75, 0.125, 0.375, 0.875, 0.25, 0.5}, -- NodeBox145 + {0.8125, 0.0625, 0.375, 0.9375, 0.1875, 0.5}, -- NodeBox146 + {0.875, 0, 0.375, 1, 0.125, 0.5}, -- NodeBox147 + {0.9375, -0.0625, 0.375, 1.0625, 0.0625, 0.5}, -- NodeBox148 + {1, -0.125, 0.375, 1.125, 0, 0.5}, -- NodeBox149 + {1.0625, -0.1875, 0.375, 1.1875, -0.0625, 0.5}, -- NodeBox150 + {1.125, -0.25, 0.375, 1.25, -0.125, 0.5}, -- NodeBox151 + {1.1875, -0.3125, 0.375, 1.3125, -0.1875, 0.5}, -- NodeBox152 + {1.25, -0.375, 0.375, 1.375, -0.25, 0.5}, -- NodeBox153 + {1.3125, -0.4375, 0.375, 1.4375, -0.3125, 0.5}, -- NodeBox154 + {1.3125, 1.3125, 0.375, 1.4375, 1.4375, 0.5}, -- NodeBox157 + {1.25, 1.25, 0.375, 1.375, 1.375, 0.5}, -- NodeBox158 + {1.1875, 1.1875, 0.375, 1.3125, 1.3125, 0.5}, -- NodeBox159 + {1.125, 1.125, 0.375, 1.25, 1.25, 0.5}, -- NodeBox160 + {1.0625, 1.0625, 0.375, 1.1875, 1.1875, 0.5}, -- NodeBox161 + {1, 1, 0.375, 1.125, 1.125, 0.5}, -- NodeBox162 + {0.9375, 0.9375, 0.375, 1.0625, 1.0625, 0.5}, -- NodeBox163 + {0.875, 0.875, 0.375, 1, 1, 0.5}, -- NodeBox164 + {0.8125, 0.8125, 0.375, 0.9375, 0.9375, 0.5}, -- NodeBox165 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox166 + {0.6875, 0.6875, 0.375, 0.8125, 0.8125, 0.5}, -- NodeBox167 + {0.625, 0.625, 0.375, 0.75, 0.75, 0.5}, -- NodeBox168 + {0.5625, 0.5625, 0.375, 0.6875, 0.6875, 0.5}, -- NodeBox169 + {0.375, 0.375, 0.375, 0.625, 0.625, 0.5}, -- NodeBox170 + {0.3125, 0.3125, 0.375, 0.4375, 0.4375, 0.5}, -- NodeBox171 + {0.25, 0.25, 0.375, 0.375, 0.375, 0.5}, -- NodeBox172 + {0.1875, 0.1875, 0.375, 0.3125, 0.3125, 0.5}, -- NodeBox173 + {0.125, 0.125, 0.375, 0.25, 0.25, 0.5}, -- NodeBox174 + {0.0625, 0.0625, 0.375, 0.1875, 0.1875, 0.5}, -- NodeBox175 + {0, 0, 0.375, 0.125, 0.125, 0.5}, -- NodeBox176 + {-0.0625, -0.0625, 0.375, 0.0625, 0.0625, 0.5}, -- NodeBox177 + {-0.125, -0.125, 0.375, 0, 0, 0.5}, -- NodeBox178 + {-0.1875, -0.1875, 0.375, -0.0625, -0.0625, 0.5}, -- NodeBox179 + {-0.25, -0.25, 0.375, -0.125, -0.125, 0.5}, -- NodeBox180 + {-0.3125, -0.3125, 0.375, -0.1875, -0.1875, 0.5}, -- NodeBox181 + {-0.375, -0.375, 0.375, -0.25, -0.25, 0.5}, -- NodeBox182 + {-0.4375, -0.4375, 0.375, -0.3125, -0.3125, 0.5}, -- NodeBox183 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_substructure_mid_"..bridge_colors, { + description = bridge_desc.." Truss Substructure Middle", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_substructure_mid.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_substructure_mid.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, -0.375, 0.5}, -- NodeBox121 + {-0.5, 1.375, 0.375, 1.5, 1.5, 0.5}, -- NodeBox122 + {-0.4375, 1.3125, 0.375, -0.3125, 1.4375, 0.5}, -- NodeBox126 + {-0.375, 1.25, 0.375, -0.25, 1.375, 0.5}, -- NodeBox127 + {-0.3125, 1.1875, 0.375, -0.1875, 1.3125, 0.5}, -- NodeBox128 + {-0.25, 1.125, 0.375, -0.125, 1.25, 0.5}, -- NodeBox129 + {-0.1875, 1.0625, 0.375, -0.0625, 1.1875, 0.5}, -- NodeBox130 + {-0.125, 1, 0.375, 0, 1.125, 0.5}, -- NodeBox131 + {-0.0625, 0.9375, 0.375, 0.0625, 1.0625, 0.5}, -- NodeBox132 + {0, 0.875, 0.375, 0.125, 1, 0.5}, -- NodeBox133 + {0.0625, 0.8125, 0.375, 0.1875, 0.9375, 0.5}, -- NodeBox134 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox135 + {0.1875, 0.6875, 0.375, 0.3125, 0.8125, 0.5}, -- NodeBox136 + {0.25, 0.625, 0.375, 0.375, 0.75, 0.5}, -- NodeBox137 + {0.3125, 0.5625, 0.375, 0.4375, 0.6875, 0.5}, -- NodeBox138 + {0.375, 0.5, 0.375, 0.5, 0.625, 0.5}, -- NodeBox139 + {0.4375, 0.4375, 0.375, 0.5625, 0.5625, 0.5}, -- NodeBox140 + {0.5, 0.375, 0.375, 0.625, 0.5, 0.5}, -- NodeBox141 + {0.5625, 0.3125, 0.375, 0.6875, 0.4375, 0.5}, -- NodeBox142 + {0.625, 0.25, 0.375, 0.75, 0.375, 0.5}, -- NodeBox143 + {0.6875, 0.1875, 0.375, 0.8125, 0.3125, 0.5}, -- NodeBox144 + {0.75, 0.125, 0.375, 0.875, 0.25, 0.5}, -- NodeBox145 + {0.8125, 0.0625, 0.375, 0.9375, 0.1875, 0.5}, -- NodeBox146 + {0.875, 0, 0.375, 1, 0.125, 0.5}, -- NodeBox147 + {0.9375, -0.0625, 0.375, 1.0625, 0.0625, 0.5}, -- NodeBox148 + {1, -0.125, 0.375, 1.125, 0, 0.5}, -- NodeBox149 + {1.0625, -0.1875, 0.375, 1.1875, -0.0625, 0.5}, -- NodeBox150 + {1.125, -0.25, 0.375, 1.25, -0.125, 0.5}, -- NodeBox151 + {1.1875, -0.3125, 0.375, 1.3125, -0.1875, 0.5}, -- NodeBox152 + {1.25, -0.375, 0.375, 1.375, -0.25, 0.5}, -- NodeBox153 + {1.3125, -0.4375, 0.375, 1.4375, -0.3125, 0.5}, -- NodeBox154 + {1.3125, 1.3125, 0.375, 1.4375, 1.4375, 0.5}, -- NodeBox157 + {1.25, 1.25, 0.375, 1.375, 1.375, 0.5}, -- NodeBox158 + {1.1875, 1.1875, 0.375, 1.3125, 1.3125, 0.5}, -- NodeBox159 + {1.125, 1.125, 0.375, 1.25, 1.25, 0.5}, -- NodeBox160 + {1.0625, 1.0625, 0.375, 1.1875, 1.1875, 0.5}, -- NodeBox161 + {1, 1, 0.375, 1.125, 1.125, 0.5}, -- NodeBox162 + {0.9375, 0.9375, 0.375, 1.0625, 1.0625, 0.5}, -- NodeBox163 + {0.875, 0.875, 0.375, 1, 1, 0.5}, -- NodeBox164 + {0.8125, 0.8125, 0.375, 0.9375, 0.9375, 0.5}, -- NodeBox165 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox166 + {0.6875, 0.6875, 0.375, 0.8125, 0.8125, 0.5}, -- NodeBox167 + {0.625, 0.625, 0.375, 0.75, 0.75, 0.5}, -- NodeBox168 + {0.5625, 0.5625, 0.375, 0.6875, 0.6875, 0.5}, -- NodeBox169 + {0.375, 0.375, 0.375, 0.625, 0.625, 0.5}, -- NodeBox170 + {0.3125, 0.3125, 0.375, 0.4375, 0.4375, 0.5}, -- NodeBox171 + {0.25, 0.25, 0.375, 0.375, 0.375, 0.5}, -- NodeBox172 + {0.1875, 0.1875, 0.375, 0.3125, 0.3125, 0.5}, -- NodeBox173 + {0.125, 0.125, 0.375, 0.25, 0.25, 0.5}, -- NodeBox174 + {0.0625, 0.0625, 0.375, 0.1875, 0.1875, 0.5}, -- NodeBox175 + {0, 0, 0.375, 0.125, 0.125, 0.5}, -- NodeBox176 + {-0.0625, -0.0625, 0.375, 0.0625, 0.0625, 0.5}, -- NodeBox177 + {-0.125, -0.125, 0.375, 0, 0, 0.5}, -- NodeBox178 + {-0.1875, -0.1875, 0.375, -0.0625, -0.0625, 0.5}, -- NodeBox179 + {-0.25, -0.25, 0.375, -0.125, -0.125, 0.5}, -- NodeBox180 + {-0.3125, -0.3125, 0.375, -0.1875, -0.1875, 0.5}, -- NodeBox181 + {-0.375, -0.375, 0.375, -0.25, -0.25, 0.5}, -- NodeBox182 + {-0.4375, -0.4375, 0.375, -0.3125, -0.3125, 0.5}, -- NodeBox183 + {1.4375, -0.5, 0.375, 1.5, 1.5, 0.5}, -- NodeBox184 + {-0.5, -0.5, 0.375, -0.4375, 1.5, 0.5}, -- NodeBox185 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 1.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:small_upper_chord_"..bridge_colors, { + description = bridge_desc.." Small Upper Chord", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_small_upper_chord.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_small_upper_chord.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.375, 0.4375, 0.5, 0.5, 0.5}, -- NodeBox250 + {0.4375, 0.375, -1.5, 0.5, 0.5, 0.5}, -- NodeBox251 + {-0.5, 0.375, -1.5, 0.5, 0.5, -1.4375}, -- NodeBox252 + {-0.5, 0.375, -1.5, -0.4375, 0.5, 0.5}, -- NodeBox253 + {-0.4375, 0.375, 0.25, -0.3125, 0.5, 0.4375}, -- NodeBox260 + {-0.375, 0.375, 0.125, -0.25, 0.5, 0.3125}, -- NodeBox261 + {-0.3125, 0.375, 0, -0.1875, 0.5, 0.1875}, -- NodeBox262 + {-0.25, 0.375, -0.125, -0.125, 0.5, 0.0625}, -- NodeBox263 + {-0.1875, 0.375, -0.25, -0.0625, 0.5, -0.0625}, -- NodeBox264 + {-0.4375, 0.375, -1.4375, -0.3125, 0.5, -1.25}, -- NodeBox265 + {-0.375, 0.375, -1.3125, -0.25, 0.5, -1.125}, -- NodeBox266 + {-0.3125, 0.375, -1.1875, -0.1875, 0.5, -1}, -- NodeBox267 + {-0.25, 0.375, -1.0625, -0.125, 0.5, -0.875}, -- NodeBox268 + {-0.1875, 0.375, -0.9375, -0.0625, 0.5, -0.75}, -- NodeBox269 + {-0.125, 0.375, -0.8125, 0, 0.5, -0.625}, -- NodeBox270 + {-0.125, 0.375, -0.375, 0, 0.5, -0.1875}, -- NodeBox271 + {0.3125, 0.375, 0.25, 0.4375, 0.5, 0.4375}, -- NodeBox272 + {0.25, 0.375, 0.125, 0.375, 0.5, 0.3125}, -- NodeBox273 + {0.1875, 0.375, 0, 0.3125, 0.5, 0.1875}, -- NodeBox274 + {0.125, 0.375, -0.125, 0.25, 0.5, 0.0625}, -- NodeBox275 + {0.0625, 0.375, -0.25, 0.1875, 0.5, -0.0625}, -- NodeBox276 + {0, 0.375, -0.375, 0.125, 0.5, -0.1875}, -- NodeBox277 + {-0.0625, 0.375, -0.625, 0.0625, 0.5, -0.375}, -- NodeBox278 + {0.3125, 0.375, -1.4375, 0.4375, 0.5, -1.25}, -- NodeBox279 + {0.25, 0.375, -1.3125, 0.375, 0.5, -1.125}, -- NodeBox280 + {0.1875, 0.375, -1.1875, 0.3125, 0.5, -1}, -- NodeBox281 + {0.125, 0.375, -1.0625, 0.25, 0.5, -0.875}, -- NodeBox282 + {0.0625, 0.375, -0.9375, 0.1875, 0.5, -0.75}, -- NodeBox283 + {0, 0.375, -0.8125, 0.125, 0.5, -0.625}, -- NodeBox284 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, 0, -1.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:small_upper_chord_slanted_"..bridge_colors, { + description = bridge_desc.." Small Slanted Upper Chord", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_small_upper_chord_slanted.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5625, -1.5, -0.4375, -0.4375, -1.375}, -- NodeBox1 + {-0.5, -0.5625, -1.5, 0.5, -0.4375, -1.4375}, -- NodeBox2 + {0.4375, -0.5625, -1.5, 0.5, -0.4375, -1.375}, -- NodeBox3 + {0.4375, -0.5, -1.375, 0.5, -0.375, -1.25}, -- NodeBox4 + {0.4375, -0.4375, -1.25, 0.5, -0.3125, -1.125}, -- NodeBox5 + {0.4375, -0.375, -1.125, 0.5, -0.25, -1}, -- NodeBox6 + {0.4375, -0.3125, -1, 0.5, -0.1875, -0.875}, -- NodeBox7 + {0.4375, -0.25, -0.875, 0.5, -0.125, -0.75}, -- NodeBox8 + {0.4375, -0.1875, -0.75, 0.5, -0.0625, -0.625}, -- NodeBox9 + {0.4375, -0.125, -0.625, 0.5, -2.23517e-008, -0.5}, -- NodeBox10 + {0.4375, -0.0625, -0.5, 0.5, 0.0625, -0.375}, -- NodeBox11 + {0.4375, 0, -0.375, 0.5, 0.125, -0.25}, -- NodeBox12 + {0.4375, 0.0625, -0.25, 0.5, 0.1875, -0.125}, -- NodeBox13 + {0.4375, 0.125, -0.125, 0.5, 0.25, -1.04308e-007}, -- NodeBox14 + {0.4375, 0.1875, 0, 0.5, 0.3125, 0.125}, -- NodeBox15 + {0.4375, 0.25, 0.125, 0.5, 0.375, 0.25}, -- NodeBox16 + {0.4375, 0.3125, 0.25, 0.5, 0.4375, 0.375}, -- NodeBox17 + {0.4375, 0.375, 0.375, 0.5, 0.5, 0.5}, -- NodeBox18 + {-0.5, 0.375, 0.4375, 0.5, 0.5, 0.5}, -- NodeBox19 + {-0.5, -0.5, -1.375, -0.4375, -0.375, -1.25}, -- NodeBox20 + {-0.5, -0.4375, -1.25, -0.4375, -0.3125, -1.125}, -- NodeBox21 + {-0.5, -0.375, -1.125, -0.4375, -0.25, -1}, -- NodeBox22 + {-0.5, -0.3125, -1, -0.4375, -0.1875, -0.875}, -- NodeBox23 + {-0.5, -0.25, -0.875, -0.4375, -0.125, -0.75}, -- NodeBox24 + {-0.5, -0.1875, -0.75, -0.4375, -0.0625, -0.625}, -- NodeBox25 + {-0.5, -0.125, -0.625, -0.4375, 1.11759e-008, -0.5}, -- NodeBox26 + {-0.5, -0.0625, -0.5, -0.4375, 0.0625, -0.375}, -- NodeBox27 + {-0.5, 0, -0.375, -0.4375, 0.125, -0.25}, -- NodeBox28 + {-0.5, 0.0625, -0.25, -0.4375, 0.1875, -0.125}, -- NodeBox29 + {-0.5, 0.125, -0.125, -0.4375, 0.25, 1.41561e-007}, -- NodeBox30 + {-0.5, 0.1875, 0, -0.4375, 0.3125, 0.125}, -- NodeBox31 + {-0.5, 0.25, 0.125, -0.4375, 0.375, 0.25}, -- NodeBox32 + {-0.5, 0.3125, 0.25, -0.4375, 0.4375, 0.375}, -- NodeBox33 + {-0.5, 0.375, 0.375, -0.4375, 0.5, 0.5}, -- NodeBox34 + {-0.4375, -0.5625, -1.5, -0.3125, -0.4375, -1.375}, -- NodeBox35 + {-0.4375, -0.5, -1.375, -0.3125, -0.375, -1.25}, -- NodeBox36 + {-0.375, -0.5, -1.3125, -0.25, -0.375, -1.25}, -- NodeBox37 + {-0.375, -0.4375, -1.25, -0.25, -0.3125, -1.125}, -- NodeBox38 + {-0.3125, -0.4375, -1.1875, -0.1875, -0.3125, -1.125}, -- NodeBox39 + {-0.3125, -0.375, -1.125, -0.1875, -0.25, -1}, -- NodeBox40 + {-0.25, -0.375, -1.0625, -0.125, -0.25, -1}, -- NodeBox41 + {-0.25, -0.3125, -1, -0.125, -0.1875, -0.875}, -- NodeBox42 + {-0.1875, -0.3125, -0.9375, -0.0625, -0.1875, -0.875}, -- NodeBox43 + {-0.1875, -0.25, -0.875, -0.0624999, -0.125, -0.75}, -- NodeBox44 + {-0.125, -0.25, -0.8125, 0.125, -0.125, -0.75}, -- NodeBox45 + {-0.125, -0.1875, -0.75, 0.125, -0.0624999, -0.625}, -- NodeBox46 + {-0.0625, -0.125, -0.625, 0.0625, 9.31323e-008, -0.5}, -- NodeBox47 + {-0.0625, -0.0625, -0.5, 0.0625, 0.0625001, -0.375}, -- NodeBox48 + {-0.125, 0, -0.375, 0.125, 0.125, -0.25}, -- NodeBox49 + {-0.4375, 0.375, 0.375, -0.3125, 0.5, 0.4375}, -- NodeBox62 + {-0.4375, 0.3125, 0.25, -0.3125, 0.4375, 0.375}, -- NodeBox63 + {-0.375, 0.25, 0.125, -0.25, 0.375, 0.25}, -- NodeBox64 + {-0.375, 0.3125, 0.25, -0.25, 0.4375, 0.3125}, -- NodeBox65 + {-0.3125, 0.25, 0.125, -0.1875, 0.375, 0.1875}, -- NodeBox66 + {-0.3125, 0.1875, 0, -0.1875, 0.3125, 0.125}, -- NodeBox67 + {-0.25, 0.1875, 0, -0.125, 0.3125, 0.0625}, -- NodeBox68 + {-0.25, 0.125, -0.125, -0.125, 0.25, 1.30385e-008}, -- NodeBox69 + {-0.1875, 0.125, -0.125, -0.0625, 0.25, -0.0625}, -- NodeBox70 + {-0.1875, 0.0625, -0.25, -0.0625, 0.1875, -0.125}, -- NodeBox71 + {-0.125, 0.0625, -0.25, 0.125, 0.1875, -0.1875}, -- NodeBox72 + {0.0625, 0.0625, -0.25, 0.1875, 0.1875, -0.125}, -- NodeBox73 + {0.0625, 0.125, -0.125, 0.1875, 0.25, -0.0625}, -- NodeBox74 + {0.125, 0.125, -0.125, 0.25, 0.25, 0}, -- NodeBox75 + {0.125, 0.1875, 0, 0.25, 0.3125, 0.0625}, -- NodeBox76 + {0.1875, 0.1875, 0, 0.3125, 0.3125, 0.125}, -- NodeBox77 + {0.1875, 0.25, 0.125, 0.3125, 0.375, 0.1875}, -- NodeBox78 + {0.25, 0.25, 0.125, 0.375, 0.375, 0.25}, -- NodeBox79 + {0.25, 0.3125, 0.25, 0.375, 0.4375, 0.3125}, -- NodeBox80 + {0.3125, 0.3125, 0.3125, 0.4375, 0.4375, 0.375}, -- NodeBox81 + {0.3125, 0.375, 0.375, 0.4375, 0.5, 0.4375}, -- NodeBox82 + {0.3125, -0.5625, -1.4375, 0.4375, -0.4375, -1.375}, -- NodeBox83 + {0.3125, -0.5, -1.375, 0.4375, -0.375, -1.25}, -- NodeBox84 + {0.25, -0.5, -1.3125, 0.375, -0.375, -1.25}, -- NodeBox85 + {0.25, -0.4375, -1.25, 0.375, -0.3125, -1.125}, -- NodeBox86 + {0.1875, -0.4375, -1.1875, 0.3125, -0.3125, -1.125}, -- NodeBox87 + {0.1875, -0.375, -1.125, 0.3125, -0.25, -1}, -- NodeBox88 + {0.125, -0.375, -1.0625, 0.25, -0.25, -1}, -- NodeBox89 + {0.125, -0.3125, -1, 0.25, -0.1875, -0.875}, -- NodeBox90 + {0.0625, -0.3125, -0.9375, 0.1875, -0.1875, -0.875}, -- NodeBox91 + {0.0625, -0.25, -0.875, 0.1875, -0.125, -0.75}, -- NodeBox92 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:medium_upper_chord_"..bridge_colors, { + description = bridge_desc.." Medium Upper Chord", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_medium_upper_chord.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_medium_upper_chord.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1.5, 0.375, 0.4375, 1.5, 0.5, 0.5}, -- NodeBox250 + {1.4375, 0.375, -1.5, 1.5, 0.5, 0.5}, -- NodeBox251 + {-1.5, 0.375, -1.5, 1.5, 0.5, -1.4375}, -- NodeBox252 + {-1.5, 0.375, -1.5, -1.4375, 0.5, 0.5}, -- NodeBox253 + {-1.4375, 0.375, 0.3125, -1.3125, 0.5, 0.4375}, -- NodeBox285 + {-1.375, 0.375, 0.25, -1.1875, 0.5, 0.375}, -- NodeBox286 + {-1.25, 0.375, 0.1875, -1.125, 0.5, 0.3125}, -- NodeBox287 + {-1.1875, 0.375, 0.125, -1, 0.5, 0.25}, -- NodeBox289 + {-1.0625, 0.375, 0.0625, -0.9375, 0.5, 0.1875}, -- NodeBox290 + {-1, 0.375, 0, -0.8125, 0.5, 0.125}, -- NodeBox291 + {-0.875, 0.375, -0.0625, -0.75, 0.5, 0.0625}, -- NodeBox292 + {-0.8125, 0.375, -0.125, -0.625, 0.5, 0}, -- NodeBox293 + {-0.6875, 0.375, -0.1875, -0.5625, 0.5, -0.0625}, -- NodeBox294 + {-0.625, 0.375, -0.25, -0.4375, 0.5, -0.125}, -- NodeBox295 + {-0.5, 0.375, -0.3125, -0.375, 0.5, -0.1875}, -- NodeBox296 + {-0.4375, 0.375, -0.375, -0.25, 0.5, -0.25}, -- NodeBox297 + {-0.3125, 0.375, -0.4375, -0.1875, 0.5, -0.3125}, -- NodeBox298 + {-0.25, 0.375, -0.5, -0.0625, 0.5, -0.375}, -- NodeBox299 + {-0.125, 0.375, -0.5625, 0.125, 0.5, -0.4375}, -- NodeBox300 + {1.3125, 0.375, -1.4375, 1.4375, 0.5, -1.3125}, -- NodeBox301 + {1.1875, 0.375, -1.375, 1.375, 0.5, -1.25}, -- NodeBox302 + {1.125, 0.375, -1.3125, 1.25, 0.5, -1.1875}, -- NodeBox303 + {1, 0.375, -1.25, 1.1875, 0.5, -1.125}, -- NodeBox304 + {0.9375, 0.375, -1.1875, 1.0625, 0.5, -1.0625}, -- NodeBox305 + {0.8125, 0.375, -1.125, 1, 0.5, -1}, -- NodeBox306 + {0.75, 0.375, -1.0625, 0.875, 0.5, -0.9375}, -- NodeBox307 + {0.625, 0.375, -1, 0.8125, 0.5, -0.875}, -- NodeBox308 + {0.5625, 0.375, -0.9375, 0.6875, 0.5, -0.8125}, -- NodeBox309 + {0.4375, 0.375, -0.875, 0.625, 0.5, -0.75}, -- NodeBox310 + {0.375, 0.375, -0.8125, 0.5, 0.5, -0.6875}, -- NodeBox311 + {0.25, 0.375, -0.75, 0.4375, 0.5, -0.625}, -- NodeBox312 + {0.1875, 0.375, -0.6875, 0.3125, 0.5, -0.5625}, -- NodeBox313 + {0.0625, 0.375, -0.625, 0.25, 0.5, -0.5}, -- NodeBox314 + {1.3125, 0.375, 0.3125, 1.4375, 0.5, 0.4375}, -- NodeBox315 + {1.1875, 0.375, 0.25, 1.375, 0.5, 0.375}, -- NodeBox316 + {1.125, 0.375, 0.1875, 1.25, 0.5, 0.3125}, -- NodeBox317 + {1, 0.375, 0.125, 1.1875, 0.5, 0.25}, -- NodeBox318 + {0.9375, 0.375, 0.0625, 1.0625, 0.5, 0.1875}, -- NodeBox319 + {0.8125, 0.375, 0, 1, 0.5, 0.125}, -- NodeBox320 + {0.75, 0.375, -0.0625, 0.875, 0.5, 0.0625}, -- NodeBox321 + {0.625, 0.375, -0.125, 0.8125, 0.5, 0}, -- NodeBox322 + {0.5625, 0.375, -0.1875, 0.6875, 0.5, -0.0625}, -- NodeBox323 + {0.4375, 0.375, -0.25, 0.625, 0.5, -0.125}, -- NodeBox324 + {0.375, 0.375, -0.3125, 0.5, 0.5, -0.1875}, -- NodeBox325 + {0.25, 0.375, -0.375, 0.4375, 0.5, -0.25}, -- NodeBox326 + {0.1875, 0.375, -0.4375, 0.3125, 0.5, -0.3125}, -- NodeBox327 + {0.0625, 0.375, -0.5, 0.25, 0.5, -0.375}, -- NodeBox328 + {-1.4375, 0.375, -1.4375, -1.3125, 0.5, -1.3125}, -- NodeBox329 + {-1.375, 0.375, -1.375, -1.1875, 0.5, -1.25}, -- NodeBox330 + {-1.25, 0.375, -1.3125, -1.125, 0.5, -1.1875}, -- NodeBox331 + {-1.1875, 0.375, -1.25, -1, 0.5, -1.125}, -- NodeBox332 + {-1.0625, 0.375, -1.1875, -0.9375, 0.5, -1.0625}, -- NodeBox333 + {-1, 0.375, -1.125, -0.8125, 0.5, -1}, -- NodeBox334 + {-0.875, 0.375, -1.0625, -0.75, 0.5, -0.9375}, -- NodeBox335 + {-0.8125, 0.375, -1, -0.625, 0.5, -0.875}, -- NodeBox336 + {-0.6875, 0.375, -0.9375, -0.5625, 0.5, -0.8125}, -- NodeBox337 + {-0.625, 0.375, -0.875, -0.4375, 0.5, -0.75}, -- NodeBox338 + {-0.5, 0.375, -0.8125, -0.375, 0.5, -0.6875}, -- NodeBox339 + {-0.4375, 0.375, -0.75, -0.25, 0.5, -0.625}, -- NodeBox340 + {-0.3125, 0.375, -0.6875, -0.1875, 0.5, -0.5625}, -- NodeBox341 + {-0.25, 0.375, -0.625, -0.0625, 0.5, -0.5}, -- NodeBox342 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.5, 0, -1.5, 1.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:medium_upper_chord_slanted_"..bridge_colors, { + description = bridge_desc.." Medium Slanted Upper Chord", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_medium_upper_chord_slanted.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1.5, -0.5625, -1.5, -1.4375, -0.4375, -1.375}, -- NodeBox1 + {-1.5, -0.5625, -1.5, 1.5, -0.4375, -1.4375}, -- NodeBox2 + {1.4375, -0.5625, -1.5, 1.5, -0.4375, -1.375}, -- NodeBox3 + {1.4375, -0.5, -1.375, 1.5, -0.375, -1.25}, -- NodeBox4 + {1.4375, -0.4375, -1.25, 1.5, -0.3125, -1.125}, -- NodeBox5 + {1.4375, -0.375, -1.125, 1.5, -0.25, -1}, -- NodeBox6 + {1.4375, -0.3125, -1, 1.5, -0.1875, -0.875}, -- NodeBox7 + {1.4375, -0.25, -0.875, 1.5, -0.125, -0.75}, -- NodeBox8 + {1.4375, -0.1875, -0.75, 1.5, -0.0625, -0.625}, -- NodeBox9 + {1.4375, -0.125, -0.625, 1.5, -2.23517e-008, -0.5}, -- NodeBox10 + {1.4375, -0.0625, -0.5, 1.5, 0.0625, -0.375}, -- NodeBox11 + {1.4375, 0, -0.375, 1.5, 0.125, -0.25}, -- NodeBox12 + {1.4375, 0.0625, -0.25, 1.5, 0.1875, -0.125}, -- NodeBox13 + {1.4375, 0.125, -0.125, 1.5, 0.25, -9.68575e-008}, -- NodeBox14 + {1.4375, 0.1875, 0, 1.5, 0.3125, 0.125}, -- NodeBox15 + {1.4375, 0.25, 0.125, 1.5, 0.375, 0.25}, -- NodeBox16 + {1.4375, 0.3125, 0.25, 1.5, 0.4375, 0.375}, -- NodeBox17 + {1.4375, 0.375, 0.375, 1.5, 0.5, 0.5}, -- NodeBox18 + {-1.5, 0.375, 0.4375, 1.5, 0.5, 0.5}, -- NodeBox19 + {-1.5, -0.5, -1.375, -1.4375, -0.375, -1.25}, -- NodeBox20 + {-1.5, -0.4375, -1.25, -1.4375, -0.3125, -1.125}, -- NodeBox21 + {-1.5, -0.375, -1.125, -1.4375, -0.25, -1}, -- NodeBox22 + {-1.5, -0.3125, -1, -1.4375, -0.1875, -0.875}, -- NodeBox23 + {-1.5, -0.25, -0.875, -1.4375, -0.125, -0.75}, -- NodeBox24 + {-1.5, -0.1875, -0.75, -1.4375, -0.0625, -0.625}, -- NodeBox25 + {-1.5, -0.125, -0.625, -1.4375, 1.11759e-008, -0.5}, -- NodeBox26 + {-1.5, -0.0625, -0.5, -1.4375, 0.0625, -0.375}, -- NodeBox27 + {-1.5, 0, -0.375, -1.4375, 0.125, -0.25}, -- NodeBox28 + {-1.5, 0.0625, -0.25, -1.4375, 0.1875, -0.125}, -- NodeBox29 + {-1.5, 0.125, -0.125, -1.4375, 0.25, 1.49012e-007}, -- NodeBox30 + {-1.5, 0.1875, 0, -1.4375, 0.3125, 0.125}, -- NodeBox31 + {-1.5, 0.25, 0.125, -1.4375, 0.375, 0.25}, -- NodeBox32 + {-1.5, 0.3125, 0.25, -1.4375, 0.4375, 0.375}, -- NodeBox33 + {-1.5, 0.375, 0.375, -1.4375, 0.5, 0.5}, -- NodeBox34 + {-1.4375, -0.5625, -1.4375, -1.3125, -0.4375, -1.375}, -- NodeBox93 + {-1.4375, -0.5, -1.375, -1.1875, -0.375, -1.3125}, -- NodeBox94 + {-1.375, -0.5, -1.3125, -1.125, -0.375, -1.25}, -- NodeBox95 + {-1.25, -0.4375, -1.25, -1, -0.3125, -1.1875}, -- NodeBox96 + {-1.1875, -0.4375, -1.1875, -0.9375, -0.3125, -1.125}, -- NodeBox97 + {-1.0625, -0.375, -1.125, -0.8125, -0.25, -1.0625}, -- NodeBox98 + {-1, -0.375, -1.0625, -0.75, -0.25, -1}, -- NodeBox99 + {-0.875, -0.3125, -1, -0.625, -0.1875, -0.9375}, -- NodeBox100 + {-0.8125, -0.3125, -0.9375, -0.5625, -0.1875, -0.875}, -- NodeBox101 + {-0.6875, -0.25, -0.875, -0.4375, -0.125, -0.8125}, -- NodeBox102 + {-0.625, -0.25, -0.8125, -0.375, -0.125, -0.75}, -- NodeBox103 + {-0.5, -0.1875, -0.75, -0.25, -0.0625, -0.6875}, -- NodeBox104 + {-0.4375, -0.1875, -0.6875, -0.1875, -0.0625, -0.625}, -- NodeBox105 + {-0.3125, -0.125, -0.625, -0.0625, 3.35276e-008, -0.5625}, -- NodeBox106 + {-0.25, -0.125, -0.5625, 0.25, 3.35276e-008, -0.5}, -- NodeBox107 + {-0.25, -0.0625, -0.5, 0.25, 0.0625, -0.4375}, -- NodeBox108 + {-0.3125, -0.0625, -0.4375, -0.0625, 0.0625, -0.375}, -- NodeBox109 + {-0.4375, 0, -0.375, -0.1875, 0.125, -0.3125}, -- NodeBox110 + {-0.5, 0, -0.3125, -0.25, 0.125, -0.25}, -- NodeBox111 + {-0.625, 0.0625, -0.25, -0.375, 0.1875, -0.1875}, -- NodeBox112 + {-0.6875, 0.0625, -0.1875, -0.4375, 0.1875, -0.125}, -- NodeBox113 + {-0.8125, 0.125, -0.125, -0.5625, 0.25, -0.0625001}, -- NodeBox114 + {-0.875, 0.125, -0.0625, -0.625, 0.25, -9.87202e-008}, -- NodeBox115 + {-1, 0.1875, 0, -0.75, 0.3125, 0.0624999}, -- NodeBox116 + {-1.0625, 0.1875, 0.0625, -0.8125, 0.3125, 0.125}, -- NodeBox117 + {-1.1875, 0.25, 0.125, -0.9375, 0.375, 0.1875}, -- NodeBox118 + {-1.25, 0.25, 0.1875, -1, 0.375, 0.25}, -- NodeBox119 + {-1.375, 0.3125, 0.25, -1.125, 0.4375, 0.3125}, -- NodeBox120 + {-1.4375, 0.3125, 0.3125, -1.1875, 0.4375, 0.375}, -- NodeBox121 + {-1.4375, 0.375, 0.375, -1.3125, 0.5, 0.4375}, -- NodeBox122 + {1.3125, 0.375, 0.375, 1.4375, 0.5, 0.4375}, -- NodeBox123 + {1.1875, 0.3125, 0.3125, 1.4375, 0.4375, 0.375}, -- NodeBox124 + {1.125, 0.3125, 0.25, 1.375, 0.4375, 0.3125}, -- NodeBox125 + {1, 0.25, 0.1875, 1.25, 0.375, 0.25}, -- NodeBox126 + {0.9375, 0.25, 0.125, 1.1875, 0.375, 0.1875}, -- NodeBox127 + {0.8125, 0.1875, 0.0625, 1.0625, 0.3125, 0.125}, -- NodeBox128 + {0.75, 0.1875, 0, 1, 0.3125, 0.0624999}, -- NodeBox129 + {0.625, 0.125, -0.0625, 0.875, 0.25, -1.2666e-007}, -- NodeBox130 + {0.5625, 0.125, -0.125, 0.8125, 0.25, -0.0625001}, -- NodeBox131 + {0.4375, 0.0625, -0.1875, 0.6875, 0.1875, -0.125}, -- NodeBox132 + {0.375, 0.0625, -0.25, 0.625, 0.1875, -0.1875}, -- NodeBox133 + {0.25, 0, -0.3125, 0.5, 0.125, -0.25}, -- NodeBox134 + {0.1875, 0, -0.375, 0.4375, 0.125, -0.3125}, -- NodeBox135 + {0.0625, -0.0625, -0.4375, 0.3125, 0.0625, -0.375}, -- NodeBox136 + {0.0625, -0.125, -0.625, 0.3125, 3.72529e-009, -0.5625}, -- NodeBox137 + {0.1875, -0.1875, -0.6875, 0.4375, -0.0625, -0.625}, -- NodeBox138 + {0.25, -0.1875, -0.75, 0.5, -0.0625, -0.6875}, -- NodeBox139 + {0.375, -0.25, -0.8125, 0.625, -0.125, -0.75}, -- NodeBox140 + {0.4375, -0.25, -0.875, 0.6875, -0.125, -0.8125}, -- NodeBox141 + {0.5625, -0.3125, -0.9375, 0.8125, -0.1875, -0.875}, -- NodeBox142 + {0.625, -0.3125, -1, 0.875, -0.1875, -0.9375}, -- NodeBox143 + {0.75, -0.375, -1.0625, 1, -0.25, -1}, -- NodeBox144 + {0.8125, -0.375, -1.125, 1.0625, -0.25, -1.0625}, -- NodeBox145 + {0.9375, -0.4375, -1.1875, 1.1875, -0.3125, -1.125}, -- NodeBox146 + {1, -0.4375, -1.25, 1.25, -0.3125, -1.1875}, -- NodeBox147 + {1.125, -0.5, -1.3125, 1.375, -0.375, -1.25}, -- NodeBox148 + {1.1875, -0.5, -1.375, 1.4375, -0.375, -1.3125}, -- NodeBox149 + {1.3125, -0.5625, -1.4375, 1.4375, -0.4375, -1.375}, -- NodeBox150 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, -1.5, 1.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:large_upper_chord_"..bridge_colors, { + description = bridge_desc.." Large Upper Chord", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_large_upper_chord.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_large_upper_chord.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-2.5, 0.375, 0.4375, 2.5, 0.5, 0.5}, -- NodeBox250 + {2.4375, 0.375, -1.5, 2.5, 0.5, 0.5}, -- NodeBox251 + {-2.5, 0.375, -1.5, 2.5, 0.5, -1.4375}, -- NodeBox252 + {-2.5, 0.375, -1.5, -2.4375, 0.5, 0.5}, -- NodeBox253 + {-2.4375, 0.375, 0.3125, -2.1875, 0.5, 0.4375}, -- NodeBox343 + {-2.3125, 0.375, 0.25, -2, 0.5, 0.375}, -- NodeBox344 + {-2.125, 0.375, 0.1875, -1.875, 0.5, 0.3125}, -- NodeBox345 + {-2, 0.375, 0.125, -1.6875, 0.5, 0.25}, -- NodeBox346 + {-1.875, 0.375, 0.0625, -1.5, 0.5, 0.1875}, -- NodeBox347 + {-1.625, 0.375, 0, -1.375, 0.5, 0.125}, -- NodeBox348 + {-1.5, 0.375, -0.0625, -1.1875, 0.5, 0.0625}, -- NodeBox349 + {-1.3125, 0.375, -0.125, -1, 0.5, 0}, -- NodeBox350 + {-1.125, 0.375, -0.1875, -0.875, 0.5, -0.0625}, -- NodeBox351 + {-1, 0.375, -0.25, -0.6875, 0.5, -0.125}, -- NodeBox352 + {-0.8125, 0.375, -0.3125, -0.5, 0.5, -0.1875}, -- NodeBox353 + {-0.625, 0.375, -0.375, -0.375, 0.5, -0.25}, -- NodeBox354 + {-0.5, 0.375, -0.4375, -0.1875, 0.5, -0.3125}, -- NodeBox355 + {2.1875, 0.375, 0.3125, 2.4375, 0.5, 0.4375}, -- NodeBox356 + {2, 0.375, 0.25, 2.3125, 0.5, 0.375}, -- NodeBox357 + {1.875, 0.375, 0.1875, 2.125, 0.5, 0.3125}, -- NodeBox358 + {1.6875, 0.375, 0.125, 2, 0.5, 0.25}, -- NodeBox359 + {1.5, 0.375, 0.0625, 1.8125, 0.5, 0.1875}, -- NodeBox360 + {1.1875, 0.375, -0.0625, 1.5, 0.5, 0.0625}, -- NodeBox361 + {1.375, 0.375, 0, 1.625, 0.5, 0.125}, -- NodeBox362 + {1, 0.375, -0.125, 1.3125, 0.5, 0}, -- NodeBox363 + {0.875, 0.375, -0.1875, 1.125, 0.5, -0.0625}, -- NodeBox364 + {0.6875, 0.375, -0.25, 1, 0.5, -0.125}, -- NodeBox365 + {0.5, 0.375, -0.3125, 0.8125, 0.5, -0.1875}, -- NodeBox366 + {0.375, 0.375, -0.375, 0.625, 0.5, -0.25}, -- NodeBox367 + {0.1875, 0.375, -0.4375, 0.5, 0.5, -0.3125}, -- NodeBox368 + {-0.375, 0.375, -0.625, 0.3125, 0.5, -0.375}, -- NodeBox369 + {2.1875, 0.375, -1.4375, 2.4375, 0.5, -1.3125}, -- NodeBox370 + {2, 0.375, -1.375, 2.3125, 0.5, -1.25}, -- NodeBox371 + {1.875, 0.375, -1.3125, 2.125, 0.5, -1.1875}, -- NodeBox372 + {1.6875, 0.375, -1.25, 2, 0.5, -1.125}, -- NodeBox373 + {1.5, 0.375, -1.1875, 1.8125, 0.5, -1.0625}, -- NodeBox374 + {1.375, 0.375, -1.125, 1.625, 0.5, -1}, -- NodeBox375 + {1.1875, 0.375, -1.0625, 1.5, 0.5, -0.9375}, -- NodeBox376 + {1, 0.375, -1, 1.3125, 0.5, -0.875}, -- NodeBox377 + {0.875, 0.375, -0.9375, 1.125, 0.5, -0.8125}, -- NodeBox378 + {0.6875, 0.375, -0.875, 1, 0.5, -0.75}, -- NodeBox379 + {0.5, 0.375, -0.8125, 0.8125, 0.5, -0.6875}, -- NodeBox380 + {0.375, 0.375, -0.75, 0.625, 0.5, -0.625}, -- NodeBox381 + {0.1875, 0.375, -0.6875, 0.5, 0.5, -0.5625}, -- NodeBox382 + {-2.4375, 0.375, -1.4375, -2.1875, 0.5, -1.3125}, -- NodeBox383 + {-2.3125, 0.375, -1.375, -2, 0.5, -1.25}, -- NodeBox384 + {-2.125, 0.375, -1.3125, -1.875, 0.5, -1.1875}, -- NodeBox385 + {-2, 0.375, -1.25, -1.6875, 0.5, -1.125}, -- NodeBox386 + {-1.8125, 0.375, -1.1875, -1.5, 0.5, -1.0625}, -- NodeBox387 + {-1.625, 0.375, -1.125, -1.375, 0.5, -1}, -- NodeBox388 + {-1.5, 0.375, -1.0625, -1.1875, 0.5, -0.9375}, -- NodeBox389 + {-1.3125, 0.375, -1, -1, 0.5, -0.875}, -- NodeBox390 + {-1.125, 0.375, -0.9375, -0.875, 0.5, -0.8125}, -- NodeBox391 + {-1, 0.375, -0.875, -0.6875, 0.5, -0.75}, -- NodeBox392 + {-0.8125, 0.375, -0.8125, -0.5, 0.5, -0.6875}, -- NodeBox393 + {-0.625, 0.375, -0.75, -0.375, 0.5, -0.625}, -- NodeBox394 + {-0.5, 0.375, -0.6875, -0.1875, 0.5, -0.5625}, -- NodeBox395 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-2.5, 0, -1.5, 2.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:large_upper_chord_slanted_"..bridge_colors, { + description = bridge_desc.." Large Slanted Upper Chord", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_large_upper_chord_slanted.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-2.5, -0.5625, -1.5, -2.4375, -0.4375, -1.375}, -- NodeBox1 + {-2.5, -0.5625, -1.5, 2.5, -0.4375, -1.4375}, -- NodeBox2 + {2.4375, -0.5625, -1.5, 2.5, -0.4375, -1.375}, -- NodeBox3 + {2.4375, -0.5, -1.375, 2.5, -0.375, -1.25}, -- NodeBox4 + {2.4375, -0.4375, -1.25, 2.5, -0.3125, -1.125}, -- NodeBox5 + {2.4375, -0.375, -1.125, 2.5, -0.25, -1}, -- NodeBox6 + {2.4375, -0.3125, -1, 2.5, -0.1875, -0.875}, -- NodeBox7 + {2.4375, -0.25, -0.875, 2.5, -0.125, -0.75}, -- NodeBox8 + {2.4375, -0.1875, -0.75, 2.5, -0.0625, -0.625}, -- NodeBox9 + {2.4375, -0.125, -0.625, 2.5, -2.23517e-008, -0.5}, -- NodeBox10 + {2.4375, -0.0625, -0.5, 2.5, 0.0625, -0.375}, -- NodeBox11 + {2.4375, 0, -0.375, 2.5, 0.125, -0.25}, -- NodeBox12 + {2.4375, 0.0625, -0.25, 2.5, 0.1875, -0.125}, -- NodeBox13 + {2.4375, 0.125, -0.125, 2.5, 0.25, -9.68575e-008}, -- NodeBox14 + {2.4375, 0.1875, 0, 2.5, 0.3125, 0.125}, -- NodeBox15 + {2.4375, 0.25, 0.125, 2.5, 0.375, 0.25}, -- NodeBox16 + {2.4375, 0.3125, 0.25, 2.5, 0.4375, 0.375}, -- NodeBox17 + {2.4375, 0.375, 0.375, 2.5, 0.5, 0.5}, -- NodeBox18 + {-2.5, 0.375, 0.4375, 2.5, 0.5, 0.5}, -- NodeBox19 + {-2.5, -0.5, -1.375, -2.4375, -0.375, -1.25}, -- NodeBox20 + {-2.5, -0.4375, -1.25, -2.4375, -0.3125, -1.125}, -- NodeBox21 + {-2.5, -0.375, -1.125, -2.4375, -0.25, -1}, -- NodeBox22 + {-2.5, -0.3125, -1, -2.4375, -0.1875, -0.875}, -- NodeBox23 + {-2.5, -0.25, -0.875, -2.4375, -0.125, -0.75}, -- NodeBox24 + {-2.5, -0.1875, -0.75, -2.4375, -0.0625, -0.625}, -- NodeBox25 + {-2.5, -0.125, -0.625, -2.4375, 1.11759e-008, -0.5}, -- NodeBox26 + {-2.5, -0.0625, -0.5, -2.4375, 0.0625, -0.375}, -- NodeBox27 + {-2.5, 0, -0.375, -2.4375, 0.125, -0.25}, -- NodeBox28 + {-2.5, 0.0625, -0.25, -2.4375, 0.1875, -0.125}, -- NodeBox29 + {-2.5, 0.125, -0.125, -2.4375, 0.25, 1.67638e-007}, -- NodeBox30 + {-2.5, 0.1875, 0, -2.4375, 0.3125, 0.125}, -- NodeBox31 + {-2.5, 0.25, 0.125, -2.4375, 0.375, 0.25}, -- NodeBox32 + {-2.5, 0.3125, 0.25, -2.4375, 0.4375, 0.375}, -- NodeBox33 + {-2.5, 0.375, 0.375, -2.4375, 0.5, 0.5}, -- NodeBox34 + {-2.4375, -0.5625, -1.4375, -2.1875, -0.4375, -1.375}, -- NodeBox164 + {-2.4375, -0.5625, -1.375, -2, -0.4375, -1.3125}, -- NodeBox165 + {-2.3125, -0.5625, -1.3125, -1.875, -0.4375, -1.25}, -- NodeBox166 + {-2.125, -0.4375, -1.25, -1.6875, -0.3125, -1.1875}, -- NodeBox167 + {-2, -0.4375, -1.1875, -1.5625, -0.3125, -1.125}, -- NodeBox168 + {-1.8125, -0.375, -1.125, -1.375, -0.25, -1.0625}, -- NodeBox169 + {-1.6875, -0.375, -1.0625, -1.25, -0.25, -1}, -- NodeBox170 + {-1.5, -0.3125, -1, -1.0625, -0.1875, -0.9375}, -- NodeBox171 + {-1.375, -0.3125, -0.9375, -0.937501, -0.1875, -0.875}, -- NodeBox172 + {-1.1875, -0.25, -0.875, -0.750001, -0.125, -0.8125}, -- NodeBox173 + {-1.0625, -0.25, -0.8125, -0.625001, -0.125, -0.75}, -- NodeBox174 + {-0.875, -0.1875, -0.75, -0.437501, -0.0624999, -0.6875}, -- NodeBox175 + {-0.75, -0.1875, -0.6875, -0.312501, -0.0624999, -0.625}, -- NodeBox176 + {-0.5625, -0.125, -0.625, -0.125001, 1.60187e-007, -0.5625}, -- NodeBox177 + {-0.4375, -0.125, -0.5625, 0.4375, 1.56462e-007, -0.5}, -- NodeBox178 + {-0.4375, -0.0625, -0.5, 0.4375, 0.0625001, -0.4375}, -- NodeBox179 + {-0.5625, -0.0625, -0.4375, -0.125, 0.0625001, -0.375}, -- NodeBox180 + {-0.75, 0, -0.375, -0.3125, 0.125, -0.3125}, -- NodeBox181 + {-0.875, 0, -0.3125, -0.4375, 0.125, -0.25}, -- NodeBox182 + {-1.0625, 0.0625, -0.25, -0.625, 0.1875, -0.1875}, -- NodeBox183 + {-1.1875, 0.0625, -0.1875, -0.75, 0.1875, -0.125}, -- NodeBox184 + {-1.375, 0.125, -0.125, -0.9375, 0.25, -0.0625001}, -- NodeBox185 + {-1.5, 0.125, -0.0625, -1.0625, 0.25, -7.07805e-008}, -- NodeBox186 + {-1.6875, 0.1875, 0, -1.25, 0.3125, 0.0624999}, -- NodeBox187 + {-1.8125, 0.1875, 0.0625, -1.375, 0.3125, 0.125}, -- NodeBox188 + {-2, 0.25, 0.125, -1.5625, 0.375, 0.1875}, -- NodeBox189 + {-2.125, 0.25, 0.1875, -1.6875, 0.375, 0.25}, -- NodeBox190 + {-2.3125, 0.3125, 0.25, -1.875, 0.4375, 0.3125}, -- NodeBox191 + {-2.4375, 0.3125, 0.3125, -2, 0.4375, 0.375}, -- NodeBox192 + {-2.4375, 0.375, 0.375, -2.1875, 0.5, 0.4375}, -- NodeBox193 + {2.1875, 0.375, 0.375, 2.4375, 0.5, 0.4375}, -- NodeBox194 + {2, 0.3125, 0.3125, 2.4375, 0.4375, 0.375}, -- NodeBox195 + {1.875, 0.3125, 0.25, 2.3125, 0.4375, 0.3125}, -- NodeBox196 + {1.6875, 0.25, 0.1875, 2.125, 0.375, 0.25}, -- NodeBox197 + {1.5625, 0.25, 0.125, 2, 0.375, 0.1875}, -- NodeBox198 + {1.375, 0.1875, 0.0625, 1.8125, 0.3125, 0.125}, -- NodeBox199 + {1.25, 0.1875, 0, 1.6875, 0.3125, 0.0624999}, -- NodeBox200 + {1.0625, 0.125, -0.0625, 1.5, 0.25, -6.70552e-008}, -- NodeBox201 + {0.9375, 0.125, -0.125, 1.375, 0.25, -0.0625001}, -- NodeBox202 + {0.75, 0.0625, -0.1875, 1.1875, 0.1875, -0.125}, -- NodeBox203 + {0.625, 0.0625, -0.25, 1.0625, 0.1875, -0.1875}, -- NodeBox204 + {0.4375, 0, -0.3125, 0.875, 0.125, -0.25}, -- NodeBox205 + {0.3125, 0, -0.375, 0.75, 0.125, -0.3125}, -- NodeBox206 + {0.125, 0, -0.4375, 0.5625, 0.125, -0.375}, -- NodeBox207 + {0.125, -0.125, -0.625, 0.5625, 1.22935e-007, -0.5625}, -- NodeBox208 + {0.3125, -0.1875, -0.6875, 0.75, -0.0624999, -0.625}, -- NodeBox209 + {0.4375, -0.1875, -0.75, 0.875, -0.0624999, -0.6875}, -- NodeBox210 + {0.625, -0.25, -0.8125, 1.0625, -0.125, -0.75}, -- NodeBox211 + {0.75, -0.25, -0.875, 1.1875, -0.125, -0.8125}, -- NodeBox212 + {0.9375, -0.3125, -0.9375, 1.375, -0.1875, -0.875}, -- NodeBox213 + {1.0625, -0.3125, -1, 1.5, -0.1875, -0.9375}, -- NodeBox214 + {1.25, -0.375, -1.0625, 1.6875, -0.25, -1}, -- NodeBox215 + {1.375, -0.375, -1.125, 1.8125, -0.25, -1.0625}, -- NodeBox216 + {1.5625, -0.4375, -1.1875, 2, -0.3125, -1.125}, -- NodeBox217 + {1.6875, -0.4375, -1.25, 2.125, -0.3125, -1.1875}, -- NodeBox218 + {1.875, -0.5, -1.3125, 2.3125, -0.375, -1.25}, -- NodeBox219 + {2, -0.5, -1.375, 2.4375, -0.375, -1.3125}, -- NodeBox220 + {2.1875, -0.5625, -1.4375, 2.4375, -0.4375, -1.375}, -- NodeBox221 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-2.5, -0.5, -1.5, 2.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:small_support_"..bridge_colors, { + description = bridge_desc.." Small Support", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_small_support.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_small_support.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {0.375, -0.5, -0.5, 0.5, 0.5, -0.375}, -- NodeBox1 + {-0.5, -0.5, -0.5, -0.375, 0.5, -0.375}, -- NodeBox2 + {-0.4375, -0.4375, -0.5, -0.3125, -0.3125, -0.375}, -- NodeBox3 + {-0.375, -0.375, -0.5, -0.25, -0.25, -0.375}, -- NodeBox4 + {-0.3125, -0.3125, -0.5, -0.1875, -0.1875, -0.375}, -- NodeBox5 + {-0.25, -0.25, -0.5, -0.125, -0.125, -0.375}, -- NodeBox6 + {-0.1875, -0.1875, -0.5, -0.0625, -0.0625, -0.375}, -- NodeBox7 + {-0.125, -0.125, -0.5, 0.125, 0.125, -0.375}, -- NodeBox8 + {0.0625, 0.0625, -0.5, 0.1875, 0.1875, -0.375}, -- NodeBox9 + {0.125, 0.125, -0.5, 0.25, 0.25, -0.375}, -- NodeBox10 + {0.1875, 0.1875, -0.5, 0.3125, 0.3125, -0.375}, -- NodeBox11 + {0.25, 0.25, -0.5, 0.375, 0.375, -0.375}, -- NodeBox12 + {0.3125, 0.3125, -0.5, 0.4375, 0.4375, -0.375}, -- NodeBox13 + {-0.4375, 0.3125, -0.5, -0.3125, 0.4375, -0.375}, -- NodeBox14 + {-0.375, 0.25, -0.5, -0.25, 0.375, -0.375}, -- NodeBox15 + {-0.3125, 0.1875, -0.5, -0.1875, 0.3125, -0.375}, -- NodeBox16 + {-0.25, 0.125, -0.5, -0.125, 0.25, -0.375}, -- NodeBox17 + {-0.1875, 0.0625, -0.5, -0.0625, 0.1875, -0.375}, -- NodeBox18 + {0.0625, -0.1875, -0.5, 0.1875, -0.0625, -0.375}, -- NodeBox19 + {0.125, -0.25, -0.5, 0.25, -0.125, -0.375}, -- NodeBox20 + {0.1875, -0.3125, -0.5, 0.3125, -0.1875, -0.375}, -- NodeBox21 + {0.25, -0.375, -0.5, 0.375, -0.25, -0.375}, -- NodeBox22 + {0.3125, -0.4375, -0.5, 0.4375, -0.3125, -0.375}, -- NodeBox23 + {-0.5, -0.4375, 0.3125, -0.375, -0.3125, 0.4375}, -- NodeBox3 + {-0.5, -0.375, 0.25, -0.375, -0.25, 0.375}, -- NodeBox4 + {-0.5, -0.3125, 0.1875, -0.375, -0.1875, 0.3125}, -- NodeBox5 + {-0.5, -0.25, 0.125, -0.375, -0.125, 0.25}, -- NodeBox6 + {-0.5, -0.1875, 0.0625, -0.375, -0.0625, 0.1875}, -- NodeBox7 + {-0.5, -0.125, -0.125, -0.375, 0.125, 0.125}, -- NodeBox8 + {-0.5, 0.0625, -0.1875, -0.375, 0.1875, -0.0625}, -- NodeBox9 + {-0.5, 0.125, -0.25, -0.375, 0.25, -0.125}, -- NodeBox10 + {-0.5, 0.1875, -0.3125, -0.375, 0.3125, -0.1875}, -- NodeBox11 + {-0.5, 0.25, -0.375, -0.375, 0.375, -0.25}, -- NodeBox12 + {-0.5, 0.3125, -0.4375, -0.375, 0.4375, -0.3125}, -- NodeBox13 + {-0.5, 0.3125, 0.3125, -0.375, 0.4375, 0.4375}, -- NodeBox14 + {-0.5, 0.25, 0.25, -0.375, 0.375, 0.375}, -- NodeBox15 + {-0.5, 0.1875, 0.1875, -0.375, 0.3125, 0.3125}, -- NodeBox16 + {-0.5, 0.125, 0.125, -0.375, 0.25, 0.25}, -- NodeBox17 + {-0.5, 0.0625, 0.0625, -0.375, 0.1875, 0.1875}, -- NodeBox18 + {-0.5, -0.1875, -0.1875, -0.375, -0.0625, -0.0625}, -- NodeBox19 + {-0.5, -0.25, -0.25, -0.375, -0.125, -0.125}, -- NodeBox20 + {-0.5, -0.3125, -0.3125, -0.375, -0.1875, -0.1875}, -- NodeBox21 + {-0.5, -0.375, -0.375, -0.375, -0.25, -0.25}, -- NodeBox22 + {-0.5, -0.4375, -0.4375, -0.375, -0.3125, -0.3125}, -- NodeBox23 + {0.3125, -0.4375, 0.375, 0.4375, -0.3125, 0.5}, -- NodeBox3 + {0.25, -0.375, 0.375, 0.375, -0.25, 0.5}, -- NodeBox4 + {0.1875, -0.3125, 0.375, 0.3125, -0.1875, 0.5}, -- NodeBox5 + {0.125, -0.25, 0.375, 0.25, -0.125, 0.5}, -- NodeBox6 + {0.0625, -0.1875, 0.375, 0.1875, -0.0625, 0.5}, -- NodeBox7 + {-0.125, -0.125, 0.375, 0.125, 0.125, 0.5}, -- NodeBox8 + {-0.1875, 0.0625, 0.375, -0.0625, 0.1875, 0.5}, -- NodeBox9 + {-0.25, 0.125, 0.375, -0.125, 0.25, 0.5}, -- NodeBox10 + {-0.3125, 0.1875, 0.375, -0.1875, 0.3125, 0.5}, -- NodeBox11 + {-0.375, 0.25, 0.375, -0.25, 0.375, 0.5}, -- NodeBox12 + {-0.4375, 0.3125, 0.375, -0.3125, 0.4375, 0.5}, -- NodeBox13 + {0.3125, 0.3125, 0.375, 0.4375, 0.4375, 0.5}, -- NodeBox14 + {0.25, 0.25, 0.375, 0.375, 0.375, 0.5}, -- NodeBox15 + {0.1875, 0.1875, 0.375, 0.3125, 0.3125, 0.5}, -- NodeBox16 + {0.125, 0.125, 0.375, 0.25, 0.25, 0.5}, -- NodeBox17 + {0.0625, 0.0625, 0.375, 0.1875, 0.1875, 0.5}, -- NodeBox18 + {-0.1875, -0.1875, 0.375, -0.0625, -0.0625, 0.5}, -- NodeBox19 + {-0.25, -0.25, 0.375, -0.125, -0.125, 0.5}, -- NodeBox20 + {-0.3125, -0.3125, 0.375, -0.1875, -0.1875, 0.5}, -- NodeBox21 + {-0.375, -0.375, 0.375, -0.25, -0.25, 0.5}, -- NodeBox22 + {-0.4375, -0.4375, 0.375, -0.3125, -0.3125, 0.5}, -- NodeBox23 + {0.375, -0.4375, -0.4375, 0.5, -0.3125, -0.3125}, -- NodeBox3 + {0.375, -0.375, -0.375, 0.5, -0.25, -0.25}, -- NodeBox4 + {0.375, -0.3125, -0.3125, 0.5, -0.1875, -0.1875}, -- NodeBox5 + {0.375, -0.25, -0.25, 0.5, -0.125, -0.125}, -- NodeBox6 + {0.375, -0.1875, -0.1875, 0.5, -0.0625, -0.0625}, -- NodeBox7 + {0.375, -0.125, -0.125, 0.5, 0.125, 0.125}, -- NodeBox8 + {0.375, 0.0625, 0.0625, 0.5, 0.1875, 0.1875}, -- NodeBox9 + {0.375, 0.125, 0.125, 0.5, 0.25, 0.25}, -- NodeBox10 + {0.375, 0.1875, 0.1875, 0.5, 0.3125, 0.3125}, -- NodeBox11 + {0.375, 0.25, 0.25, 0.5, 0.375, 0.375}, -- NodeBox12 + {0.375, 0.3125, 0.3125, 0.5, 0.4375, 0.4375}, -- NodeBox13 + {0.375, 0.3125, -0.4375, 0.5, 0.4375, -0.3125}, -- NodeBox14 + {0.375, 0.25, -0.375, 0.5, 0.375, -0.25}, -- NodeBox15 + {0.375, 0.1875, -0.3125, 0.5, 0.3125, -0.1875}, -- NodeBox16 + {0.375, 0.125, -0.25, 0.5, 0.25, -0.125}, -- NodeBox17 + {0.375, 0.0625, -0.1875, 0.5, 0.1875, -0.0625}, -- NodeBox18 + {0.375, -0.1875, 0.0625, 0.5, -0.0625, 0.1875}, -- NodeBox19 + {0.375, -0.25, 0.125, 0.5, -0.125, 0.25}, -- NodeBox20 + {0.375, -0.3125, 0.1875, 0.5, -0.1875, 0.3125}, -- NodeBox21 + {0.375, -0.375, 0.25, 0.5, -0.25, 0.375}, -- NodeBox22 + {0.375, -0.4375, 0.3125, 0.5, -0.3125, 0.4375}, -- NodeBox23 + {-0.5, -0.5, 0.375, -0.375, 0.5, 0.5}, -- NodeBox1 + {0.375, -0.5, 0.375, 0.5, 0.5, 0.5}, -- NodeBox2 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:small_support_top_"..bridge_colors, { + description = bridge_desc.." Small Support Top", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_small_support_top.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_small_support_top.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {0.375, -0.5, -0.5, 0.5, 1.5, -0.375}, -- NodeBox1 + {-0.5, -0.5, -0.5, -0.375, 1.5, -0.375}, -- NodeBox2 + {0.3125, -0.4375, -0.5, 0.4375, -0.3125, -0.375}, -- NodeBox3 + {0.25, -0.375, -0.5, 0.375, -0.25, -0.375}, -- NodeBox4 + {0.1875, -0.3125, -0.5, 0.3125, -0.1875, -0.375}, -- NodeBox5 + {0.125, -0.25, -0.5, 0.25, -0.125, -0.375}, -- NodeBox6 + {0.0625, -0.1875, -0.5, 0.1875, -0.0625, -0.375}, -- NodeBox7 + {-0.125, -0.125, -0.5, 0.125, 0.125, -0.375}, -- NodeBox8 + {-0.1875, -0.1875, -0.5, -0.0625, -0.0625, -0.375}, -- NodeBox9 + {-0.25, -0.25, -0.5, -0.125, -0.125, -0.375}, -- NodeBox10 + {-0.3125, -0.3125, -0.5, -0.1875, -0.1875, -0.375}, -- NodeBox11 + {-0.375, -0.375, -0.5, -0.25, -0.25, -0.375}, -- NodeBox12 + {-0.4375, -0.4375, -0.5, -0.3125, -0.3125, -0.375}, -- NodeBox13 + {0.0625, 0.0625, -0.5, 0.1875, 0.1875, -0.375}, -- NodeBox14 + {0.125, 0.125, -0.5, 0.25, 0.25, -0.375}, -- NodeBox15 + {0.1875, 0.1875, -0.5, 0.3125, 0.3125, -0.375}, -- NodeBox16 + {0.25, 0.25, -0.5, 0.375, 0.375, -0.375}, -- NodeBox17 + {0.3125, 0.3125, -0.5, 0.4375, 0.4375, -0.375}, -- NodeBox18 + {-0.1875, 0.0625, -0.5, -0.0625, 0.1875, -0.375}, -- NodeBox19 + {-0.25, 0.125, -0.5, -0.125, 0.25, -0.375}, -- NodeBox20 + {-0.3125, 0.1875, -0.5, -0.1875, 0.3125, -0.375}, -- NodeBox21 + {-0.375, 0.25, -0.5, -0.25, 0.375, -0.375}, -- NodeBox22 + {-0.4375, 0.3125, -0.5, -0.3125, 0.4375, -0.375}, -- NodeBox23 + {-0.4375, 0.5625, -0.5, -0.3125, 0.6875, -0.375}, -- NodeBox24 + {-0.375, 0.625, -0.5, -0.25, 0.75, -0.375}, -- NodeBox25 + {-0.3125, 0.6875, -0.5, -0.1875, 0.8125, -0.375}, -- NodeBox26 + {-0.25, 0.75, -0.5, -0.125, 0.875, -0.375}, -- NodeBox27 + {-0.1875, 0.8125, -0.5, -0.0625001, 0.9375, -0.375}, -- NodeBox28 + {0.3125, 0.5625, -0.5, 0.4375, 0.6875, -0.375}, -- NodeBox29 + {0.25, 0.625, -0.5, 0.375, 0.75, -0.375}, -- NodeBox30 + {0.1875, 0.6875, -0.5, 0.3125, 0.8125, -0.375}, -- NodeBox31 + {0.125, 0.75, -0.5, 0.25, 0.875, -0.375}, -- NodeBox32 + {0.0625, 0.8125, -0.5, 0.1875, 0.9375, -0.375}, -- NodeBox33 + {-0.125, 0.875, -0.5, 0.125, 1.125, -0.375}, -- NodeBox34 + {0.0625, 1.0625, -0.5, 0.1875, 1.1875, -0.375}, -- NodeBox35 + {0.125, 1.125, -0.5, 0.25, 1.25, -0.375}, -- NodeBox36 + {0.1875, 1.1875, -0.5, 0.3125, 1.3125, -0.375}, -- NodeBox37 + {0.25, 1.25, -0.5, 0.375, 1.375, -0.375}, -- NodeBox38 + {0.3125, 1.3125, -0.5, 0.4375, 1.4375, -0.375}, -- NodeBox39 + {-0.1875, 1.0625, -0.5, -0.0625, 1.1875, -0.375}, -- NodeBox40 + {-0.25, 1.125, -0.5, -0.125, 1.25, -0.375}, -- NodeBox41 + {-0.3125, 1.1875, -0.5, -0.1875, 1.3125, -0.375}, -- NodeBox42 + {-0.375, 1.25, -0.5, -0.25, 1.375, -0.375}, -- NodeBox43 + {-0.4375, 1.3125, -0.5, -0.3125, 1.4375, -0.375}, -- NodeBox44 + {-0.5, -0.5, 0.375, -0.375, 1.5, 0.5}, -- NodeBox1 + {0.375, -0.5, 0.375, 0.5, 1.5, 0.5}, -- NodeBox2 + {-0.4375, -0.4375, 0.375, -0.3125, -0.3125, 0.5}, -- NodeBox3 + {-0.375, -0.375, 0.375, -0.25, -0.25, 0.5}, -- NodeBox4 + {-0.3125, -0.3125, 0.375, -0.1875, -0.1875, 0.5}, -- NodeBox5 + {-0.25, -0.25, 0.375, -0.125, -0.125, 0.5}, -- NodeBox6 + {-0.1875, -0.1875, 0.375, -0.0625, -0.0625, 0.5}, -- NodeBox7 + {-0.125, -0.125, 0.375, 0.125, 0.125, 0.5}, -- NodeBox8 + {0.0625, -0.1875, 0.375, 0.1875, -0.0625, 0.5}, -- NodeBox9 + {0.125, -0.25, 0.375, 0.25, -0.125, 0.5}, -- NodeBox10 + {0.1875, -0.3125, 0.375, 0.3125, -0.1875, 0.5}, -- NodeBox11 + {0.25, -0.375, 0.375, 0.375, -0.25, 0.5}, -- NodeBox12 + {0.3125, -0.4375, 0.375, 0.4375, -0.3125, 0.5}, -- NodeBox13 + {-0.1875, 0.0625, 0.375, -0.0625, 0.1875, 0.5}, -- NodeBox14 + {-0.25, 0.125, 0.375, -0.125, 0.25, 0.5}, -- NodeBox15 + {-0.3125, 0.1875, 0.375, -0.1875, 0.3125, 0.5}, -- NodeBox16 + {-0.375, 0.25, 0.375, -0.25, 0.375, 0.5}, -- NodeBox17 + {-0.4375, 0.3125, 0.375, -0.3125, 0.4375, 0.5}, -- NodeBox18 + {0.0625, 0.0625, 0.375, 0.1875, 0.1875, 0.5}, -- NodeBox19 + {0.125, 0.125, 0.375, 0.25, 0.25, 0.5}, -- NodeBox20 + {0.1875, 0.1875, 0.375, 0.3125, 0.3125, 0.5}, -- NodeBox21 + {0.25, 0.25, 0.375, 0.375, 0.375, 0.5}, -- NodeBox22 + {0.3125, 0.3125, 0.375, 0.4375, 0.4375, 0.5}, -- NodeBox23 + {0.3125, 0.5625, 0.375, 0.4375, 0.6875, 0.5}, -- NodeBox24 + {0.25, 0.625, 0.375, 0.375, 0.75, 0.5}, -- NodeBox25 + {0.1875, 0.6875, 0.375, 0.3125, 0.8125, 0.5}, -- NodeBox26 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox27 + {0.0625001, 0.8125, 0.375, 0.1875, 0.9375, 0.5}, -- NodeBox28 + {-0.4375, 0.5625, 0.375, -0.3125, 0.6875, 0.5}, -- NodeBox29 + {-0.375, 0.625, 0.375, -0.25, 0.75, 0.5}, -- NodeBox30 + {-0.3125, 0.6875, 0.375, -0.1875, 0.8125, 0.5}, -- NodeBox31 + {-0.25, 0.75, 0.375, -0.125, 0.875, 0.5}, -- NodeBox32 + {-0.1875, 0.8125, 0.375, -0.0625, 0.9375, 0.5}, -- NodeBox33 + {-0.125, 0.875, 0.375, 0.125, 1.125, 0.5}, -- NodeBox34 + {-0.1875, 1.0625, 0.375, -0.0625, 1.1875, 0.5}, -- NodeBox35 + {-0.25, 1.125, 0.375, -0.125, 1.25, 0.5}, -- NodeBox36 + {-0.3125, 1.1875, 0.375, -0.1875, 1.3125, 0.5}, -- NodeBox37 + {-0.375, 1.25, 0.375, -0.25, 1.375, 0.5}, -- NodeBox38 + {-0.4375, 1.3125, 0.375, -0.3125, 1.4375, 0.5}, -- NodeBox39 + {0.0625, 1.0625, 0.375, 0.1875, 1.1875, 0.5}, -- NodeBox40 + {0.125, 1.125, 0.375, 0.25, 1.25, 0.5}, -- NodeBox41 + {0.1875, 1.1875, 0.375, 0.3125, 1.3125, 0.5}, -- NodeBox42 + {0.25, 1.25, 0.375, 0.375, 1.375, 0.5}, -- NodeBox43 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox44 + {0.375, -0.4375, 0.3125, 0.5, -0.3125, 0.4375}, -- NodeBox3 + {0.375, -0.375, 0.25, 0.5, -0.25, 0.375}, -- NodeBox4 + {0.375, -0.3125, 0.1875, 0.5, -0.1875, 0.3125}, -- NodeBox5 + {0.375, -0.25, 0.125, 0.5, -0.125, 0.25}, -- NodeBox6 + {0.375, -0.1875, 0.0625, 0.5, -0.0625, 0.1875}, -- NodeBox7 + {0.375, -0.125, -0.125, 0.5, 0.125, 0.125}, -- NodeBox8 + {0.375, -0.1875, -0.1875, 0.5, -0.0625, -0.0625}, -- NodeBox9 + {0.375, -0.25, -0.25, 0.5, -0.125, -0.125}, -- NodeBox10 + {0.375, -0.3125, -0.3125, 0.5, -0.1875, -0.1875}, -- NodeBox11 + {0.375, -0.375, -0.375, 0.5, -0.25, -0.25}, -- NodeBox12 + {0.375, -0.4375, -0.4375, 0.5, -0.3125, -0.3125}, -- NodeBox13 + {0.375, 0.0625, 0.0625, 0.5, 0.1875, 0.1875}, -- NodeBox14 + {0.375, 0.125, 0.125, 0.5, 0.25, 0.25}, -- NodeBox15 + {0.375, 0.1875, 0.1875, 0.5, 0.3125, 0.3125}, -- NodeBox16 + {0.375, 0.25, 0.25, 0.5, 0.375, 0.375}, -- NodeBox17 + {0.375, 0.3125, 0.3125, 0.5, 0.4375, 0.4375}, -- NodeBox18 + {0.375, 0.0625, -0.1875, 0.5, 0.1875, -0.0625}, -- NodeBox19 + {0.375, 0.125, -0.25, 0.5, 0.25, -0.125}, -- NodeBox20 + {0.375, 0.1875, -0.3125, 0.5, 0.3125, -0.1875}, -- NodeBox21 + {0.375, 0.25, -0.375, 0.5, 0.375, -0.25}, -- NodeBox22 + {0.375, 0.3125, -0.4375, 0.5, 0.4375, -0.3125}, -- NodeBox23 + {0.375, 0.5625, -0.4375, 0.5, 0.6875, -0.3125}, -- NodeBox24 + {0.375, 0.625, -0.375, 0.5, 0.75, -0.25}, -- NodeBox25 + {0.375, 0.6875, -0.3125, 0.5, 0.8125, -0.1875}, -- NodeBox26 + {0.375, 0.75, -0.25, 0.5, 0.875, -0.125}, -- NodeBox27 + {0.375, 0.8125, -0.1875, 0.5, 0.9375, -0.0625001}, -- NodeBox28 + {0.375, 0.5625, 0.3125, 0.5, 0.6875, 0.4375}, -- NodeBox29 + {0.375, 0.625, 0.25, 0.5, 0.75, 0.375}, -- NodeBox30 + {0.375, 0.6875, 0.1875, 0.5, 0.8125, 0.3125}, -- NodeBox31 + {0.375, 0.75, 0.125, 0.5, 0.875, 0.25}, -- NodeBox32 + {0.375, 0.8125, 0.0625, 0.5, 0.9375, 0.1875}, -- NodeBox33 + {0.375, 0.875, -0.125, 0.5, 1.125, 0.125}, -- NodeBox34 + {0.375, 1.0625, 0.0625, 0.5, 1.1875, 0.1875}, -- NodeBox35 + {0.375, 1.125, 0.125, 0.5, 1.25, 0.25}, -- NodeBox36 + {0.375, 1.1875, 0.1875, 0.5, 1.3125, 0.3125}, -- NodeBox37 + {0.375, 1.25, 0.25, 0.5, 1.375, 0.375}, -- NodeBox38 + {0.375, 1.3125, 0.3125, 0.5, 1.4375, 0.4375}, -- NodeBox39 + {0.375, 1.0625, -0.1875, 0.5, 1.1875, -0.0625}, -- NodeBox40 + {0.375, 1.125, -0.25, 0.5, 1.25, -0.125}, -- NodeBox41 + {0.375, 1.1875, -0.3125, 0.5, 1.3125, -0.1875}, -- NodeBox42 + {0.375, 1.25, -0.375, 0.5, 1.375, -0.25}, -- NodeBox43 + {0.375, 1.3125, -0.4375, 0.5, 1.4375, -0.3125}, -- NodeBox44 + {-0.5, -0.4375, -0.4375, -0.375, -0.3125, -0.3125}, -- NodeBox3 + {-0.5, -0.375, -0.375, -0.375, -0.25, -0.25}, -- NodeBox4 + {-0.5, -0.3125, -0.3125, -0.375, -0.1875, -0.1875}, -- NodeBox5 + {-0.5, -0.25, -0.25, -0.375, -0.125, -0.125}, -- NodeBox6 + {-0.5, -0.1875, -0.1875, -0.375, -0.0625, -0.0625}, -- NodeBox7 + {-0.5, -0.125, -0.125, -0.375, 0.125, 0.125}, -- NodeBox8 + {-0.5, -0.1875, 0.0625, -0.375, -0.0625, 0.1875}, -- NodeBox9 + {-0.5, -0.25, 0.125, -0.375, -0.125, 0.25}, -- NodeBox10 + {-0.5, -0.3125, 0.1875, -0.375, -0.1875, 0.3125}, -- NodeBox11 + {-0.5, -0.375, 0.25, -0.375, -0.25, 0.375}, -- NodeBox12 + {-0.5, -0.4375, 0.3125, -0.375, -0.3125, 0.4375}, -- NodeBox13 + {-0.5, 0.0625, -0.1875, -0.375, 0.1875, -0.0625}, -- NodeBox14 + {-0.5, 0.125, -0.25, -0.375, 0.25, -0.125}, -- NodeBox15 + {-0.5, 0.1875, -0.3125, -0.375, 0.3125, -0.1875}, -- NodeBox16 + {-0.5, 0.25, -0.375, -0.375, 0.375, -0.25}, -- NodeBox17 + {-0.5, 0.3125, -0.4375, -0.375, 0.4375, -0.3125}, -- NodeBox18 + {-0.5, 0.0625, 0.0625, -0.375, 0.1875, 0.1875}, -- NodeBox19 + {-0.5, 0.125, 0.125, -0.375, 0.25, 0.25}, -- NodeBox20 + {-0.5, 0.1875, 0.1875, -0.375, 0.3125, 0.3125}, -- NodeBox21 + {-0.5, 0.25, 0.25, -0.375, 0.375, 0.375}, -- NodeBox22 + {-0.5, 0.3125, 0.3125, -0.375, 0.4375, 0.4375}, -- NodeBox23 + {-0.5, 0.5625, 0.3125, -0.375, 0.6875, 0.4375}, -- NodeBox24 + {-0.5, 0.625, 0.25, -0.375, 0.75, 0.375}, -- NodeBox25 + {-0.5, 0.6875, 0.1875, -0.375, 0.8125, 0.3125}, -- NodeBox26 + {-0.5, 0.75, 0.125, -0.375, 0.875, 0.25}, -- NodeBox27 + {-0.5, 0.8125, 0.0625001, -0.375, 0.9375, 0.1875}, -- NodeBox28 + {-0.5, 0.5625, -0.4375, -0.375, 0.6875, -0.3125}, -- NodeBox29 + {-0.5, 0.625, -0.375, -0.375, 0.75, -0.25}, -- NodeBox30 + {-0.5, 0.6875, -0.3125, -0.375, 0.8125, -0.1875}, -- NodeBox31 + {-0.5, 0.75, -0.25, -0.375, 0.875, -0.125}, -- NodeBox32 + {-0.5, 0.8125, -0.1875, -0.375, 0.9375, -0.0625}, -- NodeBox33 + {-0.5, 0.875, -0.125, -0.375, 1.125, 0.125}, -- NodeBox34 + {-0.5, 1.0625, -0.1875, -0.375, 1.1875, -0.0625}, -- NodeBox35 + {-0.5, 1.125, -0.25, -0.375, 1.25, -0.125}, -- NodeBox36 + {-0.5, 1.1875, -0.3125, -0.375, 1.3125, -0.1875}, -- NodeBox37 + {-0.5, 1.25, -0.375, -0.375, 1.375, -0.25}, -- NodeBox38 + {-0.5, 1.3125, -0.4375, -0.375, 1.4375, -0.3125}, -- NodeBox39 + {-0.5, 1.0625, 0.0625, -0.375, 1.1875, 0.1875}, -- NodeBox40 + {-0.5, 1.125, 0.125, -0.375, 1.25, 0.25}, -- NodeBox41 + {-0.5, 1.1875, 0.1875, -0.375, 1.3125, 0.3125}, -- NodeBox42 + {-0.5, 1.25, 0.25, -0.375, 1.375, 0.375}, -- NodeBox43 + {-0.5, 1.3125, 0.3125, -0.375, 1.4375, 0.4375}, -- NodeBox44 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:medium_support_"..bridge_colors, { + description = bridge_desc.." Medium Support", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_medium_support.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_medium_support.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, 0.3125, -1.25, 2.5, 0.5625}, -- NodeBox1 + {1.25, -0.5, 0.3125, 1.5, 2.5, 0.5625}, -- NodeBox2 + {-1.4375, 2.3125, 0.375, -1.3125, 2.4375, 0.5}, -- NodeBox3 + {-1.375, 2.25, 0.375, -1.25, 2.375, 0.5}, -- NodeBox4 + {-1.3125, 2.1875, 0.375, -1.1875, 2.3125, 0.5}, -- NodeBox5 + {-1.25, 2.125, 0.375, -1.125, 2.25, 0.5}, -- NodeBox6 + {-1.1875, 2.0625, 0.375, -1.0625, 2.1875, 0.5}, -- NodeBox7 + {-1.125, 2, 0.375, -1, 2.125, 0.5}, -- NodeBox8 + {-1.0625, 1.9375, 0.375, -0.9375, 2.0625, 0.5}, -- NodeBox9 + {-1, 1.875, 0.375, -0.875, 2, 0.5}, -- NodeBox10 + {-0.9375, 1.8125, 0.375, -0.8125, 1.9375, 0.5}, -- NodeBox11 + {-0.875, 1.75, 0.375, -0.75, 1.875, 0.5}, -- NodeBox12 + {-0.8125, 1.6875, 0.375, -0.6875, 1.8125, 0.5}, -- NodeBox13 + {-0.75, 1.625, 0.375, -0.625, 1.75, 0.5}, -- NodeBox14 + {-0.6875, 1.5625, 0.375, -0.5625, 1.6875, 0.5}, -- NodeBox15 + {-0.625, 1.5, 0.375, -0.5, 1.625, 0.5}, -- NodeBox16 + {-0.5625, 1.4375, 0.375, -0.4375, 1.5625, 0.5}, -- NodeBox17 + {-0.5, 1.375, 0.375, -0.375, 1.5, 0.5}, -- NodeBox18 + {-0.4375, 1.3125, 0.375, -0.3125, 1.4375, 0.5}, -- NodeBox19 + {-0.375, 1.25, 0.375, -0.25, 1.375, 0.5}, -- NodeBox20 + {-0.3125, 1.1875, 0.375, -0.1875, 1.3125, 0.5}, -- NodeBox21 + {-0.25, 1.125, 0.375, -0.125, 1.25, 0.5}, -- NodeBox22 + {-0.1875, 1.0625, 0.375, -0.0625, 1.1875, 0.5}, -- NodeBox23 + {-0.125, 0.875, 0.375, 0.125, 1.125, 0.5}, -- NodeBox24 + {0.0625, 0.8125, 0.375, 0.1875, 0.9375, 0.5}, -- NodeBox25 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox26 + {0.1875, 0.6875, 0.375, 0.3125, 0.8125, 0.5}, -- NodeBox27 + {0.25, 0.625, 0.375, 0.375, 0.75, 0.5}, -- NodeBox28 + {0.3125, 0.5625, 0.375, 0.4375, 0.6875, 0.5}, -- NodeBox29 + {0.375, 0.5, 0.375, 0.5, 0.625, 0.5}, -- NodeBox30 + {0.4375, 0.4375, 0.375, 0.5625, 0.5625, 0.5}, -- NodeBox31 + {0.5, 0.375, 0.375, 0.625, 0.5, 0.5}, -- NodeBox32 + {0.5625, 0.3125, 0.375, 0.6875, 0.4375, 0.5}, -- NodeBox33 + {0.625, 0.25, 0.375, 0.75, 0.375, 0.5}, -- NodeBox34 + {0.6875, 0.1875, 0.375, 0.8125, 0.3125, 0.5}, -- NodeBox35 + {0.75, 0.125, 0.375, 0.875, 0.25, 0.5}, -- NodeBox36 + {0.8125, 0.0625, 0.375, 0.9375, 0.1875, 0.5}, -- NodeBox37 + {0.875, 0, 0.375, 1, 0.125, 0.5}, -- NodeBox38 + {0.9375, -0.0625, 0.375, 1.0625, 0.0625, 0.5}, -- NodeBox39 + {1, -0.125, 0.375, 1.125, 0, 0.5}, -- NodeBox40 + {1.0625, -0.1875, 0.375, 1.1875, -0.0625, 0.5}, -- NodeBox41 + {1.125, -0.25, 0.375, 1.25, -0.125, 0.5}, -- NodeBox42 + {1.1875, -0.3125, 0.375, 1.3125, -0.1875, 0.5}, -- NodeBox43 + {1.25, -0.375, 0.375, 1.375, -0.25, 0.5}, -- NodeBox44 + {1.3125, -0.4375, 0.375, 1.4375, -0.3125, 0.5}, -- NodeBox45 + {1.3125, 2.3125, 0.375, 1.4375, 2.4375, 0.5}, -- NodeBox3 + {1.25, 2.25, 0.375, 1.375, 2.375, 0.5}, -- NodeBox4 + {1.1875, 2.1875, 0.375, 1.3125, 2.3125, 0.5}, -- NodeBox5 + {1.125, 2.125, 0.375, 1.25, 2.25, 0.5}, -- NodeBox6 + {1.0625, 2.0625, 0.375, 1.1875, 2.1875, 0.5}, -- NodeBox7 + {1, 2, 0.375, 1.125, 2.125, 0.5}, -- NodeBox8 + {0.9375, 1.9375, 0.375, 1.0625, 2.0625, 0.5}, -- NodeBox9 + {0.875, 1.875, 0.375, 1, 2, 0.5}, -- NodeBox10 + {0.8125, 1.8125, 0.375, 0.9375, 1.9375, 0.5}, -- NodeBox11 + {0.75, 1.75, 0.375, 0.875, 1.875, 0.5}, -- NodeBox12 + {0.6875, 1.6875, 0.375, 0.8125, 1.8125, 0.5}, -- NodeBox13 + {0.625, 1.625, 0.375, 0.75, 1.75, 0.5}, -- NodeBox14 + {0.5625, 1.5625, 0.375, 0.6875, 1.6875, 0.5}, -- NodeBox15 + {0.5, 1.5, 0.375, 0.625, 1.625, 0.5}, -- NodeBox16 + {0.4375, 1.4375, 0.375, 0.5625, 1.5625, 0.5}, -- NodeBox17 + {0.375, 1.375, 0.375, 0.5, 1.5, 0.5}, -- NodeBox18 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox19 + {0.25, 1.25, 0.375, 0.375, 1.375, 0.5}, -- NodeBox20 + {0.1875, 1.1875, 0.375, 0.3125, 1.3125, 0.5}, -- NodeBox21 + {0.125, 1.125, 0.375, 0.25, 1.25, 0.5}, -- NodeBox22 + {0.0625, 1.0625, 0.375, 0.1875, 1.1875, 0.5}, -- NodeBox23 + {-0.1875, 0.8125, 0.375, -0.0625, 0.9375, 0.5}, -- NodeBox25 + {-0.25, 0.75, 0.375, -0.125, 0.875, 0.5}, -- NodeBox26 + {-0.3125, 0.6875, 0.375, -0.1875, 0.8125, 0.5}, -- NodeBox27 + {-0.375, 0.625, 0.375, -0.25, 0.75, 0.5}, -- NodeBox28 + {-0.4375, 0.5625, 0.375, -0.3125, 0.6875, 0.5}, -- NodeBox29 + {-0.5, 0.5, 0.375, -0.375, 0.625, 0.5}, -- NodeBox30 + {-0.5625, 0.4375, 0.375, -0.4375, 0.5625, 0.5}, -- NodeBox31 + {-0.625, 0.375, 0.375, -0.5, 0.5, 0.5}, -- NodeBox32 + {-0.6875, 0.3125, 0.375, -0.5625, 0.4375, 0.5}, -- NodeBox33 + {-0.75, 0.25, 0.375, -0.625, 0.375, 0.5}, -- NodeBox34 + {-0.8125, 0.1875, 0.375, -0.6875, 0.3125, 0.5}, -- NodeBox35 + {-0.875, 0.125, 0.375, -0.75, 0.25, 0.5}, -- NodeBox36 + {-0.9375, 0.0625, 0.375, -0.8125, 0.1875, 0.5}, -- NodeBox37 + {-1, 0, 0.375, -0.875, 0.125, 0.5}, -- NodeBox38 + {-1.0625, -0.0625, 0.375, -0.9375, 0.0625, 0.5}, -- NodeBox39 + {-1.125, -0.125, 0.375, -1, 0, 0.5}, -- NodeBox40 + {-1.1875, -0.1875, 0.375, -1.0625, -0.0625, 0.5}, -- NodeBox41 + {-1.25, -0.25, 0.375, -1.125, -0.125, 0.5}, -- NodeBox42 + {-1.3125, -0.3125, 0.375, -1.1875, -0.1875, 0.5}, -- NodeBox43 + {-1.375, -0.375, 0.375, -1.25, -0.25, 0.5}, -- NodeBox44 + {-1.4375, -0.4375, 0.375, -1.3125, -0.3125, 0.5}, -- NodeBox45 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, 0, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:medium_support_bot_"..bridge_colors, { + description = bridge_desc.." Bottom Medium Support", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_medium_support_bot.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_medium_support_bot.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1.5625, -0.5, 0.25, -1.1875, 0.5, 0.625}, -- NodeBox1 + {1.1875, -0.5, 0.25, 1.5625, 0.5, 0.625}, -- NodeBox2 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, 0, 1.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:large_support_"..bridge_colors, { + description = bridge_desc.." Large Support", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_large_support.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_large_support.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-2.5, -0.5, 0.3125, -2.25, 2.5, 0.5625}, -- NodeBox1 + {2.25, -0.5, 0.3125, 2.5, 2.5, 0.5625}, -- NodeBox2 + {2.25, 2.375, 0.375, 2.375, 2.5, 0.5}, -- NodeBox48 + {2.125, 2.3125, 0.375, 2.3125, 2.4375, 0.5}, -- NodeBox49 + {2, 2.25, 0.375, 2.1875, 2.375, 0.5}, -- NodeBox50 + {1.9375, 2.1875, 0.375, 2.0625, 2.3125, 0.5}, -- NodeBox51 + {1.8125, 2.125, 0.375, 2, 2.25, 0.5}, -- NodeBox52 + {1.75, 2.0625, 0.375, 1.875, 2.1875, 0.5}, -- NodeBox53 + {1.625, 2, 0.375, 1.8125, 2.125, 0.5}, -- NodeBox54 + {1.5, 1.9375, 0.375, 1.6875, 2.0625, 0.5}, -- NodeBox55 + {1.4375, 1.875, 0.375, 1.5625, 2, 0.5}, -- NodeBox56 + {1.3125, 1.8125, 0.375, 1.5, 1.9375, 0.5}, -- NodeBox57 + {1.25, 1.75, 0.375, 1.375, 1.875, 0.5}, -- NodeBox58 + {1.125, 1.6875, 0.375, 1.3125, 1.8125, 0.5}, -- NodeBox59 + {1, 1.625, 0.375, 1.1875, 1.75, 0.5}, -- NodeBox60 + {0.9375, 1.5625, 0.375, 1.0625, 1.6875, 0.5}, -- NodeBox61 + {0.8125, 1.5, 0.375, 1, 1.625, 0.5}, -- NodeBox62 + {0.75, 1.4375, 0.375, 0.875, 1.5625, 0.5}, -- NodeBox63 + {0.625, 1.375, 0.375, 0.8125, 1.5, 0.5}, -- NodeBox64 + {0.5, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox65 + {0.4375, 1.25, 0.375, 0.5625, 1.375, 0.5}, -- NodeBox66 + {0.3125, 1.1875, 0.375, 0.5, 1.3125, 0.5}, -- NodeBox67 + {0.25, 1.125, 0.375, 0.375, 1.25, 0.5}, -- NodeBox68 + {0.125, 1.0625, 0.375, 0.3125, 1.1875, 0.5}, -- NodeBox69 + {0, 1, 0.375, 0.1875, 1.125, 0.5}, -- NodeBox70 + {-2.375, -0.5, 0.375, -2.25, -0.375, 0.5}, -- NodeBox71 + {-2.3125, -0.4375, 0.375, -2.125, -0.3125, 0.5}, -- NodeBox72 + {-2.1875, -0.375, 0.375, -2, -0.25, 0.5}, -- NodeBox73 + {-2.0625, -0.3125, 0.375, -1.9375, -0.1875, 0.5}, -- NodeBox74 + {-2, -0.25, 0.375, -1.8125, -0.125, 0.5}, -- NodeBox75 + {-1.875, -0.1875, 0.375, -1.75, -0.0625, 0.5}, -- NodeBox76 + {-1.8125, -0.125, 0.375, -1.625, 0, 0.5}, -- NodeBox77 + {-1.6875, -0.0625, 0.375, -1.5, 0.0625, 0.5}, -- NodeBox78 + {-1.5625, 0, 0.375, -1.4375, 0.125, 0.5}, -- NodeBox79 + {-1.5, 0.0625, 0.375, -1.3125, 0.1875, 0.5}, -- NodeBox80 + {-1.375, 0.125, 0.375, -1.25, 0.25, 0.5}, -- NodeBox81 + {-1.3125, 0.1875, 0.375, -1.125, 0.3125, 0.5}, -- NodeBox82 + {-1.1875, 0.25, 0.375, -1, 0.375, 0.5}, -- NodeBox83 + {-1.0625, 0.3125, 0.375, -0.9375, 0.4375, 0.5}, -- NodeBox84 + {-1, 0.375, 0.375, -0.8125, 0.5, 0.5}, -- NodeBox85 + {-0.875, 0.4375, 0.375, -0.75, 0.5625, 0.5}, -- NodeBox86 + {-0.8125, 0.5, 0.375, -0.625, 0.625, 0.5}, -- NodeBox87 + {-0.6875, 0.5625, 0.375, -0.5, 0.6875, 0.5}, -- NodeBox88 + {-0.5625, 0.625, 0.375, -0.4375, 0.75, 0.5}, -- NodeBox89 + {-0.5, 0.6875, 0.375, -0.3125, 0.8125, 0.5}, -- NodeBox90 + {-0.375, 0.75, 0.375, -0.25, 0.875, 0.5}, -- NodeBox91 + {-0.3125, 0.8125, 0.375, -0.125, 0.9375, 0.5}, -- NodeBox92 + {-0.1875, 0.875, 0.375, 0, 1, 0.5}, -- NodeBox93 + {-2.375, 2.375, 0.375, -2.25, 2.5, 0.5}, -- NodeBox48 + {-2.3125, 2.3125, 0.375, -2.125, 2.4375, 0.5}, -- NodeBox49 + {-2.1875, 2.25, 0.375, -2, 2.375, 0.5}, -- NodeBox50 + {-2.0625, 2.1875, 0.375, -1.9375, 2.3125, 0.5}, -- NodeBox51 + {-2, 2.125, 0.375, -1.8125, 2.25, 0.5}, -- NodeBox52 + {-1.875, 2.0625, 0.375, -1.75, 2.1875, 0.5}, -- NodeBox53 + {-1.8125, 2, 0.375, -1.625, 2.125, 0.5}, -- NodeBox54 + {-1.6875, 1.9375, 0.375, -1.5, 2.0625, 0.5}, -- NodeBox55 + {-1.5625, 1.875, 0.375, -1.4375, 2, 0.5}, -- NodeBox56 + {-1.5, 1.8125, 0.375, -1.3125, 1.9375, 0.5}, -- NodeBox57 + {-1.375, 1.75, 0.375, -1.25, 1.875, 0.5}, -- NodeBox58 + {-1.3125, 1.6875, 0.375, -1.125, 1.8125, 0.5}, -- NodeBox59 + {-1.1875, 1.625, 0.375, -1, 1.75, 0.5}, -- NodeBox60 + {-1.0625, 1.5625, 0.375, -0.9375, 1.6875, 0.5}, -- NodeBox61 + {-1, 1.5, 0.375, -0.8125, 1.625, 0.5}, -- NodeBox62 + {-0.875, 1.4375, 0.375, -0.75, 1.5625, 0.5}, -- NodeBox63 + {-0.8125, 1.375, 0.375, -0.625, 1.5, 0.5}, -- NodeBox64 + {-0.6875, 1.3125, 0.375, -0.5, 1.4375, 0.5}, -- NodeBox65 + {-0.5625, 1.25, 0.375, -0.4375, 1.375, 0.5}, -- NodeBox66 + {-0.5, 1.1875, 0.375, -0.3125, 1.3125, 0.5}, -- NodeBox67 + {-0.375, 1.125, 0.375, -0.25, 1.25, 0.5}, -- NodeBox68 + {-0.3125, 1.0625, 0.375, -0.125, 1.1875, 0.5}, -- NodeBox69 + {-0.1875, 1, 0.375, -0, 1.125, 0.5}, -- NodeBox70 + {2.25, -0.5, 0.375, 2.375, -0.375, 0.5}, -- NodeBox71 + {2.125, -0.4375, 0.375, 2.3125, -0.3125, 0.5}, -- NodeBox72 + {2, -0.375, 0.375, 2.1875, -0.25, 0.5}, -- NodeBox73 + {1.9375, -0.3125, 0.375, 2.0625, -0.1875, 0.5}, -- NodeBox74 + {1.8125, -0.25, 0.375, 2, -0.125, 0.5}, -- NodeBox75 + {1.75, -0.1875, 0.375, 1.875, -0.0625, 0.5}, -- NodeBox76 + {1.625, -0.125, 0.375, 1.8125, 0, 0.5}, -- NodeBox77 + {1.5, -0.0625, 0.375, 1.6875, 0.0625, 0.5}, -- NodeBox78 + {1.4375, 0, 0.375, 1.5625, 0.125, 0.5}, -- NodeBox79 + {1.3125, 0.0625, 0.375, 1.5, 0.1875, 0.5}, -- NodeBox80 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox81 + {1.125, 0.1875, 0.375, 1.3125, 0.3125, 0.5}, -- NodeBox82 + {1, 0.25, 0.375, 1.1875, 0.375, 0.5}, -- NodeBox83 + {0.9375, 0.3125, 0.375, 1.0625, 0.4375, 0.5}, -- NodeBox84 + {0.8125, 0.375, 0.375, 1, 0.5, 0.5}, -- NodeBox85 + {0.75, 0.4375, 0.375, 0.875, 0.5625, 0.5}, -- NodeBox86 + {0.625, 0.5, 0.375, 0.8125, 0.625, 0.5}, -- NodeBox87 + {0.5, 0.5625, 0.375, 0.6875, 0.6875, 0.5}, -- NodeBox88 + {0.4375, 0.625, 0.375, 0.5625, 0.75, 0.5}, -- NodeBox89 + {0.3125, 0.6875, 0.375, 0.5, 0.8125, 0.5}, -- NodeBox90 + {0.25, 0.75, 0.375, 0.375, 0.875, 0.5}, -- NodeBox91 + {0.125, 0.8125, 0.375, 0.3125, 0.9375, 0.5}, -- NodeBox92 + {-0, 0.875, 0.375, 0.1875, 1, 0.5}, -- NodeBox93 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-2.5, -0.5, 0, 2.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:large_support_bot_"..bridge_colors, { + description = bridge_desc.." Bottom Large Support", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_large_support_bot.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_large_support_bot.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-2.5625, -0.5, 0.25, -2.1875, 0.5, 0.625}, -- NodeBox1 + {2.1875, -0.5, 0.25, 2.5625, 0.5, 0.625}, -- NodeBox2 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-2.5, -0.5, 0, 2.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_right_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Right Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_right_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox215 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox217 + {-0.5, 2.375, 0.375, 1.5, 2.5, 0.5}, -- NodeBox218 + {-0.4375, 2.25, 0.375, -0.3125, 2.375, 0.5}, -- NodeBox219 + {-0.375, 2.1875, 0.375, -0.25, 2.3125, 0.5}, -- NodeBox220 + {-0.3125, 2.0625, 0.375, -0.1875, 2.25, 0.5}, -- NodeBox221 + {-0.25, 2, 0.375, -0.125, 2.125, 0.5}, -- NodeBox222 + {-0.1875, 1.9375, 0.375, -0.0625, 2.0625, 0.5}, -- NodeBox223 + {-0.125, 1.875, 0.375, 0, 2, 0.5}, -- NodeBox224 + {-0.0625, 1.75, 0.375, 0.0625, 1.9375, 0.5}, -- NodeBox225 + {0, 1.6875, 0.375, 0.125, 1.8125, 0.5}, -- NodeBox226 + {0.0625, 1.625, 0.375, 0.1875, 1.75, 0.5}, -- NodeBox227 + {0.125, 1.5625, 0.375, 0.25, 1.6875, 0.5}, -- NodeBox228 + {0.1875, 1.4375, 0.375, 0.3125, 1.625, 0.5}, -- NodeBox229 + {0.25, 1.375, 0.375, 0.375, 1.5, 0.5}, -- NodeBox230 + {0.3125, 1.3125, 0.375, 0.4375, 1.4375, 0.5}, -- NodeBox231 + {0.375, 1.25, 0.375, 0.5, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.5, 1.0625, 0.375, 0.625, 1.1875, 0.5}, -- NodeBox234 + {0.5625, 1, 0.375, 0.6875, 1.125, 0.5}, -- NodeBox235 + {0.625, 0.9375, 0.375, 0.75, 1.0625, 0.5}, -- NodeBox236 + {0.6875, 0.8125, 0.375, 0.8125, 1, 0.5}, -- NodeBox237 + {0.75, 0.75, 0.375, 0.875, 0.875, 0.5}, -- NodeBox238 + {0.8125, 0.6875, 0.375, 0.9375, 0.8125, 0.5}, -- NodeBox239 + {0.875, 0.625, 0.375, 1, 0.75, 0.5}, -- NodeBox240 + {0.9375, 0.5, 0.375, 1.0625, 0.6875, 0.5}, -- NodeBox241 + {1, 0.4375, 0.375, 1.125, 0.5625, 0.5}, -- NodeBox242 + {1.0625, 0.375, 0.375, 1.1875, 0.5, 0.5}, -- NodeBox243 + {1.125, 0.3125, 0.375, 1.25, 0.4375, 0.5}, -- NodeBox244 + {1.1875, 0.1875, 0.375, 1.3125, 0.375, 0.5}, -- NodeBox245 + {1.25, 0.125, 0.375, 1.375, 0.25, 0.5}, -- NodeBox246 + {1.3125, 0.0625, 0.375, 1.4375, 0.1875, 0.5}, -- NodeBox247 + {1.375, 0, 0.375, 1.5, 0.125, 0.5}, -- NodeBox248 + {-0.4375, 2.3125, 0.375, -0.3125, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:truss_superstructure_left_slant_"..bridge_colors, { + description = bridge_desc.." Truss Superstructure Left Slant", + drawtype = "nodebox", + tiles = {"bridges_"..bridge_colors..".png"}, + inventory_image = "bridges_"..bridge_colors..".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + wield_image = "bridges_"..bridge_colors..".png^bridges_superstructure_left_slant.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 0.0625, 0.5}, -- NodeBox214 + {-0.5, -0.5, 0.375, -0.4375, 2.5, 0.5}, -- NodeBox215 + {1.4375, -0.5, 0.375, 1.5, 2.5, 0.5}, -- NodeBox217 + {-0.5, 2.375, 0.375, 1.5, 2.5, 0.5}, -- NodeBox218 + {1.3125, 2.25, 0.375, 1.4375, 2.375, 0.5}, -- NodeBox219 + {1.25, 2.1875, 0.375, 1.375, 2.3125, 0.5}, -- NodeBox220 + {1.1875, 2.0625, 0.375, 1.3125, 2.25, 0.5}, -- NodeBox221 + {1.125, 2, 0.375, 1.25, 2.125, 0.5}, -- NodeBox222 + {1.0625, 1.9375, 0.375, 1.1875, 2.0625, 0.5}, -- NodeBox223 + {1, 1.875, 0.375, 1.125, 2, 0.5}, -- NodeBox224 + {0.9375, 1.75, 0.375, 1.0625, 1.9375, 0.5}, -- NodeBox225 + {0.875, 1.6875, 0.375, 1, 1.8125, 0.5}, -- NodeBox226 + {0.8125, 1.625, 0.375, 0.9375, 1.75, 0.5}, -- NodeBox227 + {0.75, 1.5625, 0.375, 0.875, 1.6875, 0.5}, -- NodeBox228 + {0.6875, 1.4375, 0.375, 0.8125, 1.625, 0.5}, -- NodeBox229 + {0.625, 1.375, 0.375, 0.75, 1.5, 0.5}, -- NodeBox230 + {0.5625, 1.3125, 0.375, 0.6875, 1.4375, 0.5}, -- NodeBox231 + {0.5, 1.25, 0.375, 0.625, 1.375, 0.5}, -- NodeBox232 + {0.4375, 1.125, 0.375, 0.5625, 1.3125, 0.5}, -- NodeBox233 + {0.375, 1.0625, 0.375, 0.5, 1.1875, 0.5}, -- NodeBox234 + {0.3125, 1, 0.375, 0.4375, 1.125, 0.5}, -- NodeBox235 + {0.25, 0.9375, 0.375, 0.375, 1.0625, 0.5}, -- NodeBox236 + {0.1875, 0.8125, 0.375, 0.3125, 1, 0.5}, -- NodeBox237 + {0.125, 0.75, 0.375, 0.25, 0.875, 0.5}, -- NodeBox238 + {0.0625, 0.6875, 0.375, 0.1875, 0.8125, 0.5}, -- NodeBox239 + {0, 0.625, 0.375, 0.125, 0.75, 0.5}, -- NodeBox240 + {-0.0625, 0.5, 0.375, 0.0625, 0.6875, 0.5}, -- NodeBox241 + {-0.125, 0.4375, 0.375, 0, 0.5625, 0.5}, -- NodeBox242 + {-0.1875, 0.375, 0.375, -0.0625, 0.5, 0.5}, -- NodeBox243 + {-0.25, 0.3125, 0.375, -0.125, 0.4375, 0.5}, -- NodeBox244 + {-0.3125, 0.1875, 0.375, -0.1875, 0.375, 0.5}, -- NodeBox245 + {-0.375, 0.125, 0.375, -0.25, 0.25, 0.5}, -- NodeBox246 + {-0.4375, 0.0625, 0.375, -0.3125, 0.1875, 0.5}, -- NodeBox247 + {-0.5, 0, 0.375, -0.375, 0.125, 0.5}, -- NodeBox248 + {1.375, 2.3125, 0.375, 1.5, 2.4375, 0.5}, -- NodeBox249 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 1.5, 2.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:corrugated_steel_"..bridge_colors, { + description = bridge_desc.." Corrugated Steel", + drawtype = "nodebox", + tiles = {"bridges_corrugated_steel_"..bridge_colors..".png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, 0.5, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + + minetest.register_node("bridger:corrugated_steel_ceiling_"..bridge_colors, { + description = bridge_desc.." Corrugated Steel Deck", + drawtype = "nodebox", + tiles = {"bridges_corrugated_steel_"..bridge_colors..".png^[transformR90"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.375, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {cracky=3}, + sounds = default.node_sound_metal_defaults(), + }) + end +end + +if not minetest.settings:get_bool("bridger_disable_trestles") then + minetest.register_node("bridger:trestle_support", { + description = "Trestle Support", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_trestle_support.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_trestle_support.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.125, -0.75, 1.5, 0.125}, -- NodeBox1 + {0.75, -0.5, -0.125, 1, 1.5, 0.125}, -- NodeBox2 + {0.625, 1.375, -0.0625, 0.75, 1.5, 0.0625}, -- NodeBox3 + {0.5625, 1.25, -0.0625, 0.6875, 1.4375, 0.0625}, -- NodeBox4 + {0.5, 1.1875, -0.0625, 0.625, 1.3125, 0.0625}, -- NodeBox5 + {0.4375, 1.125, -0.0625, 0.5625, 1.25, 0.0625}, -- NodeBox6 + {0.375, 1, -0.0625, 0.5, 1.1875, 0.0625}, -- NodeBox7 + {0.3125, 0.9375, -0.0625, 0.4375, 1.0625, 0.0625}, -- NodeBox8 + {0.25, 0.875, -0.0625, 0.375, 1, 0.0625}, -- NodeBox9 + {0.1875, 0.75, -0.0625, 0.3125, 0.9375, 0.0625}, -- NodeBox10 + {0.125, 0.6875, -0.0625, 0.25, 0.8125, 0.0625}, -- NodeBox11 + {0.0625, 0.625, -0.0625, 0.1875, 0.75, 0.0625}, -- NodeBox12 + {0, 0.5, -0.0625, 0.125, 0.6875, 0.0625}, -- NodeBox13 + {-0.0625, 0.4375, -0.0625, 0.0625, 0.5625, 0.0625}, -- NodeBox14 + {-0.125, 0.3125, -0.0625, 0, 0.5, 0.0625}, -- NodeBox15 + {-0.1875, 0.25, -0.0625, -0.0625, 0.375, 0.0625}, -- NodeBox16 + {-0.25, 0.1875, -0.0625, -0.125, 0.3125, 0.0625}, -- NodeBox17 + {-0.3125, 0.0625, -0.0625, -0.1875, 0.25, 0.0625}, -- NodeBox18 + {-0.375, 0, -0.0625, -0.25, 0.125, 0.0625}, -- NodeBox19 + {-0.4375, -0.0625, -0.0625, -0.3125, 0.0625, 0.0625}, -- NodeBox20 + {-0.5, -0.1875, -0.0625, -0.375, 0, 0.0625}, -- NodeBox21 + {-0.5625, -0.25, -0.0625, -0.4375, -0.125, 0.0625}, -- NodeBox22 + {-0.625, -0.3125, -0.0625, -0.5, -0.1875, 0.0625}, -- NodeBox23 + {-0.6875, -0.4375, -0.0625, -0.5625, -0.25, 0.0625}, -- NodeBox24 + {-0.75, -0.5, -0.0625, -0.625, -0.375, 0.0625}, -- NodeBox25 + {-0.75, 1.375, -0.0625, -0.625, 1.5, 0.0625}, -- NodeBox3 + {-0.6875, 1.25, -0.0625, -0.5625, 1.4375, 0.0625}, -- NodeBox4 + {-0.625, 1.1875, -0.0625, -0.5, 1.3125, 0.0625}, -- NodeBox5 + {-0.5625, 1.125, -0.0625, -0.4375, 1.25, 0.0625}, -- NodeBox6 + {-0.5, 1, -0.0625, -0.375, 1.1875, 0.0625}, -- NodeBox7 + {-0.4375, 0.9375, -0.0625, -0.3125, 1.0625, 0.0625}, -- NodeBox8 + {-0.375, 0.875, -0.0625, -0.25, 1, 0.0625}, -- NodeBox9 + {-0.3125, 0.75, -0.0625, -0.1875, 0.9375, 0.0625}, -- NodeBox10 + {-0.25, 0.6875, -0.0625, -0.125, 0.8125, 0.0625}, -- NodeBox11 + {-0.1875, 0.625, -0.0625, -0.0625, 0.75, 0.0625}, -- NodeBox12 + {-0.125, 0.5, -0.0625, -0, 0.6875, 0.0625}, -- NodeBox13 + {-0, 0.3125, -0.0625, 0.125, 0.5, 0.0625}, -- NodeBox15 + {0.0625, 0.25, -0.0625, 0.1875, 0.375, 0.0625}, -- NodeBox16 + {0.125, 0.1875, -0.0625, 0.25, 0.3125, 0.0625}, -- NodeBox17 + {0.1875, 0.0625, -0.0625, 0.3125, 0.25, 0.0625}, -- NodeBox18 + {0.25, 0, -0.0625, 0.375, 0.125, 0.0625}, -- NodeBox19 + {0.3125, -0.0625, -0.0625, 0.4375, 0.0625, 0.0625}, -- NodeBox20 + {0.375, -0.1875, -0.0625, 0.5, 0, 0.0625}, -- NodeBox21 + {0.4375, -0.25, -0.0625, 0.5625, -0.125, 0.0625}, -- NodeBox22 + {0.5, -0.3125, -0.0625, 0.625, -0.1875, 0.0625}, -- NodeBox23 + {0.5625, -0.4375, -0.0625, 0.6875, -0.25, 0.0625}, -- NodeBox24 + {0.625, -0.5, -0.0625, 0.75, -0.375, 0.0625}, -- NodeBox25 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.1875, 1, 1.5, 0.1875}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:trestle_support_small", { + description = "Small Trestle Support", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_trestle_support_small.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_trestle_support_small.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.125, -0.75, 0.5, 0.125}, -- NodeBox1 + {0.75, -0.5, -0.125, 1, 0.5, 0.125}, -- NodeBox2 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.1875, 1, 0.5, 0.1875}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:trestle_side", { + description = "Trestle Siding", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_trestle_side.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_trestle_side.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.875, -0.5, -0.0625, 0.875, -0.375, 0.0625}, -- NodeBox1 + {-0.875, 1.375, -0.0625, 0.875, 1.5, 0.0625}, -- NodeBox2 + {-1, 1.375, -0.0625, 1, 1.5, 0}, -- NodeBox30 + {-1, -0.5, -0.0625, 1, -0.375, 0}, -- NodeBox31 + {-0.9375, 1.3125, -0.0625, -0.8125, 1.4375, 0.0625}, -- NodeBox3 + {-0.875, 1.25, -0.0625, -0.75, 1.375, 0.0625}, -- NodeBox4 + {0.25, 0.125, -0.0625, 0.375, 0.25, 0.0625}, -- NodeBox5 + {-0.8125, 1.1875, -0.0625, -0.6875, 1.3125, 0.0625}, -- NodeBox6 + {-0.75, 1.125, -0.0625, -0.625, 1.25, 0.0625}, -- NodeBox7 + {-0.6875, 1.0625, -0.0625, -0.5625, 1.1875, 0.0625}, -- NodeBox8 + {-0.625, 1, -0.0625, -0.5, 1.125, 0.0625}, -- NodeBox9 + {-0.5625, 0.9375, -0.0625, -0.4375, 1.0625, 0.0625}, -- NodeBox10 + {-0.5, 0.875, -0.0625, -0.375, 1, 0.0625}, -- NodeBox11 + {-0.4375, 0.8125, -0.0625, -0.3125, 0.9375, 0.0625}, -- NodeBox12 + {-0.375, 0.75, -0.0625, -0.25, 0.875, 0.0625}, -- NodeBox13 + {-0.3125, 0.6875, -0.0625, -0.1875, 0.8125, 0.0625}, -- NodeBox14 + {-0.25, 0.625, -0.0625, -0.125, 0.75, 0.0625}, -- NodeBox15 + {-0.1875, 0.5625, -0.0625, -0.0625, 0.6875, 0.0625}, -- NodeBox16 + {-0.125, 0.375, -0.0625, 0.125, 0.625, 0.0625}, -- NodeBox17 + {0.0625, 0.3125, -0.0625, 0.1875, 0.4375, 0.0625}, -- NodeBox18 + {0.125, 0.25, -0.0625, 0.25, 0.375, 0.0625}, -- NodeBox19 + {0.1875, 0.1875, -0.0625, 0.3125, 0.3125, 0.0625}, -- NodeBox20 + {0.3125, 0.0625, -0.0625, 0.4375, 0.1875, 0.0625}, -- NodeBox21 + {0.375, 0, -0.0625, 0.5, 0.125, 0.0625}, -- NodeBox22 + {0.4375, -0.0625, -0.0625, 0.5625, 0.0625, 0.0625}, -- NodeBox23 + {0.5, -0.125, -0.0625, 0.625, 0, 0.0625}, -- NodeBox24 + {0.5625, -0.1875, -0.0625, 0.6875, -0.0625, 0.0625}, -- NodeBox25 + {0.625, -0.25, -0.0625, 0.75, -0.125, 0.0625}, -- NodeBox26 + {0.6875, -0.3125, -0.0625, 0.8125, -0.1875, 0.0625}, -- NodeBox27 + {0.75, -0.375, -0.0625, 0.875, -0.25, 0.0625}, -- NodeBox28 + {0.8125, -0.4375, -0.0625, 0.9375, -0.3125, 0.0625}, -- NodeBox29 + {0.8125, 1.3125, -0.0625, 0.9375, 1.4375, 0.0625}, -- NodeBox3 + {0.75, 1.25, -0.0625, 0.875, 1.375, 0.0625}, -- NodeBox4 + {-0.375, 0.125, -0.0625, -0.25, 0.25, 0.0625}, -- NodeBox5 + {0.6875, 1.1875, -0.0625, 0.8125, 1.3125, 0.0625}, -- NodeBox6 + {0.625, 1.125, -0.0625, 0.75, 1.25, 0.0625}, -- NodeBox7 + {0.5625, 1.0625, -0.0625, 0.6875, 1.1875, 0.0625}, -- NodeBox8 + {0.5, 1, -0.0625, 0.625, 1.125, 0.0625}, -- NodeBox9 + {0.4375, 0.9375, -0.0625, 0.5625, 1.0625, 0.0625}, -- NodeBox10 + {0.375, 0.875, -0.0625, 0.5, 1, 0.0625}, -- NodeBox11 + {0.3125, 0.8125, -0.0625, 0.4375, 0.9375, 0.0625}, -- NodeBox12 + {0.25, 0.75, -0.0625, 0.375, 0.875, 0.0625}, -- NodeBox13 + {0.1875, 0.6875, -0.0625, 0.3125, 0.8125, 0.0625}, -- NodeBox14 + {0.125, 0.625, -0.0625, 0.25, 0.75, 0.0625}, -- NodeBox15 + {0.0625, 0.5625, -0.0625, 0.1875, 0.6875, 0.0625}, -- NodeBox16 + {-0.1875, 0.3125, -0.0625, -0.0625, 0.4375, 0.0625}, -- NodeBox18 + {-0.25, 0.25, -0.0625, -0.125, 0.375, 0.0625}, -- NodeBox19 + {-0.3125, 0.1875, -0.0625, -0.1875, 0.3125, 0.0625}, -- NodeBox20 + {-0.4375, 0.0625, -0.0625, -0.3125, 0.1875, 0.0625}, -- NodeBox21 + {-0.5, 0, -0.0625, -0.375, 0.125, 0.0625}, -- NodeBox22 + {-0.5625, -0.0625, -0.0625, -0.4375, 0.0625, 0.0625}, -- NodeBox23 + {-0.625, -0.125, -0.0625, -0.5, 0, 0.0625}, -- NodeBox24 + {-0.6875, -0.1875, -0.0625, -0.5625, -0.0625, 0.0625}, -- NodeBox25 + {-0.75, -0.25, -0.0625, -0.625, -0.125, 0.0625}, -- NodeBox26 + {-0.8125, -0.3125, -0.0625, -0.6875, -0.1875, 0.0625}, -- NodeBox27 + {-0.875, -0.375, -0.0625, -0.75, -0.25, 0.0625}, -- NodeBox28 + {-0.9375, -0.4375, -0.0625, -0.8125, -0.3125, 0.0625}, -- NodeBox29 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1, -0.5, -0.1875, 1, 1.5, 0.1875}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:trestle_deck", { + description = "Trestle Deck", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_trestle_deck.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_trestle_deck.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.625, 0.25, -0.5, -0.5, 0.375, 0.5}, -- NodeBox1 + {0.5, 0.25, -0.5, 0.625, 0.375, 0.5}, -- NodeBox2 + {-1.125, 0.374, 0.3125, 1.125, 0.501, 0.4375}, -- NodeBox3 + {-1.125, 0.374, 0.0625, 1.125, 0.501, 0.1875}, -- NodeBox4 + {-1.125, 0.374, -0.1875, 1.125, 0.501, -0.0625}, -- NodeBox5 + {-1.125, 0.374, -0.4375, 1.125, 0.501, -0.3125}, -- NodeBox6 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.125, 0, -0.5, 1.125, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:trestle_substructure_small", { + description = "Small Trestle Substructure", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_trestle_small.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_trestle_small.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1.5, 1.375, -0.0625, 0.5, 1.499, 0.0625}, -- NodeBox0 + {-1.4375, 1.3125, -0.0625, -1.3125, 1.4375, 0.0625}, -- NodeBox2 + {-1.375, 1.25, -0.0625, -1.25, 1.375, 0.0625}, -- NodeBox3 + {-1.3125, 1.1875, -0.0625, -1.125, 1.3125, 0.0625}, -- NodeBox4 + {-1.1875, 1.125, -0.0625, -1.0625, 1.25, 0.0625}, -- NodeBox5 + {-1.125, 1.0625, -0.0625, -1, 1.1875, 0.0625}, -- NodeBox6 + {-1.0625, 1, -0.0625, -0.875, 1.125, 0.0625}, -- NodeBox7 + {-0.9375, 0.9375, -0.0625, -0.8125, 1.0625, 0.0625}, -- NodeBox8 + {-0.875, 0.875, -0.0625, -0.75, 1, 0.0625}, -- NodeBox9 + {-0.8125, 0.8125, -0.0625, -0.625, 0.9375, 0.0625}, -- NodeBox10 + {-0.6875, 0.75, -0.0625, -0.5625, 0.875, 0.0625}, -- NodeBox11 + {-0.625, 0.6875, -0.0625, -0.5, 0.8125, 0.0625}, -- NodeBox12 + {-0.5625, 0.625, -0.0625, -0.375, 0.75, 0.0625}, -- NodeBox13 + {-0.4375, 0.5625, -0.0625, -0.3125, 0.6875, 0.0625}, -- NodeBox14 + {-0.375, 0.5, -0.0625, -0.25, 0.625, 0.0625}, -- NodeBox15 + {-0.3125, 0.4375, -0.0625, -0.125, 0.5625, 0.0625}, -- NodeBox16 + {-0.1875, 0.375, -0.0625, -0.0625, 0.5, 0.0625}, -- NodeBox17 + {-0.125, 0.3125, -0.0625, 0, 0.4375, 0.0625}, -- NodeBox18 + {-0.0625, 0.25, -0.0625, 0.125, 0.375, 0.0625}, -- NodeBox19 + {0.0625, 0.1875, -0.0625, 0.1875, 0.3125, 0.0625}, -- NodeBox20 + {0.125, 0.125, -0.0625, 0.25, 0.25, 0.0625}, -- NodeBox21 + {0.1875, 0.0625, -0.0625, 0.375, 0.1875, 0.0625}, -- NodeBox22 + {0.3125, 0, -0.0625, 0.4375, 0.125, 0.0625}, -- NodeBox23 + {0.4375, 0, -0.0625, 0.5, 1.5, 0.0625}, -- NodeBox24 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.5, 0, -0.0625, 0.5, 1.5, 0.0625}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:trestle_substructure_large", { + description = "Large Trestle Substructure", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_trestle_large.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_trestle_large.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {0.4375, -0.5, -0.0625, 0.5, 1.5, 0.0625}, -- NodeBox1 + {0.25, -0.5, -0.0625, 0.4375, -0.375, 0.0625}, -- NodeBox2 + {0.125, -0.4375, -0.0625, 0.3125, -0.3125, 0.0625}, -- NodeBox3 + {0, -0.375, -0.0625, 0.1875, -0.25, 0.0625}, -- NodeBox4 + {-0.125, -0.3125, -0.0625, 0.0625, -0.1875, 0.0625}, -- NodeBox5 + {-0.25, -0.25, -0.0625, -0.0625, -0.125, 0.0625}, -- NodeBox6 + {-0.375, -0.1875, -0.0625, -0.1875, -0.0625, 0.0625}, -- NodeBox7 + {-0.5, -0.125, -0.0625, -0.3125, 0, 0.0625}, -- NodeBox8 + {-0.625, -0.0625, -0.0625, -0.4375, 0.0625, 0.0625}, -- NodeBox9 + {-0.75, 0, -0.0625, -0.5625, 0.125, 0.0625}, -- NodeBox10 + {-0.875, 0.0625, -0.0625, -0.6875, 0.1875, 0.0625}, -- NodeBox11 + {-1, 0.125, -0.0625, -0.8125, 0.25, 0.0625}, -- NodeBox12 + {-1.125, 0.1875, -0.0625, -0.9375, 0.3125, 0.0625}, -- NodeBox13 + {-1.25, 0.25, -0.0625, -1.0625, 0.375, 0.0625}, -- NodeBox14 + {-1.375, 0.3125, -0.0625, -1.1875, 0.4375, 0.0625}, -- NodeBox15 + {-1.5, 0.375, -0.0625, -1.3125, 0.5, 0.0625}, -- NodeBox16 + {-1.625, 0.4375, -0.0625, -1.4375, 0.5625, 0.0625}, -- NodeBox17 + {-1.75, 0.5, -0.0625, -1.5625, 0.625, 0.0625}, -- NodeBox18 + {-1.875, 0.5625, -0.0625, -1.6875, 0.6875, 0.0625}, -- NodeBox19 + {-2, 0.625, -0.0625, -1.8125, 0.75, 0.0625}, -- NodeBox20 + {-2.125, 0.6875, -0.0625, -1.9375, 0.8125, 0.0625}, -- NodeBox21 + {-2.25, 0.75, -0.0625, -2.0625, 0.875, 0.0625}, -- NodeBox22 + {-2.375, 0.8125, -0.0625, -2.1875, 0.9375, 0.0625}, -- NodeBox23 + {-2.5, 0.875, -0.0625, -2.3125, 1, 0.0625}, -- NodeBox24 + {-2.625, 0.9375, -0.0625, -2.4375, 1.0625, 0.0625}, -- NodeBox25 + {-2.75, 1, -0.0625, -2.5625, 1.125, 0.0625}, -- NodeBox26 + {-2.875, 1.0625, -0.0625, -2.6875, 1.1875, 0.0625}, -- NodeBox27 + {-3, 1.125, -0.0625, -2.8125, 1.25, 0.0625}, -- NodeBox28 + {-3.125, 1.1875, -0.0625, -2.9375, 1.3125, 0.0625}, -- NodeBox29 + {-3.25, 1.25, -0.0625, -3.0625, 1.375, 0.0625}, -- NodeBox30 + {-3.375, 1.3125, -0.0625, -3.1875, 1.4375, 0.0625}, -- NodeBox31 + {-3.5, 1.375, -0.0625, -3.3125, 1.5, 0.0625}, -- NodeBox32 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-3.5, -0.5, -0.0625, 0.5, 1.5, 0.0625}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:lattice_truss_side", { + description = "Lattice Truss", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_lattice_truss_side.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_lattice_truss_side.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.0625, -0.25, -0.25, 0.0625}, -- NodeBox1 + {-0.4375, -0.4375, -0.0625, -0.1875, -0.1875, 0.0625}, -- NodeBox2 + {-0.375, -0.375, -0.0625, -0.125, -0.125, 0.0625}, -- NodeBox3 + {-0.3125, -0.3125, -0.0625, -0.0625, -0.0625, 0.0625}, -- NodeBox4 + {0.0625, 0.0625, -0.0625, 0.3125, 0.3125, 0.0625}, -- NodeBox10 + {0.125, 0.125, -0.0625, 0.375, 0.375, 0.0625}, -- NodeBox11 + {0.1875, 0.1875, -0.0625, 0.4375, 0.4375, 0.0625}, -- NodeBox12 + {0.25, 0.25, -0.0625, 0.5, 0.5, 0.0625}, -- NodeBox13 + {0.25, -0.5, -0.0625, 0.5, -0.25, 0.0625}, -- NodeBox14 + {0.1875, -0.4375, -0.0625, 0.4375, -0.1875, 0.0625}, -- NodeBox15 + {-0.25, -0.25, -0.0625, 0.25, 0.25, 0.0625}, -- NodeBox16 + {0.125, -0.375, -0.0625, 0.375, -0.125, 0.0625}, -- NodeBox17 + {0.0625, -0.3125, -0.0625, 0.3125, -0.0625, 0.0625}, -- NodeBox18 + {-0.5, 0.25, -0.0625, -0.25, 0.5, 0.0625}, -- NodeBox19 + {-0.4375, 0.1875, -0.0625, -0.1875, 0.4375, 0.0625}, -- NodeBox20 + {-0.375, 0.125, -0.0625, -0.125, 0.375, 0.0625}, -- NodeBox21 + {-0.3125, 0.0625, -0.0625, -0.0625, 0.3125, 0.0625}, -- NodeBox22 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.125, 0.5, 0.5, 0.125}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:lattice_truss_top", { + description = "Lattice Truss Upper Chord", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + inventory_image = "default_junglewood.png^bridges_lattice_truss_top.png^[makealpha:255,126,126", + wield_image = "default_junglewood.png^bridges_lattice_truss_top.png^[makealpha:255,126,126", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1, 0.375, 0.25, -0.75, 0.501, 0.5}, -- NodeBox1 + {-0.25, 0.375, 0.25, 0.25, 0.501, 0.5}, -- NodeBox2 + {-0.25, 0.375, -0.5, 0.25, 0.501, -0.25}, -- NodeBox5 + {-1, 0.375, -0.5, -0.75, 0.501, -0.25}, -- NodeBox6 + {-0.9375, 0.375, -0.4375, -0.6875, 0.501, -0.1875}, -- NodeBox7 + {-0.875, 0.375, -0.375, -0.625, 0.501, -0.125}, -- NodeBox8 + {-0.8125, 0.375, -0.3125, -0.5625, 0.501, -0.0625}, -- NodeBox9 + {-0.3125, 0.375, -0.4375, -0.0625, 0.501, -0.1875}, -- NodeBox10 + {-0.375, 0.375, -0.375, -0.125, 0.501, -0.125}, -- NodeBox11 + {-0.4375, 0.375, -0.3125, -0.1875, 0.501, -0.0625}, -- NodeBox12 + {-0.75, 0.375, -0.25, -0.25, 0.501, 0.25}, -- NodeBox13 + {-0.9375, 0.375, 0.1875, -0.6875, 0.501, 0.4375}, -- NodeBox15 + {-0.875, 0.375, 0.125, -0.625, 0.501, 0.375}, -- NodeBox16 + {-0.8125, 0.375, 0.0625, -0.5625, 0.501, 0.3125}, -- NodeBox17 + {-0.4375, 0.375, 0.0625, -0.1875, 0.501, 0.3125}, -- NodeBox18 + {-0.375, 0.375, 0.125, -0.125, 0.501, 0.375}, -- NodeBox19 + {-0.3125, 0.375, 0.1875, -0.0625, 0.501, 0.4375}, -- NodeBox20 + {0.75, 0.375, -0.5, 1, 0.501, -0.25}, -- NodeBox1 + {0.75, 0.375, 0.25, 1, 0.501, 0.5}, -- NodeBox6 + {0.6875, 0.375, 0.1875, 0.9375, 0.501, 0.4375}, -- NodeBox7 + {0.625, 0.375, 0.125, 0.875, 0.501, 0.375}, -- NodeBox8 + {0.5625, 0.375, 0.0625, 0.8125, 0.501, 0.3125}, -- NodeBox9 + {0.0625, 0.375, 0.1875, 0.3125, 0.501, 0.4375}, -- NodeBox10 + {0.125, 0.375, 0.125, 0.375, 0.501, 0.375}, -- NodeBox11 + {0.1875, 0.375, 0.0625, 0.4375, 0.501, 0.3125}, -- NodeBox12 + {0.25, 0.375, -0.25, 0.75, 0.501, 0.25}, -- NodeBox13 + {0.6875, 0.375, -0.4375, 0.9375, 0.501, -0.1875}, -- NodeBox15 + {0.625, 0.375, -0.375, 0.875, 0.501, -0.125}, -- NodeBox16 + {0.5625, 0.375, -0.3125, 0.8125, 0.501, -0.0625}, -- NodeBox17 + {0.1875, 0.375, -0.3125, 0.4375, 0.501, -0.0625}, -- NodeBox18 + {0.125, 0.375, -0.375, 0.375, 0.501, -0.125}, -- NodeBox19 + {0.0625, 0.375, -0.4375, 0.3125, 0.501, -0.1875}, -- NodeBox20 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1, 0.375, -0.5, 1, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) +end + +if not minetest.settings:get_bool("bridger_disable_wooden_bridges") then + minetest.register_node("bridger:small_beam", { + description = "Small Wooden Beam Bridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.5, 0.4375, -0.4375, 0.5}, -- NodeBox1 + {-0.5, -0.5, 0.40625, -0.40625, 0.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox3 + {-0.5, 0.375, -0.5, -0.40625, 0.4375, 0.5}, -- NodeBox4 + {0.40625, 0.375, -0.5, 0.5, 0.4375, 0.5}, -- NodeBox5 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox6 + {0.40625, -0.5, 0.40625, 0.5, 0.5, 0.5}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:small_beam_mid", { + description = "Small Wooden Beam Bridge Middle", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.5, 0.4375, -0.4375, 0.5}, -- NodeBox1 + {-0.5, 0.375, -0.5, -0.40625, 0.4375, 0.5}, -- NodeBox4 + {0.40625, 0.375, -0.5, 0.5, 0.4375, 0.5}, -- NodeBox5 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:small_beam_end", { + description = "Small Wooden Beam Bridge End", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.5, 0.4375, -0.4375, 0.4375}, -- NodeBox1 + {-0.5, -0.5, 0.40625, -0.40625, 0.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox3 + {-0.5, 0.375, -0.5, -0.40625, 0.4375, 0.5}, -- NodeBox4 + {0.40625, 0.375, -0.5, 0.5, 0.4375, 0.5}, -- NodeBox5 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox6 + {0.40625, -0.5, 0.40625, 0.5, 0.5, 0.5}, -- NodeBox7 + {-0.5, 0.375, 0.40625, 0.5, 0.4375, 0.5}, -- NodeBox8 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:small_beam_3", { + description = "Small Wooden Beam Bridge Crossing", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.4375}, -- NodeBox1 + {-0.5, -0.5, 0.40625, -0.40625, 0.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox3 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox6 + {0.40625, -0.5, 0.40625, 0.5, 0.5, 0.5}, -- NodeBox7 + {-0.5, 0.375, 0.40625, 0.5, 0.4375, 0.5}, -- NodeBox8 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:small_beam_4", { + description = "Small Wooden Beam Bridge Crossing", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, -- NodeBox1 + {-0.5, -0.5, 0.40625, -0.40625, 0.5, 0.5}, -- NodeBox2 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox3 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox6 + {0.40625, -0.5, 0.40625, 0.5, 0.5, 0.5}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:small_beam_stair", { + description = "Small Wooden Beam Bridge Stair", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.0625, -0.5, 0.4375, 0, 0}, -- NodeBox1 + {-0.4375, 0.4375, 0, 0.4375, 0.5, 0.5}, -- NodeBox2 + {0.40625, 0.4375, 0.40625, 0.5, 1.5, 0.5}, -- NodeBox3 + {0.40625, -0.5, -0.5, 0.5, 0.625, -0.40625}, -- NodeBox4 + {-0.5, -0.5, -0.5, -0.40625, 0.625, -0.40625}, -- NodeBox5 + {-0.5, 0.4375, 0.40625, -0.40625, 1.5, 0.5}, -- NodeBox6 + {-0.5, 1.3125, 0.375, -0.40625, 1.375, 0.5}, -- NodeBox7 + {-0.5, 1.25, 0.3125, -0.40625, 1.3125, 0.4375}, -- NodeBox8 + {-0.5, 1.1875, 0.25, -0.40625, 1.25, 0.375}, -- NodeBox9 + {-0.5, 1.125, 0.1875, -0.40625, 1.1875, 0.3125}, -- NodeBox10 + {-0.5, 1.0625, 0.125, -0.40625, 1.125, 0.25}, -- NodeBox11 + {-0.5, 1, 0.0625, -0.40625, 1.0625, 0.1875}, -- NodeBox12 + {-0.5, 0.9375, 0, -0.40625, 1, 0.125}, -- NodeBox13 + {-0.5, 0.875, -0.0625, -0.40625, 0.9375, 0.0625}, -- NodeBox14 + {-0.5, 0.8125, -0.125, -0.40625, 0.875, 0}, -- NodeBox15 + {-0.5, 0.75, -0.1875, -0.40625, 0.8125, -0.0625}, -- NodeBox16 + {-0.5, 0.6875, -0.25, -0.40625, 0.75, -0.125}, -- NodeBox17 + {-0.5, 0.625, -0.3125, -0.40625, 0.6875, -0.1875}, -- NodeBox18 + {-0.5, 0.5625, -0.375, -0.40625, 0.625, -0.25}, -- NodeBox19 + {-0.5, 0.5, -0.4375, -0.40625, 0.5625, -0.3125}, -- NodeBox20 + {-0.5, 0.4375, -0.5, -0.40625, 0.5, -0.375}, -- NodeBox21 + {0.40625, 0.4375, -0.5, 0.5, 0.5, -0.375}, -- NodeBox22 + {0.40625, 0.5, -0.4375, 0.5, 0.5625, -0.3125}, -- NodeBox23 + {0.40625, 0.5625, -0.375, 0.5, 0.625, -0.25}, -- NodeBox24 + {0.40625, 0.625, -0.3125, 0.5, 0.6875, -0.1875}, -- NodeBox25 + {0.40625, 0.6875, -0.25, 0.5, 0.75, -0.125}, -- NodeBox26 + {0.40625, 0.75, -0.1875, 0.5, 0.8125, -0.0625}, -- NodeBox27 + {0.40625, 0.8125, -0.125, 0.5, 0.875, 0}, -- NodeBox28 + {0.40625, 0.875, -0.0625, 0.5, 0.9375, 0.0625}, -- NodeBox29 + {0.40625, 0.9375, 0, 0.5, 1, 0.125}, -- NodeBox30 + {0.40625, 1, 0.0625, 0.5, 1.0625, 0.1875}, -- NodeBox31 + {0.40625, 1.0625, 0.125, 0.5, 1.125, 0.25}, -- NodeBox32 + {0.40625, 1.125, 0.1875, 0.5, 1.1875, 0.3125}, -- NodeBox33 + {0.40625, 1.1875, 0.25, 0.5, 1.25, 0.375}, -- NodeBox34 + {0.40625, 1.25, 0.3125, 0.5, 1.3125, 0.4375}, -- NodeBox35 + {0.40625, 1.3125, 0.375, 0.5, 1.375, 0.5}, -- NodeBox36 + {0.40625, -0.5, -0.5, 0.5, -0.4375, -0.375}, -- NodeBox38 + {0.40625, -0.4375, -0.4375, 0.5, -0.375, -0.3125}, -- NodeBox39 + {0.40625, -0.375, -0.375, 0.5, -0.3125, -0.25}, -- NodeBox40 + {0.40625, -0.3125, -0.3125, 0.5, -0.25, -0.1875}, -- NodeBox41 + {0.40625, -0.25, -0.25, 0.5, -0.1875, -0.125}, -- NodeBox42 + {0.40625, -0.1875, -0.1875, 0.5, -0.125, -0.0625}, -- NodeBox43 + {0.40625, -0.125, -0.125, 0.5, -0.0625, 0}, -- NodeBox44 + {0.40625, -0.0625, -0.0625, 0.5, 0, 0.0625}, -- NodeBox45 + {0.40625, 0, 0, 0.5, 0.0625, 0.125}, -- NodeBox46 + {0.40625, 0.0625, 0.0625, 0.5, 0.125, 0.1875}, -- NodeBox47 + {0.40625, 0.125, 0.125, 0.5, 0.1875, 0.25}, -- NodeBox48 + {0.40625, 0.1875, 0.1875, 0.5, 0.25, 0.3125}, -- NodeBox49 + {0.40625, 0.25, 0.25, 0.5, 0.3125, 0.375}, -- NodeBox50 + {0.40625, 0.3125, 0.3125, 0.5, 0.375, 0.4375}, -- NodeBox51 + {0.40625, 0.375, 0.375, 0.5, 0.4375, 0.5}, -- NodeBox52 + {-0.5, -0.5, -0.5, -0.40625, -0.4375, -0.375}, -- NodeBox53 + {-0.5, -0.4375, -0.4375, -0.40625, -0.375, -0.3125}, -- NodeBox54 + {-0.5, -0.375, -0.375, -0.40625, -0.3125, -0.25}, -- NodeBox55 + {-0.5, -0.3125, -0.3125, -0.40625, -0.25, -0.1875}, -- NodeBox56 + {-0.5, -0.25, -0.25, -0.40625, -0.1875, -0.125}, -- NodeBox57 + {-0.5, -0.1875, -0.1875, -0.40625, -0.125, -0.0625}, -- NodeBox58 + {-0.5, -0.125, -0.125, -0.40625, -0.0625, 0}, -- NodeBox59 + {-0.5, -0.0625, -0.0625, -0.40625, 0, 0.0625}, -- NodeBox60 + {-0.5, 0, 0, -0.40625, 0.0625, 0.125}, -- NodeBox61 + {-0.5, 0.0625, 0.0625, -0.40625, 0.125, 0.1875}, -- NodeBox62 + {-0.5, 0.125, 0.125, -0.40625, 0.1875, 0.25}, -- NodeBox63 + {-0.5, 0.1875, 0.1875, -0.40625, 0.25, 0.3125}, -- NodeBox64 + {-0.5, 0.25, 0.25, -0.40625, 0.3125, 0.375}, -- NodeBox65 + {-0.5, 0.3125, 0.3125, -0.40625, 0.375, 0.4375}, -- NodeBox66 + {-0.5, 0.375, 0.375, -0.40625, 0.4375, 0.5}, -- NodeBox67 + {-0.5, -0.5625, -0.5, -0.40625, -0.5, -0.4375}, -- NodeBox68 + {0.40625, -0.5625, -0.5, 0.5, -0.5, -0.4375}, -- NodeBox69 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:large_beam", { + description = "Large Wooden Beam Bridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -1.5, 0.4375, -0.4375, 1.5}, -- NodeBox1 + {0.40625, -0.5, -0.6875, 0.5, 0.5, -0.59375}, -- NodeBox2 + {0.40625, -0.5, 0.59375, 0.5, 0.5, 0.6875}, -- NodeBox3 + {-0.5, -0.5, 0.59375, -0.40625, 0.5, 0.6875}, -- NodeBox4 + {-0.5, -0.5, -0.6875, -0.40625, 0.5, -0.59375}, -- NodeBox5 + {-0.5, 0.375, -1.5, -0.40625, 0.4375, 1.5}, -- NodeBox6 + {0.40625, 0.375, -1.5, 0.5, 0.4375, 1.5}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, 0.5, 1.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:large_fancy_beam", { + description = "Large Fancy Wooden Beam Bridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -1.5, 0.4375, -0.4375, -1.375}, -- NodeBox1 + {0.40625, -0.125, -0.6875, 0.5, 0.875, -0.59375}, -- NodeBox2 + {0.40625, -0.125, 0.59375, 0.5, 0.875, 0.6875}, -- NodeBox3 + {-0.5, -0.125, 0.59375, -0.40625, 0.875, 0.6875}, -- NodeBox4 + {-0.5, -0.125, -0.6875, -0.40625, 0.875, -0.59375}, -- NodeBox5 + {-0.5, 0.375, -1.5, -0.40625, 0.4375, -1.375}, -- NodeBox6 + {0.40625, 0.375, -1.5, 0.5, 0.4375, -1.375}, -- NodeBox7 + {-0.4375, -0.4375, -1.4375, 0.4375, -0.375, -1.3125}, -- NodeBox8 + {-0.4375, -0.375, -1.375, 0.4375, -0.3125, -1.25}, -- NodeBox9 + {-0.4375, -0.3125, -1.3125, 0.4375, -0.25, -1.125}, -- NodeBox10 + {-0.4375, -0.25, -1.1875, 0.4375, -0.1875, -1}, -- NodeBox11 + {-0.4375, -0.1875, -1.0625, 0.4375, -0.125, -0.75}, -- NodeBox12 + {-0.4375, -0.125, -0.8125, 0.4375, -0.0625, -0.4375}, -- NodeBox13 + {-0.4375, -0.125, 0.4375, 0.4375, -0.0625, 0.8125}, -- NodeBox14 + {-0.4375, -0.0625, -0.5, 0.4375, 0, 0.5}, -- NodeBox15 + {-0.4375, -0.1875, 0.75, 0.4375, -0.125, 1.0625}, -- NodeBox16 + {-0.4375, -0.25, 1, 0.4375, -0.1875, 1.1875}, -- NodeBox17 + {-0.4375, -0.3125, 1.125, 0.4375, -0.25, 1.3125}, -- NodeBox18 + {-0.4375, -0.375, 1.25, 0.4375, -0.3125, 1.375}, -- NodeBox19 + {-0.4375, -0.4375, 1.3125, 0.4375, -0.375, 1.4375}, -- NodeBox20 + {-0.4375, -0.5, 1.375, 0.4375, -0.4375, 1.5}, -- NodeBox21 + {-0.5, 0.4375, -1.4375, -0.40625, 0.5, -1.3125}, -- NodeBox22 + {-0.5, 0.5, -1.375, -0.40625, 0.5625, -1.25}, -- NodeBox23 + {-0.5, 0.5625, -1.3125, -0.40625, 0.625, -1.125}, -- NodeBox24 + {-0.5, 0.625, -1.1875, -0.40625, 0.6875, -1}, -- NodeBox25 + {-0.5, 0.6875, -1.0625, -0.40625, 0.75, -0.75}, -- NodeBox26 + {-0.5, 0.75, -0.8125, -0.40625, 0.8125, -0.4375}, -- NodeBox27 + {-0.5, 0.8125, -0.5, -0.40625, 0.875, 0.5}, -- NodeBox28 + {-0.5, 0.75, 0.4375, -0.40625, 0.8125, 0.8125}, -- NodeBox29 + {-0.5, 0.6875, 0.75, -0.40625, 0.75, 1.0625}, -- NodeBox30 + {-0.5, 0.625, 1, -0.40625, 0.6875, 1.1875}, -- NodeBox31 + {-0.5, 0.5625, 1.125, -0.40625, 0.625, 1.3125}, -- NodeBox32 + {-0.5, 0.5, 1.25, -0.40625, 0.5625, 1.375}, -- NodeBox33 + {-0.5, 0.4375, 1.3125, -0.40625, 0.5, 1.4375}, -- NodeBox34 + {-0.5, 0.375, 1.375, -0.40625, 0.4375, 1.5}, -- NodeBox35 + {0.40625, 0.4375, -1.4375, 0.5, 0.5, -1.3125}, -- NodeBox36 + {0.40625, 0.5, -1.375, 0.5, 0.5625, -1.25}, -- NodeBox37 + {0.40625, 0.5625, -1.3125, 0.5, 0.625, -1.125}, -- NodeBox38 + {0.40625, 0.625, -1.1875, 0.5, 0.6875, -1}, -- NodeBox39 + {0.40625, 0.6875, -1.0625, 0.5, 0.75, -0.75}, -- NodeBox40 + {0.40625, 0.75, -0.8125, 0.5, 0.8125, -0.4375}, -- NodeBox41 + {0.40625, 0.8125, -0.5, 0.5, 0.875, 0.5}, -- NodeBox42 + {0.40625, 0.75, 0.4375, 0.5, 0.8125, 0.8125}, -- NodeBox43 + {0.40625, 0.6875, 0.75, 0.5, 0.75, 1.0625}, -- NodeBox44 + {0.40625, 0.625, 1, 0.5, 0.6875, 1.1875}, -- NodeBox45 + {0.40625, 0.5625, 1.125, 0.5, 0.625, 1.3125}, -- NodeBox46 + {0.40625, 0.5, 1.25, 0.5, 0.5625, 1.375}, -- NodeBox47 + {0.40625, 0.4375, 1.3125, 0.5, 0.5, 1.4375}, -- NodeBox48 + {0.40625, 0.375, 1.375, 0.5, 0.4375, 1.5}, -- NodeBox49 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, 0.5, 1.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + if minetest.get_modpath("mesecons") then + minetest.register_node("bridger:large_beam_swivel_normal", { + description = "Large Wooden Swivel Bridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -1.5, 0.4375, -0.4375, 1.5}, -- NodeBox1 + {0.40625, -0.5, -0.6875, 0.5, 0.5, -0.59375}, -- NodeBox2 + {0.40625, -0.5, 0.59375, 0.5, 0.5, 0.6875}, -- NodeBox3 + {-0.5, -0.5, 0.59375, -0.40625, 0.5, 0.6875}, -- NodeBox4 + {-0.5, -0.5, -0.6875, -0.40625, 0.5, -0.59375}, -- NodeBox5 + {-0.5, 0.375, -1.5, -0.40625, 0.4375, 1.5}, -- NodeBox6 + {0.40625, 0.375, -1.5, 0.5, 0.4375, 1.5}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, 0.5, 1.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_beam_swivel_open", param2 = node.param2}) + end, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector = { + action_on = function (pos, node) + minetest.swap_node(pos, {name = "bridger:large_beam_swivel_open", param2 = node.param2}) + end, + }}, + on_blast = mesecon.on_blastnode, + }) + + minetest.register_node("bridger:large_beam_swivel_open", { + description = "Large Wooden Swivel Bridge", + drawtype = "nodebox", + tiles = {"default_wood.png^[transformR90"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, -0.4375, 1.5, -0.4375, 0.4375}, -- NodeBox1 + {-0.6875, -0.5, -0.5, -0.59375, 0.5, -0.40625}, -- NodeBox2 + {0.59375, -0.5, -0.5, 0.6875, 0.5, -0.40625}, -- NodeBox3 + {0.59375, -0.5, 0.40625, 0.6875, 0.5, 0.5}, -- NodeBox4 + {-0.6875, -0.5, 0.40625, -0.59375, 0.5, 0.5}, -- NodeBox5 + {-1.5, 0.375, 0.40625, 1.5, 0.4375, 0.5}, -- NodeBox6 + {-1.5, 0.375, -0.5, 1.5, 0.4375, -0.40625}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, -0.5, 1.5, 0.5, 0.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_beam_swivel_normal", param2 = node.param2}) + end, + drop = "bridger:large_beam_swivel_normal", + groups = {choppy=3, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector = { + action_off = function (pos, node) + minetest.swap_node(pos, {name = "bridger:large_beam_swivel_normal", param2 = node.param2}) + end, + }}, + on_blast = mesecon.on_blastnode, + }) + + minetest.register_node("bridger:large_drawbridge_normal", { + description = "Large Wooden Drawbridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.5, 0.4375, -0.4375, 1.5}, -- NodeBox1 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox2 + {0.40625, -0.5, 0.59375, 0.5, 0.5, 0.6875}, -- NodeBox3 + {-0.5, -0.5, 0.59375, -0.40625, 0.5, 0.6875}, -- NodeBox4 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox5 + {-0.5, 0.375, -0.5, -0.40625, 0.4375, 1.5}, -- NodeBox6 + {0.40625, 0.375, -0.5, 0.5, 0.4375, 1.5}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 1.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_drawbridge_open", param2 = node.param2}) + end, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector = { + action_on = function (pos, node) + minetest.swap_node(pos, {name = "bridger:large_drawbridge_open", param2 = node.param2}) + end, + }}, + }) + + minetest.register_node("bridger:large_drawbridge_open", { + description = "Large Wooden Drawbridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.5, 0.4375, -0.3125, -0.4375}, -- NodeBox1 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox2 + {0.40625, 0.875, 0.15625, 0.5, 2.125, 0.25}, -- NodeBox3 + {-0.5, 0.875, 0.15625, -0.40625, 2.125, 0.25}, -- NodeBox4 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox5 + {-0.5, 0.375, -0.5, -0.40625, 0.5625, -0.4375}, -- NodeBox6 + {0.40625, 0.375, -0.5, 0.5, 0.5625, -0.4375}, -- NodeBox7 + {-0.4375, -0.375, -0.4375, 0.4375, -0.1875, -0.375}, -- NodeBox8 + {-0.4375, -0.25, -0.375, 0.4375, -0.0625, -0.3125}, -- NodeBox9 + {-0.4375, -0.125, -0.3125, 0.4375, 0.0625, -0.25}, -- NodeBox10 + {-0.4375, 0, -0.25, 0.4375, 0.1875, -0.1875}, -- NodeBox11 + {-0.4375, 0.125, -0.1875, 0.4375, 0.3125, -0.125}, -- NodeBox12 + {-0.4375, 0.25, -0.125, 0.4375, 0.4375, -0.0625}, -- NodeBox13 + {-0.4375, 0.375, -0.0625, 0.4375, 0.5625, 0}, -- NodeBox14 + {-0.4375, 0.5, 0, 0.4375, 0.6875, 0.0625}, -- NodeBox15 + {-0.4375, 0.625, 0.0625, 0.4375, 0.8125, 0.125}, -- NodeBox16 + {-0.4375, 0.75, 0.125, 0.4375, 0.9375, 0.1875}, -- NodeBox17 + {-0.4375, 0.875, 0.1875, 0.4375, 1.0625, 0.25}, -- NodeBox18 + {-0.4375, 1, 0.25, 0.4375, 1.1875, 0.3125}, -- NodeBox19 + {-0.4375, 1.125, 0.3125, 0.4375, 1.3125, 0.375}, -- NodeBox20 + {-0.5, 0.5, -0.4375, -0.40625, 0.6875, -0.375}, -- NodeBox21 + {-0.5, 0.625, -0.375, -0.40625, 0.8125, -0.3125}, -- NodeBox22 + {-0.5, 0.75, -0.3125, -0.40625, 0.9375, -0.25}, -- NodeBox23 + {-0.5, 0.875, -0.25, -0.40625, 1.0625, -0.1875}, -- NodeBox24 + {-0.5, 1, -0.1875, -0.40625, 1.1875, -0.125}, -- NodeBox25 + {-0.5, 1.125, -0.125, -0.40625, 1.3125, -0.0625}, -- NodeBox26 + {-0.5, 1.25, -0.0625, -0.40625, 1.4375, 0}, -- NodeBox27 + {-0.5, 1.375, 0, -0.40625, 1.5625, 0.0625}, -- NodeBox28 + {-0.5, 1.5, 0.0625, -0.40625, 1.6875, 0.125}, -- NodeBox29 + {-0.5, 1.625, 0.125, -0.40625, 1.8125, 0.1875}, -- NodeBox30 + {-0.5, 1.75, 0.1875, -0.40625, 1.9375, 0.25}, -- NodeBox31 + {-0.5, 1.875, 0.25, -0.40625, 2.0625, 0.3125}, -- NodeBox32 + {-0.5, 2, 0.3125, -0.40625, 2.1875, 0.375}, -- NodeBox33 + {0.40625, 0.5, -0.4375, 0.5, 0.6875, -0.375}, -- NodeBox34 + {0.40625, 0.625, -0.375, 0.5, 0.8125, -0.3125}, -- NodeBox35 + {0.40625, 0.75, -0.3125, 0.5, 0.9375, -0.25}, -- NodeBox36 + {0.40625, 0.875, -0.25, 0.5, 1.0625, -0.1875}, -- NodeBox37 + {0.40625, 1, -0.1875, 0.5, 1.1875, -0.125}, -- NodeBox38 + {0.40625, 1.125, -0.125, 0.5, 1.3125, -0.0625}, -- NodeBox39 + {0.40625, 1.25, -0.0625, 0.5, 1.4375, 0}, -- NodeBox40 + {0.40625, 1.375, 0, 0.5, 1.5625, 0.0625}, -- NodeBox41 + {0.40625, 1.5, 0.0625, 0.5, 1.6875, 0.125}, -- NodeBox42 + {0.40625, 1.625, 0.125, 0.5, 1.8125, 0.1875}, -- NodeBox43 + {0.40625, 1.75, 0.1875, 0.5, 1.9375, 0.25}, -- NodeBox44 + {0.40625, 1.875, 0.25, 0.5, 2.0625, 0.3125}, -- NodeBox45 + {0.40625, 2, 0.3125, 0.5, 2.1875, 0.375}, -- NodeBox46 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 2.1875, 0.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_drawbridge_normal", param2 = node.param2}) + end, + drop = "bridger:large_drawbridge_normal", + groups = {choppy=3, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector = { + action_off = function (pos, node) + minetest.swap_node(pos, {name = "bridger:large_drawbridge_normal", param2 = node.param2}) + end, + }}, + on_blast = mesecon.on_blastnode, + }) + else + minetest.register_node("bridger:large_beam_swivel_normal", { + description = "Large Wooden Swivel Bridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -1.5, 0.4375, -0.4375, 1.5}, -- NodeBox1 + {0.40625, -0.5, -0.6875, 0.5, 0.5, -0.59375}, -- NodeBox2 + {0.40625, -0.5, 0.59375, 0.5, 0.5, 0.6875}, -- NodeBox3 + {-0.5, -0.5, 0.59375, -0.40625, 0.5, 0.6875}, -- NodeBox4 + {-0.5, -0.5, -0.6875, -0.40625, 0.5, -0.59375}, -- NodeBox5 + {-0.5, 0.375, -1.5, -0.40625, 0.4375, 1.5}, -- NodeBox6 + {0.40625, 0.375, -1.5, 0.5, 0.4375, 1.5}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, 0.5, 1.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_beam_swivel_open", param2 = node.param2}) + end, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:large_beam_swivel_open", { + description = "Large Wooden Swivel Bridge", + drawtype = "nodebox", + tiles = {"default_wood.png^[transformR90"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, -0.4375, 1.5, -0.4375, 0.4375}, -- NodeBox1 + {-0.6875, -0.5, -0.5, -0.59375, 0.5, -0.40625}, -- NodeBox2 + {0.59375, -0.5, -0.5, 0.6875, 0.5, -0.40625}, -- NodeBox3 + {0.59375, -0.5, 0.40625, 0.6875, 0.5, 0.5}, -- NodeBox4 + {-0.6875, -0.5, 0.40625, -0.59375, 0.5, 0.5}, -- NodeBox5 + {-1.5, 0.375, 0.40625, 1.5, 0.4375, 0.5}, -- NodeBox6 + {-1.5, 0.375, -0.5, 1.5, 0.4375, -0.40625}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1.5, -0.5, -0.5, 1.5, 0.5, 0.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_beam_swivel_normal", param2 = node.param2}) + end, + drop = "bridger:large_beam_swivel_normal", + groups = {choppy=3, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:large_drawbridge_normal", { + description = "Large Wooden Drawbridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.5, 0.4375, -0.4375, 1.5}, -- NodeBox1 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox2 + {0.40625, -0.5, 0.59375, 0.5, 0.5, 0.6875}, -- NodeBox3 + {-0.5, -0.5, 0.59375, -0.40625, 0.5, 0.6875}, -- NodeBox4 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox5 + {-0.5, 0.375, -0.5, -0.40625, 0.4375, 1.5}, -- NodeBox6 + {0.40625, 0.375, -0.5, 0.5, 0.4375, 1.5}, -- NodeBox7 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 1.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_drawbridge_open", param2 = node.param2}) + end, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("bridger:large_drawbridge_open", { + description = "Large Wooden Drawbridge", + drawtype = "nodebox", + tiles = {"default_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.5, 0.4375, -0.3125, -0.4375}, -- NodeBox1 + {0.40625, -0.5, -0.5, 0.5, 0.5, -0.40625}, -- NodeBox2 + {0.40625, 0.875, 0.15625, 0.5, 2.125, 0.25}, -- NodeBox3 + {-0.5, 0.875, 0.15625, -0.40625, 2.125, 0.25}, -- NodeBox4 + {-0.5, -0.5, -0.5, -0.40625, 0.5, -0.40625}, -- NodeBox5 + {-0.5, 0.375, -0.5, -0.40625, 0.5625, -0.4375}, -- NodeBox6 + {0.40625, 0.375, -0.5, 0.5, 0.5625, -0.4375}, -- NodeBox7 + {-0.4375, -0.375, -0.4375, 0.4375, -0.1875, -0.375}, -- NodeBox8 + {-0.4375, -0.25, -0.375, 0.4375, -0.0625, -0.3125}, -- NodeBox9 + {-0.4375, -0.125, -0.3125, 0.4375, 0.0625, -0.25}, -- NodeBox10 + {-0.4375, 0, -0.25, 0.4375, 0.1875, -0.1875}, -- NodeBox11 + {-0.4375, 0.125, -0.1875, 0.4375, 0.3125, -0.125}, -- NodeBox12 + {-0.4375, 0.25, -0.125, 0.4375, 0.4375, -0.0625}, -- NodeBox13 + {-0.4375, 0.375, -0.0625, 0.4375, 0.5625, 0}, -- NodeBox14 + {-0.4375, 0.5, 0, 0.4375, 0.6875, 0.0625}, -- NodeBox15 + {-0.4375, 0.625, 0.0625, 0.4375, 0.8125, 0.125}, -- NodeBox16 + {-0.4375, 0.75, 0.125, 0.4375, 0.9375, 0.1875}, -- NodeBox17 + {-0.4375, 0.875, 0.1875, 0.4375, 1.0625, 0.25}, -- NodeBox18 + {-0.4375, 1, 0.25, 0.4375, 1.1875, 0.3125}, -- NodeBox19 + {-0.4375, 1.125, 0.3125, 0.4375, 1.3125, 0.375}, -- NodeBox20 + {-0.5, 0.5, -0.4375, -0.40625, 0.6875, -0.375}, -- NodeBox21 + {-0.5, 0.625, -0.375, -0.40625, 0.8125, -0.3125}, -- NodeBox22 + {-0.5, 0.75, -0.3125, -0.40625, 0.9375, -0.25}, -- NodeBox23 + {-0.5, 0.875, -0.25, -0.40625, 1.0625, -0.1875}, -- NodeBox24 + {-0.5, 1, -0.1875, -0.40625, 1.1875, -0.125}, -- NodeBox25 + {-0.5, 1.125, -0.125, -0.40625, 1.3125, -0.0625}, -- NodeBox26 + {-0.5, 1.25, -0.0625, -0.40625, 1.4375, 0}, -- NodeBox27 + {-0.5, 1.375, 0, -0.40625, 1.5625, 0.0625}, -- NodeBox28 + {-0.5, 1.5, 0.0625, -0.40625, 1.6875, 0.125}, -- NodeBox29 + {-0.5, 1.625, 0.125, -0.40625, 1.8125, 0.1875}, -- NodeBox30 + {-0.5, 1.75, 0.1875, -0.40625, 1.9375, 0.25}, -- NodeBox31 + {-0.5, 1.875, 0.25, -0.40625, 2.0625, 0.3125}, -- NodeBox32 + {-0.5, 2, 0.3125, -0.40625, 2.1875, 0.375}, -- NodeBox33 + {0.40625, 0.5, -0.4375, 0.5, 0.6875, -0.375}, -- NodeBox34 + {0.40625, 0.625, -0.375, 0.5, 0.8125, -0.3125}, -- NodeBox35 + {0.40625, 0.75, -0.3125, 0.5, 0.9375, -0.25}, -- NodeBox36 + {0.40625, 0.875, -0.25, 0.5, 1.0625, -0.1875}, -- NodeBox37 + {0.40625, 1, -0.1875, 0.5, 1.1875, -0.125}, -- NodeBox38 + {0.40625, 1.125, -0.125, 0.5, 1.3125, -0.0625}, -- NodeBox39 + {0.40625, 1.25, -0.0625, 0.5, 1.4375, 0}, -- NodeBox40 + {0.40625, 1.375, 0, 0.5, 1.5625, 0.0625}, -- NodeBox41 + {0.40625, 1.5, 0.0625, 0.5, 1.6875, 0.125}, -- NodeBox42 + {0.40625, 1.625, 0.125, 0.5, 1.8125, 0.1875}, -- NodeBox43 + {0.40625, 1.75, 0.1875, 0.5, 1.9375, 0.25}, -- NodeBox44 + {0.40625, 1.875, 0.25, 0.5, 2.0625, 0.3125}, -- NodeBox45 + {0.40625, 2, 0.3125, 0.5, 2.1875, 0.375}, -- NodeBox46 + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 2.1875, 0.5}, + }, + }, + on_rightclick = function(pos, node) + minetest.set_node(pos, {name = "bridger:large_drawbridge_normal", param2 = node.param2}) + end, + drop = "bridger:large_drawbridge_normal", + groups = {choppy=3, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + }) + end + + minetest.register_node("bridger:deck_wood", { + description = "Wooden Deck", + drawtype = "nodebox", + tiles = {"default_junglewood.png"}, + paramtype = "light", + sunlight_propagates = true, + node_box = { + type = "fixed", + fixed = { + {-0.5, 0.375, -0.5, 0.5, 0.501, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, + }, + }, + groups = {choppy=3}, + sounds = default.node_sound_wood_defaults(), + }) +end \ No newline at end of file diff --git a/mods/bridger/screenshot.png b/mods/bridger/screenshot.png new file mode 100644 index 00000000..5a692763 Binary files /dev/null and b/mods/bridger/screenshot.png differ diff --git a/mods/bridger/settingtypes.txt b/mods/bridger/settingtypes.txt new file mode 100644 index 00000000..f696a5d2 --- /dev/null +++ b/mods/bridger/settingtypes.txt @@ -0,0 +1,15 @@ +# Bridger Settings + +# Enable aliasing for old worlds using Bridger. +Bridger_enable_alias (Use compatability aliasing) bool false + +# Enable wooden footbridges and drawbridges. This setting does not include +# trestles. +bridger_enable_wooden_bridges (Enable wooden bridges) bool true + +# Enable wooden trestle bridge components. +bridger_enable_trestles (Enable trestles) bool true + +# Enable metal truss bridges (Tubular, truss supports, substructure, +# superstructure, chords, deck, etc.) Also enables concrete supports. +bridger_enable_trusses (Enable metal trusses) bool true \ No newline at end of file diff --git a/mods/bridger/textures/bridges_corrugated_steel_green.png b/mods/bridger/textures/bridges_corrugated_steel_green.png new file mode 100644 index 00000000..4af78e06 Binary files /dev/null and b/mods/bridger/textures/bridges_corrugated_steel_green.png differ diff --git a/mods/bridger/textures/bridges_corrugated_steel_red.png b/mods/bridger/textures/bridges_corrugated_steel_red.png new file mode 100644 index 00000000..d69423ed Binary files /dev/null and b/mods/bridger/textures/bridges_corrugated_steel_red.png differ diff --git a/mods/bridger/textures/bridges_corrugated_steel_steel.png b/mods/bridger/textures/bridges_corrugated_steel_steel.png new file mode 100644 index 00000000..387b884b Binary files /dev/null and b/mods/bridger/textures/bridges_corrugated_steel_steel.png differ diff --git a/mods/bridger/textures/bridges_corrugated_steel_white.png b/mods/bridger/textures/bridges_corrugated_steel_white.png new file mode 100644 index 00000000..33c71b19 Binary files /dev/null and b/mods/bridger/textures/bridges_corrugated_steel_white.png differ diff --git a/mods/bridger/textures/bridges_corrugated_steel_yellow.png b/mods/bridger/textures/bridges_corrugated_steel_yellow.png new file mode 100644 index 00000000..70ba88f1 Binary files /dev/null and b/mods/bridger/textures/bridges_corrugated_steel_yellow.png differ diff --git a/mods/bridger/textures/bridges_diagonal_steel_rod.png b/mods/bridger/textures/bridges_diagonal_steel_rod.png new file mode 100644 index 00000000..2cfc9766 Binary files /dev/null and b/mods/bridger/textures/bridges_diagonal_steel_rod.png differ diff --git a/mods/bridger/textures/bridges_green.png b/mods/bridger/textures/bridges_green.png new file mode 100644 index 00000000..027ae187 Binary files /dev/null and b/mods/bridger/textures/bridges_green.png differ diff --git a/mods/bridger/textures/bridges_large_support.png b/mods/bridger/textures/bridges_large_support.png new file mode 100644 index 00000000..24a25461 Binary files /dev/null and b/mods/bridger/textures/bridges_large_support.png differ diff --git a/mods/bridger/textures/bridges_large_support_bot.png b/mods/bridger/textures/bridges_large_support_bot.png new file mode 100644 index 00000000..d146cba7 Binary files /dev/null and b/mods/bridger/textures/bridges_large_support_bot.png differ diff --git a/mods/bridger/textures/bridges_large_upper_chord.png b/mods/bridger/textures/bridges_large_upper_chord.png new file mode 100644 index 00000000..332fc1b9 Binary files /dev/null and b/mods/bridger/textures/bridges_large_upper_chord.png differ diff --git a/mods/bridger/textures/bridges_large_upper_chord_slanted.png b/mods/bridger/textures/bridges_large_upper_chord_slanted.png new file mode 100644 index 00000000..3bf8c6ce Binary files /dev/null and b/mods/bridger/textures/bridges_large_upper_chord_slanted.png differ diff --git a/mods/bridger/textures/bridges_lattice_truss_side.png b/mods/bridger/textures/bridges_lattice_truss_side.png new file mode 100644 index 00000000..98958b64 Binary files /dev/null and b/mods/bridger/textures/bridges_lattice_truss_side.png differ diff --git a/mods/bridger/textures/bridges_lattice_truss_top.png b/mods/bridger/textures/bridges_lattice_truss_top.png new file mode 100644 index 00000000..c24e63bc Binary files /dev/null and b/mods/bridger/textures/bridges_lattice_truss_top.png differ diff --git a/mods/bridger/textures/bridges_medium_support.png b/mods/bridger/textures/bridges_medium_support.png new file mode 100644 index 00000000..a6605b11 Binary files /dev/null and b/mods/bridger/textures/bridges_medium_support.png differ diff --git a/mods/bridger/textures/bridges_medium_support_bot.png b/mods/bridger/textures/bridges_medium_support_bot.png new file mode 100644 index 00000000..423a4e57 Binary files /dev/null and b/mods/bridger/textures/bridges_medium_support_bot.png differ diff --git a/mods/bridger/textures/bridges_medium_upper_chord.png b/mods/bridger/textures/bridges_medium_upper_chord.png new file mode 100644 index 00000000..34359d80 Binary files /dev/null and b/mods/bridger/textures/bridges_medium_upper_chord.png differ diff --git a/mods/bridger/textures/bridges_medium_upper_chord_slanted.png b/mods/bridger/textures/bridges_medium_upper_chord_slanted.png new file mode 100644 index 00000000..60ebadee Binary files /dev/null and b/mods/bridger/textures/bridges_medium_upper_chord_slanted.png differ diff --git a/mods/bridger/textures/bridges_red.png b/mods/bridger/textures/bridges_red.png new file mode 100644 index 00000000..dd761124 Binary files /dev/null and b/mods/bridger/textures/bridges_red.png differ diff --git a/mods/bridger/textures/bridges_scaffolding.png b/mods/bridger/textures/bridges_scaffolding.png new file mode 100644 index 00000000..1ecdb967 Binary files /dev/null and b/mods/bridger/textures/bridges_scaffolding.png differ diff --git a/mods/bridger/textures/bridges_scaffolding_detail.png b/mods/bridger/textures/bridges_scaffolding_detail.png new file mode 100644 index 00000000..e6406222 Binary files /dev/null and b/mods/bridger/textures/bridges_scaffolding_detail.png differ diff --git a/mods/bridger/textures/bridges_small_support.png b/mods/bridger/textures/bridges_small_support.png new file mode 100644 index 00000000..a23448fb Binary files /dev/null and b/mods/bridger/textures/bridges_small_support.png differ diff --git a/mods/bridger/textures/bridges_small_support_top.png b/mods/bridger/textures/bridges_small_support_top.png new file mode 100644 index 00000000..8a4c95fd Binary files /dev/null and b/mods/bridger/textures/bridges_small_support_top.png differ diff --git a/mods/bridger/textures/bridges_small_upper_chord.png b/mods/bridger/textures/bridges_small_upper_chord.png new file mode 100644 index 00000000..14dcdff3 Binary files /dev/null and b/mods/bridger/textures/bridges_small_upper_chord.png differ diff --git a/mods/bridger/textures/bridges_small_upper_chord_slanted.png b/mods/bridger/textures/bridges_small_upper_chord_slanted.png new file mode 100644 index 00000000..81e13b88 Binary files /dev/null and b/mods/bridger/textures/bridges_small_upper_chord_slanted.png differ diff --git a/mods/bridger/textures/bridges_steel.png b/mods/bridger/textures/bridges_steel.png new file mode 100644 index 00000000..fc9693a4 Binary files /dev/null and b/mods/bridger/textures/bridges_steel.png differ diff --git a/mods/bridger/textures/bridges_steel_rod.png b/mods/bridger/textures/bridges_steel_rod.png new file mode 100644 index 00000000..9eb6529f Binary files /dev/null and b/mods/bridger/textures/bridges_steel_rod.png differ diff --git a/mods/bridger/textures/bridges_substructure_end_left_slant.png b/mods/bridger/textures/bridges_substructure_end_left_slant.png new file mode 100644 index 00000000..cad60862 Binary files /dev/null and b/mods/bridger/textures/bridges_substructure_end_left_slant.png differ diff --git a/mods/bridger/textures/bridges_substructure_end_right_slant.png b/mods/bridger/textures/bridges_substructure_end_right_slant.png new file mode 100644 index 00000000..9a67e54e Binary files /dev/null and b/mods/bridger/textures/bridges_substructure_end_right_slant.png differ diff --git a/mods/bridger/textures/bridges_substructure_left_slant.png b/mods/bridger/textures/bridges_substructure_left_slant.png new file mode 100644 index 00000000..29387edd Binary files /dev/null and b/mods/bridger/textures/bridges_substructure_left_slant.png differ diff --git a/mods/bridger/textures/bridges_substructure_mid.png b/mods/bridger/textures/bridges_substructure_mid.png new file mode 100644 index 00000000..d5acb581 Binary files /dev/null and b/mods/bridger/textures/bridges_substructure_mid.png differ diff --git a/mods/bridger/textures/bridges_substructure_right_slant.png b/mods/bridger/textures/bridges_substructure_right_slant.png new file mode 100644 index 00000000..cc2df749 Binary files /dev/null and b/mods/bridger/textures/bridges_substructure_right_slant.png differ diff --git a/mods/bridger/textures/bridges_substructure_simple.png b/mods/bridger/textures/bridges_substructure_simple.png new file mode 100644 index 00000000..d312f17d Binary files /dev/null and b/mods/bridger/textures/bridges_substructure_simple.png differ diff --git a/mods/bridger/textures/bridges_superstructure_down_left_slant.png b/mods/bridger/textures/bridges_superstructure_down_left_slant.png new file mode 100644 index 00000000..0303ed06 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_down_left_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_down_mid.png b/mods/bridger/textures/bridges_superstructure_down_mid.png new file mode 100644 index 00000000..b66d2069 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_down_mid.png differ diff --git a/mods/bridger/textures/bridges_superstructure_down_right_slant.png b/mods/bridger/textures/bridges_superstructure_down_right_slant.png new file mode 100644 index 00000000..668a3c46 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_down_right_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_down_simple.png b/mods/bridger/textures/bridges_superstructure_down_simple.png new file mode 100644 index 00000000..a4e82820 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_down_simple.png differ diff --git a/mods/bridger/textures/bridges_superstructure_end_left_slant.png b/mods/bridger/textures/bridges_superstructure_end_left_slant.png new file mode 100644 index 00000000..2c4a2b83 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_end_left_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_end_right_slant.png b/mods/bridger/textures/bridges_superstructure_end_right_slant.png new file mode 100644 index 00000000..9dffcdf3 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_end_right_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_left_slant.png b/mods/bridger/textures/bridges_superstructure_left_slant.png new file mode 100644 index 00000000..95353db8 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_left_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_mid.png b/mods/bridger/textures/bridges_superstructure_mid.png new file mode 100644 index 00000000..2aa4b55e Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_mid.png differ diff --git a/mods/bridger/textures/bridges_superstructure_right_slant.png b/mods/bridger/textures/bridges_superstructure_right_slant.png new file mode 100644 index 00000000..816635fd Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_right_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_simple.png b/mods/bridger/textures/bridges_superstructure_simple.png new file mode 100644 index 00000000..415f6077 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_simple.png differ diff --git a/mods/bridger/textures/bridges_superstructure_simple_end_left.png b/mods/bridger/textures/bridges_superstructure_simple_end_left.png new file mode 100644 index 00000000..3ca86ecc Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_simple_end_left.png differ diff --git a/mods/bridger/textures/bridges_superstructure_simple_end_right.png b/mods/bridger/textures/bridges_superstructure_simple_end_right.png new file mode 100644 index 00000000..cb9f008b Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_simple_end_right.png differ diff --git a/mods/bridger/textures/bridges_superstructure_tall_left_slant.png b/mods/bridger/textures/bridges_superstructure_tall_left_slant.png new file mode 100644 index 00000000..554d3b29 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_tall_left_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_tall_mid.png b/mods/bridger/textures/bridges_superstructure_tall_mid.png new file mode 100644 index 00000000..e639faa6 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_tall_mid.png differ diff --git a/mods/bridger/textures/bridges_superstructure_tall_right_slant.png b/mods/bridger/textures/bridges_superstructure_tall_right_slant.png new file mode 100644 index 00000000..94632aed Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_tall_right_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_tall_simple.png b/mods/bridger/textures/bridges_superstructure_tall_simple.png new file mode 100644 index 00000000..3d5a27f4 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_tall_simple.png differ diff --git a/mods/bridger/textures/bridges_superstructure_tall_simple_end_left.png b/mods/bridger/textures/bridges_superstructure_tall_simple_end_left.png new file mode 100644 index 00000000..38d76d8b Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_tall_simple_end_left.png differ diff --git a/mods/bridger/textures/bridges_superstructure_tall_simple_end_right.png b/mods/bridger/textures/bridges_superstructure_tall_simple_end_right.png new file mode 100644 index 00000000..ec040eb0 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_tall_simple_end_right.png differ diff --git a/mods/bridger/textures/bridges_superstructure_up_left_slant.png b/mods/bridger/textures/bridges_superstructure_up_left_slant.png new file mode 100644 index 00000000..2312139d Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_up_left_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_up_mid.png b/mods/bridger/textures/bridges_superstructure_up_mid.png new file mode 100644 index 00000000..94006593 Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_up_mid.png differ diff --git a/mods/bridger/textures/bridges_superstructure_up_right_slant.png b/mods/bridger/textures/bridges_superstructure_up_right_slant.png new file mode 100644 index 00000000..6cf7110b Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_up_right_slant.png differ diff --git a/mods/bridger/textures/bridges_superstructure_up_simple.png b/mods/bridger/textures/bridges_superstructure_up_simple.png new file mode 100644 index 00000000..ffd5475f Binary files /dev/null and b/mods/bridger/textures/bridges_superstructure_up_simple.png differ diff --git a/mods/bridger/textures/bridges_trestle_deck.png b/mods/bridger/textures/bridges_trestle_deck.png new file mode 100644 index 00000000..28c3819b Binary files /dev/null and b/mods/bridger/textures/bridges_trestle_deck.png differ diff --git a/mods/bridger/textures/bridges_trestle_large.png b/mods/bridger/textures/bridges_trestle_large.png new file mode 100644 index 00000000..b460540a Binary files /dev/null and b/mods/bridger/textures/bridges_trestle_large.png differ diff --git a/mods/bridger/textures/bridges_trestle_side.png b/mods/bridger/textures/bridges_trestle_side.png new file mode 100644 index 00000000..c1fa5e4d Binary files /dev/null and b/mods/bridger/textures/bridges_trestle_side.png differ diff --git a/mods/bridger/textures/bridges_trestle_small.png b/mods/bridger/textures/bridges_trestle_small.png new file mode 100644 index 00000000..33402fa2 Binary files /dev/null and b/mods/bridger/textures/bridges_trestle_small.png differ diff --git a/mods/bridger/textures/bridges_trestle_support.png b/mods/bridger/textures/bridges_trestle_support.png new file mode 100644 index 00000000..20c698c8 Binary files /dev/null and b/mods/bridger/textures/bridges_trestle_support.png differ diff --git a/mods/bridger/textures/bridges_trestle_support_small.png b/mods/bridger/textures/bridges_trestle_support_small.png new file mode 100644 index 00000000..c9c2e906 Binary files /dev/null and b/mods/bridger/textures/bridges_trestle_support_small.png differ diff --git a/mods/bridger/textures/bridges_white.png b/mods/bridger/textures/bridges_white.png new file mode 100644 index 00000000..610da792 Binary files /dev/null and b/mods/bridger/textures/bridges_white.png differ diff --git a/mods/bridger/textures/bridges_wooden_rod.png b/mods/bridger/textures/bridges_wooden_rod.png new file mode 100644 index 00000000..89ad9fc9 Binary files /dev/null and b/mods/bridger/textures/bridges_wooden_rod.png differ diff --git a/mods/bridger/textures/bridges_yellow.png b/mods/bridger/textures/bridges_yellow.png new file mode 100644 index 00000000..6b5f4a3d Binary files /dev/null and b/mods/bridger/textures/bridges_yellow.png differ diff --git a/mods/cards/README.txt b/mods/cards/README.txt new file mode 100644 index 00000000..0857e0d6 --- /dev/null +++ b/mods/cards/README.txt @@ -0,0 +1,35 @@ +Minetest Cards Mod +-------------------------- + +Adds cards to Minetest. + + +Depends on nothing. + +Crafting recipes require Minetest Game's dye and default mods: +Recipe of cardbox: +default:chest, dye:black, dye:green, +default:clay_lump, dye:red, dye:blue, +default:paper, default:paper, default:paper + + +LICENSE: + +Code: + +Copyright (C) 2017 Jannik Kulesha (Gerald) + +LPGL v2.1 +See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Textures: + +Apple, Sword, Coal and Mese are taken from Minetest Game's default mod by +celeron55 (Perttu Ahola) and various other people. The sword has been shortened. +This textures are under CC-BY-SA 3.0. +See http://creativecommons.org/licenses/by-sa/3.0/ + +Everything else by Jannik Kulesha and under the CC-BY-SA 3.0. +See http://creativecommons.org/licenses/by-sa/3.0/ + \ No newline at end of file diff --git a/mods/cards/depends.txt b/mods/cards/depends.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/cards/description.txt b/mods/cards/description.txt new file mode 100644 index 00000000..57f8fe01 --- /dev/null +++ b/mods/cards/description.txt @@ -0,0 +1 @@ +Adds playing cards to Minetest \ No newline at end of file diff --git a/mods/cards/init.lua b/mods/cards/init.lua new file mode 100644 index 00000000..9064a7e6 --- /dev/null +++ b/mods/cards/init.lua @@ -0,0 +1,701 @@ + +math.randomseed(os.time()) + +local STACK_FORM = "size[2,6]".. + "button_exit[0,0;2,1;draw_turned;draw turned]".. + "button_exit[0,1;2,1;shuffle;shuffle]".. + "button_exit[0,2;2,1;flip;flip]".. + "button_exit[0,3;2,1;remove;delete stack]".. + "button_exit[0,4;2,1;quit;quit]" +local CARD_FORM = "size[3,5]".. + "button_exit[0,0;3,1;flip;flip]".. + "button_exit[0,1;3,1;shuffle;shuffle]".. + "button_exit[0,2;3,1;delete;not show again]".. + "button_exit[0,3;3,1;quit;quit]" +local box_form = "size[10,4]" +local CARDS_PER_BOX = 500 + + +minetest.register_node("cards:turned_card", { + description = "a turned card", + inventory_image = "cards_back_2.png", + wield_image = "cards_back_2.png", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, -0.4375 , 0.5}} + }, + tiles = {"cards_back_2.png", "cards_back_2.png", + "cards_side.png", "cards_side.png", + "cards_side.png", "cards_side.png" + }, + paramtype = "light", + paramtype2 = "facedir", + after_place_node = function(pos, placer, itemstack, pointed_thing) + local card = itemstack:get_metadata() + local deckname = string.sub(card, 12, string.find(card, "_", 12) - 1) + minetest.swap_node(pos, {name = "cards:stack_"..deckname}) + local meta = minetest.get_meta(pos) + meta:set_int("count", 0) + meta:set_string(0, card) + meta:set_string("infotext", 1) + meta:set_string("formspec", STACK_FORM) + end, + groups = {oddly_breakable_by_hand = 3, card = 3, not_in_creative_inventory = 1}, +}) + +local num_decks = 0 + +local function register_deck(deckname, data) + local name = "cards:deck_"..deckname + local cardname = data.cardname + local stackname = "cards:stack_"..cardname + local size = data.number_of_suits * data.number_of_values + box_form = box_form.. + "item_image_button["..num_decks..",2;1,1;"..name..";"..name.."#"..size..";]".. + "label["..num_decks..",1;"..deckname.."]".. + "label["..num_decks..",3;"..size.."]" + num_decks = num_decks + 1 + minetest.register_craftitem(name, { + description = "set of playing cards ("..deckname..")", + inventory_image = data.inventory_image, + wield_image = data.inventory_image, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local new_stack = true + if minetest.get_item_group(node.name, "card") == 2 then + new_stack = false + elseif not minetest.registered_nodes[node.name].buildable_to then + pos = pointed_thing.above + node = minetest.get_node(pos) + if not minetest.registered_nodes[node.name].buildable_to then + return + end + end + if minetest.is_protected(pos, placer:get_player_name())then + return + end + if new_stack then + node.name = stackname + minetest.set_node(pos, node) + end + itemstack:take_item() + -- set cards + local meta = minetest.get_meta(pos) + local old_count = 0 + if not new_stack then + old_count = meta:get_int("count") + 1 + end + local count = size + local set = {} + for s = 1, data.number_of_suits do + for v = 1, data.number_of_values do + local r = math.random(1, count) + local i = -1 + while r > 0 do + i = i + 1 + if not set[i] then + r = r - 1 + end + end + set[i] = true + meta:set_string(i + old_count, "cards:card_"..cardname.."_"..data.suits[s].."_"..data.values[v]) + count = count - 1 + end + end + meta:set_int("count", old_count + size - 1) + meta:set_string("infotext", old_count + size) + meta:set_string("formspec", STACK_FORM) + return itemstack + end, + }) + minetest.register_craft({ + output = "cards:card_box "..size, + recipe = {{name}}, + }) + if not minetest.registered_nodes[stackname] then + minetest.register_node(stackname, { + description = "set of playing cards ("..cardname..")", + inventory_image = data.back_texture, + wield_image = data.back_texture, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, -0.25 , 0.5}} + }, + tiles = {data.back_texture, data.back_texture, + "cards_side.png", "cards_side.png", + "cards_side.png", "cards_side.png" + }, + paramtype = "light", + paramtype2 = "facedir", + on_dig = function(pos, node, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + local top = meta:get_string(count) + player:get_inventory():add_item("main", top) + if count == 0 then + node.name = "air" + minetest.set_node(pos, node) + return + else + meta:set_int("count", count - 1) + meta:set_string("infotext", count) + end + end, + on_receive_fields = function(pos, formname, fields, player) + if fields.flip then + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + for i = 0, count / 2 do + local a = meta:get_string(i) + local b = meta:get_string(count - i) + meta:set_string(i, b) + meta:set_string(count - i, a) + end + meta:set_string("formspec", CARD_FORM) + minetest.swap_node(pos, {name = meta:get_string(count)}) + elseif fields.draw_turned then + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + local top = meta:get_string(count) + player:get_inventory():add_item("main", {name="cards:turned_card", count=1, wear=0, metadata= top}) + if count == 0 then + minetest.set_node(pos, {name = "air"}) + return + else + meta:set_int("count", count - 1) + meta:set_string("infotext", count) + end + elseif fields.remove then + minetest.set_node(pos, {name = "air"}) + elseif fields.shuffle then + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + for i = 0, count do + local j = math.random(i, count) + local a = meta:get_string(i) + local b = meta:get_string(j) + meta:set_string(i, b) + meta:set_string(j, a) + end + end + end, + groups = {oddly_breakable_by_hand = 3, card = 2}, + }) + end + + for s = 1, data.number_of_suits do + for v = 1, data.number_of_values do + local name = "cards:card_"..cardname.."_"..data.suits[s].."_"..data.values[v] + if not minetest.registered_nodes[name] then + local texture = data.value_textures[v].."^"..data.suit_textures[s].."^[colorize:"..data.colors[s].."^[noalpha" + if data.not_colorize_suit then + texture = data.value_textures[v].."^[colorize:"..data.colors[s].."^"..data.suit_textures[s].."^[noalpha" + end + minetest.register_node(name, { + description = data.suits[s].." "..data.values[v], + inventory_image = texture, + wield_image = data.back_texture, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, -0.4375 , 0.5}} + }, + tiles = {texture, data.back_texture, + "cards_side.png", "cards_side.png", + "cards_side.png", "cards_side.png" + }, + paramtype = "light", + paramtype2 = "facedir", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + local pos = pointed_thing.under + local node = minetest.get_node(pos) + local stack_type = minetest.get_node_group(node.name, "card") + if stack_type == 0 then + return minetest.item_place(itemstack, placer, pointed_thing) -- default + end + if minetest.is_protected(pos, placer:get_player_name()) then + return + end + -- add card to stack + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + if count == 0 then + meta:set_string(count, node.name) + meta:set_string("formspec", CARD_FORM) + end + count = count + 1 + meta:set_string(count, name) + meta:set_int("count", count) + meta:set_string("infotext", count + 1) + if stack_type == 1 then + node.name = name + minetest.swap_node(pos, node) + end + itemstack:take_item() + return itemstack + end, + on_dig = function(pos, node, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + if count == 0 then + minetest.node_dig(pos, node, player) + return + end + local top = meta:get_string(count) + player:get_inventory():add_item("main", top) + count = count - 1 + node.name = meta:get_string(count) + meta:set_int("count", count) + meta:set_string("infotext", count + 1) + minetest.swap_node(pos, node) + end, + on_receive_fields = function(pos, formname, fields, player) + if fields.collect then + local meta = minetest.get_meta(pos) + if meta:get_int("count") == size then + player:get_inventory():add_item("main", + "cards:stack_"..deckname) + minetest.set_node(pos, {name = "air"}) + else + minetest.chat_send_player(player:get_player_name(), + "[cards] stack not complete!") + end + elseif fields.flip then + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + for i = 0, count / 2 do + local a = meta:get_string(i) + local b = meta:get_string(count - i) + meta:set_string(i, b) + meta:set_string(count - i, a) + end + meta:set_string("formspec", STACK_FORM) + minetest.swap_node(pos, {name = "cards:stack_"..deckname}) + elseif fields.shuffle then + local meta = minetest.get_meta(pos) + local count = meta:get_int("count") + for i = 0, count do + local j = math.random(i, count) + local a = meta:get_string(i) + local b = meta:get_string(j) + meta:set_string(i, b) + meta:set_string(j, a) + end + minetest.swap_node(pos, {name = meta:get_string(count)}) + elseif fields.delete then + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + end + end, + groups = {oddly_breakable_by_hand = 3, card = 1}, + }) + end + end + end +end + +register_deck("32", { + cardname = "green", + number_of_suits = 4, + number_of_values = 8, + colors = {"#F00", "#F00", "#000", "#000"}, + suits = {"tiles", "hearts", "pikes", "clovers"}, + suit_textures = { + "cards_tile.png", + "cards_heart.png", + "cards_pike.png", + "cards_clover.png" + }, + values = {"7", "8", "9", "10", "J", "Q", "K", "A"}, + value_textures = { + "cards_7.png", + "cards_8.png", + "cards_9.png", + "cards_10.png", + "cards_J.png", + "cards_Q.png", + "cards_K.png", + "cards_A.png" + }, + back_texture = "cards_back_3.png", + inventory_image = "cards_deck_32.png", +}) + +register_deck("52", { + cardname = "blue", + number_of_suits = 4, + number_of_values = 13, + colors = {"#FA0", "#F00", "#0B0", "#000"}, + suits = {"tiles", "hearts", "pikes", "clovers"}, + suit_textures = { + "cards_tile.png", + "cards_heart.png", + "cards_pike.png", + "cards_clover.png" + }, + values = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}, + value_textures = { + "cards_2.png", + "cards_3.png", + "cards_4.png", + "cards_5.png", + "cards_6.png", + "cards_7.png", + "cards_8.png", + "cards_9.png", + "cards_10.png", + "cards_J.png", + "cards_Q.png", + "cards_K.png", + "cards_A.png" + }, + back_texture = "cards_back.png", + inventory_image = "cards_deck_52.png", +}) + +--[[ +register_deck("104", { + cardname = "blue", + number_of_suits = 8, + number_of_values = 13, + colors = {"#FA0", "#F00", "#0B0", "#000"}, + suits = {"tiles", "hearts", "pikes", "clovers", "tiles", "hearts", "pikes", "clovers"}, + suit_textures = { + "cards_tile.png", + "cards_heart.png", + "cards_pike.png", + "cards_clover.png" + }, + values = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}, + value_textures = { + "cards_2.png", + "cards_3.png", + "cards_4.png", + "cards_5.png", + "cards_6.png", + "cards_7.png", + "cards_8.png", + "cards_9.png", + "cards_10.png", + "cards_J.png", + "cards_Q.png", + "cards_K.png", + "cards_A.png" + }, + back_texture = "cards_back.png", + inventory_image = "cards_deck_104.png", +})]]-- + +register_deck("Joker", { + cardname = "Joker", + number_of_suits = 3, + number_of_values = 2, + colors = {"#000", "#F00", "#800"}, + suits = {"black", "red", "dark"}, + suit_textures = { + "cards_joker.png", + "cards_joker.png", + "cards_joker.png" + }, + values = { "joker", "joker"}, + value_textures = { + "cards_J.png", + }, + back_texture = "cards_back.png", + inventory_image = "cards_deck_joker.png", +}) + +register_deck("Minetest", { + cardname = "Minetest", + number_of_suits = 4, + number_of_values = 13, + not_colorize_suit = true, + colors = {"#FA0", "#F00", "#11B", "#000"}, + suits = {"mese", "apples", "swords", "coal"}, + suit_textures = { + "cards_mese_crystal.png", + "cards_apple.png", + "cards_tool_diamondsword.png", + "cards_coal_lump.png" + }, + values = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}, + value_textures = { + "cards_2.png", + "cards_3.png", + "cards_4.png", + "cards_5.png", + "cards_6.png", + "cards_7.png", + "cards_8.png", + "cards_9.png", + "cards_10.png", + "cards_J.png", + "cards_Q.png", + "cards_K.png", + "cards_A.png" + }, + back_texture = "cards_back_mese.png", + inventory_image = "cards_deck_minetest_52.png", +}) + +------ +-- Box + +local show_box_formspec = function(itemstack, player, pointed_thing, formpart) + if player:is_player() then + if not formpart then + formpart = "" + end + minetest.show_formspec(player:get_player_name(), "cards:card_box", + box_form..formpart.."button[6,0;4,1;collect;collect from inventory]".."label[0,0;Parts left:".. + math.floor(itemstack:get_count()).."]") + end +end +local show_box_formspec_open = function(itemstack, player, pointed_thing) + return show_box_formspec(itemstack, player, pointed_thing, "button_exit[4,0;2,1;close;close]") +end +local show_box_formspec_closed = function(itemstack, player, pointed_thing) + return show_box_formspec(itemstack, player, pointed_thing, "button_exit[4,0;2,1;open;open]") +end + + +minetest.register_node("cards:card_box_open", { + description = "Box which spawns card decks", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{0.5, -0.5, -0.5, -0.125, 0 , 0.5}, + {-0.125, 0, -0.5, -0.25, 0.625 , 0.5},} + }, + tiles = {"default_wood.png^cards_card_box_top.png","default_wood.png", + "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png" + }, + paramtype = "light", + stack_max = CARDS_PER_BOX, + on_place = show_box_formspec_open, + on_secondary_use = show_box_formspec_open, + on_use = function(itemstack, player, pointed_thing) --leftclick + if pointed_thing.type ~= "node" then + return nil + end + local pos = pointed_thing.under + if minetest.is_protected(pos, player:get_player_name()) then + return nil + end + local node = minetest.get_node(pos) + if minetest.get_node_group(node.name, "card") == 0 and + minetest.get_node_group(node.name, "jeton") == 0 then + return nil + end + local meta = minetest.get_meta(pos) + local count = meta:get_int("infotext") + if count == 0 then + count = 1 + end + itemstack:set_count(itemstack:get_count() + count) + minetest.remove_node(pos) + return itemstack + end, +}) +minetest.register_node("cards:card_box", { + description = "Box which spawns card decks", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{0.5, -0.5, -0.5, -0.125, 0.125 , 0.5}} + }, + tiles = {"default_wood.png","default_wood.png", + "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png" + }, + paramtype = "light", + stack_max = CARDS_PER_BOX, + on_place = show_box_formspec_closed, + on_secondary_use = show_box_formspec_closed, + on_use = function(itemstack, player, pointed_thing) --leftclick + if pointed_thing.type ~= "node" then + return nil + end + local pos = pointed_thing.under + if minetest.is_protected(pos, player:get_player_name()) then + return nil + end + local node = minetest.get_node(pos) + if minetest.get_node_group(node.name, "card") == 0 and + minetest.get_node_group(node.name, "jeton") == 0 then + return nil + end + minetest.chat_send_player(player:get_player_name(), "Open in menu to collect pieces") + return nil + end, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "cards:card_box" then + return false + end + local itemstack = player:get_wielded_item() + if fields.open then + itemstack:set_name("cards:card_box_open") + player:set_wielded_item(itemstack) + return true + end + if fields.close then + itemstack:set_name("cards:card_box") + player:set_wielded_item(itemstack) + return true + end + if fields.quit then + return true + end + local inv = player:get_inventory() + if fields.collect then + local collected = 0 + local list = inv:get_list("main") + for i, stack in ipairs(list) do + local name = stack:get_name() + if minetest.get_item_group(name, "card") > 0 or + minetest.get_item_group(name, "jeton") > 0 then + collected = collected + stack:get_count() + stack:clear() + list[i]=stack + end + end + inv:set_list("main", list) + itemstack:set_count(itemstack:get_count() + collected) + player:set_wielded_item(itemstack) + show_box_formspec(itemstack, player) + return true + end + for key,value in pairs(fields) do + local d = string.find(key,"#") + local itemname = string.sub(key,1,d-1) + local cost = tonumber(string.sub(key, d+1)) + local count = itemstack:get_count() + if cost < count then + inv:add_item("main", itemname.." "..value) + itemstack:set_count(count-cost) + end + end + player:set_wielded_item(itemstack) + show_box_formspec(itemstack, player) + return true +end) + + +--------- +-- Jetons + +local function set_count(pos, placer, itemstack, pointed_thing) + minetest.chat_send_all("hello") + local stack_count = itemstack:get_count() + local meta = minetest.get_meta(pos) + local count = meta:get_int("infotext") + meta:set_int("infotext", count + stack_count) + itemstack:clear() + return itemstack +end + +local function register_jeton(name, color) + + local texture = "cards_jeton.png^[colorize:"..color.."^[noalpha" + local node_name = "cards:jeton_"..name + box_form = box_form.. + "item_image_button["..num_decks..",2;1,1;"..node_name..";"..node_name.."#1;1]".. + "label["..num_decks..",1;"..name.."]".. + "button["..(num_decks)..",3;0.5,1;".. node_name.."#10;10]".. + "button["..(num_decks + 0.5)..",3;0.5,1;".. node_name.."#99;99]" + num_decks = num_decks + 1 + minetest.register_node(node_name, { + description = "jeton "..name, + inventory_image = texture, + wield_image = texture, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {{-0.5, -0.5, -0.5, 0.5, -0.4375 , 0.5}} + }, + tiles = {texture}, + paramtype = "light", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + local pos = pointed_thing.under + local node = minetest.get_node(pos) + if node.name ~= node_name then + pos = pointed_thing.above + return minetest.item_place(itemstack, placer, pointed_thing) + end + if minetest.is_protected(pos, placer:get_player_name()) then + return + end + itemstack = set_count(pos, placer, itemstack, pointed_thing) -- add jetons to stack + return itemstack + end, + after_place_node = set_count, + on_dig = function(pos, node, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local count = meta:get_int("infotext") + minetest.node_dig(pos, node, player) + node = minetest.get_node(pos) + if node.name == node_name then return end + player:get_inventory():add_item("main", { + name = node_name, + count = count - 1, -- 1 item is added by minetest.node_dig(...) + wear = 0, + metadata = "" + }) + end, + groups = {oddly_breakable_by_hand = 3, jeton = 1}, + }) +end + +register_jeton("blue", "#00F:224") +register_jeton("red", "#F00:224") +register_jeton("black", "#000:224") +register_jeton("green", "#0A0:224") +register_jeton("yellow", "#FF0:224") + +--------- +-- Crafts + +minetest.register_craft({ + output = "cards:card_box "..CARDS_PER_BOX, + recipe = {{"default:chest", "dye:black", "dye:green"}, + {"default:clay_lump","dye:red" , "dye:blue"}, + {"default:paper", "default:paper", "default:paper"},} +}) + +minetest.register_craft({ + output = "cards:card_box", + recipe = {{"group:jeton"}}, +}) + +minetest.register_craft({ + output = "cards:card_box", + recipe = {{"group:card"}}, +}) + + + + diff --git a/mods/cards/mod.conf b/mods/cards/mod.conf new file mode 100644 index 00000000..1d7fa784 --- /dev/null +++ b/mods/cards/mod.conf @@ -0,0 +1 @@ +name = cards \ No newline at end of file diff --git a/mods/cards/screenshot.png b/mods/cards/screenshot.png new file mode 100644 index 00000000..fd13ae7c Binary files /dev/null and b/mods/cards/screenshot.png differ diff --git a/mods/cards/textures/cards_10.png b/mods/cards/textures/cards_10.png new file mode 100644 index 00000000..4b996f1b Binary files /dev/null and b/mods/cards/textures/cards_10.png differ diff --git a/mods/cards/textures/cards_2.png b/mods/cards/textures/cards_2.png new file mode 100644 index 00000000..ed065731 Binary files /dev/null and b/mods/cards/textures/cards_2.png differ diff --git a/mods/cards/textures/cards_3.png b/mods/cards/textures/cards_3.png new file mode 100644 index 00000000..1e9d175f Binary files /dev/null and b/mods/cards/textures/cards_3.png differ diff --git a/mods/cards/textures/cards_4.png b/mods/cards/textures/cards_4.png new file mode 100644 index 00000000..cc25a0d7 Binary files /dev/null and b/mods/cards/textures/cards_4.png differ diff --git a/mods/cards/textures/cards_5.png b/mods/cards/textures/cards_5.png new file mode 100644 index 00000000..ac6d5104 Binary files /dev/null and b/mods/cards/textures/cards_5.png differ diff --git a/mods/cards/textures/cards_6.png b/mods/cards/textures/cards_6.png new file mode 100644 index 00000000..7bd0b3bb Binary files /dev/null and b/mods/cards/textures/cards_6.png differ diff --git a/mods/cards/textures/cards_7.png b/mods/cards/textures/cards_7.png new file mode 100644 index 00000000..c4df2d0d Binary files /dev/null and b/mods/cards/textures/cards_7.png differ diff --git a/mods/cards/textures/cards_8.png b/mods/cards/textures/cards_8.png new file mode 100644 index 00000000..f2ed1d80 Binary files /dev/null and b/mods/cards/textures/cards_8.png differ diff --git a/mods/cards/textures/cards_9.png b/mods/cards/textures/cards_9.png new file mode 100644 index 00000000..a8e1a60b Binary files /dev/null and b/mods/cards/textures/cards_9.png differ diff --git a/mods/cards/textures/cards_A.png b/mods/cards/textures/cards_A.png new file mode 100644 index 00000000..b3c23c3a Binary files /dev/null and b/mods/cards/textures/cards_A.png differ diff --git a/mods/cards/textures/cards_B.png b/mods/cards/textures/cards_B.png new file mode 100644 index 00000000..54535bc4 Binary files /dev/null and b/mods/cards/textures/cards_B.png differ diff --git a/mods/cards/textures/cards_D.png b/mods/cards/textures/cards_D.png new file mode 100644 index 00000000..b43e1dc8 Binary files /dev/null and b/mods/cards/textures/cards_D.png differ diff --git a/mods/cards/textures/cards_J.png b/mods/cards/textures/cards_J.png new file mode 100644 index 00000000..cf521f43 Binary files /dev/null and b/mods/cards/textures/cards_J.png differ diff --git a/mods/cards/textures/cards_K.png b/mods/cards/textures/cards_K.png new file mode 100644 index 00000000..e312f5ee Binary files /dev/null and b/mods/cards/textures/cards_K.png differ diff --git a/mods/cards/textures/cards_Q.png b/mods/cards/textures/cards_Q.png new file mode 100644 index 00000000..a4d46980 Binary files /dev/null and b/mods/cards/textures/cards_Q.png differ diff --git a/mods/cards/textures/cards_apple.png b/mods/cards/textures/cards_apple.png new file mode 100644 index 00000000..f08e949f Binary files /dev/null and b/mods/cards/textures/cards_apple.png differ diff --git a/mods/cards/textures/cards_back.png b/mods/cards/textures/cards_back.png new file mode 100644 index 00000000..06bb968c Binary files /dev/null and b/mods/cards/textures/cards_back.png differ diff --git a/mods/cards/textures/cards_back_2.png b/mods/cards/textures/cards_back_2.png new file mode 100644 index 00000000..163617b3 Binary files /dev/null and b/mods/cards/textures/cards_back_2.png differ diff --git a/mods/cards/textures/cards_back_3.png b/mods/cards/textures/cards_back_3.png new file mode 100644 index 00000000..4b32135f Binary files /dev/null and b/mods/cards/textures/cards_back_3.png differ diff --git a/mods/cards/textures/cards_back_mese.png b/mods/cards/textures/cards_back_mese.png new file mode 100644 index 00000000..c9330125 Binary files /dev/null and b/mods/cards/textures/cards_back_mese.png differ diff --git a/mods/cards/textures/cards_card_box_top.png b/mods/cards/textures/cards_card_box_top.png new file mode 100644 index 00000000..0c9ec4c8 Binary files /dev/null and b/mods/cards/textures/cards_card_box_top.png differ diff --git a/mods/cards/textures/cards_clover.png b/mods/cards/textures/cards_clover.png new file mode 100644 index 00000000..be16dd5a Binary files /dev/null and b/mods/cards/textures/cards_clover.png differ diff --git a/mods/cards/textures/cards_coal_lump.png b/mods/cards/textures/cards_coal_lump.png new file mode 100644 index 00000000..6bc0447a Binary files /dev/null and b/mods/cards/textures/cards_coal_lump.png differ diff --git a/mods/cards/textures/cards_deck_104.png b/mods/cards/textures/cards_deck_104.png new file mode 100644 index 00000000..aace89a4 Binary files /dev/null and b/mods/cards/textures/cards_deck_104.png differ diff --git a/mods/cards/textures/cards_deck_32.png b/mods/cards/textures/cards_deck_32.png new file mode 100644 index 00000000..dc42b8a7 Binary files /dev/null and b/mods/cards/textures/cards_deck_32.png differ diff --git a/mods/cards/textures/cards_deck_52.png b/mods/cards/textures/cards_deck_52.png new file mode 100644 index 00000000..11f12987 Binary files /dev/null and b/mods/cards/textures/cards_deck_52.png differ diff --git a/mods/cards/textures/cards_deck_joker.png b/mods/cards/textures/cards_deck_joker.png new file mode 100644 index 00000000..52251495 Binary files /dev/null and b/mods/cards/textures/cards_deck_joker.png differ diff --git a/mods/cards/textures/cards_deck_minetest_52.png b/mods/cards/textures/cards_deck_minetest_52.png new file mode 100644 index 00000000..e40093e6 Binary files /dev/null and b/mods/cards/textures/cards_deck_minetest_52.png differ diff --git a/mods/cards/textures/cards_heart.png b/mods/cards/textures/cards_heart.png new file mode 100644 index 00000000..58638936 Binary files /dev/null and b/mods/cards/textures/cards_heart.png differ diff --git a/mods/cards/textures/cards_jeton.png b/mods/cards/textures/cards_jeton.png new file mode 100644 index 00000000..1e0e0047 Binary files /dev/null and b/mods/cards/textures/cards_jeton.png differ diff --git a/mods/cards/textures/cards_joker.png b/mods/cards/textures/cards_joker.png new file mode 100644 index 00000000..b94d849b Binary files /dev/null and b/mods/cards/textures/cards_joker.png differ diff --git a/mods/cards/textures/cards_mese_crystal.png b/mods/cards/textures/cards_mese_crystal.png new file mode 100644 index 00000000..5e388c38 Binary files /dev/null and b/mods/cards/textures/cards_mese_crystal.png differ diff --git a/mods/cards/textures/cards_pike.png b/mods/cards/textures/cards_pike.png new file mode 100644 index 00000000..25ef115a Binary files /dev/null and b/mods/cards/textures/cards_pike.png differ diff --git a/mods/cards/textures/cards_side.png b/mods/cards/textures/cards_side.png new file mode 100644 index 00000000..8f9542fb Binary files /dev/null and b/mods/cards/textures/cards_side.png differ diff --git a/mods/cards/textures/cards_tile.png b/mods/cards/textures/cards_tile.png new file mode 100644 index 00000000..c6cb6377 Binary files /dev/null and b/mods/cards/textures/cards_tile.png differ diff --git a/mods/cards/textures/cards_tool_diamondsword.png b/mods/cards/textures/cards_tool_diamondsword.png new file mode 100644 index 00000000..c4817972 Binary files /dev/null and b/mods/cards/textures/cards_tool_diamondsword.png differ diff --git a/mods/cards/textures/taube.png b/mods/cards/textures/taube.png new file mode 100644 index 00000000..74496dc7 Binary files /dev/null and b/mods/cards/textures/taube.png differ diff --git a/mods/christmas/LICENSE.TXT b/mods/christmas/LICENSE.TXT new file mode 100644 index 00000000..deea1f26 --- /dev/null +++ b/mods/christmas/LICENSE.TXT @@ -0,0 +1,59 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2019 Extex + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of the Software, and to permit +persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (texture) +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2019 Extex + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/christmas/README.md b/mods/christmas/README.md new file mode 100644 index 00000000..8a502d5d --- /dev/null +++ b/mods/christmas/README.md @@ -0,0 +1,26 @@ +# Christmas +This is a Mod for [Minetest](https://www.minetest.net/) ( [Github Repo](https://github.com/Minetest/minetest)), that adds festive christmas items and nodes. + + +![Screenshot](https://github.com/Extex101/christmas/blob/master/screenshot.png) + +# Provides + - Candy canes (If you eat too many you could get a sugar rush!) + - Gingerbread man* (Just plain food) + - Eggnog* (Just plain food) + - Mince pie (Just plain food) + - Stocking (You need one to get cool rewards every 1 hour and 30 minutes) + - Christmas lights* (A nice way to decorate for christmas) + - Red Bauble* (To decorate your tree) + - Star* (The topper of your tree) + - Present (Give a gift to a firend) + - Sugar* (To craft your sweets) + - Tree (The center of all decorations) + +* Only obtainable as a Stocking reward + + +View the Minetest forum post [here](https://forum.minetest.net/viewtopic.php?f=9&t=23782&) + + +Have fun and Merry Christmas!! diff --git a/mods/christmas/crafting.lua b/mods/christmas/crafting.lua new file mode 100644 index 00000000..30ff9d5f --- /dev/null +++ b/mods/christmas/crafting.lua @@ -0,0 +1,68 @@ +local depends = {} +depends.default = minetest.get_modpath("default") +depends.farming = minetest.get_modpath("farming") +depends.wool = minetest.get_modpath("wool") +depends.dye = minetest.get_modpath("dye") + +if depends.default then + if depends.farming then + minetest.register_craft({ + type = "shapeless", + output = "christmas:mince_pie 3", + recipe = { + "default:blueberries", + "farming:flour", + "default:apple", + "default:blueberries", + "christmas:sugar" + }, + }) + end + minetest.register_craft({ + output = "christmas:present", + recipe = { + {"default:paper","default:paper","default:paper"}, + {"default:paper","","default:paper"}, + {"default:paper","default:paper","default:paper"}, + }, + }) + minetest.register_craft({ + output = "default:paper 8", + recipe = { + {"christmas:present"}, + }, + }) +end + + + +if depends.wool then + minetest.register_craft({ + output = "christmas:stocking", + recipe = { + {"","wool:white","wool:white"}, + {"default:gold_ingot","wool:red","wool:red"}, + {"wool:red","wool:red","wool:red"}, + }, + }) +end + +if depends.dye then + minetest.register_craft({ + output = "christmas:candy_cane 12", + recipe = { + {"dye:red","christmas:sugar","dye:white"}, + {"christmas:sugar","dye:white","christmas:sugar"}, + {"christmas:sugar","dye:red",""}, + }, + }) +end + +minetest.register_craft({ + output = "christmas:tree", + recipe = { + {"group:leaves","group:leaves","group:leaves"}, + {"group:leaves","group:leaves","group:leaves"}, + {"group:leaves","group:tree","group:leaves"}, + }, +}) diff --git a/mods/christmas/crafting.png b/mods/christmas/crafting.png new file mode 100644 index 00000000..5862cf43 Binary files /dev/null and b/mods/christmas/crafting.png differ diff --git a/mods/christmas/depends.txt b/mods/christmas/depends.txt new file mode 100644 index 00000000..2b972487 --- /dev/null +++ b/mods/christmas/depends.txt @@ -0,0 +1,4 @@ +farming? +default? +wool? +dye? diff --git a/mods/christmas/functions.lua b/mods/christmas/functions.lua new file mode 100644 index 00000000..8d24d5da --- /dev/null +++ b/mods/christmas/functions.lua @@ -0,0 +1,146 @@ +local function xplayer(player) + if not player:is_player() then + return + end + local name = player:get_player_name() + return christmas.players[name] +end + +function christmas.get_present_formspec(pos)--Taken from default chest + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = + "size[8,9]" .. + "list[nodemeta:" .. spos .. ";main;3.5,2.5;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]" + return formspec +end + +function christmas.to_time(time) + local remaining = time % 86400 + remaining = remaining % 3600 + local minutes = math.floor(remaining/60) + remaining = remaining % 60 + local seconds = remaining + if (minutes < 10) then + minutes = "0" .. tostring(minutes) + end + if (seconds < 10) then + seconds = "0" .. tostring(seconds) + end + answer = minutes..':'..seconds + return answer +end + +function christmas.register_reward(item, quantity, rarity) + table.insert(christmas.rewards, {item=item, quantity=quantity, rarity=rarity}) +end + +function christmas.random_reward()--Adapted from Dungeontest room selection "dungeon_rooms.random_roomdata" + local pool = christmas.rewards + + local candidates = {} + local raresum = 0 + + for i=1, #pool do + local reward = pool[i] + table.insert(candidates, pool) + raresum = raresum + reward.rarity + end + + local rarepick = math.random() * raresum + local rarecount = 0 + + for c=1, #candidates do + local rewards = candidates[c] + rarecount = rarecount + christmas.rewards[c].rarity + local q = christmas.rewards[c].quantity + local quantity = math.random(q.min, q.max) + if rarecount >= rarepick then + --return christmas.rewards[c].item + return ItemStack(christmas.rewards[c].item.." "..quantity) + end + end +end + +function christmas.eat_candy(hp_change, replace_with_item) + return function(itemstack, user, pointed_thing) + local name = user:get_player_name() + local p = xplayer(user) + christmas.players[name].candy = p.candy +1 + + if p.candy == 8 then + p.time = 60 + p.hud.ui = user:hud_add({ + hud_elem_type = "image", + position = {x = 0.2, y = 0.2}, + offset = {x = 0, y = 0}, + text = "christmas_powerup_ui.png", + scale = { x = 10, y = 10}, + alignment = { x = 0, y = 0 }, + }) + p.hud.icon = user:hud_add({ + hud_elem_type = "image", + position = {x = 0.2, y = 0.2}, + offset = {x = 0, y = 0}, + text = "christmas_candy_cane.png", + scale = { x = 10, y = 10}, + alignment = { x = 0, y = 0 }, + }) + p.hud.time = user:hud_add({ + hud_elem_type = "text", + position = {x = 0.2, y = 0.2}, + offset = {x = 0, y = 0}, + text = "SUGAR RUSH!!\n"..christmas.to_time (p.time), + number = 0xffffff, + scale = { x = 10, y = 10}, + alignment = { x = 0, y = 0 }, + }) + end + if p.time > 0 then + p.time = p.time + 3 + end + return minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing) + end +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + christmas.players[name] = {} + christmas.players[name].candy = 0 + christmas.players[name].hud = {} + christmas.players[name].time = 0 +end) + +local t = 0 +minetest.register_globalstep (function(dtime) + t = t + dtime + if t > 1 then + t = 0 + end + for _, player in ipairs(minetest.get_connected_players()) do + local p = xplayer(player) + if p.time > 0 and t > 1-dtime then + p.time = p.time - 1 + player:hud_change(p.hud.time, "text", "SUGAR RUSH!!\n~~"..christmas.to_time(p.time).."~~") + elseif math.floor(p.time) == 1 then + p.candy = 0 + end + if p.time > 0 then + player:set_physics_override({ + speed = 2.5, + }) + end + --minetest.chat_send_all(p.candy) + if p.time == 0 then + player:set_physics_override({ + speed = 1, + }) + player:hud_remove(p.hud.ui) + player:hud_remove(p.hud.icon) + player:hud_remove(p.hud.time) + end + end +end) diff --git a/mods/christmas/init.lua b/mods/christmas/init.lua new file mode 100644 index 00000000..8867729e --- /dev/null +++ b/mods/christmas/init.lua @@ -0,0 +1,333 @@ +christmas = {} +christmas.players = {} +christmas.path = minetest.get_modpath("christmas") +christmas.rewards = {} +local mod_storage = minetest.get_mod_storage() +dofile(christmas.path.."/functions.lua" ) +dofile(christmas.path.."/crafting.lua") +local data = christmas.data + + +------------------------------------ Craft Items ------------------------------------ +minetest.register_craftitem("christmas:candy_cane", { + description = "Candy Cane", + inventory_image = "christmas_candy_cane.png", + on_use = christmas.eat_candy(1) +}) +minetest.register_craftitem("christmas:mince_pie", { + description = "Mince Pie", + inventory_image = "christmas_mincepie.png", + on_use = minetest.item_eat(6) +}) +minetest.register_craftitem("christmas:sugar", { + description = "Sugar", + inventory_image = "christmas_sugar.png", +}) + +minetest.register_craftitem("christmas:gingerbread_man", { + description = "Gingerbread Man", + inventory_image = "christmas_gingerbread_man.png", + on_use = minetest.item_eat(4) +}) + +minetest.register_craftitem("christmas:bauble_red", { + description = "Bauble (Red)", + inventory_image = "christmas_bauble_red.png", + groups = {tree_bauble=1}, + colour_code = 1,--Future support +}) +minetest.register_craftitem("christmas:star", { + description = "Star", + inventory_image = "christmas_star_inv.png", + groups = {tree_topper=1}, +}) + + +------------------------------------ Nodes ------------------------------------ +minetest.register_node("christmas:eggnog", { + description = "Eggnog", + drawtype = "plantlike", + tiles = {"christmas_eggnog.png"}, + inventory_image = "christmas_eggnog.png", + on_use = minetest.item_eat(10), + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, +}) +minetest.register_node("christmas:present", { + description = "Christmas present", + tiles = { + "christmas_present.png", + "christmas_present_top.png" + }, + drawtype = "mesh", + paramtype = "light", + mesh = "christmas_present.obj", + groups = {oddly_breakable_by_hand = 3, attached_node = 1}, + selection_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, 0.125, 0.3125}, + } + }, + on_construct = function(pos, itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Christmas Present") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 1) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Present from ".. meta:get_string("owner")) + end, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + minetest.after(0.2, + minetest.show_formspec, + player:get_player_name(), + "christmas:present", + christmas.get_present_formspec(pos)) + end, +}) +minetest.register_node("christmas:stocking", { + description = "Christmas Stocking", + drawtype = "signlike", + tiles = {"christmas_stocking.png"}, + inventory_image = "christmas_stocking.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + selection_box = { + type = "wallmounted", + }, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, attached_node = 1}, + walkable = false, + on_construct = function(pos, itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Stocking: No owner") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 3) + end, + after_place_node = function(pos, player, itemstack, pointed_thing) + local name = player:get_player_name() + local meta = minetest.get_meta(pos) + + local stocking_pos = mod_storage:get_string(name.."_stocking_pos") + local spos = minetest.string_to_pos(stocking_pos) + if (spos and minetest.get_node(spos).name ~= "christmas:stocking") or stocking_pos == (nil or "") then + mod_storage:set_string(name.."_stocking_pos", minetest.pos_to_string(pos)) + elseif spos and minetest.get_node(spos).name == "christmas:stocking" then + minetest.set_node(pos, {name="air"}) + minetest.chat_send_player(name, "You already have a stocking at: ".. stocking_pos) + return itemstack + end + meta:set_string("infotext", player:get_player_name().."'s Stocking") + meta:set_string("owner", player:get_player_name()) + local timer = minetest.get_node_timer(pos) + timer:start(5400) + end, + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local stocking_pos = mod_storage:get_string(owner.."_stocking_pos") + local spos = minetest.string_to_pos(stocking_pos) + + if minetest.string_to_pos(stocking_pos) == pos then + mod_storage:set_string(owner.."_stocking_pos", " ") + end + end, + on_timer = function(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + minetest.chat_send_player(owner, "Your stocking has refilled")--Hooray + local inv = meta:get_inventory() + inv:set_stack("main", 1, christmas.random_reward()) + inv:set_stack("main", 2, christmas.random_reward()) + inv:set_stack("main", 3, christmas.random_reward()) + end, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local timer = minetest.get_node_timer(pos) + local owner = meta:get_string("owner") + local playerinv = player:get_inventory() + if player:get_player_name() ~= owner then + minetest.chat_send_player(player:get_player_name(), "This isn't your stocking")--Imposter!! + return itemstack + end + local inv = meta:get_inventory() + if inv:is_empty("main") then + local time = christmas.to_time(math.floor(timer:get_timeout() - timer:get_elapsed())) + minetest.chat_send_player(owner, "Your stocking is empty. (refill in: "..time..")")--Whyyyyyyy??? 😭 + elseif not inv:is_empty("main") then + local item1 = inv:get_stack("main", 1) + playerinv:add_item("main", item1) + local item2 = inv:get_stack("main", 2) + playerinv:add_item("main", item2) + local item3 = inv:get_stack("main", 3) + playerinv:add_item("main", item3) + inv:set_stack("main", 1 ,'') + inv:set_stack("main", 2 ,'') + inv:set_stack("main", 3 ,'') + timer:start(5400) + end + end, +}) + +minetest.register_node("christmas:lights", { + description = "Christmas lights", + drawtype = "signlike", + tiles = { + { + name = "christmas_lights_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + inventory_image = "christmas_lights.png", + wield_image = "christmas_lights.png", + paramtype = "light", + paramtype2 = "wallmounted", + light_source = 3, + selection_box = { + type = "wallmounted", + }, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, attached_node = 1}, + walkable = false, +}) + +------------------------------------ Christmas tree ------------------------------------ +minetest.register_node("christmas:tree", { + description = "Christmas Tree", + tiles = { + "christmas_tree_leaves.png" + }, + inventory_image = "christmas_tree_inv.png", + drawtype = "mesh", + paramtype = "light", + mesh = "christmas_tree.obj", + groups = {snappy = 2, attached_node = 1}, + collision_box = { + type = "fixed", + fixed = {-0.625, -0.5, -0.625, 0.625, 2, 0.625}, + }, + selection_box = { + type = "fixed", + fixed = {-0.75, -0.5, -0.75, 0.75, 2.3125, 0.75}, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local pos1 = {x=pos.x, y=pos.y+1, z=pos.z} + local pos2 = {x=pos.x, y=pos.y+2, z=pos.z} + local node1 = minetest.get_node(pos1) + local node2 = minetest.get_node(pos2) + if node1.name ~= "air" or node2.name ~= "air" then + minetest.set_node(pos, {name="air"}) + minetest.chat_send_player(placer:get_player_name(), "You need a 3 block tall space to place the tree") + return itemstack + end + end, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local item = minetest.registered_items[itemstack:get_name()] + if item.groups.tree_bauble ~= nil then + local pos2 = {x=pos.x, y=pos.y+1, z=pos.z} + local name = minetest.get_node(pos2).name + if minetest.registered_nodes[name].buildable_to then + minetest.set_node(pos2, {name="christmas:ornament"}) + end + itemstack:take_item() + elseif item.groups.tree_topper ~= nil then + local pos2 = {x=pos.x, y=pos.y+2, z=pos.z} + local name = minetest.get_node(pos2).name + if minetest.registered_nodes[name].buildable_to then + minetest.set_node(pos2, {name="christmas:topper"}) + end + itemstack:take_item() + end + end, + on_destruct = function(pos) + local pos1 = {x=pos.x, y=pos.y+1, z=pos.z} + local pos2 = {x=pos.x, y=pos.y+2, z=pos.z} + local name = minetest.get_node(pos1).name + local name2 = minetest.get_node(pos2).name + minetest.after(0.01, function() + if name == "christmas:ornament" then + minetest.set_node(pos1, {name="air"}) + minetest.add_item(pos1, "christmas:bauble_red") + end + if name2 == "christmas:topper" then + minetest.set_node(pos2, {name="air"}) + minetest.add_item(pos2, "christmas:star") + end + end) + end, +}) + +minetest.register_node("christmas:ornament", { + description = "Bauble", + tiles = { + "christmas_bauble.png" + }, + drawtype = "mesh", + paramtype = "light", + paramtype2 = "color", + color = "red", + mesh = "christmas_tree_balls.obj", + groups = {not_in_creative_inventory = 1}, + walkable = false, + pointable = false, + on_construct = function(pos) + local npos = {x=pos.x, y=pos.y-1, z=pos.z} + local name = minetest.get_node(npos).name + if name ~= "christmas:tree" then + minetest.set_node(pos, {name="air"}) + end + end, +}) +minetest.register_node("christmas:topper", { + description = "Topper", + tiles = { + "christmas_star.png" + }, + drawtype = "mesh", + paramtype = "light", + light_source = 8, + paramtype2 = "color", + color = "yellow", + mesh = "christmas_star.obj", + groups = {not_in_creative_inventory = 1}, + walkable = false, + pointable = false, + on_construct = function(pos) + local npos = {x=pos.x, y=pos.y-2, z=pos.z} + local name = minetest.get_node(npos).name + if name ~= "christmas:tree" then + minetest.set_node(pos, {name="air"}) + end + end, +}) + + + +christmas.register_reward("christmas:lights", {min=1, max=5}, 0.5) +christmas.register_reward("christmas:candy_cane", {min=3, max=15}, 0.15) +christmas.register_reward("christmas:eggnog", {min=1, max=3}, 0.15) +christmas.register_reward("christmas:gingerbread_man", {min=1, max=9}, 0.5) +christmas.register_reward("christmas:mince_pie", {min=6, max=12}, 0.3) +christmas.register_reward("christmas:tree", {min=0, max=1}, 0.15) +christmas.register_reward("christmas:bauble_red", {min=0, max=1}, 0.15) +christmas.register_reward("christmas:star", {min=0, max=1}, 0.1) +christmas.register_reward("christmas:sugar", {min=1, max=7}, 0.36) +christmas.register_reward("christmas:present", {min=1, max=2}, 0.26) + + + + diff --git a/mods/christmas/mod.conf b/mods/christmas/mod.conf new file mode 100644 index 00000000..1f040955 --- /dev/null +++ b/mods/christmas/mod.conf @@ -0,0 +1,2 @@ +name = christmas +description = Mod that adds festive christmas items to minetest. diff --git a/mods/christmas/models/christmas_present.obj b/mods/christmas/models/christmas_present.obj new file mode 100644 index 00000000..3f8bab48 --- /dev/null +++ b/mods/christmas/models/christmas_present.obj @@ -0,0 +1,80 @@ +# Blender v2.70 (sub 0) OBJ File: '' +# www.blender.org +o model +v 0.312500 0.125000 0.312500 +v 0.312500 0.125000 -0.312500 +v -0.312500 0.125000 -0.312500 +v -0.312500 0.125000 0.312500 +v 0.312500 -0.500000 -0.312500 +v 0.312500 -0.500000 0.312500 +v -0.312500 -0.500000 0.312500 +v -0.312500 -0.500000 -0.312500 +v -0.062194 0.119289 0.002570 +v -0.062194 0.139334 -0.154991 +v 0.062194 0.139334 -0.154991 +v 0.062194 0.119289 0.002570 +v -0.062194 0.240666 -0.094237 +v -0.062194 0.260711 -0.251798 +v 0.062194 0.260711 -0.251798 +v 0.062194 0.240666 -0.094237 +v 0.062194 0.119289 -0.002570 +v 0.062194 0.139334 0.154991 +v -0.062194 0.139334 0.154990 +v -0.062194 0.119289 -0.002570 +v 0.062194 0.240666 0.094238 +v 0.062194 0.260711 0.251798 +v -0.062194 0.260711 0.251797 +v -0.062194 0.240666 0.094237 +v -0.060931 0.120726 0.002517 +v -0.060931 0.140363 -0.151842 +v 0.060931 0.140363 -0.151842 +v 0.060931 0.120726 0.002517 +v -0.060931 0.239636 -0.092323 +v -0.060931 0.259274 -0.246682 +v 0.060931 0.259274 -0.246682 +v 0.060931 0.239636 -0.092323 +v 0.060931 0.120726 -0.002517 +v 0.060931 0.140363 0.151842 +v -0.060931 0.140363 0.151842 +v -0.060931 0.120726 -0.002518 +v 0.060931 0.239636 0.092323 +v 0.060931 0.259274 0.246682 +v -0.060931 0.259274 0.246682 +v -0.060931 0.239636 0.092323 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.999999 -0.000001 +vt 1.000001 0.999999 +vt 0.500001 1.000001 +vt 0.499999 0.000001 +vt 0.700000 0.900000 +vt 0.700000 0.600000 +vt 0.800000 0.600000 +vt 0.800000 0.900000 +s off +f 1/1 2/2 3/3 4/4 +f 5/1 6/2 7/3 8/4 +f 1/3 6/2 5/5 2/6 +f 7/7 4/8 3/9 8/10 +f 8/7 3/8 2/9 5/10 +f 6/7 1/8 4/9 7/10 +f 14/11 15/12 11/13 10/14 +f 16/14 13/11 9/12 12/13 +f 9/14 10/11 11/12 12/13 +f 16/11 15/12 14/13 13/14 +f 22/11 23/12 19/13 18/14 +f 24/14 21/11 17/12 20/13 +f 17/14 18/11 19/12 20/13 +f 24/11 23/12 22/13 21/14 +f 30/11 26/12 27/13 31/14 +f 32/13 28/14 25/11 29/12 +f 25/14 28/11 27/12 26/13 +f 32/11 29/12 30/13 31/14 +f 38/11 34/12 35/13 39/14 +f 40/13 36/14 33/11 37/12 +f 33/14 36/11 35/12 34/13 +f 40/11 37/12 38/13 39/14 diff --git a/mods/christmas/models/christmas_star.obj b/mods/christmas/models/christmas_star.obj new file mode 100644 index 00000000..15ad4dcd --- /dev/null +++ b/mods/christmas/models/christmas_star.obj @@ -0,0 +1,36 @@ +# Blender v2.70 (sub 0) OBJ File: 'christmas_tree.blend' +# www.blender.org +o Cube_Cube.001 +v -0.139980 0.202010 -0.002398 +v -0.143371 0.400000 0.195563 +v -0.139979 0.597990 -0.002398 +v -0.136588 0.400000 -0.200359 +v 0.139979 0.202010 0.002398 +v 0.136588 0.400000 0.200359 +v 0.139980 0.597990 0.002398 +v 0.143371 0.400000 -0.195563 +v 0.000000 0.260000 0.197990 +v -0.197990 0.260000 0.000000 +v -0.000000 0.260000 -0.197990 +v 0.197990 0.260000 -0.000000 +v 0.000000 0.540000 0.197990 +v -0.197990 0.540000 0.000000 +v -0.000000 0.540000 -0.197990 +v 0.197990 0.540000 -0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s off +f 5/1 6/2 2/3 1/4 +f 6/1 7/2 3/3 2/4 +f 7/1 8/2 4/3 3/4 +f 8/1 5/2 1/3 4/4 +f 1/1 2/2 3/3 4/4 +f 8/1 7/2 6/3 5/4 +f 13/1 14/2 10/3 9/4 +f 14/1 15/2 11/3 10/4 +f 15/1 16/2 12/3 11/4 +f 16/1 13/2 9/3 12/4 +f 9/1 10/2 11/3 12/4 +f 16/1 15/2 14/3 13/4 diff --git a/mods/christmas/models/christmas_tree.obj b/mods/christmas/models/christmas_tree.obj new file mode 100644 index 00000000..be3db868 --- /dev/null +++ b/mods/christmas/models/christmas_tree.obj @@ -0,0 +1,5469 @@ +# Blender v2.70 (sub 0) OBJ File: '' +# www.blender.org +o model.021 +v -0.092400 2.236800 0.092400 +v -0.092400 2.236800 -0.092400 +v 0.092400 2.236800 -0.092400 +v 0.092400 2.236800 0.092400 +v -0.092400 2.421600 0.092400 +v -0.092400 2.421600 -0.092400 +v 0.092400 2.421600 -0.092400 +v 0.092400 2.421600 0.092400 +v 0.261347 2.236800 0.130673 +v 0.130673 2.236800 -0.000000 +v 0.000000 2.236800 0.130673 +v 0.130673 2.236800 0.261347 +v 0.130673 2.052000 -0.000000 +v 0.261347 2.052000 0.130673 +v 0.130673 2.052000 0.261347 +v 0.000000 2.052000 0.130673 +v -0.130673 2.236800 0.000000 +v -0.261347 2.236800 0.130673 +v -0.130673 2.236800 0.261347 +v -0.130673 2.052000 0.000000 +v -0.130673 2.052000 0.261347 +v -0.261347 2.052000 0.130673 +v -0.000000 2.236800 -0.130673 +v -0.000000 2.052000 -0.130673 +v 0.261347 2.236800 -0.130673 +v 0.130673 2.236800 -0.261347 +v 0.130673 2.052000 -0.261347 +v 0.261347 2.052000 -0.130673 +v -0.130673 2.236800 -0.261347 +v -0.261347 2.236800 -0.130673 +v -0.130673 2.052000 -0.261347 +v -0.261347 2.052000 -0.130673 +v 0.092400 2.052000 0.462000 +v 0.092400 2.052000 0.277200 +v -0.092400 2.052000 0.277200 +v -0.092400 2.052000 0.462000 +v 0.092400 1.867200 0.277200 +v 0.092400 1.867200 0.462000 +v -0.092400 1.867200 0.462000 +v -0.092400 1.867200 0.277200 +v -0.092400 2.052000 0.092400 +v -0.277200 2.052000 0.092400 +v -0.277200 2.052000 0.277200 +v -0.092400 1.867200 0.092400 +v -0.277200 1.867200 0.277200 +v -0.277200 1.867200 0.092400 +v 0.092400 2.052000 0.092400 +v 0.092400 1.867200 0.092400 +v 0.277200 2.052000 0.277200 +v 0.277200 2.052000 0.092400 +v 0.277200 1.867200 0.092400 +v 0.277200 1.867200 0.277200 +v -0.277200 2.052000 -0.092400 +v -0.462000 2.052000 -0.092400 +v -0.462000 2.052000 0.092400 +v -0.277200 1.867200 -0.092400 +v -0.462000 1.867200 0.092400 +v -0.462000 1.867200 -0.092400 +v -0.092400 2.052000 -0.092400 +v -0.092400 1.867200 -0.092400 +v 0.092400 2.052000 -0.092400 +v 0.092400 1.867200 -0.092400 +v 0.277200 2.052000 -0.092400 +v 0.277200 1.867200 -0.092400 +v 0.462000 2.052000 0.092400 +v 0.462000 2.052000 -0.092400 +v 0.462000 1.867200 -0.092400 +v 0.462000 1.867200 0.092400 +v -0.092400 2.052000 -0.277200 +v -0.277200 2.052000 -0.277200 +v -0.092400 1.867200 -0.277200 +v -0.277200 1.867200 -0.277200 +v 0.092400 2.052000 -0.277200 +v 0.092400 1.867200 -0.277200 +v 0.277200 2.052000 -0.277200 +v 0.277200 1.867200 -0.277200 +v 0.092400 2.052000 -0.462000 +v -0.092400 2.052000 -0.462000 +v 0.092400 1.867200 -0.462000 +v -0.092400 1.867200 -0.462000 +v 0.261347 1.867200 0.392020 +v 0.130673 1.867200 0.261347 +v 0.000000 1.867200 0.392020 +v 0.130674 1.867200 0.522693 +v 0.130673 1.682400 0.261347 +v 0.261347 1.682400 0.392020 +v 0.130674 1.682400 0.522693 +v 0.000000 1.682400 0.392020 +v 0.392020 1.867200 0.261346 +v 0.261347 1.867200 0.130673 +v 0.261347 1.682400 0.130673 +v 0.392020 1.682400 0.261346 +v 0.522693 1.867200 0.130673 +v 0.392020 1.867200 -0.000000 +v 0.392020 1.682400 -0.000000 +v 0.522693 1.682400 0.130673 +v -0.130673 1.867200 0.261347 +v -0.261346 1.867200 0.392020 +v -0.130673 1.867200 0.522693 +v -0.130673 1.682400 0.261347 +v -0.130673 1.682400 0.522693 +v -0.261346 1.682400 0.392020 +v 0.261347 1.867200 -0.130673 +v 0.261347 1.682400 -0.130673 +v 0.522693 1.867200 -0.130674 +v 0.392020 1.867200 -0.261347 +v 0.392020 1.682400 -0.261347 +v 0.522693 1.682400 -0.130674 +v -0.261347 1.867200 0.130673 +v -0.392020 1.867200 0.261347 +v -0.261347 1.682400 0.130673 +v -0.392020 1.682400 0.261347 +v -0.130673 1.867200 0.000000 +v -0.000000 1.867200 -0.130673 +v 0.130673 1.867200 -0.261347 +v 0.130673 1.682400 -0.261347 +v 0.261346 1.867200 -0.392020 +v 0.261346 1.682400 -0.392020 +v -0.392020 1.867200 0.000000 +v -0.522693 1.867200 0.130674 +v -0.392020 1.682400 0.000000 +v -0.522693 1.682400 0.130674 +v -0.261347 1.867200 -0.130673 +v -0.261347 1.682400 -0.130673 +v -0.130673 1.867200 -0.261347 +v -0.130673 1.682400 -0.261347 +v -0.000000 1.867200 -0.392020 +v -0.000000 1.682400 -0.392020 +v 0.130673 1.867200 -0.522693 +v 0.130673 1.682400 -0.522693 +v -0.392020 1.867200 -0.261346 +v -0.522693 1.867200 -0.130673 +v -0.392020 1.682400 -0.261346 +v -0.522693 1.682400 -0.130673 +v -0.261347 1.867200 -0.392020 +v -0.261347 1.682400 -0.392020 +v -0.130674 1.867200 -0.522693 +v -0.130674 1.682400 -0.522693 +v -0.092400 1.682400 0.462000 +v -0.092400 1.682400 0.277200 +v -0.277200 1.682400 0.277200 +v -0.277200 1.682400 0.462000 +v -0.092400 1.497600 0.277200 +v -0.092400 1.497600 0.462000 +v -0.277200 1.497600 0.462000 +v -0.277200 1.497600 0.277200 +v 0.092400 1.682400 0.462000 +v 0.092400 1.682400 0.277200 +v 0.092400 1.497600 0.277200 +v 0.092400 1.497600 0.462000 +v 0.277200 1.682400 0.462000 +v 0.277200 1.682400 0.277200 +v 0.277200 1.497600 0.277200 +v 0.277200 1.497600 0.462000 +v -0.277200 1.682400 0.092400 +v -0.462000 1.682400 0.092400 +v -0.462000 1.682400 0.277200 +v -0.277200 1.497600 0.092400 +v -0.462000 1.497600 0.277200 +v -0.462000 1.497600 0.092400 +v 0.277200 1.682400 0.092400 +v 0.277200 1.497600 0.092400 +v 0.462000 1.682400 0.277200 +v 0.462000 1.682400 0.092400 +v 0.462000 1.497600 0.092400 +v 0.462000 1.497600 0.277200 +v -0.277200 1.682400 -0.092400 +v -0.462000 1.682400 -0.092400 +v -0.277200 1.497600 -0.092400 +v -0.462000 1.497600 -0.092400 +v 0.277200 1.682400 -0.092400 +v 0.277200 1.497600 -0.092400 +v 0.462000 1.682400 -0.092400 +v 0.462000 1.497600 -0.092400 +v -0.277200 1.682400 -0.277200 +v -0.462000 1.682400 -0.277200 +v -0.277200 1.497600 -0.277200 +v -0.462000 1.497600 -0.277200 +v -0.092400 1.682400 -0.277200 +v -0.092400 1.497600 -0.277200 +v 0.092400 1.682400 -0.277200 +v 0.092400 1.497600 -0.277200 +v 0.277200 1.682400 -0.277200 +v 0.277200 1.497600 -0.277200 +v 0.462000 1.682400 -0.277200 +v 0.462000 1.497600 -0.277200 +v -0.092400 1.682400 -0.462000 +v -0.277200 1.682400 -0.462000 +v -0.092400 1.497600 -0.462000 +v -0.277200 1.497600 -0.462000 +v 0.092400 1.682400 -0.462000 +v 0.092400 1.497600 -0.462000 +v 0.277200 1.682400 -0.462000 +v 0.277200 1.497600 -0.462000 +v 0.261347 1.497600 0.653366 +v 0.130674 1.497600 0.522693 +v 0.000000 1.497600 0.653367 +v 0.130674 1.497600 0.784040 +v 0.130674 1.312800 0.522693 +v 0.261347 1.312800 0.653366 +v 0.130674 1.312800 0.784040 +v 0.000000 1.312800 0.653367 +v 0.392020 1.497600 0.522693 +v 0.261347 1.497600 0.392020 +v 0.261347 1.312800 0.392020 +v 0.392020 1.312800 0.522693 +v 0.522693 1.497600 0.392020 +v 0.392020 1.497600 0.261346 +v 0.392020 1.312800 0.261346 +v 0.522693 1.312800 0.392020 +v 0.653367 1.497600 0.261346 +v 0.522693 1.497600 0.130673 +v 0.522693 1.312800 0.130673 +v 0.653367 1.312800 0.261346 +v 0.784040 1.497600 0.130673 +v 0.653367 1.497600 -0.000000 +v 0.653367 1.312800 -0.000000 +v 0.784040 1.312800 0.130673 +v -0.130673 1.497600 0.522693 +v -0.261346 1.497600 0.653367 +v -0.130673 1.497600 0.784040 +v -0.130673 1.312800 0.522693 +v -0.130673 1.312800 0.784040 +v -0.261346 1.312800 0.653367 +v 0.000000 1.497600 0.392020 +v 0.130673 1.497600 0.261347 +v 0.261347 1.497600 0.130673 +v 0.392020 1.497600 -0.000000 +v 0.522693 1.497600 -0.130674 +v 0.522693 1.312800 -0.130674 +v 0.784040 1.497600 -0.130674 +v 0.653366 1.497600 -0.261347 +v 0.653366 1.312800 -0.261347 +v 0.784040 1.312800 -0.130674 +v -0.261346 1.497600 0.392020 +v -0.392020 1.497600 0.522693 +v -0.261346 1.312800 0.392020 +v -0.392020 1.312800 0.522693 +v -0.130673 1.497600 0.261347 +v 0.261347 1.497600 -0.130673 +v 0.392020 1.497600 -0.261347 +v 0.392020 1.312800 -0.261347 +v 0.522693 1.497600 -0.392020 +v 0.522693 1.312800 -0.392020 +v -0.392020 1.497600 0.261347 +v -0.522693 1.497600 0.392020 +v -0.392020 1.312800 0.261347 +v -0.522693 1.312800 0.392020 +v -0.261347 1.497600 0.130673 +v 0.130673 1.497600 -0.261347 +v 0.261346 1.497600 -0.392020 +v 0.261346 1.312800 -0.392020 +v 0.392020 1.497600 -0.522693 +v 0.392020 1.312800 -0.522693 +v -0.522693 1.497600 0.130674 +v -0.653366 1.497600 0.261347 +v -0.522693 1.312800 0.130674 +v -0.653366 1.312800 0.261347 +v -0.392020 1.497600 0.000000 +v -0.261347 1.497600 -0.130673 +v -0.130673 1.497600 -0.261347 +v -0.000000 1.497600 -0.392020 +v 0.130673 1.497600 -0.522693 +v 0.130673 1.312800 -0.522693 +v 0.261346 1.497600 -0.653367 +v 0.261346 1.312800 -0.653367 +v -0.653367 1.497600 0.000000 +v -0.784040 1.497600 0.130674 +v -0.653367 1.312800 0.000000 +v -0.784040 1.312800 0.130674 +v -0.522693 1.497600 -0.130673 +v -0.522693 1.312800 -0.130673 +v -0.392020 1.497600 -0.261346 +v -0.392020 1.312800 -0.261347 +v -0.261347 1.497600 -0.392020 +v -0.261347 1.312800 -0.392020 +v -0.130674 1.497600 -0.522693 +v -0.130674 1.312800 -0.522693 +v -0.000000 1.497600 -0.653367 +v -0.000000 1.312800 -0.653367 +v 0.130673 1.497600 -0.784040 +v 0.130673 1.312800 -0.784040 +v -0.653367 1.497600 -0.261346 +v -0.784040 1.497600 -0.130673 +v -0.653367 1.312800 -0.261346 +v -0.784040 1.312800 -0.130673 +v -0.522693 1.497600 -0.392020 +v -0.522693 1.312800 -0.392020 +v -0.392020 1.497600 -0.522693 +v -0.392020 1.312800 -0.522693 +v -0.261347 1.497600 -0.653367 +v -0.261347 1.312800 -0.653367 +v -0.130674 1.497600 -0.784040 +v -0.130674 1.312800 -0.784040 +v 0.646800 1.312800 0.277200 +v 0.462000 1.312800 0.277200 +v 0.462000 1.312800 0.462000 +v 0.646800 1.312800 0.462000 +v 0.462000 1.128000 0.277200 +v 0.646800 1.128000 0.277200 +v 0.646800 1.128000 0.462000 +v 0.462000 1.128000 0.462000 +v 0.646800 1.312800 0.092400 +v 0.462000 1.312800 0.092400 +v 0.462000 1.128000 0.092400 +v 0.646800 1.128000 0.092400 +v 0.646800 1.312800 -0.092400 +v 0.462000 1.312800 -0.092400 +v 0.462000 1.128000 -0.092400 +v 0.646800 1.128000 -0.092400 +v 0.646800 1.312800 -0.277200 +v 0.462000 1.312800 -0.277200 +v 0.462000 1.128000 -0.277200 +v 0.646800 1.128000 -0.277200 +v 0.646800 1.312800 -0.462000 +v 0.462000 1.312800 -0.462000 +v 0.462000 1.128000 -0.462000 +v 0.646800 1.128000 -0.462000 +v 0.277200 1.312800 0.462000 +v 0.277200 1.312800 0.646800 +v 0.462000 1.312800 0.646800 +v 0.277200 1.128000 0.462000 +v 0.462000 1.128000 0.646800 +v 0.277200 1.128000 0.646800 +v 0.277200 1.312800 -0.462000 +v 0.277200 1.128000 -0.462000 +v 0.462000 1.312800 -0.646800 +v 0.277200 1.312800 -0.646800 +v 0.277200 1.128000 -0.646800 +v 0.462000 1.128000 -0.646800 +v 0.092400 1.312800 0.462000 +v 0.092400 1.312800 0.646800 +v 0.092400 1.128000 0.462000 +v 0.092400 1.128000 0.646800 +v 0.092400 1.312800 -0.462000 +v 0.092400 1.128000 -0.462000 +v 0.092400 1.312800 -0.646800 +v 0.092400 1.128000 -0.646800 +v -0.092400 1.312800 0.462000 +v -0.092400 1.312800 0.646800 +v -0.092400 1.128000 0.462000 +v -0.092400 1.128000 0.646800 +v -0.092400 1.312800 -0.462000 +v -0.092400 1.128000 -0.462000 +v -0.092400 1.312800 -0.646800 +v -0.092400 1.128000 -0.646800 +v -0.277200 1.312800 0.462000 +v -0.277200 1.312800 0.646800 +v -0.277200 1.128000 0.462000 +v -0.277200 1.128000 0.646800 +v -0.277200 1.312800 -0.462000 +v -0.277200 1.128000 -0.462000 +v -0.277200 1.312800 -0.646800 +v -0.277200 1.128000 -0.646800 +v -0.462000 1.312800 0.462000 +v -0.462000 1.312800 0.646800 +v -0.462000 1.128000 0.462000 +v -0.462000 1.128000 0.646800 +v -0.462000 1.312800 0.277200 +v -0.462000 1.128000 0.277200 +v -0.462000 1.312800 0.092400 +v -0.462000 1.128000 0.092400 +v -0.462000 1.312800 -0.092400 +v -0.462000 1.128000 -0.092400 +v -0.462000 1.312800 -0.277200 +v -0.462000 1.128000 -0.277200 +v -0.462000 1.312800 -0.462000 +v -0.462000 1.128000 -0.462000 +v -0.462000 1.312800 -0.646800 +v -0.462000 1.128000 -0.646800 +v -0.646800 1.312800 0.277200 +v -0.646800 1.312800 0.462000 +v -0.646800 1.128000 0.277200 +v -0.646800 1.128000 0.462000 +v -0.646800 1.312800 0.092400 +v -0.646800 1.128000 0.092400 +v -0.646800 1.312800 -0.092400 +v -0.646800 1.128000 -0.092400 +v -0.646800 1.312800 -0.277200 +v -0.646800 1.128000 -0.277200 +v -0.646800 1.312800 -0.462000 +v -0.646800 1.128000 -0.462000 +v 0.261347 1.128000 0.653367 +v 0.130674 1.128000 0.522693 +v 0.000000 1.128000 0.653367 +v 0.130674 1.128000 0.784040 +v 0.130674 0.943200 0.522693 +v 0.261347 0.943200 0.653367 +v 0.130674 0.943200 0.784040 +v 0.000000 0.943200 0.653367 +v 0.392020 1.128000 0.522693 +v 0.261347 1.128000 0.392020 +v 0.261347 0.943200 0.392020 +v 0.392020 0.943200 0.522693 +v 0.522693 1.128000 0.392020 +v 0.392020 1.128000 0.261346 +v 0.392020 0.943200 0.261346 +v 0.522693 0.943200 0.392020 +v 0.653367 1.128000 0.261346 +v 0.522693 1.128000 0.130673 +v 0.522693 0.943200 0.130673 +v 0.653367 0.943200 0.261346 +v 0.784040 1.128000 0.130673 +v 0.653367 1.128000 -0.000000 +v 0.653367 0.943200 -0.000000 +v 0.784040 0.943200 0.130673 +v -0.130673 1.128000 0.522693 +v -0.261346 1.128000 0.653367 +v -0.130673 1.128000 0.784040 +v -0.130673 0.943200 0.522693 +v -0.130673 0.943200 0.784040 +v -0.261346 0.943200 0.653367 +v 0.522693 1.128000 -0.130674 +v 0.522693 0.943200 -0.130674 +v 0.784040 1.128000 -0.130674 +v 0.653366 1.128000 -0.261347 +v 0.653366 0.943200 -0.261347 +v 0.784040 0.943200 -0.130674 +v -0.261346 1.128000 0.392020 +v -0.392020 1.128000 0.522693 +v -0.261346 0.943200 0.392020 +v -0.392020 0.943200 0.522693 +v 0.392020 1.128000 -0.261347 +v 0.392020 0.943200 -0.261347 +v 0.522693 1.128000 -0.392020 +v 0.522693 0.943200 -0.392020 +v -0.392020 1.128000 0.261347 +v -0.522693 1.128000 0.392020 +v -0.392020 0.943200 0.261347 +v -0.522693 0.943200 0.392020 +v 0.261346 1.128000 -0.392020 +v 0.261346 0.943200 -0.392020 +v 0.392020 1.128000 -0.522693 +v 0.392020 0.943200 -0.522693 +v -0.522693 1.128000 0.130674 +v -0.653366 1.128000 0.261347 +v -0.522693 0.943200 0.130674 +v -0.653366 0.943200 0.261347 +v 0.130673 1.128000 -0.522693 +v 0.130673 0.943200 -0.522693 +v 0.261346 1.128000 -0.653367 +v 0.261346 0.943200 -0.653367 +v -0.653367 1.128000 0.000000 +v -0.784040 1.128000 0.130674 +v -0.653367 0.943200 0.000000 +v -0.784040 0.943200 0.130674 +v -0.522693 1.128000 -0.130673 +v -0.522693 0.943200 -0.130673 +v -0.392020 1.128000 -0.261346 +v -0.392020 0.943200 -0.261346 +v -0.261347 1.128000 -0.392020 +v -0.261347 0.943200 -0.392020 +v -0.130674 1.128000 -0.522693 +v -0.130674 0.943200 -0.522693 +v -0.000000 1.128000 -0.653367 +v -0.000000 0.943200 -0.653367 +v 0.130673 1.128000 -0.784040 +v 0.130673 0.943200 -0.784040 +v -0.653367 1.128000 -0.261346 +v -0.784040 1.128000 -0.130673 +v -0.653367 0.943200 -0.261346 +v -0.784040 0.943200 -0.130673 +v -0.522693 1.128000 -0.392020 +v -0.522693 0.943200 -0.392020 +v -0.392020 1.128000 -0.522693 +v -0.392020 0.943200 -0.522693 +v -0.261347 1.128000 -0.653366 +v -0.261347 0.943200 -0.653366 +v -0.130674 1.128000 -0.784040 +v -0.130674 0.943200 -0.784040 +v -0.277200 0.943200 0.831600 +v -0.277200 0.943200 0.646800 +v -0.462000 0.943200 0.646800 +v -0.462000 0.943200 0.831600 +v -0.277200 0.758400 0.646800 +v -0.277200 0.758400 0.831600 +v -0.462000 0.758400 0.831600 +v -0.462000 0.758400 0.646800 +v -0.092400 0.943200 0.831600 +v -0.092400 0.943200 0.646800 +v -0.092400 0.758400 0.646800 +v -0.092400 0.758400 0.831600 +v 0.092400 0.943200 0.831600 +v 0.092400 0.943200 0.646800 +v 0.092400 0.758400 0.646800 +v 0.092400 0.758400 0.831600 +v 0.277200 0.943200 0.831600 +v 0.277200 0.943200 0.646800 +v 0.277200 0.758400 0.646800 +v 0.277200 0.758400 0.831600 +v 0.462000 0.943200 0.831600 +v 0.462000 0.943200 0.646800 +v 0.462000 0.758400 0.646800 +v 0.462000 0.758400 0.831600 +v -0.462000 0.943200 0.462000 +v -0.646800 0.943200 0.462000 +v -0.646800 0.943200 0.646800 +v -0.462000 0.758400 0.462000 +v -0.646800 0.758400 0.646800 +v -0.646800 0.758400 0.462000 +v -0.277200 0.943200 0.462000 +v 0.277200 0.943200 0.462000 +v 0.462000 0.943200 0.462000 +v 0.462000 0.758400 0.462000 +v 0.646800 0.943200 0.646800 +v 0.646800 0.943200 0.462000 +v 0.646800 0.758400 0.462000 +v 0.646800 0.758400 0.646800 +v -0.646800 0.943200 0.277200 +v -0.831600 0.943200 0.277200 +v -0.831600 0.943200 0.462000 +v -0.646800 0.758400 0.277200 +v -0.831600 0.758400 0.462000 +v -0.831600 0.758400 0.277200 +v -0.462000 0.943200 0.277200 +v 0.462000 0.943200 0.277200 +v 0.646800 0.943200 0.277200 +v 0.646800 0.758400 0.277200 +v 0.831600 0.943200 0.462000 +v 0.831600 0.943200 0.277200 +v 0.831600 0.758400 0.277200 +v 0.831600 0.758400 0.462000 +v -0.646800 0.943200 0.092400 +v -0.831600 0.943200 0.092400 +v -0.646800 0.758400 0.092400 +v -0.831600 0.758400 0.092400 +v 0.646800 0.943200 0.092400 +v 0.646800 0.758400 0.092400 +v 0.831600 0.943200 0.092400 +v 0.831600 0.758400 0.092400 +v -0.646800 0.943200 -0.092400 +v -0.831600 0.943200 -0.092400 +v -0.646800 0.758400 -0.092400 +v -0.831600 0.758400 -0.092400 +v 0.462000 0.943200 -0.092400 +v 0.646800 0.943200 -0.092400 +v 0.646800 0.758400 -0.092400 +v 0.831600 0.943200 -0.092400 +v 0.831600 0.758400 -0.092400 +v -0.646800 0.943200 -0.277200 +v -0.831600 0.943200 -0.277200 +v -0.646800 0.758400 -0.277200 +v -0.831600 0.758400 -0.277200 +v -0.462000 0.943200 -0.277200 +v 0.277200 0.943200 -0.277200 +v 0.462000 0.943200 -0.277200 +v 0.646800 0.943200 -0.277200 +v 0.646800 0.758400 -0.277200 +v 0.831600 0.943200 -0.277200 +v 0.831600 0.758400 -0.277200 +v -0.646800 0.943200 -0.462000 +v -0.831600 0.943200 -0.462000 +v -0.646800 0.758400 -0.462000 +v -0.831600 0.758400 -0.462000 +v -0.462000 0.943200 -0.462000 +v -0.462000 0.758400 -0.462000 +v -0.277200 0.943200 -0.462000 +v 0.092400 0.943200 -0.462000 +v 0.277200 0.943200 -0.462000 +v 0.462000 0.943200 -0.462000 +v 0.462000 0.758400 -0.462000 +v 0.646800 0.943200 -0.462000 +v 0.646800 0.758400 -0.462000 +v 0.831600 0.943200 -0.462000 +v 0.831600 0.758400 -0.462000 +v -0.462000 0.943200 -0.646800 +v -0.646800 0.943200 -0.646800 +v -0.462000 0.758400 -0.646800 +v -0.646800 0.758400 -0.646800 +v -0.277200 0.943200 -0.646800 +v -0.277200 0.758400 -0.646800 +v -0.092400 0.943200 -0.646800 +v -0.092400 0.758400 -0.646800 +v 0.092400 0.943200 -0.646800 +v 0.092400 0.758400 -0.646800 +v 0.277200 0.943200 -0.646800 +v 0.277200 0.758400 -0.646800 +v 0.462000 0.943200 -0.646800 +v 0.462000 0.758400 -0.646800 +v 0.646800 0.943200 -0.646800 +v 0.646800 0.758400 -0.646800 +v -0.277200 0.943200 -0.831600 +v -0.462000 0.943200 -0.831600 +v -0.277200 0.758400 -0.831600 +v -0.462000 0.758400 -0.831600 +v -0.092400 0.943200 -0.831600 +v -0.092400 0.758400 -0.831600 +v 0.092400 0.943200 -0.831600 +v 0.092400 0.758400 -0.831600 +v 0.277200 0.943200 -0.831600 +v 0.277200 0.758400 -0.831600 +v 0.462000 0.943200 -0.831600 +v 0.462000 0.758400 -0.831600 +v -0.784040 0.758400 0.392020 +v -0.653367 0.758400 0.261346 +v -0.784040 0.758400 0.130673 +v -0.914713 0.758400 0.261346 +v -0.653367 0.573600 0.261346 +v -0.784040 0.573600 0.392020 +v -0.914713 0.573600 0.261346 +v -0.784040 0.573600 0.130673 +v -0.653367 0.758400 0.522693 +v -0.522693 0.758400 0.392020 +v -0.522693 0.573600 0.392020 +v -0.653367 0.573600 0.522693 +v -0.522694 0.758400 0.653366 +v -0.392020 0.758400 0.522693 +v -0.392020 0.573600 0.522693 +v -0.522694 0.573600 0.653366 +v -0.392020 0.758400 0.784040 +v -0.261347 0.758400 0.653367 +v -0.261347 0.573600 0.653367 +v -0.392020 0.573600 0.784040 +v -0.261347 0.758400 0.914713 +v -0.130674 0.758400 0.784040 +v -0.130674 0.573600 0.784040 +v -0.261347 0.573600 0.914713 +v -0.653367 0.758400 -0.000000 +v -0.784040 0.758400 -0.130674 +v -0.914713 0.758400 -0.000000 +v -0.653367 0.573600 -0.000000 +v -0.914713 0.573600 -0.000000 +v -0.784040 0.573600 -0.130674 +v -0.000000 0.758400 0.653367 +v -0.000000 0.573600 0.653367 +v -0.000000 0.758400 0.914713 +v 0.130673 0.758400 0.784040 +v 0.130673 0.573600 0.784040 +v -0.000000 0.573600 0.914713 +v -0.653366 0.758400 -0.261347 +v -0.784040 0.758400 -0.392020 +v -0.914713 0.758400 -0.261347 +v -0.653366 0.573600 -0.261347 +v -0.914713 0.573600 -0.261347 +v -0.784040 0.573600 -0.392020 +v 0.261346 0.758400 0.653367 +v 0.261346 0.573600 0.653367 +v 0.261346 0.758400 0.914713 +v 0.392020 0.758400 0.784040 +v 0.392020 0.573600 0.784040 +v 0.261346 0.573600 0.914713 +v -0.522693 0.758400 -0.392020 +v -0.653366 0.758400 -0.522694 +v -0.522693 0.573600 -0.392020 +v -0.653366 0.573600 -0.522694 +v 0.392020 0.758400 0.522693 +v 0.392020 0.573600 0.522693 +v 0.522693 0.758400 0.653367 +v 0.522693 0.573600 0.653367 +v -0.392020 0.758400 -0.522693 +v -0.522693 0.758400 -0.653367 +v -0.392020 0.573600 -0.522693 +v -0.522693 0.573600 -0.653367 +v 0.522693 0.758400 0.392020 +v 0.522693 0.573600 0.392020 +v 0.653366 0.758400 0.522694 +v 0.653366 0.573600 0.522694 +v -0.261346 0.758400 -0.653367 +v -0.392020 0.758400 -0.784040 +v -0.261346 0.573600 -0.653367 +v -0.392020 0.573600 -0.784040 +v 0.653366 0.758400 0.261347 +v 0.653366 0.573600 0.261347 +v 0.784040 0.758400 0.392020 +v 0.784040 0.573600 0.392020 +v -0.130673 0.758400 -0.784040 +v -0.261346 0.758400 -0.914713 +v -0.130673 0.573600 -0.784040 +v -0.261346 0.573600 -0.914713 +v 0.000000 0.758400 -0.653367 +v 0.000000 0.573600 -0.653367 +v 0.653367 0.758400 0.000000 +v 0.653367 0.573600 0.000000 +v 0.784040 0.758400 0.130674 +v 0.784040 0.573600 0.130674 +v 0.914713 0.758400 0.261347 +v 0.914713 0.573600 0.261347 +v 0.130674 0.758400 -0.784040 +v 0.000000 0.758400 -0.914713 +v 0.130674 0.573600 -0.784040 +v 0.000000 0.573600 -0.914713 +v 0.261347 0.758400 -0.653366 +v 0.261347 0.573600 -0.653366 +v 0.392020 0.758400 -0.522693 +v 0.392020 0.573600 -0.522693 +v 0.522693 0.758400 -0.392020 +v 0.522693 0.573600 -0.392020 +v 0.653367 0.758400 -0.261346 +v 0.653367 0.573600 -0.261346 +v 0.784040 0.758400 -0.130673 +v 0.784040 0.573600 -0.130673 +v 0.914713 0.758400 0.000000 +v 0.914713 0.573600 0.000000 +v 0.392020 0.758400 -0.784040 +v 0.261347 0.758400 -0.914713 +v 0.392020 0.573600 -0.784040 +v 0.261347 0.573600 -0.914713 +v 0.522694 0.758400 -0.653366 +v 0.522694 0.573600 -0.653366 +v 0.653367 0.758400 -0.522693 +v 0.653367 0.573600 -0.522693 +v 0.784040 0.758400 -0.392020 +v 0.784040 0.573600 -0.392020 +v 0.914713 0.758400 -0.261346 +v 0.914713 0.573600 -0.261346 +v -0.277200 0.573600 0.831600 +v -0.277200 0.573600 0.646800 +v -0.462000 0.573600 0.646800 +v -0.462000 0.573600 0.831600 +v -0.277200 0.388800 0.646800 +v -0.277200 0.388800 0.831600 +v -0.462000 0.388800 0.831600 +v -0.462000 0.388800 0.646800 +v -0.092400 0.573600 0.831600 +v -0.092400 0.573600 0.646800 +v -0.092400 0.388800 0.646800 +v -0.092400 0.388800 0.831600 +v 0.092400 0.573600 0.831600 +v 0.092400 0.573600 0.646800 +v 0.092400 0.388800 0.646800 +v 0.092400 0.388800 0.831600 +v 0.277200 0.573600 0.831600 +v 0.277200 0.573600 0.646800 +v 0.277200 0.388800 0.646800 +v 0.277200 0.388800 0.831600 +v 0.462000 0.573600 0.831600 +v 0.462000 0.573600 0.646800 +v 0.462000 0.388800 0.646800 +v 0.462000 0.388800 0.831600 +v -0.462000 0.573600 0.462000 +v -0.646800 0.573600 0.462000 +v -0.646800 0.573600 0.646800 +v -0.462000 0.388800 0.462000 +v -0.646800 0.388800 0.646800 +v -0.646800 0.388800 0.462000 +v 0.462000 0.573600 0.462000 +v 0.462000 0.388800 0.462000 +v 0.646800 0.573600 0.646800 +v 0.646800 0.573600 0.462000 +v 0.646800 0.388800 0.462000 +v 0.646800 0.388800 0.646800 +v -0.646800 0.573600 0.277200 +v -0.831600 0.573600 0.277200 +v -0.831600 0.573600 0.462000 +v -0.646800 0.388800 0.277200 +v -0.831600 0.388800 0.462000 +v -0.831600 0.388800 0.277200 +v 0.646800 0.573600 0.277200 +v 0.646800 0.388800 0.277200 +v 0.831600 0.573600 0.462000 +v 0.831600 0.573600 0.277200 +v 0.831600 0.388800 0.277200 +v 0.831600 0.388800 0.462000 +v -0.646800 0.573600 0.092400 +v -0.831600 0.573600 0.092400 +v -0.646800 0.388800 0.092400 +v -0.831600 0.388800 0.092400 +v 0.646800 0.573600 0.092400 +v 0.646800 0.388800 0.092400 +v 0.831600 0.573600 0.092400 +v 0.831600 0.388800 0.092400 +v -0.646800 0.573600 -0.092400 +v -0.831600 0.573600 -0.092400 +v -0.646800 0.388800 -0.092400 +v -0.831600 0.388800 -0.092400 +v 0.646800 0.573600 -0.092400 +v 0.646800 0.388800 -0.092400 +v 0.831600 0.573600 -0.092400 +v 0.831600 0.388800 -0.092400 +v -0.646800 0.573600 -0.277200 +v -0.831600 0.573600 -0.277200 +v -0.646800 0.388800 -0.277200 +v -0.831600 0.388800 -0.277200 +v 0.646800 0.573600 -0.277200 +v 0.646800 0.388800 -0.277200 +v 0.831600 0.573600 -0.277200 +v 0.831600 0.388800 -0.277200 +v -0.646800 0.573600 -0.462000 +v -0.831600 0.573600 -0.462000 +v -0.646800 0.388800 -0.462000 +v -0.831600 0.388800 -0.462000 +v -0.462000 0.573600 -0.462000 +v -0.462000 0.388800 -0.462000 +v 0.462000 0.573600 -0.462000 +v 0.462000 0.388800 -0.462000 +v 0.646800 0.573600 -0.462000 +v 0.646800 0.388800 -0.462000 +v 0.831600 0.573600 -0.462000 +v 0.831600 0.388800 -0.462000 +v -0.462000 0.573600 -0.646800 +v -0.646800 0.573600 -0.646800 +v -0.462000 0.388800 -0.646800 +v -0.646800 0.388800 -0.646800 +v -0.277200 0.573600 -0.646800 +v -0.277200 0.388800 -0.646800 +v -0.092400 0.573600 -0.646800 +v -0.092400 0.388800 -0.646800 +v 0.092400 0.573600 -0.646800 +v 0.092400 0.388800 -0.646800 +v 0.277200 0.573600 -0.646800 +v 0.277200 0.388800 -0.646800 +v 0.462000 0.573600 -0.646800 +v 0.462000 0.388800 -0.646800 +v 0.646800 0.573600 -0.646800 +v 0.646800 0.388800 -0.646800 +v -0.277200 0.573600 -0.831600 +v -0.462000 0.573600 -0.831600 +v -0.277200 0.388800 -0.831600 +v -0.462000 0.388800 -0.831600 +v -0.092400 0.573600 -0.831600 +v -0.092400 0.388800 -0.831600 +v 0.092400 0.573600 -0.831600 +v 0.092400 0.388800 -0.831600 +v 0.277200 0.573600 -0.831600 +v 0.277200 0.388800 -0.831600 +v 0.462000 0.573600 -0.831600 +v 0.462000 0.388800 -0.831600 +v 0.388100 0.387876 1.034933 +v 0.258734 0.387876 0.905566 +v 0.129367 0.387876 1.034933 +v 0.258734 0.387876 1.164299 +v 0.258734 0.204924 0.905566 +v 0.388100 0.204924 1.034933 +v 0.258734 0.204924 1.164299 +v 0.129367 0.204924 1.034933 +v 0.517467 0.387876 0.905566 +v 0.388100 0.387876 0.776199 +v 0.388100 0.204924 0.776199 +v 0.517467 0.204924 0.905566 +v 0.646833 0.387876 0.776199 +v 0.517467 0.387876 0.646833 +v 0.517467 0.204924 0.646833 +v 0.646833 0.204924 0.776199 +v 0.776200 0.387876 0.646833 +v 0.646833 0.387876 0.517466 +v 0.646833 0.204924 0.517466 +v 0.776200 0.204924 0.646833 +v 0.905566 0.387876 0.517466 +v 0.776200 0.387876 0.388099 +v 0.776200 0.204924 0.388099 +v 0.905566 0.204924 0.517466 +v 1.034933 0.387876 0.388099 +v 0.905566 0.387876 0.258733 +v 0.905566 0.204924 0.258733 +v 1.034933 0.204924 0.388099 +v 1.164299 0.387876 0.258733 +v 1.034933 0.387876 0.129366 +v 1.034933 0.204924 0.129366 +v 1.164299 0.204924 0.258733 +v 0.000000 0.387876 0.905566 +v -0.129366 0.387876 1.034933 +v 0.000000 0.387876 1.164299 +v 0.000000 0.204924 0.905566 +v 0.000000 0.204924 1.164299 +v -0.129366 0.204924 1.034933 +v 0.129367 0.387876 0.776200 +v 0.258733 0.387876 0.646833 +v 0.646833 0.387876 0.258733 +v 0.776200 0.387876 0.129366 +v 0.905566 0.387876 -0.000000 +v 0.905566 0.204924 -0.000000 +v 1.164299 0.387876 -0.000000 +v 1.034933 0.387876 -0.129367 +v 1.034933 0.204924 -0.129367 +v 1.164299 0.204924 -0.000000 +v -0.258733 0.387876 0.905566 +v -0.388099 0.387876 1.034933 +v -0.258733 0.387876 1.164299 +v -0.258733 0.204924 0.905566 +v -0.258733 0.204924 1.164299 +v -0.388099 0.204924 1.034933 +v -0.129366 0.387876 0.776200 +v 0.000000 0.387876 0.646833 +v 0.646833 0.387876 -0.000000 +v 0.776199 0.387876 -0.129367 +v 0.905566 0.387876 -0.258734 +v 0.905566 0.204924 -0.258734 +v 1.164299 0.387876 -0.258734 +v 1.034933 0.387876 -0.388100 +v 1.034933 0.204924 -0.388100 +v 1.164299 0.204924 -0.258734 +v -0.388099 0.387876 0.776200 +v -0.517466 0.387876 0.905566 +v -0.388099 0.204924 0.776200 +v -0.517466 0.204924 0.905566 +v -0.258733 0.387876 0.646833 +v 0.646833 0.387876 -0.258733 +v 0.776199 0.387876 -0.388100 +v 0.776199 0.204924 -0.388100 +v 0.905566 0.387876 -0.517467 +v 0.905566 0.204924 -0.517467 +v -0.517466 0.387876 0.646833 +v -0.646833 0.387876 0.776200 +v -0.517466 0.204924 0.646833 +v -0.646833 0.204924 0.776200 +v -0.388100 0.387876 0.517467 +v 0.517466 0.387876 -0.388100 +v 0.646833 0.387876 -0.517467 +v 0.646833 0.204924 -0.517467 +v 0.776199 0.387876 -0.646833 +v 0.776199 0.204924 -0.646833 +v -0.646833 0.387876 0.517467 +v -0.776199 0.387876 0.646833 +v -0.646833 0.204924 0.517467 +v -0.776199 0.204924 0.646833 +v -0.517466 0.387876 0.388100 +v 0.388100 0.387876 -0.517466 +v 0.517466 0.387876 -0.646833 +v 0.517466 0.204924 -0.646833 +v 0.646833 0.387876 -0.776200 +v 0.646833 0.204924 -0.776200 +v -0.776199 0.387876 0.388100 +v -0.905566 0.387876 0.517467 +v -0.776199 0.204924 0.388100 +v -0.905566 0.204924 0.517467 +v -0.646833 0.387876 0.258733 +v 0.258733 0.387876 -0.646833 +v 0.388099 0.387876 -0.776200 +v 0.388099 0.204924 -0.776200 +v 0.517466 0.387876 -0.905566 +v 0.517466 0.204924 -0.905566 +v -0.905566 0.387876 0.258734 +v -1.034933 0.387876 0.388100 +v -0.905566 0.204924 0.258734 +v -1.034933 0.204924 0.388100 +v -0.776199 0.387876 0.129367 +v -0.646833 0.387876 0.000000 +v -0.000000 0.387876 -0.646833 +v 0.129366 0.387876 -0.776200 +v 0.258733 0.387876 -0.905566 +v 0.258733 0.204924 -0.905566 +v 0.388099 0.387876 -1.034933 +v 0.388099 0.204924 -1.034933 +v -1.034933 0.387876 0.129367 +v -1.164299 0.387876 0.258734 +v -1.034933 0.204924 0.129367 +v -1.164299 0.204924 0.258734 +v -0.905566 0.387876 0.000000 +v -0.905566 0.204924 0.000000 +v -0.776200 0.387876 -0.129366 +v -0.646833 0.387876 -0.258733 +v -0.517467 0.387876 -0.388100 +v -0.388100 0.387876 -0.517466 +v -0.258733 0.387876 -0.646833 +v -0.129367 0.387876 -0.776199 +v -0.000000 0.387876 -0.905566 +v -0.000000 0.204924 -0.905566 +v 0.129366 0.387876 -1.034933 +v 0.129366 0.204924 -1.034933 +v 0.258733 0.387876 -1.164299 +v 0.258733 0.204924 -1.164299 +v -1.034933 0.387876 -0.129366 +v -1.164299 0.387876 0.000000 +v -1.034933 0.204924 -0.129366 +v -1.164299 0.204924 0.000000 +v -0.905566 0.387876 -0.258733 +v -0.905566 0.204924 -0.258733 +v -0.776200 0.387876 -0.388099 +v -0.776200 0.204924 -0.388099 +v -0.646833 0.387876 -0.517466 +v -0.646833 0.204924 -0.517466 +v -0.517467 0.387876 -0.646833 +v -0.517467 0.204924 -0.646833 +v -0.388100 0.387876 -0.776199 +v -0.388100 0.204924 -0.776199 +v -0.258734 0.387876 -0.905566 +v -0.258734 0.204924 -0.905566 +v -0.129367 0.387876 -1.034933 +v -0.129367 0.204924 -1.034933 +v -0.000000 0.387876 -1.164299 +v -0.000000 0.204924 -1.164299 +v -1.034933 0.387876 -0.388099 +v -1.164299 0.387876 -0.258733 +v -1.034933 0.204924 -0.388099 +v -1.164299 0.204924 -0.258733 +v -0.905566 0.387876 -0.517466 +v -0.905566 0.204924 -0.517466 +v -0.776200 0.387876 -0.646833 +v -0.776200 0.204924 -0.646833 +v -0.646833 0.387876 -0.776199 +v -0.646833 0.204924 -0.776199 +v -0.517467 0.387876 -0.905566 +v -0.517467 0.204924 -0.905566 +v -0.388100 0.387876 -1.034933 +v -0.388100 0.204924 -1.034933 +v -0.258734 0.387876 -1.164299 +v -0.258734 0.204924 -1.164299 +v -0.462000 0.204000 1.016400 +v -0.462000 0.204000 0.831600 +v -0.646800 0.204000 0.831600 +v -0.646800 0.204000 1.016400 +v -0.462000 0.019200 0.831600 +v -0.462000 0.019200 1.016400 +v -0.646800 0.019200 1.016400 +v -0.646800 0.019200 0.831600 +v -0.277200 0.204000 1.016400 +v -0.277200 0.204000 0.831600 +v -0.277200 0.019200 0.831600 +v -0.277200 0.019200 1.016400 +v -0.092400 0.204000 1.016400 +v -0.092400 0.204000 0.831600 +v -0.092400 0.019200 0.831600 +v -0.092400 0.019200 1.016400 +v 0.092400 0.204000 1.016400 +v 0.092400 0.204000 0.831600 +v 0.092400 0.019200 0.831600 +v 0.092400 0.019200 1.016400 +v 0.277200 0.204000 1.016400 +v 0.277200 0.204000 0.831600 +v 0.277200 0.019200 0.831600 +v 0.277200 0.019200 1.016400 +v 0.462000 0.204000 1.016400 +v 0.462000 0.204000 0.831600 +v 0.462000 0.019200 0.831600 +v 0.462000 0.019200 1.016400 +v 0.646800 0.204000 1.016400 +v 0.646800 0.204000 0.831600 +v 0.646800 0.019200 0.831600 +v 0.646800 0.019200 1.016400 +v -0.646800 0.204000 0.646800 +v -0.831600 0.204000 0.646800 +v -0.831600 0.204000 0.831600 +v -0.646800 0.019200 0.646800 +v -0.831600 0.019200 0.831600 +v -0.831600 0.019200 0.646800 +v -0.462000 0.204000 0.646800 +v 0.462000 0.204000 0.646800 +v 0.646800 0.204000 0.646800 +v 0.646800 0.019200 0.646800 +v 0.831600 0.204000 0.831600 +v 0.831600 0.204000 0.646800 +v 0.831600 0.019200 0.646800 +v 0.831600 0.019200 0.831600 +v -0.831600 0.204000 0.462000 +v -1.016400 0.204000 0.462000 +v -1.016400 0.204000 0.646800 +v -0.831600 0.019200 0.462000 +v -1.016400 0.019200 0.646800 +v -1.016400 0.019200 0.462000 +v -0.646800 0.204000 0.462000 +v 0.646800 0.204000 0.462000 +v 0.831600 0.204000 0.462000 +v 0.831600 0.019200 0.462000 +v 1.016400 0.204000 0.646800 +v 1.016400 0.204000 0.462000 +v 1.016400 0.019200 0.462000 +v 1.016400 0.019200 0.646800 +v -0.831600 0.204000 0.277200 +v -1.016400 0.204000 0.277200 +v -0.831600 0.019200 0.277200 +v -1.016400 0.019200 0.277200 +v 0.831600 0.204000 0.277200 +v 0.831600 0.019200 0.277200 +v 1.016400 0.204000 0.277200 +v 1.016400 0.019200 0.277200 +v -0.831600 0.204000 0.092400 +v -1.016400 0.204000 0.092400 +v -0.831600 0.019200 0.092400 +v -1.016400 0.019200 0.092400 +v 0.831600 0.204000 0.092400 +v 0.831600 0.019200 0.092400 +v 1.016400 0.204000 0.092400 +v 1.016400 0.019200 0.092400 +v -0.831600 0.204000 -0.092400 +v -1.016400 0.204000 -0.092400 +v -0.831600 0.019200 -0.092400 +v -1.016400 0.019200 -0.092400 +v 0.831600 0.204000 -0.092400 +v 0.831600 0.019200 -0.092400 +v 1.016400 0.204000 -0.092400 +v 1.016400 0.019200 -0.092400 +v -0.831600 0.204000 -0.277200 +v -1.016400 0.204000 -0.277200 +v -0.831600 0.019200 -0.277200 +v -1.016400 0.019200 -0.277200 +v 0.831600 0.204000 -0.277200 +v 0.831600 0.019200 -0.277200 +v 1.016400 0.204000 -0.277200 +v 1.016400 0.019200 -0.277200 +v -0.831600 0.204000 -0.462000 +v -1.016400 0.204000 -0.462000 +v -0.831600 0.019200 -0.462000 +v -1.016400 0.019200 -0.462000 +v -0.646800 0.204000 -0.462000 +v 0.831600 0.204000 -0.462000 +v 0.831600 0.019200 -0.462000 +v 1.016400 0.204000 -0.462000 +v 1.016400 0.019200 -0.462000 +v -0.831600 0.204000 -0.646800 +v -1.016400 0.204000 -0.646800 +v -0.831600 0.019200 -0.646800 +v -1.016400 0.019200 -0.646800 +v -0.646800 0.204000 -0.646800 +v -0.646800 0.019200 -0.646800 +v -0.462000 0.204000 -0.646800 +v 0.462000 0.204000 -0.646800 +v 0.646800 0.204000 -0.646800 +v 0.646800 0.019200 -0.646800 +v 0.831600 0.204000 -0.646800 +v 0.831600 0.019200 -0.646800 +v 1.016400 0.204000 -0.646800 +v 1.016400 0.019200 -0.646800 +v -0.646800 0.204000 -0.831600 +v -0.831600 0.204000 -0.831600 +v -0.646800 0.019200 -0.831600 +v -0.831600 0.019200 -0.831600 +v -0.462000 0.204000 -0.831600 +v -0.462000 0.019200 -0.831600 +v -0.277200 0.204000 -0.831600 +v -0.277200 0.019200 -0.831600 +v -0.092400 0.204000 -0.831600 +v -0.092400 0.019200 -0.831600 +v 0.092400 0.204000 -0.831600 +v 0.092400 0.019200 -0.831600 +v 0.277200 0.204000 -0.831600 +v 0.277200 0.019200 -0.831600 +v 0.462000 0.204000 -0.831600 +v 0.462000 0.019200 -0.831600 +v 0.646800 0.204000 -0.831600 +v 0.646800 0.019200 -0.831600 +v 0.831600 0.204000 -0.831600 +v 0.831600 0.019200 -0.831600 +v -0.462000 0.204000 -1.016400 +v -0.646800 0.204000 -1.016400 +v -0.462000 0.019200 -1.016400 +v -0.646800 0.019200 -1.016400 +v -0.277200 0.204000 -1.016400 +v -0.277200 0.019200 -1.016400 +v -0.092400 0.204000 -1.016400 +v -0.092400 0.019200 -1.016400 +v 0.092400 0.204000 -1.016400 +v 0.092400 0.019200 -1.016400 +v 0.277200 0.204000 -1.016400 +v 0.277200 0.019200 -1.016400 +v 0.462000 0.204000 -1.016400 +v 0.462000 0.019200 -1.016400 +v 0.646800 0.204000 -1.016400 +v 0.646800 0.019200 -1.016400 +v 0.388100 0.018276 1.034933 +v 0.258734 0.018276 0.905566 +v 0.129367 0.018276 1.034933 +v 0.258734 0.018276 1.164299 +v 0.258734 -0.164676 0.905566 +v 0.388100 -0.164676 1.034933 +v 0.258734 -0.164676 1.164299 +v 0.129367 -0.164676 1.034933 +v 0.517467 0.018276 0.905566 +v 0.388100 0.018276 0.776199 +v 0.388100 -0.164676 0.776199 +v 0.517467 -0.164676 0.905566 +v 0.646833 0.018276 0.776199 +v 0.517467 0.018276 0.646833 +v 0.517467 -0.164676 0.646833 +v 0.646833 -0.164676 0.776199 +v 0.776200 0.018276 0.646833 +v 0.646833 0.018276 0.517466 +v 0.646833 -0.164676 0.517466 +v 0.776200 -0.164676 0.646833 +v 0.905566 0.018276 0.517466 +v 0.776200 0.018276 0.388099 +v 0.776200 -0.164676 0.388099 +v 0.905566 -0.164676 0.517466 +v 1.034933 0.018276 0.388099 +v 0.905566 0.018276 0.258733 +v 0.905566 -0.164676 0.258733 +v 1.034933 -0.164676 0.388099 +v 1.164299 0.018276 0.258733 +v 1.034933 0.018276 0.129366 +v 1.034933 -0.164676 0.129366 +v 1.164299 -0.164676 0.258733 +v 0.000000 0.018276 0.905566 +v -0.129366 0.018276 1.034933 +v 0.000000 0.018276 1.164299 +v 0.000000 -0.164676 0.905566 +v 0.000000 -0.164676 1.164299 +v -0.129366 -0.164676 1.034933 +v 0.776200 0.018276 0.129366 +v 0.905566 0.018276 -0.000000 +v 0.905566 -0.164676 -0.000000 +v 1.164299 0.018276 -0.000000 +v 1.034933 0.018276 -0.129367 +v 1.034933 -0.164676 -0.129367 +v 1.164299 -0.164676 -0.000000 +v -0.258733 0.018276 0.905566 +v -0.388099 0.018276 1.034933 +v -0.258733 0.018276 1.164299 +v -0.258733 -0.164676 0.905566 +v -0.258733 -0.164676 1.164299 +v -0.388099 -0.164676 1.034933 +v 0.776199 0.018276 -0.129367 +v 0.905566 0.018276 -0.258734 +v 0.905566 -0.164676 -0.258734 +v 1.164299 0.018276 -0.258734 +v 1.034933 0.018276 -0.388100 +v 1.034933 -0.164676 -0.388100 +v 1.164299 -0.164676 -0.258734 +v -0.388099 0.018276 0.776200 +v -0.517466 0.018276 0.905566 +v -0.388099 -0.164676 0.776200 +v -0.517466 -0.164676 0.905566 +v 0.776199 0.018276 -0.388100 +v 0.776199 -0.164676 -0.388100 +v 0.905566 0.018276 -0.517467 +v 0.905566 -0.164676 -0.517467 +v -0.517466 0.018276 0.646833 +v -0.646833 0.018276 0.776200 +v -0.517466 -0.164676 0.646833 +v -0.646833 -0.164676 0.776200 +v 0.646833 0.018276 -0.517467 +v 0.646833 -0.164676 -0.517467 +v 0.776199 0.018276 -0.646833 +v 0.776199 -0.164676 -0.646833 +v -0.646833 0.018276 0.517467 +v -0.776199 0.018276 0.646833 +v -0.646833 -0.164676 0.517467 +v -0.776199 -0.164676 0.646833 +v 0.517466 0.018276 -0.646833 +v 0.517466 -0.164676 -0.646833 +v 0.646833 0.018276 -0.776200 +v 0.646833 -0.164676 -0.776200 +v -0.776199 0.018276 0.388100 +v -0.905566 0.018276 0.517467 +v -0.776199 -0.164676 0.388100 +v -0.905566 -0.164676 0.517467 +v 0.388099 0.018276 -0.776200 +v 0.388099 -0.164676 -0.776200 +v 0.517466 0.018276 -0.905566 +v 0.517466 -0.164676 -0.905566 +v -0.905566 0.018276 0.258734 +v -1.034933 0.018276 0.388100 +v -0.905566 -0.164676 0.258734 +v -1.034933 -0.164676 0.388100 +v -0.776199 0.018276 0.129367 +v 0.129366 0.018276 -0.776200 +v 0.258733 0.018276 -0.905566 +v 0.258733 -0.164676 -0.905566 +v 0.388099 0.018276 -1.034933 +v 0.388099 -0.164676 -1.034933 +v -1.034933 0.018276 0.129367 +v -1.164299 0.018276 0.258734 +v -1.034933 -0.164676 0.129367 +v -1.164299 -0.164676 0.258734 +v -0.905566 0.018276 0.000000 +v -0.905566 -0.164676 0.000000 +v -0.776200 0.018276 -0.129366 +v -0.129367 0.018276 -0.776199 +v -0.000000 0.018276 -0.905566 +v -0.000000 -0.164676 -0.905566 +v 0.129366 0.018276 -1.034933 +v 0.129366 -0.164676 -1.034933 +v 0.258733 0.018276 -1.164299 +v 0.258733 -0.164676 -1.164299 +v -1.034933 0.018276 -0.129366 +v -1.164299 0.018276 0.000000 +v -1.034933 -0.164676 -0.129366 +v -1.164299 -0.164676 0.000000 +v -0.905566 0.018276 -0.258733 +v -0.905566 -0.164676 -0.258733 +v -0.776200 0.018276 -0.388099 +v -0.776200 -0.164676 -0.388099 +v -0.646833 0.018276 -0.517466 +v -0.646833 -0.164676 -0.517466 +v -0.517467 0.018276 -0.646833 +v -0.517467 -0.164676 -0.646833 +v -0.388100 0.018276 -0.776199 +v -0.388100 -0.164676 -0.776199 +v -0.258734 0.018276 -0.905566 +v -0.258734 -0.164676 -0.905566 +v -0.129367 0.018276 -1.034933 +v -0.129367 -0.164676 -1.034933 +v -0.000000 0.018276 -1.164299 +v -0.000000 -0.164676 -1.164299 +v -1.034933 0.018276 -0.388099 +v -1.164299 0.018276 -0.258733 +v -1.034933 -0.164676 -0.388099 +v -1.164299 -0.164676 -0.258733 +v -0.905566 0.018276 -0.517466 +v -0.905566 -0.164676 -0.517466 +v -0.776200 0.018276 -0.646833 +v -0.776200 -0.164676 -0.646833 +v -0.646833 0.018276 -0.776199 +v -0.646833 -0.164676 -0.776199 +v -0.517467 0.018276 -0.905566 +v -0.517467 -0.164676 -0.905566 +v -0.388100 0.018276 -1.034933 +v -0.388100 -0.164676 -1.034933 +v -0.258734 0.018276 -1.164299 +v -0.258734 -0.164676 -1.164299 +v -0.462000 -0.165600 1.016400 +v -0.462000 -0.165600 0.831600 +v -0.646800 -0.165600 0.831600 +v -0.646800 -0.165600 1.016400 +v -0.462000 -0.350400 0.831600 +v -0.462000 -0.350400 1.016400 +v -0.646800 -0.350400 1.016400 +v -0.646800 -0.350400 0.831600 +v -0.277200 -0.165600 1.016400 +v -0.277200 -0.165600 0.831600 +v -0.277200 -0.350400 0.831600 +v -0.277200 -0.350400 1.016400 +v -0.092400 -0.165600 1.016400 +v -0.092400 -0.165600 0.831600 +v -0.092400 -0.350400 0.831600 +v -0.092400 -0.350400 1.016400 +v 0.092400 -0.165600 1.016400 +v 0.092400 -0.165600 0.831600 +v 0.092400 -0.350400 0.831600 +v 0.092400 -0.350400 1.016400 +v 0.277200 -0.165600 1.016400 +v 0.277200 -0.165600 0.831600 +v 0.277200 -0.350400 0.831600 +v 0.277200 -0.350400 1.016400 +v 0.462000 -0.165600 1.016400 +v 0.462000 -0.165600 0.831600 +v 0.462000 -0.350400 0.831600 +v 0.462000 -0.350400 1.016400 +v 0.646800 -0.165600 1.016400 +v 0.646800 -0.165600 0.831600 +v 0.646800 -0.350400 0.831600 +v 0.646800 -0.350400 1.016400 +v -0.646800 -0.165600 0.646800 +v -0.831600 -0.165600 0.646800 +v -0.831600 -0.165600 0.831600 +v -0.646800 -0.350400 0.646800 +v -0.831600 -0.350400 0.831600 +v -0.831600 -0.350400 0.646800 +v -0.462000 -0.165600 0.646800 +v 0.646800 -0.165600 0.646800 +v 0.646800 -0.350400 0.646800 +v 0.831600 -0.165600 0.831600 +v 0.831600 -0.165600 0.646800 +v 0.831600 -0.350400 0.646800 +v 0.831600 -0.350400 0.831600 +v -0.831600 -0.165600 0.462000 +v -1.016400 -0.165600 0.462000 +v -1.016400 -0.165600 0.646800 +v -0.831600 -0.350400 0.462000 +v -1.016400 -0.350400 0.646800 +v -1.016400 -0.350400 0.462000 +v -0.646800 -0.165600 0.462000 +v 0.646800 -0.165600 0.462000 +v 0.831600 -0.165600 0.462000 +v 0.831600 -0.350400 0.462000 +v 1.016400 -0.165600 0.646800 +v 1.016400 -0.165600 0.462000 +v 1.016400 -0.350400 0.462000 +v 1.016400 -0.350400 0.646800 +v -0.831600 -0.165600 0.277200 +v -1.016400 -0.165600 0.277200 +v -0.831600 -0.350400 0.277200 +v -1.016400 -0.350400 0.277200 +v 0.831600 -0.165600 0.277200 +v 0.831600 -0.350400 0.277200 +v 1.016400 -0.165600 0.277200 +v 1.016400 -0.350400 0.277200 +v -0.831600 -0.165600 0.092400 +v -1.016400 -0.165600 0.092400 +v -0.831600 -0.350400 0.092400 +v -1.016400 -0.350400 0.092400 +v 0.831600 -0.165600 0.092400 +v 0.831600 -0.350400 0.092400 +v 1.016400 -0.165600 0.092400 +v 1.016400 -0.350400 0.092400 +v -0.831600 -0.165600 -0.092400 +v -1.016400 -0.165600 -0.092400 +v -0.831600 -0.350400 -0.092400 +v -1.016400 -0.350400 -0.092400 +v 0.831600 -0.165600 -0.092400 +v 0.831600 -0.350400 -0.092400 +v 1.016400 -0.165600 -0.092400 +v 1.016400 -0.350400 -0.092400 +v -0.831600 -0.165600 -0.277200 +v -1.016400 -0.165600 -0.277200 +v -0.831600 -0.350400 -0.277200 +v -1.016400 -0.350400 -0.277200 +v 0.831600 -0.165600 -0.277200 +v 0.831600 -0.350400 -0.277200 +v 1.016400 -0.165600 -0.277200 +v 1.016400 -0.350400 -0.277200 +v -0.831600 -0.165600 -0.462000 +v -1.016400 -0.165600 -0.462000 +v -0.831600 -0.350400 -0.462000 +v -1.016400 -0.350400 -0.462000 +v -0.646800 -0.165600 -0.462000 +v 0.646800 -0.165600 -0.462000 +v 0.831600 -0.165600 -0.462000 +v 0.831600 -0.350400 -0.462000 +v 1.016400 -0.165600 -0.462000 +v 1.016400 -0.350400 -0.462000 +v -0.831600 -0.165600 -0.646800 +v -1.016400 -0.165600 -0.646800 +v -0.831600 -0.350400 -0.646800 +v -1.016400 -0.350400 -0.646800 +v -0.646800 -0.165600 -0.646800 +v -0.646800 -0.350400 -0.646800 +v -0.462000 -0.165600 -0.646800 +v 0.462000 -0.165600 -0.646800 +v 0.646800 -0.165600 -0.646800 +v 0.646800 -0.350400 -0.646800 +v 0.831600 -0.165600 -0.646800 +v 0.831600 -0.350400 -0.646800 +v 1.016400 -0.165600 -0.646800 +v 1.016400 -0.350400 -0.646800 +v -0.646800 -0.165600 -0.831600 +v -0.831600 -0.165600 -0.831600 +v -0.646800 -0.350400 -0.831600 +v -0.831600 -0.350400 -0.831600 +v -0.462000 -0.165600 -0.831600 +v -0.462000 -0.350400 -0.831600 +v -0.277200 -0.165600 -0.831600 +v -0.277200 -0.350400 -0.831600 +v -0.092400 -0.165600 -0.831600 +v -0.092400 -0.350400 -0.831600 +v 0.092400 -0.165600 -0.831600 +v 0.092400 -0.350400 -0.831600 +v 0.277200 -0.165600 -0.831600 +v 0.277200 -0.350400 -0.831600 +v 0.462000 -0.165600 -0.831600 +v 0.462000 -0.350400 -0.831600 +v 0.646800 -0.165600 -0.831600 +v 0.646800 -0.350400 -0.831600 +v 0.831600 -0.165600 -0.831600 +v 0.831600 -0.350400 -0.831600 +v -0.462000 -0.165600 -1.016400 +v -0.646800 -0.165600 -1.016400 +v -0.462000 -0.350400 -1.016400 +v -0.646800 -0.350400 -1.016400 +v -0.277200 -0.165600 -1.016400 +v -0.277200 -0.350400 -1.016400 +v -0.092400 -0.165600 -1.016400 +v -0.092400 -0.350400 -1.016400 +v 0.092400 -0.165600 -1.016400 +v 0.092400 -0.350400 -1.016400 +v 0.277200 -0.165600 -1.016400 +v 0.277200 -0.350400 -1.016400 +v 0.462000 -0.165600 -1.016400 +v 0.462000 -0.350400 -1.016400 +v 0.646800 -0.165600 -1.016400 +v 0.646800 -0.350400 -1.016400 +v -0.092400 2.236800 0.092400 +v -0.092400 2.236800 0.092400 +v -0.092400 2.421600 0.092400 +v -0.092400 2.421600 0.092400 +v -0.092400 2.421600 -0.092400 +v -0.092400 2.421600 -0.092400 +v -0.092400 2.236800 -0.092400 +v -0.092400 2.236800 -0.092400 +v 0.092400 2.421600 -0.092400 +v 0.092400 2.421600 -0.092400 +v 0.092400 2.236800 -0.092400 +v 0.092400 2.236800 -0.092400 +v 0.092400 2.421600 0.092400 +v 0.092400 2.421600 0.092400 +v 0.092400 2.236800 0.092400 +v 0.092400 2.236800 0.092400 +v 0.130673 2.236800 -0.261347 +v 0.130673 2.236800 -0.261347 +v 0.130673 2.052000 -0.261347 +v 0.130673 2.052000 -0.261347 +v 0.000000 2.236800 0.130673 +v 0.000000 2.236800 0.130673 +v 0.000000 2.052000 0.130673 +v 0.000000 2.052000 0.130673 +v 0.000000 2.052000 0.130673 +v -0.000000 2.236800 -0.130673 +v -0.000000 2.236800 -0.130673 +v -0.130673 2.236800 -0.261347 +v -0.130673 2.236800 -0.261347 +v -0.000000 2.052000 -0.130673 +v -0.000000 2.052000 -0.130673 +v -0.000000 2.052000 -0.130673 +v -0.130673 2.052000 -0.261347 +v -0.130673 2.052000 -0.261347 +v -0.130673 2.236800 0.261347 +v -0.130673 2.236800 0.261347 +v 0.261347 2.236800 0.130673 +v 0.261347 2.236800 0.130673 +v 0.261347 2.052000 0.130673 +v 0.261347 2.052000 0.130673 +v 0.130673 2.052000 -0.000000 +v 0.130673 2.052000 -0.000000 +v 0.130673 2.052000 -0.000000 +v -0.130673 2.236800 0.000000 +v -0.130673 2.236800 0.000000 +v -0.261347 2.236800 0.130673 +v -0.261347 2.236800 0.130673 +v 0.130673 2.052000 0.261347 +v 0.130673 2.052000 0.261347 +v 0.261347 2.236800 -0.130673 +v 0.261347 2.236800 -0.130673 +v -0.130673 2.052000 0.000000 +v -0.130673 2.052000 0.000000 +v -0.130673 2.052000 0.000000 +v -0.261347 2.052000 -0.130673 +v -0.261347 2.052000 -0.130673 +v 0.130673 2.236800 -0.000000 +v 0.130673 2.236800 -0.000000 +v 0.261347 2.052000 -0.130673 +v 0.261347 2.052000 -0.130673 +v -0.261347 2.052000 0.130673 +v -0.261347 2.052000 0.130673 +v 0.130673 2.236800 0.261347 +v 0.130673 2.236800 0.261347 +v -0.130673 2.052000 0.261347 +v -0.130673 2.052000 0.261347 +v -0.261347 2.236800 -0.130673 +v -0.261347 2.236800 -0.130673 +v -0.277200 1.867200 -0.092400 +v -0.277200 1.867200 -0.092400 +v -0.277200 1.867200 -0.092400 +v -0.462000 1.867200 -0.092400 +v -0.462000 1.867200 -0.092400 +v 0.092400 2.052000 -0.462000 +v 0.092400 2.052000 -0.462000 +v 0.092400 1.867200 -0.462000 +v 0.092400 1.867200 -0.462000 +v 0.092400 2.052000 0.277200 +v 0.092400 2.052000 0.277200 +v 0.277200 2.052000 0.277200 +v 0.277200 2.052000 0.277200 +v -0.092400 2.052000 -0.462000 +v -0.092400 2.052000 -0.462000 +v -0.092400 1.867200 -0.462000 +v -0.092400 1.867200 -0.462000 +v 0.092400 1.867200 -0.277200 +v 0.092400 1.867200 -0.277200 +v 0.092400 1.867200 -0.277200 +v -0.277200 2.052000 0.092400 +v -0.277200 2.052000 0.092400 +v -0.277200 1.867200 0.092400 +v -0.277200 1.867200 0.092400 +v -0.277200 1.867200 0.092400 +v -0.277200 1.867200 0.277200 +v -0.277200 1.867200 0.277200 +v -0.092400 2.052000 0.462000 +v -0.092400 2.052000 0.462000 +v -0.092400 1.867200 0.462000 +v -0.092400 1.867200 0.462000 +v 0.462000 1.867200 -0.092400 +v 0.462000 1.867200 -0.092400 +v 0.462000 1.867200 0.092400 +v 0.462000 1.867200 0.092400 +v -0.462000 2.052000 -0.092400 +v -0.462000 2.052000 -0.092400 +v -0.462000 2.052000 0.092400 +v -0.462000 2.052000 0.092400 +v 0.092400 1.867200 0.277200 +v 0.092400 1.867200 0.277200 +v 0.092400 1.867200 0.277200 +v 0.092400 1.867200 0.462000 +v 0.092400 1.867200 0.462000 +v 0.462000 2.052000 -0.092400 +v 0.462000 2.052000 -0.092400 +v 0.092400 2.052000 -0.277200 +v 0.092400 2.052000 -0.277200 +v -0.277200 2.052000 -0.277200 +v -0.277200 2.052000 -0.277200 +v -0.277200 1.867200 -0.277200 +v -0.277200 1.867200 -0.277200 +v 0.462000 2.052000 0.092400 +v 0.462000 2.052000 0.092400 +v -0.092400 2.052000 -0.277200 +v -0.092400 2.052000 -0.277200 +v -0.092400 1.867200 -0.277200 +v -0.092400 1.867200 -0.277200 +v -0.092400 1.867200 -0.277200 +v -0.092400 2.052000 0.277200 +v -0.092400 2.052000 0.277200 +v -0.092400 1.867200 0.277200 +v -0.092400 1.867200 0.277200 +v -0.092400 1.867200 0.277200 +v 0.092400 2.052000 0.462000 +v 0.092400 2.052000 0.462000 +v 0.277200 2.052000 -0.092400 +v 0.277200 2.052000 -0.092400 +v -0.462000 1.867200 0.092400 +v -0.462000 1.867200 0.092400 +v 0.277200 1.867200 -0.092400 +v 0.277200 1.867200 -0.092400 +v 0.277200 1.867200 -0.092400 +v -0.277200 2.052000 -0.092400 +v -0.277200 2.052000 -0.092400 +v -0.277200 2.052000 0.277200 +v -0.277200 2.052000 0.277200 +v 0.277200 2.052000 0.092400 +v 0.277200 2.052000 0.092400 +v 0.277200 1.867200 -0.277200 +v 0.277200 1.867200 -0.277200 +v 0.277200 1.867200 0.092400 +v 0.277200 1.867200 0.092400 +v 0.277200 1.867200 0.092400 +v 0.277200 1.867200 0.277200 +v 0.277200 1.867200 0.277200 +v 0.277200 2.052000 -0.277200 +v 0.277200 2.052000 -0.277200 +v -0.392020 1.682400 -0.261346 +v -0.261347 1.682400 -0.392020 +v 0.392020 1.867200 -0.000000 +v 0.392020 1.867200 -0.000000 +v 0.392020 1.867200 -0.000000 +v 0.522693 1.867200 -0.130674 +v 0.522693 1.867200 -0.130674 +v -0.392020 1.867200 0.000000 +v -0.392020 1.867200 0.000000 +v -0.392020 1.682400 0.000000 +v -0.392020 1.682400 0.000000 +v -0.392020 1.682400 0.000000 +v -0.522693 1.867200 0.130674 +v -0.522693 1.867200 0.130674 +v -0.522693 1.682400 0.130674 +v -0.522693 1.682400 0.130674 +v 0.522693 1.867200 0.130673 +v 0.522693 1.867200 0.130673 +v 0.261347 1.682400 0.392020 +v 0.392020 1.682400 0.261346 +v 0.000000 1.867200 0.392020 +v 0.000000 1.867200 0.392020 +v 0.000000 1.867200 0.392020 +v -0.130673 1.867200 0.522693 +v -0.130673 1.867200 0.522693 +v 0.522693 1.682400 0.130673 +v 0.522693 1.682400 0.130673 +v 0.392020 1.682400 -0.000000 +v 0.392020 1.682400 -0.000000 +v 0.392020 1.682400 -0.000000 +v 0.130674 1.867200 0.522693 +v 0.130674 1.867200 0.522693 +v 0.130674 1.682400 0.522693 +v 0.130674 1.682400 0.522693 +v -0.130673 1.682400 0.522693 +v -0.130673 1.682400 0.522693 +v 0.392020 1.867200 0.261346 +v -0.392020 1.867200 -0.261346 +v -0.522693 1.867200 -0.130673 +v -0.522693 1.867200 -0.130673 +v 0.522693 1.682400 -0.130674 +v 0.522693 1.682400 -0.130674 +v 0.000000 1.682400 0.392020 +v 0.000000 1.682400 0.392020 +v 0.000000 1.682400 0.392020 +v -0.000000 1.682400 -0.392020 +v -0.000000 1.682400 -0.392020 +v -0.000000 1.682400 -0.392020 +v 0.130673 1.682400 -0.522693 +v 0.130673 1.682400 -0.522693 +v 0.392020 1.682400 -0.261347 +v 0.261346 1.682400 -0.392020 +v -0.000000 1.867200 -0.392020 +v -0.000000 1.867200 -0.392020 +v 0.130673 1.867200 -0.522693 +v 0.130673 1.867200 -0.522693 +v -0.261347 1.867200 -0.392020 +v -0.522693 1.682400 -0.130673 +v -0.522693 1.682400 -0.130673 +v -0.261346 1.867200 0.392020 +v -0.392020 1.867200 0.261347 +v 0.261347 1.867200 0.392020 +v -0.392020 1.682400 0.261347 +v 0.261346 1.867200 -0.392020 +v -0.130674 1.867200 -0.522693 +v -0.130674 1.867200 -0.522693 +v -0.130674 1.682400 -0.522693 +v -0.130674 1.682400 -0.522693 +v 0.392020 1.867200 -0.261347 +v -0.261346 1.682400 0.392020 +v -0.092400 1.497600 -0.462000 +v 0.092400 1.497600 -0.462000 +v 0.277200 1.682400 0.277200 +v 0.277200 1.682400 0.277200 +v 0.277200 1.682400 0.277200 +v 0.462000 1.682400 0.277200 +v 0.462000 1.682400 0.277200 +v -0.277200 1.682400 -0.277200 +v -0.277200 1.682400 -0.277200 +v -0.277200 1.682400 -0.277200 +v -0.277200 1.497600 -0.277200 +v -0.277200 1.497600 -0.277200 +v -0.277200 1.497600 -0.277200 +v -0.462000 1.682400 -0.277200 +v -0.462000 1.682400 -0.277200 +v -0.462000 1.497600 -0.277200 +v -0.462000 1.497600 -0.277200 +v 0.277200 1.682400 0.462000 +v 0.277200 1.682400 0.462000 +v -0.092400 1.497600 0.462000 +v 0.092400 1.497600 0.462000 +v -0.277200 1.682400 0.277200 +v -0.277200 1.682400 0.277200 +v -0.277200 1.682400 0.277200 +v -0.462000 1.682400 0.277200 +v -0.462000 1.682400 0.277200 +v 0.277200 1.497600 0.462000 +v 0.277200 1.497600 0.462000 +v 0.277200 1.497600 0.277200 +v 0.277200 1.497600 0.277200 +v 0.277200 1.497600 0.277200 +v -0.277200 1.682400 0.462000 +v -0.277200 1.682400 0.462000 +v -0.277200 1.497600 0.462000 +v -0.277200 1.497600 0.462000 +v -0.462000 1.497600 0.277200 +v -0.462000 1.497600 0.277200 +v 0.092400 1.682400 0.462000 +v -0.092400 1.682400 -0.462000 +v -0.277200 1.682400 -0.462000 +v -0.277200 1.682400 -0.462000 +v 0.462000 1.497600 0.277200 +v 0.462000 1.497600 0.277200 +v -0.277200 1.497600 0.277200 +v -0.277200 1.497600 0.277200 +v -0.277200 1.497600 0.277200 +v 0.277200 1.497600 -0.277200 +v 0.277200 1.497600 -0.277200 +v 0.277200 1.497600 -0.277200 +v 0.462000 1.497600 -0.277200 +v 0.462000 1.497600 -0.277200 +v 0.462000 1.497600 0.092400 +v 0.462000 1.497600 -0.092400 +v 0.277200 1.682400 -0.277200 +v 0.277200 1.682400 -0.277200 +v 0.277200 1.682400 -0.277200 +v 0.462000 1.682400 -0.277200 +v 0.462000 1.682400 -0.277200 +v 0.092400 1.682400 -0.462000 +v -0.277200 1.497600 -0.462000 +v -0.277200 1.497600 -0.462000 +v -0.462000 1.682400 0.092400 +v -0.462000 1.682400 -0.092400 +v -0.092400 1.682400 0.462000 +v -0.462000 1.497600 -0.092400 +v 0.462000 1.682400 -0.092400 +v 0.277200 1.682400 -0.462000 +v 0.277200 1.682400 -0.462000 +v 0.277200 1.497600 -0.462000 +v 0.277200 1.497600 -0.462000 +v 0.462000 1.682400 0.092400 +v -0.462000 1.497600 0.092400 +v -0.261347 1.312800 -0.653367 +v -0.130674 1.312800 -0.784040 +v -0.130674 1.312800 -0.784040 +v 0.522693 1.312800 0.392020 +v 0.653367 1.312800 0.261346 +v -0.653367 1.312800 -0.261346 +v -0.784040 1.312800 -0.130673 +v -0.784040 1.312800 -0.130673 +v -0.392020 1.312800 0.522693 +v -0.522693 1.312800 0.392020 +v -0.653366 1.312800 0.261347 +v -0.000000 1.497600 -0.653367 +v -0.000000 1.497600 -0.653367 +v -0.130674 1.497600 -0.784040 +v -0.130674 1.497600 -0.784040 +v -0.784040 1.497600 0.130674 +v -0.784040 1.497600 0.130674 +v -0.784040 1.312800 0.130674 +v -0.784040 1.312800 0.130674 +v 0.653367 1.312800 -0.000000 +v 0.653367 1.312800 -0.000000 +v 0.653367 1.312800 -0.000000 +v 0.784040 1.312800 0.130673 +v 0.784040 1.312800 0.130673 +v -0.000000 1.312800 -0.653367 +v -0.000000 1.312800 -0.653367 +v -0.000000 1.312800 -0.653367 +v 0.261347 1.312800 0.653366 +v 0.392020 1.312800 0.522693 +v -0.130673 1.497600 0.784040 +v -0.130673 1.497600 0.784040 +v -0.130673 1.312800 0.784040 +v -0.130673 1.312800 0.784040 +v 0.653367 1.497600 -0.000000 +v 0.653367 1.497600 -0.000000 +v -0.653367 1.312800 0.000000 +v -0.653367 1.312800 0.000000 +v -0.653367 1.312800 0.000000 +v 0.000000 1.497600 0.653367 +v 0.000000 1.497600 0.653367 +v 0.130674 1.497600 0.784040 +v 0.130674 1.497600 0.784040 +v 0.000000 1.312800 0.653367 +v 0.000000 1.312800 0.653367 +v 0.000000 1.312800 0.653367 +v -0.261346 1.497600 0.653367 +v -0.392020 1.497600 0.522693 +v 0.392020 1.497600 -0.522693 +v 0.261346 1.497600 -0.653367 +v -0.522693 1.497600 0.392020 +v -0.653366 1.497600 0.261347 +v -0.261346 1.312800 0.653367 +v -0.392020 1.497600 -0.522693 +v -0.261347 1.497600 -0.653367 +v 0.784040 1.497600 -0.130674 +v 0.784040 1.497600 -0.130674 +v 0.784040 1.312800 -0.130674 +v 0.784040 1.312800 -0.130674 +v -0.653367 1.497600 -0.261346 +v -0.784040 1.497600 -0.130673 +v -0.784040 1.497600 -0.130673 +v 0.653367 1.497600 0.261346 +v 0.784040 1.497600 0.130673 +v 0.784040 1.497600 0.130673 +v 0.522693 1.497600 -0.392020 +v 0.261346 1.312800 -0.653367 +v 0.130673 1.312800 -0.784040 +v 0.130673 1.312800 -0.784040 +v 0.522693 1.497600 0.392020 +v -0.653367 1.497600 0.000000 +v -0.653367 1.497600 0.000000 +v 0.130673 1.497600 -0.784040 +v 0.130673 1.497600 -0.784040 +v -0.522693 1.312800 -0.392020 +v -0.392020 1.312800 -0.522693 +v 0.653366 1.497600 -0.261347 +v 0.130674 1.312800 0.784040 +v 0.130674 1.312800 0.784040 +v -0.522693 1.497600 -0.392020 +v 0.653366 1.312800 -0.261347 +v 0.522693 1.312800 -0.392020 +v 0.392020 1.497600 0.522693 +v 0.261347 1.497600 0.653366 +v 0.392020 1.312800 -0.522693 +v -0.646800 1.128000 -0.277200 +v -0.646800 1.128000 -0.462000 +v -0.646800 1.128000 -0.462000 +v 0.646800 1.128000 -0.092400 +v 0.646800 1.128000 -0.277200 +v -0.646800 1.128000 0.277200 +v -0.646800 1.128000 0.462000 +v -0.646800 1.128000 0.462000 +v 0.092400 1.128000 0.646800 +v -0.092400 1.128000 0.646800 +v -0.277200 1.128000 0.646800 +v -0.462000 1.312800 -0.462000 +v -0.462000 1.312800 -0.462000 +v -0.462000 1.312800 -0.462000 +v -0.646800 1.312800 -0.462000 +v -0.646800 1.312800 -0.462000 +v -0.462000 1.312800 0.646800 +v -0.462000 1.312800 0.646800 +v -0.462000 1.128000 0.646800 +v -0.462000 1.128000 0.646800 +v 0.462000 1.128000 -0.462000 +v 0.462000 1.128000 -0.462000 +v 0.462000 1.128000 -0.462000 +v 0.646800 1.128000 -0.462000 +v 0.646800 1.128000 -0.462000 +v -0.462000 1.128000 -0.462000 +v -0.462000 1.128000 -0.462000 +v -0.462000 1.128000 -0.462000 +v 0.646800 1.128000 0.277200 +v 0.646800 1.128000 0.092400 +v 0.462000 1.312800 0.646800 +v 0.462000 1.312800 0.646800 +v 0.462000 1.128000 0.646800 +v 0.462000 1.128000 0.646800 +v 0.462000 1.312800 -0.462000 +v 0.462000 1.312800 -0.462000 +v 0.462000 1.312800 -0.462000 +v -0.462000 1.128000 0.462000 +v -0.462000 1.128000 0.462000 +v -0.462000 1.128000 0.462000 +v 0.462000 1.312800 0.462000 +v 0.462000 1.312800 0.462000 +v 0.462000 1.312800 0.462000 +v 0.646800 1.312800 0.462000 +v 0.646800 1.312800 0.462000 +v 0.462000 1.128000 0.462000 +v 0.462000 1.128000 0.462000 +v 0.462000 1.128000 0.462000 +v 0.277200 1.312800 0.646800 +v 0.092400 1.312800 0.646800 +v -0.092400 1.312800 -0.646800 +v -0.277200 1.312800 -0.646800 +v -0.092400 1.312800 0.646800 +v -0.277200 1.312800 0.646800 +v 0.277200 1.128000 0.646800 +v -0.646800 1.312800 -0.092400 +v -0.646800 1.312800 -0.277200 +v 0.462000 1.312800 -0.646800 +v 0.462000 1.312800 -0.646800 +v 0.462000 1.128000 -0.646800 +v 0.462000 1.128000 -0.646800 +v -0.646800 1.312800 0.277200 +v -0.646800 1.312800 0.462000 +v -0.646800 1.312800 0.462000 +v 0.646800 1.312800 -0.277200 +v 0.646800 1.312800 -0.462000 +v 0.646800 1.312800 -0.462000 +v 0.092400 1.312800 -0.646800 +v -0.277200 1.128000 -0.646800 +v -0.462000 1.128000 -0.646800 +v -0.462000 1.128000 -0.646800 +v 0.646800 1.312800 -0.092400 +v -0.462000 1.312800 0.462000 +v -0.462000 1.312800 0.462000 +v -0.462000 1.312800 0.462000 +v -0.462000 1.312800 -0.646800 +v -0.462000 1.312800 -0.646800 +v -0.646800 1.128000 0.092400 +v -0.646800 1.128000 -0.092400 +v 0.277200 1.312800 -0.646800 +v 0.646800 1.128000 0.462000 +v 0.646800 1.128000 0.462000 +v -0.646800 1.312800 0.092400 +v 0.277200 1.128000 -0.646800 +v 0.092400 1.128000 -0.646800 +v 0.646800 1.312800 0.092400 +v 0.646800 1.312800 0.277200 +v -0.092400 1.128000 -0.646800 +v -0.261347 0.943200 -0.653366 +v -0.130674 0.943200 -0.784040 +v -0.130674 0.943200 -0.784040 +v 0.522693 0.943200 0.392020 +v 0.653367 0.943200 0.261346 +v -0.653367 0.943200 -0.261346 +v -0.784040 0.943200 -0.130673 +v -0.784040 0.943200 -0.130673 +v -0.392020 0.943200 0.522693 +v -0.522693 0.943200 0.392020 +v -0.653366 0.943200 0.261347 +v -0.000000 1.128000 -0.653367 +v -0.000000 1.128000 -0.653367 +v -0.000000 1.128000 -0.653367 +v -0.130674 1.128000 -0.784040 +v -0.130674 1.128000 -0.784040 +v -0.784040 1.128000 0.130674 +v -0.784040 1.128000 0.130674 +v -0.784040 0.943200 0.130674 +v -0.784040 0.943200 0.130674 +v 0.653367 0.943200 -0.000000 +v 0.653367 0.943200 -0.000000 +v 0.653367 0.943200 -0.000000 +v 0.784040 0.943200 0.130673 +v 0.784040 0.943200 0.130673 +v -0.000000 0.943200 -0.653367 +v -0.000000 0.943200 -0.653367 +v -0.000000 0.943200 -0.653367 +v 0.261347 0.943200 0.653367 +v 0.392020 0.943200 0.522693 +v -0.130673 1.128000 0.784040 +v -0.130673 1.128000 0.784040 +v -0.130673 0.943200 0.784040 +v -0.130673 0.943200 0.784040 +v 0.653367 1.128000 -0.000000 +v 0.653367 1.128000 -0.000000 +v 0.653367 1.128000 -0.000000 +v -0.653367 0.943200 0.000000 +v -0.653367 0.943200 0.000000 +v -0.653367 0.943200 0.000000 +v 0.000000 1.128000 0.653367 +v 0.000000 1.128000 0.653367 +v 0.000000 1.128000 0.653367 +v 0.130674 1.128000 0.784040 +v 0.130674 1.128000 0.784040 +v 0.000000 0.943200 0.653367 +v 0.000000 0.943200 0.653367 +v 0.000000 0.943200 0.653367 +v -0.261346 1.128000 0.653367 +v -0.392020 1.128000 0.522693 +v 0.392020 1.128000 -0.522693 +v 0.261346 1.128000 -0.653367 +v -0.522693 1.128000 0.392020 +v -0.653366 1.128000 0.261347 +v -0.261346 0.943200 0.653367 +v -0.392020 1.128000 -0.522693 +v -0.261347 1.128000 -0.653366 +v 0.784040 1.128000 -0.130674 +v 0.784040 1.128000 -0.130674 +v 0.784040 0.943200 -0.130674 +v 0.784040 0.943200 -0.130674 +v -0.653367 1.128000 -0.261346 +v -0.784040 1.128000 -0.130673 +v -0.784040 1.128000 -0.130673 +v 0.653367 1.128000 0.261346 +v 0.784040 1.128000 0.130673 +v 0.784040 1.128000 0.130673 +v 0.522693 1.128000 -0.392020 +v 0.261346 0.943200 -0.653367 +v 0.130673 0.943200 -0.784040 +v 0.130673 0.943200 -0.784040 +v 0.522693 1.128000 0.392020 +v -0.653367 1.128000 0.000000 +v -0.653367 1.128000 0.000000 +v -0.653367 1.128000 0.000000 +v 0.130673 1.128000 -0.784040 +v 0.130673 1.128000 -0.784040 +v -0.522693 0.943200 -0.392020 +v -0.392020 0.943200 -0.522693 +v 0.653366 1.128000 -0.261347 +v 0.130674 0.943200 0.784040 +v 0.130674 0.943200 0.784040 +v -0.522693 1.128000 -0.392020 +v 0.653366 0.943200 -0.261347 +v 0.522693 0.943200 -0.392020 +v 0.392020 1.128000 0.522693 +v 0.261347 1.128000 0.653367 +v 0.392020 0.943200 -0.522693 +v -0.092400 0.943200 -0.831600 +v 0.092400 0.943200 -0.831600 +v -0.646800 0.943200 -0.462000 +v -0.646800 0.943200 -0.462000 +v -0.831600 0.943200 -0.462000 +v -0.831600 0.943200 -0.462000 +v 0.092400 0.758400 0.831600 +v 0.277200 0.758400 0.831600 +v 0.646800 0.943200 -0.646800 +v 0.646800 0.943200 -0.646800 +v 0.646800 0.758400 -0.646800 +v 0.646800 0.758400 -0.646800 +v -0.462000 0.943200 -0.831600 +v -0.462000 0.943200 -0.831600 +v -0.462000 0.758400 -0.831600 +v -0.462000 0.758400 -0.831600 +v 0.831600 0.758400 -0.092400 +v 0.831600 0.758400 -0.277200 +v 0.831600 0.758400 0.277200 +v 0.831600 0.758400 0.462000 +v 0.831600 0.758400 0.462000 +v 0.831600 0.943200 0.462000 +v 0.831600 0.943200 0.462000 +v 0.831600 0.943200 0.277200 +v -0.462000 0.943200 0.646800 +v -0.462000 0.943200 0.646800 +v -0.462000 0.943200 0.831600 +v -0.462000 0.943200 0.831600 +v 0.462000 0.943200 -0.646800 +v 0.462000 0.943200 -0.646800 +v 0.462000 0.758400 -0.646800 +v 0.462000 0.758400 -0.646800 +v 0.462000 0.758400 -0.646800 +v -0.831600 0.758400 -0.277200 +v -0.831600 0.758400 -0.462000 +v -0.831600 0.758400 -0.462000 +v 0.277200 0.943200 -0.831600 +v 0.462000 0.943200 -0.831600 +v 0.462000 0.943200 -0.831600 +v 0.277200 0.943200 0.831600 +v 0.462000 0.943200 0.831600 +v 0.462000 0.943200 0.831600 +v -0.646800 0.758400 -0.462000 +v -0.646800 0.758400 -0.462000 +v -0.646800 0.758400 -0.462000 +v 0.092400 0.943200 0.831600 +v 0.646800 0.943200 0.462000 +v 0.646800 0.943200 0.462000 +v 0.646800 0.758400 0.462000 +v 0.646800 0.758400 0.462000 +v 0.646800 0.758400 0.462000 +v 0.646800 0.943200 0.646800 +v 0.646800 0.943200 0.646800 +v 0.646800 0.758400 0.646800 +v 0.646800 0.758400 0.646800 +v 0.462000 0.758400 0.831600 +v 0.462000 0.758400 0.831600 +v -0.277200 0.758400 -0.831600 +v -0.092400 0.758400 -0.831600 +v -0.462000 0.758400 0.831600 +v -0.462000 0.758400 0.831600 +v -0.462000 0.758400 0.646800 +v -0.462000 0.758400 0.646800 +v -0.462000 0.758400 0.646800 +v -0.831600 0.943200 0.092400 +v -0.831600 0.943200 -0.092400 +v 0.831600 0.943200 -0.092400 +v 0.831600 0.943200 -0.277200 +v -0.831600 0.943200 0.277200 +v -0.831600 0.943200 0.462000 +v -0.831600 0.943200 0.462000 +v -0.646800 0.943200 0.462000 +v -0.646800 0.943200 0.462000 +v -0.646800 0.758400 0.462000 +v -0.646800 0.758400 0.462000 +v -0.646800 0.758400 0.462000 +v -0.092400 0.943200 0.831600 +v 0.646800 0.943200 -0.462000 +v 0.646800 0.943200 -0.462000 +v 0.831600 0.943200 -0.462000 +v 0.831600 0.943200 -0.462000 +v 0.277200 0.758400 -0.831600 +v 0.462000 0.758400 -0.831600 +v 0.462000 0.758400 -0.831600 +v -0.277200 0.943200 0.831600 +v -0.646800 0.943200 0.646800 +v -0.646800 0.943200 0.646800 +v 0.462000 0.758400 0.646800 +v 0.462000 0.758400 0.646800 +v 0.462000 0.758400 0.646800 +v -0.462000 0.943200 -0.646800 +v -0.462000 0.943200 -0.646800 +v -0.646800 0.758400 0.646800 +v -0.646800 0.758400 0.646800 +v -0.277200 0.758400 0.831600 +v 0.646800 0.758400 -0.462000 +v 0.646800 0.758400 -0.462000 +v 0.646800 0.758400 -0.462000 +v -0.092400 0.758400 0.831600 +v -0.646800 0.943200 -0.646800 +v -0.646800 0.943200 -0.646800 +v -0.646800 0.758400 -0.646800 +v -0.646800 0.758400 -0.646800 +v 0.462000 0.943200 0.646800 +v 0.462000 0.943200 0.646800 +v 0.831600 0.758400 0.092400 +v 0.831600 0.943200 0.092400 +v -0.462000 0.758400 -0.646800 +v -0.462000 0.758400 -0.646800 +v -0.462000 0.758400 -0.646800 +v 0.831600 0.758400 -0.462000 +v 0.831600 0.758400 -0.462000 +v -0.277200 0.943200 -0.831600 +v -0.831600 0.758400 -0.092400 +v -0.831600 0.758400 0.462000 +v -0.831600 0.758400 0.462000 +v -0.831600 0.943200 -0.277200 +v -0.831600 0.758400 0.277200 +v -0.831600 0.758400 0.092400 +v 0.092400 0.758400 -0.831600 +v 0.522694 0.758400 -0.653366 +v 0.653367 0.758400 -0.522693 +v -0.130673 0.758400 -0.784040 +v -0.130673 0.758400 -0.784040 +v -0.130673 0.758400 -0.784040 +v -0.261346 0.758400 -0.914713 +v -0.261346 0.758400 -0.914713 +v -0.522694 0.573600 0.653366 +v -0.392020 0.573600 0.784040 +v 0.914713 0.758400 0.000000 +v 0.914713 0.758400 0.000000 +v 0.914713 0.573600 0.000000 +v 0.914713 0.573600 0.000000 +v 0.261347 0.758400 -0.914713 +v 0.261347 0.758400 -0.914713 +v 0.261347 0.573600 -0.914713 +v 0.261347 0.573600 -0.914713 +v 0.653366 0.573600 0.522694 +v 0.784040 0.573600 0.392020 +v 0.392020 0.573600 0.784040 +v 0.261346 0.573600 0.914713 +v 0.261346 0.573600 0.914713 +v 0.261346 0.758400 0.914713 +v 0.261346 0.758400 0.914713 +v 0.392020 0.758400 0.784040 +v -0.784040 0.758400 0.130673 +v -0.784040 0.758400 0.130673 +v -0.784040 0.758400 0.130673 +v -0.914713 0.758400 0.261346 +v -0.914713 0.758400 0.261346 +v 0.784040 0.758400 -0.130673 +v 0.784040 0.758400 -0.130673 +v 0.784040 0.758400 -0.130673 +v 0.784040 0.573600 -0.130673 +v 0.784040 0.573600 -0.130673 +v 0.784040 0.573600 -0.130673 +v -0.392020 0.573600 -0.784040 +v -0.261346 0.573600 -0.914713 +v -0.261346 0.573600 -0.914713 +v 0.784040 0.758400 -0.392020 +v 0.914713 0.758400 -0.261346 +v 0.914713 0.758400 -0.261346 +v -0.392020 0.758400 0.784040 +v -0.261347 0.758400 0.914713 +v -0.261347 0.758400 0.914713 +v -0.130673 0.573600 -0.784040 +v -0.130673 0.573600 -0.784040 +v -0.130673 0.573600 -0.784040 +v -0.522694 0.758400 0.653366 +v 0.130673 0.758400 0.784040 +v 0.130673 0.758400 0.784040 +v 0.130673 0.758400 0.784040 +v 0.130673 0.573600 0.784040 +v 0.130673 0.573600 0.784040 +v 0.130673 0.573600 0.784040 +v -0.000000 0.758400 0.914713 +v -0.000000 0.758400 0.914713 +v -0.000000 0.573600 0.914713 +v -0.000000 0.573600 0.914713 +v -0.261347 0.573600 0.914713 +v -0.261347 0.573600 0.914713 +v 0.392020 0.573600 -0.784040 +v 0.522694 0.573600 -0.653366 +v -0.914713 0.573600 0.261346 +v -0.914713 0.573600 0.261346 +v -0.784040 0.573600 0.130673 +v -0.784040 0.573600 0.130673 +v -0.784040 0.573600 0.130673 +v -0.653366 0.758400 -0.522694 +v -0.522693 0.758400 -0.653367 +v 0.653366 0.758400 0.522694 +v 0.784040 0.758400 0.392020 +v -0.784040 0.758400 -0.392020 +v -0.914713 0.758400 -0.261347 +v -0.914713 0.758400 -0.261347 +v -0.784040 0.758400 -0.130674 +v -0.784040 0.758400 -0.130674 +v -0.784040 0.758400 -0.130674 +v -0.784040 0.573600 -0.130674 +v -0.784040 0.573600 -0.130674 +v -0.784040 0.573600 -0.130674 +v -0.653367 0.758400 0.522693 +v 0.784040 0.758400 0.130674 +v 0.784040 0.758400 0.130674 +v 0.784040 0.758400 0.130674 +v 0.914713 0.758400 0.261347 +v 0.914713 0.758400 0.261347 +v 0.784040 0.573600 -0.392020 +v 0.914713 0.573600 -0.261346 +v 0.914713 0.573600 -0.261346 +v -0.784040 0.758400 0.392020 +v -0.914713 0.758400 -0.000000 +v -0.914713 0.758400 -0.000000 +v -0.130674 0.573600 0.784040 +v -0.130674 0.573600 0.784040 +v -0.130674 0.573600 0.784040 +v 0.130674 0.758400 -0.784040 +v 0.130674 0.758400 -0.784040 +v 0.130674 0.758400 -0.784040 +v -0.914713 0.573600 -0.000000 +v -0.914713 0.573600 -0.000000 +v -0.784040 0.573600 0.392020 +v 0.784040 0.573600 0.130674 +v 0.784040 0.573600 0.130674 +v 0.784040 0.573600 0.130674 +v -0.653367 0.573600 0.522693 +v 0.000000 0.758400 -0.914713 +v 0.000000 0.758400 -0.914713 +v 0.000000 0.573600 -0.914713 +v 0.000000 0.573600 -0.914713 +v -0.130674 0.758400 0.784040 +v -0.130674 0.758400 0.784040 +v -0.130674 0.758400 0.784040 +v 0.522693 0.573600 0.653367 +v 0.522693 0.758400 0.653367 +v 0.130674 0.573600 -0.784040 +v 0.130674 0.573600 -0.784040 +v 0.130674 0.573600 -0.784040 +v 0.914713 0.573600 0.261347 +v 0.914713 0.573600 0.261347 +v 0.392020 0.758400 -0.784040 +v -0.522693 0.573600 -0.653367 +v -0.914713 0.573600 -0.261347 +v -0.914713 0.573600 -0.261347 +v -0.392020 0.758400 -0.784040 +v -0.784040 0.573600 -0.392020 +v -0.653366 0.573600 -0.522694 +v 0.653367 0.573600 -0.522693 +v -0.092400 0.573600 -0.831600 +v 0.092400 0.573600 -0.831600 +v -0.646800 0.573600 -0.462000 +v -0.646800 0.573600 -0.462000 +v -0.646800 0.573600 -0.462000 +v -0.831600 0.573600 -0.462000 +v -0.831600 0.573600 -0.462000 +v 0.092400 0.388800 0.831600 +v 0.277200 0.388800 0.831600 +v 0.646800 0.573600 -0.646800 +v 0.646800 0.573600 -0.646800 +v 0.646800 0.388800 -0.646800 +v 0.646800 0.388800 -0.646800 +v -0.462000 0.573600 -0.831600 +v -0.462000 0.573600 -0.831600 +v -0.462000 0.388800 -0.831600 +v -0.462000 0.388800 -0.831600 +v 0.831600 0.388800 -0.092400 +v 0.831600 0.388800 -0.277200 +v 0.831600 0.388800 0.277200 +v 0.831600 0.388800 0.462000 +v 0.831600 0.388800 0.462000 +v 0.831600 0.573600 0.462000 +v 0.831600 0.573600 0.462000 +v 0.831600 0.573600 0.277200 +v -0.462000 0.573600 0.646800 +v -0.462000 0.573600 0.646800 +v -0.462000 0.573600 0.646800 +v -0.462000 0.573600 0.831600 +v -0.462000 0.573600 0.831600 +v 0.462000 0.573600 -0.646800 +v 0.462000 0.573600 -0.646800 +v 0.462000 0.573600 -0.646800 +v 0.462000 0.388800 -0.646800 +v 0.462000 0.388800 -0.646800 +v 0.462000 0.388800 -0.646800 +v -0.831600 0.388800 -0.277200 +v -0.831600 0.388800 -0.462000 +v -0.831600 0.388800 -0.462000 +v 0.277200 0.573600 -0.831600 +v 0.462000 0.573600 -0.831600 +v 0.462000 0.573600 -0.831600 +v 0.277200 0.573600 0.831600 +v 0.462000 0.573600 0.831600 +v 0.462000 0.573600 0.831600 +v -0.646800 0.388800 -0.462000 +v -0.646800 0.388800 -0.462000 +v -0.646800 0.388800 -0.462000 +v 0.092400 0.573600 0.831600 +v 0.646800 0.573600 0.462000 +v 0.646800 0.573600 0.462000 +v 0.646800 0.573600 0.462000 +v 0.646800 0.388800 0.462000 +v 0.646800 0.388800 0.462000 +v 0.646800 0.388800 0.462000 +v 0.646800 0.573600 0.646800 +v 0.646800 0.573600 0.646800 +v 0.646800 0.388800 0.646800 +v 0.646800 0.388800 0.646800 +v 0.462000 0.388800 0.831600 +v 0.462000 0.388800 0.831600 +v -0.277200 0.388800 -0.831600 +v -0.092400 0.388800 -0.831600 +v -0.462000 0.388800 0.831600 +v -0.462000 0.388800 0.831600 +v -0.462000 0.388800 0.646800 +v -0.462000 0.388800 0.646800 +v -0.462000 0.388800 0.646800 +v -0.831600 0.573600 0.092400 +v -0.831600 0.573600 -0.092400 +v 0.831600 0.573600 -0.092400 +v 0.831600 0.573600 -0.277200 +v -0.831600 0.573600 0.277200 +v -0.831600 0.573600 0.462000 +v -0.831600 0.573600 0.462000 +v -0.646800 0.573600 0.462000 +v -0.646800 0.573600 0.462000 +v -0.646800 0.573600 0.462000 +v -0.646800 0.388800 0.462000 +v -0.646800 0.388800 0.462000 +v -0.646800 0.388800 0.462000 +v -0.092400 0.573600 0.831600 +v 0.646800 0.573600 -0.462000 +v 0.646800 0.573600 -0.462000 +v 0.646800 0.573600 -0.462000 +v 0.831600 0.573600 -0.462000 +v 0.831600 0.573600 -0.462000 +v 0.277200 0.388800 -0.831600 +v 0.462000 0.388800 -0.831600 +v 0.462000 0.388800 -0.831600 +v -0.277200 0.573600 0.831600 +v -0.646800 0.573600 0.646800 +v -0.646800 0.573600 0.646800 +v 0.462000 0.388800 0.646800 +v 0.462000 0.388800 0.646800 +v 0.462000 0.388800 0.646800 +v -0.462000 0.573600 -0.646800 +v -0.462000 0.573600 -0.646800 +v -0.462000 0.573600 -0.646800 +v -0.646800 0.388800 0.646800 +v -0.646800 0.388800 0.646800 +v -0.277200 0.388800 0.831600 +v 0.646800 0.388800 -0.462000 +v 0.646800 0.388800 -0.462000 +v 0.646800 0.388800 -0.462000 +v -0.092400 0.388800 0.831600 +v -0.646800 0.573600 -0.646800 +v -0.646800 0.573600 -0.646800 +v -0.646800 0.388800 -0.646800 +v -0.646800 0.388800 -0.646800 +v 0.462000 0.573600 0.646800 +v 0.462000 0.573600 0.646800 +v 0.462000 0.573600 0.646800 +v 0.831600 0.388800 0.092400 +v 0.831600 0.573600 0.092400 +v -0.462000 0.388800 -0.646800 +v -0.462000 0.388800 -0.646800 +v -0.462000 0.388800 -0.646800 +v 0.831600 0.388800 -0.462000 +v 0.831600 0.388800 -0.462000 +v -0.277200 0.573600 -0.831600 +v -0.831600 0.388800 -0.092400 +v -0.831600 0.388800 0.462000 +v -0.831600 0.388800 0.462000 +v -0.831600 0.573600 -0.277200 +v -0.831600 0.388800 0.277200 +v -0.831600 0.388800 0.092400 +v 0.092400 0.388800 -0.831600 +v 0.646833 0.204924 0.776199 +v 0.776200 0.204924 0.646833 +v -0.258733 0.204924 1.164299 +v -0.258733 0.204924 1.164299 +v -0.388099 0.204924 1.034933 +v -1.034933 0.387876 -0.129366 +v -1.034933 0.387876 -0.129366 +v -1.164299 0.387876 0.000000 +v -1.164299 0.387876 0.000000 +v -1.164299 0.387876 0.258734 +v -1.164299 0.387876 0.258734 +v -1.164299 0.204924 0.258734 +v -1.164299 0.204924 0.258734 +v 0.129367 0.387876 1.034933 +v 0.129367 0.387876 1.034933 +v 0.258734 0.387876 1.164299 +v 0.258734 0.387876 1.164299 +v 0.258733 0.387876 -1.164299 +v 0.258733 0.387876 -1.164299 +v 0.258733 0.204924 -1.164299 +v 0.258733 0.204924 -1.164299 +v 0.776200 0.387876 0.646833 +v 0.905566 0.387876 0.517466 +v -1.164299 0.204924 0.000000 +v -1.164299 0.204924 0.000000 +v 1.034933 0.387876 0.129366 +v 1.034933 0.387876 0.129366 +v 1.164299 0.387876 -0.000000 +v 1.164299 0.387876 -0.000000 +v 1.164299 0.387876 -0.258734 +v 1.164299 0.387876 -0.258734 +v 1.164299 0.204924 -0.258734 +v 1.164299 0.204924 -0.258734 +v 0.129366 0.387876 -1.034933 +v 0.129366 0.387876 -1.034933 +v 0.129366 0.204924 -1.034933 +v 0.129366 0.204924 -1.034933 +v 0.129366 0.204924 -1.034933 +v 0.646833 0.387876 0.776199 +v 0.646833 0.204924 -0.776200 +v 0.517466 0.204924 -0.905566 +v 0.905566 0.204924 0.517466 +v 1.034933 0.204924 -0.129367 +v 1.034933 0.204924 -0.129367 +v 1.034933 0.204924 -0.129367 +v -0.517466 0.204924 0.905566 +v -0.646833 0.204924 0.776200 +v 1.034933 0.204924 0.129366 +v 1.034933 0.204924 0.129366 +v 1.034933 0.204924 0.129366 +v 1.164299 0.204924 -0.000000 +v 1.164299 0.204924 -0.000000 +v 0.258734 0.204924 1.164299 +v 0.258734 0.204924 1.164299 +v 0.129367 0.204924 1.034933 +v 0.129367 0.204924 1.034933 +v 0.129367 0.204924 1.034933 +v 0.000000 0.387876 1.164299 +v 0.000000 0.387876 1.164299 +v -1.034933 0.387876 -0.388099 +v -0.905566 0.387876 -0.517466 +v 0.517467 0.387876 0.905566 +v -1.034933 0.204924 0.129367 +v -1.034933 0.204924 0.129367 +v -1.034933 0.204924 0.129367 +v 1.034933 0.204924 -0.388100 +v 1.034933 0.387876 -0.129367 +v 1.034933 0.387876 -0.129367 +v 0.388100 0.387876 1.034933 +v -1.034933 0.204924 -0.129366 +v -1.034933 0.204924 -0.129366 +v -1.034933 0.204924 -0.129366 +v -1.164299 0.204924 -0.258733 +v -1.164299 0.204924 -0.258733 +v 0.388100 0.204924 1.034933 +v 0.517467 0.204924 0.905566 +v -0.646833 0.387876 0.776200 +v -0.776199 0.387876 0.646833 +v 1.034933 0.387876 -0.388100 +v 0.905566 0.387876 -0.517467 +v -1.164299 0.387876 -0.258733 +v -1.164299 0.387876 -0.258733 +v 0.905566 0.204924 -0.517467 +v -0.000000 0.204924 -1.164299 +v -0.000000 0.204924 -1.164299 +v -1.034933 0.387876 0.129367 +v -1.034933 0.387876 0.129367 +v -0.776199 0.204924 0.646833 +v -0.776200 0.387876 -0.646833 +v -0.646833 0.387876 -0.776199 +v 1.034933 0.204924 0.388099 +v -0.776200 0.204924 -0.646833 +v -0.646833 0.204924 -0.776199 +v 1.034933 0.387876 0.388099 +v 1.164299 0.387876 0.258733 +v 1.164299 0.387876 0.258733 +v -0.000000 0.387876 -1.164299 +v -0.000000 0.387876 -1.164299 +v -0.388099 0.387876 1.034933 +v -0.517466 0.387876 0.905566 +v -0.129366 0.204924 1.034933 +v -0.129366 0.204924 1.034933 +v -0.129366 0.204924 1.034933 +v -1.034933 0.204924 0.388100 +v 0.646833 0.387876 -0.776200 +v 0.517466 0.387876 -0.905566 +v 0.000000 0.204924 1.164299 +v 0.000000 0.204924 1.164299 +v 0.776199 0.204924 -0.646833 +v 0.776199 0.387876 -0.646833 +v -0.129366 0.387876 1.034933 +v -0.129366 0.387876 1.034933 +v -0.905566 0.387876 0.517467 +v -0.388100 0.204924 -1.034933 +v -0.258734 0.204924 -1.164299 +v -0.258734 0.204924 -1.164299 +v -0.388100 0.387876 -1.034933 +v -0.258734 0.387876 -1.164299 +v -0.258734 0.387876 -1.164299 +v -1.034933 0.387876 0.388100 +v 1.164299 0.204924 0.258733 +v 1.164299 0.204924 0.258733 +v -0.517467 0.387876 -0.905566 +v -0.258733 0.387876 1.164299 +v -0.258733 0.387876 1.164299 +v 0.388099 0.387876 -1.034933 +v -0.905566 0.204924 -0.517466 +v 0.388099 0.204924 -1.034933 +v -1.034933 0.204924 -0.388099 +v -0.517467 0.204924 -0.905566 +v -0.129367 0.204924 -1.034933 +v -0.129367 0.204924 -1.034933 +v -0.129367 0.204924 -1.034933 +v -0.129367 0.387876 -1.034933 +v -0.129367 0.387876 -1.034933 +v -0.905566 0.204924 0.517467 +v -0.092400 0.019200 1.016400 +v 0.092400 0.019200 1.016400 +v -1.016400 0.019200 0.646800 +v -1.016400 0.019200 0.646800 +v -1.016400 0.019200 0.462000 +v -0.646800 0.204000 -0.831600 +v -0.646800 0.204000 -0.831600 +v -0.831600 0.204000 -0.831600 +v -0.831600 0.204000 -0.831600 +v -1.016400 0.204000 -0.646800 +v -1.016400 0.204000 -0.646800 +v -1.016400 0.019200 -0.646800 +v -1.016400 0.019200 -0.646800 +v -0.646800 0.204000 0.831600 +v -0.646800 0.204000 0.831600 +v -0.646800 0.204000 1.016400 +v -0.646800 0.204000 1.016400 +v 1.016400 0.204000 -0.646800 +v 1.016400 0.204000 -0.646800 +v 1.016400 0.019200 -0.646800 +v 1.016400 0.019200 -0.646800 +v 0.092400 0.204000 1.016400 +v 0.277200 0.204000 1.016400 +v -0.831600 0.019200 -0.831600 +v -0.831600 0.019200 -0.831600 +v 0.646800 0.204000 0.831600 +v 0.646800 0.204000 0.831600 +v 0.831600 0.204000 0.831600 +v 0.831600 0.204000 0.831600 +v 1.016400 0.204000 0.646800 +v 1.016400 0.204000 0.646800 +v 1.016400 0.019200 0.646800 +v 1.016400 0.019200 0.646800 +v 0.831600 0.204000 -0.646800 +v 0.831600 0.204000 -0.646800 +v 0.831600 0.204000 -0.646800 +v 0.831600 0.019200 -0.646800 +v 0.831600 0.019200 -0.646800 +v 0.831600 0.019200 -0.646800 +v -0.092400 0.204000 1.016400 +v 1.016400 0.019200 -0.092400 +v 1.016400 0.019200 -0.277200 +v 0.277200 0.019200 1.016400 +v 0.831600 0.019200 0.646800 +v 0.831600 0.019200 0.646800 +v 0.831600 0.019200 0.646800 +v -1.016400 0.019200 0.277200 +v -1.016400 0.019200 0.092400 +v 0.646800 0.019200 0.831600 +v 0.646800 0.019200 0.831600 +v 0.646800 0.019200 0.831600 +v 0.831600 0.019200 0.831600 +v 0.831600 0.019200 0.831600 +v -0.646800 0.019200 1.016400 +v -0.646800 0.019200 1.016400 +v -0.646800 0.019200 0.831600 +v -0.646800 0.019200 0.831600 +v -0.646800 0.019200 0.831600 +v -0.831600 0.204000 0.831600 +v -0.831600 0.204000 0.831600 +v -0.462000 0.204000 -1.016400 +v -0.277200 0.204000 -1.016400 +v -0.277200 0.204000 1.016400 +v -0.831600 0.019200 -0.646800 +v -0.831600 0.019200 -0.646800 +v -0.831600 0.019200 -0.646800 +v 1.016400 0.019200 0.462000 +v 0.831600 0.204000 0.646800 +v 0.831600 0.204000 0.646800 +v -0.462000 0.204000 1.016400 +v -0.646800 0.019200 -0.831600 +v -0.646800 0.019200 -0.831600 +v -0.646800 0.019200 -0.831600 +v -0.646800 0.019200 -1.016400 +v -0.646800 0.019200 -1.016400 +v -0.462000 0.019200 1.016400 +v -0.277200 0.019200 1.016400 +v -1.016400 0.204000 0.092400 +v -1.016400 0.204000 -0.092400 +v 1.016400 0.204000 0.462000 +v 1.016400 0.204000 0.277200 +v -0.646800 0.204000 -1.016400 +v -0.646800 0.204000 -1.016400 +v 1.016400 0.019200 0.277200 +v 0.831600 0.019200 -0.831600 +v 0.831600 0.019200 -0.831600 +v -0.831600 0.204000 -0.646800 +v -0.831600 0.204000 -0.646800 +v -1.016400 0.019200 -0.092400 +v -0.092400 0.204000 -1.016400 +v 0.092400 0.204000 -1.016400 +v 0.462000 0.019200 1.016400 +v -0.092400 0.019200 -1.016400 +v 0.092400 0.019200 -1.016400 +v 0.462000 0.204000 1.016400 +v 0.646800 0.204000 1.016400 +v 0.646800 0.204000 1.016400 +v 0.831600 0.204000 -0.831600 +v 0.831600 0.204000 -0.831600 +v -1.016400 0.204000 0.462000 +v -1.016400 0.204000 0.277200 +v -0.831600 0.019200 0.646800 +v -0.831600 0.019200 0.646800 +v -0.831600 0.019200 0.646800 +v -1.016400 0.019200 -0.462000 +v 1.016400 0.204000 -0.092400 +v 1.016400 0.204000 -0.277200 +v -0.831600 0.019200 0.831600 +v -0.831600 0.019200 0.831600 +v 1.016400 0.019200 0.092400 +v 1.016400 0.204000 0.092400 +v -0.831600 0.204000 0.646800 +v -0.831600 0.204000 0.646800 +v -1.016400 0.204000 -0.277200 +v 0.462000 0.019200 -1.016400 +v 0.646800 0.019200 -1.016400 +v 0.646800 0.019200 -1.016400 +v 0.462000 0.204000 -1.016400 +v 0.646800 0.204000 -1.016400 +v 0.646800 0.204000 -1.016400 +v -1.016400 0.204000 -0.462000 +v 0.646800 0.019200 1.016400 +v 0.646800 0.019200 1.016400 +v 0.277200 0.204000 -1.016400 +v -1.016400 0.204000 0.646800 +v -1.016400 0.204000 0.646800 +v 1.016400 0.204000 -0.462000 +v -0.277200 0.019200 -1.016400 +v 1.016400 0.019200 -0.462000 +v -0.462000 0.019200 -1.016400 +v 0.277200 0.019200 -1.016400 +v 0.646800 0.019200 -0.831600 +v 0.646800 0.019200 -0.831600 +v 0.646800 0.019200 -0.831600 +v 0.646800 0.204000 -0.831600 +v 0.646800 0.204000 -0.831600 +v -1.016400 0.019200 -0.277200 +v 0.646833 -0.164676 0.776199 +v 0.776200 -0.164676 0.646833 +v -0.258733 -0.164676 1.164299 +v -0.258733 -0.164676 1.164299 +v -0.388099 -0.164676 1.034933 +v -1.034933 0.018276 -0.129366 +v -1.034933 0.018276 -0.129366 +v -1.164299 0.018276 0.000000 +v -1.164299 0.018276 0.000000 +v -1.164299 0.018276 0.258734 +v -1.164299 0.018276 0.258734 +v -1.164299 -0.164676 0.258734 +v -1.164299 -0.164676 0.258734 +v 0.129367 0.018276 1.034933 +v 0.129367 0.018276 1.034933 +v 0.129367 0.018276 1.034933 +v 0.258734 0.018276 1.164299 +v 0.258734 0.018276 1.164299 +v 0.258733 0.018276 -1.164299 +v 0.258733 0.018276 -1.164299 +v 0.258733 -0.164676 -1.164299 +v 0.258733 -0.164676 -1.164299 +v 0.776200 0.018276 0.646833 +v 0.905566 0.018276 0.517466 +v -1.164299 -0.164676 0.000000 +v -1.164299 -0.164676 0.000000 +v 1.034933 0.018276 0.129366 +v 1.034933 0.018276 0.129366 +v 1.164299 0.018276 -0.000000 +v 1.164299 0.018276 -0.000000 +v 1.164299 0.018276 -0.258734 +v 1.164299 0.018276 -0.258734 +v 1.164299 -0.164676 -0.258734 +v 1.164299 -0.164676 -0.258734 +v 0.129366 0.018276 -1.034933 +v 0.129366 0.018276 -1.034933 +v 0.129366 -0.164676 -1.034933 +v 0.129366 -0.164676 -1.034933 +v 0.129366 -0.164676 -1.034933 +v 0.646833 0.018276 0.776199 +v 0.646833 -0.164676 -0.776200 +v 0.517466 -0.164676 -0.905566 +v 0.905566 -0.164676 0.517466 +v 1.034933 -0.164676 -0.129367 +v 1.034933 -0.164676 -0.129367 +v 1.034933 -0.164676 -0.129367 +v -0.517466 -0.164676 0.905566 +v -0.646833 -0.164676 0.776200 +v 1.034933 -0.164676 0.129366 +v 1.034933 -0.164676 0.129366 +v 1.034933 -0.164676 0.129366 +v 1.164299 -0.164676 -0.000000 +v 1.164299 -0.164676 -0.000000 +v 0.258734 -0.164676 1.164299 +v 0.258734 -0.164676 1.164299 +v 0.129367 -0.164676 1.034933 +v 0.129367 -0.164676 1.034933 +v 0.129367 -0.164676 1.034933 +v 0.000000 0.018276 1.164299 +v 0.000000 0.018276 1.164299 +v -1.034933 0.018276 -0.388099 +v -0.905566 0.018276 -0.517466 +v 0.517467 0.018276 0.905566 +v -1.034933 -0.164676 0.129367 +v -1.034933 -0.164676 0.129367 +v -1.034933 -0.164676 0.129367 +v 1.034933 -0.164676 -0.388100 +v 1.034933 0.018276 -0.129367 +v 1.034933 0.018276 -0.129367 +v 0.388100 0.018276 1.034933 +v -1.034933 -0.164676 -0.129366 +v -1.034933 -0.164676 -0.129366 +v -1.034933 -0.164676 -0.129366 +v -1.164299 -0.164676 -0.258733 +v -1.164299 -0.164676 -0.258733 +v 0.388100 -0.164676 1.034933 +v 0.517467 -0.164676 0.905566 +v -0.646833 0.018276 0.776200 +v -0.776199 0.018276 0.646833 +v 1.034933 0.018276 -0.388100 +v 0.905566 0.018276 -0.517467 +v -1.164299 0.018276 -0.258733 +v -1.164299 0.018276 -0.258733 +v 0.905566 -0.164676 -0.517467 +v -0.000000 -0.164676 -1.164299 +v -0.000000 -0.164676 -1.164299 +v -1.034933 0.018276 0.129367 +v -1.034933 0.018276 0.129367 +v -0.776199 -0.164676 0.646833 +v -0.776200 0.018276 -0.646833 +v -0.646833 0.018276 -0.776199 +v 1.034933 -0.164676 0.388099 +v -0.776200 -0.164676 -0.646833 +v -0.646833 -0.164676 -0.776199 +v 1.034933 0.018276 0.388099 +v 1.164299 0.018276 0.258733 +v 1.164299 0.018276 0.258733 +v -0.000000 0.018276 -1.164299 +v -0.000000 0.018276 -1.164299 +v -0.388099 0.018276 1.034933 +v -0.517466 0.018276 0.905566 +v -0.129366 -0.164676 1.034933 +v -0.129366 -0.164676 1.034933 +v -0.129366 -0.164676 1.034933 +v -1.034933 -0.164676 0.388100 +v 0.646833 0.018276 -0.776200 +v 0.517466 0.018276 -0.905566 +v 0.000000 -0.164676 1.164299 +v 0.000000 -0.164676 1.164299 +v 0.776199 -0.164676 -0.646833 +v 0.776199 0.018276 -0.646833 +v -0.129366 0.018276 1.034933 +v -0.129366 0.018276 1.034933 +v -0.129366 0.018276 1.034933 +v -0.905566 0.018276 0.517467 +v -0.388100 -0.164676 -1.034933 +v -0.258734 -0.164676 -1.164299 +v -0.258734 -0.164676 -1.164299 +v -0.388100 0.018276 -1.034933 +v -0.258734 0.018276 -1.164299 +v -0.258734 0.018276 -1.164299 +v -1.034933 0.018276 0.388100 +v 1.164299 -0.164676 0.258733 +v 1.164299 -0.164676 0.258733 +v -0.517467 0.018276 -0.905566 +v -0.258733 0.018276 1.164299 +v -0.258733 0.018276 1.164299 +v 0.388099 0.018276 -1.034933 +v -0.905566 -0.164676 -0.517466 +v 0.388099 -0.164676 -1.034933 +v -1.034933 -0.164676 -0.388099 +v -0.517467 -0.164676 -0.905566 +v -0.129367 -0.164676 -1.034933 +v -0.129367 -0.164676 -1.034933 +v -0.129367 -0.164676 -1.034933 +v -0.129367 0.018276 -1.034933 +v -0.129367 0.018276 -1.034933 +v -0.905566 -0.164676 0.517467 +v -0.092400 -0.350400 1.016400 +v 0.092400 -0.350400 1.016400 +v -1.016400 -0.350400 0.646800 +v -1.016400 -0.350400 0.646800 +v -1.016400 -0.350400 0.462000 +v -0.646800 -0.165600 -0.831600 +v -0.646800 -0.165600 -0.831600 +v -0.831600 -0.165600 -0.831600 +v -0.831600 -0.165600 -0.831600 +v -1.016400 -0.165600 -0.646800 +v -1.016400 -0.165600 -0.646800 +v -1.016400 -0.350400 -0.646800 +v -1.016400 -0.350400 -0.646800 +v -0.646800 -0.165600 0.831600 +v -0.646800 -0.165600 0.831600 +v -0.646800 -0.165600 1.016400 +v -0.646800 -0.165600 1.016400 +v 1.016400 -0.165600 -0.646800 +v 1.016400 -0.165600 -0.646800 +v 1.016400 -0.350400 -0.646800 +v 1.016400 -0.350400 -0.646800 +v 0.092400 -0.165600 1.016400 +v 0.277200 -0.165600 1.016400 +v -0.831600 -0.350400 -0.831600 +v -0.831600 -0.350400 -0.831600 +v 0.646800 -0.165600 0.831600 +v 0.646800 -0.165600 0.831600 +v 0.646800 -0.165600 0.831600 +v 0.831600 -0.165600 0.831600 +v 0.831600 -0.165600 0.831600 +v 1.016400 -0.165600 0.646800 +v 1.016400 -0.165600 0.646800 +v 1.016400 -0.350400 0.646800 +v 1.016400 -0.350400 0.646800 +v 0.831600 -0.165600 -0.646800 +v 0.831600 -0.165600 -0.646800 +v 0.831600 -0.350400 -0.646800 +v 0.831600 -0.350400 -0.646800 +v -0.092400 -0.165600 1.016400 +v 1.016400 -0.350400 -0.092400 +v 1.016400 -0.350400 -0.277200 +v 0.277200 -0.350400 1.016400 +v 0.831600 -0.350400 0.646800 +v 0.831600 -0.350400 0.646800 +v -1.016400 -0.350400 0.277200 +v -1.016400 -0.350400 0.092400 +v 0.646800 -0.350400 0.831600 +v 0.646800 -0.350400 0.831600 +v 0.831600 -0.350400 0.831600 +v 0.831600 -0.350400 0.831600 +v -0.646800 -0.350400 1.016400 +v -0.646800 -0.350400 1.016400 +v -0.646800 -0.350400 0.831600 +v -0.646800 -0.350400 0.831600 +v -0.831600 -0.165600 0.831600 +v -0.831600 -0.165600 0.831600 +v -0.462000 -0.165600 -1.016400 +v -0.277200 -0.165600 -1.016400 +v -0.277200 -0.165600 1.016400 +v -0.831600 -0.350400 -0.646800 +v -0.831600 -0.350400 -0.646800 +v 1.016400 -0.350400 0.462000 +v 0.831600 -0.165600 0.646800 +v 0.831600 -0.165600 0.646800 +v -0.462000 -0.165600 1.016400 +v -0.646800 -0.350400 -0.831600 +v -0.646800 -0.350400 -0.831600 +v -0.646800 -0.350400 -1.016400 +v -0.646800 -0.350400 -1.016400 +v -0.462000 -0.350400 1.016400 +v -0.277200 -0.350400 1.016400 +v -1.016400 -0.165600 0.092400 +v -1.016400 -0.165600 -0.092400 +v 1.016400 -0.165600 0.462000 +v 1.016400 -0.165600 0.277200 +v -0.646800 -0.165600 -1.016400 +v -0.646800 -0.165600 -1.016400 +v 1.016400 -0.350400 0.277200 +v 0.831600 -0.350400 -0.831600 +v 0.831600 -0.350400 -0.831600 +v -0.831600 -0.165600 -0.646800 +v -0.831600 -0.165600 -0.646800 +v -1.016400 -0.350400 -0.092400 +v -0.092400 -0.165600 -1.016400 +v 0.092400 -0.165600 -1.016400 +v 0.462000 -0.350400 1.016400 +v -0.092400 -0.350400 -1.016400 +v 0.092400 -0.350400 -1.016400 +v 0.462000 -0.165600 1.016400 +v 0.646800 -0.165600 1.016400 +v 0.646800 -0.165600 1.016400 +v 0.831600 -0.165600 -0.831600 +v 0.831600 -0.165600 -0.831600 +v -1.016400 -0.165600 0.462000 +v -1.016400 -0.165600 0.277200 +v -0.831600 -0.350400 0.646800 +v -0.831600 -0.350400 0.646800 +v -1.016400 -0.350400 -0.462000 +v 1.016400 -0.165600 -0.092400 +v 1.016400 -0.165600 -0.277200 +v -0.831600 -0.350400 0.831600 +v -0.831600 -0.350400 0.831600 +v 1.016400 -0.350400 0.092400 +v 1.016400 -0.165600 0.092400 +v -0.831600 -0.165600 0.646800 +v -0.831600 -0.165600 0.646800 +v -1.016400 -0.165600 -0.277200 +v 0.462000 -0.350400 -1.016400 +v 0.646800 -0.350400 -1.016400 +v 0.646800 -0.350400 -1.016400 +v 0.462000 -0.165600 -1.016400 +v 0.646800 -0.165600 -1.016400 +v 0.646800 -0.165600 -1.016400 +v -1.016400 -0.165600 -0.462000 +v 0.646800 -0.350400 1.016400 +v 0.646800 -0.350400 1.016400 +v 0.277200 -0.165600 -1.016400 +v -1.016400 -0.165600 0.646800 +v -1.016400 -0.165600 0.646800 +v 1.016400 -0.165600 -0.462000 +v -0.277200 -0.350400 -1.016400 +v 1.016400 -0.350400 -0.462000 +v -0.462000 -0.350400 -1.016400 +v 0.277200 -0.350400 -1.016400 +v 0.646800 -0.350400 -0.831600 +v 0.646800 -0.350400 -0.831600 +v 0.646800 -0.165600 -0.831600 +v 0.646800 -0.165600 -0.831600 +v -1.016400 -0.350400 -0.277200 +vt -0.000000 -0.333333 +vt 0.000000 0.000000 +vt 0.333333 -0.000000 +vt 0.333333 -0.333334 +vt 0.333333 -0.666667 +vt 0.666666 -0.333334 +vt 0.666666 -0.666667 +vt 0.666667 -0.000001 +vt -0.000001 -0.666667 +vt 0.666666 -1.000000 +vt 0.999999 -0.666668 +vt 0.999999 -1.000001 +vt 1.000000 -0.333334 +vt 0.333332 -1.000000 +vt 1.000000 -0.000001 +vt -0.000001 -1.000000 +vt 0.999999 -1.333334 +vt 1.333333 -1.000001 +vt 1.333332 -1.333335 +vt 1.333333 -0.666668 +vt 0.666665 -1.333334 +vt 1.333333 -0.333335 +vt 0.333332 -1.333334 +vt 1.333333 -0.000001 +vt -0.000001 -1.333333 +vt 1.333332 -1.666668 +vt 1.666665 -1.333335 +vt 1.666665 -1.666668 +vt 1.666666 -1.000001 +vt 0.999999 -1.666667 +vt 1.666666 -0.666668 +vt 0.666665 -1.666667 +vt 1.666666 -0.333335 +vt 0.333332 -1.666667 +vt 1.666667 -0.000001 +vt -0.000001 -1.666667 +vt 1.666665 -2.000001 +vt 1.999999 -1.666668 +vt 1.999998 -2.000002 +vt 1.999999 -1.333335 +vt 1.333332 -2.000001 +vt 1.999999 -1.000002 +vt 0.999998 -2.000001 +vt 2.000000 -0.666668 +vt 0.666665 -2.000000 +vt 2.000000 -0.333335 +vt 0.333332 -2.000000 +vt 2.000000 -0.000002 +vt -0.000002 -2.000000 +vt 1.999998 -2.333335 +vt 2.333332 -2.000002 +vt 2.333331 -2.333336 +vt 2.333332 -1.666669 +vt 1.666665 -2.333335 +vt 2.333332 -1.333335 +vt 1.333331 -2.333334 +vt 2.333332 -1.000002 +vt 0.999998 -2.333334 +vt 2.333333 -0.666669 +vt 0.666665 -2.333334 +vt 2.333333 -0.333335 +vt 0.333331 -2.333333 +vt 2.333333 -0.000002 +vt -0.000002 -2.333333 +vt 2.333331 -2.666669 +vt 2.666665 -2.333336 +vt 2.666664 -2.666669 +vt 2.666665 -2.000002 +vt 1.999998 -2.666668 +vt 2.666665 -1.666669 +vt -2.666667 -1.666667 +vt -2.333333 -1.666667 +vt -2.333333 -2.000000 +vt -2.666667 -2.000000 +vt 2.666666 -1.333336 +vt 1.333331 -2.666668 +vt 1.666664 -2.666668 +vt 2.666666 -1.000002 +vt 0.999998 -2.666668 +vt 2.666666 -0.666669 +vt 0.666664 -2.666667 +vt 2.666667 -0.333336 +vt -2.666667 -0.333333 +vt -2.333333 -0.333333 +vt -2.333333 -0.666667 +vt -2.666667 -0.666667 +vt 2.666667 -0.000002 +vt -0.000002 -2.666667 +vt 0.333331 -2.666667 +vt 2.666664 -3.000002 +vt 2.999998 -2.666669 +vt 2.999997 -3.000003 +vt 2.999998 -2.333336 +vt 2.333331 -3.000002 +vt 2.999998 -2.000003 +vt 1.999997 -3.000002 +vt 2.999999 -1.666669 +vt 1.666664 -3.000001 +vt 2.999999 -1.333336 +vt 1.333331 -3.000001 +vt -1.333333 -2.666667 +vt -1.000000 -2.666667 +vt -1.000000 -3.000000 +vt -1.333333 -3.000000 +vt 0.999997 -3.000001 +vt 3.000000 -0.666669 +vt 2.999999 -1.000003 +vt 0.666664 -3.000000 +vt 3.000000 -0.333336 +vt 0.333331 -3.000000 +vt 3.000000 -0.000003 +vt -0.000003 -3.000000 +vt 2.999997 -3.333336 +vt 3.333331 -3.000003 +vt 3.333330 -3.333336 +vt 3.333331 -2.666670 +vt 2.666664 -3.333336 +vt 3.333331 -2.333336 +vt 2.333330 -3.333336 +vt 3.333332 -2.000003 +vt 1.999997 -3.333335 +vt 3.333332 -1.666670 +vt 1.666664 -3.333335 +vt 3.333332 -1.333337 +vt 1.333330 -3.333334 +vt 3.333332 -1.000003 +vt 0.999997 -3.333334 +vt -0.666667 -3.000000 +vt -0.666667 -3.333333 +vt -1.000000 -3.333333 +vt 0.666664 -3.333334 +vt 3.333333 -0.333336 +vt 3.333333 -0.666670 +vt 0.333330 -3.333333 +vt 3.333333 -0.000003 +vt -0.000003 -3.333333 +vt 3.333330 -3.666670 +vt 3.666664 -3.333337 +vt 3.666663 -3.666670 +vt 3.666664 -3.000003 +vt 2.999997 -3.666669 +vt 3.666664 -2.666670 +vt 2.666663 -3.666669 +vt 3.666665 -2.333337 +vt 2.333330 -3.666669 +vt 3.666665 -2.000003 +vt 1.999997 -3.666668 +vt 3.666665 -1.666670 +vt 1.666663 -3.666668 +vt 3.666666 -1.333337 +vt 1.333330 -3.666668 +vt 3.666666 -1.000003 +vt 0.999997 -3.666668 +vt 3.666666 -0.666670 +vt 0.666663 -3.666667 +vt 3.666667 -0.333337 +vt 0.333330 -3.666667 +vt 3.666667 -0.000003 +vt -0.000003 -3.666667 +vt 3.666663 -4.000003 +vt 3.999997 -3.666670 +vt 3.999996 -4.000004 +vt 3.999997 -3.333337 +vt 3.333330 -4.000003 +vt 3.999997 -3.000004 +vt 2.999996 -4.000003 +vt 3.999998 -2.666670 +vt 2.666663 -4.000002 +vt 3.999998 -2.333337 +vt 2.333330 -4.000002 +vt 3.999998 -2.000004 +vt 1.999997 -4.000002 +vt 3.999999 -1.666670 +vt 1.666663 -4.000001 +vt 3.999999 -1.333337 +vt 1.333330 -4.000001 +vt 3.999999 -1.000003 +vt 0.999996 -4.000001 +vt 4.000000 -0.666670 +vt 0.666663 -4.000000 +vt 4.000000 -0.333337 +vt 0.333330 -4.000000 +vt 4.000000 -0.000003 +vt -0.000003 -4.000000 +vt 3.999996 -4.375004 +vt 4.374997 -4.000004 +vt 4.374996 -4.375004 +vt -4.000000 -4.000000 +vt -3.666667 -4.000000 +vt -3.666667 -4.375000 +vt -4.000000 -4.375000 +vt 3.666663 -4.375003 +vt 4.374997 -3.333337 +vt 4.374997 -3.666671 +vt 3.333329 -4.375003 +vt 4.374997 -3.000004 +vt 2.999996 -4.375003 +vt 4.374998 -2.666671 +vt -4.375000 -2.666667 +vt -4.000000 -2.666667 +vt -4.000000 -3.000000 +vt -4.375000 -3.000000 +vt 4.374998 -2.333337 +vt 2.333329 -4.375002 +vt 2.666663 -4.375002 +vt 4.374998 -2.000004 +vt 1.999996 -4.375002 +vt 4.374999 -1.666670 +vt 1.666663 -4.375001 +vt 4.374999 -1.333337 +vt 1.333330 -4.375001 +vt 4.374999 -1.000004 +vt 0.999996 -4.375001 +vt 4.375000 -0.666670 +vt 0.666663 -4.375000 +vt 4.375000 -0.333337 +vt -4.375000 -0.333333 +vt -4.000000 -0.333333 +vt -4.000000 -0.666667 +vt -4.375000 -0.666667 +vt 4.375000 -0.000004 +vt -0.000004 -4.375000 +vt 0.333330 -4.375000 +vt 4.374996 -4.708338 +vt 4.708330 -4.375004 +vt 4.708329 -4.708338 +vt 4.708330 -4.000004 +vt 3.999996 -4.708337 +vt 4.708330 -3.666670 +vt 3.666663 -4.708337 +vt 4.708331 -3.333337 +vt 3.333329 -4.708337 +vt 4.708331 -3.000004 +vt 2.999996 -4.708336 +vt 4.708331 -2.666671 +vt 2.666663 -4.708336 +vt 4.708332 -2.333337 +vt 2.333329 -4.708336 +vt 4.708332 -2.000004 +vt 1.999996 -4.708335 +vt 4.708332 -1.666671 +vt 1.666662 -4.708335 +vt -1.666667 -4.375000 +vt -1.333333 -4.375000 +vt -1.333333 -4.708333 +vt -1.666667 -4.708333 +vt 1.333329 -4.708334 +vt 4.708333 -1.000004 +vt 4.708333 -1.333337 +vt 0.999996 -4.708334 +vt 4.708333 -0.666671 +vt 0.666663 -4.708334 +vt 4.708333 -0.333337 +vt 0.333329 -4.708334 +vt 4.708333 -0.000004 +vt -0.000004 -4.708333 +vt 4.708329 -5.041670 +vt 5.041662 -4.708337 +vt 5.041662 -5.041671 +vt 5.041663 -4.375004 +vt 4.374996 -5.041670 +vt 5.041663 -4.000004 +vt 3.999995 -5.041670 +vt 5.041663 -3.666671 +vt 3.666662 -5.041670 +vt 5.041664 -3.333337 +vt 3.333329 -5.041670 +vt 5.041664 -3.000004 +vt 2.999995 -5.041670 +vt 5.041664 -2.666671 +vt 2.666662 -5.041669 +vt 5.041665 -2.333338 +vt -5.041667 -2.333333 +vt -4.708333 -2.333333 +vt -4.708333 -2.666667 +vt -5.041667 -2.666667 +vt 5.041665 -2.000004 +vt 1.999996 -5.041668 +vt 2.333329 -5.041669 +vt 5.041665 -1.666671 +vt 1.666662 -5.041668 +vt 5.041666 -1.333338 +vt 1.333329 -5.041667 +vt 5.041666 -1.000004 +vt 0.999996 -5.041667 +vt 5.041666 -0.666671 +vt 0.666662 -5.041667 +vt 5.041666 -0.333338 +vt 0.333329 -5.041667 +vt 5.041667 -0.000004 +vt -0.000004 -5.041667 +vt 5.041662 -5.375004 +vt 5.374996 -5.041672 +vt 5.374995 -5.375005 +vt 5.374996 -4.708338 +vt -5.375000 -4.708333 +vt -5.041667 -4.708333 +vt -5.041667 -5.041667 +vt -5.375000 -5.041667 +vt 5.374996 -4.375005 +vt 4.374995 -5.375004 +vt 4.708329 -5.375004 +vt 5.374997 -4.000005 +vt 3.999995 -5.375004 +vt 5.374997 -3.666672 +vt 3.666662 -5.375003 +vt 5.374997 -3.333338 +vt 3.333328 -5.375003 +vt 5.374997 -3.000005 +vt 2.999995 -5.375003 +vt 5.374998 -2.666672 +vt 2.666662 -5.375002 +vt 5.374998 -2.333338 +vt 2.333328 -5.375002 +vt 5.374998 -2.000005 +vt 1.999995 -5.375002 +vt 5.374999 -1.666671 +vt 1.666662 -5.375001 +vt 5.374999 -1.333338 +vt 1.333329 -5.375001 +vt 5.374999 -1.000005 +vt 0.999995 -5.375001 +vt 5.375000 -0.666671 +vt 0.666662 -5.375000 +vt 5.375000 -0.333338 +vt 0.333329 -5.375000 +vt 5.375000 -0.000005 +vt -0.000005 -5.375000 +vt 5.374995 -5.708338 +vt 5.708329 -5.375005 +vt 5.708328 -5.708338 +vt 5.708329 -5.041672 +vt 5.041661 -5.708337 +vt 5.708329 -4.708338 +vt 4.708328 -5.708338 +vt 5.708330 -4.375005 +vt 4.374995 -5.708338 +vt 5.708330 -4.000005 +vt 3.999995 -5.708337 +vt 5.708330 -3.666672 +vt 3.666662 -5.708337 +vt 5.708331 -3.333338 +vt 3.333328 -5.708337 +vt 5.708331 -3.000005 +vt 2.999995 -5.708336 +vt 5.708331 -2.666672 +vt 2.666662 -5.708336 +vt 5.708332 -2.333338 +vt 5.708333 2.333333 +vt 5.375000 2.333333 +vt 5.375000 2.666667 +vt 5.708333 2.666667 +vt 5.708332 -2.000005 +vt 1.999995 -5.708335 +vt 2.333328 -5.708336 +vt 5.708332 -1.666672 +vt 1.666662 -5.708335 +vt 5.708333 -1.333338 +vt 1.333328 -5.708334 +vt 5.708333 -1.000005 +vt 0.999995 -5.708334 +vt -1.000000 -5.375000 +vt -0.666667 -5.375000 +vt -0.666667 -5.708333 +vt -1.000000 -5.708333 +vt 0.666662 -5.708334 +vt 5.708333 -0.333338 +vt 5.708333 -0.666672 +vt -0.333333 5.708333 +vt -0.333333 5.375000 +vt -0.666667 5.375000 +vt -0.666667 5.708333 +vt 5.708333 -0.000005 +vt -0.000005 -5.708333 +vt 0.333328 -5.708334 +vt 5.708328 -6.041672 +vt 6.041661 -5.708339 +vt 6.041661 -6.041671 +vt 6.041662 -5.375005 +vt 5.374995 -6.041672 +vt 6.041662 -5.041671 +vt 5.041661 -6.041671 +vt 6.041662 -4.708339 +vt 4.708328 -6.041670 +vt 6.041663 -4.375005 +vt 4.374995 -6.041670 +vt 6.041663 -4.000005 +vt 3.999995 -6.041670 +vt 6.041663 -3.666672 +vt 3.666662 -6.041670 +vt 6.041664 -3.333338 +vt 3.333328 -6.041670 +vt 6.041664 -3.000005 +vt 2.999995 -6.041670 +vt 6.041664 -2.666672 +vt 2.666662 -6.041669 +vt 6.041665 -2.333338 +vt 2.333328 -6.041669 +vt 6.041665 -2.000005 +vt 1.999995 -6.041668 +vt 6.041665 -1.666672 +vt 1.666661 -6.041668 +vt 6.041666 -1.333339 +vt 1.333328 -6.041667 +vt 6.041666 -1.000005 +vt 0.999995 -6.041667 +vt 6.041666 -0.666672 +vt 0.666661 -6.041667 +vt 6.041666 -0.333339 +vt 0.333328 -6.041667 +vt 6.041667 -0.000005 +vt -0.000005 -6.041667 +vt 6.041661 -6.375005 +vt 6.374995 -6.041672 +vt 6.374994 -6.375006 +vt 6.374995 -5.708340 +vt 5.708328 -6.375005 +vt 6.374995 -5.375006 +vt 5.374994 -6.375005 +vt 6.374996 -5.041672 +vt 5.041661 -6.375004 +vt 6.374996 -4.708340 +vt 4.708328 -6.375004 +vt 6.374996 -4.375006 +vt 4.374994 -6.375004 +vt 6.374997 -4.000006 +vt 3.999995 -6.375004 +vt 6.374997 -3.666672 +vt 3.666661 -6.375003 +vt 6.374997 -3.333339 +vt 3.333328 -6.375003 +vt 6.374997 -3.000006 +vt 2.999995 -6.375003 +vt 6.374998 -2.666672 +vt 2.666661 -6.375002 +vt -2.666667 -6.041667 +vt -2.333333 -6.041667 +vt -2.333333 -6.375000 +vt -2.666667 -6.375000 +vt 2.333328 -6.375002 +vt 6.374998 -2.000006 +vt 6.374998 -2.333339 +vt 1.999994 -6.375002 +vt 6.374999 -1.666672 +vt 1.666661 -6.375001 +vt 6.374999 -1.333339 +vt 1.333328 -6.375001 +vt 6.374999 -1.000006 +vt 0.999994 -6.375001 +vt 6.375000 -0.666672 +vt 0.666661 -6.375000 +vt 6.375000 -0.333339 +vt 0.333328 -6.375000 +vt 6.375000 -0.000006 +vt -0.000006 -6.375000 +vt 6.708333 6.375000 +vt 6.375000 6.375000 +vt 6.375000 6.708333 +vt 6.708333 6.708333 +vt 6.708328 -6.041672 +vt 6.708328 -6.375006 +vt 6.041661 -6.708339 +vt 6.374994 -6.708340 +vt 6.708328 -5.708339 +vt 5.708328 -6.708338 +vt -5.708333 -6.375000 +vt -5.375000 -6.375000 +vt -5.375000 -6.708333 +vt -5.708333 -6.708333 +vt 5.374994 -6.708338 +vt 6.708329 -5.041672 +vt 6.708329 -5.375006 +vt 5.041661 -6.708337 +vt 6.708329 -4.708339 +vt 4.708328 -6.708338 +vt 6.708330 -4.375006 +vt 4.374994 -6.708338 +vt 6.708330 -4.000006 +vt 3.999994 -6.708337 +vt 6.708330 -3.666672 +vt 3.666661 -6.708337 +vt 6.708331 -3.333339 +vt 3.333327 -6.708337 +vt -3.333333 -6.375000 +vt -3.000000 -6.375000 +vt -3.000000 -6.708333 +vt -3.333333 -6.708333 +vt 2.999994 -6.708336 +vt 6.708331 -2.666672 +vt 6.708331 -3.000006 +vt 2.666661 -6.708336 +vt 6.708331 -2.333339 +vt 2.333327 -6.708336 +vt 6.708332 -2.000006 +vt 1.999994 -6.708336 +vt 6.708332 -1.666672 +vt 1.666661 -6.708335 +vt 6.708333 -1.333339 +vt 1.333328 -6.708334 +vt 6.708333 -1.000006 +vt 0.999994 -6.708334 +vt 6.708333 -0.666673 +vt 0.666661 -6.708334 +vt 6.708333 -0.333339 +vt 0.333327 -6.708334 +vt 6.708333 -0.000006 +vt -0.000006 -6.708333 +vt 7.041667 6.708333 +vt 6.708333 7.041667 +vt 7.041667 7.041667 +vt 6.375000 7.041667 +vt 7.041667 6.375000 +vt 7.041661 -6.041673 +vt 7.041661 -6.375006 +vt 6.041660 -7.041671 +vt 6.374994 -7.041672 +vt 7.041661 -5.708339 +vt 5.708327 -7.041672 +vt 7.041662 -5.375006 +vt 5.374994 -7.041672 +vt 7.041662 -5.041673 +vt 5.041660 -7.041671 +vt 7.041662 -4.708339 +vt -7.041667 -4.708333 +vt -6.708333 -4.708333 +vt -6.708333 -5.041667 +vt -7.041667 -5.041667 +vt 7.041663 -4.375006 +vt 4.374994 -7.041670 +vt 4.708327 -7.041670 +vt 7.041663 -4.000006 +vt 3.999994 -7.041670 +vt 7.041663 -3.666673 +vt 3.666661 -7.041670 +vt 7.041664 -3.333339 +vt 3.333327 -7.041670 +vt 7.041664 -3.000006 +vt 2.999994 -7.041670 +vt 7.041664 -2.666673 +vt 2.666661 -7.041669 +vt 7.041664 -2.333339 +vt 2.333327 -7.041669 +vt 7.041665 -2.000006 +vt 1.999994 -7.041668 +vt 7.041665 -1.666673 +vt 1.666660 -7.041668 +vt 7.041666 -1.333339 +vt 1.333327 -7.041667 +vt 7.041666 -1.000006 +vt 0.999994 -7.041668 +vt 7.041666 -0.666673 +vt 0.666660 -7.041667 +vt 7.041666 -0.333340 +vt 0.333327 -7.041667 +vt 7.041667 -0.000006 +vt -0.000006 -7.041667 +vt 7.375000 7.041667 +vt 7.041667 7.375000 +vt 7.375000 7.375000 +vt 6.708333 7.375000 +vt 7.375000 6.708333 +vt 6.375000 7.375000 +vt 7.375000 6.375000 +vt -6.375000 -7.041667 +vt -6.041667 -7.041667 +vt -6.041667 -7.375000 +vt -6.375000 -7.375000 +vt 6.041660 -7.375005 +vt 6.374993 -7.375006 +vt 7.374995 -5.708340 +vt 7.374995 -6.041674 +vt 5.708327 -7.375005 +vt 7.374995 -5.375007 +vt 5.374993 -7.375005 +vt 7.374996 -5.041674 +vt 5.041660 -7.375004 +vt 7.374996 -4.708340 +vt 4.708327 -7.375004 +vt 7.374996 -4.375007 +vt 4.374993 -7.375004 +vt 7.374997 -4.000007 +vt 3.999994 -7.375004 +vt 7.374997 -3.666674 +vt 3.666660 -7.375003 +vt 7.374997 -3.333340 +vt 3.333327 -7.375003 +vt 7.374997 -3.000007 +vt 2.999993 -7.375003 +vt 7.374998 -2.666674 +vt -7.375000 -2.666667 +vt -7.041667 -2.666667 +vt -7.041667 -3.000000 +vt -7.375000 -3.000000 +vt 7.374998 -2.333340 +vt 2.333327 -7.375002 +vt 2.666660 -7.375002 +vt -2.333333 -7.041667 +vt -2.000000 -7.041667 +vt -2.000000 -7.375000 +vt -2.333333 -7.375000 +vt 1.999993 -7.375002 +vt 7.374999 -1.666673 +vt 7.374998 -2.000007 +vt 1.666660 -7.375001 +vt -1.666667 -7.041667 +vt -1.333333 -7.041667 +vt -1.333333 -7.375000 +vt -1.666667 -7.375000 +vt 1.333327 -7.375000 +vt 7.374999 -1.000007 +vt 7.374999 -1.333340 +vt 0.999993 -7.375001 +vt -1.000000 -7.041667 +vt -0.666667 -7.041667 +vt -0.666667 -7.375000 +vt -1.000000 -7.375000 +vt 0.666660 -7.375000 +vt 7.375000 -0.333340 +vt 7.375000 -0.666674 +vt 0.333327 -7.375000 +vt 7.375000 -0.000007 +vt -0.000007 -7.375000 +vt 7.708333 7.375000 +vt 7.375000 7.708333 +vt 7.708333 7.708333 +vt 7.041667 7.708333 +vt 7.708333 7.041667 +vt 6.708333 7.708333 +vt 7.708333 6.708333 +vt 6.375000 7.708333 +vt 7.708333 6.375000 +vt 7.374994 -6.375007 +vt 7.708328 -6.041673 +vt 7.708328 -6.375006 +vt 6.041660 -7.708339 +vt 6.374993 -7.708340 +vt 7.708328 -5.708340 +vt 5.708327 -7.708338 +vt 7.708329 -5.375006 +vt 5.374993 -7.708338 +vt 7.708329 -5.041673 +vt 5.041660 -7.708337 +vt 7.708329 -4.708340 +vt 4.708327 -7.708338 +vt 7.708330 -4.375006 +vt 4.374993 -7.708338 +vt 7.708330 -4.000006 +vt 3.999993 -7.708337 +vt 7.708330 -3.666673 +vt 3.666660 -7.708337 +vt 7.708330 -3.333340 +vt 3.333327 -7.708337 +vt 7.708331 -3.000006 +vt 2.999993 -7.708336 +vt 7.708331 -2.666673 +vt 2.666660 -7.708336 +vt 7.708331 -2.333340 +vt 2.333327 -7.708336 +vt 7.708332 -2.000006 +vt -7.708333 -2.000000 +vt -7.375000 -2.000000 +vt -7.375000 -2.333333 +vt -7.708333 -2.333333 +vt 7.708332 -1.666673 +vt 1.666660 -7.708335 +vt 1.999993 -7.708336 +vt 7.708333 -1.333340 +vt 1.333327 -7.708334 +vt 7.708333 -1.000007 +vt 0.999993 -7.708334 +vt 7.708333 -0.666673 +vt 0.666660 -7.708334 +vt -0.333333 -7.375000 +vt -0.333333 -7.708333 +vt -0.666667 -7.708333 +vt 0.333327 -7.708333 +vt 7.708333 -0.000007 +vt 7.708333 -0.333340 +vt -0.000007 -7.708333 +vt 8.041667 7.708333 +vt 7.708333 8.041667 +vt 8.041667 8.041667 +vt 7.375000 8.041667 +vt 8.041667 7.375000 +vt 7.041667 8.041667 +vt 8.041667 7.041667 +vt 6.708333 8.041667 +vt 8.041667 6.708333 +vt 6.375000 8.041667 +vt 8.041667 6.375000 +vt -6.375000 -7.708333 +vt -6.041667 -7.708333 +vt -6.041667 -8.041667 +vt -6.375000 -8.041667 +vt 6.041659 -8.041674 +vt 6.374993 -8.041673 +vt 8.041662 -5.708341 +vt 8.041661 -6.041674 +vt 5.708326 -8.041672 +vt 8.041662 -5.375007 +vt 5.374993 -8.041672 +vt 8.041662 -5.041674 +vt 5.041659 -8.041672 +vt 8.041663 -4.708341 +vt 4.708326 -8.041670 +vt 8.041663 -4.375007 +vt 4.374993 -8.041671 +vt 8.041663 -4.000007 +vt -8.041667 -4.000000 +vt -7.708333 -4.000000 +vt -7.708333 -4.375000 +vt -8.041667 -4.375000 +vt 8.041664 -3.666674 +vt 3.666659 -8.041670 +vt 3.999993 -8.041671 +vt 8.041664 -3.333341 +vt 3.333326 -8.041670 +vt 8.041664 -3.000007 +vt 2.999993 -8.041670 +vt 8.041665 -2.666674 +vt 2.666659 -8.041669 +vt 8.041665 -2.333341 +vt 2.333326 -8.041669 +vt 8.041665 -2.000007 +vt 1.999993 -8.041669 +vt 8.041665 -1.666674 +vt 1.666659 -8.041669 +vt 8.041666 -1.333341 +vt 1.333326 -8.041668 +vt -1.333333 -7.708333 +vt -1.000000 -7.708333 +vt -1.000000 -8.041667 +vt -1.333333 -8.041667 +vt 0.999993 -8.041668 +vt 8.041666 -0.666674 +vt 8.041666 -1.000007 +vt 0.666660 -8.041668 +vt 8.041667 -0.333341 +vt 0.333326 -8.041667 +vt 8.041667 -0.000007 +vt -0.000007 -8.041667 +vt 8.375000 8.041667 +vt 8.041667 8.375000 +vt 8.375000 8.375000 +vt 7.708333 8.375000 +vt 8.375000 7.708333 +vt 7.375000 8.375000 +vt 8.375000 7.375000 +vt 7.041667 8.375000 +vt 8.375000 7.041667 +vt 6.708333 8.375000 +vt 8.375000 6.708333 +vt 6.375000 8.375000 +vt 8.375000 6.375000 +vt -6.041667 -8.375000 +vt -6.375000 -8.375000 +vt 6.041659 -8.375006 +vt 6.374993 -8.375006 +vt 8.374995 -5.708341 +vt 8.374994 -6.041674 +vt 5.708326 -8.375004 +vt 8.374995 -5.375008 +vt 5.374993 -8.375005 +vt 8.374995 -5.041674 +vt 5.041659 -8.375006 +vt 8.374996 -4.708341 +vt 4.708326 -8.375004 +vt 8.374996 -4.375008 +vt 4.374993 -8.375004 +vt 8.374996 -4.000008 +vt 3.999992 -8.375004 +vt 8.374997 -3.666674 +vt 3.666659 -8.375003 +vt 8.374997 -3.333341 +vt 3.333326 -8.375003 +vt 8.374997 -3.000008 +vt 2.999992 -8.375003 +vt 8.374998 -2.666674 +vt 2.666659 -8.375002 +vt 8.374998 -2.333341 +vt 2.333326 -8.375002 +vt 8.374998 -2.000008 +vt 1.999992 -8.375002 +vt 8.374998 -1.666674 +vt 1.666659 -8.375002 +vt 8.374999 -1.333341 +vt 1.333326 -8.375001 +vt 8.374999 -1.000008 +vt 0.999993 -8.375001 +vt 8.374999 -0.666674 +vt 0.666659 -8.375001 +vt 8.375000 -0.333341 +vt 0.333326 -8.375000 +vt 8.375000 -0.000008 +vt -0.000008 -8.375000 +vt 8.708333 8.375000 +vt 8.375000 8.708333 +vt 8.708333 8.708333 +vt 8.041667 8.708333 +vt 8.708333 8.041667 +vt 7.708333 8.708333 +vt 8.708333 7.708333 +vt 7.375000 8.708333 +vt 8.708333 7.375000 +vt 7.041667 8.708333 +vt 8.708333 7.041667 +vt 6.708333 8.708333 +vt 8.708333 6.708333 +vt 6.375000 8.708333 +vt 8.708333 6.375000 +vt 8.374994 -6.375008 +vt 8.708327 -6.041675 +vt 8.708327 -6.375008 +vt 6.041659 -8.708340 +vt 6.374992 -8.708339 +vt 8.708328 -5.708341 +vt 5.708326 -8.708338 +vt 8.708328 -5.375008 +vt 5.374992 -8.708338 +vt 8.708328 -5.041675 +vt 5.041659 -8.708338 +vt 8.708329 -4.708341 +vt 4.708326 -8.708336 +vt 8.708329 -4.375008 +vt -8.708333 -4.375000 +vt -8.375000 -4.375000 +vt -8.375000 -4.708333 +vt -8.708333 -4.708333 +vt 8.708329 -4.000008 +vt 3.999992 -8.708337 +vt 4.374992 -8.708337 +vt 8.708330 -3.666675 +vt 3.666659 -8.708336 +vt 8.708330 -3.333341 +vt 3.333325 -8.708336 +vt 8.708330 -3.000008 +vt 2.999992 -8.708336 +vt 8.708331 -2.666675 +vt 2.666659 -8.708335 +vt 8.708331 -2.333341 +vt 2.333325 -8.708335 +vt 8.708331 -2.000008 +vt 1.999992 -8.708335 +vt 8.708331 -1.666675 +vt 1.666659 -8.708335 +vt -1.666667 -8.375000 +vt -1.333333 -8.375000 +vt -1.333333 -8.708333 +vt -1.666667 -8.708333 +vt 1.333326 -8.708334 +vt 8.708332 -1.000008 +vt 8.708332 -1.333341 +vt 0.999992 -8.708334 +vt 8.708332 -0.666675 +vt 0.666659 -8.708334 +vt 8.708333 -0.333341 +vt 0.333325 -8.708333 +vt 8.708333 -0.000008 +vt -0.000008 -8.708333 +vt 9.041667 8.708333 +vt 8.708333 9.041667 +vt 9.041667 9.041667 +vt 8.375000 9.041667 +vt 9.041667 8.375000 +vt 8.041667 9.041667 +vt 9.041667 8.041667 +vt 7.708333 9.041667 +vt 9.041667 7.708333 +vt 7.375000 9.041667 +vt 9.041667 7.375000 +vt 7.041667 9.041667 +vt 9.041667 7.041667 +vt 6.708333 9.041667 +vt 9.041667 6.708333 +vt 8.708333 -6.708333 +vt 8.708333 -6.375000 +vt 9.041667 -6.375000 +vt 9.041667 -6.708333 +vt 9.041667 6.375000 +vt 9.041661 -6.041675 +vt 9.041661 -6.375009 +vt 6.041658 -9.041674 +vt 6.374992 -9.041673 +vt 9.041662 -5.708342 +vt 5.708325 -9.041672 +vt 9.041662 -5.375009 +vt 5.374992 -9.041672 +vt 9.041662 -5.041675 +vt 5.041658 -9.041672 +vt 9.041663 -4.708342 +vt 4.708325 -9.041670 +vt 9.041663 -4.375009 +vt 4.374992 -9.041671 +vt 9.041663 -4.000009 +vt 3.999992 -9.041671 +vt 9.041664 -3.666675 +vt 3.666659 -9.041670 +vt 9.041664 -3.333341 +vt 3.333325 -9.041670 +vt 9.041664 -3.000008 +vt 2.999992 -9.041670 +vt 9.041665 -2.666675 +vt 2.666659 -9.041669 +vt 9.041665 -2.333341 +vt 2.333325 -9.041669 +vt 9.041665 -2.000008 +vt 1.999992 -9.041669 +vt 9.041665 -1.666675 +vt 1.666658 -9.041669 +vt -1.333333 -9.041667 +vt -1.666667 -9.041667 +vt 1.333325 -9.041668 +vt 9.041666 -1.000008 +vt 9.041666 -1.333342 +vt 0.999992 -9.041668 +vt 9.041666 -0.666675 +vt 0.666658 -9.041668 +vt 9.041667 -0.333342 +vt 0.333325 -9.041667 +vt 9.041667 -0.000008 +vt -0.000008 -9.041667 +vt 9.375000 9.041667 +vt 9.041667 9.375000 +vt 9.375000 9.375000 +vt 8.708333 9.375000 +vt 9.375000 8.708333 +vt 8.375000 9.375000 +vt 8.375000 -9.375000 +vt 8.375000 -9.041667 +vt 8.708333 -9.041667 +vt 8.708333 -9.375000 +vt 8.041667 9.375000 +vt 9.375000 8.041667 +vt 9.375000 8.375000 +vt 7.708333 9.375000 +vt 9.375000 7.708333 +vt 7.375000 9.375000 +vt 9.375000 7.375000 +vt 7.041667 9.375000 +vt 9.375000 7.041667 +vt 6.708333 9.375000 +vt 9.375000 6.708333 +vt 6.375000 9.041667 +vt 6.375000 9.375000 +vt 9.375000 6.375000 +vt 9.374994 -6.041675 +vt 9.374994 -6.375008 +vt 6.041658 -9.375006 +vt 6.374992 -9.375006 +vt 9.374995 -5.708342 +vt 5.708325 -9.375004 +vt 9.374995 -5.375008 +vt 5.374992 -9.375005 +vt 9.374995 -5.041675 +vt -9.375000 -5.041667 +vt -9.041667 -5.041667 +vt -9.041667 -5.375000 +vt -9.375000 -5.375000 +vt 9.374996 -4.708342 +vt 4.708325 -9.375004 +vt 5.041658 -9.375006 +vt 9.374996 -4.375008 +vt 4.374992 -9.375004 +vt 9.374996 -4.000008 +vt 3.999991 -9.375004 +vt 9.374997 -3.666676 +vt 3.666658 -9.375003 +vt 9.374997 -3.333342 +vt -9.375000 -3.333333 +vt -9.041667 -3.333333 +vt -9.041667 -3.666667 +vt -9.375000 -3.666667 +vt 9.374997 -3.000009 +vt 2.999991 -9.375003 +vt 3.333325 -9.375003 +vt 9.374998 -2.666676 +vt 2.666658 -9.375002 +vt 9.374998 -2.333342 +vt 2.333325 -9.375002 +vt 9.374998 -2.000009 +vt 1.999992 -9.375002 +vt 9.374998 -1.666675 +vt 1.666658 -9.375002 +vt 9.374999 -1.333342 +vt 1.333325 -9.375001 +vt 9.374999 -1.000009 +vt 0.999991 -9.375001 +vt 9.374999 -0.666675 +vt 0.666658 -9.375001 +vt 9.375000 -0.333342 +vt 0.333325 -9.375000 +vt 9.375000 -0.000009 +vt -0.000009 -9.375000 +vt 9.708333 9.375000 +vt 9.375000 9.708333 +vt 9.708333 9.708333 +vt 9.041667 9.708333 +vt 9.708333 9.041667 +vt 8.708333 9.708333 +vt 9.708333 8.708333 +vt 8.375000 9.708333 +vt 9.708333 8.375000 +vt 8.041667 9.708333 +vt 9.708333 8.041667 +vt 7.708333 9.708333 +vt 9.708333 7.708333 +vt 7.375000 9.708333 +vt 9.708333 7.375000 +vt 7.041667 9.708333 +vt 9.708333 7.041667 +vt 6.708333 9.708333 +vt 9.708333 6.708333 +vt 6.375000 9.708333 +vt 9.708333 6.375000 +vt 9.708327 -6.041675 +vt 9.708327 -6.375009 +vt 6.041658 -9.708340 +vt 6.374991 -9.708340 +vt 9.708328 -5.708343 +vt 5.708325 -9.708338 +vt 9.708328 -5.375009 +vt 5.374991 -9.708338 +vt 9.708328 -5.041675 +vt 5.041658 -9.708338 +vt 9.708329 -4.708343 +vt 4.708325 -9.708336 +vt 9.708329 -4.375009 +vt 4.374991 -9.708337 +vt -4.375000 -9.375000 +vt -4.000000 -9.375000 +vt -4.000000 -9.708333 +vt -4.375000 -9.708333 +vt 3.999991 -9.708337 +vt 9.708330 -3.666676 +vt 9.708329 -4.000009 +vt 3.666658 -9.708336 +vt -3.666667 -9.375000 +vt -3.333333 -9.375000 +vt -3.333333 -9.708333 +vt -3.666667 -9.708333 +vt 3.333324 -9.708336 +vt 9.708330 -3.000009 +vt 9.708330 -3.333342 +vt 2.999991 -9.708336 +vt 9.708331 -2.666676 +vt 2.666658 -9.708335 +vt 9.708331 -2.333342 +vt 2.333324 -9.708335 +vt 9.708331 -2.000009 +vt 1.999991 -9.708335 +vt 9.708331 -1.666676 +vt 1.666658 -9.708335 +vt 9.708332 -1.333342 +vt 1.333324 -9.708334 +vt 9.708332 -1.000009 +vt -9.708333 -1.000000 +vt -9.375000 -1.000000 +vt -9.375000 -1.333333 +vt -9.708333 -1.333333 +vt 9.708332 -0.666676 +vt 0.666658 -9.708334 +vt 0.999991 -9.708334 +vt 9.708333 -0.333342 +vt 0.333324 -9.708333 +vt 9.708333 -0.000009 +vt -0.000009 -9.708333 +vt 10.041667 9.708333 +vt 9.708333 10.041667 +vt 10.041667 10.041667 +vt 9.375000 10.041667 +vt 10.041667 9.375000 +vt 9.041667 10.041667 +vt 10.041667 9.041667 +vt 8.708333 10.041667 +vt 10.041667 8.708333 +vt 8.375000 10.041667 +vt 10.041667 8.375000 +vt 8.041667 10.041667 +vt 10.041667 8.041667 +vt 7.708333 10.041667 +vt 10.041667 7.708333 +vt 7.375000 10.041667 +vt 10.041667 7.375000 +vt 7.041667 10.041667 +vt 10.041667 7.041667 +vt 9.708333 -7.041667 +vt 9.708333 -6.708333 +vt 10.041667 -6.708333 +vt 10.041667 -7.041667 +vt 10.041667 6.708333 +vt 6.375000 10.041667 +vt 6.708333 10.041667 +vt 10.041667 6.375000 +vt 10.041661 -6.041675 +vt 10.041661 -6.375009 +vt 6.041658 -10.041674 +vt 6.374991 -10.041672 +vt 10.041662 -5.708343 +vt 5.708325 -10.041672 +vt 10.041662 -5.375009 +vt 5.374991 -10.041672 +vt 10.041662 -5.041675 +vt -10.041667 -5.041667 +vt -9.708333 -5.041667 +vt -9.708333 -5.375000 +vt -10.041667 -5.375000 +vt 10.041663 -4.708343 +vt 4.708325 -10.041670 +vt 5.041658 -10.041672 +vt 10.041663 -4.375009 +vt 4.374991 -10.041671 +vt 10.041663 -4.000009 +vt 3.999991 -10.041671 +vt 10.041664 -3.666676 +vt 3.666658 -10.041670 +vt 10.041664 -3.333343 +vt 3.333324 -10.041670 +vt 10.041664 -3.000009 +vt 2.999991 -10.041670 +vt 10.041665 -2.666676 +vt 2.666658 -10.041669 +vt 10.041665 -2.333343 +vt -10.041667 -2.333333 +vt -9.708333 -2.333333 +vt -9.708333 -2.666667 +vt -10.041667 -2.666667 +vt 10.041665 -2.000009 +vt 1.999991 -10.041669 +vt 2.333324 -10.041669 +vt 10.041665 -1.666676 +vt 1.666657 -10.041669 +vt 10.041666 -1.333343 +vt 1.333324 -10.041668 +vt 10.041666 -1.000009 +vt 0.999991 -10.041668 +vt 10.041666 -0.666676 +vt 0.666657 -10.041668 +vt 10.041667 -0.333343 +vt 0.333324 -10.041667 +vt -0.333333 -9.708333 +vt 0.000000 -9.708333 +vt 0.000000 -10.041667 +vt -0.333333 -10.041667 +vt -0.000009 -10.041667 +vt 10.375000 10.041667 +vt 10.041667 10.375000 +vt 10.375000 10.375000 +vt 9.708333 10.375000 +vt 10.375000 9.708333 +vt 9.375000 10.375000 +vt 10.375000 9.375000 +vt 9.041667 10.375000 +vt 10.375000 9.041667 +vt 8.708333 10.375000 +vt 10.375000 8.708333 +vt 8.375000 10.375000 +vt 10.375000 8.375000 +vt 8.041667 10.375000 +vt 10.375000 8.041667 +vt 7.708333 10.375000 +vt 10.375000 7.708333 +vt 7.375000 10.375000 +vt 10.375000 7.375000 +vt 7.041667 10.375000 +vt 10.375000 7.041667 +vt 6.708333 10.375000 +vt 10.375000 6.708333 +vt 6.375000 10.375000 +vt 10.375000 6.375000 +vt 10.374994 -6.041676 +vt 10.374994 -6.375010 +vt -10.375000 -6.041667 +vt -10.041667 -6.041667 +vt -10.041667 -6.375000 +vt -10.375000 -6.375000 +vt 10.374995 -5.708344 +vt 5.708324 -10.375004 +vt 6.041657 -10.375006 +vt 10.374995 -5.375010 +vt 5.374991 -10.375005 +vt 10.374995 -5.041676 +vt 5.041657 -10.375006 +vt 10.374996 -4.708343 +vt 4.708324 -10.375004 +vt 10.374996 -4.375010 +vt 4.374991 -10.375004 +vt -4.375000 -10.041667 +vt -4.000000 -10.041667 +vt -4.000000 -10.375000 +vt -4.375000 -10.375000 +vt 3.999991 -10.375004 +vt 10.374997 -3.666676 +vt 10.374996 -4.000010 +vt 3.666657 -10.375003 +vt 10.374997 -3.333343 +vt 3.333324 -10.375003 +vt 10.374997 -3.000010 +vt 2.999991 -10.375003 +vt 10.374998 -2.666676 +vt 2.666657 -10.375002 +vt 10.374998 -2.333343 +vt 2.333324 -10.375002 +vt 10.374998 -2.000010 +vt 1.999990 -10.375002 +vt 10.374998 -1.666676 +vt 1.666657 -10.375002 +vt 10.374999 -1.333343 +vt 1.333324 -10.375001 +vt 10.374999 -1.000010 +vt 0.999990 -10.375001 +vt 10.374999 -0.666676 +vt 0.666657 -10.375001 +vt 10.375000 -0.333343 +vt 0.333324 -10.375000 +vt 10.041667 -0.000009 +vt 10.375000 -0.000010 +vt -0.000010 -10.375000 +vt 10.708333 10.375000 +vt 10.375000 10.708333 +vt 10.708333 10.708333 +vt 10.041667 10.708333 +vt 10.708333 10.041667 +vt 9.708333 10.708333 +vt 10.708333 9.708333 +vt 10.375000 -9.708333 +vt 10.375000 -9.375000 +vt 10.708333 -9.375000 +vt 10.708333 -9.708333 +vt 10.708333 9.375000 +vt 9.041667 10.708333 +vt 9.375000 10.708333 +vt 10.708333 9.041667 +vt 8.708333 10.708333 +vt 10.708333 8.708333 +vt 8.375000 10.708333 +vt 10.708333 8.375000 +vt 8.041667 10.708333 +vt 10.708333 8.041667 +vt 7.708333 10.708333 +vt 10.708333 7.708333 +vt 7.375000 10.708333 +vt 10.708333 7.375000 +vt 7.041667 10.708333 +vt 10.708333 7.041667 +vt 6.708333 10.708333 +vt 10.708333 6.708333 +vt 6.375000 10.708333 +vt 10.708333 6.375000 +vt 10.708327 -6.041677 +vt 10.708327 -6.375010 +vt 6.041657 -10.708340 +vt 6.374991 -10.375006 +vt 6.374990 -10.708340 +vt 10.708328 -5.708343 +vt 5.708324 -10.708338 +vt 10.708328 -5.375010 +vt 5.374990 -10.708338 +vt 10.708328 -5.041677 +vt 5.041657 -10.708338 +vt 10.708329 -4.708343 +vt 4.708324 -10.708336 +vt 10.708329 -4.375010 +vt 4.374990 -10.708337 +vt 10.708329 -4.000010 +vt 3.999990 -10.708337 +vt 10.708330 -3.666677 +vt 3.666657 -10.708336 +vt 10.708330 -3.333343 +vt 3.333324 -10.708336 +vt 10.708330 -3.000010 +vt 2.999990 -10.708336 +vt 10.708331 -2.666677 +vt 2.666657 -10.708335 +vt 10.708331 -2.333343 +vt 2.333323 -10.708335 +vt 10.708331 -2.000010 +vt 1.999990 -10.708335 +vt 10.708331 -1.666677 +vt 1.666657 -10.708335 +vt 10.708332 -1.333343 +vt 1.333323 -10.708334 +vt 10.708332 -1.000010 +vt 0.999990 -10.708334 +vt 10.708332 -0.666677 +vt 0.666657 -10.708334 +vt 10.708333 -0.333343 +vt 0.333323 -10.708333 +vt 10.708333 -0.000010 +vt -0.000010 -10.708333 +vt 11.041667 10.708333 +vt 10.708333 11.041667 +vt 11.041667 11.041667 +vt 10.708333 -10.708333 +vt 10.708333 -10.375000 +vt 11.041667 -10.375000 +vt 11.041667 -10.708333 +vt 11.041667 10.375000 +vt 10.041667 11.041667 +vt 10.375000 11.041667 +vt 11.041667 10.041667 +vt 9.708333 11.041667 +vt 11.041667 9.708333 +vt 9.375000 11.041667 +vt 11.041667 9.375000 +vt 9.041667 11.041667 +vt 11.041667 9.041667 +vt 8.708333 11.041667 +vt 11.041667 8.708333 +vt 8.375000 11.041667 +vt 11.041667 8.375000 +vt 8.041667 11.041667 +vt 11.041667 8.041667 +vt 7.708333 11.041667 +vt 11.041667 7.708333 +vt 7.375000 11.041667 +vt 11.041667 7.375000 +vt 7.041667 11.041667 +vt 11.041667 7.041667 +vt 6.708333 11.041667 +vt 11.041667 6.708333 +vt 6.375000 11.041667 +vt 11.041667 6.375000 +vt 11.041661 -6.041677 +vt 11.041661 -6.375009 +vt 6.041657 -11.041674 +vt 6.374990 -11.041672 +vt 11.041662 -5.708343 +vt 5.708324 -11.041672 +vt 11.041662 -5.375009 +vt -11.041667 -5.375000 +vt -10.708333 -5.375000 +vt -10.708333 -5.708333 +vt -11.041667 -5.708333 +vt 11.041662 -5.041677 +vt 5.041657 -11.041672 +vt 5.374990 -11.041672 +vt 11.041663 -4.708343 +vt 4.708324 -11.041670 +vt 11.041663 -4.375010 +vt 4.374990 -11.041671 +vt 11.041663 -4.000010 +vt 3.999990 -11.041671 +vt 11.041664 -3.666677 +vt 3.666657 -11.041670 +vt 11.041664 -3.333343 +vt 3.333323 -11.041670 +vt 11.041664 -3.000010 +vt 2.999990 -11.041670 +vt 11.041665 -2.666677 +vt 2.666657 -11.041669 +vt 11.041665 -2.333343 +vt 2.333323 -11.041669 +vt 11.041665 -2.000010 +vt 1.999990 -11.041669 +vt 11.041665 -1.666677 +vt 1.666657 -11.041669 +vt 11.041666 -1.333343 +vt 1.333323 -11.041668 +vt 11.041666 -1.000010 +vt 0.999990 -11.041668 +vt 11.041666 -0.666677 +vt 0.666657 -11.041668 +vt 11.041667 -0.333343 +vt 0.333323 -11.041667 +vt 11.041667 -0.000010 +vt -0.000010 -11.041667 +vt 11.375000 11.041667 +vt 11.041667 11.375000 +vt 11.375000 11.375000 +vt 10.708333 11.375000 +vt 11.375000 10.708333 +vt 10.375000 11.375000 +vt 11.375000 10.375000 +vt 10.041667 11.375000 +vt 11.375000 10.041667 +vt 9.708333 11.375000 +vt 11.375000 9.708333 +vt 9.375000 11.375000 +vt 11.375000 9.375000 +vt 9.041667 11.375000 +vt 11.375000 9.041667 +vt 8.708333 11.375000 +vt 11.375000 8.708333 +vt 8.375000 11.375000 +vt 11.375000 8.375000 +vt 8.041667 11.375000 +vt 11.375000 8.041667 +vt 7.708333 11.375000 +vt 11.375000 7.708333 +vt 7.375000 11.375000 +vt 11.375000 7.375000 +vt 7.041667 11.375000 +vt 11.375000 7.041667 +vt 6.708333 11.375000 +vt 11.375000 6.708333 +vt 6.375000 11.375000 +vt 11.375000 6.375000 +vt 1.000000 -3.437500 +vt 0.062500 -3.437500 +vt -0.625000 -3.437500 +vt -1.625000 -3.437500 +vt -2.437500 -3.437500 +vt -2.437500 -2.437500 +vt -3.437500 -2.437500 +vt -3.437500 -1.625000 +vt -3.437500 -0.625000 +vt -3.437500 0.062500 +vt -3.437500 1.000000 +vt -3.437500 1.812500 +vt -3.437500 2.812500 +vt -3.437500 3.625000 +vt -2.437500 3.625000 +vt -2.437500 4.625000 +vt -1.625000 4.625000 +vt -0.625000 4.625000 +vt 0.062500 4.625000 +vt 1.000000 4.625000 +vt 1.812500 4.625000 +vt 2.812500 4.625000 +vt 3.625000 4.625000 +vt 3.625000 3.625000 +vt 4.625000 3.625000 +vt 4.625000 2.812500 +vt 4.625000 1.812500 +vt 4.625000 1.000000 +vt 4.625000 0.062500 +vt 4.625000 -0.625000 +vt 4.625000 -1.625000 +vt 4.625000 -2.437500 +vt 3.625000 -2.437500 +vt 3.625000 -3.437500 +vt 2.812500 -3.437500 +vt 1.812500 -3.437500 +s off +f 5/1 6/2 2/3 1/4 +f 1444/5 7/4 3/6 1446/7 +f 1448/4 8/3 4/8 1450/6 +f 1452/9 1442/1 1440/4 1454/5 +f 1441/10 1447/7 1451/11 1455/12 +f 1453/7 1449/6 1445/13 1443/11 +f 1476/14 1496/5 1460/7 12/10 +f 1480/6 1478/8 15/15 1462/13 +f 9/16 14/9 1481/5 10/14 +f 1487/17 1502/12 11/18 16/19 +f 1479/12 1477/11 1503/20 1488/18 +f 1460/21 17/10 18/12 19/17 +f 1491/11 1463/13 1504/22 1500/20 +f 21/23 1474/14 1485/10 22/21 +f 1501/13 1486/15 1483/24 1492/22 +f 1464/25 1461/16 1475/14 1505/23 +f 1496/26 23/19 17/27 1460/28 +f 25/19 1456/18 23/29 1496/27 +f 1458/30 28/17 13/19 24/26 +f 27/18 26/20 1489/31 1498/29 +f 1470/32 1465/21 1457/17 1459/30 +f 1499/20 1490/22 1497/33 1482/31 +f 23/34 29/23 30/21 17/32 +f 31/22 1469/24 20/35 32/33 +f 1472/36 1467/25 1466/23 1471/34 +f 1493/37 1484/28 1506/38 1494/39 +f 1495/28 1507/27 1468/40 1473/38 +f 1572/41 34/26 1567/28 1535/37 +f 37/27 38/29 1537/42 1569/40 +f 33/43 1550/30 1547/26 1517/41 +f 39/29 36/31 35/44 1570/42 +f 1551/45 1573/32 1536/30 1538/43 +f 1567/31 41/33 1528/46 43/44 +f 44/47 40/34 45/32 1530/45 +f 1533/33 1583/35 42/48 46/46 +f 1571/49 1568/36 1584/34 1534/47 +f 34/50 47/39 41/51 1567/52 +f 49/39 50/38 47/53 34/51 +f 51/54 52/37 1548/39 48/50 +f 1590/38 1585/40 1519/55 1592/53 +f 1593/56 1520/41 1518/37 1549/54 +f 1528/40 53/42 54/57 55/55 +f 56/58 1531/43 1576/41 58/56 +f 57/42 1545/44 1543/59 1511/57 +f 1512/60 1544/45 1581/43 1509/58 +f 1532/44 1529/46 1546/61 1577/59 +f 41/62 59/47 53/45 1528/60 +f 50/46 63/48 61/63 47/61 +f 65/64 1552/49 63/47 50/62 +f 67/65 68/52 1589/66 1578/67 +f 1539/52 66/51 1560/68 1541/66 +f 1579/69 1574/50 1553/52 1540/65 +f 1542/51 1561/53 1586/70 1591/68 +f 59/71 69/72 1556/73 53/74 +f 71/53 60/55 1508/75 1558/70 +f 1510/76 1582/56 70/54 72/77 +f 1559/55 1557/57 1562/78 1564/75 +f 61/79 1554/58 69/56 59/76 +f 63/57 75/59 1554/80 61/78 +f 76/81 64/60 62/58 1526/79 +f 1587/59 1594/61 1575/82 1580/80 +f 1525/83 73/84 1595/85 1588/86 +f 1554/61 1513/63 1521/87 69/82 +f 1515/88 74/64 1565/62 1523/89 +f 79/90 77/67 1555/91 1527/92 +f 1566/67 1563/66 78/93 80/91 +f 1524/94 1522/65 1514/67 1516/90 +f 1657/66 82/68 1617/95 1626/93 +f 85/96 86/69 1628/65 88/94 +f 87/68 84/70 1616/97 1638/95 +f 1614/98 81/77 1627/69 1629/96 +f 82/70 1657/75 89/99 90/97 +f 91/100 92/76 86/77 85/98 +f 81/101 1614/102 1615/103 1632/104 +f 93/105 1598/79 90/76 89/100 +f 1623/78 1621/80 92/106 91/107 +f 95/108 1599/81 1612/79 96/105 +f 1622/80 1613/82 1632/109 1615/106 +f 83/110 97/89 98/81 99/108 +f 100/82 1639/87 1630/111 1665/109 +f 101/112 1619/88 1655/89 102/110 +f 1640/113 1618/92 1620/114 1631/115 +f 105/92 106/91 103/116 94/114 +f 107/117 108/90 1624/92 104/113 +f 1646/91 1664/93 1601/118 1636/116 +f 1637/119 1602/94 1600/90 1625/117 +f 97/93 109/95 110/120 98/118 +f 111/121 100/96 1665/94 112/119 +f 102/95 1655/97 1656/122 1658/120 +f 106/123 117/98 115/96 103/121 +f 118/97 107/99 104/124 116/122 +f 1647/125 1659/100 1664/98 1646/123 +f 109/99 1603/107 1608/126 110/124 +f 1606/127 111/105 112/100 1610/125 +f 1658/103 1656/128 120/129 122/130 +f 1611/131 1609/108 119/105 121/127 +f 113/106 123/109 1603/132 109/133 +f 115/134 127/110 125/108 114/131 +f 117/109 129/111 127/135 115/132 +f 130/136 118/112 116/110 128/134 +f 1644/137 1650/115 1659/138 1647/139 +f 1642/115 1648/114 1651/140 1645/138 +f 123/141 131/113 132/115 1603/137 +f 133/114 124/116 1605/142 1653/140 +f 1607/143 1604/117 1634/113 134/141 +f 1654/116 1635/118 1633/144 1596/142 +f 125/145 135/119 131/117 123/143 +f 136/118 126/120 124/146 133/144 +f 1596/147 1633/121 1652/119 1597/145 +f 127/120 1660/122 135/148 125/146 +f 1662/149 1641/123 126/121 136/147 +f 138/122 137/124 1649/150 1643/148 +f 1597/151 1652/125 1661/123 1663/149 +f 1729/124 140/126 1688/152 1697/150 +f 143/153 144/127 1699/125 146/151 +f 145/126 142/133 1687/154 1709/152 +f 1685/155 139/131 1698/127 1700/153 +f 140/133 1729/132 147/156 148/154 +f 149/157 150/134 144/131 143/155 +f 139/132 1685/135 1686/158 1703/156 +f 151/159 1668/136 148/134 147/157 +f 1694/160 1692/139 150/161 149/162 +f 153/139 1669/138 1683/163 154/161 +f 1693/164 1684/137 1703/139 1686/160 +f 141/138 155/140 156/165 157/163 +f 158/166 1710/141 1701/137 1737/164 +f 159/140 1690/142 1727/167 160/165 +f 1711/168 1689/143 1691/141 1702/166 +f 163/142 164/144 161/169 152/167 +f 165/170 166/145 1695/143 162/168 +f 1717/144 1736/146 1671/171 1707/169 +f 1708/172 1672/147 1670/145 1696/170 +f 155/146 167/148 168/173 156/171 +f 169/174 158/149 1737/147 170/172 +f 160/148 1727/150 1728/175 1730/173 +f 164/176 173/151 171/149 161/174 +f 174/150 165/152 162/177 172/175 +f 1718/178 1731/153 1736/151 1717/176 +f 167/152 1674/154 1679/179 168/177 +f 1677/180 169/155 170/153 1681/178 +f 1730/154 1728/156 176/181 178/179 +f 1682/182 1680/157 175/155 177/180 +f 173/156 185/158 183/183 171/181 +f 186/184 174/159 172/157 184/182 +f 1715/185 1722/162 1731/186 1718/187 +f 1713/188 1720/189 1723/190 1716/191 +f 179/192 187/160 188/162 1673/185 +f 189/161 180/163 1676/193 1725/194 +f 1678/195 1675/164 1705/160 190/192 +f 1726/163 1706/165 1704/196 1666/193 +f 181/197 191/166 187/164 179/195 +f 192/165 182/167 180/198 189/196 +f 1666/199 1704/200 1724/201 1667/202 +f 1719/167 1732/169 191/203 181/198 +f 1734/204 1712/170 182/168 192/205 +f 194/169 193/171 1721/206 1714/203 +f 1667/207 1724/172 1733/170 1735/204 +f 1820/171 196/173 197/208 198/206 +f 199/209 200/174 201/172 1780/207 +f 1814/173 1778/175 1776/210 202/208 +f 1765/211 195/176 1779/174 1815/209 +f 196/175 1820/177 203/212 204/210 +f 205/213 206/178 200/176 199/211 +f 195/177 1765/179 1766/214 1819/212 +f 1806/215 208/180 204/178 203/213 +f 209/179 210/181 206/216 205/214 +f 1741/217 207/218 1819/219 1766/220 +f 211/181 212/183 208/221 1806/216 +f 213/222 214/184 210/182 209/223 +f 1742/224 1799/187 207/225 1741/226 +f 215/187 1771/186 212/227 211/225 +f 217/228 218/185 214/187 213/224 +f 1757/186 216/194 1800/229 1760/227 +f 1761/230 1801/192 1799/185 1742/228 +f 197/194 219/193 220/231 1767/229 +f 222/232 1781/195 1769/192 224/230 +f 223/193 221/196 1783/233 1789/231 +f 1782/234 1777/197 1768/195 1770/232 +f 196/196 225/198 219/235 197/233 +f 204/236 226/205 225/197 196/234 +f 208/198 227/203 226/237 204/235 +f 212/238 228/204 227/205 208/236 +f 1771/203 229/206 228/239 212/237 +f 1792/240 1813/207 229/204 1771/238 +f 1817/206 1794/208 1758/241 230/239 +f 233/242 232/209 231/207 234/240 +f 1795/243 1793/244 1772/245 1759/246 +f 219/247 235/211 236/209 220/242 +f 237/210 222/212 224/248 238/249 +f 1789/250 1783/213 1784/211 1746/247 +f 225/212 239/214 235/251 219/248 +f 229/252 241/215 240/213 228/250 +f 1813/214 1802/216 241/253 229/251 +f 1818/254 1817/223 230/215 242/252 +f 244/216 243/221 232/255 233/253 +f 235/256 245/222 1787/223 236/254 +f 247/257 237/226 238/258 248/259 +f 1746/226 1784/225 246/260 1747/258 +f 239/261 249/224 245/226 235/257 +f 241/225 251/227 250/262 240/260 +f 1802/263 253/228 251/224 241/261 +f 1821/227 1818/229 242/264 252/262 +f 254/265 1785/230 243/228 244/263 +f 245/229 255/231 256/266 1787/264 +f 257/267 247/232 248/230 258/265 +f 1747/231 246/233 1788/268 1748/266 +f 249/269 259/234 255/232 245/267 +f 251/233 263/235 262/270 250/268 +f 253/271 1786/236 263/234 251/269 +f 1803/235 1821/237 252/272 264/270 +f 266/273 265/274 1785/275 254/276 +f 255/237 267/239 1753/277 256/272 +f 1773/278 257/240 258/238 1755/279 +f 1748/239 1788/241 268/280 270/277 +f 1756/281 1754/242 1807/240 1774/278 +f 259/241 271/249 267/282 255/280 +f 260/283 273/247 271/242 259/281 +f 261/249 275/248 273/284 260/282 +f 262/285 277/250 275/247 261/283 +f 263/248 279/251 277/286 262/284 +f 1786/287 1809/252 279/250 263/285 +f 282/251 1803/253 264/288 1762/286 +f 1804/289 281/254 265/252 266/287 +f 1763/253 1749/255 1810/290 1805/288 +f 271/291 283/256 284/254 267/289 +f 285/292 272/259 269/293 286/294 +f 1775/259 1808/258 1797/295 1744/293 +f 1745/296 1798/297 1796/298 1743/299 +f 273/258 1816/260 283/300 271/295 +f 1811/301 274/261 272/257 285/302 +f 1743/260 1796/262 287/303 288/300 +f 275/304 1790/263 1816/261 273/301 +f 1812/262 276/264 274/305 1811/303 +f 288/306 287/265 289/263 290/304 +f 277/264 291/266 1790/307 275/305 +f 292/308 278/267 276/265 1812/306 +f 290/266 289/268 1791/309 1738/307 +f 279/310 293/269 291/267 277/308 +f 294/268 280/270 278/311 292/309 +f 1739/312 1751/271 1750/269 1764/310 +f 1738/270 1791/272 1752/313 1740/311 +f 1908/314 296/279 297/271 298/312 +f 299/272 300/277 301/315 1867/313 +f 1902/316 1865/278 1862/279 302/314 +f 1850/277 295/280 1866/317 1903/315 +f 296/318 1908/281 303/278 304/316 +f 305/280 306/282 300/319 299/317 +f 295/320 1850/283 1851/281 1907/318 +f 1893/282 308/284 304/321 303/319 +f 309/322 310/285 306/283 305/320 +f 1825/284 307/286 1907/323 1851/321 +f 311/324 312/287 308/285 1893/322 +f 313/286 314/288 310/325 309/323 +f 1826/326 1886/289 307/287 1825/324 +f 315/288 1856/290 312/327 311/325 +f 317/328 318/291 314/289 313/326 +f 1842/329 316/294 1887/330 1845/331 +f 1846/294 1888/293 1886/332 1826/330 +f 1863/333 319/292 320/294 1852/329 +f 322/293 1868/295 1854/334 324/332 +f 323/335 321/302 1870/292 1876/333 +f 1869/295 1864/300 1853/336 1855/334 +f 1879/337 1901/301 325/302 1857/335 +f 1905/300 1881/303 1843/338 326/336 +f 329/339 328/304 327/301 330/337 +f 1882/303 1880/305 1858/340 1844/338 +f 319/341 331/306 332/304 320/339 +f 333/305 322/307 324/342 334/340 +f 1876/343 1870/308 1871/306 1830/341 +f 1901/307 1889/309 335/344 325/342 +f 1906/345 1905/310 326/308 336/343 +f 338/309 337/311 328/346 329/344 +f 331/347 339/312 1874/310 332/345 +f 341/311 333/313 334/348 342/346 +f 1830/349 1871/350 340/351 1831/352 +f 1889/313 345/315 343/353 335/348 +f 1909/354 1906/316 336/314 344/355 +f 346/315 1872/317 337/356 338/353 +f 339/357 347/318 348/316 1874/354 +f 349/317 341/319 342/358 350/356 +f 1831/359 340/320 1875/318 1832/357 +f 345/319 1873/321 351/360 343/358 +f 1890/361 1909/322 344/320 352/359 +f 354/362 353/363 1872/364 346/365 +f 347/366 1894/324 1838/322 348/361 +f 1859/323 349/325 350/367 1840/368 +f 1832/369 1875/370 356/371 358/372 +f 1841/325 1839/327 1895/373 1860/367 +f 1873/374 1897/328 1834/326 351/375 +f 370/376 1890/331 352/377 1847/378 +f 1891/331 369/330 353/379 354/377 +f 1848/380 1833/329 1898/331 1892/376 +f 359/330 371/332 372/381 355/379 +f 373/382 360/333 357/329 374/380 +f 1861/332 1896/334 1884/383 1828/381 +f 1829/384 1885/335 1883/333 1827/382 +f 361/334 1904/336 371/385 359/383 +f 1899/386 362/337 360/335 373/384 +f 1827/336 1883/338 375/387 376/385 +f 363/388 1877/339 1904/337 361/386 +f 1900/338 364/340 362/389 1899/387 +f 376/390 375/341 377/339 378/388 +f 365/340 379/342 1877/391 363/389 +f 380/392 366/343 364/341 1900/390 +f 378/342 377/344 1878/393 1822/391 +f 367/394 381/345 379/343 365/392 +f 382/344 368/346 366/395 380/393 +f 1823/396 1836/347 1835/345 1849/394 +f 1822/346 1878/348 1837/397 1824/395 +f 1996/398 384/355 385/347 386/396 +f 387/348 388/353 389/399 1955/397 +f 1990/400 1953/354 1950/355 390/398 +f 1938/353 383/356 1954/401 1991/399 +f 384/402 1996/357 391/354 392/400 +f 393/356 394/358 388/403 387/401 +f 383/404 1938/359 1939/357 1995/402 +f 1981/358 396/360 392/405 391/403 +f 397/406 398/361 394/359 393/404 +f 1913/360 395/368 1995/407 1939/405 +f 399/408 400/366 396/361 1981/406 +f 401/368 402/367 398/409 397/407 +f 1914/410 1974/375 395/366 1913/408 +f 403/367 1944/373 400/411 399/409 +f 405/412 406/374 402/375 401/410 +f 1930/413 404/378 1975/414 1933/415 +f 1934/378 1976/377 1974/416 1914/414 +f 1951/417 407/376 408/378 1940/413 +f 410/377 1956/379 1942/418 412/416 +f 411/419 409/380 1958/376 1964/417 +f 1957/379 1952/381 1941/420 1943/418 +f 1967/421 1989/382 413/380 1945/419 +f 1993/381 1969/383 1931/422 414/420 +f 417/423 416/384 415/382 418/421 +f 1970/383 1968/385 1946/424 1932/422 +f 407/425 419/386 420/384 408/423 +f 421/385 410/387 412/426 422/424 +f 1964/427 1958/388 1959/386 1918/425 +f 1989/387 1977/389 423/428 413/426 +f 1994/429 1993/390 414/388 424/427 +f 426/389 425/391 416/430 417/428 +f 419/431 427/392 1962/390 420/429 +f 429/391 421/393 422/432 430/430 +f 1918/433 1959/394 428/392 1919/431 +f 1977/393 433/395 431/434 423/432 +f 1997/435 1994/396 424/394 432/433 +f 434/436 1960/437 425/438 426/439 +f 427/440 435/398 436/396 1962/435 +f 437/397 429/399 430/441 438/442 +f 1919/443 428/400 1963/398 1920/440 +f 433/399 1961/401 439/444 431/441 +f 1978/445 1997/402 432/400 440/443 +f 442/401 441/403 1960/446 434/444 +f 435/447 1982/404 1926/402 436/445 +f 1947/403 437/405 438/448 1928/446 +f 1920/449 1963/406 444/404 446/447 +f 1929/405 1927/407 1983/450 1948/448 +f 1961/451 1985/408 1922/406 439/449 +f 458/407 1978/409 440/452 1935/450 +f 1979/453 457/410 441/408 442/451 +f 1936/409 1921/411 1986/454 1980/452 +f 447/455 459/412 460/410 443/453 +f 461/456 448/457 445/458 462/459 +f 1949/415 1984/414 1972/460 1916/461 +f 1917/462 1973/413 1971/415 1915/463 +f 449/414 1992/416 459/464 447/460 +f 1987/465 450/417 448/413 461/462 +f 1915/466 1971/467 463/468 464/469 +f 451/470 1965/419 1992/417 449/465 +f 1988/418 452/420 450/471 1987/472 +f 464/473 463/421 465/419 466/470 +f 453/420 467/422 1965/474 451/471 +f 468/475 454/423 452/421 1988/473 +f 466/422 465/424 1966/476 1910/474 +f 455/477 469/425 467/423 453/475 +f 470/424 456/426 454/478 468/476 +f 1911/479 1924/427 1923/425 1937/477 +f 1910/426 1966/428 1925/480 1912/478 +f 471/481 472/429 473/427 474/479 +f 475/428 476/430 477/482 478/480 +f 2057/483 2024/431 2022/429 2060/481 +f 2092/484 2082/485 2025/486 2058/487 +f 472/488 471/433 479/431 480/483 +f 481/432 2096/434 476/489 475/490 +f 2082/491 2092/435 482/433 2074/488 +f 2043/434 484/442 480/492 479/489 +f 485/493 486/440 2096/435 481/491 +f 2004/442 483/441 2074/494 482/492 +f 487/495 488/443 484/440 2043/493 +f 489/441 490/444 486/496 485/494 +f 2005/497 2037/445 483/443 2004/495 +f 491/444 492/446 488/498 487/496 +f 493/499 494/447 490/445 489/497 +f 2086/446 2101/448 2038/500 2053/498 +f 2054/501 2039/449 2037/447 2005/499 +f 473/448 495/450 2069/502 497/500 +f 498/503 2059/451 499/449 2071/501 +f 2090/450 2083/452 496/504 500/502 +f 2061/505 2023/453 2084/451 2091/503 +f 472/452 501/454 495/506 473/504 +f 492/507 503/455 502/453 488/505 +f 2049/508 2044/459 503/509 492/510 +f 2046/459 2051/458 2085/511 504/509 +f 507/512 506/456 505/459 508/508 +f 2052/461 2050/460 2102/513 2087/514 +f 2069/515 509/462 2066/463 511/516 +f 512/460 2072/464 513/517 2115/513 +f 2112/518 2067/465 510/462 514/515 +f 2073/464 2070/472 2068/519 2113/517 +f 495/520 515/470 509/465 2069/518 +f 2044/472 517/471 516/521 503/519 +f 519/522 2021/473 517/470 2044/520 +f 2016/471 522/474 2047/523 518/521 +f 521/524 520/525 2019/526 2017/527 +f 2018/474 2020/476 2045/528 2048/523 +f 509/529 523/477 524/475 2066/530 +f 525/476 512/478 2115/531 2116/528 +f 514/532 510/479 2062/477 526/529 +f 2021/478 529/480 527/533 517/531 +f 530/534 2016/481 518/479 528/532 +f 2103/480 2104/482 520/535 521/533 +f 523/536 531/483 532/481 524/534 +f 533/482 525/490 2116/537 2111/535 +f 526/538 2062/488 2063/483 534/536 +f 529/490 538/489 536/539 527/537 +f 539/540 530/491 528/488 537/538 +f 2014/489 2064/492 2104/541 2103/539 +f 531/542 540/493 541/491 532/540 +f 542/492 533/494 2111/543 543/541 +f 534/544 2063/495 2114/493 2031/542 +f 536/494 547/496 546/545 535/543 +f 538/546 2065/497 547/495 536/544 +f 550/496 539/498 537/547 548/545 +f 2015/548 549/499 2064/497 2014/546 +f 540/498 551/500 552/549 541/547 +f 2040/550 542/501 543/499 554/548 +f 2031/500 2114/502 2002/551 2032/549 +f 2033/552 2003/503 2000/501 553/550 +f 544/502 555/504 551/553 540/551 +f 546/554 560/505 559/503 545/552 +f 547/504 562/506 560/555 546/553 +f 2065/556 564/507 562/505 547/554 +f 565/557 550/510 548/558 2094/559 +f 2108/510 2077/509 549/560 2015/558 +f 2093/561 2075/508 2078/510 2109/557 +f 555/509 566/511 567/562 551/560 +f 2105/563 556/512 2041/508 569/561 +f 2042/564 2001/565 2097/566 2099/567 +f 2100/568 2098/515 2088/516 2106/569 +f 557/513 570/517 566/570 555/571 +f 559/572 576/518 574/515 558/568 +f 560/517 2026/519 576/573 559/570 +f 562/574 2006/520 2026/518 560/572 +f 2008/519 563/521 561/575 2028/573 +f 581/576 580/522 2076/520 2095/574 +f 579/521 578/523 2007/577 2009/575 +f 570/578 582/530 2010/522 566/576 +f 584/523 571/528 568/579 2012/577 +f 2107/580 2089/529 583/530 585/578 +f 2013/528 2011/531 2110/581 2055/579 +f 572/582 586/532 582/529 570/580 +f 587/531 573/533 571/583 584/581 +f 2055/584 2110/534 1998/532 2056/582 +f 574/533 588/535 586/585 572/583 +f 2117/586 575/536 573/534 587/584 +f 2056/535 1998/537 1999/587 589/585 +f 576/588 590/538 588/536 574/586 +f 591/537 577/539 575/589 2117/587 +f 589/590 1999/591 2034/592 2079/593 +f 2026/539 592/541 590/594 576/589 +f 593/595 2029/542 577/540 591/596 +f 2080/597 2035/598 2027/599 2030/600 +f 2079/601 2034/544 2036/542 2081/595 +f 594/543 595/545 596/602 597/603 +f 598/604 599/546 600/544 601/601 +f 2181/605 2146/606 2144/607 2184/608 +f 2219/609 2208/548 2147/546 2182/604 +f 595/547 594/549 602/610 603/611 +f 604/612 2223/550 599/548 598/609 +f 2208/613 2219/614 605/615 2199/616 +f 2166/617 607/552 603/550 602/612 +f 608/551 609/553 2223/618 604/619 +f 2125/620 606/554 2199/552 605/617 +f 610/553 611/555 607/621 2166/618 +f 612/622 613/556 609/554 608/620 +f 2126/623 2160/559 606/624 2125/625 +f 614/559 615/558 611/626 610/624 +f 616/627 617/557 613/559 612/623 +f 2212/558 2228/560 2161/628 2177/626 +f 2178/629 2162/561 2160/557 2126/627 +f 2143/560 618/562 2194/630 620/628 +f 621/631 2183/563 622/561 2196/629 +f 2217/632 2209/571 619/633 623/634 +f 2185/635 2145/568 2210/569 2218/636 +f 2173/571 2167/570 624/637 2229/633 +f 2170/638 2175/572 2211/568 625/635 +f 628/570 627/573 626/639 629/637 +f 2176/640 2174/574 2230/572 2213/638 +f 2193/573 630/575 2190/641 632/639 +f 633/642 2197/576 634/574 2243/640 +f 2240/575 2191/577 631/643 635/641 +f 2198/644 2195/578 2192/576 2241/642 +f 638/577 2142/579 636/645 2168/643 +f 2137/646 641/580 2171/578 637/644 +f 640/579 639/581 2140/647 2138/645 +f 2139/648 2141/582 2169/580 2172/646 +f 630/581 642/583 643/649 2190/647 +f 644/650 633/584 2243/582 2244/648 +f 635/583 631/585 2186/651 645/649 +f 2142/652 648/586 646/584 636/650 +f 649/585 2137/587 637/653 647/651 +f 2231/654 2232/588 639/586 640/652 +f 642/587 650/589 651/655 643/653 +f 652/656 644/596 2244/588 2239/654 +f 645/589 2186/594 2187/657 653/655 +f 648/658 656/595 654/596 646/656 +f 657/594 649/603 647/659 655/657 +f 2135/660 2188/661 2232/662 2231/663 +f 650/603 658/602 659/664 651/659 +f 660/665 652/604 2239/601 661/666 +f 653/602 2187/611 2242/667 2154/664 +f 656/668 2189/609 662/604 654/665 +f 665/611 657/610 655/669 663/667 +f 2136/670 664/612 2188/609 2135/668 +f 658/610 666/619 667/671 659/669 +f 2163/672 660/617 661/612 669/670 +f 2154/615 2242/673 2123/674 2155/675 +f 2156/676 2124/620 2120/617 668/672 +f 2189/618 676/621 674/677 662/678 +f 677/679 665/622 663/620 2221/676 +f 2236/680 2203/625 664/681 2136/682 +f 2220/625 2201/624 2204/683 2237/681 +f 670/684 2214/623 679/625 2121/680 +f 2233/624 671/626 2164/685 681/683 +f 2165/686 2122/627 2224/623 2226/684 +f 2227/626 2225/628 2215/687 2234/685 +f 2200/688 2127/629 2149/627 672/686 +f 2129/628 675/630 673/689 2151/687 +f 693/690 692/631 2202/629 2222/688 +f 691/691 690/692 2128/693 2130/694 +f 682/695 694/635 2131/636 678/696 +f 696/633 683/637 680/697 2133/698 +f 2235/699 2216/638 695/635 697/695 +f 2134/637 2132/639 2238/700 2179/697 +f 684/701 698/640 694/638 682/699 +f 699/639 685/641 683/702 696/700 +f 2179/703 2238/642 2118/640 2180/701 +f 686/641 700/643 698/704 684/702 +f 2245/705 687/644 685/642 699/703 +f 2180/643 2118/645 2119/706 701/704 +f 688/707 702/646 700/644 686/705 +f 703/645 689/647 687/708 2245/706 +f 701/709 2119/710 2157/711 2205/712 +f 2148/647 704/649 702/713 688/708 +f 705/714 2152/650 689/648 703/715 +f 2206/649 2158/651 2150/716 2153/713 +f 2205/717 2157/652 2159/650 2207/714 +f 706/651 707/653 708/718 709/716 +f 710/719 711/654 712/652 713/717 +f 2309/653 2274/655 2272/720 2312/718 +f 2347/721 2336/656 2275/654 2310/719 +f 707/655 706/657 714/722 715/720 +f 716/723 2351/658 711/656 710/721 +f 2336/657 2347/659 717/724 2327/722 +f 2294/725 719/666 715/658 714/723 +f 720/659 721/664 2351/726 716/724 +f 2253/727 718/665 2327/666 717/725 +f 722/664 723/667 719/728 2294/726 +f 724/729 725/668 721/665 720/727 +f 2254/730 2288/731 718/732 2253/733 +f 726/734 727/670 723/668 722/729 +f 728/669 729/671 725/735 724/736 +f 2340/737 2356/672 2289/670 2305/734 +f 2306/671 2290/678 2288/738 2254/735 +f 2271/739 730/676 2322/672 732/737 +f 733/678 2311/677 734/740 2324/738 +f 2345/741 2337/679 731/676 735/739 +f 2313/742 2273/682 2338/743 2346/744 +f 2301/682 2295/681 736/745 2357/743 +f 2298/746 2303/680 2339/682 737/742 +f 740/681 739/683 738/747 741/745 +f 2304/748 2302/684 2358/680 2341/746 +f 2321/683 742/685 2318/749 744/747 +f 745/750 2325/686 746/684 2371/748 +f 2368/685 2319/687 743/751 747/749 +f 2326/752 2323/688 2320/686 2369/750 +f 750/687 2270/689 748/753 2296/751 +f 2265/754 753/690 2299/688 749/752 +f 752/694 751/693 2268/755 2266/756 +f 2267/757 2269/695 2297/696 2300/758 +f 742/698 754/697 755/759 2318/760 +f 756/761 745/699 2371/695 2372/757 +f 747/697 743/700 2314/762 757/759 +f 2270/763 760/701 758/699 748/761 +f 761/700 2265/702 749/764 759/762 +f 2359/765 2360/703 751/701 752/763 +f 754/702 762/704 763/766 755/764 +f 764/767 756/705 2372/703 2367/765 +f 757/704 2314/706 2315/768 765/766 +f 760/769 768/707 766/705 758/767 +f 769/706 761/708 759/770 767/768 +f 2263/771 2316/715 2360/707 2359/769 +f 762/708 770/713 771/772 763/770 +f 772/773 764/714 2367/715 773/771 +f 765/713 2315/716 2370/774 2282/772 +f 768/775 2317/717 774/714 766/773 +f 777/716 769/718 767/776 775/774 +f 2264/777 776/719 2316/717 2263/775 +f 770/718 778/720 779/778 771/776 +f 2291/779 772/721 773/719 781/777 +f 2282/720 2370/722 2251/780 2283/778 +f 2284/781 2252/723 2248/721 780/779 +f 2317/722 788/724 786/782 774/780 +f 789/783 777/725 775/723 2349/781 +f 2364/724 2331/726 776/784 2264/782 +f 2348/785 2329/727 2332/725 2365/783 +f 782/726 2342/728 791/786 2249/784 +f 2361/787 783/729 2292/727 793/785 +f 2293/728 2250/736 2352/788 2354/786 +f 2355/789 2353/734 2343/729 2362/787 +f 2328/736 2255/735 2277/790 784/788 +f 2257/791 787/737 785/734 2279/789 +f 805/735 804/738 2330/792 2350/790 +f 803/793 802/739 2256/737 2258/791 +f 794/738 806/740 2259/794 790/792 +f 808/795 795/741 792/739 2261/793 +f 2363/796 2344/744 807/797 809/798 +f 2262/744 2260/743 2366/799 2307/797 +f 796/800 810/742 806/744 794/796 +f 811/743 797/745 795/801 808/799 +f 2307/802 2366/746 2246/742 2308/800 +f 798/745 812/747 810/803 796/801 +f 2373/804 799/748 797/746 811/802 +f 2308/747 2246/749 2247/805 813/803 +f 800/806 814/750 812/748 798/804 +f 815/749 801/751 799/807 2373/805 +f 813/808 2247/752 2285/750 2333/806 +f 2276/751 816/753 814/809 800/807 +f 817/810 2280/754 801/752 815/808 +f 2334/811 2286/760 2278/812 2281/813 +f 2333/814 2285/757 2287/758 2335/815 +f 818/760 819/759 820/816 821/812 +f 822/817 823/761 824/757 825/814 +f 2426/759 2389/762 2387/818 2428/816 +f 2448/819 2442/763 2390/761 2427/817 +f 819/762 818/764 826/820 827/818 +f 828/821 2449/765 823/763 822/819 +f 2442/764 2448/766 829/822 2435/820 +f 2412/823 831/767 827/765 826/821 +f 832/766 833/768 2449/824 828/822 +f 2374/825 830/826 2435/827 829/828 +f 834/768 835/770 831/829 2412/824 +f 836/830 837/771 833/769 832/831 +f 2375/770 2395/772 830/832 2374/829 +f 838/833 839/773 835/771 834/830 +f 840/772 841/774 837/834 836/832 +f 2415/835 2396/775 2395/773 2375/833 +f 842/774 843/776 839/836 838/834 +f 844/837 845/777 841/775 840/835 +f 2464/776 2467/778 2396/838 2415/836 +f 846/839 847/779 843/777 842/837 +f 2421/778 849/780 845/840 844/838 +f 2422/841 2399/781 2468/779 2494/839 +f 2495/780 2469/782 2467/842 2464/840 +f 820/843 850/783 851/781 852/841 +f 853/782 2429/784 854/844 2474/842 +f 2480/845 2431/785 2484/783 2475/843 +f 2430/846 2388/847 2432/848 2481/849 +f 819/850 856/787 850/785 820/845 +f 827/786 857/788 856/851 819/852 +f 843/853 859/789 858/787 839/850 +f 847/788 860/790 859/854 843/851 +f 862/855 2440/791 860/789 847/853 +f 2416/790 865/792 848/856 861/854 +f 2417/857 863/793 2401/791 2424/855 +f 2425/792 2402/794 2400/858 2423/856 +f 851/859 866/795 867/793 2497/857 +f 869/860 855/798 870/861 871/862 +f 2376/798 868/797 2472/863 2378/861 +f 2476/864 2485/796 2498/798 2377/860 +f 850/797 872/799 866/865 851/863 +f 856/866 873/800 872/796 850/864 +f 860/799 875/801 874/867 859/865 +f 2440/868 876/802 875/800 860/866 +f 2403/801 879/803 876/869 2440/867 +f 880/870 2405/804 864/802 877/868 +f 2439/803 2452/805 878/871 881/869 +f 2406/872 2404/806 2441/804 2418/870 +f 866/805 882/807 2473/873 867/871 +f 884/874 869/808 871/806 885/872 +f 2378/875 2472/876 883/877 2419/878 +f 872/879 886/810 882/808 866/874 +f 876/813 888/812 887/880 875/881 +f 879/882 2453/814 888/815 876/883 +f 2456/812 880/816 877/884 889/880 +f 891/885 890/817 2452/814 2439/882 +f 882/816 892/818 893/886 2473/884 +f 894/887 884/819 885/817 895/885 +f 2419/818 883/820 2450/888 2420/886 +f 886/889 896/821 892/819 882/887 +f 888/820 898/822 897/890 887/888 +f 2453/891 900/823 898/821 888/889 +f 901/822 2456/824 889/892 899/890 +f 2482/893 2483/831 890/823 891/891 +f 892/824 902/829 2451/894 893/892 +f 904/895 894/830 895/831 2461/893 +f 2420/829 2450/832 903/896 905/894 +f 900/897 910/833 908/830 898/895 +f 911/832 901/834 899/898 909/896 +f 2413/899 2478/835 2483/833 2482/897 +f 902/834 912/836 2486/900 2451/898 +f 914/901 904/837 2461/835 2509/899 +f 905/836 903/838 913/902 915/900 +f 906/903 916/839 912/837 902/901 +f 908/838 918/840 917/904 907/902 +f 910/905 2479/841 918/839 908/903 +f 921/840 911/842 909/906 919/904 +f 2414/907 920/843 2478/841 2413/905 +f 912/842 922/844 923/908 2486/906 +f 924/909 914/845 2509/843 925/907 +f 915/849 913/848 2493/910 2477/911 +f 916/912 926/850 922/845 912/909 +f 918/852 930/851 929/913 917/914 +f 2479/915 2499/853 930/850 918/912 +f 2501/851 921/854 919/916 931/913 +f 933/917 932/855 920/853 2414/915 +f 922/854 934/856 2383/918 923/916 +f 2436/919 924/857 925/855 2385/917 +f 2477/856 2493/858 935/920 937/918 +f 2386/921 2384/859 2459/857 2437/919 +f 926/922 938/862 934/923 922/924 +f 927/862 940/861 938/925 926/923 +f 929/926 946/860 945/862 928/922 +f 930/861 2407/863 946/927 929/925 +f 2499/928 2391/929 2407/930 930/931 +f 2393/863 2501/865 931/932 2409/927 +f 951/933 950/866 932/864 933/934 +f 949/865 948/867 2392/935 2394/932 +f 938/936 952/868 953/866 934/933 +f 2444/867 939/869 936/937 2397/935 +f 2438/938 2460/870 2381/868 955/936 +f 2398/869 2382/871 2379/939 2443/937 +f 940/940 956/872 952/870 938/938 +f 941/871 958/873 956/941 940/939 +f 942/942 960/874 958/872 941/940 +f 944/873 964/943 962/944 943/941 +f 945/945 966/879 964/874 944/942 +f 946/881 968/880 966/946 945/947 +f 2407/948 970/882 968/883 946/949 +f 971/880 2410/884 947/950 969/946 +f 2457/951 2470/885 2408/882 2411/948 +f 2505/884 2507/886 2471/952 2458/950 +f 956/953 972/887 2454/885 952/951 +f 974/886 957/888 954/954 975/952 +f 2445/955 2380/956 973/957 2446/958 +f 2447/888 2455/890 2433/959 2502/954 +f 958/960 976/891 972/889 956/961 +f 977/890 959/892 957/962 974/959 +f 2502/963 2433/893 2434/891 2500/960 +f 960/892 978/894 976/964 958/962 +f 979/965 961/895 959/893 977/963 +f 2500/894 2434/896 2462/966 2465/964 +f 962/967 980/897 978/895 960/965 +f 981/896 963/898 961/968 979/966 +f 2465/969 2462/970 2463/971 2466/972 +f 964/898 982/900 980/973 962/968 +f 983/974 965/901 963/899 981/975 +f 2466/900 2463/902 2496/976 2503/973 +f 966/977 984/903 982/901 964/974 +f 2487/902 967/904 965/978 983/976 +f 2503/979 2496/905 2490/903 985/977 +f 968/904 986/906 984/980 966/978 +f 987/981 2504/907 967/905 2487/979 +f 2488/906 2491/908 2508/982 2506/980 +f 985/983 2490/909 2492/907 2489/981 +f 988/908 989/914 990/984 991/982 +f 992/985 993/912 994/909 995/983 +f 2563/914 2525/913 2523/986 2565/984 +f 2585/987 2579/915 2526/912 2564/985 +f 989/913 988/916 996/988 997/986 +f 998/989 2586/917 993/915 992/987 +f 2579/916 2585/918 999/990 2572/988 +f 2549/991 1001/919 997/917 996/989 +f 1002/918 1003/920 2586/992 998/990 +f 2510/993 1000/921 2572/919 999/991 +f 1004/994 1005/924 1001/995 2549/996 +f 1006/924 1007/923 1003/997 1002/995 +f 2511/998 2531/922 1000/924 2510/994 +f 1008/923 1009/925 1005/999 1004/997 +f 1010/1000 1011/926 1007/922 1006/998 +f 2552/925 2532/927 2531/1001 2511/999 +f 1012/1002 1013/934 1009/926 1008/1000 +f 1014/927 1015/932 1011/1003 1010/1001 +f 2601/1004 2604/933 2532/934 2552/1002 +f 1016/932 1017/935 1013/1005 1012/1003 +f 2558/1006 1019/936 1015/933 1014/1004 +f 2559/935 2535/937 2605/1007 2631/1005 +f 2632/1008 2606/938 2604/936 2601/1006 +f 990/937 1020/939 1021/1009 1022/1007 +f 1023/1010 2566/940 1024/938 2611/1008 +f 2617/939 2568/941 2621/1011 2612/1009 +f 2567/1012 2524/942 2569/940 2618/1010 +f 989/941 1026/944 1020/1013 990/1011 +f 1017/1014 1028/945 1027/942 1013/1012 +f 1030/947 2577/946 1028/1015 1017/1016 +f 2553/1017 1033/948 1018/949 1029/1018 +f 2554/946 1031/950 2537/1019 2561/1015 +f 2562/1020 2538/951 2536/948 2560/1017 +f 1021/950 1034/952 1035/1021 2634/1019 +f 1037/1022 1025/953 1038/951 1039/1020 +f 2512/952 1036/954 2609/1023 2514/1021 +f 2613/1024 2622/961 2635/953 2513/1022 +f 1020/954 1040/959 1034/1025 1021/1023 +f 2577/1026 1042/960 1041/961 1028/1024 +f 2539/959 1045/962 1042/1027 2577/1025 +f 1046/1028 2541/963 1032/960 1043/1026 +f 2576/1029 2589/1030 1044/1031 1047/1032 +f 2542/1033 2540/965 2578/963 2555/1028 +f 1034/964 1048/966 2610/1034 1035/1035 +f 1050/1036 1037/967 1039/965 1051/1033 +f 2514/1037 2609/1038 1049/1039 2556/1040 +f 1045/1041 2590/975 1052/967 1042/1036 +f 2593/968 1046/973 1043/1042 1053/1043 +f 1055/1044 1054/974 2589/975 2576/1041 +f 1048/973 1056/976 1057/1045 2610/1042 +f 1058/1046 1050/977 1051/974 1059/1044 +f 2556/976 1049/978 2587/1047 2557/1045 +f 2590/1048 1062/979 1060/977 1052/1046 +f 1063/978 2593/980 1053/1049 1061/1047 +f 2619/1050 2620/981 1054/979 1055/1048 +f 1056/980 1064/982 2588/1051 1057/1049 +f 1066/1052 1058/983 1059/981 2598/1050 +f 2557/982 2587/984 1065/1053 1067/1051 +f 1062/1054 1070/985 1068/983 1060/1052 +f 1071/984 1063/986 1061/1055 1069/1053 +f 2550/1056 2615/1057 2620/1058 2619/1059 +f 1064/986 1072/988 2623/1060 2588/1055 +f 1074/1061 1066/989 2598/987 2646/1062 +f 1067/988 1065/990 1073/1063 1075/1060 +f 1070/1064 2616/991 1076/989 1068/1061 +f 1079/990 1071/992 1069/1065 1077/1063 +f 2551/1066 1078/993 2615/991 2550/1064 +f 1072/1067 1080/996 1081/1068 2623/1069 +f 1082/996 1074/995 2646/1070 1083/1068 +f 1075/1071 1073/994 2630/996 2614/1067 +f 2616/995 2636/997 1085/1072 1076/1070 +f 2638/1073 1079/998 1077/994 1086/1071 +f 1088/997 1087/999 1078/1074 2551/1072 +f 1080/1075 1089/1000 2519/998 1081/1073 +f 2573/999 1082/1001 1083/1076 2521/1074 +f 2614/1077 2630/1002 1090/1000 1092/1075 +f 2522/1001 2520/1003 2596/1078 2574/1076 +f 1084/1079 1093/1004 1089/1002 1080/1077 +f 2636/1003 2527/1005 2543/1080 1085/1078 +f 2529/1081 2638/1006 1086/1004 2546/1079 +f 1102/1005 1101/1007 1087/1082 1088/1080 +f 1100/1083 1099/1008 2528/1006 2530/1081 +f 1093/1007 1103/1009 1104/1084 1089/1082 +f 2581/1085 1094/1010 1091/1008 2533/1083 +f 2575/1086 2597/1087 2517/1088 1106/1089 +f 2534/1090 2518/1012 2515/1010 2580/1085 +f 1095/1011 1107/1013 1103/1091 1093/1092 +f 1097/1093 1119/1014 1117/1012 1096/1090 +f 2544/1016 1121/1015 1119/1094 1097/1095 +f 1122/1096 2547/1017 1098/1018 1120/1097 +f 2594/1015 2607/1019 2545/1098 2548/1094 +f 2642/1099 2644/1020 2608/1017 2595/1096 +f 1107/1019 1123/1021 2591/1100 1103/1098 +f 1125/1101 1108/1022 1105/1020 1126/1099 +f 2582/1021 2516/1023 1124/1102 2583/1100 +f 2584/1103 2592/1104 2570/1105 2639/1106 +f 1109/1023 1127/1025 1123/1107 1107/1102 +f 1128/1108 1110/1026 1108/1024 1125/1109 +f 2639/1025 2570/1027 2571/1110 2637/1107 +f 1111/1111 1129/1028 1127/1026 1109/1108 +f 1130/1027 1112/1035 1110/1112 1128/1110 +f 2637/1113 2571/1033 2599/1028 2602/1111 +f 1113/1035 1131/1034 1129/1114 1111/1112 +f 1132/1115 1114/1036 1112/1033 1130/1113 +f 2602/1034 2599/1043 2600/1116 2603/1114 +f 1115/1117 1133/1041 1131/1036 1113/1115 +f 1134/1043 1116/1042 1114/1118 1132/1116 +f 2603/1119 2600/1044 2633/1041 2640/1117 +f 1117/1042 1135/1045 1133/1120 1115/1118 +f 2624/1121 1118/1046 1116/1044 1134/1119 +f 2640/1045 2633/1047 2627/1122 1136/1120 +f 1119/1123 1137/1124 1135/1125 1117/1126 +f 1138/1047 2641/1049 1118/1127 2624/1122 +f 2625/1128 2628/1050 2645/1048 2643/1129 +f 1136/1049 2627/1051 2629/1130 2626/1127 +f 1139/1131 1140/1052 1141/1050 1142/1128 +f 1143/1051 1144/1053 1145/1132 1146/1130 +f 2700/1133 2663/1054 2661/1052 2702/1131 +f 2722/1053 2716/1055 2664/1134 2701/1132 +f 1140/1135 1139/1062 1147/1054 1148/1133 +f 1149/1055 2723/1060 1144/1136 1143/1134 +f 2716/1137 2722/1061 1150/1062 2709/1135 +f 2686/1060 1152/1063 1148/1138 1147/1136 +f 1153/1139 1154/1064 2723/1061 1149/1137 +f 2647/1140 1151/1141 2709/1142 1150/1143 +f 1155/1144 1156/1066 1152/1064 2686/1139 +f 1157/1145 1158/1069 1154/1146 1153/1147 +f 2648/1069 2669/1068 1151/1148 2647/1146 +f 1159/1149 1160/1067 1156/1069 1155/1145 +f 1161/1068 1162/1070 1158/1150 1157/1148 +f 2689/1151 2670/1071 2669/1067 2648/1149 +f 1163/1070 1164/1072 1160/1152 1159/1150 +f 1165/1153 1166/1073 1162/1071 1161/1151 +f 2738/1072 2741/1074 2670/1154 2689/1152 +f 1167/1155 1168/1075 1164/1073 1163/1153 +f 2695/1074 1170/1076 1166/1156 1165/1154 +f 2696/1157 2673/1077 2742/1075 2769/1155 +f 2770/1076 2743/1078 2741/1158 2738/1156 +f 2660/1159 1171/1079 1172/1077 1173/1157 +f 1174/1078 2703/1080 1175/1160 2748/1158 +f 2754/1161 2705/1081 2758/1079 2749/1159 +f 2704/1080 2662/1082 2706/1162 2755/1160 +f 1168/1163 1178/1083 1177/1081 1164/1161 +f 1180/1082 2714/1084 1178/1164 1168/1162 +f 2690/1165 1183/1085 1169/1083 1179/1163 +f 2691/1084 1181/1092 2675/1166 2698/1164 +f 2699/1167 2676/1090 2674/1085 2697/1165 +f 2759/1092 1184/1091 1185/1168 2772/1166 +f 1187/1169 1176/1093 1188/1090 1189/1167 +f 2649/1095 1186/1094 2746/1170 2651/1171 +f 2750/1172 2760/1173 2773/1174 2650/1175 +f 2714/1094 1191/1098 1190/1176 1178/1170 +f 2677/1177 1194/1099 1191/1096 2714/1178 +f 1195/1098 2679/1100 1182/1179 1192/1176 +f 2713/1180 2726/1101 1193/1099 1196/1177 +f 2680/1100 2678/1102 2715/1181 2692/1179 +f 1184/1182 1197/1109 2747/1101 1185/1180 +f 1199/1102 1187/1107 1189/1183 1200/1181 +f 2651/1184 2746/1108 1198/1109 2693/1182 +f 1194/1107 2727/1110 1201/1185 1191/1183 +f 2730/1186 1195/1111 1192/1108 1202/1184 +f 1204/1187 1203/1188 2726/1189 2713/1190 +f 1197/1191 1205/1113 1206/1111 2747/1186 +f 1207/1112 1199/1114 1200/1192 1208/1193 +f 2693/1194 1198/1115 2724/1113 2694/1191 +f 2727/1114 1211/1116 1209/1195 1201/1192 +f 1212/1196 2730/1117 1202/1115 1210/1194 +f 2756/1116 2757/1118 1203/1197 1204/1195 +f 1205/1198 1213/1119 2725/1117 1206/1196 +f 1215/1118 1207/1120 1208/1199 2735/1197 +f 2694/1200 2724/1121 1214/1119 1216/1198 +f 1211/1120 1219/1122 1217/1201 1209/1199 +f 1220/1202 1212/1129 1210/1121 1218/1200 +f 2687/1122 2752/1127 2757/1203 2756/1201 +f 1213/1204 1221/1128 2761/1129 2725/1202 +f 1223/1127 1215/1130 2735/1205 2784/1203 +f 1216/1206 1214/1131 1222/1128 1224/1204 +f 1219/1130 2753/1132 1225/1207 1217/1205 +f 1228/1208 1220/1133 1218/1131 1226/1206 +f 2688/1132 1227/1134 2752/1209 2687/1207 +f 1221/1210 1229/1135 1230/1133 2761/1208 +f 1231/1134 1223/1136 2784/1211 1232/1209 +f 1224/1212 1222/1137 2768/1135 2751/1210 +f 2753/1136 2774/1138 1235/1213 1225/1211 +f 2776/1214 1228/1139 1226/1137 1236/1212 +f 1238/1138 1237/1215 1227/1216 2688/1213 +f 1229/1217 1239/1144 2656/1139 1230/1214 +f 2710/1218 1231/1147 1232/1219 2658/1220 +f 2751/1147 2768/1146 1240/1221 1242/1219 +f 2659/1222 2657/1145 2733/1147 2711/1218 +f 1233/1146 1243/1148 1239/1223 1229/1221 +f 1235/1224 2681/1149 1247/1145 1234/1222 +f 2774/1225 2665/1226 2681/1227 1235/1228 +f 2667/1229 2776/1151 1236/1149 2683/1224 +f 1252/1150 1251/1152 1237/1230 1238/1231 +f 1250/1232 1249/1153 2666/1151 2668/1229 +f 1243/1152 1253/1154 1254/1233 1239/1230 +f 2718/1234 1244/1155 1241/1153 2671/1232 +f 2712/1154 2734/1156 2654/1235 1256/1233 +f 2672/1236 2655/1157 2652/1155 2717/1234 +f 1245/1156 1257/1158 1253/1237 1243/1235 +f 1247/1238 1269/1159 1267/1157 1246/1236 +f 2681/1158 1271/1160 1269/1239 1247/1237 +f 1272/1240 2684/1161 1248/1159 1270/1238 +f 2731/1160 2744/1162 2682/1241 2685/1239 +f 2780/1242 2782/1163 2745/1161 2732/1240 +f 1257/1162 1273/1164 2728/1243 1253/1241 +f 1275/1244 1258/1165 1255/1163 1276/1242 +f 2719/1164 2653/1166 1274/1245 2720/1243 +f 2721/1246 2729/1167 2707/1165 2777/1244 +f 1259/1166 1277/1168 1273/1247 1257/1245 +f 1278/1248 1260/1169 1258/1167 1275/1246 +f 2777/1171 2707/1170 2708/1249 2775/1250 +f 1261/1251 1279/1178 1277/1252 1259/1253 +f 1280/1170 1262/1176 1260/1254 1278/1249 +f 2775/1255 2708/1177 2736/1178 2739/1251 +f 1263/1176 1281/1179 1279/1256 1261/1254 +f 1282/1257 1264/1180 1262/1177 1280/1255 +f 2739/1179 2736/1181 2737/1258 2740/1256 +f 1265/1259 1283/1182 1281/1180 1263/1257 +f 1284/1181 1266/1183 1264/1260 1282/1258 +f 2740/1261 2737/1184 2771/1182 2778/1259 +f 1267/1183 1285/1185 1283/1262 1265/1260 +f 2762/1263 1268/1186 1266/1184 1284/1261 +f 2778/1185 2771/1193 2765/1264 1286/1262 +f 1269/1265 1287/1191 1285/1186 1267/1263 +f 1288/1193 2779/1192 1268/1266 2762/1264 +f 2763/1267 2766/1194 2783/1191 2781/1265 +f 1286/1192 2765/1195 2767/1268 2764/1266 +f 1289/1269 1290/1196 1291/1194 1292/1267 +f 1293/1195 1294/1197 1295/1270 1296/1268 +f 2835/1271 2800/1198 2798/1196 2837/1269 +f 2854/1197 2849/1199 2801/1272 2836/1270 +f 1290/1273 1289/1200 1297/1198 1298/1271 +f 1299/1199 2855/1201 1294/1274 1293/1272 +f 2849/1275 2854/1202 1300/1200 2843/1273 +f 2823/1201 1302/1203 1298/1276 1297/1274 +f 1303/1277 1304/1204 2855/1202 1299/1275 +f 2785/1203 1301/1205 2843/1278 1300/1276 +f 1305/1279 1306/1206 1302/1204 2823/1277 +f 1307/1205 1308/1207 1304/1280 1303/1278 +f 2786/1281 2806/1208 1301/1206 2785/1279 +f 1309/1207 1310/1209 1306/1282 1305/1280 +f 1311/1283 1312/1210 1308/1208 1307/1281 +f 2826/1209 2807/1211 2806/1284 2786/1282 +f 1313/1285 1314/1212 1310/1210 1309/1283 +f 1315/1211 1316/1213 1312/1286 1311/1284 +f 2870/1287 2873/1214 2807/1212 2826/1285 +f 1317/1213 2810/1216 1314/1288 1313/1286 +f 1319/1289 1320/1217 1316/1214 1315/1287 +f 2831/1290 2811/1220 2874/1291 2899/1292 +f 2900/1293 2875/1294 2873/1295 2870/1296 +f 1291/1297 1321/1218 1322/1220 1323/1290 +f 1324/1219 1296/1221 1325/1298 1326/1299 +f 2885/1300 2839/1222 2889/1218 2880/1297 +f 2838/1221 2799/1223 2840/1301 2886/1298 +f 1290/1302 1327/1224 1321/1222 1291/1300 +f 1330/1223 2847/1231 1328/1303 1318/1301 +f 1332/1304 1333/1229 1319/1224 1329/1302 +f 2827/1231 1331/1230 2813/1305 2833/1303 +f 2834/1306 2814/1232 2812/1229 2832/1304 +f 1322/1230 1334/1233 1335/1307 2902/1305 +f 1337/1308 1326/1234 1338/1232 1339/1306 +f 2787/1233 1336/1235 2878/1309 2789/1307 +f 2881/1310 2890/1236 2903/1234 2788/1308 +f 1321/1235 1340/1237 1334/1311 1322/1309 +f 2847/1312 1342/1238 1341/1236 1328/1310 +f 2815/1237 1345/1239 1342/1313 2847/1311 +f 1346/1314 2817/1240 1332/1238 1343/1312 +f 2846/1239 2858/1241 1344/1315 1347/1313 +f 2818/1316 2816/1242 2848/1240 2828/1314 +f 1334/1241 1348/1243 2879/1317 1335/1315 +f 1350/1318 1337/1244 1339/1242 1351/1316 +f 2789/1243 2878/1245 1349/1319 2829/1317 +f 1345/1320 2859/1246 1352/1244 1342/1318 +f 2862/1245 1346/1247 1343/1321 1353/1319 +f 1355/1322 1354/1248 2858/1246 2846/1320 +f 1348/1250 1356/1249 1357/1323 2879/1324 +f 1358/1325 1350/1251 1351/1253 1359/1326 +f 2829/1249 1349/1254 2856/1327 2830/1323 +f 2859/1328 1362/1255 1360/1251 1352/1325 +f 1363/1254 2862/1256 1353/1329 1361/1327 +f 2887/1330 2888/1331 1354/1332 1355/1333 +f 1356/1256 1364/1258 2857/1334 1357/1329 +f 1366/1335 1358/1259 1359/1257 2867/1336 +f 2830/1258 2856/1260 1365/1337 1367/1334 +f 1362/1338 1370/1261 1368/1259 1360/1335 +f 1371/1260 1363/1262 1361/1339 1369/1337 +f 2824/1340 2883/1263 2888/1261 2887/1338 +f 1364/1262 1372/1264 2891/1341 2857/1339 +f 1374/1342 1366/1265 2867/1263 2913/1340 +f 1367/1264 1365/1266 1373/1343 1375/1341 +f 1370/1344 2884/1267 1376/1265 1368/1342 +f 1379/1266 1371/1268 1369/1345 1377/1343 +f 2825/1346 1378/1269 2883/1267 2824/1344 +f 1372/1268 1380/1270 1381/1347 2891/1345 +f 1382/1348 1374/1271 2913/1269 1383/1346 +f 1375/1270 1373/1272 2898/1349 2882/1347 +f 2884/1350 2904/1273 1386/1271 1376/1348 +f 2906/1272 1379/1274 1377/1351 1387/1349 +f 1389/1352 1388/1275 1378/1273 2825/1350 +f 1380/1274 1390/1276 2794/1353 1381/1351 +f 1392/1354 1382/1277 1383/1275 2796/1352 +f 2882/1276 2898/1278 1391/1355 1393/1353 +f 2797/1356 2795/1279 2865/1277 2844/1354 +f 1384/1278 1394/1280 1390/1357 1380/1355 +f 1386/1358 2819/1281 1398/1279 1385/1356 +f 2904/1280 2802/1282 2819/1359 1386/1357 +f 2804/1360 2906/1283 1387/1281 2821/1358 +f 1403/1282 1402/1284 1388/1361 1389/1359 +f 1401/1362 1400/1285 2803/1283 2805/1360 +f 1394/1284 1404/1286 1405/1363 1390/1361 +f 1406/1364 1395/1287 1392/1285 2808/1362 +f 2845/1286 2866/1288 2792/1365 1407/1363 +f 2809/1366 2793/1289 2790/1287 2850/1364 +f 1396/1367 1408/1292 1404/1368 1394/1369 +f 1398/1292 1420/1291 1418/1370 1397/1368 +f 2819/1371 1422/1290 1420/1292 1398/1367 +f 1423/1291 2821/1299 1399/1372 1421/1370 +f 2863/1373 2876/1297 2820/1290 2822/1371 +f 2909/1299 2911/1298 2877/1374 2864/1372 +f 1408/1375 1424/1300 2860/1297 1404/1373 +f 1426/1298 1409/1301 1406/1376 1427/1374 +f 2851/1377 2791/1302 1425/1300 2852/1375 +f 2853/1301 2861/1303 2841/1378 2907/1376 +f 1410/1379 1428/1304 1424/1302 1408/1377 +f 1429/1303 1411/1305 1409/1380 1426/1378 +f 2907/1381 2841/1306 2842/1304 2905/1379 +f 1412/1305 1430/1307 1428/1382 1410/1380 +f 1431/1383 1413/1308 1411/1306 1429/1381 +f 2905/1307 2842/1309 2868/1384 2871/1382 +f 1414/1385 1432/1310 1430/1308 1412/1383 +f 1433/1309 1415/1311 1413/1386 1431/1384 +f 2871/1387 2868/1312 2869/1310 2872/1385 +f 1416/1311 1434/1313 1432/1388 1414/1386 +f 1435/1389 1417/1314 1415/1312 1433/1387 +f 2872/1313 2869/1315 2901/1390 2908/1388 +f 1418/1391 1436/1316 1434/1314 1416/1389 +f 2892/1315 1419/1317 1417/1392 1435/1390 +f 2908/1393 2901/1318 2895/1316 1437/1391 +f 1420/1317 1438/1319 1436/1394 1418/1392 +f 1439/1395 1421/1320 1419/1318 2892/1393 +f 2893/1319 2896/1321 2912/1396 2910/1394 +f 1437/1397 2895/1322 2897/1320 2894/1395 +f 1307/1398 1303/1399 1299/1400 1293/1401 1296/1402 1324/1403 1326/1404 1337/1405 1350/1406 1358/1407 1366/1408 1374/1409 1382/1410 1392/1411 1395/1412 1406/1413 1409/1414 1411/1415 1413/1416 1415/1417 1417/1418 1419/1419 1421/1420 1399/1421 2821/1422 1387/1423 1377/1424 1369/1425 1361/1426 1353/1427 1343/1428 1332/1429 1329/1430 1319/1431 1315/1432 1311/1433 diff --git a/mods/christmas/models/christmas_tree_balls.obj b/mods/christmas/models/christmas_tree_balls.obj new file mode 100644 index 00000000..c1677cb6 --- /dev/null +++ b/mods/christmas/models/christmas_tree_balls.obj @@ -0,0 +1,184 @@ +# Blender v2.70 (sub 0) OBJ File: '' +# www.blender.org +o Cube.001_Cube.002 +v 0.745683 -0.680000 0.585688 +v 0.745683 -0.680000 0.745688 +v 0.585683 -0.680000 0.745688 +v 0.585683 -0.680000 0.585688 +v 0.745683 -0.520000 0.585688 +v 0.745683 -0.520000 0.745688 +v 0.585683 -0.520000 0.745688 +v 0.585683 -0.520000 0.585688 +v 0.585687 -0.680000 -0.745683 +v 0.745687 -0.680000 -0.745683 +v 0.745687 -0.680000 -0.585683 +v 0.585687 -0.680000 -0.585683 +v 0.585687 -0.520000 -0.745683 +v 0.745687 -0.520000 -0.745683 +v 0.745687 -0.520000 -0.585683 +v 0.585687 -0.520000 -0.585683 +v -0.745684 -0.680000 -0.585686 +v -0.745684 -0.680000 -0.745686 +v -0.585684 -0.680000 -0.745686 +v -0.585684 -0.680000 -0.585686 +v -0.745684 -0.520000 -0.585686 +v -0.745684 -0.520000 -0.745686 +v -0.585684 -0.520000 -0.745686 +v -0.585684 -0.520000 -0.585687 +v -0.778823 -0.680000 0.665685 +v -0.665686 -0.680000 0.552548 +v -0.552549 -0.680000 0.665685 +v -0.665686 -0.680000 0.778822 +v -0.778823 -0.520000 0.665685 +v -0.665686 -0.520000 0.552548 +v -0.552549 -0.520000 0.665685 +v -0.665686 -0.520000 0.778822 +v -0.353555 0.520000 0.240414 +v -0.240418 0.520000 0.353552 +v -0.353556 0.520000 0.466688 +v -0.466693 0.520000 0.353551 +v -0.353555 0.680000 0.240414 +v -0.240418 0.680000 0.353552 +v -0.353556 0.680000 0.466688 +v -0.466693 0.680000 0.353551 +v 0.240415 0.520000 0.353555 +v 0.353552 0.520000 0.240418 +v 0.466689 0.520000 0.353556 +v 0.353551 0.520000 0.466692 +v 0.240415 0.680000 0.353555 +v 0.353552 0.680000 0.240418 +v 0.466689 0.680000 0.353556 +v 0.353551 0.680000 0.466692 +v 0.353554 0.520000 -0.240415 +v 0.240418 0.520000 -0.353552 +v 0.353555 0.520000 -0.466689 +v 0.466692 0.520000 -0.353551 +v 0.353554 0.680000 -0.240415 +v 0.240418 0.680000 -0.353552 +v 0.353555 0.680000 -0.466689 +v 0.466692 0.680000 -0.353552 +v -0.240415 0.520000 -0.353554 +v -0.353553 0.520000 -0.240417 +v -0.466689 0.520000 -0.353555 +v -0.353552 0.520000 -0.466692 +v -0.240415 0.680000 -0.353554 +v -0.353553 0.680000 -0.240417 +v -0.466689 0.680000 -0.353555 +v -0.353552 0.680000 -0.466692 +v 0.720000 -0.180000 0.080000 +v 0.720000 -0.180000 -0.080000 +v 0.880000 -0.180000 -0.080000 +v 0.880000 -0.180000 0.080000 +v 0.720000 -0.020000 0.080000 +v 0.720000 -0.020000 -0.080000 +v 0.880000 -0.020000 -0.080000 +v 0.880000 -0.020000 0.080000 +v -0.080001 -0.180000 0.880000 +v -0.080001 -0.180000 0.720000 +v 0.079999 -0.180000 0.720000 +v 0.079999 -0.180000 0.880000 +v -0.080001 -0.020000 0.880000 +v -0.080001 -0.020000 0.720000 +v 0.079999 -0.020000 0.720000 +v 0.079999 -0.020000 0.880000 +v -0.720000 -0.180000 -0.080001 +v -0.720000 -0.180000 0.079999 +v -0.880000 -0.180000 0.079998 +v -0.880000 -0.180000 -0.080002 +v -0.720000 -0.020000 -0.080001 +v -0.720000 -0.020000 0.079999 +v -0.880000 -0.020000 0.079998 +v -0.880000 -0.020000 -0.080002 +v 0.080002 -0.180000 -0.720000 +v -0.079998 -0.180000 -0.720000 +v -0.079998 -0.180000 -0.880000 +v 0.080002 -0.180000 -0.880000 +v 0.080002 -0.020000 -0.720000 +v -0.079998 -0.020000 -0.720000 +v -0.079998 -0.020000 -0.880000 +v 0.080002 -0.020000 -0.880000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.999999 1.000001 +vt 1.000001 0.000001 +vt 0.000001 -0.000001 +vt -0.000001 0.999999 +vt 0.999999 -0.000001 +vt 1.000001 0.999999 +vt 0.000001 1.000001 +vt -0.000001 0.000001 +s off +f 5/1 6/2 2/3 1/4 +f 6/1 7/2 3/3 2/4 +f 7/1 8/2 4/3 3/4 +f 8/1 5/2 1/3 4/4 +f 1/1 2/2 3/3 4/4 +f 8/1 7/2 6/3 5/4 +f 13/1 14/2 10/3 9/4 +f 14/1 15/2 11/3 10/4 +f 15/1 16/2 12/3 11/4 +f 16/1 13/2 9/3 12/4 +f 9/1 10/2 11/3 12/4 +f 16/1 15/2 14/3 13/4 +f 21/1 22/2 18/3 17/4 +f 22/1 23/2 19/3 18/4 +f 23/1 24/2 20/3 19/4 +f 24/1 21/2 17/3 20/4 +f 17/1 18/2 19/3 20/4 +f 24/1 23/2 22/3 21/4 +f 29/1 30/2 26/3 25/4 +f 30/1 31/2 27/3 26/4 +f 31/1 32/2 28/3 27/4 +f 32/1 29/2 25/3 28/4 +f 25/1 26/2 27/3 28/4 +f 32/1 31/2 30/3 29/4 +f 37/1 38/2 34/3 33/4 +f 38/1 39/2 35/3 34/4 +f 39/1 40/2 36/3 35/4 +f 40/1 37/2 33/3 36/4 +f 33/1 34/2 35/3 36/4 +f 40/1 39/2 38/3 37/4 +f 45/5 46/6 42/7 41/8 +f 46/9 47/10 43/11 42/12 +f 47/9 48/10 44/11 43/12 +f 48/9 45/10 41/11 44/12 +f 41/1 42/2 43/3 44/4 +f 48/1 47/2 46/3 45/4 +f 53/1 54/2 50/3 49/4 +f 54/1 55/2 51/3 50/4 +f 55/1 56/2 52/3 51/4 +f 56/1 53/2 49/3 52/4 +f 49/1 50/2 51/3 52/4 +f 56/1 55/2 54/3 53/4 +f 61/1 62/2 58/3 57/4 +f 62/1 63/2 59/3 58/4 +f 63/1 64/2 60/3 59/4 +f 64/1 61/2 57/3 60/4 +f 57/1 58/2 59/3 60/4 +f 64/1 63/2 62/3 61/4 +f 69/1 70/2 66/3 65/4 +f 70/1 71/2 67/3 66/4 +f 71/1 72/2 68/3 67/4 +f 72/1 69/2 65/3 68/4 +f 65/1 66/2 67/3 68/4 +f 72/1 71/2 70/3 69/4 +f 77/1 78/2 74/3 73/4 +f 78/1 79/2 75/3 74/4 +f 79/1 80/2 76/3 75/4 +f 80/1 77/2 73/3 76/4 +f 73/1 74/2 75/3 76/4 +f 80/1 79/2 78/3 77/4 +f 85/1 86/2 82/3 81/4 +f 86/1 87/2 83/3 82/4 +f 87/1 88/2 84/3 83/4 +f 88/1 85/2 81/3 84/4 +f 81/1 82/2 83/3 84/4 +f 88/1 87/2 86/3 85/4 +f 93/1 94/2 90/3 89/4 +f 94/1 95/2 91/3 90/4 +f 95/1 96/2 92/3 91/4 +f 96/1 93/2 89/3 92/4 +f 89/1 90/2 91/3 92/4 +f 96/1 95/2 94/3 93/4 diff --git a/mods/christmas/screenshot.png b/mods/christmas/screenshot.png new file mode 100644 index 00000000..becb0771 Binary files /dev/null and b/mods/christmas/screenshot.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_blue.png b/mods/christmas/textures/Todo/christmas_bauble_blue.png new file mode 100644 index 00000000..324dbe85 Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_blue.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_cyan.png b/mods/christmas/textures/Todo/christmas_bauble_cyan.png new file mode 100644 index 00000000..02f43941 Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_cyan.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_green.png b/mods/christmas/textures/Todo/christmas_bauble_green.png new file mode 100644 index 00000000..b4b2447c Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_green.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_orange.png b/mods/christmas/textures/Todo/christmas_bauble_orange.png new file mode 100644 index 00000000..a78c3025 Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_orange.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_pink.png b/mods/christmas/textures/Todo/christmas_bauble_pink.png new file mode 100644 index 00000000..c3118611 Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_pink.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_purple.png b/mods/christmas/textures/Todo/christmas_bauble_purple.png new file mode 100644 index 00000000..a9871d69 Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_purple.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_white.png b/mods/christmas/textures/Todo/christmas_bauble_white.png new file mode 100644 index 00000000..fb9c6f08 Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_white.png differ diff --git a/mods/christmas/textures/Todo/christmas_bauble_yellow.png b/mods/christmas/textures/Todo/christmas_bauble_yellow.png new file mode 100644 index 00000000..d3cada6b Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_bauble_yellow.png differ diff --git a/mods/christmas/textures/Todo/christmas_cracker.png b/mods/christmas/textures/Todo/christmas_cracker.png new file mode 100644 index 00000000..0298f835 Binary files /dev/null and b/mods/christmas/textures/Todo/christmas_cracker.png differ diff --git a/mods/christmas/textures/christmas_bauble.png b/mods/christmas/textures/christmas_bauble.png new file mode 100644 index 00000000..d528c08d Binary files /dev/null and b/mods/christmas/textures/christmas_bauble.png differ diff --git a/mods/christmas/textures/christmas_bauble_pallete.png b/mods/christmas/textures/christmas_bauble_pallete.png new file mode 100644 index 00000000..480ecd81 Binary files /dev/null and b/mods/christmas/textures/christmas_bauble_pallete.png differ diff --git a/mods/christmas/textures/christmas_bauble_red.png b/mods/christmas/textures/christmas_bauble_red.png new file mode 100644 index 00000000..cf5b3db3 Binary files /dev/null and b/mods/christmas/textures/christmas_bauble_red.png differ diff --git a/mods/christmas/textures/christmas_candy_cane.png b/mods/christmas/textures/christmas_candy_cane.png new file mode 100644 index 00000000..91c46ef5 Binary files /dev/null and b/mods/christmas/textures/christmas_candy_cane.png differ diff --git a/mods/christmas/textures/christmas_eggnog.png b/mods/christmas/textures/christmas_eggnog.png new file mode 100644 index 00000000..c0d741b5 Binary files /dev/null and b/mods/christmas/textures/christmas_eggnog.png differ diff --git a/mods/christmas/textures/christmas_gingerbread_man.png b/mods/christmas/textures/christmas_gingerbread_man.png new file mode 100644 index 00000000..fbc73d4f Binary files /dev/null and b/mods/christmas/textures/christmas_gingerbread_man.png differ diff --git a/mods/christmas/textures/christmas_lights.png b/mods/christmas/textures/christmas_lights.png new file mode 100644 index 00000000..3038a0f8 Binary files /dev/null and b/mods/christmas/textures/christmas_lights.png differ diff --git a/mods/christmas/textures/christmas_lights_animated.png b/mods/christmas/textures/christmas_lights_animated.png new file mode 100644 index 00000000..a992fb47 Binary files /dev/null and b/mods/christmas/textures/christmas_lights_animated.png differ diff --git a/mods/christmas/textures/christmas_mincepie.png b/mods/christmas/textures/christmas_mincepie.png new file mode 100644 index 00000000..1068502f Binary files /dev/null and b/mods/christmas/textures/christmas_mincepie.png differ diff --git a/mods/christmas/textures/christmas_powerup_ui.png b/mods/christmas/textures/christmas_powerup_ui.png new file mode 100644 index 00000000..1f6cd993 Binary files /dev/null and b/mods/christmas/textures/christmas_powerup_ui.png differ diff --git a/mods/christmas/textures/christmas_present.png b/mods/christmas/textures/christmas_present.png new file mode 100644 index 00000000..1ab8f2c9 Binary files /dev/null and b/mods/christmas/textures/christmas_present.png differ diff --git a/mods/christmas/textures/christmas_star.png b/mods/christmas/textures/christmas_star.png new file mode 100644 index 00000000..99f079d7 Binary files /dev/null and b/mods/christmas/textures/christmas_star.png differ diff --git a/mods/christmas/textures/christmas_star_inv.png b/mods/christmas/textures/christmas_star_inv.png new file mode 100644 index 00000000..46a66333 Binary files /dev/null and b/mods/christmas/textures/christmas_star_inv.png differ diff --git a/mods/christmas/textures/christmas_stocking.png b/mods/christmas/textures/christmas_stocking.png new file mode 100644 index 00000000..3bb29838 Binary files /dev/null and b/mods/christmas/textures/christmas_stocking.png differ diff --git a/mods/christmas/textures/christmas_sugar.png b/mods/christmas/textures/christmas_sugar.png new file mode 100644 index 00000000..56ecb21b Binary files /dev/null and b/mods/christmas/textures/christmas_sugar.png differ diff --git a/mods/christmas/textures/christmas_tree_inv.png b/mods/christmas/textures/christmas_tree_inv.png new file mode 100644 index 00000000..03ce408c Binary files /dev/null and b/mods/christmas/textures/christmas_tree_inv.png differ diff --git a/mods/christmas/textures/christmas_tree_leaves.png b/mods/christmas/textures/christmas_tree_leaves.png new file mode 100644 index 00000000..15316a9b Binary files /dev/null and b/mods/christmas/textures/christmas_tree_leaves.png differ diff --git a/mods/christmas/textures/init.lua~ b/mods/christmas/textures/init.lua~ new file mode 100644 index 00000000..645616e2 --- /dev/null +++ b/mods/christmas/textures/init.lua~ @@ -0,0 +1,195 @@ +christmas = {} +christmas.players = {} +christmas.data = minetest.get_mod_storage("christmas") + +local function xplayer(player) + if not player:is_player() then + return + end + local name = player:get_player_name() + return christmas.players[name] +end + +function christmas.get_present_formspec(pos)--Taken from default chest + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + local formspec = + "size[8,9]" .. + "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]" + return formspec +end + +local function to_time(time) + local remaining = time % 86400 + remaining = remaining % 3600 + local minutes = math.floor(remaining/60) + remaining = remaining % 60 + local seconds = remaining + if (minutes < 10) then + minutes = "0" .. tostring(minutes) + end + if (seconds < 10) then + seconds = "0" .. tostring(seconds) + end + answer = minutes..':'..seconds + return answer +end + +function christmas.eat_candy(hp_change, replace_with_item) + return function(itemstack, user, pointed_thing) + local name = user:get_player_name() + local p = xplayer(user) + christmas.players[name].candy = p.candy +1 + if p.candy == 8 then + p.time = 60 + p.hud.ui = user:hud_add({ + hud_elem_type = "image", + position = {x = 0.1, y = 0.5}, + offset = {x = -220, y = -260}, + text = "christmas_powerup_ui.png", + scale = { x = 16, y = 17}, + alignment = { x = 1, y = 0 }, + }) + p.hud.icon = user:hud_add({ + hud_elem_type = "image", + position = {x = 0.1, y = 0.5}, + offset = {x = -90, y = -251}, + text = "christmas_candy_cane.png", + scale = { x = 16, y = 16}, + alignment = { x = 1, y = 0 }, + }) + p.hud.time = user:hud_add({ + hud_elem_type = "text", + position = {x = 0.1, y = 0.5}, + offset = {x = 10, y = -10}, + text = to_time (p.time), + number = 0xffffff, + scale = { x = 16, y = 16}, + alignment = { x = 0, y = 0 }, + }) + end + if p.time > 0 then + p.time = p.time + 3 + end + return minetest.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing) + end +end + +minetest.register_craftitem("christmas:candy_cane", { + description = "Candy Cane", + inventory_image = "christmas_candy_cane.png", + on_use = christmas.eat_candy(1) +}) +minetest.register_craftitem("christmas:mince_pie", { + description = "Mince Pie", + inventory_image = "christmas_mincepie.png", + on_use = minetest.item_eat(2) +}) +minetest.register_craftitem("christmas:gingerbread_man", { + description = "Gingerbread Man", + inventory_image = "christmas_gingerbread_man.png", + on_use = minetest.item_eat(2) +}) +minetest.register_craftitem("christmas:cracker", { + description = "Christmas Cracker\n (To be shared with a friend)", + inventory_image = "christmas_cracker.png", + on_use = minetest.item_eat(2) +}) + +minetest.register_node("christmas:eggnog", { + description = "Eggnog", + drawtype = "plantlike", + tiles = {"christmas_eggnog.png"}, + inventory_image = "christmas_eggnog.png", + on_use = minetest.item_eat(10), + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, +}) +minetest.register_node("christmas:present", { + description = "Christmas present", + tiles = { + "christmas_present.png", + "christmas_present_top.png" + }, + drawtype = "mesh", + paramtype = "light", + mesh = "christmas_present.obj", + groups = {oddly_breakable_by_hand = 3, attached_node = 1}, + on_construct = function(pos, itemstack, placer, pointed_thing) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Christmas Present") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 1) + end, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Present from ".. meta:get_string("owner")) + end, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + minetest.after(0.2, + minetest.show_formspec, + player:get_player_name(), + "christmas:present", + christmas.get_present_formspec(pos)) + end, +}) +minetest.register_node("christmas:stocking", { + description = "Christmas Stocking", + drawtype = "signlike", + tiles = {"christmas_stocking.png"}, + inventory_image = "christmas_stocking.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + selection_box = { + type = "wallmounted", + }, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3}, + walkable = false, + on_construct = function(pos, itemstack, player) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", player:get_player_name().."'s Stocking") + end, +}) +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + christmas.players[name] = {} + christmas.players[name].candy = 0 + christmas.players[name].hud = {} + christmas.players[name].time = 0 +end) + +local t = 0 +minetest.register_globalstep (function(dtime) + t = t + dtime + if t > 1 then + t = 0 + end + for _, player in ipairs(minetest.get_connected_players()) do + local p = xplayer(player) + if p.time > 0 and t > 1-dtime then + p.time = p.time - 1 + player:hud_change(p.hud.time, "text", to_time(p.time)) + elseif math.floor(p.time) == 1 then + p.candy = 0 + end + if p.time > 0 then + player:set_physics_override({ + speed = 2.5, + }) + end + --minetest.chat_send_all(p.candy) + if p.time == 0 then + player:set_physics_override({ + speed = 1, + }) + player:hud_remove(p.hud.ui) + player:hud_remove(p.hud.icon) + player:hud_remove(p.hud.time) + end + end +end) diff --git a/mods/cottages/LICENSE b/mods/cottages/LICENSE new file mode 100644 index 00000000..733c0723 --- /dev/null +++ b/mods/cottages/LICENSE @@ -0,0 +1,675 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + diff --git a/mods/cottages/README.md b/mods/cottages/README.md new file mode 100644 index 00000000..0b0a033c --- /dev/null +++ b/mods/cottages/README.md @@ -0,0 +1,93 @@ +Contains nodes for building medieval houses. + +This used to be part of my random_buildings modpack, found under + https://github.com/Sokomine/random_buildings +It is now its own mod as all other mods in the modpack have been +superseded by newer versions. + +For more information about this mod, please refer to + https://forum.minetest.net/viewtopic.php?id=5120 +The thread introduces the nodes, shows crafting receipes and provides a place +to discuss about the mod. + +Special functions: +* Window shutters use an abm to automaticly close at night and open at day. +* The treshing place can be used to seperate harvested wheat into wheat seeds + and straw. The straw is useful for roofing purposes, straw bales etc. +* The handmill turns wheat seeds into flour. +* With anvil and hammer, tools can be repaired. +* The barrels do not yet have any further functionality. They may be used for + brewing in the future. Until then, punching makes them rotate and switch from + standing to lying on the ground. + +Liscence of this mod: GPLv3 +Autor: Sokomine + +--- +--- Textures and media: +--- +VanessaE (CC-by-SA 3.0): + cottages_waonwheel.png + cottages_homedecor_shingles_asphalt.png + cottages_homedecor_shingles_terracotta.png + cottages_homedecor_shingles_wood.png + cottages_sleepingmat.png + cottages_barrel.png + +CC-by-SA; done by GloopMaster (CC-by-SA): + glooptest_tool_steelhammer.png + +badger436 (created for this mod; CC BY-SA 3.0): + cottages_feldweg.png + +Some textures are taken from + https://github.com/minetest/minetest_game +and renamed (default_NAME.png -> cottages_NAME.png) + +Cisoun's WTFPL texture pack: + cottages_stone.png (for anvil and handmill) + cottages_wool.png + +Zeg9 (CC BY-SA 3.0): + cottages_steel_block.png (for steel hatch and stovepipie) + +MasterGollum (WTFPL, darkage mod): + cottages_darkage_straw_bale.png + cottages_darkage_straw.png + cottages_reet.png (straw texture changed in color) + +Sokomine (CC-by-SA 3.0): + cottages_glass_pane.png (modification of default_glass.png) + cottages_loam.png (part of a real loam wall) + +Copyright (C) 2010-2012 celeron55, Perttu Ahola +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + cottages_clay.png (washing place, stairs and slab) +From the supplied minimal game: + cottages_minimal_wood.png + +PilzAdam (WTFPL; default and beds mod): + cottages_junglewood.png + cottages_beds_bed_side.png + cottages_beds_bed_side_top_l.png + cottages_beds_bed_side_top_r.png + cottages_beds_bed_top_bottom.png + cottages_beds_bed_top_top.png + +Bas080 (CC; see https://forum.minetest.net/viewtopic.php?t=2344) + cottages_rope.png + +Derived from Universal schema.jpg by Stefanie Lindener, which can be found here: http://de.wikipedia.org/w/index.php?title=Datei:Universal_schema.jpg&filetimestamp=20060510110309& The texture is CC-by-sa 2.0/de. + cottages_slate.png + +Textures not provided but used (need to be supplied by a default mod): + default_wood.png + default_tree.png + default_dirt.png + default_grass_side.png + default_chest_top.png + default_chest_side.png + default_chest_front.png + default_stick.png + farming_wheat.png diff --git a/mods/cottages/adaptions.lua b/mods/cottages/adaptions.lua new file mode 100644 index 00000000..24782cdd --- /dev/null +++ b/mods/cottages/adaptions.lua @@ -0,0 +1,104 @@ +-- some games may not have the default nodes; +-- change this so that craft receipes work! + +-- used for: anvil, hammer, barrel, steel hatch, stove pipe, wagon wheel, handmill. +cottages.craftitem_steel = "default:steel_ingot"; +-- used for: hammer, wood+steel hatch, fence gate, bed, table, bench, shelf, +-- washing place, wagon wheel, glass pane, flat wood, handmill, +-- operating the treshing floor. +cottages.craftitem_stick = "group:stick"; +-- used for: treshing floor, handmill, slate roof, vertical slate +cottages.craftitem_stone = "default:stone"; +-- used for: window shutter, half door, half door inverted, fence gate, +-- bed, bench, shelf, roof connector, vertical slate +cottages.craftitem_wood = "group:wood"; +-- used for: half door +cottages.craftitem_door = "doors:door_wood"; +-- used for: small fence +cottages.craftitem_fence = "default:fence_wood"; +-- used for: bed (head+foot), wool for tents +cottages.craftitem_wool = "wool:white"; +-- used for: washing place, loam +cottages.craftitem_clay = "default:clay"; +-- used for: wagon wheel +cottages.craftitem_iron = "default:iron_lump"; +-- used for: dirt road, brown roof (if no homedecor is installed) +cottages.craftitem_dirt = "default:dirt"; +-- used for: loam +cottages.craftitem_sand = "default:sand"; +-- used for: glass pane +cottages.craftitem_glass = "default:glass"; +-- used for: reet roof, reet block +cottages.craftitem_papyrus = "default:papyrus"; +-- used for: black roof (if no homedecor is installed) +cottages.craftitem_coal_lump = "default:coal_lump"; +-- used for: red roof (if no homedecor is installed) +cottages.craftitem_clay_brick = "default:clay_brick"; +-- used for: treshing floor +cottages.craftitem_junglewood = "default:junglewood"; +cottages.craftitem_chest_locked = "default:chest_locked"; +-- used for: hatch, table +cottages.craftitem_slab_wood = "stairs:slab_wood"; + +-- texture used for fence gate and bed posts +cottages.texture_furniture = "default_wood.png"; +-- texture for the side of roof nodes +cottages.texture_roof_sides = "default_wood.png"; +-- if the default wood node does not exist, use an alternate wood texture +-- (which is also used for furnitures and doors in this mod) +if( not( minetest.registered_nodes['default:wood'])) then + cottages.texture_roof_sides = "cottages_minimal_wood.png"; + cottages.texture_furniture = "cottages_minimal_wood.png"; +end + +cottages.texture_chest = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}; + +-- the treshing floor produces wheat seeds +cottages.craftitem_seed_wheat = "farming:seed_wheat"; +cottages.texture_wheat_seed = "farming_wheat_seed.png"; +cottages.texture_stick = "default_stick.png"; + +-- texture for roofs where the tree bark is the main roof texture +cottages.textures_roof_wood = "default_tree.png"; +if( not( minetest.registered_nodes["default:tree"])) then + -- realtest has diffrent barks; the spruce one seems to be the most fitting + if( minetest.registered_nodes["trees:spruce_log" ]) then + cottages.textures_roof_wood = "trees_spruce_trunk.png"; + + -- this is also an indicator that we are dealing with realtest; + cottages.craftitem_steel = "metals:pig_iron_ingot"; + -- stone exists, but is hard to obtain; chiseled stone is more suitable + cottages.craftitem_stone = "default:stone_flat"; + -- there are far more diffrent wood tpyes + cottages.craftitem_wood = "group:planks"; + cottages.craftitem_door = "doors:door_birch"; + cottages.craftitem_fence = "group:fence"; + cottages.craftitem_clay = "grounds:clay_lump"; + cottages.craftitem_iron = "group:plank"; -- iron lumps would be too specific + cottages.craftitem_coal_lump = "minerals:charcoal"; + cottages.craftitem_junglewood = "trees:chestnut_planks"; + cottages.craftitem_slab_wood = "group:plank"; + + cottages.texture_chest = { "spruce_chest_top.png", "spruce_chest_top.png", "spruce_chest_side.png", + "spruce_chest_side.png", "spruce_chest_side.png", "spruce_chest_front.png"}; + + -- wheat is called spelt in RealTest + cottages.craftitem_seed_wheat = 'farming:seed_spelt'; + cottages.texture_wheat_seed = 'farming_spelt_seed.png'; + cottages.texture_stick = 'trees_maple_stick.png'; + else + -- does not look so well in this case as it's no bark; but what else shall we do? + cottages.textures_roof_wood = "cottages_minimal_wood.png"; + end +end + +if( minetest.get_modpath("moreblocks") + and minetest.registered_nodes[ "moreblocks:slab_wood" ]) then + cottages.craftitem_slab_wood = "moreblocks:slab_wood"; +end + +if( not( minetest.registered_nodes["wool:white"])) then + cottages.craftitem_wool = "cottages:wool"; +end + diff --git a/mods/cottages/alias.lua b/mods/cottages/alias.lua new file mode 100644 index 00000000..8600a92f --- /dev/null +++ b/mods/cottages/alias.lua @@ -0,0 +1,40 @@ + +minetest.register_alias("random_buildings:roof", "cottages:roof_wood"); +minetest.register_alias("random_buildings:roof_connector", "cottages:roof_connector_wood"); +minetest.register_alias("random_buildings:roof_flat", "cottages:roof_flat_wood"); +minetest.register_alias("random_buildings:roof_wood", "cottages:roof_wood"); +minetest.register_alias("random_buildings:roof_connector_wood", "cottages:roof_connector_wood"); +minetest.register_alias("random_buildings:roof_flat_wood", "cottages:roof_flat_wood"); +minetest.register_alias("random_buildings:roof_straw", "cottages:roof_straw"); +minetest.register_alias("random_buildings:roof_connector_straw", "cottages:roof_connector_straw"); +minetest.register_alias("random_buildings:roof_flat_straw", "cottages:roof_flat_straw"); +minetest.register_alias("random_buildings:barrel", "cottages:barrel"); +minetest.register_alias("random_buildings:barrel_open", "cottages:barrel_open"); +minetest.register_alias("random_buildings:barrel_lying", "cottages:barrel_lying"); +minetest.register_alias("random_buildings:barrel_lying_open", "cottages:barrel_lying_open"); +minetest.register_alias("random_buildings:tub", "cottages:tub"); +minetest.register_alias("random_buildings:window_shutter_open", "cottages:window_shutter_open"); +minetest.register_alias("random_buildings:window_shutter_closed", "cottages:window_shutter_closed"); +minetest.register_alias("random_buildings:half_door", "cottages:half_door"); +minetest.register_alias("random_buildings:half_door_inverted", "cottages:half_door_inverted"); +minetest.register_alias("random_buildings:gate_closed", "cottages:gate_closed"); +minetest.register_alias("random_buildings:gate_open", "cottages:gate_open"); +minetest.register_alias("random_buildings:bed_foot", "cottages:bed_foot"); +minetest.register_alias("random_buildings:bed_head", "cottages:bed_head"); +minetest.register_alias("random_buildings:sleeping_mat", "cottages:sleeping_mat"); +minetest.register_alias("random_buildings:loam", "cottages:loam"); +minetest.register_alias("random_buildings:bench", "cottages:bench"); +minetest.register_alias("random_buildings:table", "cottages:table"); +minetest.register_alias("random_buildings:shelf", "cottages:shelf"); +minetest.register_alias("random_buildings:stovepipe", "cottages:stovepipe"); +minetest.register_alias("random_buildings:washing", "cottages:washing"); +minetest.register_alias("random_buildings:wagon_wheel", "cottages:wagon_wheel"); +minetest.register_alias("random_buildings:feldweg", "cottages:feldweg"); +minetest.register_alias("random_buildings:straw_ground", "cottages:straw_ground"); +minetest.register_alias("random_buildings:glass_pane", "cottages:glass_pane"); +minetest.register_alias("random_buildings:straw_mat", "cottages:straw_mat"); +minetest.register_alias("random_buildings:straw_bale", "cottages:straw_bale"); +minetest.register_alias("random_buildings:straw", "cottages:straw"); +minetest.register_alias("random_buildings:chest_private", "cottages:chest_private"); +minetest.register_alias("random_buildings:chest_work", "cottages:chest_work"); +minetest.register_alias("random_buildings:chest_storage", "cottages:chest_storage"); diff --git a/mods/cottages/depends.txt b/mods/cottages/depends.txt new file mode 100644 index 00000000..d0220ae3 --- /dev/null +++ b/mods/cottages/depends.txt @@ -0,0 +1,8 @@ +default? +farming? +stairs? +homedecor? +intllib? +trees? +wool? +moreblocks? diff --git a/mods/cottages/functions.lua b/mods/cottages/functions.lua new file mode 100644 index 00000000..81d88bc7 --- /dev/null +++ b/mods/cottages/functions.lua @@ -0,0 +1,42 @@ + +local S = cottages.S + +--- if no owner is set, all players may use the node; else only the owner +cottages.player_can_use = function( meta, player ) + if( not( player) or not( meta )) then + return false; + end + local pname = player:get_player_name(); + local owner = meta:get_string('owner' ); + local public = meta:get_string('public') + if( not(owner) or owner=="" or owner==pname or public=="public") then + return true; + end + return false; +end + + +-- call this in on_receive_fields and add suitable buttons in order +-- to switch between public and private use +cottages.switch_public = function(pos, formname, fields, sender, name_of_the_thing) + -- switch between public and private + local meta = minetest.get_meta(pos) + local public = meta:get_string("public") + local owner = meta:get_string("owner") + if( sender and sender:get_player_name() == owner and fields.public) then + if( public ~= "public") then + meta:set_string("public", "public") + meta:set_string("infotext", + S("Public "..name_of_the_thing.." (owned by %s)"):format(owner)) + minetest.chat_send_player(owner, + S("Your "..name_of_the_thing.." can now be used by other players as well.")) + else + meta:set_string("public", "") + meta:set_string("infotext", + S("Private "..name_of_the_thing.." (owned by %s)"):format(owner)) + minetest.chat_send_player(owner, + S("Your "..name_of_the_thing.." can only be used by yourself.")) + end + return true + end +end diff --git a/mods/cottages/init.lua b/mods/cottages/init.lua new file mode 100644 index 00000000..3874218b --- /dev/null +++ b/mods/cottages/init.lua @@ -0,0 +1,105 @@ + +-- Version: 2.2 +-- Autor: Sokomine +-- License: GPLv3 +-- +-- Modified: +-- 11.03.19 Adjustments for MT 5.x +-- cottages_feldweg_mode is now a setting in minetest.conf +-- 27.07.15 Moved into its own repository. +-- Made sure textures and craft receipe indigrents are available or can be replaced. +-- Took care of "unregistered globals" warnings. +-- 23.01.14 Added conversion receipes in case of installed castle-mod (has its own anvil) +-- 23.01.14 Added hammer and anvil as decoration and for repairing tools. +-- Added hatches (wood and steel). +-- Changed the texture of the fence/handrail. +-- 17.01.13 Added alternate receipe for fences in case of interference due to xfences +-- 14.01.13 Added alternate receipes for roof parts in case homedecor is not installed. +-- Added receipe for stove pipe, tub and barrel. +-- Added stairs/slabs for dirt road, loam and clay +-- Added fence_small, fence_corner and fence_end, which are useful as handrails and fences +-- If two or more window shutters are placed above each other, they will now all close/open simultaneously. +-- Added threshing floor. +-- Added hand-driven mill. + +cottages = {} + +-- Boilerplate to support localized strings if intllib mod is installed. +if minetest.get_modpath( "intllib" ) and intllib then + cottages.S = intllib.Getter() +else + cottages.S = function(s) return s end +end + +cottages.sounds = {} +-- MineClone2 needs special treatment; default is only needed for +-- crafting materials and sounds (less important) +if( not( minetest.get_modpath("default"))) then + default = {}; + cottages.sounds.wood = nil + cottages.sounds.dirt = nil + cottages.sounds.leaves = nil + cottages.sounds.stone = nil +else + cottages.sounds.wood = default.node_sound_wood_defaults() + cottages.sounds.dirt = default.node_sound_dirt_defaults() + cottages.sounds.stone = default.node_sound_stone_defaults() + cottages.sounds.leaves = default.node_sound_leaves_defaults() +end + +-- the straw from default comes with stairs as well and might replace +-- cottages:roof_connector_straw and cottages:roof_flat_straw +-- however, that does not look very good +if( false and minetest.registered_nodes["farming:straw"]) then + cottages.straw_texture = "farming_straw.png" + cottages.use_farming_straw_stairs = true +else + cottages.straw_texture = "cottages_darkage_straw.png" +end +--cottages.config_use_mesh_barrel = false; +--cottages.config_use_mesh_handmill = true; + +-- set alternate crafting materials and textures where needed +-- (i.e. in combination with realtest) +dofile(minetest.get_modpath("cottages").."/adaptions.lua"); + +-- add to this table what you want the handmill to convert; +-- add a stack size if you want a higher yield +cottages.handmill_product = {}; +cottages.handmill_product[ cottages.craftitem_seed_wheat ] = 'farming:flour 1'; +--[[ some examples: +cottages.handmill_product[ 'default:cobble' ] = 'default:gravel'; +cottages.handmill_product[ 'default:gravel' ] = 'default:sand'; +cottages.handmill_product[ 'default:sand' ] = 'default:dirt 2'; +cottages.handmill_product[ 'flowers:rose' ] = 'dye:red 6'; +cottages.handmill_product[ 'default:cactus' ] = 'dye:green 6'; +cottages.handmill_product[ 'default:coal_lump'] = 'dye:black 6'; +--]] +-- process that many inputs per turn +cottages.handmill_max_per_turn = 20; +cottages.handmill_min_per_turn = 0; + +dofile(minetest.get_modpath("cottages").."/functions.lua"); + +-- uncomment parts you do not want +dofile(minetest.get_modpath("cottages").."/nodes_furniture.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_historic.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_feldweg.lua"); +-- allows to dig hay and straw fast +dofile(minetest.get_modpath("cottages").."/nodes_pitchfork.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_straw.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_hay.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_anvil.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_doorlike.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_fences.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_roof.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_barrel.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_mining.lua"); +dofile(minetest.get_modpath("cottages").."/nodes_water.lua"); +--dofile(minetest.get_modpath("cottages").."/nodes_chests.lua"); + +-- this is only required and useful if you run versions of the random_buildings mod where the nodes where defined inside that mod +dofile(minetest.get_modpath("cottages").."/alias.lua"); + +-- variable no longer needed +cottages.S = nil; diff --git a/mods/cottages/locale/de.txt b/mods/cottages/locale/de.txt new file mode 100644 index 00000000..d8f8207f --- /dev/null +++ b/mods/cottages/locale/de.txt @@ -0,0 +1,157 @@ +# Translation by Xanthin + +### alias.lua ### + +### init.lua ### + +### nodes_anvil.lua ### +Steel hammer for repairing tools on the anvil = Stahlhammer um Werkzeuge auf dem Amboss zu reparieren +anvil = Amboss +Anvil = Amboss +The workpiece slot is for damaged tools only. = Das Werkstueckfeld gilt nur fuer beschaedigtes Werkzeug. +Your tool has been repaired successfully. = Dein Werkzeug wurde erfolgreich repariert. +Your workpiece improves. = Dein Werkstueck verbessert sich. +Anvil (owned by %s) = Amboss (gehoert %s) +Workpiece: = Werkstueck +Optional = Moegliche +storage for = Aufbewahrung fuer +your hammer = deinen Hammer +Owner: %s = Besitzer: %s +Punch anvil with hammer to = Schlage mit dem Hammer auf den Amboss um +repair tool in workpiece-slot. = das Werkzeug im Werkstueckfeld zu reparieren. + +### nodes_barrel.lua ### +Pour: = Eingiessen +Fill: = Ausgiessen +barrel (closed) = Fass (geschlossen) +barrel (open) = Fass (offen) +barrel (closed), lying somewhere = Liegendes Fass (geschlossen) +barrel (opened), lying somewhere = Liegendes Fass (offen) +tub = Bottich + +### nodes_chests.lua ### +private NPC chest = Private NSC-Truhe +chest for work utils and kitchens = NSC-Truhe fuer Arbeitsutensilien und Kuechen +storage chest = NSC-Lagertruhe + +### nodes_doorlike.lua ### +opened window shutters = Offene Fensterlaeden +closed window shutters = Geschlossene Fensterlaeden +half door = Kloentuer +half door inverted = Umgekehrte Kloentuer +closed fence gate = Geschlossenes Zauntor +opened fence gate = Offenes Zauntor +wooden hatch = Holzfalltuer +metal hatch = Metallfalltuer + +### nodes_fences.lua ### +small fence = Kleiner Zaun +small fence corner = Kleiner Zaun (Ecke) +small fence end = Kleiner Zaun (Ende) + +### nodes_furniture.lua ### +Bed (foot region) = Bett (Fussende) +Bed (head region) = Bett (Kopfende) +sleeping mat = Schlafmatte +simple wooden bench = Einfache Holzbank +table = Tisch +open storage shelf = Offenes Lagerregal +open storage shelf (in use) = Offenes Lagerregal (in Gebrauch) +open storage shelf (empty) = Offenes Lagerregal (leer) +stovepipe = Ofenrohr +washing place = Waschplatz +Sorry. This washing place is out of water. Please place it above water! = Entschuldige, dieser Waschplatz hat kein Wasser mehr. Bitte platziere ihn ueber Wasser! +You feel much cleaner after some washing. = Nach einer kleinen Waesche fuehlst du dich nun sauberer. + +### nodes_historic.lua ### +wagon wheel = Wagenrad +dirt road = Feldweg +loam = Lehm +Dirt Road Stairs = Feldwegtreppe +Dirt Road, half height = Feldwegstufe +Loam Stairs = Lehmtreppe +Loam Slab = Lehmstufe +Clay Stairs = Tontreppe +Clay Slab = Tonstufe +straw ground for animals = Strohboden fuer Tiere +simple glass pane = Einfache Fensterscheibe + +### nodes_roof.lua ### +Roof straw = Strohdach +Roof wood = Holzdach +Roof black = Schwarzes Dach +Roof red = Rotes Dach +Roof brown = Braunes Dach +Roof reet = Reetdach +Roof slate = Schieferdach +Roof connector straw = Strohdachverbinder +Roof connector wood = Holzdachverbinder +Roof connector black = Schwarzer Dachverbinder +Roof connector red = Roter Dachverbinder +Roof connector brown = Brauner Dachverbinder +Roof connector reet = Reet-Dachverbinder +Roof connector slate = Schiefer-Dachverbinder +Roof (flat) straw = Strohdach (flach) +Roof (flat) wood = Holzdach (flach) +Roof (flat) black = Schwarzes Dach (flach) +Roof (flat) red = Rotes Dach (flach) +Roof (flat) brown = Braunes Dach (flach) +Roof (flat) reet = Reetdach (flach) +Roof (flat) slate = Schieferdach (flach) +Vertical Slate = Vertikaler Schiefer +Reet for thatching = Reet + + +### nodes_straw.lua ### +layer of straw = Strohschicht +straw bale = Strohballen +straw = Stroh +threshing floor = Dreschboden +Threshing floor = Dreschboden +Threshing floor (owned by %s) = Dreschboden (gehoert %s) +Public threshing floor (owned by %s) = Öffentlicher Dreschboden (gehoert %s) +Private threshing floor (owned by %s) = Privater Dreschboden (gehoert %s) +Harvested wheat: = Geernteter Weizen +Straw: = Stroh +Seeds: = Koerner +Owner: %s = Besitzer: %s +Punch threshing floor with a stick = Schlage mit einem Stock auf den Dreschboden +to get straw and seeds from wheat. = um Stroh und Koerner vom Weizen zu bekommen. +You have threshed %s wheat (%s are left). = Du hast %s Weizenaehren gedroschen (%s bleiben uebrig). +You have threshed the last %s wheat. = Du hast die letzten %s Weizenaehren gedroschen. +mill, powered by punching = Muehle, durch Schlagen antreiben +Mill, powered by punching = Muehle, durch Schlagen antreiben +Mill, powered by punching (owned by %s) = Muehle, durch Schlagen antreiben (gehoert %s) +Public mill, powered by punching (owned by %s) = Öffentliche Muehle, durch Schlagen antreiben (gehoert %s) +Private mill, powered by punching (owned by %s) = Private Muehle, durch Schlagen antreiben (gehoert %s) +Wheat seeds: = Weizenkoerner +Flour: = Mehl +Mill = Muehle +Owner: %s = Besitzer: %s +Punch this hand-driven mill = Schlage auf diese handbetriebene Muehle +to convert wheat seeds into flour. = um Weizenkoerner in Mehl umzuwandeln. +You have grinded %s wheat seeds (%s are left). = Du hast %s Weizenkoerner gemahlen (%s bleiben uebrig). +You have grinded the last %s wheat seeds. = Du hast die letzten %s Weizenkoerner gemahlen. + +Your threshing floor can now be used by other players as well. = Dein Dreschboden kann jetzt auch von anderen Spielern benutzt werden. +Your mill, powered by punching can now be used by other players as well. = Deine Mühle kann jetzt auch von anderen Spielern benutzt werden. + +Your threshing floor can only be used by yourself. = Dein Dreschboden kann jetzt nur noch von dir selbst benutzt werden. +Your mill, powered by punching can only be used by yourself. = Deine Mühle kann jetzt nur noch von dir selbst benutzt werden. + +Public? = Oeffentlich? + +Public tree trunk well = Oeffentlicher Baumstammbrunnen +Public tree trunk well (owned by %s) = Oeffentlicher Baumstammbrunnen (gehoert %s) +Private tree trunk well (owned by %s) = Privater Baumstammbrunnen (gehoert %s) +This tree trunk well is owned by %s. You can't use it. = Dieser Baumstammbrunnen gehoert %s. Du kannst ihn leider nicht benutzen. +Sorry. You have no room for the bucket. Please free some space in your inventory first! = Du hast leider keinen Platz mehr fuer den Eimer. Bitte schaffe erst ein wenig Platz! +Your tree trunk well can now be used by other players as well. = Dein Baumstammbrunnen kann jetzt auch von anderen Spielern benutzt werdn. +Your tree trunk well can only be used by yourself. = Dein Baumstammbrunnen kann jetzt nur noch von dir selbst benutzt werdn. + +pitchfork (dig dirt with grass to get hay, place with right-click) = Heugabel (grabe Erde mit Grass um Heu zu bekommen; Rechts-Klick zum Platzieren) +pitchfork (for hay and straw) = Heugabel (fuer Heu und Stroh) + +Some hay = Etwas Heu +Hay = Heu +Hay bale = Heuballen diff --git a/mods/cottages/locale/template.txt b/mods/cottages/locale/template.txt new file mode 100644 index 00000000..40c24d33 --- /dev/null +++ b/mods/cottages/locale/template.txt @@ -0,0 +1,155 @@ +# Template + +### alias.lua ### + +### init.lua ### + +### nodes_anvil.lua ### +Steel hammer for repairing tools on the anvil = +anvil = +Anvil = +The workpiece slot is for damaged tools only. = +Your tool has been repaired successfully. = +Your workpiece improves. = +Anvil (owned by %s) = +Workpiece: = +Optional = +storage for = +your hammer = +Owner: %s = +Punch anvil with hammer to = +repair tool in workpiece-slot. = + +### nodes_barrel.lua ### +Pour: = +Fill: = +barrel (closed) = +barrel (open) = +barrel (closed), lying somewhere = +barrel (opened), lying somewhere = +tub = + +### nodes_chests.lua ### +private NPC chest = +chest for work utils and kitchens = +storage chest = + +### nodes_doorlike.lua ### +opened window shutters = +closed window shutters = +half door = +half door inverted = +closed fence gate = +opened fence gate = +wooden hatch = +metal hatch = + +### nodes_fences.lua ### +small fence = +small fence corner = +small fence end = + +### nodes_furniture.lua ### +Bed (foot region) = +Bed (head region) = +sleeping mat = +simple wooden bench = +table = +open storage shelf = +open storage shelf (in use) = +open storage shelf (empty) = +stovepipe = +washing place = +Sorry. This washing place is out of water. Please place it above water! = +You feel much cleaner after some washing. = + +### nodes_historic.lua ### +wagon wheel = +dirt road = +loam = +Dirt Road Stairs = +Dirt Road, half height = +Loam Stairs = +Loam Slab = +Clay Stairs = +Clay Slab = +straw ground for animals = +simple glass pane = + +### nodes_roof.lua ### +Roof straw = +Roof wood = +Roof black = +Roof red = +Roof brown = +Roof reet = +Roof slate = +Roof connector straw = +Roof connector wood = +Roof connector black = +Roof connector red = +Roof connector brown = +Roof connector reet = +Roof connector slate = +Roof (flat) straw = +Roof (flat) wood = +Roof (flat) black = +Roof (flat) red = +Roof (flat) brown = +Roof (flat) reet = +Roof (flat) slate = +Vertical Slate = +Reet for thatching = + +### nodes_straw.lua ### +layer of straw = +straw bale = +straw = +threshing floor = +Threshing floor = +Threshing floor (owned by %s) = +Public threshing floor (owned by %s) = +Private threshing floor (owned by %s) = +Harvested wheat: = +Straw: = +Seeds: = +Owner: %s = +Punch threshing floor with a stick = +to get straw and seeds from wheat. = +You have threshed %s wheat (%s are left). = +You have threshed the last %s wheat. = +mill, powered by punching = +Mill, powered by punching = +Mill, powered by punching (owned by %s) = +Public mill, powered by punching (owned by %s) = +Private mill, powered by punching (owned by %s) = +Wheat seeds: = +Flour: = +Mill = +Owner: %s = +Punch this hand-driven mill = +to convert wheat seeds into flour. = +You have grinded %s wheat seeds (%s are left). = +You have grinded the last %s wheat seeds. = + +Your threshing floor can now be used by other players as well. = +Your mill, powered by punching can now be used by other players as well. = + +Your threshing floor can only be used by yourself. = +Your mill, powered by punching can only be used by yourself. = + +Public? = + +Public tree trunk well = +Public tree trunk well (owned by %s) = +This tree trunk well is owned by %s. You can't use it. = +Sorry. You have no room for the bucket. Please free some space in your inventory first! = +Your tree trunk well can now be used by other players as well. = +Your tree trunk well can only be used by yourself. = + +pitchfork (dig dirt with grass to get hay, place with right-click) = +pitchfork (for hay and straw) = + +Some hay = +Hay = +Hay bale = diff --git a/mods/cottages/models/cottages_barrel.obj b/mods/cottages/models/cottages_barrel.obj new file mode 100644 index 00000000..41258c32 --- /dev/null +++ b/mods/cottages/models/cottages_barrel.obj @@ -0,0 +1,543 @@ +# Blender v2.69 (sub 0) OBJ File: 'barrel.blend' +# www.blender.org +o Cylinder +v 0.092835 -0.500001 -0.466712 +v 0.092835 0.500000 -0.466712 +v 0.264371 -0.500001 -0.395660 +v 0.264371 0.500000 -0.395660 +v 0.395660 -0.500001 -0.264371 +v 0.395660 0.500000 -0.264371 +v 0.466712 -0.500001 -0.092835 +v 0.466712 0.500000 -0.092835 +v 0.466712 -0.500001 0.092835 +v 0.466712 0.500000 0.092835 +v 0.395660 -0.500001 0.264371 +v 0.395660 0.500000 0.264371 +v 0.264371 -0.500001 0.395660 +v 0.264371 0.500000 0.395660 +v 0.092835 -0.500001 0.466712 +v 0.092835 0.500000 0.466712 +v -0.092835 -0.500001 0.466712 +v -0.092835 0.500000 0.466712 +v -0.264371 -0.500001 0.395660 +v -0.264371 0.500000 0.395660 +v -0.395660 -0.500001 0.264371 +v -0.395660 0.500000 0.264371 +v -0.466712 -0.500001 0.092835 +v -0.466712 0.500000 0.092835 +v -0.466712 -0.500001 -0.092835 +v -0.466712 0.500000 -0.092835 +v -0.395660 -0.500001 -0.264371 +v -0.395660 0.500000 -0.264371 +v -0.264371 -0.500001 -0.395660 +v -0.264371 0.500000 -0.395660 +v -0.092835 -0.500001 -0.466713 +v -0.092835 0.500000 -0.466713 +v 0.095930 0.413334 -0.482270 +v 0.273184 -0.413334 -0.408849 +v 0.408849 -0.413334 -0.273184 +v 0.482270 -0.413334 -0.095929 +v 0.482270 -0.413334 0.095930 +v 0.408849 -0.413334 0.273184 +v 0.273184 -0.413334 0.408849 +v 0.095929 -0.413334 0.482270 +v -0.095929 -0.413334 0.482270 +v -0.273184 -0.413334 0.408849 +v -0.408849 -0.413334 0.273184 +v -0.482270 -0.413334 0.095929 +v -0.482270 -0.413334 -0.095930 +v -0.408849 -0.413334 -0.273184 +v -0.273184 -0.413334 -0.408849 +v -0.095929 -0.413334 -0.482270 +v 0.095930 -0.413334 -0.482270 +v 0.273184 0.413334 -0.408849 +v 0.408849 0.413334 -0.273184 +v 0.482270 0.413334 -0.095929 +v 0.482270 0.413334 0.095930 +v 0.408849 0.413334 0.273184 +v 0.273184 0.413334 0.408849 +v 0.095929 0.413334 0.482270 +v -0.095929 0.413334 0.482270 +v -0.273184 0.413334 0.408849 +v -0.408849 0.413334 0.273184 +v -0.482270 0.413334 0.095929 +v -0.482270 0.413334 -0.095930 +v -0.408849 0.413334 -0.273184 +v -0.273184 0.413334 -0.408849 +v -0.095929 0.413334 -0.482270 +v 0.099128 0.114830 -0.498352 +v 0.282294 -0.114831 -0.422482 +v 0.422482 -0.114831 -0.282294 +v 0.498352 -0.114831 -0.099128 +v 0.498352 -0.114831 0.099128 +v 0.422482 -0.114831 0.282294 +v 0.282294 -0.114831 0.422482 +v 0.099128 -0.114831 0.498352 +v -0.099128 -0.114831 0.498352 +v -0.282294 -0.114831 0.422482 +v -0.422482 -0.114831 0.282294 +v -0.498352 -0.114831 0.099128 +v -0.498352 -0.114831 -0.099128 +v -0.422482 -0.114831 -0.282294 +v -0.282293 -0.114831 -0.422482 +v -0.099128 -0.114831 -0.498352 +v 0.099128 -0.114831 -0.498352 +v 0.282294 0.114830 -0.422482 +v 0.422482 0.114830 -0.282294 +v 0.498352 0.114830 -0.099128 +v 0.498352 0.114830 0.099128 +v 0.422482 0.114830 0.282294 +v 0.282294 0.114830 0.422482 +v 0.099128 0.114830 0.498352 +v -0.099128 0.114830 0.498352 +v -0.282294 0.114830 0.422482 +v -0.422482 0.114830 0.282294 +v -0.498352 0.114830 0.099128 +v -0.498352 0.114830 -0.099128 +v -0.422482 0.114830 -0.282294 +v -0.282293 0.114830 -0.422482 +v -0.099128 0.114830 -0.498352 +v 0.083551 -0.500001 -0.420041 +v 0.083551 0.500000 -0.420041 +v 0.237934 -0.500001 -0.356094 +v 0.237934 0.500000 -0.356094 +v 0.356094 -0.500001 -0.237934 +v 0.356094 0.500000 -0.237934 +v 0.420041 -0.500001 -0.083551 +v 0.420041 0.500000 -0.083551 +v 0.420041 -0.500001 0.083551 +v 0.420041 0.500000 0.083551 +v 0.356094 -0.500001 0.237934 +v 0.356094 0.500000 0.237934 +v 0.237934 -0.500001 0.356094 +v 0.237934 0.500000 0.356094 +v 0.083551 -0.500001 0.420041 +v 0.083551 0.500000 0.420041 +v -0.083551 -0.500001 0.420041 +v -0.083551 0.500000 0.420041 +v -0.237934 -0.500001 0.356094 +v -0.237934 0.500000 0.356094 +v -0.356094 -0.500001 0.237934 +v -0.356094 0.500000 0.237934 +v -0.420041 -0.500001 0.083551 +v -0.420041 0.500000 0.083551 +v -0.420041 -0.500001 -0.083551 +v -0.420041 0.500000 -0.083551 +v -0.356094 -0.500001 -0.237934 +v -0.356094 0.500000 -0.237934 +v -0.237934 -0.500001 -0.356094 +v -0.237934 0.500000 -0.356094 +v -0.083551 -0.500001 -0.420041 +v -0.083551 0.500000 -0.420041 +v 0.086337 0.413334 -0.434043 +v 0.245866 -0.413335 -0.367964 +v 0.367964 -0.413335 -0.245866 +v 0.434043 -0.413335 -0.086336 +v 0.434043 -0.413335 0.086337 +v 0.367964 -0.413335 0.245866 +v 0.245866 -0.413335 0.367964 +v 0.086337 -0.413335 0.434043 +v -0.086336 -0.413335 0.434043 +v -0.245866 -0.413335 0.367964 +v -0.367964 -0.413335 0.245866 +v -0.434043 -0.413335 0.086337 +v -0.434043 -0.413335 -0.086337 +v -0.367964 -0.413335 -0.245866 +v -0.245865 -0.413335 -0.367964 +v -0.086336 -0.413335 -0.434043 +v 0.086337 -0.413335 -0.434043 +v 0.245866 0.413334 -0.367964 +v 0.367964 0.413334 -0.245866 +v 0.434043 0.413334 -0.086336 +v 0.434043 0.413334 0.086337 +v 0.367964 0.413334 0.245866 +v 0.245866 0.413334 0.367964 +v 0.086337 0.413334 0.434043 +v -0.086336 0.413334 0.434043 +v -0.245866 0.413334 0.367964 +v -0.367964 0.413334 0.245866 +v -0.434043 0.413334 0.086337 +v -0.434043 0.413334 -0.086337 +v -0.367964 0.413334 -0.245866 +v -0.245865 0.413334 -0.367964 +v -0.086336 0.413334 -0.434043 +v 0.089216 0.114830 -0.448517 +v 0.254064 -0.114831 -0.380234 +v 0.380234 -0.114831 -0.254064 +v 0.448517 -0.114831 -0.089215 +v 0.448517 -0.114831 0.089216 +v 0.380234 -0.114831 0.254064 +v 0.254064 -0.114831 0.380234 +v 0.089216 -0.114831 0.448517 +v -0.089215 -0.114831 0.448517 +v -0.254064 -0.114831 0.380234 +v -0.380234 -0.114831 0.254064 +v -0.448517 -0.114831 0.089216 +v -0.448517 -0.114831 -0.089216 +v -0.380234 -0.114831 -0.254064 +v -0.254064 -0.114831 -0.380234 +v -0.089215 -0.114831 -0.448517 +v 0.089216 -0.114831 -0.448517 +v 0.254064 0.114830 -0.380234 +v 0.380234 0.114830 -0.254064 +v 0.448517 0.114830 -0.089215 +v 0.448517 0.114830 0.089216 +v 0.380234 0.114830 0.254064 +v 0.254064 0.114830 0.380234 +v 0.089216 0.114830 0.448517 +v -0.089215 0.114830 0.448517 +v -0.254064 0.114830 0.380234 +v -0.380234 0.114830 0.254064 +v -0.448517 0.114830 0.089216 +v -0.448517 0.114830 -0.089216 +v -0.380234 0.114830 -0.254064 +v -0.254064 0.114830 -0.380234 +v -0.089215 0.114830 -0.448517 +v 0.087776 -0.352645 -0.441280 +v -0.087776 -0.352645 -0.441280 +v -0.249965 -0.352645 -0.374099 +v -0.374099 -0.352645 -0.249965 +v -0.441280 -0.352645 -0.087776 +v -0.441280 -0.352645 0.087776 +v -0.374099 -0.352645 0.249965 +v -0.249965 -0.352645 0.374099 +v -0.087776 -0.352645 0.441280 +v 0.087776 -0.352645 0.441280 +v 0.249965 -0.352645 0.374099 +v 0.374099 -0.352645 0.249965 +v 0.441280 -0.352645 0.087776 +v 0.441280 -0.352645 -0.087776 +v 0.374099 -0.352645 -0.249965 +v 0.249965 -0.352645 -0.374099 +v 0.000000 -0.352645 0.000000 +v -0.000000 -0.413334 0.000000 +vt 0.211538 0.442308 +vt 0.211538 0.467949 +vt 0.108974 0.467949 +vt 0.108974 0.442308 +vt 0.314103 0.442308 +vt 0.314103 0.467949 +vt 0.416667 0.442308 +vt 0.416667 0.467949 +vt 0.006410 0.467949 +vt 0.006410 0.442308 +vt 0.211792 0.993590 +vt 0.117562 0.954728 +vt 0.262789 0.738327 +vt 0.211538 0.006410 +vt 0.108974 0.006410 +vt 0.108974 0.032051 +vt 0.211538 0.032051 +vt 0.314103 0.006410 +vt 0.314103 0.032051 +vt 0.416667 0.006410 +vt 0.416667 0.032051 +vt 0.006410 0.006410 +vt 0.006410 0.032051 +vt 0.211361 0.993526 +vt 0.117394 0.954505 +vt 0.262040 0.737637 +vt 0.045447 0.882467 +vt 0.006475 0.788381 +vt 0.006410 0.686569 +vt 0.045263 0.592532 +vt 0.117118 0.520586 +vt 0.204627 0.488094 +vt 0.312719 0.481748 +vt 0.406687 0.520769 +vt 0.478633 0.592807 +vt 0.517605 0.686893 +vt 0.517670 0.788705 +vt 0.478816 0.882742 +vt 0.406962 0.954687 +vt 0.313044 0.993590 +vt 0.045441 0.882922 +vt 0.006410 0.789102 +vt 0.006410 0.687551 +vt 0.045442 0.593732 +vt 0.117562 0.521925 +vt 0.211793 0.483064 +vt 0.313787 0.483064 +vt 0.408016 0.521926 +vt 0.480136 0.593732 +vt 0.519168 0.687551 +vt 0.519168 0.789103 +vt 0.480136 0.882922 +vt 0.408016 0.954728 +vt 0.313786 0.993590 +vt 0.416667 0.397436 +vt 0.314103 0.397436 +vt 0.211538 0.397436 +vt 0.108974 0.397436 +vt 0.006410 0.397436 +vt 0.314103 0.185897 +vt 0.314103 0.282051 +vt 0.211538 0.282051 +vt 0.211538 0.185897 +vt 0.108974 0.282051 +vt 0.108974 0.185897 +vt 0.006410 0.282051 +vt 0.006410 0.185897 +vt 0.416667 0.185897 +vt 0.416667 0.282051 +vt 0.416667 0.076923 +vt 0.314103 0.076923 +vt 0.211538 0.076923 +vt 0.108974 0.076923 +vt 0.006410 0.076923 +vt 0.429487 0.397436 +vt 0.532051 0.397436 +vt 0.532051 0.442308 +vt 0.429487 0.442308 +vt 0.634615 0.397436 +vt 0.634615 0.442308 +vt 0.737179 0.397436 +vt 0.737179 0.442308 +vt 0.839744 0.397436 +vt 0.839744 0.442308 +vt 0.532051 0.185897 +vt 0.634615 0.185897 +vt 0.634615 0.282051 +vt 0.532051 0.282051 +vt 0.737179 0.185897 +vt 0.737179 0.282051 +vt 0.839744 0.185897 +vt 0.839744 0.282051 +vt 0.429487 0.185897 +vt 0.429487 0.282051 +vt 0.429487 0.032051 +vt 0.532051 0.032051 +vt 0.532051 0.076923 +vt 0.429487 0.076923 +vt 0.634615 0.032051 +vt 0.634615 0.076923 +vt 0.737179 0.032051 +vt 0.737179 0.076923 +vt 0.839744 0.032051 +vt 0.839744 0.076923 +s off +f 14/1 110/2 112/3 16/4 +f 12/5 108/6 110/2 14/1 +f 10/7 106/8 108/6 12/5 +f 8/4 104/3 106/9 10/10 +f 6/1 102/2 104/3 8/4 +f 4/5 100/6 102/2 6/1 +f 2/7 98/8 100/6 4/5 +f 32/4 128/3 98/9 2/10 +f 30/1 126/2 128/3 32/4 +f 28/5 124/6 126/2 30/1 +f 26/7 122/8 124/6 28/5 +f 24/4 120/3 122/9 26/10 +f 22/1 118/2 120/3 24/4 +f 20/5 116/6 118/2 22/1 +f 18/7 114/8 116/6 20/5 +f 16/4 112/3 114/9 18/10 +f 145/11 130/12 210/13 +f 13/14 15/15 111/16 109/17 +f 11/18 13/14 109/17 107/19 +f 9/20 11/18 107/19 105/21 +f 7/15 9/22 105/23 103/16 +f 5/14 7/15 103/16 101/17 +f 3/18 5/14 101/17 99/19 +f 1/20 3/18 99/19 97/21 +f 31/15 1/22 97/23 127/16 +f 29/14 31/15 127/16 125/17 +f 27/18 29/14 125/17 123/19 +f 25/20 27/18 123/19 121/21 +f 23/15 25/22 121/23 119/16 +f 21/14 23/15 119/16 117/17 +f 19/18 21/14 117/17 115/19 +f 17/20 19/18 115/19 113/21 +f 15/15 17/22 113/23 111/16 +f 194/24 195/25 209/26 +f 195/25 196/27 209/26 +f 196/27 197/28 209/26 +f 197/28 198/29 209/26 +f 198/29 199/30 209/26 +f 199/30 200/31 209/26 +f 200/31 201/32 209/26 +f 201/32 202/33 209/26 +f 202/33 203/34 209/26 +f 203/34 204/35 209/26 +f 204/35 205/36 209/26 +f 205/36 206/37 209/26 +f 206/37 207/38 209/26 +f 207/38 208/39 209/26 +f 208/39 193/40 209/26 +f 193/40 194/24 209/26 +f 130/12 131/41 210/13 +f 131/41 132/42 210/13 +f 132/42 133/43 210/13 +f 133/43 134/44 210/13 +f 134/44 135/45 210/13 +f 135/45 136/46 210/13 +f 136/46 137/47 210/13 +f 137/47 138/48 210/13 +f 138/48 139/49 210/13 +f 139/49 140/50 210/13 +f 140/50 141/51 210/13 +f 141/51 142/52 210/13 +f 142/52 143/53 210/13 +f 143/53 144/54 210/13 +f 144/54 145/11 210/13 +s 1 +f 33/55 2/7 4/5 50/56 +f 50/56 4/5 6/1 51/57 +f 51/57 6/1 8/4 52/58 +f 52/58 8/4 10/10 53/59 +f 53/55 10/7 12/5 54/56 +f 54/56 12/5 14/1 55/57 +f 55/57 14/1 16/4 56/58 +f 56/58 16/4 18/10 57/59 +f 57/55 18/7 20/5 58/56 +f 58/56 20/5 22/1 59/57 +f 59/57 22/1 24/4 60/58 +f 60/58 24/4 26/10 61/59 +f 61/55 26/7 28/5 62/56 +f 62/56 28/5 30/1 63/57 +f 64/58 32/4 2/10 33/59 +f 63/57 30/1 32/4 64/58 +f 66/60 82/61 83/62 67/63 +f 67/63 83/62 84/64 68/65 +f 68/65 84/64 85/66 69/67 +f 69/68 85/69 86/61 70/60 +f 70/60 86/61 87/62 71/63 +f 71/63 87/62 88/64 72/65 +f 72/65 88/64 89/66 73/67 +f 73/68 89/69 90/61 74/60 +f 74/60 90/61 91/62 75/63 +f 75/63 91/62 92/64 76/65 +f 76/65 92/64 93/66 77/67 +f 77/68 93/69 94/61 78/60 +f 78/60 94/61 95/62 79/63 +f 80/65 96/64 65/66 81/67 +f 79/63 95/62 96/64 80/65 +f 65/69 33/55 50/56 82/61 +f 82/61 50/56 51/57 83/62 +f 83/62 51/57 52/58 84/64 +f 84/64 52/58 53/59 85/66 +f 85/69 53/55 54/56 86/61 +f 86/61 54/56 55/57 87/62 +f 87/62 55/57 56/58 88/64 +f 88/64 56/58 57/59 89/66 +f 89/69 57/55 58/56 90/61 +f 90/61 58/56 59/57 91/62 +f 91/62 59/57 60/58 92/64 +f 92/64 60/58 61/59 93/66 +f 93/69 61/55 62/56 94/61 +f 94/61 62/56 63/57 95/62 +f 96/64 64/58 33/59 65/66 +f 95/62 63/57 64/58 96/64 +f 1/21 49/70 34/71 3/19 +f 3/19 34/71 35/72 5/17 +f 5/17 35/72 36/73 7/16 +f 7/16 36/73 37/74 9/23 +f 9/21 37/70 38/71 11/19 +f 11/19 38/71 39/72 13/17 +f 13/17 39/72 40/73 15/16 +f 15/16 40/73 41/74 17/23 +f 17/21 41/70 42/71 19/19 +f 19/19 42/71 43/72 21/17 +f 21/17 43/72 44/73 23/16 +f 23/16 44/73 45/74 25/23 +f 25/21 45/70 46/71 27/19 +f 27/19 46/71 47/72 29/17 +f 31/16 48/73 49/74 1/23 +f 29/17 47/72 48/73 31/16 +f 49/70 81/68 66/60 34/71 +f 34/71 66/60 67/63 35/72 +f 35/72 67/63 68/65 36/73 +f 36/73 68/65 69/67 37/74 +f 37/70 69/68 70/60 38/71 +f 38/71 70/60 71/63 39/72 +f 39/72 71/63 72/65 40/73 +f 40/73 72/65 73/67 41/74 +f 41/70 73/68 74/60 42/71 +f 42/71 74/60 75/63 43/72 +f 43/72 75/63 76/65 44/73 +f 44/73 76/65 77/67 45/74 +f 45/70 77/68 78/60 46/71 +f 46/71 78/60 79/63 47/72 +f 48/73 80/65 81/67 49/74 +f 47/72 79/63 80/65 48/73 +f 65/69 82/61 66/60 81/68 +f 129/75 146/76 100/77 98/78 +f 146/76 147/79 102/80 100/77 +f 147/79 148/81 104/82 102/80 +f 148/81 149/83 106/84 104/82 +f 149/75 150/76 108/77 106/78 +f 150/76 151/79 110/80 108/77 +f 151/79 152/81 112/82 110/80 +f 152/81 153/83 114/84 112/82 +f 153/75 154/76 116/77 114/78 +f 154/76 155/79 118/80 116/77 +f 155/79 156/81 120/82 118/80 +f 156/81 157/83 122/84 120/82 +f 157/75 158/76 124/77 122/78 +f 158/76 159/79 126/80 124/77 +f 160/81 129/83 98/84 128/82 +f 159/79 160/81 128/82 126/80 +f 162/85 163/86 179/87 178/88 +f 163/86 164/89 180/90 179/87 +f 164/89 165/91 181/92 180/90 +f 165/93 166/85 182/88 181/94 +f 166/85 167/86 183/87 182/88 +f 167/86 168/89 184/90 183/87 +f 168/89 169/91 185/92 184/90 +f 169/93 170/85 186/88 185/94 +f 170/85 171/86 187/87 186/88 +f 171/86 172/89 188/90 187/87 +f 172/89 173/91 189/92 188/90 +f 173/93 174/85 190/88 189/94 +f 174/85 175/86 191/87 190/88 +f 176/89 177/91 161/92 192/90 +f 175/86 176/89 192/90 191/87 +f 161/94 178/88 146/76 129/75 +f 178/88 179/87 147/79 146/76 +f 179/87 180/90 148/81 147/79 +f 180/90 181/92 149/83 148/81 +f 181/94 182/88 150/76 149/75 +f 182/88 183/87 151/79 150/76 +f 183/87 184/90 152/81 151/79 +f 184/90 185/92 153/83 152/81 +f 185/94 186/88 154/76 153/75 +f 186/88 187/87 155/79 154/76 +f 187/87 188/90 156/81 155/79 +f 188/90 189/92 157/83 156/81 +f 189/94 190/88 158/76 157/75 +f 190/88 191/87 159/79 158/76 +f 192/90 161/92 129/83 160/81 +f 191/87 192/90 160/81 159/79 +f 97/95 99/96 130/97 145/98 +f 99/96 101/99 131/100 130/97 +f 101/99 103/101 132/102 131/100 +f 103/101 105/103 133/104 132/102 +f 105/95 107/96 134/97 133/98 +f 107/96 109/99 135/100 134/97 +f 109/99 111/101 136/102 135/100 +f 111/101 113/103 137/104 136/102 +f 113/95 115/96 138/97 137/98 +f 115/96 117/99 139/100 138/97 +f 117/99 119/101 140/102 139/100 +f 119/101 121/103 141/104 140/102 +f 121/95 123/96 142/97 141/98 +f 123/96 125/99 143/100 142/97 +f 127/101 97/103 145/104 144/102 +f 125/99 127/101 144/102 143/100 +f 193/98 208/97 162/85 177/93 +f 208/97 207/100 163/86 162/85 +f 207/100 206/102 164/89 163/86 +f 206/102 205/104 165/91 164/89 +f 205/98 204/97 166/85 165/93 +f 204/97 203/100 167/86 166/85 +f 203/100 202/102 168/89 167/86 +f 202/102 201/104 169/91 168/89 +f 201/98 200/97 170/85 169/93 +f 200/97 199/100 171/86 170/85 +f 199/100 198/102 172/89 171/86 +f 198/102 197/104 173/91 172/89 +f 197/98 196/97 174/85 173/93 +f 196/97 195/100 175/86 174/85 +f 194/102 193/104 177/91 176/89 +f 195/100 194/102 176/89 175/86 +f 161/94 177/93 162/85 178/88 diff --git a/mods/cottages/models/cottages_barrel_closed.obj b/mods/cottages/models/cottages_barrel_closed.obj new file mode 100644 index 00000000..f2ab55ac --- /dev/null +++ b/mods/cottages/models/cottages_barrel_closed.obj @@ -0,0 +1,453 @@ +# Blender v2.69 (sub 0) OBJ File: 'barrel-closed.blend' +# www.blender.org +o Cylinder +v 0.092835 -0.500001 -0.466712 +v 0.092835 0.500000 -0.466712 +v 0.264371 -0.500001 -0.395660 +v 0.264371 0.500000 -0.395660 +v 0.395660 -0.500001 -0.264371 +v 0.395660 0.500000 -0.264371 +v 0.466712 -0.500001 -0.092835 +v 0.466712 0.500000 -0.092835 +v 0.466712 -0.500001 0.092835 +v 0.466712 0.500000 0.092835 +v 0.395660 -0.500001 0.264371 +v 0.395660 0.500000 0.264371 +v 0.264371 -0.500001 0.395660 +v 0.264371 0.500000 0.395660 +v 0.092835 -0.500001 0.466712 +v 0.092835 0.500000 0.466712 +v -0.092835 -0.500001 0.466712 +v -0.092835 0.500000 0.466712 +v -0.264371 -0.500001 0.395660 +v -0.264371 0.500000 0.395660 +v -0.395660 -0.500001 0.264371 +v -0.395660 0.500000 0.264371 +v -0.466712 -0.500001 0.092835 +v -0.466712 0.500000 0.092835 +v -0.466712 -0.500001 -0.092835 +v -0.466712 0.500000 -0.092835 +v -0.395660 -0.500001 -0.264371 +v -0.395660 0.500000 -0.264371 +v -0.264371 -0.500001 -0.395660 +v -0.264371 0.500000 -0.395660 +v -0.092835 -0.500001 -0.466713 +v -0.092835 0.500000 -0.466713 +v 0.095930 0.413334 -0.482270 +v 0.273184 -0.413334 -0.408849 +v 0.408849 -0.413334 -0.273184 +v 0.482270 -0.413334 -0.095929 +v 0.482270 -0.413334 0.095930 +v 0.408849 -0.413334 0.273184 +v 0.273184 -0.413334 0.408849 +v 0.095929 -0.413334 0.482270 +v -0.095929 -0.413334 0.482270 +v -0.273184 -0.413334 0.408849 +v -0.408849 -0.413334 0.273184 +v -0.482270 -0.413334 0.095929 +v -0.482270 -0.413334 -0.095930 +v -0.408849 -0.413334 -0.273184 +v -0.273184 -0.413334 -0.408849 +v -0.095929 -0.413334 -0.482270 +v 0.095930 -0.413334 -0.482270 +v 0.273184 0.413334 -0.408849 +v 0.408849 0.413334 -0.273184 +v 0.482270 0.413334 -0.095929 +v 0.482270 0.413334 0.095930 +v 0.408849 0.413334 0.273184 +v 0.273184 0.413334 0.408849 +v 0.095929 0.413334 0.482270 +v -0.095929 0.413334 0.482270 +v -0.273184 0.413334 0.408849 +v -0.408849 0.413334 0.273184 +v -0.482270 0.413334 0.095929 +v -0.482270 0.413334 -0.095930 +v -0.408849 0.413334 -0.273184 +v -0.273184 0.413334 -0.408849 +v -0.095929 0.413334 -0.482270 +v 0.099128 0.114830 -0.498352 +v 0.282294 -0.114831 -0.422482 +v 0.422482 -0.114831 -0.282294 +v 0.498352 -0.114831 -0.099128 +v 0.498352 -0.114831 0.099128 +v 0.422482 -0.114831 0.282294 +v 0.282294 -0.114831 0.422482 +v 0.099128 -0.114831 0.498352 +v -0.099128 -0.114831 0.498352 +v -0.282294 -0.114831 0.422482 +v -0.422482 -0.114831 0.282294 +v -0.498352 -0.114831 0.099128 +v -0.498352 -0.114831 -0.099128 +v -0.422482 -0.114831 -0.282294 +v -0.282293 -0.114831 -0.422482 +v -0.099128 -0.114831 -0.498352 +v 0.099128 -0.114831 -0.498352 +v 0.282294 0.114830 -0.422482 +v 0.422482 0.114830 -0.282294 +v 0.498352 0.114830 -0.099128 +v 0.498352 0.114830 0.099128 +v 0.422482 0.114830 0.282294 +v 0.282294 0.114830 0.422482 +v 0.099128 0.114830 0.498352 +v -0.099128 0.114830 0.498352 +v -0.282294 0.114830 0.422482 +v -0.422482 0.114830 0.282294 +v -0.498352 0.114830 0.099128 +v -0.498352 0.114830 -0.099128 +v -0.422482 0.114830 -0.282294 +v -0.282293 0.114830 -0.422482 +v -0.099128 0.114830 -0.498352 +v 0.083551 -0.500001 -0.420041 +v 0.083551 0.500000 -0.420041 +v 0.237934 -0.500001 -0.356094 +v 0.237934 0.500000 -0.356094 +v 0.356094 -0.500001 -0.237934 +v 0.356094 0.500000 -0.237934 +v 0.420041 -0.500001 -0.083551 +v 0.420041 0.500000 -0.083551 +v 0.420041 -0.500001 0.083551 +v 0.420041 0.500000 0.083551 +v 0.356094 -0.500001 0.237934 +v 0.356094 0.500000 0.237934 +v 0.237934 -0.500001 0.356094 +v 0.237934 0.500000 0.356094 +v 0.083551 -0.500001 0.420041 +v 0.083551 0.500000 0.420041 +v -0.083551 -0.500001 0.420041 +v -0.083551 0.500000 0.420041 +v -0.237934 -0.500001 0.356094 +v -0.237934 0.500000 0.356094 +v -0.356094 -0.500001 0.237934 +v -0.356094 0.500000 0.237934 +v -0.420041 -0.500001 0.083551 +v -0.420041 0.500000 0.083551 +v -0.420041 -0.500001 -0.083551 +v -0.420041 0.500000 -0.083551 +v -0.356094 -0.500001 -0.237934 +v -0.356094 0.500000 -0.237934 +v -0.237934 -0.500001 -0.356094 +v -0.237934 0.500000 -0.356094 +v -0.083551 -0.500001 -0.420041 +v -0.083551 0.500000 -0.420041 +v 0.086337 0.413334 -0.434043 +v 0.245866 -0.413335 -0.367964 +v 0.367964 -0.413335 -0.245866 +v 0.434043 -0.413335 -0.086336 +v 0.434043 -0.413335 0.086337 +v 0.367964 -0.413335 0.245866 +v 0.245866 -0.413335 0.367964 +v 0.086337 -0.413335 0.434043 +v -0.086336 -0.413335 0.434043 +v -0.245866 -0.413335 0.367964 +v -0.367964 -0.413335 0.245866 +v -0.434043 -0.413335 0.086337 +v -0.434043 -0.413335 -0.086337 +v -0.367964 -0.413335 -0.245866 +v -0.245865 -0.413335 -0.367964 +v -0.086336 -0.413335 -0.434043 +v 0.086337 -0.413335 -0.434043 +v 0.245866 0.413334 -0.367964 +v 0.367964 0.413334 -0.245866 +v 0.434043 0.413334 -0.086336 +v 0.434043 0.413334 0.086337 +v 0.367964 0.413334 0.245866 +v 0.245866 0.413334 0.367964 +v 0.086337 0.413334 0.434043 +v -0.086336 0.413334 0.434043 +v -0.245866 0.413334 0.367964 +v -0.367964 0.413334 0.245866 +v -0.434043 0.413334 0.086337 +v -0.434043 0.413334 -0.086337 +v -0.367964 0.413334 -0.245866 +v -0.245865 0.413334 -0.367964 +v -0.086336 0.413334 -0.434043 +v 0.087776 0.428605 -0.441280 +v -0.087776 0.428605 -0.441280 +v -0.249965 0.428605 -0.374099 +v -0.374099 0.428605 -0.249965 +v -0.441280 0.428605 -0.087776 +v -0.441280 0.428605 0.087776 +v -0.374099 0.428605 0.249965 +v -0.249965 0.428605 0.374099 +v -0.087776 0.428605 0.441280 +v 0.087776 0.428605 0.441280 +v 0.249965 0.428605 0.374099 +v 0.374099 0.428605 0.249965 +v 0.441280 0.428605 0.087776 +v 0.441280 0.428605 -0.087776 +v 0.374099 0.428605 -0.249965 +v 0.249965 0.428605 -0.374099 +v 0.000000 0.428605 0.000000 +v -0.000000 -0.413334 0.000000 +vt 0.211538 0.442308 +vt 0.211538 0.467949 +vt 0.108974 0.467949 +vt 0.108974 0.442308 +vt 0.314103 0.442308 +vt 0.314103 0.467949 +vt 0.416667 0.442308 +vt 0.416667 0.467949 +vt 0.006410 0.467949 +vt 0.006410 0.442308 +vt 0.211792 0.993590 +vt 0.117562 0.954728 +vt 0.262789 0.738327 +vt 0.211538 0.006410 +vt 0.108974 0.006410 +vt 0.108974 0.032051 +vt 0.211538 0.032051 +vt 0.314103 0.006410 +vt 0.314103 0.032051 +vt 0.416667 0.006410 +vt 0.416667 0.032051 +vt 0.006410 0.006410 +vt 0.006410 0.032051 +vt 0.211361 0.993526 +vt 0.117394 0.954505 +vt 0.262040 0.737637 +vt 0.045447 0.882467 +vt 0.006475 0.788381 +vt 0.006410 0.686569 +vt 0.045263 0.592532 +vt 0.117118 0.520586 +vt 0.204627 0.488094 +vt 0.312719 0.481748 +vt 0.406687 0.520769 +vt 0.478633 0.592807 +vt 0.517605 0.686893 +vt 0.517670 0.788705 +vt 0.478816 0.882742 +vt 0.406962 0.954687 +vt 0.313044 0.993590 +vt 0.045441 0.882922 +vt 0.006410 0.789102 +vt 0.006410 0.687551 +vt 0.045442 0.593732 +vt 0.117562 0.521925 +vt 0.211793 0.483064 +vt 0.313787 0.483064 +vt 0.408016 0.521926 +vt 0.480136 0.593732 +vt 0.519168 0.687551 +vt 0.519168 0.789103 +vt 0.480136 0.882922 +vt 0.408016 0.954728 +vt 0.313786 0.993590 +vt 0.416667 0.397436 +vt 0.314103 0.397436 +vt 0.211538 0.397436 +vt 0.108974 0.397436 +vt 0.006410 0.397436 +vt 0.314103 0.185897 +vt 0.314103 0.282051 +vt 0.211538 0.282051 +vt 0.211538 0.185897 +vt 0.108974 0.282051 +vt 0.108974 0.185897 +vt 0.006410 0.282051 +vt 0.006410 0.185897 +vt 0.416667 0.185897 +vt 0.416667 0.282051 +vt 0.416667 0.076923 +vt 0.314103 0.076923 +vt 0.211538 0.076923 +vt 0.108974 0.076923 +vt 0.006410 0.076923 +vt 0.429487 0.397436 +vt 0.532051 0.397436 +vt 0.532051 0.442308 +vt 0.429487 0.442308 +vt 0.634615 0.397436 +vt 0.634615 0.442308 +vt 0.737179 0.397436 +vt 0.737179 0.442308 +vt 0.839744 0.397436 +vt 0.839744 0.442308 +vt 0.429487 0.032051 +vt 0.532051 0.032051 +vt 0.532051 0.076923 +vt 0.429487 0.076923 +vt 0.634615 0.032051 +vt 0.634615 0.076923 +vt 0.737179 0.032051 +vt 0.737179 0.076923 +vt 0.839744 0.032051 +vt 0.839744 0.076923 +s off +f 14/1 110/2 112/3 16/4 +f 12/5 108/6 110/2 14/1 +f 10/7 106/8 108/6 12/5 +f 8/4 104/3 106/9 10/10 +f 6/1 102/2 104/3 8/4 +f 4/5 100/6 102/2 6/1 +f 2/7 98/8 100/6 4/5 +f 32/4 128/3 98/9 2/10 +f 30/1 126/2 128/3 32/4 +f 28/5 124/6 126/2 30/1 +f 26/7 122/8 124/6 28/5 +f 24/4 120/3 122/9 26/10 +f 22/1 118/2 120/3 24/4 +f 20/5 116/6 118/2 22/1 +f 18/7 114/8 116/6 20/5 +f 16/4 112/3 114/9 18/10 +f 145/11 130/12 178/13 +f 13/14 15/15 111/16 109/17 +f 11/18 13/14 109/17 107/19 +f 9/20 11/18 107/19 105/21 +f 7/15 9/22 105/23 103/16 +f 5/14 7/15 103/16 101/17 +f 3/18 5/14 101/17 99/19 +f 1/20 3/18 99/19 97/21 +f 31/15 1/22 97/23 127/16 +f 29/14 31/15 127/16 125/17 +f 27/18 29/14 125/17 123/19 +f 25/20 27/18 123/19 121/21 +f 23/15 25/22 121/23 119/16 +f 21/14 23/15 119/16 117/17 +f 19/18 21/14 117/17 115/19 +f 17/20 19/18 115/19 113/21 +f 15/15 17/22 113/23 111/16 +f 162/24 163/25 177/26 +f 163/25 164/27 177/26 +f 164/27 165/28 177/26 +f 165/28 166/29 177/26 +f 166/29 167/30 177/26 +f 167/30 168/31 177/26 +f 168/31 169/32 177/26 +f 169/32 170/33 177/26 +f 170/33 171/34 177/26 +f 171/34 172/35 177/26 +f 172/35 173/36 177/26 +f 173/36 174/37 177/26 +f 174/37 175/38 177/26 +f 175/38 176/39 177/26 +f 176/39 161/40 177/26 +f 161/40 162/24 177/26 +f 130/12 131/41 178/13 +f 131/41 132/42 178/13 +f 132/42 133/43 178/13 +f 133/43 134/44 178/13 +f 134/44 135/45 178/13 +f 135/45 136/46 178/13 +f 136/46 137/47 178/13 +f 137/47 138/48 178/13 +f 138/48 139/49 178/13 +f 139/49 140/50 178/13 +f 140/50 141/51 178/13 +f 141/51 142/52 178/13 +f 142/52 143/53 178/13 +f 143/53 144/54 178/13 +f 144/54 145/11 178/13 +s 1 +f 33/55 2/7 4/5 50/56 +f 50/56 4/5 6/1 51/57 +f 51/57 6/1 8/4 52/58 +f 52/58 8/4 10/10 53/59 +f 53/55 10/7 12/5 54/56 +f 54/56 12/5 14/1 55/57 +f 55/57 14/1 16/4 56/58 +f 56/58 16/4 18/10 57/59 +f 57/55 18/7 20/5 58/56 +f 58/56 20/5 22/1 59/57 +f 59/57 22/1 24/4 60/58 +f 60/58 24/4 26/10 61/59 +f 61/55 26/7 28/5 62/56 +f 62/56 28/5 30/1 63/57 +f 64/58 32/4 2/10 33/59 +f 63/57 30/1 32/4 64/58 +f 66/60 82/61 83/62 67/63 +f 67/63 83/62 84/64 68/65 +f 68/65 84/64 85/66 69/67 +f 69/68 85/69 86/61 70/60 +f 70/60 86/61 87/62 71/63 +f 71/63 87/62 88/64 72/65 +f 72/65 88/64 89/66 73/67 +f 73/68 89/69 90/61 74/60 +f 74/60 90/61 91/62 75/63 +f 75/63 91/62 92/64 76/65 +f 76/65 92/64 93/66 77/67 +f 77/68 93/69 94/61 78/60 +f 78/60 94/61 95/62 79/63 +f 80/65 96/64 65/66 81/67 +f 79/63 95/62 96/64 80/65 +f 65/69 33/55 50/56 82/61 +f 82/61 50/56 51/57 83/62 +f 83/62 51/57 52/58 84/64 +f 84/64 52/58 53/59 85/66 +f 85/69 53/55 54/56 86/61 +f 86/61 54/56 55/57 87/62 +f 87/62 55/57 56/58 88/64 +f 88/64 56/58 57/59 89/66 +f 89/69 57/55 58/56 90/61 +f 90/61 58/56 59/57 91/62 +f 91/62 59/57 60/58 92/64 +f 92/64 60/58 61/59 93/66 +f 93/69 61/55 62/56 94/61 +f 94/61 62/56 63/57 95/62 +f 96/64 64/58 33/59 65/66 +f 95/62 63/57 64/58 96/64 +f 1/21 49/70 34/71 3/19 +f 3/19 34/71 35/72 5/17 +f 5/17 35/72 36/73 7/16 +f 7/16 36/73 37/74 9/23 +f 9/21 37/70 38/71 11/19 +f 11/19 38/71 39/72 13/17 +f 13/17 39/72 40/73 15/16 +f 15/16 40/73 41/74 17/23 +f 17/21 41/70 42/71 19/19 +f 19/19 42/71 43/72 21/17 +f 21/17 43/72 44/73 23/16 +f 23/16 44/73 45/74 25/23 +f 25/21 45/70 46/71 27/19 +f 27/19 46/71 47/72 29/17 +f 31/16 48/73 49/74 1/23 +f 29/17 47/72 48/73 31/16 +f 49/70 81/68 66/60 34/71 +f 34/71 66/60 67/63 35/72 +f 35/72 67/63 68/65 36/73 +f 36/73 68/65 69/67 37/74 +f 37/70 69/68 70/60 38/71 +f 38/71 70/60 71/63 39/72 +f 39/72 71/63 72/65 40/73 +f 40/73 72/65 73/67 41/74 +f 41/70 73/68 74/60 42/71 +f 42/71 74/60 75/63 43/72 +f 43/72 75/63 76/65 44/73 +f 44/73 76/65 77/67 45/74 +f 45/70 77/68 78/60 46/71 +f 46/71 78/60 79/63 47/72 +f 48/73 80/65 81/67 49/74 +f 47/72 79/63 80/65 48/73 +f 65/69 82/61 66/60 81/68 +f 129/75 146/76 100/77 98/78 +f 146/76 147/79 102/80 100/77 +f 147/79 148/81 104/82 102/80 +f 148/81 149/83 106/84 104/82 +f 149/75 150/76 108/77 106/78 +f 150/76 151/79 110/80 108/77 +f 151/79 152/81 112/82 110/80 +f 152/81 153/83 114/84 112/82 +f 153/75 154/76 116/77 114/78 +f 154/76 155/79 118/80 116/77 +f 155/79 156/81 120/82 118/80 +f 156/81 157/83 122/84 120/82 +f 157/75 158/76 124/77 122/78 +f 158/76 159/79 126/80 124/77 +f 160/81 129/83 98/84 128/82 +f 159/79 160/81 128/82 126/80 +f 97/85 99/86 130/87 145/88 +f 99/86 101/89 131/90 130/87 +f 101/89 103/91 132/92 131/90 +f 103/91 105/93 133/94 132/92 +f 105/85 107/86 134/87 133/88 +f 107/86 109/89 135/90 134/87 +f 109/89 111/91 136/92 135/90 +f 111/91 113/93 137/94 136/92 +f 113/85 115/86 138/87 137/88 +f 115/86 117/89 139/90 138/87 +f 117/89 119/91 140/92 139/90 +f 119/91 121/93 141/94 140/92 +f 121/85 123/86 142/87 141/88 +f 123/86 125/89 143/90 142/87 +f 127/91 97/93 145/94 144/92 +f 125/89 127/91 144/92 143/90 diff --git a/mods/cottages/models/cottages_barrel_closed_lying.obj b/mods/cottages/models/cottages_barrel_closed_lying.obj new file mode 100644 index 00000000..ae22045d --- /dev/null +++ b/mods/cottages/models/cottages_barrel_closed_lying.obj @@ -0,0 +1,453 @@ +# Blender v2.69 (sub 0) OBJ File: 'barrel-closed.blend' +# www.blender.org +o Cylinder +v 0.500001 0.092835 -0.466712 +v -0.500000 0.092835 -0.466712 +v 0.500001 0.264371 -0.395660 +v -0.500000 0.264371 -0.395660 +v 0.500001 0.395660 -0.264371 +v -0.500000 0.395660 -0.264371 +v 0.500001 0.466712 -0.092835 +v -0.500000 0.466713 -0.092835 +v 0.500001 0.466712 0.092835 +v -0.500000 0.466713 0.092835 +v 0.500001 0.395660 0.264371 +v -0.500000 0.395660 0.264371 +v 0.500001 0.264371 0.395660 +v -0.500000 0.264371 0.395660 +v 0.500001 0.092835 0.466712 +v -0.500000 0.092835 0.466712 +v 0.500001 -0.092835 0.466712 +v -0.500000 -0.092835 0.466712 +v 0.500001 -0.264371 0.395660 +v -0.500000 -0.264371 0.395660 +v 0.500001 -0.395660 0.264372 +v -0.500000 -0.395660 0.264371 +v 0.500001 -0.466713 0.092835 +v -0.500000 -0.466712 0.092835 +v 0.500001 -0.466713 -0.092835 +v -0.500000 -0.466712 -0.092835 +v 0.500001 -0.395660 -0.264371 +v -0.500000 -0.395660 -0.264372 +v 0.500001 -0.264371 -0.395660 +v -0.500000 -0.264371 -0.395660 +v 0.500001 -0.092835 -0.466712 +v -0.500000 -0.092835 -0.466713 +v -0.413334 0.095930 -0.482270 +v 0.413335 0.273184 -0.408849 +v 0.413335 0.408849 -0.273184 +v 0.413335 0.482270 -0.095929 +v 0.413335 0.482270 0.095930 +v 0.413335 0.408849 0.273184 +v 0.413334 0.273184 0.408849 +v 0.413334 0.095929 0.482270 +v 0.413334 -0.095930 0.482270 +v 0.413334 -0.273184 0.408849 +v 0.413334 -0.408849 0.273184 +v 0.413334 -0.482270 0.095930 +v 0.413334 -0.482270 -0.095929 +v 0.413334 -0.408849 -0.273184 +v 0.413334 -0.273184 -0.408849 +v 0.413334 -0.095929 -0.482270 +v 0.413335 0.095929 -0.482270 +v -0.413334 0.273184 -0.408849 +v -0.413334 0.408849 -0.273184 +v -0.413334 0.482270 -0.095929 +v -0.413334 0.482270 0.095929 +v -0.413334 0.408849 0.273184 +v -0.413334 0.273184 0.408849 +v -0.413334 0.095930 0.482270 +v -0.413334 -0.095929 0.482270 +v -0.413334 -0.273184 0.408849 +v -0.413334 -0.408849 0.273184 +v -0.413334 -0.482270 0.095929 +v -0.413334 -0.482270 -0.095930 +v -0.413334 -0.408849 -0.273184 +v -0.413334 -0.273184 -0.408849 +v -0.413334 -0.095929 -0.482270 +v -0.114830 0.099128 -0.498352 +v 0.114831 0.282294 -0.422482 +v 0.114831 0.422482 -0.282294 +v 0.114831 0.498352 -0.099128 +v 0.114831 0.498352 0.099128 +v 0.114831 0.422482 0.282294 +v 0.114831 0.282294 0.422482 +v 0.114831 0.099128 0.498352 +v 0.114831 -0.099128 0.498352 +v 0.114831 -0.282294 0.422482 +v 0.114831 -0.422482 0.282294 +v 0.114831 -0.498352 0.099128 +v 0.114831 -0.498352 -0.099128 +v 0.114831 -0.422482 -0.282294 +v 0.114831 -0.282293 -0.422482 +v 0.114831 -0.099128 -0.498352 +v 0.114831 0.099128 -0.498352 +v -0.114830 0.282294 -0.422482 +v -0.114830 0.422482 -0.282294 +v -0.114830 0.498352 -0.099128 +v -0.114830 0.498352 0.099128 +v -0.114830 0.422482 0.282294 +v -0.114830 0.282294 0.422482 +v -0.114830 0.099128 0.498352 +v -0.114830 -0.099128 0.498352 +v -0.114830 -0.282293 0.422482 +v -0.114830 -0.422482 0.282294 +v -0.114830 -0.498352 0.099128 +v -0.114830 -0.498352 -0.099128 +v -0.114830 -0.422482 -0.282294 +v -0.114830 -0.282293 -0.422482 +v -0.114830 -0.099128 -0.498352 +v 0.500001 0.083551 -0.420041 +v -0.500000 0.083552 -0.420041 +v 0.500001 0.237934 -0.356094 +v -0.500000 0.237934 -0.356094 +v 0.500001 0.356094 -0.237934 +v -0.500000 0.356094 -0.237934 +v 0.500001 0.420041 -0.083551 +v -0.500000 0.420041 -0.083551 +v 0.500001 0.420041 0.083552 +v -0.500000 0.420041 0.083551 +v 0.500001 0.356094 0.237934 +v -0.500000 0.356094 0.237934 +v 0.500001 0.237934 0.356094 +v -0.500000 0.237934 0.356094 +v 0.500001 0.083551 0.420041 +v -0.500000 0.083551 0.420041 +v 0.500001 -0.083551 0.420041 +v -0.500000 -0.083551 0.420041 +v 0.500001 -0.237934 0.356094 +v -0.500000 -0.237934 0.356094 +v 0.500001 -0.356094 0.237934 +v -0.500000 -0.356094 0.237934 +v 0.500001 -0.420041 0.083551 +v -0.500000 -0.420041 0.083551 +v 0.500001 -0.420041 -0.083551 +v -0.500000 -0.420041 -0.083552 +v 0.500001 -0.356094 -0.237934 +v -0.500000 -0.356094 -0.237934 +v 0.500001 -0.237934 -0.356094 +v -0.500000 -0.237934 -0.356094 +v 0.500001 -0.083551 -0.420041 +v -0.500000 -0.083551 -0.420041 +v -0.413334 0.086337 -0.434043 +v 0.413335 0.245866 -0.367964 +v 0.413335 0.367964 -0.245866 +v 0.413335 0.434043 -0.086336 +v 0.413335 0.434043 0.086337 +v 0.413335 0.367964 0.245866 +v 0.413335 0.245866 0.367964 +v 0.413334 0.086336 0.434043 +v 0.413334 -0.086337 0.434043 +v 0.413334 -0.245866 0.367964 +v 0.413334 -0.367964 0.245866 +v 0.413334 -0.434043 0.086337 +v 0.413334 -0.434043 -0.086337 +v 0.413334 -0.367964 -0.245866 +v 0.413335 -0.245865 -0.367964 +v 0.413335 -0.086336 -0.434043 +v 0.413335 0.086336 -0.434043 +v -0.413334 0.245866 -0.367964 +v -0.413334 0.367964 -0.245866 +v -0.413334 0.434043 -0.086337 +v -0.413334 0.434043 0.086337 +v -0.413334 0.367964 0.245866 +v -0.413334 0.245866 0.367964 +v -0.413334 0.086337 0.434043 +v -0.413334 -0.086336 0.434043 +v -0.413334 -0.245865 0.367964 +v -0.413334 -0.367964 0.245866 +v -0.413334 -0.434043 0.086337 +v -0.413334 -0.434043 -0.086337 +v -0.413334 -0.367964 -0.245866 +v -0.413334 -0.245865 -0.367964 +v -0.413334 -0.086336 -0.434043 +v -0.428605 0.087776 -0.441280 +v -0.428605 -0.087776 -0.441280 +v -0.428605 -0.249965 -0.374099 +v -0.428605 -0.374099 -0.249965 +v -0.428605 -0.441280 -0.087776 +v -0.428605 -0.441280 0.087776 +v -0.428605 -0.374099 0.249965 +v -0.428605 -0.249965 0.374099 +v -0.428605 -0.087776 0.441280 +v -0.428605 0.087776 0.441280 +v -0.428605 0.249965 0.374099 +v -0.428605 0.374099 0.249965 +v -0.428605 0.441280 0.087776 +v -0.428605 0.441280 -0.087776 +v -0.428605 0.374099 -0.249965 +v -0.428605 0.249965 -0.374099 +v -0.428605 0.000000 -0.000000 +v 0.413334 -0.000000 0.000000 +vt 0.211538 0.442308 +vt 0.211538 0.467949 +vt 0.108974 0.467949 +vt 0.108974 0.442308 +vt 0.314103 0.442308 +vt 0.314103 0.467949 +vt 0.416667 0.442308 +vt 0.416667 0.467949 +vt 0.006410 0.467949 +vt 0.006410 0.442308 +vt 0.211792 0.993590 +vt 0.117562 0.954728 +vt 0.262789 0.738327 +vt 0.211538 0.006410 +vt 0.108974 0.006410 +vt 0.108974 0.032051 +vt 0.211538 0.032051 +vt 0.314103 0.006410 +vt 0.314103 0.032051 +vt 0.416667 0.006410 +vt 0.416667 0.032051 +vt 0.006410 0.006410 +vt 0.006410 0.032051 +vt 0.211361 0.993526 +vt 0.117394 0.954505 +vt 0.262040 0.737637 +vt 0.045447 0.882467 +vt 0.006475 0.788381 +vt 0.006410 0.686569 +vt 0.045263 0.592532 +vt 0.117118 0.520586 +vt 0.204627 0.488094 +vt 0.312719 0.481748 +vt 0.406687 0.520769 +vt 0.478633 0.592807 +vt 0.517605 0.686893 +vt 0.517670 0.788705 +vt 0.478816 0.882742 +vt 0.406962 0.954687 +vt 0.313044 0.993590 +vt 0.045441 0.882922 +vt 0.006410 0.789102 +vt 0.006410 0.687551 +vt 0.045442 0.593732 +vt 0.117562 0.521925 +vt 0.211793 0.483064 +vt 0.313787 0.483064 +vt 0.408016 0.521926 +vt 0.480136 0.593732 +vt 0.519168 0.687551 +vt 0.519168 0.789103 +vt 0.480136 0.882922 +vt 0.408016 0.954728 +vt 0.313786 0.993590 +vt 0.416667 0.397436 +vt 0.314103 0.397436 +vt 0.211538 0.397436 +vt 0.108974 0.397436 +vt 0.006410 0.397436 +vt 0.314103 0.185897 +vt 0.314103 0.282051 +vt 0.211538 0.282051 +vt 0.211538 0.185897 +vt 0.108974 0.282051 +vt 0.108974 0.185897 +vt 0.006410 0.282051 +vt 0.006410 0.185897 +vt 0.416667 0.185897 +vt 0.416667 0.282051 +vt 0.416667 0.076923 +vt 0.314103 0.076923 +vt 0.211538 0.076923 +vt 0.108974 0.076923 +vt 0.006410 0.076923 +vt 0.429487 0.397436 +vt 0.532051 0.397436 +vt 0.532051 0.442308 +vt 0.429487 0.442308 +vt 0.634615 0.397436 +vt 0.634615 0.442308 +vt 0.737179 0.397436 +vt 0.737179 0.442308 +vt 0.839744 0.397436 +vt 0.839744 0.442308 +vt 0.429487 0.032051 +vt 0.532051 0.032051 +vt 0.532051 0.076923 +vt 0.429487 0.076923 +vt 0.634615 0.032051 +vt 0.634615 0.076923 +vt 0.737179 0.032051 +vt 0.737179 0.076923 +vt 0.839744 0.032051 +vt 0.839744 0.076923 +s off +f 14/1 110/2 112/3 16/4 +f 12/5 108/6 110/2 14/1 +f 10/7 106/8 108/6 12/5 +f 8/4 104/3 106/9 10/10 +f 6/1 102/2 104/3 8/4 +f 4/5 100/6 102/2 6/1 +f 2/7 98/8 100/6 4/5 +f 32/4 128/3 98/9 2/10 +f 30/1 126/2 128/3 32/4 +f 28/5 124/6 126/2 30/1 +f 26/7 122/8 124/6 28/5 +f 24/4 120/3 122/9 26/10 +f 22/1 118/2 120/3 24/4 +f 20/5 116/6 118/2 22/1 +f 18/7 114/8 116/6 20/5 +f 16/4 112/3 114/9 18/10 +f 145/11 130/12 178/13 +f 13/14 15/15 111/16 109/17 +f 11/18 13/14 109/17 107/19 +f 9/20 11/18 107/19 105/21 +f 7/15 9/22 105/23 103/16 +f 5/14 7/15 103/16 101/17 +f 3/18 5/14 101/17 99/19 +f 1/20 3/18 99/19 97/21 +f 31/15 1/22 97/23 127/16 +f 29/14 31/15 127/16 125/17 +f 27/18 29/14 125/17 123/19 +f 25/20 27/18 123/19 121/21 +f 23/15 25/22 121/23 119/16 +f 21/14 23/15 119/16 117/17 +f 19/18 21/14 117/17 115/19 +f 17/20 19/18 115/19 113/21 +f 15/15 17/22 113/23 111/16 +f 162/24 163/25 177/26 +f 163/25 164/27 177/26 +f 164/27 165/28 177/26 +f 165/28 166/29 177/26 +f 166/29 167/30 177/26 +f 167/30 168/31 177/26 +f 168/31 169/32 177/26 +f 169/32 170/33 177/26 +f 170/33 171/34 177/26 +f 171/34 172/35 177/26 +f 172/35 173/36 177/26 +f 173/36 174/37 177/26 +f 174/37 175/38 177/26 +f 175/38 176/39 177/26 +f 176/39 161/40 177/26 +f 161/40 162/24 177/26 +f 130/12 131/41 178/13 +f 131/41 132/42 178/13 +f 132/42 133/43 178/13 +f 133/43 134/44 178/13 +f 134/44 135/45 178/13 +f 135/45 136/46 178/13 +f 136/46 137/47 178/13 +f 137/47 138/48 178/13 +f 138/48 139/49 178/13 +f 139/49 140/50 178/13 +f 140/50 141/51 178/13 +f 141/51 142/52 178/13 +f 142/52 143/53 178/13 +f 143/53 144/54 178/13 +f 144/54 145/11 178/13 +s 1 +f 33/55 2/7 4/5 50/56 +f 50/56 4/5 6/1 51/57 +f 51/57 6/1 8/4 52/58 +f 52/58 8/4 10/10 53/59 +f 53/55 10/7 12/5 54/56 +f 54/56 12/5 14/1 55/57 +f 55/57 14/1 16/4 56/58 +f 56/58 16/4 18/10 57/59 +f 57/55 18/7 20/5 58/56 +f 58/56 20/5 22/1 59/57 +f 59/57 22/1 24/4 60/58 +f 60/58 24/4 26/10 61/59 +f 61/55 26/7 28/5 62/56 +f 62/56 28/5 30/1 63/57 +f 64/58 32/4 2/10 33/59 +f 63/57 30/1 32/4 64/58 +f 66/60 82/61 83/62 67/63 +f 67/63 83/62 84/64 68/65 +f 68/65 84/64 85/66 69/67 +f 69/68 85/69 86/61 70/60 +f 70/60 86/61 87/62 71/63 +f 71/63 87/62 88/64 72/65 +f 72/65 88/64 89/66 73/67 +f 73/68 89/69 90/61 74/60 +f 74/60 90/61 91/62 75/63 +f 75/63 91/62 92/64 76/65 +f 76/65 92/64 93/66 77/67 +f 77/68 93/69 94/61 78/60 +f 78/60 94/61 95/62 79/63 +f 80/65 96/64 65/66 81/67 +f 79/63 95/62 96/64 80/65 +f 65/69 33/55 50/56 82/61 +f 82/61 50/56 51/57 83/62 +f 83/62 51/57 52/58 84/64 +f 84/64 52/58 53/59 85/66 +f 85/69 53/55 54/56 86/61 +f 86/61 54/56 55/57 87/62 +f 87/62 55/57 56/58 88/64 +f 88/64 56/58 57/59 89/66 +f 89/69 57/55 58/56 90/61 +f 90/61 58/56 59/57 91/62 +f 91/62 59/57 60/58 92/64 +f 92/64 60/58 61/59 93/66 +f 93/69 61/55 62/56 94/61 +f 94/61 62/56 63/57 95/62 +f 96/64 64/58 33/59 65/66 +f 95/62 63/57 64/58 96/64 +f 1/21 49/70 34/71 3/19 +f 3/19 34/71 35/72 5/17 +f 5/17 35/72 36/73 7/16 +f 7/16 36/73 37/74 9/23 +f 9/21 37/70 38/71 11/19 +f 11/19 38/71 39/72 13/17 +f 13/17 39/72 40/73 15/16 +f 15/16 40/73 41/74 17/23 +f 17/21 41/70 42/71 19/19 +f 19/19 42/71 43/72 21/17 +f 21/17 43/72 44/73 23/16 +f 23/16 44/73 45/74 25/23 +f 25/21 45/70 46/71 27/19 +f 27/19 46/71 47/72 29/17 +f 31/16 48/73 49/74 1/23 +f 29/17 47/72 48/73 31/16 +f 49/70 81/68 66/60 34/71 +f 34/71 66/60 67/63 35/72 +f 35/72 67/63 68/65 36/73 +f 36/73 68/65 69/67 37/74 +f 37/70 69/68 70/60 38/71 +f 38/71 70/60 71/63 39/72 +f 39/72 71/63 72/65 40/73 +f 40/73 72/65 73/67 41/74 +f 41/70 73/68 74/60 42/71 +f 42/71 74/60 75/63 43/72 +f 43/72 75/63 76/65 44/73 +f 44/73 76/65 77/67 45/74 +f 45/70 77/68 78/60 46/71 +f 46/71 78/60 79/63 47/72 +f 48/73 80/65 81/67 49/74 +f 47/72 79/63 80/65 48/73 +f 65/69 82/61 66/60 81/68 +f 129/75 146/76 100/77 98/78 +f 146/76 147/79 102/80 100/77 +f 147/79 148/81 104/82 102/80 +f 148/81 149/83 106/84 104/82 +f 149/75 150/76 108/77 106/78 +f 150/76 151/79 110/80 108/77 +f 151/79 152/81 112/82 110/80 +f 152/81 153/83 114/84 112/82 +f 153/75 154/76 116/77 114/78 +f 154/76 155/79 118/80 116/77 +f 155/79 156/81 120/82 118/80 +f 156/81 157/83 122/84 120/82 +f 157/75 158/76 124/77 122/78 +f 158/76 159/79 126/80 124/77 +f 160/81 129/83 98/84 128/82 +f 159/79 160/81 128/82 126/80 +f 97/85 99/86 130/87 145/88 +f 99/86 101/89 131/90 130/87 +f 101/89 103/91 132/92 131/90 +f 103/91 105/93 133/94 132/92 +f 105/85 107/86 134/87 133/88 +f 107/86 109/89 135/90 134/87 +f 109/89 111/91 136/92 135/90 +f 111/91 113/93 137/94 136/92 +f 113/85 115/86 138/87 137/88 +f 115/86 117/89 139/90 138/87 +f 117/89 119/91 140/92 139/90 +f 119/91 121/93 141/94 140/92 +f 121/85 123/86 142/87 141/88 +f 123/86 125/89 143/90 142/87 +f 127/91 97/93 145/94 144/92 +f 125/89 127/91 144/92 143/90 diff --git a/mods/cottages/models/cottages_barrel_lying.obj b/mods/cottages/models/cottages_barrel_lying.obj new file mode 100644 index 00000000..dadb7b11 --- /dev/null +++ b/mods/cottages/models/cottages_barrel_lying.obj @@ -0,0 +1,543 @@ +# Blender v2.69 (sub 0) OBJ File: 'barrel.blend' +# www.blender.org +o Cylinder +v 0.500001 0.092835 -0.466712 +v -0.500000 0.092835 -0.466712 +v 0.500001 0.264371 -0.395660 +v -0.500000 0.264371 -0.395660 +v 0.500001 0.395660 -0.264371 +v -0.500000 0.395660 -0.264371 +v 0.500001 0.466712 -0.092835 +v -0.500000 0.466713 -0.092835 +v 0.500001 0.466712 0.092835 +v -0.500000 0.466713 0.092835 +v 0.500001 0.395660 0.264371 +v -0.500000 0.395660 0.264371 +v 0.500001 0.264371 0.395660 +v -0.500000 0.264371 0.395660 +v 0.500001 0.092835 0.466712 +v -0.500000 0.092835 0.466712 +v 0.500001 -0.092835 0.466712 +v -0.500000 -0.092835 0.466712 +v 0.500001 -0.264371 0.395660 +v -0.500000 -0.264371 0.395660 +v 0.500001 -0.395660 0.264372 +v -0.500000 -0.395660 0.264371 +v 0.500001 -0.466713 0.092835 +v -0.500000 -0.466712 0.092835 +v 0.500001 -0.466713 -0.092835 +v -0.500000 -0.466712 -0.092835 +v 0.500001 -0.395660 -0.264371 +v -0.500000 -0.395660 -0.264372 +v 0.500001 -0.264371 -0.395660 +v -0.500000 -0.264371 -0.395660 +v 0.500001 -0.092835 -0.466712 +v -0.500000 -0.092835 -0.466713 +v -0.413334 0.095930 -0.482270 +v 0.413335 0.273184 -0.408849 +v 0.413335 0.408849 -0.273184 +v 0.413335 0.482270 -0.095929 +v 0.413335 0.482270 0.095930 +v 0.413334 0.408849 0.273184 +v 0.413334 0.273184 0.408849 +v 0.413334 0.095929 0.482270 +v 0.413334 -0.095930 0.482270 +v 0.413334 -0.273184 0.408849 +v 0.413334 -0.408849 0.273184 +v 0.413334 -0.482270 0.095930 +v 0.413334 -0.482270 -0.095929 +v 0.413334 -0.408849 -0.273184 +v 0.413334 -0.273184 -0.408849 +v 0.413335 -0.095929 -0.482270 +v 0.413335 0.095929 -0.482270 +v -0.413334 0.273184 -0.408849 +v -0.413334 0.408849 -0.273184 +v -0.413334 0.482270 -0.095929 +v -0.413334 0.482270 0.095929 +v -0.413334 0.408849 0.273184 +v -0.413334 0.273184 0.408849 +v -0.413334 0.095930 0.482270 +v -0.413334 -0.095929 0.482270 +v -0.413334 -0.273184 0.408849 +v -0.413334 -0.408849 0.273184 +v -0.413334 -0.482270 0.095929 +v -0.413334 -0.482270 -0.095930 +v -0.413334 -0.408849 -0.273184 +v -0.413334 -0.273184 -0.408849 +v -0.413334 -0.095929 -0.482270 +v -0.114830 0.099128 -0.498352 +v 0.114831 0.282294 -0.422482 +v 0.114831 0.422482 -0.282293 +v 0.114831 0.498352 -0.099128 +v 0.114831 0.498352 0.099128 +v 0.114831 0.422482 0.282294 +v 0.114831 0.282294 0.422482 +v 0.114831 0.099128 0.498352 +v 0.114831 -0.099128 0.498352 +v 0.114831 -0.282294 0.422482 +v 0.114831 -0.422482 0.282294 +v 0.114831 -0.498352 0.099128 +v 0.114831 -0.498352 -0.099128 +v 0.114831 -0.422482 -0.282294 +v 0.114831 -0.282293 -0.422482 +v 0.114831 -0.099128 -0.498352 +v 0.114831 0.099128 -0.498352 +v -0.114830 0.282294 -0.422482 +v -0.114830 0.422482 -0.282294 +v -0.114830 0.498352 -0.099128 +v -0.114830 0.498352 0.099128 +v -0.114830 0.422482 0.282294 +v -0.114830 0.282294 0.422482 +v -0.114830 0.099128 0.498352 +v -0.114830 -0.099128 0.498352 +v -0.114830 -0.282293 0.422482 +v -0.114830 -0.422482 0.282294 +v -0.114830 -0.498352 0.099128 +v -0.114830 -0.498352 -0.099128 +v -0.114830 -0.422482 -0.282294 +v -0.114830 -0.282293 -0.422482 +v -0.114830 -0.099128 -0.498352 +v 0.500001 0.083551 -0.420041 +v -0.500000 0.083552 -0.420041 +v 0.500001 0.237934 -0.356094 +v -0.500000 0.237934 -0.356094 +v 0.500001 0.356094 -0.237934 +v -0.500000 0.356094 -0.237934 +v 0.500001 0.420041 -0.083551 +v -0.500000 0.420041 -0.083551 +v 0.500001 0.420041 0.083552 +v -0.500000 0.420041 0.083551 +v 0.500001 0.356094 0.237934 +v -0.500000 0.356094 0.237934 +v 0.500001 0.237934 0.356094 +v -0.500000 0.237934 0.356094 +v 0.500001 0.083551 0.420041 +v -0.500000 0.083551 0.420041 +v 0.500001 -0.083551 0.420041 +v -0.500000 -0.083551 0.420041 +v 0.500001 -0.237934 0.356094 +v -0.500000 -0.237934 0.356094 +v 0.500001 -0.356094 0.237934 +v -0.500000 -0.356094 0.237934 +v 0.500001 -0.420041 0.083551 +v -0.500000 -0.420041 0.083551 +v 0.500001 -0.420041 -0.083551 +v -0.500000 -0.420041 -0.083552 +v 0.500001 -0.356094 -0.237934 +v -0.500000 -0.356094 -0.237934 +v 0.500001 -0.237934 -0.356094 +v -0.500000 -0.237934 -0.356094 +v 0.500001 -0.083551 -0.420041 +v -0.500000 -0.083551 -0.420041 +v -0.413334 0.086337 -0.434043 +v 0.413335 0.245866 -0.367964 +v 0.413335 0.367964 -0.245865 +v 0.413335 0.434043 -0.086336 +v 0.413335 0.434043 0.086337 +v 0.413335 0.367964 0.245866 +v 0.413335 0.245866 0.367964 +v 0.413334 0.086336 0.434043 +v 0.413334 -0.086337 0.434043 +v 0.413334 -0.245866 0.367964 +v 0.413334 -0.367964 0.245866 +v 0.413334 -0.434043 0.086337 +v 0.413334 -0.434043 -0.086337 +v 0.413334 -0.367964 -0.245866 +v 0.413335 -0.245865 -0.367964 +v 0.413335 -0.086336 -0.434043 +v 0.413335 0.086336 -0.434043 +v -0.413334 0.245866 -0.367964 +v -0.413334 0.367964 -0.245866 +v -0.413334 0.434043 -0.086337 +v -0.413334 0.434043 0.086337 +v -0.413334 0.367964 0.245866 +v -0.413334 0.245866 0.367964 +v -0.413334 0.086337 0.434043 +v -0.413334 -0.086336 0.434043 +v -0.413334 -0.245865 0.367964 +v -0.413334 -0.367964 0.245866 +v -0.413334 -0.434043 0.086337 +v -0.413334 -0.434043 -0.086337 +v -0.413334 -0.367964 -0.245866 +v -0.413334 -0.245865 -0.367964 +v -0.413334 -0.086336 -0.434043 +v -0.114830 0.089216 -0.448517 +v 0.114831 0.254064 -0.380234 +v 0.114831 0.380234 -0.254064 +v 0.114831 0.448517 -0.089215 +v 0.114831 0.448517 0.089216 +v 0.114831 0.380234 0.254064 +v 0.114831 0.254064 0.380234 +v 0.114831 0.089215 0.448517 +v 0.114831 -0.089215 0.448517 +v 0.114831 -0.254064 0.380234 +v 0.114831 -0.380234 0.254064 +v 0.114831 -0.448517 0.089216 +v 0.114831 -0.448517 -0.089216 +v 0.114831 -0.380234 -0.254064 +v 0.114831 -0.254064 -0.380234 +v 0.114831 -0.089215 -0.448517 +v 0.114831 0.089216 -0.448517 +v -0.114830 0.254064 -0.380234 +v -0.114830 0.380234 -0.254064 +v -0.114830 0.448517 -0.089215 +v -0.114830 0.448517 0.089216 +v -0.114830 0.380234 0.254064 +v -0.114830 0.254064 0.380234 +v -0.114830 0.089216 0.448517 +v -0.114830 -0.089215 0.448517 +v -0.114830 -0.254064 0.380234 +v -0.114830 -0.380234 0.254064 +v -0.114830 -0.448517 0.089216 +v -0.114830 -0.448517 -0.089216 +v -0.114830 -0.380234 -0.254064 +v -0.114830 -0.254064 -0.380234 +v -0.114830 -0.089215 -0.448517 +v 0.352645 0.087776 -0.441280 +v 0.352645 -0.087776 -0.441280 +v 0.352645 -0.249965 -0.374099 +v 0.352645 -0.374099 -0.249965 +v 0.352645 -0.441280 -0.087776 +v 0.352645 -0.441280 0.087776 +v 0.352645 -0.374099 0.249965 +v 0.352645 -0.249965 0.374099 +v 0.352645 -0.087776 0.441280 +v 0.352645 0.087776 0.441280 +v 0.352645 0.249965 0.374099 +v 0.352645 0.374099 0.249965 +v 0.352645 0.441280 0.087776 +v 0.352645 0.441280 -0.087776 +v 0.352645 0.374099 -0.249965 +v 0.352645 0.249965 -0.374099 +v 0.352645 -0.000000 0.000000 +v 0.413334 -0.000000 0.000000 +vt 0.211538 0.442308 +vt 0.211538 0.467949 +vt 0.108974 0.467949 +vt 0.108974 0.442308 +vt 0.314103 0.442308 +vt 0.314103 0.467949 +vt 0.416667 0.442308 +vt 0.416667 0.467949 +vt 0.006410 0.467949 +vt 0.006410 0.442308 +vt 0.211792 0.993590 +vt 0.117562 0.954728 +vt 0.262789 0.738327 +vt 0.211538 0.006410 +vt 0.108974 0.006410 +vt 0.108974 0.032051 +vt 0.211538 0.032051 +vt 0.314103 0.006410 +vt 0.314103 0.032051 +vt 0.416667 0.006410 +vt 0.416667 0.032051 +vt 0.006410 0.006410 +vt 0.006410 0.032051 +vt 0.211361 0.993526 +vt 0.117394 0.954505 +vt 0.262040 0.737637 +vt 0.045447 0.882467 +vt 0.006475 0.788381 +vt 0.006410 0.686569 +vt 0.045263 0.592532 +vt 0.117118 0.520586 +vt 0.204627 0.488094 +vt 0.312719 0.481748 +vt 0.406687 0.520769 +vt 0.478633 0.592807 +vt 0.517605 0.686893 +vt 0.517670 0.788705 +vt 0.478816 0.882742 +vt 0.406962 0.954687 +vt 0.313044 0.993590 +vt 0.045441 0.882922 +vt 0.006410 0.789102 +vt 0.006410 0.687551 +vt 0.045442 0.593732 +vt 0.117562 0.521925 +vt 0.211793 0.483064 +vt 0.313787 0.483064 +vt 0.408016 0.521926 +vt 0.480136 0.593732 +vt 0.519168 0.687551 +vt 0.519168 0.789103 +vt 0.480136 0.882922 +vt 0.408016 0.954728 +vt 0.313786 0.993590 +vt 0.416667 0.397436 +vt 0.314103 0.397436 +vt 0.211538 0.397436 +vt 0.108974 0.397436 +vt 0.006410 0.397436 +vt 0.314103 0.185897 +vt 0.314103 0.282051 +vt 0.211538 0.282051 +vt 0.211538 0.185897 +vt 0.108974 0.282051 +vt 0.108974 0.185897 +vt 0.006410 0.282051 +vt 0.006410 0.185897 +vt 0.416667 0.185897 +vt 0.416667 0.282051 +vt 0.416667 0.076923 +vt 0.314103 0.076923 +vt 0.211538 0.076923 +vt 0.108974 0.076923 +vt 0.006410 0.076923 +vt 0.429487 0.397436 +vt 0.532051 0.397436 +vt 0.532051 0.442308 +vt 0.429487 0.442308 +vt 0.634615 0.397436 +vt 0.634615 0.442308 +vt 0.737179 0.397436 +vt 0.737179 0.442308 +vt 0.839744 0.397436 +vt 0.839744 0.442308 +vt 0.532051 0.185897 +vt 0.634615 0.185897 +vt 0.634615 0.282051 +vt 0.532051 0.282051 +vt 0.737179 0.185897 +vt 0.737179 0.282051 +vt 0.839744 0.185897 +vt 0.839744 0.282051 +vt 0.429487 0.185897 +vt 0.429487 0.282051 +vt 0.429487 0.032051 +vt 0.532051 0.032051 +vt 0.532051 0.076923 +vt 0.429487 0.076923 +vt 0.634615 0.032051 +vt 0.634615 0.076923 +vt 0.737179 0.032051 +vt 0.737179 0.076923 +vt 0.839744 0.032051 +vt 0.839744 0.076923 +s off +f 14/1 110/2 112/3 16/4 +f 12/5 108/6 110/2 14/1 +f 10/7 106/8 108/6 12/5 +f 8/4 104/3 106/9 10/10 +f 6/1 102/2 104/3 8/4 +f 4/5 100/6 102/2 6/1 +f 2/7 98/8 100/6 4/5 +f 32/4 128/3 98/9 2/10 +f 30/1 126/2 128/3 32/4 +f 28/5 124/6 126/2 30/1 +f 26/7 122/8 124/6 28/5 +f 24/4 120/3 122/9 26/10 +f 22/1 118/2 120/3 24/4 +f 20/5 116/6 118/2 22/1 +f 18/7 114/8 116/6 20/5 +f 16/4 112/3 114/9 18/10 +f 145/11 130/12 210/13 +f 13/14 15/15 111/16 109/17 +f 11/18 13/14 109/17 107/19 +f 9/20 11/18 107/19 105/21 +f 7/15 9/22 105/23 103/16 +f 5/14 7/15 103/16 101/17 +f 3/18 5/14 101/17 99/19 +f 1/20 3/18 99/19 97/21 +f 31/15 1/22 97/23 127/16 +f 29/14 31/15 127/16 125/17 +f 27/18 29/14 125/17 123/19 +f 25/20 27/18 123/19 121/21 +f 23/15 25/22 121/23 119/16 +f 21/14 23/15 119/16 117/17 +f 19/18 21/14 117/17 115/19 +f 17/20 19/18 115/19 113/21 +f 15/15 17/22 113/23 111/16 +f 194/24 195/25 209/26 +f 195/25 196/27 209/26 +f 196/27 197/28 209/26 +f 197/28 198/29 209/26 +f 198/29 199/30 209/26 +f 199/30 200/31 209/26 +f 200/31 201/32 209/26 +f 201/32 202/33 209/26 +f 202/33 203/34 209/26 +f 203/34 204/35 209/26 +f 204/35 205/36 209/26 +f 205/36 206/37 209/26 +f 206/37 207/38 209/26 +f 207/38 208/39 209/26 +f 208/39 193/40 209/26 +f 193/40 194/24 209/26 +f 130/12 131/41 210/13 +f 131/41 132/42 210/13 +f 132/42 133/43 210/13 +f 133/43 134/44 210/13 +f 134/44 135/45 210/13 +f 135/45 136/46 210/13 +f 136/46 137/47 210/13 +f 137/47 138/48 210/13 +f 138/48 139/49 210/13 +f 139/49 140/50 210/13 +f 140/50 141/51 210/13 +f 141/51 142/52 210/13 +f 142/52 143/53 210/13 +f 143/53 144/54 210/13 +f 144/54 145/11 210/13 +s 1 +f 33/55 2/7 4/5 50/56 +f 50/56 4/5 6/1 51/57 +f 51/57 6/1 8/4 52/58 +f 52/58 8/4 10/10 53/59 +f 53/55 10/7 12/5 54/56 +f 54/56 12/5 14/1 55/57 +f 55/57 14/1 16/4 56/58 +f 56/58 16/4 18/10 57/59 +f 57/55 18/7 20/5 58/56 +f 58/56 20/5 22/1 59/57 +f 59/57 22/1 24/4 60/58 +f 60/58 24/4 26/10 61/59 +f 61/55 26/7 28/5 62/56 +f 62/56 28/5 30/1 63/57 +f 64/58 32/4 2/10 33/59 +f 63/57 30/1 32/4 64/58 +f 66/60 82/61 83/62 67/63 +f 67/63 83/62 84/64 68/65 +f 68/65 84/64 85/66 69/67 +f 69/68 85/69 86/61 70/60 +f 70/60 86/61 87/62 71/63 +f 71/63 87/62 88/64 72/65 +f 72/65 88/64 89/66 73/67 +f 73/68 89/69 90/61 74/60 +f 74/60 90/61 91/62 75/63 +f 75/63 91/62 92/64 76/65 +f 76/65 92/64 93/66 77/67 +f 77/68 93/69 94/61 78/60 +f 78/60 94/61 95/62 79/63 +f 80/65 96/64 65/66 81/67 +f 79/63 95/62 96/64 80/65 +f 65/69 33/55 50/56 82/61 +f 82/61 50/56 51/57 83/62 +f 83/62 51/57 52/58 84/64 +f 84/64 52/58 53/59 85/66 +f 85/69 53/55 54/56 86/61 +f 86/61 54/56 55/57 87/62 +f 87/62 55/57 56/58 88/64 +f 88/64 56/58 57/59 89/66 +f 89/69 57/55 58/56 90/61 +f 90/61 58/56 59/57 91/62 +f 91/62 59/57 60/58 92/64 +f 92/64 60/58 61/59 93/66 +f 93/69 61/55 62/56 94/61 +f 94/61 62/56 63/57 95/62 +f 96/64 64/58 33/59 65/66 +f 95/62 63/57 64/58 96/64 +f 1/21 49/70 34/71 3/19 +f 3/19 34/71 35/72 5/17 +f 5/17 35/72 36/73 7/16 +f 7/16 36/73 37/74 9/23 +f 9/21 37/70 38/71 11/19 +f 11/19 38/71 39/72 13/17 +f 13/17 39/72 40/73 15/16 +f 15/16 40/73 41/74 17/23 +f 17/21 41/70 42/71 19/19 +f 19/19 42/71 43/72 21/17 +f 21/17 43/72 44/73 23/16 +f 23/16 44/73 45/74 25/23 +f 25/21 45/70 46/71 27/19 +f 27/19 46/71 47/72 29/17 +f 31/16 48/73 49/74 1/23 +f 29/17 47/72 48/73 31/16 +f 49/70 81/68 66/60 34/71 +f 34/71 66/60 67/63 35/72 +f 35/72 67/63 68/65 36/73 +f 36/73 68/65 69/67 37/74 +f 37/70 69/68 70/60 38/71 +f 38/71 70/60 71/63 39/72 +f 39/72 71/63 72/65 40/73 +f 40/73 72/65 73/67 41/74 +f 41/70 73/68 74/60 42/71 +f 42/71 74/60 75/63 43/72 +f 43/72 75/63 76/65 44/73 +f 44/73 76/65 77/67 45/74 +f 45/70 77/68 78/60 46/71 +f 46/71 78/60 79/63 47/72 +f 48/73 80/65 81/67 49/74 +f 47/72 79/63 80/65 48/73 +f 65/69 82/61 66/60 81/68 +f 129/75 146/76 100/77 98/78 +f 146/76 147/79 102/80 100/77 +f 147/79 148/81 104/82 102/80 +f 148/81 149/83 106/84 104/82 +f 149/75 150/76 108/77 106/78 +f 150/76 151/79 110/80 108/77 +f 151/79 152/81 112/82 110/80 +f 152/81 153/83 114/84 112/82 +f 153/75 154/76 116/77 114/78 +f 154/76 155/79 118/80 116/77 +f 155/79 156/81 120/82 118/80 +f 156/81 157/83 122/84 120/82 +f 157/75 158/76 124/77 122/78 +f 158/76 159/79 126/80 124/77 +f 160/81 129/83 98/84 128/82 +f 159/79 160/81 128/82 126/80 +f 162/85 163/86 179/87 178/88 +f 163/86 164/89 180/90 179/87 +f 164/89 165/91 181/92 180/90 +f 165/93 166/85 182/88 181/94 +f 166/85 167/86 183/87 182/88 +f 167/86 168/89 184/90 183/87 +f 168/89 169/91 185/92 184/90 +f 169/93 170/85 186/88 185/94 +f 170/85 171/86 187/87 186/88 +f 171/86 172/89 188/90 187/87 +f 172/89 173/91 189/92 188/90 +f 173/93 174/85 190/88 189/94 +f 174/85 175/86 191/87 190/88 +f 176/89 177/91 161/92 192/90 +f 175/86 176/89 192/90 191/87 +f 161/94 178/88 146/76 129/75 +f 178/88 179/87 147/79 146/76 +f 179/87 180/90 148/81 147/79 +f 180/90 181/92 149/83 148/81 +f 181/94 182/88 150/76 149/75 +f 182/88 183/87 151/79 150/76 +f 183/87 184/90 152/81 151/79 +f 184/90 185/92 153/83 152/81 +f 185/94 186/88 154/76 153/75 +f 186/88 187/87 155/79 154/76 +f 187/87 188/90 156/81 155/79 +f 188/90 189/92 157/83 156/81 +f 189/94 190/88 158/76 157/75 +f 190/88 191/87 159/79 158/76 +f 192/90 161/92 129/83 160/81 +f 191/87 192/90 160/81 159/79 +f 97/95 99/96 130/97 145/98 +f 99/96 101/99 131/100 130/97 +f 101/99 103/101 132/102 131/100 +f 103/101 105/103 133/104 132/102 +f 105/95 107/96 134/97 133/98 +f 107/96 109/99 135/100 134/97 +f 109/99 111/101 136/102 135/100 +f 111/101 113/103 137/104 136/102 +f 113/95 115/96 138/97 137/98 +f 115/96 117/99 139/100 138/97 +f 117/99 119/101 140/102 139/100 +f 119/101 121/103 141/104 140/102 +f 121/95 123/96 142/97 141/98 +f 123/96 125/99 143/100 142/97 +f 127/101 97/103 145/104 144/102 +f 125/99 127/101 144/102 143/100 +f 193/98 208/97 162/85 177/93 +f 208/97 207/100 163/86 162/85 +f 207/100 206/102 164/89 163/86 +f 206/102 205/104 165/91 164/89 +f 205/98 204/97 166/85 165/93 +f 204/97 203/100 167/86 166/85 +f 203/100 202/102 168/89 167/86 +f 202/102 201/104 169/91 168/89 +f 201/98 200/97 170/85 169/93 +f 200/97 199/100 171/86 170/85 +f 199/100 198/102 172/89 171/86 +f 198/102 197/104 173/91 172/89 +f 197/98 196/97 174/85 173/93 +f 196/97 195/100 175/86 174/85 +f 194/102 193/104 177/91 176/89 +f 195/100 194/102 176/89 175/86 +f 161/94 177/93 162/85 178/88 diff --git a/mods/cottages/models/cottages_handmill.obj b/mods/cottages/models/cottages_handmill.obj new file mode 100644 index 00000000..d7ba9990 --- /dev/null +++ b/mods/cottages/models/cottages_handmill.obj @@ -0,0 +1,376 @@ +# Blender v2.69 (sub 0) OBJ File: 'handmill.blend' +# www.blender.org +o Cylinder.002 +v -0.047835 -0.281250 0.115485 +v -0.047835 -0.250000 0.115485 +v -0.115485 -0.281250 0.047835 +v -0.115485 -0.250000 0.047835 +v -0.115485 -0.281250 -0.047835 +v -0.115485 -0.250000 -0.047835 +v -0.047835 -0.281250 -0.115485 +v -0.047835 -0.250000 -0.115485 +v 0.047835 -0.281250 -0.115485 +v 0.047835 -0.250000 -0.115485 +v 0.115485 -0.281250 -0.047835 +v 0.115485 -0.250000 -0.047835 +v 0.115485 -0.281250 0.047835 +v 0.115485 -0.250000 0.047835 +v 0.047835 -0.281250 0.115485 +v 0.047835 -0.250000 0.115485 +v -0.047835 -0.062500 0.115485 +v -0.047835 0.000000 0.115485 +v -0.115485 -0.062500 0.047835 +v -0.115485 0.000000 0.047835 +v -0.115485 -0.062500 -0.047835 +v -0.115485 0.000000 -0.047835 +v -0.047835 -0.062500 -0.115485 +v -0.047835 0.000000 -0.115485 +v 0.047835 -0.062500 -0.115485 +v 0.047835 0.000000 -0.115485 +v 0.115485 -0.062500 -0.047835 +v 0.115485 0.000000 -0.047835 +v 0.115485 -0.062500 0.047835 +v 0.115485 0.000000 0.047835 +v 0.047835 -0.062500 0.115485 +v 0.047835 0.000000 0.115485 +v 0.272957 -0.062500 -0.239132 +v 0.272957 0.187500 -0.239132 +v 0.239133 -0.062500 -0.272957 +v 0.239133 0.187500 -0.272957 +v 0.239133 -0.062500 -0.320793 +v 0.239133 0.187500 -0.320793 +v 0.272957 -0.062500 -0.354617 +v 0.272957 0.187500 -0.354617 +v 0.320793 -0.062500 -0.354617 +v 0.320793 0.187500 -0.354617 +v 0.354618 -0.062500 -0.320793 +v 0.354618 0.187500 -0.320793 +v 0.354618 -0.062500 -0.272957 +v 0.354618 0.187500 -0.272957 +v 0.320793 -0.062500 -0.239132 +v 0.320793 0.187500 -0.239132 +v 0.272957 0.187500 -0.239132 +v 0.239133 0.187500 -0.272957 +v 0.239133 0.187500 -0.320793 +v 0.272957 0.187500 -0.354617 +v 0.320793 0.187500 -0.354617 +v 0.354618 0.187500 -0.320793 +v 0.354618 0.187500 -0.272957 +v 0.320793 0.187500 -0.239132 +v -0.097545 -0.062500 0.490393 +v -0.097545 -0.250000 0.490393 +v -0.097545 -0.500000 0.490393 +v -0.097545 -0.281250 0.490393 +v -0.277785 -0.500000 0.415735 +v -0.277785 -0.281250 0.415735 +v -0.415735 -0.500000 0.277785 +v -0.415735 -0.281250 0.277785 +v -0.490393 -0.500000 0.097545 +v -0.490393 -0.281250 0.097545 +v -0.490393 -0.500000 -0.097545 +v -0.490393 -0.281250 -0.097545 +v -0.415735 -0.500000 -0.277785 +v -0.415735 -0.281250 -0.277785 +v -0.277785 -0.500000 -0.415735 +v -0.277785 -0.281250 -0.415735 +v -0.097545 -0.500000 -0.490393 +v -0.097545 -0.281250 -0.490393 +v 0.097545 -0.500000 -0.490393 +v 0.097545 -0.281250 -0.490393 +v 0.277785 -0.500000 -0.415735 +v 0.277785 -0.281250 -0.415735 +v 0.415735 -0.500000 -0.277785 +v 0.415735 -0.281250 -0.277785 +v 0.490393 -0.500000 -0.097545 +v 0.490393 -0.281250 -0.097545 +v 0.490393 -0.500000 0.097545 +v 0.490393 -0.281250 0.097545 +v 0.415735 -0.500000 0.277785 +v 0.415735 -0.281250 0.277785 +v 0.277785 -0.500000 0.415735 +v 0.277785 -0.281250 0.415735 +v 0.097545 -0.500000 0.490393 +v 0.097545 -0.281250 0.490393 +v -0.277785 -0.250000 0.415735 +v -0.277785 -0.062500 0.415735 +v -0.415735 -0.250000 0.277785 +v -0.415735 -0.062500 0.277785 +v -0.490393 -0.250000 0.097545 +v -0.490393 -0.062500 0.097545 +v -0.490393 -0.250000 -0.097545 +v -0.490393 -0.062500 -0.097545 +v -0.415735 -0.250000 -0.277785 +v -0.415735 -0.062500 -0.277785 +v -0.277785 -0.250000 -0.415735 +v -0.277785 -0.062500 -0.415735 +v -0.097545 -0.250000 -0.490393 +v -0.097545 -0.062500 -0.490393 +v 0.097545 -0.250000 -0.490393 +v 0.097545 -0.062500 -0.490393 +v 0.277785 -0.250000 -0.415735 +v 0.277785 -0.062500 -0.415735 +v 0.415735 -0.250000 -0.277785 +v 0.415735 -0.062500 -0.277785 +v 0.490393 -0.250000 -0.097545 +v 0.490393 -0.062500 -0.097545 +v 0.490393 -0.250000 0.097545 +v 0.490393 -0.062500 0.097545 +v 0.415735 -0.250000 0.277785 +v 0.415735 -0.062500 0.277785 +v 0.277785 -0.250000 0.415735 +v 0.277785 -0.062500 0.415735 +v 0.097545 -0.250000 0.490393 +v 0.097545 -0.062500 0.490393 +v 0.296875 0.187500 -0.296875 +v -0.000000 -0.250000 0.000000 +v 0.000000 -0.281250 0.000000 +v 0.000000 -0.062500 0.000000 +v -0.000000 -0.500000 0.000000 +v -0.047835 0.000000 0.115485 +v -0.115485 0.000000 0.047835 +v -0.115485 0.000000 -0.047835 +v -0.047835 0.000000 -0.115485 +v 0.047835 0.000000 -0.115485 +v 0.115485 0.000000 -0.047835 +v 0.115485 0.000000 0.047835 +v 0.047835 0.000000 0.115485 +v 0.000000 0.000000 -0.000000 +vt 0.500000 0.812500 +vt 0.500000 0.875000 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.250000 0.875000 +vt 0.250000 0.812500 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 1.000000 0.812500 +vt 1.000000 0.875000 +vt 0.875000 0.875000 +vt 0.875000 0.812500 +vt 0.750000 0.875000 +vt 0.750000 0.812500 +vt 0.625000 0.812500 +vt 0.625000 0.875000 +vt 0.500000 0.937500 +vt 0.500000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.937500 +vt 0.250000 1.000000 +vt 0.250000 0.937500 +vt 0.125000 1.000000 +vt 0.125000 0.937500 +vt 0.000000 1.000000 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.937500 +vt 0.750000 1.000000 +vt 0.750000 0.937500 +vt 0.625000 0.937500 +vt 0.625000 1.000000 +vt 0.125000 0.963388 +vt 0.088388 1.000000 +vt 0.062500 0.937500 +vt 0.250000 0.437500 +vt 0.250000 0.750000 +vt 0.187500 0.750000 +vt 0.187500 0.437500 +vt 0.125000 0.750000 +vt 0.125000 0.437500 +vt 0.062500 0.750000 +vt 0.062500 0.437500 +vt 0.000000 0.750000 +vt 0.000000 0.437500 +vt 0.500000 0.437500 +vt 0.500000 0.750000 +vt 0.437500 0.750000 +vt 0.437500 0.437500 +vt 0.375000 0.750000 +vt 0.375000 0.437500 +vt 0.312500 0.437500 +vt 0.312500 0.750000 +vt 0.599456 1.000000 +vt 0.783227 0.923879 +vt 0.500000 0.500000 +vt 0.750000 0.250000 +vt 0.750000 0.437500 +vt 0.500000 0.250000 +vt 0.000000 0.250000 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.250000 0.250000 +vt 1.000000 0.250000 +vt 1.000000 0.437500 +vt 0.500000 0.000000 +vt 0.750000 0.000000 +vt 1.000000 0.000000 +vt 0.036612 1.000000 +vt 0.000000 0.963388 +vt 0.000000 0.911612 +vt 0.036612 0.875000 +vt 0.088388 0.875000 +vt 0.125000 0.911612 +vt 0.923880 0.783227 +vt 1.000000 0.599456 +vt 1.000000 0.400544 +vt 0.923880 0.216773 +vt 0.783227 0.076120 +vt 0.599456 -0.000000 +vt 0.400544 -0.000000 +vt 0.216773 0.076120 +vt 0.076121 0.216773 +vt 0.000000 0.400544 +vt 0.000000 0.599456 +vt 0.076121 0.783227 +vt 0.216773 0.923880 +vt 0.400544 1.000000 +vt 0.076120 0.783227 +vt 0.076120 0.216773 +vt 0.551777 0.375000 +vt 0.625000 0.448223 +vt 0.625000 0.551777 +vt 0.551777 0.625000 +vt 0.448223 0.625000 +vt 0.375000 0.551777 +vt 0.375000 0.448223 +vt 0.448223 0.375000 +s off +f 1/1 2/2 4/3 3/4 +f 3/4 4/3 6/5 5/6 +f 5/6 6/5 8/7 7/8 +f 7/8 8/7 10/9 9/10 +f 9/11 10/12 12/13 11/14 +f 11/14 12/13 14/15 13/16 +f 15/17 16/18 2/2 1/1 +f 13/16 14/15 16/18 15/17 +f 17/19 18/20 20/21 19/22 +f 19/22 20/21 22/23 21/24 +f 21/24 22/23 24/25 23/26 +f 23/26 24/25 26/27 25/28 +f 25/29 26/30 28/31 27/32 +f 27/32 28/31 30/33 29/34 +f 31/35 32/36 18/20 17/19 +f 29/34 30/33 32/36 31/35 +f 50/37 49/38 121/39 +f 33/40 34/41 36/42 35/43 +f 35/43 36/42 38/44 37/45 +f 37/45 38/44 40/46 39/47 +f 39/47 40/46 42/48 41/49 +f 41/50 42/51 44/52 43/53 +f 43/53 44/52 46/54 45/55 +f 47/56 48/57 34/41 33/40 +f 45/55 46/54 48/57 47/56 +f 58/58 91/59 122/60 +f 115/61 116/62 118/50 117/63 +f 59/64 60/65 62/66 61/67 +f 113/68 114/69 116/62 115/61 +f 61/67 62/66 64/70 63/63 +f 111/67 112/40 114/49 113/64 +f 63/63 64/70 66/71 65/61 +f 109/63 110/50 112/40 111/67 +f 65/61 66/71 68/72 67/68 +f 107/61 108/62 110/50 109/63 +f 67/64 68/65 70/66 69/67 +f 105/68 106/69 108/62 107/61 +f 69/67 70/66 72/70 71/63 +f 103/67 104/40 106/49 105/64 +f 71/63 72/70 74/71 73/61 +f 101/63 102/50 104/40 103/67 +f 73/61 74/71 76/72 75/68 +f 99/61 100/62 102/50 101/63 +f 75/64 76/65 78/66 77/67 +f 97/68 98/69 100/62 99/61 +f 77/67 78/66 80/70 79/63 +f 95/67 96/40 98/49 97/64 +f 79/63 80/70 82/71 81/61 +f 62/59 60/58 123/60 +f 93/63 94/50 96/40 95/67 +f 81/61 82/71 84/72 83/68 +f 117/63 118/50 120/40 119/67 +f 91/61 92/62 94/50 93/63 +f 83/64 84/65 86/66 85/67 +f 119/67 120/40 57/49 58/64 +f 58/68 57/69 92/62 91/61 +f 85/67 86/66 88/70 87/63 +f 92/59 57/58 124/60 +f 89/61 90/71 60/72 59/68 +f 87/63 88/70 90/71 89/61 +f 59/58 61/59 125/60 +f 49/38 56/73 121/39 +f 56/73 55/74 121/39 +f 55/74 54/75 121/39 +f 54/75 53/76 121/39 +f 53/76 52/77 121/39 +f 52/77 51/78 121/39 +f 51/78 50/37 121/39 +f 91/59 93/79 122/60 +f 93/79 95/80 122/60 +f 95/80 97/81 122/60 +f 97/81 99/82 122/60 +f 99/82 101/83 122/60 +f 101/83 103/84 122/60 +f 103/84 105/85 122/60 +f 105/85 107/86 122/60 +f 107/86 109/87 122/60 +f 109/87 111/88 122/60 +f 111/88 113/89 122/60 +f 113/89 115/90 122/60 +f 115/90 117/91 122/60 +f 117/91 119/92 122/60 +f 119/92 58/58 122/60 +f 60/58 90/92 123/60 +f 90/92 88/91 123/60 +f 88/91 86/90 123/60 +f 86/90 84/89 123/60 +f 84/89 82/88 123/60 +f 82/88 80/87 123/60 +f 80/87 78/86 123/60 +f 78/86 76/85 123/60 +f 76/85 74/84 123/60 +f 74/84 72/83 123/60 +f 72/83 70/82 123/60 +f 70/82 68/81 123/60 +f 68/81 66/80 123/60 +f 66/80 64/79 123/60 +f 64/79 62/59 123/60 +f 57/58 120/92 124/60 +f 120/92 118/91 124/60 +f 118/91 116/93 124/60 +f 116/93 114/89 124/60 +f 114/89 112/88 124/60 +f 112/88 110/94 124/60 +f 110/94 108/86 124/60 +f 108/86 106/85 124/60 +f 106/85 104/84 124/60 +f 104/84 102/83 124/60 +f 102/83 100/82 124/60 +f 100/82 98/81 124/60 +f 98/81 96/80 124/60 +f 96/80 94/79 124/60 +f 94/79 92/59 124/60 +f 61/59 63/79 125/60 +f 63/79 65/80 125/60 +f 65/80 67/81 125/60 +f 67/81 69/82 125/60 +f 69/82 71/83 125/60 +f 71/83 73/84 125/60 +f 73/84 75/85 125/60 +f 75/85 77/86 125/60 +f 77/86 79/94 125/60 +f 79/94 81/88 125/60 +f 81/88 83/89 125/60 +f 83/89 85/93 125/60 +f 85/93 87/91 125/60 +f 87/91 89/92 125/60 +f 89/92 59/58 125/60 +f 127/95 126/96 134/60 +f 126/96 133/97 134/60 +f 133/97 132/98 134/60 +f 132/98 131/99 134/60 +f 131/99 130/100 134/60 +f 130/100 129/101 134/60 +f 129/101 128/102 134/60 +f 134/60 128/102 127/95 diff --git a/mods/cottages/models/cottages_tub.obj b/mods/cottages/models/cottages_tub.obj new file mode 100644 index 00000000..6e3b04bb --- /dev/null +++ b/mods/cottages/models/cottages_tub.obj @@ -0,0 +1,326 @@ +# Blender v2.69 (sub 0) OBJ File: 'cottages-tub.blend' +# www.blender.org +o Cylinder +v 0.092835 -0.500001 -0.466712 +v 0.264371 -0.500001 -0.395660 +v 0.395660 -0.500001 -0.264371 +v 0.466712 -0.500001 -0.092835 +v 0.466712 -0.500001 0.092835 +v 0.395660 -0.500001 0.264371 +v 0.264371 -0.500001 0.395660 +v 0.092835 -0.500001 0.466712 +v -0.092835 -0.500001 0.466712 +v -0.264371 -0.500001 0.395660 +v -0.395660 -0.500001 0.264371 +v -0.466712 -0.500001 0.092835 +v -0.466712 -0.500001 -0.092835 +v -0.395660 -0.500001 -0.264371 +v -0.264371 -0.500001 -0.395660 +v -0.092835 -0.500001 -0.466713 +v 0.273184 -0.413334 -0.408849 +v 0.408849 -0.413334 -0.273184 +v 0.482270 -0.413334 -0.095929 +v 0.482270 -0.413334 0.095930 +v 0.408849 -0.413334 0.273184 +v 0.273184 -0.413334 0.408849 +v 0.095929 -0.413334 0.482270 +v -0.095929 -0.413334 0.482270 +v -0.273184 -0.413334 0.408849 +v -0.408849 -0.413334 0.273184 +v -0.482270 -0.413334 0.095929 +v -0.482270 -0.413334 -0.095930 +v -0.408849 -0.413334 -0.273184 +v -0.273184 -0.413334 -0.408849 +v -0.095929 -0.413334 -0.482270 +v 0.095930 -0.413334 -0.482270 +v 0.282294 -0.114831 -0.422482 +v 0.422482 -0.114831 -0.282294 +v 0.498352 -0.114831 -0.099128 +v 0.498352 -0.114831 0.099128 +v 0.422482 -0.114831 0.282294 +v 0.282294 -0.114831 0.422482 +v 0.099128 -0.114831 0.498352 +v -0.099128 -0.114831 0.498352 +v -0.282294 -0.114831 0.422482 +v -0.422482 -0.114831 0.282294 +v -0.498352 -0.114831 0.099128 +v -0.498352 -0.114831 -0.099128 +v -0.422482 -0.114831 -0.282294 +v -0.282293 -0.114831 -0.422482 +v -0.099128 -0.114831 -0.498352 +v 0.099128 -0.114831 -0.498352 +v 0.083551 -0.500001 -0.420041 +v 0.237934 -0.500001 -0.356094 +v 0.356094 -0.500001 -0.237934 +v 0.420041 -0.500001 -0.083551 +v 0.420041 -0.500001 0.083551 +v 0.356094 -0.500001 0.237934 +v 0.237934 -0.500001 0.356094 +v 0.083551 -0.500001 0.420041 +v -0.083551 -0.500001 0.420041 +v -0.237934 -0.500001 0.356094 +v -0.356094 -0.500001 0.237934 +v -0.420041 -0.500001 0.083551 +v -0.420041 -0.500001 -0.083551 +v -0.356094 -0.500001 -0.237934 +v -0.237934 -0.500001 -0.356094 +v -0.083551 -0.500001 -0.420041 +v 0.245866 -0.413335 -0.367964 +v 0.367964 -0.413335 -0.245866 +v 0.434043 -0.413335 -0.086336 +v 0.434043 -0.413335 0.086337 +v 0.367964 -0.413335 0.245866 +v 0.245866 -0.413335 0.367964 +v 0.086337 -0.413335 0.434043 +v -0.086336 -0.413335 0.434043 +v -0.245866 -0.413335 0.367964 +v -0.367964 -0.413335 0.245866 +v -0.434043 -0.413335 0.086337 +v -0.434043 -0.413335 -0.086337 +v -0.367964 -0.413335 -0.245866 +v -0.245865 -0.413335 -0.367964 +v -0.086336 -0.413335 -0.434043 +v 0.086337 -0.413335 -0.434043 +v 0.254064 -0.114831 -0.380234 +v 0.380234 -0.114831 -0.254064 +v 0.448517 -0.114831 -0.089215 +v 0.448517 -0.114831 0.089216 +v 0.380234 -0.114831 0.254064 +v 0.254064 -0.114831 0.380234 +v 0.089216 -0.114831 0.448517 +v -0.089215 -0.114831 0.448517 +v -0.254064 -0.114831 0.380234 +v -0.380234 -0.114831 0.254064 +v -0.448517 -0.114831 0.089216 +v -0.448517 -0.114831 -0.089216 +v -0.380234 -0.114831 -0.254064 +v -0.254064 -0.114831 -0.380234 +v -0.089215 -0.114831 -0.448517 +v 0.089216 -0.114831 -0.448517 +v 0.087776 -0.352645 -0.441280 +v -0.087776 -0.352645 -0.441280 +v -0.249965 -0.352645 -0.374099 +v -0.374099 -0.352645 -0.249965 +v -0.441280 -0.352645 -0.087776 +v -0.441280 -0.352645 0.087776 +v -0.374099 -0.352645 0.249965 +v -0.249965 -0.352645 0.374099 +v -0.087776 -0.352645 0.441280 +v 0.087776 -0.352645 0.441280 +v 0.249965 -0.352645 0.374099 +v 0.374099 -0.352645 0.249965 +v 0.441280 -0.352645 0.087776 +v 0.441280 -0.352645 -0.087776 +v 0.374099 -0.352645 -0.249965 +v 0.249965 -0.352645 -0.374099 +v 0.000000 -0.352645 0.000000 +v -0.000000 -0.413334 0.000000 +vt 0.211792 0.993590 +vt 0.117562 0.954728 +vt 0.262789 0.738327 +vt 0.211538 0.006410 +vt 0.108974 0.006410 +vt 0.108974 0.032051 +vt 0.211538 0.032051 +vt 0.314103 0.006410 +vt 0.314103 0.032051 +vt 0.416667 0.006410 +vt 0.416667 0.032051 +vt 0.006410 0.006410 +vt 0.006410 0.032051 +vt 0.211361 0.993526 +vt 0.117394 0.954505 +vt 0.262040 0.737637 +vt 0.045447 0.882467 +vt 0.006475 0.788381 +vt 0.006410 0.686569 +vt 0.045263 0.592532 +vt 0.117118 0.520586 +vt 0.204627 0.488094 +vt 0.312719 0.481748 +vt 0.406687 0.520769 +vt 0.478633 0.592807 +vt 0.517605 0.686893 +vt 0.517670 0.788705 +vt 0.478816 0.882742 +vt 0.406962 0.954687 +vt 0.313044 0.993590 +vt 0.045441 0.882922 +vt 0.006410 0.789102 +vt 0.006410 0.687551 +vt 0.045442 0.593732 +vt 0.117562 0.521925 +vt 0.211793 0.483064 +vt 0.313787 0.483064 +vt 0.408016 0.521926 +vt 0.480136 0.593732 +vt 0.519168 0.687551 +vt 0.519168 0.789103 +vt 0.480136 0.882922 +vt 0.408016 0.954728 +vt 0.313786 0.993590 +vt 0.211538 0.442308 +vt 0.211538 0.467949 +vt 0.108974 0.467949 +vt 0.108974 0.442308 +vt 0.314103 0.442308 +vt 0.314103 0.467949 +vt 0.416667 0.442308 +vt 0.416667 0.467949 +vt 0.006410 0.467949 +vt 0.006410 0.442308 +vt 0.416667 0.076923 +vt 0.314103 0.076923 +vt 0.211538 0.076923 +vt 0.108974 0.076923 +vt 0.006410 0.076923 +vt 0.416667 0.185897 +vt 0.314103 0.185897 +vt 0.211538 0.185897 +vt 0.108974 0.185897 +vt 0.006410 0.185897 +vt 0.429487 0.032051 +vt 0.532051 0.032051 +vt 0.532051 0.076923 +vt 0.429487 0.076923 +vt 0.634615 0.032051 +vt 0.634615 0.076923 +vt 0.737179 0.032051 +vt 0.737179 0.076923 +vt 0.839744 0.032051 +vt 0.839744 0.076923 +vt 0.532051 0.185897 +vt 0.429487 0.185897 +vt 0.634615 0.185897 +vt 0.737179 0.185897 +vt 0.839744 0.185897 +s off +f 80/1 65/2 114/3 +f 7/4 8/5 56/6 55/7 +f 6/8 7/4 55/7 54/9 +f 5/10 6/8 54/9 53/11 +f 4/5 5/12 53/13 52/6 +f 3/4 4/5 52/6 51/7 +f 2/8 3/4 51/7 50/9 +f 1/10 2/8 50/9 49/11 +f 16/5 1/12 49/13 64/6 +f 15/4 16/5 64/6 63/7 +f 14/8 15/4 63/7 62/9 +f 13/10 14/8 62/9 61/11 +f 12/5 13/12 61/13 60/6 +f 11/4 12/5 60/6 59/7 +f 10/8 11/4 59/7 58/9 +f 9/10 10/8 58/9 57/11 +f 8/5 9/12 57/13 56/6 +f 98/14 99/15 113/16 +f 99/15 100/17 113/16 +f 100/17 101/18 113/16 +f 101/18 102/19 113/16 +f 102/19 103/20 113/16 +f 103/20 104/21 113/16 +f 104/21 105/22 113/16 +f 105/22 106/23 113/16 +f 106/23 107/24 113/16 +f 107/24 108/25 113/16 +f 108/25 109/26 113/16 +f 109/26 110/27 113/16 +f 110/27 111/28 113/16 +f 111/28 112/29 113/16 +f 112/29 97/30 113/16 +f 97/30 98/14 113/16 +f 65/2 66/31 114/3 +f 66/31 67/32 114/3 +f 67/32 68/33 114/3 +f 68/33 69/34 114/3 +f 69/34 70/35 114/3 +f 70/35 71/36 114/3 +f 71/36 72/37 114/3 +f 72/37 73/38 114/3 +f 73/38 74/39 114/3 +f 74/39 75/40 114/3 +f 75/40 76/41 114/3 +f 76/41 77/42 114/3 +f 77/42 78/43 114/3 +f 78/43 79/44 114/3 +f 79/44 80/1 114/3 +f 38/45 86/46 87/47 39/48 +f 37/49 85/50 86/46 38/45 +f 36/51 84/52 85/50 37/49 +f 35/48 83/47 84/53 36/54 +f 34/45 82/46 83/47 35/48 +f 33/49 81/50 82/46 34/45 +f 48/51 96/52 81/50 33/49 +f 47/48 95/47 96/53 48/54 +f 46/45 94/46 95/47 47/48 +f 45/49 93/50 94/46 46/45 +f 44/51 92/52 93/50 45/49 +f 43/48 91/47 92/53 44/54 +f 42/45 90/46 91/47 43/48 +f 41/49 89/50 90/46 42/45 +f 40/51 88/52 89/50 41/49 +f 39/48 87/47 88/53 40/54 +s 1 +f 1/11 32/55 17/56 2/9 +f 2/9 17/56 18/57 3/7 +f 3/7 18/57 19/58 4/6 +f 4/6 19/58 20/59 5/13 +f 5/11 20/55 21/56 6/9 +f 6/9 21/56 22/57 7/7 +f 7/7 22/57 23/58 8/6 +f 8/6 23/58 24/59 9/13 +f 9/11 24/55 25/56 10/9 +f 10/9 25/56 26/57 11/7 +f 11/7 26/57 27/58 12/6 +f 12/6 27/58 28/59 13/13 +f 13/11 28/55 29/56 14/9 +f 14/9 29/56 30/57 15/7 +f 16/6 31/58 32/59 1/13 +f 15/7 30/57 31/58 16/6 +f 32/55 48/60 33/61 17/56 +f 17/56 33/61 34/62 18/57 +f 18/57 34/62 35/63 19/58 +f 19/58 35/63 36/64 20/59 +f 20/55 36/60 37/61 21/56 +f 21/56 37/61 38/62 22/57 +f 22/57 38/62 39/63 23/58 +f 23/58 39/63 40/64 24/59 +f 24/55 40/60 41/61 25/56 +f 25/56 41/61 42/62 26/57 +f 26/57 42/62 43/63 27/58 +f 27/58 43/63 44/64 28/59 +f 28/55 44/60 45/61 29/56 +f 29/56 45/61 46/62 30/57 +f 31/58 47/63 48/64 32/59 +f 30/57 46/62 47/63 31/58 +f 49/65 50/66 65/67 80/68 +f 50/66 51/69 66/70 65/67 +f 51/69 52/71 67/72 66/70 +f 52/71 53/73 68/74 67/72 +f 53/65 54/66 69/67 68/68 +f 54/66 55/69 70/70 69/67 +f 55/69 56/71 71/72 70/70 +f 56/71 57/73 72/74 71/72 +f 57/65 58/66 73/67 72/68 +f 58/66 59/69 74/70 73/67 +f 59/69 60/71 75/72 74/70 +f 60/71 61/73 76/74 75/72 +f 61/65 62/66 77/67 76/68 +f 62/66 63/69 78/70 77/67 +f 64/71 49/73 80/74 79/72 +f 63/69 64/71 79/72 78/70 +f 97/68 112/67 81/75 96/76 +f 112/67 111/70 82/77 81/75 +f 111/70 110/72 83/78 82/77 +f 110/72 109/74 84/79 83/78 +f 109/68 108/67 85/75 84/76 +f 108/67 107/70 86/77 85/75 +f 107/70 106/72 87/78 86/77 +f 106/72 105/74 88/79 87/78 +f 105/68 104/67 89/75 88/76 +f 104/67 103/70 90/77 89/75 +f 103/70 102/72 91/78 90/77 +f 102/72 101/74 92/79 91/78 +f 101/68 100/67 93/75 92/76 +f 100/67 99/70 94/77 93/75 +f 98/72 97/74 96/79 95/78 +f 99/70 98/72 95/78 94/77 diff --git a/mods/cottages/models/feldweg-T-junction.obj b/mods/cottages/models/feldweg-T-junction.obj new file mode 100644 index 00000000..aae5c3de --- /dev/null +++ b/mods/cottages/models/feldweg-T-junction.obj @@ -0,0 +1,203 @@ +# Blender v2.72 (sub 0) OBJ File: 'feldweg-T-junction.blend' +# www.blender.org +o Cube.001 +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.250000 0.413592 0.500000 +v 0.375000 0.500000 0.500000 +v 0.125000 0.375000 0.500000 +v 0.500000 0.413592 0.250000 +v 0.500000 0.500000 0.375000 +v 0.500000 0.375000 0.125000 +v -0.250000 0.413592 0.500000 +v -0.125000 0.375000 0.500000 +v -0.375000 0.500000 0.500000 +v 0.500000 0.413592 -0.250000 +v 0.500000 0.375000 -0.125000 +v 0.500000 0.500000 -0.375000 +v -0.250000 0.413592 -0.500000 +v -0.375000 0.500000 -0.500000 +v -0.125000 0.375000 -0.500000 +v 0.250000 0.413592 -0.500000 +v 0.125000 0.375000 -0.500000 +v 0.375000 0.500000 -0.500000 +v 0.147929 0.375000 0.384092 +v 0.205019 0.375000 0.284810 +v 0.284810 0.375000 0.205019 +v 0.384092 0.375000 0.147929 +v 0.264688 0.413592 0.428728 +v 0.304057 0.413592 0.361075 +v 0.361075 0.413592 0.304057 +v 0.428728 0.413592 0.264688 +v 0.473364 0.500000 0.381447 +v 0.437341 0.500000 0.403095 +v 0.403095 0.500000 0.437341 +v 0.381447 0.500000 0.473364 +v 0.473364 0.500000 -0.381447 +v 0.437341 0.500000 -0.403095 +v 0.403095 0.500000 -0.437341 +v 0.381447 0.500000 -0.473364 +v 0.428728 0.413592 -0.264688 +v 0.361075 0.413592 -0.304057 +v 0.304057 0.413592 -0.361075 +v 0.264688 0.413592 -0.428728 +v 0.147929 0.375000 -0.384092 +v 0.205019 0.375000 -0.284810 +v 0.284810 0.375000 -0.205019 +v 0.384092 0.375000 -0.147929 +v 0.000000 -0.005322 -0.500000 +v 0.500000 -0.005322 0.000000 +v -0.000000 -0.005322 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 0.494678 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.750000 0.913592 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.250000 0.913592 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.973364 0.118553 +vt 0.937341 0.096905 +vt 0.903095 0.062659 +vt 0.881447 0.026636 +vt 0.875000 0.000000 +vt 1.000000 0.125000 +vt 0.026636 0.118553 +vt 0.000000 0.125000 +vt 0.125000 0.000000 +vt 0.118553 0.026636 +vt 0.096905 0.062659 +vt 0.062659 0.096905 +vt 0.000000 0.875000 +vt 1.000000 0.875000 +vt 0.352071 0.115908 +vt 0.235312 0.071272 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.294981 0.215190 +vt 0.195943 0.138925 +vt 0.215190 0.294981 +vt 0.138925 0.195943 +vt 0.071272 0.235312 +vt 0.115908 0.352071 +vt 0.000000 0.250000 +vt 0.000000 0.375000 +vt 0.928728 0.235312 +vt 1.000000 0.250000 +vt 1.000000 0.375000 +vt 0.884092 0.352071 +vt 0.861075 0.195943 +vt 0.784810 0.294981 +vt 0.804057 0.138925 +vt 0.705019 0.215190 +vt 0.647929 0.115908 +vt 0.764688 0.071272 +vt 0.625000 0.000000 +vt 0.750000 0.000000 +vt 0.000000 0.625000 +vt 1.000000 0.625000 +vt 1.000000 0.750000 +vt 0.000000 0.750000 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.250000 0.625000 +vt 0.250000 0.500000 +vt 0.187500 0.625000 +vt 0.187500 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.625000 +vt 0.062500 0.500000 +vt 0.062500 0.625000 +vt 0.750000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.625000 +vt 0.750000 0.625000 +vt 0.687500 0.500000 +vt 0.687500 0.625000 +vt 0.625000 0.500000 +vt 0.625000 0.625000 +vt 0.562500 0.625000 +vt 0.562500 0.500000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +g Cube.001_Cube.001_road_ends +s off +f 7/1 8/2 53/3 +f 5/2 1/4 52/3 +f 5/1 6/2 51/3 +f 6/2 2/4 51/3 +f 2/4 22/5 51/3 +f 22/5 21/6 51/3 +f 21/6 23/7 51/3 +f 23/7 25/8 51/3 +f 25/8 24/9 51/3 +f 24/9 26/10 51/3 +f 26/10 1/11 51/3 +f 1/11 5/1 51/3 +f 1/4 20/5 52/3 +f 20/5 18/6 52/3 +f 18/6 19/7 52/3 +f 19/7 14/8 52/3 +f 14/8 12/9 52/3 +f 12/9 13/10 52/3 +f 13/10 4/11 52/3 +f 4/11 8/1 52/3 +f 8/1 5/2 52/3 +f 8/2 4/4 53/3 +f 4/4 10/5 53/3 +f 10/5 9/6 53/3 +f 9/6 11/7 53/3 +f 11/7 16/8 53/3 +f 16/8 15/9 53/3 +f 15/9 17/10 53/3 +f 17/10 3/11 53/3 +f 3/11 7/1 53/3 +g Cube.001_Cube.001_road_sides +f 7/2 3/4 2/11 6/1 +g Cube.001_Cube.001_bottom +f 7/1 6/2 5/4 8/11 +g Cube.001_Cube.001_top_grass +f 42/12 41/13 40/14 39/15 20/16 1/2 26/17 +f 38/18 10/19 4/1 13/20 35/21 36/22 37/23 +f 3/11 17/24 22/25 2/4 +g Cube.001_Cube.001_road +f 30/26 34/27 12/28 14/29 +f 29/30 33/31 34/27 30/26 +f 28/32 32/33 33/31 29/30 +f 31/34 32/33 28/32 27/35 +f 9/36 31/34 27/35 11/37 +f 46/38 24/39 25/40 47/41 +f 45/42 46/38 47/41 48/43 +f 44/44 45/42 48/43 49/45 +f 50/46 43/47 44/44 49/45 +f 19/48 18/49 43/47 50/46 +f 16/50 23/51 21/52 15/53 +f 23/51 16/50 11/37 25/40 +f 27/35 47/41 25/40 11/37 +f 28/32 48/43 47/41 27/35 +f 29/30 49/45 48/43 28/32 +f 30/26 50/46 49/45 29/30 +f 30/26 14/29 19/48 50/46 +g Cube.001_Cube.001_road-grass_blend +f 34/54 35/55 13/56 12/57 +f 33/58 36/59 35/55 34/54 +f 32/60 37/61 36/59 33/58 +f 38/62 37/61 32/60 31/63 +f 10/64 38/62 31/63 9/65 +f 42/66 26/67 24/68 46/69 +f 41/70 42/66 46/69 45/71 +f 40/72 41/70 45/71 44/73 +f 43/74 39/75 40/72 44/73 +f 18/76 20/77 39/75 43/74 +f 15/53 21/52 22/25 17/24 diff --git a/mods/cottages/models/feldweg-crossing.obj b/mods/cottages/models/feldweg-crossing.obj new file mode 100644 index 00000000..9caa2965 --- /dev/null +++ b/mods/cottages/models/feldweg-crossing.obj @@ -0,0 +1,314 @@ +# Blender v2.72 (sub 0) OBJ File: 'feldweg-crossing.blend' +# www.blender.org +o Cube.003 +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.500000 0.413592 0.250000 +v -0.500000 0.500000 0.375000 +v -0.500000 0.375000 0.125000 +v -0.250000 0.413592 0.500000 +v -0.375000 0.500000 0.500000 +v -0.125000 0.375000 0.500000 +v -0.500000 0.413592 -0.250000 +v -0.500000 0.375000 -0.125000 +v -0.500000 0.500000 -0.375000 +v 0.250000 0.413592 0.500000 +v 0.125000 0.375000 0.500000 +v 0.375000 0.500000 0.500000 +v 0.500000 0.413592 -0.250000 +v 0.500000 0.500000 -0.375000 +v 0.500000 0.375000 -0.125000 +v 0.500000 0.413592 0.250000 +v 0.500000 0.375000 0.125000 +v 0.500000 0.500000 0.375000 +v 0.250000 0.413592 -0.500000 +v 0.375000 0.500000 -0.500000 +v 0.125000 0.375000 -0.500000 +v -0.250000 0.413592 -0.500000 +v -0.125000 0.375000 -0.500000 +v -0.375000 0.500000 -0.500000 +v -0.384092 0.375000 0.147929 +v -0.284809 0.375000 0.205019 +v -0.205019 0.375000 0.284810 +v -0.147929 0.375000 0.384092 +v -0.428728 0.413592 0.264688 +v -0.361075 0.413592 0.304057 +v -0.304057 0.413592 0.361075 +v -0.264688 0.413592 0.428728 +v -0.381447 0.500000 0.473364 +v -0.403095 0.500000 0.437341 +v -0.437341 0.500000 0.403095 +v -0.473364 0.500000 0.381447 +v -0.473364 0.500000 -0.381447 +v -0.437341 0.500000 -0.403095 +v -0.403095 0.500000 -0.437341 +v -0.381447 0.500000 -0.473364 +v -0.428728 0.413592 -0.264688 +v -0.361075 0.413592 -0.304057 +v -0.304057 0.413592 -0.361075 +v -0.264688 0.413592 -0.428728 +v -0.147929 0.375000 -0.384092 +v -0.205019 0.375000 -0.284810 +v -0.284810 0.375000 -0.205019 +v -0.384092 0.375000 -0.147929 +v 0.381447 0.500000 0.473364 +v 0.403095 0.500000 0.437341 +v 0.437341 0.500000 0.403095 +v 0.473364 0.500000 0.381447 +v 0.264688 0.413592 0.428728 +v 0.304057 0.413592 0.361075 +v 0.361075 0.413592 0.304057 +v 0.428728 0.413592 0.264688 +v 0.384091 0.375000 0.147929 +v 0.284810 0.375000 0.205019 +v 0.205019 0.375000 0.284810 +v 0.147929 0.375000 0.384092 +v 0.384091 0.375000 -0.147929 +v 0.284809 0.375000 -0.205019 +v 0.205018 0.375000 -0.284810 +v 0.147929 0.375000 -0.384092 +v 0.428728 0.413592 -0.264688 +v 0.361075 0.413592 -0.304057 +v 0.304057 0.413592 -0.361075 +v 0.264688 0.413592 -0.428728 +v 0.381447 0.500000 -0.473364 +v 0.403095 0.500000 -0.437341 +v 0.437341 0.500000 -0.403095 +v 0.473364 0.500000 -0.381447 +v 0.000000 -0.005322 0.500000 +v 0.500000 -0.005322 0.000000 +v 0.000000 -0.005322 -0.500000 +v -0.500000 -0.005322 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.500000 0.494678 +vt 0.000000 0.000000 +vt 0.875000 1.000000 +vt 0.750000 0.913592 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.250000 0.913592 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.026636 0.118553 +vt 0.000000 0.125000 +vt 0.125000 0.000000 +vt 0.118553 0.026636 +vt 0.096905 0.062659 +vt 0.062659 0.096905 +vt 0.973364 0.118553 +vt 0.937341 0.096905 +vt 0.903095 0.062659 +vt 0.881447 0.026636 +vt 0.875000 0.000000 +vt 1.000000 0.125000 +vt 0.973364 0.881447 +vt 1.000000 0.875000 +vt 0.881447 0.973364 +vt 0.903095 0.937341 +vt 0.937341 0.903095 +vt 0.118553 0.973364 +vt 0.000000 0.875000 +vt 0.026636 0.881447 +vt 0.062659 0.903095 +vt 0.096905 0.937341 +vt 0.352071 0.115908 +vt 0.235312 0.071272 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.294981 0.215190 +vt 0.195943 0.138925 +vt 0.215191 0.294981 +vt 0.138925 0.195943 +vt 0.071272 0.235312 +vt 0.115908 0.352071 +vt 0.000000 0.250000 +vt 0.000000 0.375000 +vt 0.235312 0.928728 +vt 0.352071 0.884092 +vt 0.375000 1.000000 +vt 0.250000 1.000000 +vt 0.195943 0.861075 +vt 0.294981 0.784810 +vt 0.138925 0.804057 +vt 0.215190 0.705019 +vt 0.115908 0.647929 +vt 0.071272 0.764688 +vt 0.000000 0.625000 +vt 0.000000 0.750000 +vt 0.928728 0.235312 +vt 1.000000 0.250000 +vt 1.000000 0.375000 +vt 0.884092 0.352071 +vt 0.861075 0.195943 +vt 0.784810 0.294981 +vt 0.804057 0.138925 +vt 0.705019 0.215190 +vt 0.647929 0.115908 +vt 0.764688 0.071272 +vt 0.625000 0.000000 +vt 0.750000 0.000000 +vt 0.647929 0.884092 +vt 0.764688 0.928728 +vt 0.750000 1.000000 +vt 0.625000 1.000000 +vt 0.705018 0.784810 +vt 0.804057 0.861075 +vt 0.784809 0.705019 +vt 0.861075 0.804057 +vt 0.928728 0.764688 +vt 0.884091 0.647929 +vt 1.000000 0.750000 +vt 1.000000 0.625000 +vt 0.750000 0.625000 +vt 0.750000 0.500000 +vt 0.812500 0.500000 +vt 0.812500 0.625000 +vt 0.687500 0.625000 +vt 0.687500 0.500000 +vt 0.625000 0.625000 +vt 0.625000 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.500000 0.500000 +vt 0.500000 0.625000 +vt 0.125000 0.500000 +vt 0.125000 0.625000 +vt 0.062500 0.625000 +vt 0.062500 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.625000 +vt 0.250000 0.500000 +vt 0.250000 0.625000 +vt 0.312500 0.625000 +vt 0.312500 0.500000 +vt 0.375000 0.625000 +vt 0.375000 0.500000 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.062500 0.750000 +vt 0.125000 0.750000 +vt 0.187500 0.875000 +vt 0.187500 0.750000 +vt 0.250000 0.875000 +vt 0.250000 0.750000 +vt 0.312500 0.750000 +vt 0.312500 0.875000 +vt 0.375000 0.750000 +vt 0.562500 0.750000 +vt 0.562500 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.750000 +vt 0.625000 0.750000 +vt 0.687500 0.750000 +vt 0.687500 0.875000 +vt 0.750000 0.875000 +vt 0.750000 0.750000 +vt 0.812500 0.875000 +vt 0.812500 0.750000 +g Cube.003_Cube.003_road_ends +s off +f 7/1 3/2 83/3 +f 5/4 6/1 82/3 +f 7/4 8/1 84/3 +f 5/1 1/2 81/3 +f 1/2 20/5 81/3 +f 20/5 18/6 81/3 +f 18/6 19/7 81/3 +f 19/7 14/8 81/3 +f 14/8 12/9 81/3 +f 12/9 13/10 81/3 +f 13/10 4/11 81/3 +f 4/11 8/4 81/3 +f 8/4 5/1 81/3 +f 6/1 2/2 82/3 +f 2/2 22/5 82/3 +f 22/5 21/6 82/3 +f 21/6 23/7 82/3 +f 23/7 25/8 82/3 +f 25/8 24/9 82/3 +f 24/9 26/10 82/3 +f 26/10 1/11 82/3 +f 1/11 5/4 82/3 +f 3/2 32/5 83/3 +f 32/5 30/6 83/3 +f 30/6 31/7 83/3 +f 31/7 29/8 83/3 +f 29/8 27/9 83/3 +f 27/9 28/10 83/3 +f 28/10 2/11 83/3 +f 2/11 6/4 83/3 +f 6/4 7/1 83/3 +f 8/1 4/2 84/3 +f 4/2 10/5 84/3 +f 10/5 9/6 84/3 +f 9/6 11/7 84/3 +f 11/7 16/8 84/3 +f 16/8 15/9 84/3 +f 15/9 17/10 84/3 +f 17/10 3/11 84/3 +f 3/11 7/4 84/3 +g Cube.003_Cube.003_bottom +f 7/4 6/1 5/2 8/11 +g Cube.003_Cube.003_top_grass +f 44/12 10/13 4/4 13/14 41/15 42/16 43/17 +f 60/18 59/19 58/20 57/21 20/22 1/1 26/23 +f 80/24 22/25 2/2 28/5 77/26 78/27 79/28 +f 48/29 32/10 3/11 17/30 45/31 46/32 47/33 +g Cube.003_Cube.003_road +f 36/34 40/35 12/36 14/37 +f 35/38 39/39 40/35 36/34 +f 34/40 38/41 39/39 35/38 +f 37/42 38/41 34/40 33/43 +f 9/44 37/42 33/43 11/45 +f 52/46 53/47 31/48 30/49 +f 51/50 54/51 53/47 52/46 +f 50/52 55/53 54/51 51/50 +f 56/54 55/53 50/52 49/55 +f 16/56 56/54 49/55 15/57 +f 64/58 24/59 25/60 65/61 +f 63/62 64/58 65/61 66/63 +f 62/64 63/62 66/63 67/65 +f 68/66 61/67 62/64 67/65 +f 19/68 18/69 61/67 68/66 +f 72/70 76/71 27/72 29/73 +f 71/74 75/75 76/71 72/70 +f 70/76 74/77 75/75 71/74 +f 73/78 74/77 70/76 69/79 +f 21/80 73/78 69/79 23/81 +f 36/34 14/37 19/68 68/66 +f 36/34 68/66 67/65 35/38 +f 65/61 25/60 23/81 69/79 +f 66/63 65/61 69/79 70/76 +f 53/47 72/70 29/73 31/48 +f 53/47 54/51 71/74 72/70 +f 33/43 56/54 16/56 11/45 +f 33/43 34/40 55/53 56/54 +f 34/40 35/38 67/65 66/63 70/76 71/74 54/51 55/53 +g Cube.003_Cube.003_road-grass_blend +f 40/82 41/83 13/84 12/85 +f 39/86 42/87 41/83 40/82 +f 38/88 43/89 42/87 39/86 +f 44/90 43/89 38/88 37/91 +f 10/92 44/90 37/91 9/93 +f 48/94 52/95 30/96 32/97 +f 47/98 51/99 52/95 48/94 +f 46/100 50/101 51/99 47/98 +f 49/102 50/101 46/100 45/103 +f 15/104 49/102 45/103 17/105 +f 60/106 26/107 24/108 64/109 +f 59/110 60/106 64/109 63/111 +f 58/112 59/110 63/111 62/113 +f 61/114 57/115 58/112 62/113 +f 18/116 20/8 57/115 61/114 +f 76/117 77/118 28/119 27/120 +f 75/121 78/7 77/118 76/117 +f 74/122 79/123 78/7 75/121 +f 80/124 79/123 74/122 73/125 +f 22/126 80/124 73/125 21/127 diff --git a/mods/cottages/models/feldweg-curve.obj b/mods/cottages/models/feldweg-curve.obj new file mode 100644 index 00000000..4b776e79 --- /dev/null +++ b/mods/cottages/models/feldweg-curve.obj @@ -0,0 +1,207 @@ +# Blender v2.72 (sub 0) OBJ File: 'feldweg-curve.blend' +# www.blender.org +o Cube.002 +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.250000 0.413592 0.500000 +v 0.375000 0.500000 0.500000 +v 0.125000 0.375000 0.500000 +v 0.500000 0.413592 0.250000 +v 0.500000 0.500000 0.375000 +v 0.500000 0.375000 0.125000 +v -0.250000 0.413592 0.500000 +v -0.125000 0.375000 0.500000 +v -0.375000 0.500000 0.500000 +v 0.500000 0.413592 -0.250000 +v 0.500000 0.375000 -0.125000 +v 0.500000 0.500000 -0.375000 +v 0.147929 0.375000 0.384092 +v 0.205019 0.375000 0.284809 +v 0.284810 0.375000 0.205019 +v 0.384092 0.375000 0.147929 +v 0.264688 0.413592 0.428728 +v 0.304057 0.413592 0.361075 +v 0.361075 0.413592 0.304057 +v 0.428728 0.413592 0.264688 +v 0.473364 0.500000 0.381447 +v 0.437341 0.500000 0.403095 +v 0.403095 0.500000 0.437341 +v 0.381447 0.500000 0.473364 +v -0.347302 0.500000 0.313164 +v -0.272666 0.500000 0.136438 +v -0.162122 0.500000 -0.023675 +v -0.023675 0.500000 -0.162122 +v 0.136438 0.500000 -0.272666 +v 0.313164 0.500000 -0.347302 +v -0.227010 0.413592 0.347148 +v -0.163160 0.413592 0.196715 +v -0.066130 0.413592 0.056392 +v 0.056392 0.413592 -0.066130 +v 0.196715 0.413592 -0.163160 +v 0.347148 0.413592 -0.227010 +v 0.381132 0.375000 -0.106719 +v 0.256993 0.375000 -0.053654 +v 0.136458 0.375000 0.029861 +v 0.029861 0.375000 0.136458 +v -0.053654 0.375000 0.256993 +v -0.106719 0.375000 0.381132 +v -0.000000 -0.005322 0.500000 +v 0.500000 -0.005322 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.026636 0.118553 +vt 0.000000 0.125000 +vt 0.125000 0.000000 +vt 0.118553 0.026636 +vt 0.096905 0.062659 +vt 0.062659 0.096905 +vt 0.875000 0.000000 +vt 0.847302 0.186836 +vt 0.000000 0.875000 +vt 0.186836 0.847302 +vt 0.363562 0.772666 +vt 0.772666 0.363562 +vt 0.523674 0.662122 +vt 0.662122 0.523675 +vt 0.500000 0.494678 +vt 0.875000 1.000000 +vt 0.750000 0.913592 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.250000 0.913592 +vt 0.125000 1.000000 +vt 0.352071 0.115908 +vt 0.235312 0.071272 +vt 0.250000 0.000000 +vt 0.375000 0.000000 +vt 0.294981 0.215190 +vt 0.195943 0.138925 +vt 0.215191 0.294981 +vt 0.138925 0.195943 +vt 0.071272 0.235312 +vt 0.115908 0.352071 +vt 0.000000 0.250000 +vt 0.000000 0.375000 +vt 0.727010 0.152852 +vt 0.606719 0.118868 +vt 0.625000 0.000000 +vt 0.750000 0.000000 +vt 0.663160 0.303285 +vt 0.553654 0.243007 +vt 0.566130 0.443608 +vt 0.470139 0.363542 +vt 0.443608 0.566130 +vt 0.363542 0.470138 +vt 0.303285 0.663160 +vt 0.243007 0.553654 +vt 0.118868 0.606719 +vt 0.152852 0.727010 +vt 0.000000 0.625000 +vt 0.000000 0.750000 +vt 0.625000 0.625000 +vt 0.625000 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.625000 +vt 0.562500 0.625000 +vt 0.562500 0.500000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.437500 0.500000 +vt 0.437500 0.625000 +vt 0.375000 0.500000 +vt 0.375000 0.625000 +vt 0.812500 0.875000 +vt 0.812500 0.750000 +vt 0.937500 0.750000 +vt 0.937500 0.875000 +vt 0.687500 0.875000 +vt 0.687500 0.750000 +vt 0.562500 0.875000 +vt 0.562500 0.750000 +vt 0.437500 0.875000 +vt 0.437500 0.750000 +vt 0.312500 0.875000 +vt 0.312500 0.750000 +vt 0.187500 0.750000 +vt 0.187500 0.875000 +vt 0.062500 0.750000 +vt 0.062500 0.875000 +g Cube.002_Cube.002_road_ends +s off +f 6/1 2/2 1/3 5/4 +f 7/1 3/2 2/3 6/4 +g Cube.002_Cube.002_road_ends_default_grass.png +f 32/5 10/6 4/4 13/7 29/8 30/9 31/10 +f 20/11 1/1 38/12 +f 17/13 33/14 3/3 +f 3/3 33/14 2/2 +f 1/1 2/2 38/12 +f 33/14 34/15 2/2 +f 38/12 2/2 37/16 +f 35/17 2/2 34/15 +f 36/18 2/2 35/17 +f 37/16 2/2 36/18 +g Cube.002_Cube.002_road_ends_cottages_feldweg_end.png +f 5/1 1/2 52/19 +f 7/4 8/1 51/19 +f 8/1 4/2 51/19 +f 4/2 10/20 51/19 +f 10/20 9/21 51/19 +f 9/21 11/22 51/19 +f 11/22 16/23 51/19 +f 16/23 15/24 51/19 +f 15/24 17/25 51/19 +f 17/25 3/3 51/19 +f 3/3 7/4 51/19 +f 1/2 20/20 52/19 +f 20/20 18/21 52/19 +f 18/21 19/22 52/19 +f 19/22 14/23 52/19 +f 14/23 12/24 52/19 +f 12/24 13/25 52/19 +f 13/25 4/3 52/19 +f 4/3 8/4 52/19 +f 8/4 5/1 52/19 +g Cube.002_Cube.002_road_ends_cottages_feldweg.png +f 24/26 28/27 12/28 14/29 +f 23/30 27/31 28/27 24/26 +f 22/32 26/33 27/31 23/30 +f 25/34 26/33 22/32 21/35 +f 9/36 25/34 21/35 11/37 +f 44/38 45/39 19/40 18/41 +f 43/42 46/43 45/39 44/38 +f 42/44 47/45 46/43 43/42 +f 41/46 48/47 47/45 42/44 +f 40/48 49/49 48/47 41/46 +f 50/50 49/49 40/48 39/51 +f 16/52 50/50 39/51 15/53 +f 24/26 14/29 19/40 45/39 +f 21/35 50/50 16/52 11/37 +f 50/50 21/35 49/49 +f 45/39 46/43 24/26 +f 23/30 24/26 46/43 47/45 +f 22/32 23/30 47/45 48/47 +f 21/35 22/32 48/47 49/49 +g Cube.002_Cube.002_bottom +f 7/4 6/1 5/2 8/3 +g Cube.002_Cube.002_road-gass_blend +f 28/54 29/55 13/56 12/57 +f 27/58 30/59 29/55 28/54 +f 26/60 31/61 30/59 27/58 +f 32/62 31/61 26/60 25/63 +f 10/64 32/62 25/63 9/65 +f 38/66 44/67 18/68 20/69 +f 37/70 43/71 44/67 38/66 +f 36/72 42/73 43/71 37/70 +f 35/74 41/75 42/73 36/72 +f 34/76 40/77 41/75 35/74 +f 39/78 40/77 34/76 33/79 +f 15/80 39/78 33/79 17/81 diff --git a/mods/cottages/models/feldweg.obj b/mods/cottages/models/feldweg.obj new file mode 100644 index 00000000..417071eb --- /dev/null +++ b/mods/cottages/models/feldweg.obj @@ -0,0 +1,87 @@ +# Blender v2.72 (sub 0) OBJ File: 'feldweg.blend' +# www.blender.org +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.250000 0.413592 0.500000 +v 0.250000 0.413592 -0.500000 +v 0.250000 0.413592 0.500000 +v -0.250000 0.413592 -0.500000 +v -0.375000 0.500000 0.500000 +v 0.375000 0.500000 -0.500000 +v 0.125000 0.375000 0.500000 +v -0.125000 0.375000 -0.500000 +v -0.125000 0.375000 0.500000 +v 0.125000 0.375000 -0.500000 +v 0.375000 0.500000 0.500000 +v -0.375000 0.500000 -0.500000 +v 0.000000 -0.005322 0.500000 +v -0.000000 -0.005322 -0.500000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 0.494678 +vt 0.750000 0.913592 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.250000 0.913592 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.875000 +vt 0.000000 0.875000 +vt 1.000000 0.125000 +vt 0.000000 0.125000 +vt 1.000000 0.625000 +vt 1.000000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.625000 +vt 1.000000 0.250000 +vt 1.000000 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +g Cube_Cube_road_ends +s off +f 4/1 20/2 22/3 +f 2/1 19/2 21/3 +f 19/2 11/4 21/3 +f 11/4 15/5 21/3 +f 15/5 17/6 21/3 +f 17/6 9/7 21/3 +f 9/7 13/8 21/3 +f 13/8 1/9 21/3 +f 1/9 5/10 21/3 +f 5/10 6/11 21/3 +f 6/11 2/1 21/3 +f 20/2 12/4 22/3 +f 12/4 16/5 22/3 +f 16/5 18/6 22/3 +f 18/6 10/7 22/3 +f 10/7 14/8 22/3 +f 14/8 3/9 22/3 +f 3/9 7/10 22/3 +f 7/10 8/11 22/3 +f 8/11 4/1 22/3 +g Cube_Cube_road_sides +f 1/1 4/9 8/10 5/11 +f 3/1 2/9 6/10 7/11 +g Cube_Cube_bottom +f 8/9 7/10 6/11 5/1 +g Cube_Cube_top_grass +f 19/12 2/1 3/9 14/13 +f 1/11 13/14 20/15 4/10 +g Cube_Cube_road +f 15/16 11/17 10/18 18/19 +f 9/20 17/21 16/22 12/23 +f 15/16 18/19 16/22 17/21 +g Cube_Cube_road-grass_blend +f 13/24 9/16 12/19 20/25 +f 11/17 19/12 14/13 10/18 diff --git a/mods/cottages/models/feldweg_end.obj b/mods/cottages/models/feldweg_end.obj new file mode 100644 index 00000000..46315f5a --- /dev/null +++ b/mods/cottages/models/feldweg_end.obj @@ -0,0 +1,206 @@ +# Blender v2.72 (sub 0) OBJ File: 'feldweg_end.blend' +# www.blender.org +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.250000 0.500000 0.500000 +v 0.250000 0.413592 -0.500000 +v 0.250000 0.500000 0.500000 +v -0.250000 0.413592 -0.500000 +v -0.375000 0.500000 0.500000 +v 0.375000 0.500000 -0.500000 +v 0.125000 0.500000 0.500000 +v -0.125000 0.375000 -0.500000 +v -0.125000 0.500000 0.500000 +v 0.125000 0.375000 -0.500000 +v 0.375000 0.500000 0.500000 +v -0.375000 0.500000 -0.500000 +v -0.000000 -0.005322 -0.500000 +v 0.250000 0.413592 -0.000000 +v -0.250000 0.413592 0.000000 +v 0.375000 0.500000 -0.000000 +v -0.125000 0.375000 0.000000 +v 0.125000 0.375000 -0.016321 +v -0.375000 0.500000 0.000000 +v 0.210101 0.443819 0.205395 +v -0.210101 0.443819 0.205395 +v 0.359784 0.500000 0.250000 +v -0.130863 0.426864 0.289840 +v 0.075837 0.429295 0.285669 +v -0.363898 0.500000 0.250000 +v 0.250000 0.499467 0.375000 +v -0.250000 0.499467 0.375000 +v 0.338593 0.500000 0.299881 +v -0.060925 0.480171 0.395010 +v 0.125000 0.480171 0.399350 +v -0.338593 0.500000 0.299881 +v 0.250000 0.413592 0.125000 +v -0.250000 0.413592 0.125000 +v 0.375000 0.500000 0.125000 +v -0.078088 0.375000 0.108679 +v 0.125000 0.375000 0.145321 +v -0.375000 0.500000 0.125000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 0.494678 +vt 0.750000 0.913592 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.250000 0.913592 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.750000 1.000000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.250000 1.000000 +vt 0.500000 0.875000 +vt 0.625000 0.125000 +vt 0.750000 0.136102 +vt 1.000000 0.625000 +vt 1.000000 0.750000 +vt 0.875000 0.750000 +vt 1.000000 0.125000 +vt 1.000000 0.250000 +vt 0.875000 0.250000 +vt 1.000000 0.875000 +vt 0.799881 0.838593 +vt 1.000000 0.375000 +vt 0.895010 0.439075 +vt 0.899350 0.625000 +vt 0.799881 0.161407 +vt 0.000000 0.125000 +vt 0.500000 0.125000 +vt 0.750000 0.859784 +vt 0.000000 0.875000 +vt 0.541968 0.500000 +vt 0.541968 0.625000 +vt 0.125000 0.625000 +vt 0.125000 0.500000 +vt 0.541968 0.750000 +vt 0.541968 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.750000 +vt 0.646210 0.500000 +vt 0.646210 0.625000 +vt 0.646210 0.750000 +vt 0.646210 0.875000 +vt 0.635605 0.135605 +vt 0.760605 0.155911 +vt 0.720706 0.297351 +vt 0.172012 0.218555 +vt 0.260605 0.155911 +vt 0.300504 0.297350 +vt 0.751051 0.512257 +vt 0.876118 0.512257 +vt 0.876118 0.600535 +vt 0.449680 0.139224 +vt 0.379742 0.226929 +vt 0.586442 0.230407 +vt 0.146707 0.260153 +vt 0.260605 0.364395 +vt 0.870389 0.260153 +vt 0.885605 0.364395 +vt 0.135605 0.364395 +vt 0.760605 0.364395 +vt 0.459281 0.625000 +vt 0.474779 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.625000 +vt 0.474779 0.250000 +vt 0.474779 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 0.612771 0.625000 +vt 0.593474 0.750000 +vt 0.593474 0.250000 +vt 0.577976 0.421912 +vt 0.746039 0.575837 +vt 0.669814 0.710101 +vt 0.669814 0.289899 +vt 0.750000 0.369137 +g Cube_Cube_ends +s off +f 4/1 20/2 21/3 +f 20/2 12/4 21/3 +f 12/4 16/5 21/3 +f 16/5 18/6 21/3 +f 18/6 10/7 21/3 +f 10/7 14/8 21/3 +f 14/8 3/9 21/3 +f 3/9 7/10 21/3 +f 7/10 8/11 21/3 +f 8/11 4/1 21/3 +g Cube_Cube_sides +f 1/1 4/9 8/10 5/11 +f 3/1 2/9 6/10 7/11 +f 1/9 5/10 6/11 2/1 19/2 11/12 15/13 17/14 9/15 13/8 +g Cube_Cube_bottom +f 8/9 7/10 6/11 5/1 +g Cube_Cube_top_grass +f 24/16 42/5 2/1 +f 45/17 1/11 33/18 +f 15/19 11/20 34/21 +f 13/22 9/23 35/24 +f 11/20 19/25 36/26 +f 9/23 17/27 37/28 +f 15/19 38/29 37/28 +f 38/29 15/19 34/21 +f 39/30 13/22 35/24 +f 34/21 11/20 36/26 +f 35/24 9/23 37/28 +f 17/27 15/19 37/28 +f 19/25 2/1 36/26 +f 20/31 4/10 27/32 +f 45/17 27/32 1/11 +f 3/9 24/16 2/1 +f 2/1 30/33 36/26 +f 2/1 42/5 30/33 +f 3/9 14/34 24/16 +f 33/18 1/11 39/30 +f 27/32 4/10 1/11 +f 1/11 13/22 39/30 +g Cube_Cube_top_grass_blend +f 27/35 23/36 12/37 20/38 +f 22/39 24/40 14/41 10/42 +f 45/43 41/44 23/36 +f 40/45 42/46 24/40 +f 38/47 34/48 28/49 +f 39/50 35/51 29/52 +f 34/53 36/54 30/55 +f 35/51 37/56 31/57 +f 38/47 32/58 31/57 +f 33/59 29/52 41/60 +f 28/49 30/61 42/62 +f 27/35 45/43 23/36 +f 22/39 40/45 24/40 +f 32/58 38/47 28/49 +f 33/59 39/50 29/52 +f 28/49 34/48 30/61 +f 29/52 35/51 31/57 +f 37/56 38/47 31/57 +f 45/63 33/59 41/60 +f 40/64 28/49 42/62 +g Cube_Cube_road +f 26/65 22/66 10/67 18/68 +f 23/69 25/70 16/71 12/72 +f 26/65 18/68 16/71 25/70 +f 44/73 40/74 22/66 +f 41/75 43/76 25/70 +f 44/73 26/65 25/70 +f 32/77 28/78 40/74 +f 29/79 31/80 43/76 +f 32/77 44/73 43/76 +f 26/65 44/73 22/66 +f 23/69 41/75 25/70 +f 43/76 44/73 25/70 +f 44/73 32/77 40/74 +f 41/75 29/79 43/76 +f 31/80 32/77 43/76 diff --git a/mods/cottages/models/feldweg_slope.obj b/mods/cottages/models/feldweg_slope.obj new file mode 100644 index 00000000..dd083f66 --- /dev/null +++ b/mods/cottages/models/feldweg_slope.obj @@ -0,0 +1,84 @@ +# Blender v2.72 (sub 0) OBJ File: 'feldweg_slope.blend' +# www.blender.org +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.625000 -0.500000 +v -0.500000 -0.625000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.250000 -0.586408 -0.500000 +v -0.250000 0.413592 0.500000 +v -0.250000 -0.586408 -0.500000 +v 0.250000 0.413592 0.500000 +v 0.375000 -0.500000 -0.500000 +v -0.375000 0.500000 0.500000 +v -0.125000 -0.625000 -0.500000 +v 0.125000 0.375000 0.500000 +v 0.125000 -0.625000 -0.500000 +v -0.125000 0.375000 0.500000 +v -0.375000 -0.500000 -0.500000 +v 0.375000 0.500000 0.500000 +v -0.000000 -0.005322 0.500000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 0.494678 +vt 1.000000 0.875000 +vt 0.750000 0.913592 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.250000 0.913592 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.875000 +vt 0.000000 0.187500 +vt 1.000000 0.312500 +vt 0.000000 0.312500 +vt 1.000000 0.187500 +vt 1.000000 0.125000 +vt 0.000000 0.125000 +vt 1.000000 0.625000 +vt 1.000000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.625000 +vt 1.000000 0.250000 +vt 1.000000 0.375000 +vt 0.000000 0.375000 +vt 0.000000 0.250000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +g Cube_Cube_road_ends +s off +f 4/1 20/2 21/3 +f 6/4 2/1 19/2 11/5 15/6 +f 20/2 12/5 21/3 +f 12/5 16/6 21/3 +f 16/6 18/7 21/3 +f 18/7 10/8 21/3 +f 10/8 14/9 21/3 +f 14/9 3/10 21/3 +f 3/10 7/11 21/3 +f 7/11 8/12 21/3 +f 8/12 4/1 21/3 +f 1/10 5/13 17/7 9/8 13/9 +g Cube_Cube_road_ends_default_grass_side.png +f 6/14 7/15 2/16 +f 2/11 7/12 3/1 +f 4/10 8/11 1/12 +f 5/17 1/15 8/16 +g Cube_Cube_bottom +f 8/10 7/11 6/12 5/1 +g Cube_Cube_top_grass +f 19/4 2/1 3/10 14/13 +f 1/12 13/18 20/19 4/11 +g Cube_Cube_road +f 15/20 11/21 10/22 18/23 +f 9/24 17/25 16/26 12/27 +f 15/20 18/23 16/26 17/25 +g Cube_Cube_road-grass_blend +f 13/28 9/20 12/23 20/29 +f 11/21 19/4 14/13 10/22 diff --git a/mods/cottages/models/feldweg_slope_long.obj b/mods/cottages/models/feldweg_slope_long.obj new file mode 100644 index 00000000..976f9278 --- /dev/null +++ b/mods/cottages/models/feldweg_slope_long.obj @@ -0,0 +1,108 @@ +# Blender v2.72 (sub 0) OBJ File: 'feldweg_slope_long.blend' +# www.blender.org +o Cube +v 0.500000 -0.500000 -1.500000 +v -0.500000 -0.500000 -1.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.625000 -1.500000 +v -0.500000 -0.625000 -1.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.250000 -0.586408 -1.500000 +v -0.250000 0.413592 0.500000 +v -0.250000 -0.586408 -1.500000 +v 0.250000 0.413592 0.500000 +v 0.375000 -0.500000 -1.500000 +v -0.375000 0.500000 0.500000 +v -0.125000 -0.625000 -1.500000 +v 0.125000 0.375000 0.500000 +v 0.125000 -0.625000 -1.500000 +v -0.125000 0.375000 0.500000 +v -0.375000 -0.500000 -1.500000 +v 0.375000 0.500000 0.500000 +v -0.000000 -0.005322 0.500000 +v -0.250000 -0.086408 -0.500000 +v 0.500000 -0.562500 -0.500000 +v 0.375000 0.000000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.250000 -0.086408 -0.500000 +v -0.500000 -0.562500 -0.500000 +v 0.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +v -0.375000 0.000000 -0.500000 +v 0.125000 -0.125000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.125000 -0.125000 -0.500000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.500000 0.494678 +vt 1.000000 0.875000 +vt 0.750000 0.913592 +vt 0.625000 0.875000 +vt 0.375000 0.875000 +vt 0.250000 0.913592 +vt 0.125000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.875000 +vt 0.000000 0.250000 +vt 1.000000 0.312500 +vt 0.000000 0.312500 +vt 0.000000 0.500000 +vt 1.000000 0.187500 +vt 1.000000 0.500000 +vt 1.000000 0.250000 +vt 0.000000 0.187500 +vt 1.000000 0.125000 +vt 0.000000 0.125000 +vt 1.000000 0.625000 +vt 1.000000 0.750000 +vt 0.000000 0.750000 +vt 0.000000 0.625000 +vt 1.000000 0.375000 +vt 0.000000 0.375000 +g Cube_Cube_road_ends +s off +f 4/1 20/2 21/3 +f 6/4 2/1 19/2 11/5 15/6 +f 20/2 12/5 21/3 +f 12/5 16/6 21/3 +f 16/6 18/7 21/3 +f 18/7 10/8 21/3 +f 10/8 14/9 21/3 +f 14/9 3/10 21/3 +f 3/10 7/11 21/3 +f 7/11 8/12 21/3 +f 8/12 4/1 21/3 +f 1/10 5/13 17/7 9/8 13/9 +g Cube_Cube_road_ends_default_grass_side.png +f 27/14 7/15 32/16 +f 32/11 7/12 3/1 29/17 +f 28/17 25/11 1/12 +f 5/18 1/15 25/16 23/14 +f 2/11 32/12 29/19 +f 23/20 25/15 8/16 +f 6/21 27/20 32/15 2/16 +f 4/10 8/11 25/12 28/19 +g Cube_Cube_bottom +f 8/11 7/12 27/1 23/10 +f 23/11 27/12 6/1 5/10 +g Cube_Cube_top_grass +f 30/4 29/1 3/10 14/13 +f 28/12 24/22 20/23 4/11 +f 1/12 13/22 24/23 28/11 +f 19/4 2/1 29/10 30/13 +g Cube_Cube_road +f 15/24 11/25 22/26 33/27 +f 26/20 31/28 16/29 12/14 +f 33/24 18/27 16/29 31/28 +f 33/24 22/25 10/26 18/27 +f 9/20 17/28 31/29 26/14 +f 15/24 33/27 31/29 17/28 +g Cube_Cube_road-grass_blend +f 24/19 26/24 12/27 20/17 +f 11/25 19/4 30/13 22/26 +f 22/25 30/4 14/13 10/26 +f 13/19 9/24 26/27 24/17 diff --git a/mods/cottages/nodes_anvil.lua b/mods/cottages/nodes_anvil.lua new file mode 100644 index 00000000..9456ed18 --- /dev/null +++ b/mods/cottages/nodes_anvil.lua @@ -0,0 +1,303 @@ +--------------------------------------------------------------------------------------- +-- simple anvil that can be used to repair tools +--------------------------------------------------------------------------------------- +-- * can be used to repair tools +-- * the hammer gets dammaged a bit at each repair step +--------------------------------------------------------------------------------------- +-- License of the hammer picture: CC-by-SA; done by GloopMaster; source: +-- https://github.com/GloopMaster/glooptest/blob/master/glooptest/textures/glooptest_tool_steelhammer.png + +local S = cottages.S + +-- the hammer for the anvil +minetest.register_tool("cottages:hammer", { + description = S("Steel hammer for repairing tools on the anvil"), + image = "glooptest_tool_steelhammer.png", + inventory_image = "glooptest_tool_steelhammer.png", + + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + -- about equal to a stone pick (it's not intended as a tool) + cracky={times={[2]=2.00, [3]=1.20}, uses=30, maxlevel=1}, + }, + damage_groups = {fleshy=6}, + } +}) + + +local cottages_anvil_formspec = + "size[8,8]".. + "image[7,3;1,1;glooptest_tool_steelhammer.png]".. +-- "list[current_name;sample;0,0.5;1,1;]".. + "list[current_name;input;2.5,1.5;1,1;]".. +-- "list[current_name;material;5,0;3,3;]".. + "list[current_name;hammer;5,3;1,1;]".. +-- "label[0.0,0.0;Sample:]".. +-- "label[0.0,1.0;(Receipe)]".. + "label[2.5,1.0;"..S("Workpiece:").."]".. +-- "label[6.0,-0.5;Materials:]".. + "label[6.0,2.7;"..S("Optional").."]".. + "label[6.0,3.0;"..S("storage for").."]".. + "label[6.0,3.3;"..S("your hammer").."]".. + + "label[0,-0.5;"..S("Anvil").."]".. + "label[0,3.0;"..S("Punch anvil with hammer to").."]".. + "label[0,3.3;"..S("repair tool in workpiece-slot.").."]".. + "list[current_player;main;0,4;8,4;]"; + + +minetest.register_node("cottages:anvil", { + drawtype = "nodebox", + description = S("anvil"), + tiles = {"cottages_stone.png"}, -- TODO default_steel_block.png, default_obsidian.png are also nice + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2}, + -- the nodebox model comes from realtest + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.3,0.5,-0.4,0.3}, + {-0.35,-0.4,-0.25,0.35,-0.3,0.25}, + {-0.3,-0.3,-0.15,0.3,-0.1,0.15}, + {-0.35,-0.1,-0.2,0.35,0.1,0.2}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.3,0.5,-0.4,0.3}, + {-0.35,-0.4,-0.25,0.35,-0.3,0.25}, + {-0.3,-0.3,-0.15,0.3,-0.1,0.15}, + {-0.35,-0.1,-0.2,0.35,0.1,0.2}, + } + }, + on_construct = function(pos) + + local meta = minetest.get_meta(pos); + meta:set_string("infotext", S("Anvil")); + local inv = meta:get_inventory(); + inv:set_size("input", 1); +-- inv:set_size("material", 9); +-- inv:set_size("sample", 1); + inv:set_size("hammer", 1); + meta:set_string("formspec", cottages_anvil_formspec ); + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos); + meta:set_string("owner", placer:get_player_name() or ""); + meta:set_string("infotext", S("Anvil (owned by %s)"):format((meta:get_string("owner") or ""))); + meta:set_string("formspec", + cottages_anvil_formspec, + "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]"); + end, + + can_dig = function(pos,player) + + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory(); + local owner = meta:get_string('owner'); + + if( not( inv:is_empty("input")) +-- or not( inv:is_empty("material")) +-- or not( inv:is_empty("sample")) + or not( inv:is_empty("hammer")) + or not( player ) + or ( owner and owner ~= '' and player:get_player_name() ~= owner )) then + + return false; + end + return true; + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if( player and player:get_player_name() ~= meta:get_string('owner' ) and from_list~="input") then + return 0 + end + return count; + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if( player and player:get_player_name() ~= meta:get_string('owner' ) and listname~="input") then + return 0; + end + if( listname=='hammer' and stack and stack:get_name() ~= 'cottages:hammer') then + return 0; + end + if( listname=='input' + and( stack:get_wear() == 0 + or stack:get_name() == "technic:water_can" + or stack:get_name() == "technic:lava_can" )) then + + minetest.chat_send_player( player:get_player_name(), + S('The workpiece slot is for damaged tools only.')); + return 0; + end + return stack:get_count() + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if( player and player:get_player_name() ~= meta:get_string('owner' ) and listname~="input") then + return 0 + end + return stack:get_count() + end, + + + on_punch = function(pos, node, puncher) + if( not( pos ) or not( node ) or not( puncher )) then + return; + end + -- only punching with the hammer is supposed to work + local wielded = puncher:get_wielded_item(); + if( not( wielded ) or not( wielded:get_name() ) or wielded:get_name() ~= 'cottages:hammer') then + return; + end + local name = puncher:get_player_name(); + + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory(); + + local input = inv:get_stack('input',1); + + -- only tools can be repaired + if( not( input ) + or input:is_empty() + or input:get_name() == "technic:water_can" + or input:get_name() == "technic:lava_can" ) then + + meta:set_string("formspec", + cottages_anvil_formspec, + "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]"); + return; + end + + -- 65535 is max damage + local damage_state = 40-math.floor(input:get_wear()/1638); + + local tool_name = input:get_name(); + local hud_image = ""; + if( tool_name + and minetest.registered_items[ tool_name ] ) then + if( minetest.registered_items[ tool_name ].inventory_image ) then + hud_image = minetest.registered_items[ tool_name ].inventory_image; + elseif( minetest.registered_items[ tool_name ].textures + and type(minetest.registered_items[ tool_name ].textures)=='table') then + hud_image = minetest.registered_items[ tool_name ].textures[1]; + elseif( minetest.registered_items[ tool_name ].textures + and type(minetest.registered_items[ tool_name ].textures)=='string') then + hud_image = minetest.registered_items[ tool_name ].textures; + end + end + + local hud1 = puncher:hud_add({ + hud_elem_type = "image", + scale = {x = 15, y = 15}, + text = hud_image, + position = {x = 0.5, y = 0.5}, + alignment = {x = 0, y = 0} + }); + local hud2 = nil; + local hud3 = nil; + if( input:get_wear()>0 ) then + hud2 = puncher:hud_add({ + hud_elem_type = "statbar", + text = "default_cloud.png^[colorize:#ff0000:256", + number = 40, + direction = 0, -- left to right + position = {x=0.5, y=0.65}, + alignment = {x = 0, y = 0}, + offset = {x = -320, y = 0}, + size = {x=32, y=32}, + }) + hud3 = puncher:hud_add({ + hud_elem_type = "statbar", + text = "default_cloud.png^[colorize:#00ff00:256", + number = damage_state, + direction = 0, -- left to right + position = {x=0.5, y=0.65}, + alignment = {x = 0, y = 0}, + offset = {x = -320, y = 0}, + size = {x=32, y=32}, + }); + end + minetest.after(2, function() + if( puncher ) then + puncher:hud_remove(hud1); + puncher:hud_remove(hud2); + puncher:hud_remove(hud3); + end + end) + + -- tell the player when the job is done + if( input:get_wear() == 0 ) then +-- minetest.chat_send_player( puncher:get_player_name(), +-- S('Your tool has been repaired successfully.')); + return; + end + + -- do the actual repair + input:add_wear( -5000 ); -- equals to what technic toolshop does in 5 seconds + inv:set_stack("input", 1, input) + + -- damage the hammer slightly + wielded:add_wear( 100 ); + puncher:set_wielded_item( wielded ); + + -- do not spam too much +-- if( math.random( 1,5 )==1 ) then +-- minetest.chat_send_player( puncher:get_player_name(), +-- S('Your workpiece improves.')); +-- end + end, + is_ground_content = false, +}) + + + +--------------------------------------------------------------------------------------- +-- crafting receipes +--------------------------------------------------------------------------------------- +minetest.register_craft({ + output = "cottages:anvil", + recipe = { + {cottages.craftitem_steel,cottages.craftitem_steel,cottages.craftitem_steel}, + {'', cottages.craftitem_steel,'' }, + {cottages.craftitem_steel,cottages.craftitem_steel,cottages.craftitem_steel} }, +}) + + +-- the castle-mod has an anvil as well - with the same receipe. convert the two into each other +if ( minetest.get_modpath("castle") ~= nil ) then + + minetest.register_craft({ + output = "cottages:anvil", + recipe = { + {'castle:anvil'}, + }, + }) + + minetest.register_craft({ + output = "castle:anvil", + recipe = { + {'cottages:anvil'}, + }, + }) +end + + + +minetest.register_craft({ + output = "cottages:hammer", + recipe = { + {cottages.craftitem_steel}, + {'cottages:anvil'}, + {cottages.craftitem_stick} } +}) + diff --git a/mods/cottages/nodes_barrel.lua b/mods/cottages/nodes_barrel.lua new file mode 100644 index 00000000..4c84983b --- /dev/null +++ b/mods/cottages/nodes_barrel.lua @@ -0,0 +1,214 @@ + +--------------------------------------------------------------------- +-- a barrel and a tub - plus a function that makes 'round' objects +--------------------------------------------------------------------- +-- IMPORTANT NOTE: The barrel requires a lot of nodeboxes. That may be +-- too much for weak hardware! +--------------------------------------------------------------------- +-- Functionality: right-click to open/close a barrel; +-- punch a barrel to change between vertical/horizontal +--------------------------------------------------------------------- +-- Changelog: +-- 24.03.13 Can no longer be opended/closed on rightclick because that is now used for a formspec; +-- instead, it can be filled with liquids. +-- Filled barrels will always be closed, while empty barrels will always be open. + +-- pipes: table with the following entries for each pipe-part: +-- f: radius factor; if 1, it will have a radius of half a nodebox and fill the entire nodebox +-- h1, h2: height at witch the nodebox shall start and end; usually -0.5 and 0.5 for a full nodebox +-- b: make a horizontal part/shelf +-- horizontal: if 1, then x and y coordinates will be swapped + +-- TODO: option so that it works without nodeboxes + +local S = cottages.S + +barrel = {}; + +-- prepare formspec +barrel.on_construct = function( pos ) + + local meta = minetest.get_meta(pos); + local percent = math.random( 1, 100 ); -- TODO: show real filling + + meta:set_string( 'formspec', + "size[8,9]".. + "image[2.6,2;2,3;default_sandstone.png^[lowpart:".. + (100-percent)..":default_desert_stone.png]".. -- TODO: better images + "label[2.2,0;"..S("Pour:").."]".. + "list[current_name;input;3,0.5;1,1;]".. + "label[5,3.3;"..S("Fill:").."]".. + "list[current_name;output;5,3.8;1,1;]".. + "list[current_player;main;0,5;8,4;]"); + + + meta:set_string( 'liquid_type', '' ); -- which liquid is in the barrel? + meta:set_int( 'liquid_level', 0 ); -- how much of the liquid is in there? + + local inv = meta:get_inventory() + inv:set_size("input", 1); -- to fill in new liquid + inv:set_size("output", 1); -- to extract liquid +end + + +-- can only be digged if there are no more vessels/buckets in any of the slots +-- TODO: allow digging of a filled barrel? this would disallow stacking of them +barrel.can_dig = function( pos, player ) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + + return ( inv:is_empty('input') + and inv:is_empty('output')); +end + + +-- the barrel received input; either a new liquid that is to be poured in or a vessel that is to be filled +barrel.on_metadata_inventory_put = function( pos, listname, index, stack, player ) +end + + +-- right-click to open/close barrel; punch to switch between horizontal/vertical position + minetest.register_node("cottages:barrel", { + description = S("barrel (closed)"), + paramtype = "light", + drawtype = "mesh", + mesh = "cottages_barrel_closed.obj", + tiles = {"cottages_barrel.png" }, + groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2 + }, + drop = "cottages:barrel", +-- on_rightclick = function(pos, node, puncher) +-- minetest.add_node(pos, {name = "cottages:barrel_open", param2 = node.param2}) +-- end, +-- TODO: on_rightclick is no longer available - maybe open if empty and closed if full? + on_punch = function(pos, node, puncher) + minetest.add_node(pos, {name = "cottages:barrel_lying", param2 = node.param2}) + end, + + on_construct = function( pos ) + return barrel.on_construct( pos ); + end, + can_dig = function(pos,player) + return barrel.can_dig( pos, player ); + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + return barrel.on_metadata_inventory_put( pos, listname, index, stack, player ); + end, + is_ground_content = false, + + }) + + -- this barrel is opened at the top + minetest.register_node("cottages:barrel_open", { + description = S("barrel (open)"), + paramtype = "light", + drawtype = "mesh", + mesh = "cottages_barrel.obj", + tiles = {"cottages_barrel.png" }, + groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, not_in_creative_inventory=1, + }, + drop = "cottages:barrel", +-- on_rightclick = function(pos, node, puncher) +-- minetest.add_node(pos, {name = "cottages:barrel", param2 = node.param2}) +-- end, + on_punch = function(pos, node, puncher) + minetest.add_node(pos, {name = "cottages:barrel_lying_open", param2 = node.param2}) + end, + is_ground_content = false, + }) + + -- horizontal barrel + minetest.register_node("cottages:barrel_lying", { + description = S("barrel (closed), lying somewhere"), + paramtype = "light", + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "cottages_barrel_closed_lying.obj", + tiles = {"cottages_barrel.png" }, + groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, not_in_creative_inventory=1, + }, + drop = "cottages:barrel", + on_rightclick = function(pos, node, puncher) + minetest.add_node(pos, {name = "cottages:barrel_lying_open", param2 = node.param2}) + end, + on_punch = function(pos, node, puncher) + if( node.param2 < 4 ) then + minetest.add_node(pos, {name = "cottages:barrel_lying", param2 = (node.param2+1)}) + else + minetest.add_node(pos, {name = "cottages:barrel", param2 = 0}) + end + end, + is_ground_content = false, + }) + + -- horizontal barrel, open + minetest.register_node("cottages:barrel_lying_open", { + description = S("barrel (opened), lying somewhere"), + paramtype = "light", + paramtype2 = "facedir", + drawtype = "mesh", + mesh = "cottages_barrel_lying.obj", + tiles = {"cottages_barrel.png" }, + groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2, not_in_creative_inventory=1, + }, + drop = "cottages:barrel", + on_rightclick = function(pos, node, puncher) + minetest.add_node(pos, {name = "cottages:barrel_lying", param2 = node.param2}) + end, + on_punch = function(pos, node, puncher) + if( node.param2 < 4 ) then + minetest.add_node(pos, {name = "cottages:barrel_lying_open", param2 = (node.param2+1)}) + else + minetest.add_node(pos, {name = "cottages:barrel_open", param2 = 0}) + end + end, + is_ground_content = false, + + }) + + -- let's hope "tub" is the correct english word for "bottich" + minetest.register_node("cottages:tub", { + description = S("tub"), + paramtype = "light", + drawtype = "mesh", + mesh = "cottages_tub.obj", + tiles = {"cottages_barrel.png" }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5,-0.1, 0.5}, + }}, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5,-0.1, 0.5}, + }}, + groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2 + }, + is_ground_content = false, + }) + + +minetest.register_craft({ + output = "cottages:barrel", + recipe = { + {cottages.craftitem_wood, "", cottages.craftitem_wood }, + {cottages.craftitem_steel, "", cottages.craftitem_steel}, + {cottages.craftitem_wood, cottages.craftitem_wood, cottages.craftitem_wood }, + }, +}) + +minetest.register_craft({ + output = "cottages:tub 2", + recipe = { + {"cottages:barrel"}, + }, +}) + +minetest.register_craft({ + output = "cottages:barrel", + recipe = { + {"cottages:tub"}, + {"cottages:tub"}, + }, +}) diff --git a/mods/cottages/nodes_chests.lua b/mods/cottages/nodes_chests.lua new file mode 100644 index 00000000..c0997490 --- /dev/null +++ b/mods/cottages/nodes_chests.lua @@ -0,0 +1,61 @@ + +-- TODO: make these chests as chests and indicate that they are owned by npc +-- TODO: add bags (not for carrying around but for decoration) + +-- Boilerplate to support localized strings if intllib mod is installed. +local S = cottages.S + +cottages_chests = {} +-- uses default.chest_formspec for now +cottages_chests.on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec",default.chest_formspec) +-- meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end + +cottages_chests.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end + +-- the chests do not need receipes since they are only placeholders and not intended to be built by players +-- (they are later on supposed to be filled with diffrent items by fill_chest.lua) +minetest.register_node("cottages:chest_private", { + description = S("private NPC chest"), + infotext = "chest containing the possesions of one of the inhabitants", + tiles = cottages.texture_chest, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + on_construct = cottages_chests.on_construct, + can_dig = cottages_chests.can_dig, + is_ground_content = false, +}) + +minetest.register_node("cottages:chest_work", { + description = S("chest for work utils and kitchens"), + infotext = "everything the inhabitant needs for his work", + tiles = cottages.texture_chest, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + on_construct = cottages_chests.on_construct, + can_dig = cottages_chests.can_dig, + is_ground_content = false, +}) + +minetest.register_node("cottages:chest_storage", { + description = S("storage chest"), + infotext = "stored food reserves", + tiles = cottages.texture_chest, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + on_construct = cottages_chests.on_construct, + can_dig = cottages_chests.can_dig, + is_ground_content = false, +}) + diff --git a/mods/cottages/nodes_doorlike.lua b/mods/cottages/nodes_doorlike.lua new file mode 100644 index 00000000..d989c055 --- /dev/null +++ b/mods/cottages/nodes_doorlike.lua @@ -0,0 +1,437 @@ + +----------------------------------------------------------------------------------------------------------- +-- These nodes are all like doors in a way: +-- * window shutters (they open on right-click and when it turns day; they close at night) +-- * a half-door where the top part can be opened seperately from the bottom part +-- * a gate that drops to the floor when opened +-- +----------------------------------------------------------------------------------------------------------- +-- IMPORTANT NOTICE: If you have a very slow computer, it might be wise to increase the rate at which the +-- abm that opens/closes the window shutters is called. Anything less than 10 minutes +-- (600 seconds) ought to be ok. +----------------------------------------------------------------------------------------------------------- +local S = cottages.S + +----------------------------------------------------------------------------------------------------------- +-- small window shutters for single-node-windows; they open at day and close at night if the abm is working +----------------------------------------------------------------------------------------------------------- + +-- propagate shutting/closing of window shutters to window shutters below/above this one +cottages_window_sutter_operate = function( pos, old_node_state_name, new_node_state_name ) + + local offsets = {-1,1,-2,2,-3,3}; + local stop_up = 0; + local stop_down = 0; + + for i,v in ipairs(offsets) do + + local node = minetest.get_node_or_nil( {x=pos.x, y=(pos.y+v), z=pos.z } ); + if( node and node.name and node.name==old_node_state_name + and ( (v > 0 and stop_up == 0 ) + or (v < 0 and stop_down == 0 ))) then + + minetest.swap_node({x=pos.x, y=(pos.y+v), z=pos.z }, {name = new_node_state_name, param2 = node.param2}) + + -- found a diffrent node - no need to search further up + elseif( v > 0 and stop_up == 0 ) then + stop_up = 1; + + elseif( v < 0 and stop_down == 0 ) then + stop_down = 1; + end + end +end + +-- window shutters - they cover half a node to each side +minetest.register_node("cottages:window_shutter_open", { + description = S("opened window shutters"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + -- larger than one node but slightly smaller than a half node so that wallmounted torches pose no problem + node_box = { + type = "fixed", + fixed = { + {-0.90, -0.5, 0.4, -0.45, 0.5, 0.5}, + { 0.45, -0.5, 0.4, 0.9, 0.5, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.9, -0.5, 0.4, 0.9, 0.5, 0.5}, + }, + }, + on_rightclick = function(pos, node, puncher) + minetest.swap_node(pos, {name = "cottages:window_shutter_closed", param2 = node.param2}) + cottages_window_sutter_operate( pos, "cottages:window_shutter_open", "cottages:window_shutter_closed" ); + end, + is_ground_content = false, +}) + +minetest.register_node("cottages:window_shutter_closed", { + description = S("closed window shutters"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.4, -0.05, 0.5, 0.5}, + { 0.05, -0.5, 0.4, 0.5, 0.5, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5}, + }, + }, + on_rightclick = function(pos, node, puncher) + minetest.swap_node(pos, {name = "cottages:window_shutter_open", param2 = node.param2}) + cottages_window_sutter_operate( pos, "cottages:window_shutter_closed", "cottages:window_shutter_open" ); + end, + is_ground_content = false, + drop = "cottages:window_shutter_open", +}) + + +-- open shutters in the morning +minetest.register_abm({ + nodenames = {"cottages:window_shutter_closed"}, + interval = 20, -- change this to 600 if your machine is too slow + chance = 3, -- not all people wake up at the same time! + action = function(pos) + + -- at this time, sleeping in a bed is not possible + if( not(minetest.get_timeofday() < 0.2 or minetest.get_timeofday() > 0.805)) then + local old_node = minetest.get_node( pos ); + minetest.swap_node(pos, {name = "cottages:window_shutter_open", param2 = old_node.param2}) + cottages_window_sutter_operate( pos, "cottages:window_shutter_closed", "cottages:window_shutter_open" ); + end + end +}) + + +-- close them at night +minetest.register_abm({ + nodenames = {"cottages:window_shutter_open"}, + interval = 20, -- change this to 600 if your machine is too slow + chance = 2, + action = function(pos) + + -- same time at which sleeping is allowed in beds + if( minetest.get_timeofday() < 0.2 or minetest.get_timeofday() > 0.805) then + local old_node = minetest.get_node( pos ); + minetest.swap_node(pos, {name = "cottages:window_shutter_closed", param2 = old_node.param2}) + cottages_window_sutter_operate( pos, "cottages:window_shutter_open", "cottages:window_shutter_closed" ); + end + end +}) + + +------------------------------------------------------------------------------------------------------------------------------ +-- a half door; can be combined to a full door where the upper part can be operated seperately; usually found in barns/stables +------------------------------------------------------------------------------------------------------------------------------ +minetest.register_node("cottages:half_door", { + description = S("half door"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.4, 0.48, 0.5, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.4, 0.48, 0.5, 0.5}, + }, + }, + on_rightclick = function(pos, node, puncher) + local node2 = minetest.get_node( {x=pos.x,y=(pos.y+1),z=pos.z}); + + local param2 = node.param2; + if( param2%4 == 1) then param2 = param2+1; --2; + elseif( param2%4 == 2) then param2 = param2-1; --1; + elseif( param2%4 == 3) then param2 = param2-3; --0; + elseif( param2%4 == 0) then param2 = param2+3; --3; + end; + minetest.swap_node(pos, {name = "cottages:half_door", param2 = param2}) + -- if the node above consists of a door of the same type, open it as well + -- Note: doors beneath this one are not opened! It is a special feature of these doors that they can be opend partly + if( node2 ~= nil and node2.name == node.name and node2.param2==node.param2) then + minetest.swap_node( {x=pos.x,y=(pos.y+1),z=pos.z}, {name = "cottages:half_door", param2 = param2}) + end + end, + is_ground_content = false, +}) + + + +minetest.register_node("cottages:half_door_inverted", { + description = S("half door inverted"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.48, 0.5, -0.4}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.48, 0.5, -0.4}, + }, + }, + on_rightclick = function(pos, node, puncher) + local node2 = minetest.get_node( {x=pos.x,y=(pos.y+1),z=pos.z}); + + local param2 = node.param2; + if( param2%4 == 1) then param2 = param2-1; --0; + elseif( param2%4 == 0) then param2 = param2+1; --1; + elseif( param2%4 == 2) then param2 = param2+1; --3; + elseif( param2%4 == 3) then param2 = param2-1; --2; + end; + minetest.swap_node(pos, {name = "cottages:half_door_inverted", param2 = param2}) + -- open upper parts of this door (if there are any) + if( node2 ~= nil and node2.name == node.name and node2.param2==node.param2) then + minetest.swap_node( {x=pos.x,y=(pos.y+1),z=pos.z}, {name = "cottages:half_door_inverted", param2 = param2}) + end + end, + is_ground_content = false, +}) + + + + +------------------------------------------------------------------------------------------------------------------------------ +-- this gate for fences solves the "where to store the opened gate" problem by dropping it to the floor in optened state +------------------------------------------------------------------------------------------------------------------------------ +minetest.register_node("cottages:gate_closed", { + description = S("closed fence gate"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {cottages.texture_furniture}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.85, -0.25, -0.02, 0.85, -0.05, 0.02}, + { -0.85, 0.15, -0.02, 0.85, 0.35, 0.02}, + + { -0.80, -0.05, -0.02, -0.60, 0.15, 0.02}, + { 0.60, -0.05, -0.02, 0.80, 0.15, 0.02}, + { -0.15, -0.05, -0.02, 0.15, 0.15, 0.02}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.85, -0.25, -0.1, 0.85, 0.35, 0.1}, + }, + }, + on_rightclick = function(pos, node, puncher) + minetest.swap_node(pos, {name = "cottages:gate_open", param2 = node.param2}) + end, + is_ground_content = false, +}) + + +minetest.register_node("cottages:gate_open", { + description = S("opened fence gate"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {cottages.texture_furniture}, + paramtype = "light", + paramtype2 = "facedir", + drop = "cottages:gate_closed", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + { -0.85, -0.5, -0.25, 0.85, -0.46, -0.05}, + { -0.85, -0.5, 0.15, 0.85, -0.46, 0.35}, + + { -0.80, -0.5, -0.05, -0.60, -0.46, 0.15}, + { 0.60, -0.5, -0.05, 0.80, -0.46, 0.15}, + { -0.15, -0.5, -0.05, 0.15, -0.46, 0.15}, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.85, -0.5, -0.25, 0.85, -0.3, 0.35}, + }, + }, + on_rightclick = function(pos, node, puncher) + minetest.swap_node(pos, {name = "cottages:gate_closed", param2 = node.param2}) + end, + is_ground_content = false, + drop = "cottages:gate_closed", +}) + + + +----------------------------------------------------------------------------------------------------------- +-- a hatch; nodebox definition taken from realtest +----------------------------------------------------------------------------------------------------------- + +-- hatches rotate around their axis +-- old facedir: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 +new_facedirs = { 10,19, 4,13, 2,18,22,14,20,16, 0,12,11, 3, 7,21, 9,23, 5, 1, 8,15, 6,17}; + + +cottages.register_hatch = function( nodename, description, texture, receipe_item ) + + minetest.register_node( nodename, { + description = S(description), -- not that there are any other... + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = { texture }, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + + node_box = { + type = "fixed", + fixed = { + {-0.49, -0.55, -0.49, -0.3, -0.45, 0.45}, +-- {-0.5, -0.55, 0.3, 0.3, -0.45, 0.5}, + {0.3, -0.55, -0.3, 0.49, -0.45, 0.45}, + {0.49, -0.55, -0.49, -0.3, -0.45, -0.3}, + {-0.075, -0.55, -0.3, 0.075, -0.45, 0.3}, + {-0.3, -0.55, -0.075, -0.075, -0.45, 0.075}, + {0.075, -0.55, -0.075, 0.3, -0.45, 0.075}, + + {-0.3, -0.55, 0.3, 0.3, -0.45, 0.45}, + + -- hinges + {-0.45,-0.530, 0.45, -0.15,-0.470, 0.525}, + { 0.15,-0.530, 0.45, 0.45,-0.470, 0.525}, + + -- handle + {-0.05,-0.60,-0.35, 0.05,-0.40,-0.45}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.55, -0.5, 0.5, -0.45, 0.5}, + }, + on_rightclick = function(pos, node, puncher) + + minetest.swap_node(pos, {name = node.name, param2 = new_facedirs[ node.param2+1 ]}) + end, + is_ground_content = false, + on_place = minetest.rotate_node, + }) + + minetest.register_craft({ + output = nodename, + recipe = { + { '', '', receipe_item }, + { receipe_item, cottages.craftitem_stick, '' }, + { '', '', '' }, + } + }) +end + + +-- further alternate hatch materials: wood, tree, copper_block +cottages.register_hatch( 'cottages:hatch_wood', 'wooden hatch', 'cottages_minimal_wood.png', cottages.craftitem_slab_wood ); +cottages.register_hatch( 'cottages:hatch_steel', 'metal hatch', 'cottages_steel_block.png', cottages.craftitem_steel ); + + + + +----------------------------------------------------------------------------------------------------------- +-- and now the crafting receipes: +----------------------------------------------------------------------------------------------------------- + +-- transform opend and closed shutters into each other for convenience +minetest.register_craft({ + output = "cottages:window_shutter_open", + recipe = { + {"cottages:window_shutter_closed" }, + } +}) + +minetest.register_craft({ + output = "cottages:window_shutter_closed", + recipe = { + {"cottages:window_shutter_open" }, + } +}) + +minetest.register_craft({ + output = "cottages:window_shutter_open", + recipe = { + {cottages.craftitem_wood, "", cottages.craftitem_wood }, + } +}) + +-- transform one half door into another +minetest.register_craft({ + output = "cottages:half_door", + recipe = { + {"cottages:half_door_inverted" }, + } +}) + +minetest.register_craft({ + output = "cottages:half_door_inverted", + recipe = { + {"cottages:half_door" }, + } +}) + +minetest.register_craft({ + output = "cottages:half_door 2", + recipe = { + {"", cottages.craftitem_wood, "" }, + {"", cottages.craftitem_door, "" }, + } +}) + + +-- transform open and closed versions into into another for convenience +minetest.register_craft({ + output = "cottages:gate_closed", + recipe = { + {"cottages:gate_open" }, + } +}) + +minetest.register_craft({ + output = "cottages:gate_open", + recipe = { + {"cottages:gate_closed"}, + } +}) + +minetest.register_craft({ + output = "cottages:gate_closed", + recipe = { + {cottages.craftitem_stick, cottages.craftitem_stick, cottages.craftitem_wood }, + } +}) + diff --git a/mods/cottages/nodes_feldweg.lua b/mods/cottages/nodes_feldweg.lua new file mode 100644 index 00000000..92059526 --- /dev/null +++ b/mods/cottages/nodes_feldweg.lua @@ -0,0 +1,486 @@ +--------------------------------------------------------------------------------------- +-- decoration and building material +--------------------------------------------------------------------------------------- +-- * includes a wagon wheel that can be used as decoration on walls or to build (stationary) wagons +-- * dirt road - those are more natural in small old villages than cobble roads +-- * loam - no, old buildings are usually not built out of clay; loam was used +-- * straw - useful material for roofs +-- * glass pane - an improvement compared to fence posts as windows :-) +--------------------------------------------------------------------------------------- + +local S = cottages.S + +-- supported modes: +-- * simple: only a straight dirt road; no curves, junctions etc. +-- * flat: each node is a full node; junction, t-junction and corner are included +-- * nodebox: like flat - except that each node has a nodebox that fits to that road node +-- * mesh: like nodebox - except that it uses a nice roundish model +local cottages_feldweg_mode = minetest.settings:get("cottages_feldweg_mode") +if( cottages_feldweg_mode ~= "mesh" + and cottages_feldweg_mode ~= "flat" + and cottages_feldweg_mode ~= "nodebox" + and cottages_feldweg_mode ~= "flat") then + cottages_feldweg_mode = "mesh"; + -- add the setting to the minetest.conf so that the player can set it there + minetest.settings:set("cottages_feldweg_mode", "mesh") +end + +local function register_recipes(include_end) + + minetest.register_craft({ + output = "cottages:feldweg_crossing 5", + recipe = { + {"", "cottages:feldweg", "" }, + {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"}, + {"", "cottages:feldweg", "" }, + }, + }) + + minetest.register_craft({ + output = "cottages:feldweg_t_junction 5", + recipe = { + {"", "cottages:feldweg", "" }, + {"", "cottages:feldweg", "" }, + {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} + + }, + }) + + minetest.register_craft({ + output = "cottages:feldweg_curve 5", + recipe = { + {"cottages:feldweg", "", "" }, + {"cottages:feldweg", "", ""}, + {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} + }, + }) + + if include_end then + minetest.register_craft({ + output = "cottages:feldweg_end 5", + recipe = { + {"cottages:feldweg", "", "cottages:feldweg" }, + {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} + }, + }) + end +end + +--- a nice dirt road for small villages or paths to fields +if( cottages_feldweg_mode == "simple" or cottages_feldweg_mode == "flat" ) then + minetest.register_node("cottages:feldweg", { + description = S("dirt road"), + tiles = {"cottages_feldweg.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + }) +end + +-- add crossing, t-junction and corner + +-- +-- flat - just textures, full blocks +-- +if( cottages_feldweg_mode == "flat" ) then + + minetest.register_node("cottages:feldweg_crossing", { + description = S("dirt road crossing"), + tiles = {"cottages_feldweg_kreuzung.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + }) + + minetest.register_node("cottages:feldweg_t_junction", { + description = S("dirt road t junction"), + tiles = {"cottages_feldweg_t-kreuzung.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + }) + + minetest.register_node("cottages:feldweg_curve", { + description = S("dirt road curve"), + tiles = {"cottages_feldweg_ecke.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + }) + + register_recipes(false) +-- +-- cube-style nodebox version +-- +elseif( cottages_feldweg_mode == "nodebox" ) then + minetest.register_node("cottages:feldweg", { + description = S("dirt road"), + tiles = {"cottages_feldweg_orig.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + roups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5-2/16, 0.5}, + -- Rasenkanten + { -0.5, 0.5-2/16, -0.5, -0.5+3/16, 0.5, 0.5}, + { 0.5-3/16, 0.5-2/16, -0.5, 0.5, 0.5, 0.5}, + -- uebergang zwischen Wagenspur und Rasenkante + { -0.5+3/16, 0.5-2/16, -0.5, -0.5+4/16, 0.5-1/16, 0.5}, + { 0.5-4/16, 0.5-2/16, -0.5, 0.5-3/16, 0.5-1/16, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + }) + + minetest.register_node("cottages:feldweg_crossing", { + description = S("dirt road crossing"), + tiles = {"cottages_feldweg_kreuzung.png","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5-2/16, 0.5}, + -- Rasenkanten + { -0.5, 0.5-2/16, -0.5, -0.5+3/16, 0.5, -0.5+3/16}, + { 0.5-3/16, 0.5-2/16, -0.5, 0.5, 0.5, -0.5+3/16}, + + { -0.5, 0.5-2/16, 0.5-3/16, -0.5+3/16, 0.5, 0.5}, + { 0.5-3/16, 0.5-2/16, 0.5-3/16, 0.5, 0.5, 0.5}, + -- uebergang zwischen Wagenspur und Rasenkante + { -0.5+3/16, 0.5-2/16, -0.5, -0.5+4/16, 0.5-1/16, -0.5+4/16}, + { 0.5-4/16, 0.5-2/16, -0.5, 0.5-3/16, 0.5-1/16, -0.5+4/16}, + + { -0.5+3/16, 0.5-2/16, 0.5-4/16, -0.5+4/16, 0.5-1/16, 0.5}, + { 0.5-4/16, 0.5-2/16, 0.5-4/16, 0.5-3/16, 0.5-1/16, 0.5}, + + + { -0.5, 0.5-2/16, -0.5+3/16, -0.5+3/16, 0.5-1/16, -0.5+4/16}, + { 0.5-3/16, 0.5-2/16, -0.5+3/16, 0.5, 0.5-1/16, -0.5+4/16}, + + { -0.5, 0.5-2/16, 0.5-4/16, -0.5+3/16, 0.5-1/16, 0.5-3/16}, + { 0.5-3/16, 0.5-2/16, 0.5-4/16, 0.5, 0.5-1/16, 0.5-3/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + }) + + minetest.register_node("cottages:feldweg_t_junction", { + description = S("dirt road t junction"), + tiles = {"cottages_feldweg_t-kreuzung.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5-2/16, 0.5}, + -- Rasenkanten + { -0.5, 0.5-2/16, -0.5, -0.5+3/16, 0.5, -0.5+3/16}, + + { -0.5, 0.5-2/16, 0.5-3/16, -0.5+3/16, 0.5, 0.5}, + -- Rasenkante seitlich durchgehend + { 0.5-3/16, 0.5-2/16, -0.5, 0.5, 0.5, 0.5}, + -- uebergang zwischen Wagenspur und Rasenkante + { -0.5+3/16, 0.5-2/16, -0.5, -0.5+4/16, 0.5-1/16, -0.5+4/16}, + + { -0.5+3/16, 0.5-2/16, 0.5-4/16, -0.5+4/16, 0.5-1/16, 0.5}, + + + { -0.5, 0.5-2/16, -0.5+3/16, -0.5+3/16, 0.5-1/16, -0.5+4/16}, + + { -0.5, 0.5-2/16, 0.5-4/16, -0.5+3/16, 0.5-1/16, 0.5-3/16}, + -- Ueberganng seitlich durchgehend + { 0.5-4/16, 0.5-2/16, -0.5, 0.5-3/16, 0.5-1/16, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + }) + + minetest.register_node("cottages:feldweg_curve", { + description = S("dirt road curve"), + tiles = {"cottages_feldweg_ecke.png^[transform2","default_dirt.png", "default_dirt.png^default_grass_side.png"}, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5-2/16, 0.5}, + -- Rasenkante vorne durchgehend + { -0.5, 0.5-2/16, -0.5, 0.5-3/16, 0.5, -0.5+3/16}, + + -- Rasenkanten + { -0.5, 0.5-2/16, 0.5-3/16, -0.5+3/16, 0.5, 0.5}, + -- Rasenkante seitlich durchgehend + { 0.5-3/16, 0.5-2/16, -0.5, 0.5, 0.5, 0.5}, + -- uebergang zwischen Wagenspur und Rasenkante + { -0.5+3/16, 0.5-2/16, 0.5-4/16, -0.5+4/16, 0.5-1/16, 0.5}, + + + -- Uebergang vorne durchgehend + { -0.5, 0.5-2/16, -0.5+3/16, 0.5-3/16, 0.5-1/16, -0.5+4/16}, + + { -0.5, 0.5-2/16, 0.5-4/16, -0.5+3/16, 0.5-1/16, 0.5-3/16}, + -- Ueberganng seitlich durchgehend + { 0.5-4/16, 0.5-2/16, -0.5, 0.5-3/16, 0.5-1/16, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + }) + + register_recipes(false) + + +-- +-- the mesh version (rounded); provided and created by VanessaE +-- +elseif( cottages_feldweg_mode == "mesh" ) then + + -- a nice dirt road for small villages or paths to fields + minetest.register_node("cottages:feldweg", { + description = S("dirt road"), + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", + "default_dirt.png", "default_grass.png", + "cottages_feldweg_surface.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, + paramtype = "light", + drawtype = "mesh", + mesh = "feldweg.obj", + }) + + + minetest.register_node("cottages:feldweg_crossing", { + description = S("dirt road crossing"), + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + tiles = {"cottages_feldweg_end.png","default_dirt.png", + "default_grass.png","cottages_feldweg_surface.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, + paramtype = "light", + drawtype = "mesh", + mesh = "feldweg-crossing.obj", + }) + + + + minetest.register_node("cottages:feldweg_t_junction", { + description = S("dirt road t junction"), + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", "default_dirt.png", + "default_grass.png","cottages_feldweg_surface.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, + paramtype = "light", + drawtype = "mesh", + mesh = "feldweg-T-junction.obj", + }) + + + + minetest.register_node("cottages:feldweg_curve", { + description = S("dirt road curve"), + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + tiles = {"default_dirt.png^default_grass_side.png","default_grass.png", + "default_dirt.png^default_grass_side.png","cottages_feldweg_surface.png", + "default_dirt.png","cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, + paramtype = "light", + drawtype = "mesh", + mesh = "feldweg-curve.obj", + }) + + + + minetest.register_node("cottages:feldweg_end", { + description = S("dirt road end"), + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", + "default_dirt.png", "default_grass.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png", + "cottages_feldweg_surface.png"}, + paramtype = "light", + drawtype = "mesh", + mesh = "feldweg_end.obj", + }) + + + register_recipes(true) + + +end + + +-- create stairs if possible +if( minetest.get_modpath("stairs") and stairs and stairs.register_stair_and_slab) then + stairs.register_stair_and_slab("feldweg", "cottages:feldweg", + {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + {"cottages_feldweg.png","default_dirt.png", "default_grass.png","default_grass.png","cottages_feldweg.png","cottages_feldweg.png"}, + S("Dirt Road Stairs"), + S("Dirt Road, half height"), + cottages.sounds.dirt) +end + +if( cottages_feldweg_mode == "nodebox" or cottages_feldweg_mode == "mesh" ) then + local box_slope = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5} + }}; + + local box_slope_long = { + type = "fixed", + fixed = { + {-0.5, -0.5, -1.5, 0.5, -0.10, 0.5}, + {-0.5, -0.25, -1.3, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -1.0, 0.5, 0, 0.5}, + {-0.5, 0, -0.5, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0, 0.5, 0.5, 0.5} + }}; + + minetest.register_node("cottages:feldweg_slope", { + description = S("dirt road slope"), + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", + "default_dirt.png", "default_grass.png", + "cottages_feldweg_surface.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, + paramtype = "light", + drawtype = "mesh", + mesh = "feldweg_slope.obj", + + collision_box = box_slope, + selection_box = box_slope, + }) + + + + minetest.register_node("cottages:feldweg_slope_long", { + description = S("dirt road slope long"), + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, + tiles = {"cottages_feldweg_end.png","default_dirt.png^default_grass_side.png", + "default_dirt.png", "default_grass.png", + "cottages_feldweg_surface.png", + "cottages_feldweg_surface.png^cottages_feldweg_edges.png"}, + paramtype = "light", + drawtype = "mesh", + mesh = "feldweg_slope_long.obj", + collision_box = box_slope_long, + selection_box = box_slope_long, + }) + + + minetest.register_craft({ + output = "cottages:feldweg_slope 3", + recipe = { + {"cottages:feldweg", "", "" }, + {"cottages:feldweg", "cottages:feldweg", ""} + }, + }) + + minetest.register_craft({ + output = "cottages:feldweg_slope_long 4", + recipe = { + {"cottages:feldweg", "", "" }, + {"cottages:feldweg", "cottages:feldweg", "cottages:feldweg"} + }, + }) +end diff --git a/mods/cottages/nodes_fences.lua b/mods/cottages/nodes_fences.lua new file mode 100644 index 00000000..0a4a26f0 --- /dev/null +++ b/mods/cottages/nodes_fences.lua @@ -0,0 +1,159 @@ +-- 22.01.13 Changed texture to that of the wood from the minimal development game + +local S = cottages.S + +minetest.register_node("cottages:fence_small", { + description = S("small fence"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.45, -0.35, 0.46, 0.45, -0.20, 0.50}, + { -0.45, 0.00, 0.46, 0.45, 0.15, 0.50}, + { -0.45, 0.35, 0.46, 0.45, 0.50, 0.50}, + + { -0.50, -0.50, 0.46, -0.45, 0.50, 0.50}, + { 0.45, -0.50, 0.46, 0.50, 0.50, 0.50}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.50, -0.50, 0.4, 0.50, 0.50, 0.5}, + }, + }, + is_ground_content = false, +}) + + +minetest.register_node("cottages:fence_corner", { + description = S("small fence corner"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.45, -0.35, 0.46, 0.45, -0.20, 0.50}, + { -0.45, 0.00, 0.46, 0.45, 0.15, 0.50}, + { -0.45, 0.35, 0.46, 0.45, 0.50, 0.50}, + + { -0.50, -0.50, 0.46, -0.45, 0.50, 0.50}, + { 0.45, -0.50, 0.46, 0.50, 0.50, 0.50}, + + { 0.46, -0.35, -0.45, 0.50, -0.20, 0.45}, + { 0.46, 0.00, -0.45, 0.50, 0.15, 0.45}, + { 0.46, 0.35, -0.45, 0.50, 0.50, 0.45}, + + { 0.46, -0.50, -0.50, 0.50, 0.50, -0.45}, + { 0.46, -0.50, 0.45, 0.50, 0.50, 0.50}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.50, -0.50,-0.5, 0.50, 0.50, 0.5}, + }, + }, + is_ground_content = false, +}) + + +minetest.register_node("cottages:fence_end", { + description = S("small fence end"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.45, -0.35, 0.46, 0.45, -0.20, 0.50}, + { -0.45, 0.00, 0.46, 0.45, 0.15, 0.50}, + { -0.45, 0.35, 0.46, 0.45, 0.50, 0.50}, + + { -0.50, -0.50, 0.46, -0.45, 0.50, 0.50}, + { 0.45, -0.50, 0.46, 0.50, 0.50, 0.50}, + + { 0.46, -0.35, -0.45, 0.50, -0.20, 0.45}, + { 0.46, 0.00, -0.45, 0.50, 0.15, 0.45}, + { 0.46, 0.35, -0.45, 0.50, 0.50, 0.45}, + + { 0.46, -0.50, -0.50, 0.50, 0.50, -0.45}, + { 0.46, -0.50, 0.45, 0.50, 0.50, 0.50}, + + { -0.50, -0.35, -0.45, -0.46, -0.20, 0.45}, + { -0.50, 0.00, -0.45, -0.46, 0.15, 0.45}, + { -0.50, 0.35, -0.45, -0.46, 0.50, 0.45}, + + { -0.50, -0.50, -0.50, -0.46, 0.50, -0.45}, + { -0.50, -0.50, 0.45, -0.46, 0.50, 0.50}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.50, -0.50,-0.5, 0.50, 0.50, 0.5}, + }, + }, + is_ground_content = false, +}) + +minetest.register_craft({ + output = "cottages:fence_small 3", + recipe = { + {cottages.craftitem_fence, cottages.craftitem_fence}, + } +}) + +-- xfences can be configured to replace normal fences - which makes them uncraftable +if ( minetest.get_modpath("xfences") ~= nil ) then + minetest.register_craft({ + output = "cottages:fence_small 3", + recipe = { + {"xfences:fence","xfences:fence" }, + } + }) +end + +minetest.register_craft({ + output = "cottages:fence_corner", + recipe = { + {"cottages:fence_small","cottages:fence_small" }, + } +}) + +minetest.register_craft({ + output = "cottages:fence_small 2", + recipe = { + {"cottages:fence_corner" }, + } +}) + +minetest.register_craft({ + output = "cottages:fence_end", + recipe = { + {"cottages:fence_small","cottages:fence_small", "cottages:fence_small" }, + } +}) + +minetest.register_craft({ + output = "cottages:fence_small 3", + recipe = { + {"cottages:fence_end" }, + } +}) + + + + diff --git a/mods/cottages/nodes_furniture.lua b/mods/cottages/nodes_furniture.lua new file mode 100644 index 00000000..424764cf --- /dev/null +++ b/mods/cottages/nodes_furniture.lua @@ -0,0 +1,646 @@ +--------------------------------------------------------------------------------------- +-- furniture +--------------------------------------------------------------------------------------- +-- contains: +-- * a bed seperated into foot and head reagion so that it can be placed manually; it has +-- no other functionality than decoration! +-- * a sleeping mat - mostly for NPC that cannot afford a bet yet +-- * bench - if you don't have 3dforniture:chair, then this is the next best thing +-- * table - very simple one +-- * shelf - for stroring things; this one is 3d +-- * stovepipe - so that the smoke from the furnace can get away +-- * washing place - put it over a water source and you can 'wash' yourshelf +--------------------------------------------------------------------------------------- +-- TODO: change the textures of the bed (make the clothing white, foot path not entirely covered with cloth) + +local S = cottages.S + +-- a bed without functionality - just decoration +minetest.register_node("cottages:bed_foot", { + description = S("Bed (foot region)"), + drawtype = "nodebox", + tiles = {"cottages_beds_bed_top_bottom.png", cottages.texture_furniture, "cottages_beds_bed_side.png", "cottages_beds_bed_side.png", "cottages_beds_bed_side.png", "cottages_beds_bed_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + sounds = cottages.sounds.wood, + node_box = { + type = "fixed", + fixed = { + -- bed + {-0.5, 0.0, -0.5, 0.5, 0.3, 0.5}, + + -- stützen + {-0.5, -0.5, -0.5, -0.4, 0.5, -0.4}, + { 0.4,-0.5, -0.5, 0.5, 0.5, -0.4}, + + -- Querstrebe + {-0.4, 0.3, -0.5, 0.4, 0.5, -0.4} + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.3, 0.5}, + } + }, + is_ground_content = false, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing ); + end +}) + +-- the bed is split up in two parts to avoid destruction of blocks on placement +minetest.register_node("cottages:bed_head", { + description = S("Bed (head region)"), + drawtype = "nodebox", + tiles = {"cottages_beds_bed_top_top.png", cottages.texture_furniture, "cottages_beds_bed_side_top_r.png", "cottages_beds_bed_side_top_l.png", cottages.texture_furniture, "cottages_beds_bed_side.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + sounds = cottages.sounds.wood, + node_box = { + type = "fixed", + fixed = { + -- bed + {-0.5, 0.0, -0.5, 0.5, 0.3, 0.5}, + + -- stützen + {-0.5,-0.5, 0.4, -0.4, 0.5, 0.5}, + { 0.4,-0.5, 0.4, 0.5, 0.5, 0.5}, + + -- Querstrebe + {-0.4, 0.3, 0.4, 0.4, 0.5, 0.5} + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.3, 0.5}, + } + }, + is_ground_content = false, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing ); + end +}) + + +-- the basic version of a bed - a sleeping mat +-- to facilitate upgrade path straw mat -> sleeping mat -> bed, this uses a nodebox +minetest.register_node("cottages:sleeping_mat", { + description = S("sleeping mat"), + drawtype = 'nodebox', + tiles = { 'cottages_sleepingmat.png' }, -- done by VanessaE + wield_image = 'cottages_sleepingmat.png', + inventory_image = 'cottages_sleepingmat.png', + sunlight_propagates = true, + paramtype = 'light', + paramtype2 = "facedir", + walkable = false, + groups = { snappy = 3 }, + sounds = cottages.sounds.leaves, + selection_box = { + type = "wallmounted", + }, + node_box = { + type = "fixed", + fixed = { + {-0.48, -0.5,-0.48, 0.48, -0.5+1/16, 0.48}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.48, -0.5,-0.48, 0.48, -0.5+2/16, 0.48}, + } + }, + is_ground_content = false, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing ); + end +}) + + +-- this one has a pillow for the head; thus, param2 becomes visible to the builder, and mobs may use it as a bed +minetest.register_node("cottages:sleeping_mat_head", { + description = S("sleeping mat with pillow"), + drawtype = 'nodebox', + tiles = { 'cottages_sleepingmat.png' }, -- done by VanessaE + wield_image = 'cottages_sleepingmat.png', + inventory_image = 'cottages_sleepingmat.png', + sunlight_propagates = true, + paramtype = 'light', + paramtype2 = "facedir", + groups = { snappy = 3 }, + sounds = cottages.sounds.leaves, + node_box = { + type = "fixed", + fixed = { + {-0.48, -0.5,-0.48, 0.48, -0.5+1/16, 0.48}, + {-0.34, -0.5+1/16,-0.12, 0.34, -0.5+2/16, 0.34}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.48, -0.5,-0.48, 0.48, -0.5+2/16, 0.48}, + } + }, + is_ground_content = false, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing ); + end +}) + + +-- furniture; possible replacement: 3dforniture:chair +minetest.register_node("cottages:bench", { + drawtype = "nodebox", + description = S("simple wooden bench"), + tiles = {"cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png", "cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + sounds = cottages.sounds.wood, + node_box = { + type = "fixed", + fixed = { + -- sitting area + {-0.5, -0.15, 0.1, 0.5, -0.05, 0.5}, + + -- stützen + {-0.4, -0.5, 0.2, -0.3, -0.15, 0.4}, + { 0.3, -0.5, 0.2, 0.4, -0.15, 0.4}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0, 0.5, 0, 0.5}, + } + }, + is_ground_content = false, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return cottages.sit_on_bench( pos, node, clicker, itemstack, pointed_thing ); + end, +}) + + +-- a simple table; possible replacement: 3dforniture:table +local cottages_table_def = { + description = S("table"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.1, -0.5, -0.1, 0.1, 0.3, 0.1}, + { -0.5, 0.48, -0.5, 0.5, 0.4, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.4, 0.5}, + }, + }, + is_ground_content = false, +} + + +-- search for the workbench in AdventureTest +local workbench = minetest.registered_nodes[ "workbench:3x3"]; +if( workbench ) then + cottages_table_def.tiles = {workbench.tiles[1], cottages_table_def.tiles[1]}; + cottages_table_def.on_rightclick = workbench.on_rightclick; +end +-- search for the workbench from RealTEst +workbench = minetest.registered_nodes[ "workbench:work_bench_birch"]; +if( workbench ) then + cottages_table_def.tiles = {workbench.tiles[1], cottages_table_def.tiles[1]}; + cottages_table_def.on_construct = workbench.on_construct; + cottages_table_def.can_dig = workbench.can_dig; + cottages_table_def.on_metadata_inventory_take = workbench.on_metadata_inventory_take; + cottages_table_def.on_metadata_inventory_move = workbench.on_metadata_inventory_move; + cottages_table_def.on_metadata_inventory_put = workbench.on_metadata_inventory_put; +end + +minetest.register_node("cottages:table", cottages_table_def ); + +-- looks better than two slabs impersonating a shelf; also more 3d than a bookshelf +-- the infotext shows if it's empty or not +minetest.register_node("cottages:shelf", { + description = S("open storage shelf"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + + { -0.5, -0.5, -0.3, -0.4, 0.5, 0.5}, + { 0.4, -0.5, -0.3, 0.5, 0.5, 0.5}, + + { -0.5, -0.2, -0.3, 0.5, -0.1, 0.5}, + { -0.5, 0.3, -0.3, 0.5, 0.4, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + + on_construct = function(pos) + + local meta = minetest.get_meta(pos); + + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + meta:set_string("formspec", + "size[8,8]".. + "list[current_name;main;0,0;8,3;]".. + "list[current_player;main;0,4;8,4;]".. + "listring[nodemeta:" .. spos .. ";main]" .. + "listring[current_player;main]") + meta:set_string("infotext", S("open storage shelf")) + local inv = meta:get_inventory(); + inv:set_size("main", 24); + end, + + can_dig = function( pos,player ) + local meta = minetest.get_meta( pos ); + local inv = meta:get_inventory(); + return inv:is_empty("main"); + end, + + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta( pos ); + meta:set_string('infotext', S('open storage shelf (in use)')); + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta( pos ); + local inv = meta:get_inventory(); + if( inv:is_empty("main")) then + meta:set_string('infotext', S('open storage shelf (empty)')); + end + end, + is_ground_content = false, + + +}) + +-- so that the smoke from a furnace can get out of a building +minetest.register_node("cottages:stovepipe", { + description = S("stovepipe"), + drawtype = "nodebox", + tiles = {"cottages_steel_block.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { 0.20, -0.5, 0.20, 0.45, 0.5, 0.45}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { 0.20, -0.5, 0.20, 0.45, 0.5, 0.45}, + }, + }, + is_ground_content = false, +}) + + +-- this washing place can be put over a water source (it is open at the bottom) +minetest.register_node("cottages:washing", { + description = S("washing place"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_clay.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, -0.2, -0.2}, + + { -0.5, -0.5, -0.2, -0.4, 0.2, 0.5}, + { 0.4, -0.5, -0.2, 0.5, 0.2, 0.5}, + + { -0.4, -0.5, 0.4, 0.4, 0.2, 0.5}, + { -0.4, -0.5, -0.2, 0.4, 0.2, -0.1}, + + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.5, 0.5, 0.2, 0.5}, + }, + }, + on_rightclick = function(pos, node, player) + -- works only with water beneath + local node_under = minetest.get_node( {x=pos.x, y=(pos.y-1), z=pos.z} ); + if( not( node_under ) or node_under.name == "ignore" or (node_under.name ~= 'default:water_source' and node_under.name ~= 'default:water_flowing')) then + minetest.chat_send_player( player:get_player_name(), S("Sorry. This washing place is out of water. Please place it above water!")); + else + minetest.chat_send_player( player:get_player_name(), S("You feel much cleaner after some washing.")); + end + end, + is_ground_content = false, + +}) + + +--------------------------------------------------------------------------------------- +-- functions for sitting or sleeping +--------------------------------------------------------------------------------------- + +cottages.allow_sit = function( player ) + -- no check possible + if( not( player.get_player_velocity )) then + return true; + end + local velo = player:get_player_velocity(); + if( not( velo )) then + return false; + end + local max_velo = 0.0001; + if( math.abs(velo.x) < max_velo + and math.abs(velo.y) < max_velo + and math.abs(velo.z) < max_velo ) then + return true; + end + return false; +end + +cottages.sit_on_bench = function( pos, node, clicker, itemstack, pointed_thing ) + if( not( clicker ) or not( default.player_get_animation ) or not( cottages.allow_sit( clicker ))) then + return; + end + + local animation = default.player_get_animation( clicker ); + local pname = clicker:get_player_name(); + + if( animation and animation.animation=="sit") then + default.player_attached[pname] = false + clicker:set_pos({x=pos.x,y=pos.y-0.5,z=pos.z}) + clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) + clicker:set_physics_override(1, 1, 1) + default.player_set_animation(clicker, "stand", 30) + else + -- the bench is not centered; prevent the player from sitting on air + local p2 = {x=pos.x, y=pos.y, z=pos.z}; + if not( node ) or node.param2 == 0 then + p2.z = p2.z+0.3; + elseif node.param2 == 1 then + p2.x = p2.x+0.3; + elseif node.param2 == 2 then + p2.z = p2.z-0.3; + elseif node.param2 == 3 then + p2.x = p2.x-0.3; + end + + clicker:set_eye_offset({x=0,y=-7,z=2}, {x=0,y=0,z=0}) + clicker:set_pos( p2 ) + default.player_set_animation(clicker, "sit", 30) + clicker:set_physics_override(0, 0, 0) + default.player_attached[pname] = true + end +end + +cottages.sleep_in_bed = function( pos, node, clicker, itemstack, pointed_thing ) + if( not( clicker ) or not( node ) or not( node.name ) or not( pos ) or not( cottages.allow_sit( clicker))) then + return; + end + + local animation = default.player_get_animation( clicker ); + local pname = clicker:get_player_name(); + + local p_above = minetest.get_node( {x=pos.x, y=pos.y+1, z=pos.z}); + if( not( p_above) or not( p_above.name ) or p_above.name ~= 'air' ) then + minetest.chat_send_player( pname, "This place is too narrow for sleeping. At least for you!"); + return; + end + + local place_name = 'place'; + -- if only one node is present, the player can only sit; + -- sleeping requires a bed head+foot or two sleeping mats + local allow_sleep = false; + local new_animation = 'sit'; + + -- let players get back up + if( animation and animation.animation=="lay" ) then + default.player_attached[pname] = false + clicker:set_pos({x=pos.x,y=pos.y-0.5,z=pos.z}) + clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) + clicker:set_physics_override(1, 1, 1) + default.player_set_animation(clicker, "stand", 30) + minetest.chat_send_player( pname, 'That was enough sleep for now. You stand up again.'); + return; + end + + local second_node_pos = {x=pos.x, y=pos.y, z=pos.z}; + -- the node that will contain the head of the player + local p = {x=pos.x, y=pos.y, z=pos.z}; + -- the player's head is pointing in this direction + local dir = node.param2; + -- it would be odd to sleep in half a bed + if( node.name=='cottages:bed_head' ) then + if( node.param2==0 ) then + second_node_pos.z = pos.z-1; + elseif( node.param2==1) then + second_node_pos.x = pos.x-1; + elseif( node.param2==2) then + second_node_pos.z = pos.z+1; + elseif( node.param2==3) then + second_node_pos.x = pos.x+1; + end + local node2 = minetest.get_node( second_node_pos ); + if( not( node2 ) or not( node2.param2 ) or not( node.param2 ) + or node2.name ~= 'cottages:bed_foot' + or node2.param2 ~= node.param2 ) then + allow_sleep = false; + else + allow_sleep = true; + end + place_name = 'bed'; + + -- if the player clicked on the foot of the bed, locate the head + elseif( node.name=='cottages:bed_foot' ) then + if( node.param2==2 ) then + second_node_pos.z = pos.z-1; + elseif( node.param2==3) then + second_node_pos.x = pos.x-1; + elseif( node.param2==0) then + second_node_pos.z = pos.z+1; + elseif( node.param2==1) then + second_node_pos.x = pos.x+1; + end + local node2 = minetest.get_node( second_node_pos ); + if( not( node2 ) or not( node2.param2 ) or not( node.param2 ) + or node2.name ~= 'cottages:bed_head' + or node2.param2 ~= node.param2 ) then + allow_sleep = false; + else + allow_sleep = true; + end + if( allow_sleep==true ) then + p = {x=second_node_pos.x, y=second_node_pos.y, z=second_node_pos.z}; + end + place_name = 'bed'; + + elseif( node.name=='cottages:sleeping_mat' or node.name=='cottages:straw_mat' or node.name=='cottages:sleeping_mat_head') then + place_name = 'mat'; + dir = node.param2; + allow_sleep = false; + -- search for a second mat right next to this one + local offset = {{x=0,z=-1}, {x=-1,z=0}, {x=0,z=1}, {x=1,z=0}}; + for i,off in ipairs( offset ) do + node2 = minetest.get_node( {x=pos.x+off.x, y=pos.y, z=pos.z+off.z} ); + if( node2.name == 'cottages:sleeping_mat' or node2.name=='cottages:straw_mat' or node.name=='cottages:sleeping_mat_head' ) then + -- if a second mat is found, sleeping is possible + allow_sleep = true; + dir = i-1; + end + end + end + + -- set the right height for the bed + if( place_name=='bed' ) then + p.y = p.y+0.4; + end + if( allow_sleep==true ) then + -- set the right position (middle of the bed) + if( dir==0 ) then + p.z = p.z-0.5; + elseif( dir==1 ) then + p.x = p.x-0.5; + elseif( dir==2 ) then + p.z = p.z+0.5; + elseif( dir==3 ) then + p.x = p.x+0.5; + end + end + + if( default.player_attached[pname] and animation.animation=="sit") then + -- just changing the animation... + if( allow_sleep==true ) then + default.player_set_animation(clicker, "lay", 30) + clicker:set_eye_offset({x=0,y=-14,z=2}, {x=0,y=0,z=0}) + minetest.chat_send_player( pname, 'You lie down and take a nap. A right-click will wake you up.'); + return; + -- no sleeping on this place + else + default.player_attached[pname] = false + clicker:set_pos({x=pos.x,y=pos.y-0.5,z=pos.z}) + clicker:set_eye_offset({x=0,y=0,z=0}, {x=0,y=0,z=0}) + clicker:set_physics_override(1, 1, 1) + default.player_set_animation(clicker, "stand", 30) + minetest.chat_send_player( pname, 'That was enough sitting around for now. You stand up again.'); + return; + end + end + + + clicker:set_eye_offset({x=0,y=-7,z=2}, {x=0,y=0,z=0}) + clicker:set_pos( p ); + default.player_set_animation(clicker, new_animation, 30) + clicker:set_physics_override(0, 0, 0) + default.player_attached[pname] = true + + if( allow_sleep==true) then + minetest.chat_send_player( pname, 'Aaah! What a comftable '..place_name..'. A second right-click will let you sleep.'); + else + minetest.chat_send_player( pname, 'Comftable, but not good enough for a nap. Right-click again if you want to get back up.'); + end +end + +--------------------------------------------------------------------------------------- +-- crafting receipes +--------------------------------------------------------------------------------------- +minetest.register_craft({ + output = "cottages:bed_foot", + recipe = { + {cottages.craftitem_wool, "", "", }, + {cottages.craftitem_wood, "", "", }, + {cottages.craftitem_stick, "", "", } + } +}) + +minetest.register_craft({ + output = "cottages:bed_head", + recipe = { + {"", "", cottages.craftitem_wool, }, + {"", cottages.craftitem_stick, cottages.craftitem_wood, }, + {"", "", cottages.craftitem_stick, } + } +}) + +minetest.register_craft({ + output = "cottages:sleeping_mat 3", + recipe = { + {"cottages:wool_tent", "cottages:straw_mat","cottages:straw_mat" } + } +}) + + +minetest.register_craft({ + output = "cottages:sleeping_mat_head", + recipe = { + {"cottages:sleeping_mat","cottages:straw_mat" } + } +}) + +minetest.register_craft({ + output = "cottages:table", + recipe = { + {"", cottages.craftitem_slab_wood, "", }, + {"", cottages.craftitem_stick, "" } + } +}) + +minetest.register_craft({ + output = "cottages:bench", + recipe = { + {"", cottages.craftitem_wood, "", }, + {cottages.craftitem_stick, "", cottages.craftitem_stick, } + } +}) + + +minetest.register_craft({ + output = "cottages:shelf", + recipe = { + {cottages.craftitem_stick, cottages.craftitem_wood, cottages.craftitem_stick, }, + {cottages.craftitem_stick, cottages.craftitem_wood, cottages.craftitem_stick, }, + {cottages.craftitem_stick, "", cottages.craftitem_stick} + } +}) + +minetest.register_craft({ + output = "cottages:washing 2", + recipe = { + {cottages.craftitem_stick, }, + {cottages.craftitem_clay, }, + } +}) + +minetest.register_craft({ + output = "cottages:stovepipe 2", + recipe = { + {cottages.craftitem_steel, '', cottages.craftitem_steel}, + } +}) diff --git a/mods/cottages/nodes_hay.lua b/mods/cottages/nodes_hay.lua new file mode 100644 index 00000000..3d1f8b03 --- /dev/null +++ b/mods/cottages/nodes_hay.lua @@ -0,0 +1,135 @@ +-- contains hay_mat, hay and hay bale +-- (gives the pitchfork some work) +-- +local S = cottages.S + +-- If default:dirt_with_grass is digged while wielding a pitchfork, it will +-- turn into dirt and get some hay placed above it. +-- The hay will disappear (decay) after a couple of minutes. +if( minetest.registered_items["default:dirt_with_grass"] + and minetest.registered_tools["cottages:pitchfork"]) then + minetest.override_item("default:dirt_with_grass", { + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if( not( pos ) or not( digger )) then + return + end + local wielded = digger:get_wielded_item() + if( not( wielded ) + or not( wielded:get_name() ) + or (wielded:get_name()~="cottages:pitchfork")) then + return + end + + local pos_above = {x=pos.x, y=pos.y+1, z=pos.z} + local node_above = minetest.get_node_or_nil( pos_above) + if( not(node_above) or not(node_above.name) or node_above.name ~= "air" ) then + return nil + end + minetest.swap_node( pos, {name="default:dirt"}) + minetest.add_node( pos_above, {name="cottages:hay_mat", param2=math.random(2,25)}) + -- start a node timer so that the hay will decay after some time + local timer = minetest.get_node_timer(pos_above) + if not timer:is_started() then + timer:start(math.random(60, 300)) + end + -- TODO: prevent dirt from beeing multiplied this way (that is: give no dirt!) + return + end, + }) +end + + + +-- more comparable to the straw mat than to a hay bale +-- (can be created by digging dirt with grass with the pitchfork) +minetest.register_node("cottages:hay_mat", { + drawtype = "nodebox", + paramtype2 = "leveled", + description = S("Some hay"), + tiles = {cottages.straw_texture.."^[multiply:#88BB88"}, + groups = {hay=3, snappy=2, oddly_breakable_by_hand=2, flammable=3}, + sounds = cottages.sounds.leaves, + -- the bale is slightly smaller than a full node + is_ground_content = false, + node_box = { + type = "leveled", --"fixed", + fixed = { + {-0.5,-0.5,-0.5, 0.5, 0.5, 0.5}, + } + }, + -- make sure a placed hay block looks halfway reasonable + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.swap_node( pos, {name="cottages:hay_mat", param2=math.random(2,25)}) + end, + on_timer = function(pos, elapsed) + local node = minetest.get_node(pos) + if( node and node.name=="cottages:hay_mat") then + minetest.remove_node(pos) + minetest.check_for_falling(pos) + end + end, +}) + +-- hay block, similar to straw block +minetest.register_node("cottages:hay", { + description = S("Hay"), + tiles = {cottages.straw_texture.."^[multiply:#88BB88"}, + groups = {hay=3, snappy=2, oddly_breakable_by_hand=2, flammable=3}, + sounds = cottages.sounds.leaves, + is_ground_content = false, +}) + + +-- hay bales for hungry animals +minetest.register_node("cottages:hay_bale", { + drawtype = "nodebox", + description = S("Hay bale"), + tiles = {"cottages_darkage_straw_bale.png^[multiply:#88BB88"}, + paramtype = "light", + groups = {hay=3, snappy=2, oddly_breakable_by_hand=2, flammable=3}, + sounds = cottages.sounds.leaves, + -- the bale is slightly smaller than a full node + node_box = { + type = "fixed", + fixed = { + {-0.45, -0.5,-0.45, 0.45, 0.45, 0.45}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.45, -0.5,-0.45, 0.45, 0.45, 0.45}, + } + }, + is_ground_content = false, +}) + + +-- +-- craft recipes +-- +minetest.register_craft({ + output = "cottages:hay_mat 9", + recipe = { + {"cottages:hay"}, + }, +}) + +minetest.register_craft({ + output = "cottages:hay", + recipe = { + {"cottages:hay_mat", "cottages:hay_mat", "cottages:hay_mat"}, + {"cottages:hay_mat", "cottages:hay_mat", "cottages:hay_mat"}, + {"cottages:hay_mat", "cottages:hay_mat", "cottages:hay_mat"}, + }, +}) + +minetest.register_craft({ + output = "cottages:hay", + recipe = {{"cottages:hay_bale"}}, +}) + +minetest.register_craft({ + output = "cottages:hay_bale", + recipe = {{"cottages:hay"}}, +}) diff --git a/mods/cottages/nodes_historic.lua b/mods/cottages/nodes_historic.lua new file mode 100644 index 00000000..af8aa3a0 --- /dev/null +++ b/mods/cottages/nodes_historic.lua @@ -0,0 +1,275 @@ +--------------------------------------------------------------------------------------- +-- decoration and building material +--------------------------------------------------------------------------------------- +-- * includes a wagon wheel that can be used as decoration on walls or to build (stationary) wagons +-- * dirt road - those are more natural in small old villages than cobble roads +-- * loam - no, old buildings are usually not built out of clay; loam was used +-- * straw - useful material for roofs +-- * glass pane - an improvement compared to fence posts as windows :-) +--------------------------------------------------------------------------------------- + +local S = cottages.S + +-- can be used to buid real stationary wagons or attached to walls as decoration +minetest.register_node("cottages:wagon_wheel", { + description = S("wagon wheel"), + drawtype = "signlike", + tiles = {"cottages_wagonwheel.png"}, -- done by VanessaE! + inventory_image = "cottages_wagonwheel.png", + wield_image = "cottages_wagonwheel.png", + paramtype = "light", + paramtype2 = "wallmounted", + + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "wallmounted", + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + is_ground_content = false, +}) + + +-- people didn't use clay for houses; they did build with loam +minetest.register_node("cottages:loam", { + description = S("loam"), + tiles = {"cottages_loam.png"}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + groups = {crumbly=3}, + sounds = cottages.sounds.dirt, + is_ground_content = false, +}) + +-- create stairs if possible +if( minetest.get_modpath("stairs") and stairs and stairs.register_stair_and_slab) then + + stairs.register_stair_and_slab("loam", "cottages:loam", + {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + {"cottages_loam.png"}, + S("Loam Stairs"), + S("Loam Slab"), + cottages.sounds.dirt) + + if( minetest.registered_nodes["default:clay"]) then + stairs.register_stair_and_slab("clay", "default:clay", + {crumbly=3}, + {"cottages_clay.png"}, + S("Clay Stairs"), + S("Clay Slab"), + cottages.sounds.dirt) + end +end + + +-- straw is a common material for places where animals are kept indoors +-- right now, this block mostly serves as a placeholder +minetest.register_node("cottages:straw_ground", { + description = S("straw ground for animals"), + tiles = {cottages.straw_texture,"cottages_loam.png","cottages_loam.png","cottages_loam.png","cottages_loam.png","cottages_loam.png"}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + groups = {crumbly=3}, + sounds = cottages.sounds.leaves, + is_ground_content = false, +}) + + +-- note: these houses look good with a single fence pile as window! the glass pane is the version for 'richer' inhabitants +minetest.register_node("cottages:glass_pane", { + description = S("simple glass pane (centered)"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_glass_pane.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.05, 0.5, 0.5, 0.05}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.05, 0.5, 0.5, 0.05}, + }, + }, + is_ground_content = false, +}) + + +minetest.register_node("cottages:glass_pane_side", { + description = S("simple glass pane"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_glass_pane.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.40, 0.5, 0.5, -0.50}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.40, 0.5, 0.5, -0.50}, + }, + }, + is_ground_content = false, +}) + + +--------------------------------------------------------------------------------------- +-- a very small wooden slab +--------------------------------------------------------------------------------------- +minetest.register_node("cottages:wood_flat", { + description = S("flat wooden planks"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_minimal_wood.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.50, 0.5, -0.5+1/16, 0.50}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.50, 0.5, -0.5+1/16, 0.50}, + }, + }, + is_ground_content = false, + on_place = minetest.rotate_node, +}) + +--------------------------------------------------------------------------------------- +-- useful for building tents +--------------------------------------------------------------------------------------- +minetest.register_node("cottages:wool_tent", { + description = S("wool for tents"), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = {"cottages_wool.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.50, 0.5, -0.5+1/16, 0.50}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + { -0.5, -0.5, -0.50, 0.5, -0.5+1/16, 0.50}, + }, + }, + is_ground_content = false, + on_place = minetest.rotate_node, +}) + +-- a fallback for cases in which there is no wool +if( not( minetest.registered_nodes["wool:white"])) then + minetest.register_node("cottages:wool", { + description = "Wool", + tiles = {"cottages_wool.png"}, + is_ground_content = false, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,flammable=3,wool=1}, + }) +else + minetest.register_alias("cottages:wool", "wool:white") +end + + +--------------------------------------------------------------------------------------- +-- crafting receipes +--------------------------------------------------------------------------------------- +minetest.register_craft({ + output = "cottages:wagon_wheel 3", + recipe = { + {cottages.craftitem_iron, cottages.craftitem_stick, cottages.craftitem_iron }, + {cottages.craftitem_stick, cottages.craftitem_steel, cottages.craftitem_stick }, + {cottages.craftitem_iron, cottages.craftitem_stick, cottages.craftitem_iron } + } +}) + +-- run a wagon wheel over dirt :-) +minetest.register_craft({ + output = "cottages:feldweg 4", + recipe = { + {"", "cottages:wagon_wheel", "" }, + {cottages.craftitem_dirt,cottages.craftitem_dirt,cottages.craftitem_dirt } + }, + replacements = { {'cottages:wagon_wheel', 'cottages:wagon_wheel'}, } +}) + +minetest.register_craft({ + output = "cottages:loam 4", + recipe = { + {cottages.craftitem_sand}, + {cottages.craftitem_clay} + } +}) + +minetest.register_craft({ + output = "cottages:straw_ground 2", + recipe = { + {"cottages:straw_mat" }, + {"cottages:loam"} + } +}) + +minetest.register_craft({ + output = "cottages:glass_pane 4", + recipe = { + {cottages.craftitem_stick, cottages.craftitem_stick, cottages.craftitem_stick }, + {cottages.craftitem_stick, cottages.craftitem_glass, cottages.craftitem_stick }, + {cottages.craftitem_stick, cottages.craftitem_stick, cottages.craftitem_stick } + } +}) + +minetest.register_craft({ + output = "cottages:glass_pane_side", + recipe = { + {"cottages:glass_pane"}, + } +}) + +minetest.register_craft({ + output = "cottages:glass_pane", + recipe = { + {"cottages:glass_pane_side"}, + } +}) + +minetest.register_craft({ + output = "cottages:wood_flat 16", + recipe = { + {cottages.craftitem_stick, "farming:string",cottages.craftitem_stick }, + {cottages.craftitem_stick, "", cottages.craftitem_stick }, + } +}) + +minetest.register_craft({ + output = "cottages:wool_tent 2", + recipe = { + {"farming:string", "farming:string"}, + {"",cottages.craftitem_stick} + } +}) + +minetest.register_craft({ + output = "cottages:wool", + recipe = { + {"cottages:wool_tent", "cottages:wool_tent"} + } +}) diff --git a/mods/cottages/nodes_mining.lua b/mods/cottages/nodes_mining.lua new file mode 100644 index 00000000..2098afe5 --- /dev/null +++ b/mods/cottages/nodes_mining.lua @@ -0,0 +1,67 @@ + + +--------------------------------------------------------------------------------------- +-- a rope that is of use to the mines +--------------------------------------------------------------------------------------- +-- the rope can only be digged if there is no further rope above it; +-- Note: This rope also counts as a rail node; thus, carts can move through it +minetest.register_node("cottages:rope", { + description = "rope for climbing", + tiles = {"cottages_rope.png"}, + groups = {snappy=3,choppy=3,oddly_breakable_by_hand=3,rail=1,connect_to_raillike=1},--connect_to_raillike=minetest.raillike_group("rail")}, + walkable = false, + climbable = true, + paramtype = "light", + sunlight_propagates = true, + drawtype = "plantlike", + is_ground_content = false, + can_dig = function(pos, player) + local below = minetest.get_node( {x=pos.x, y=pos.y-1, z=pos.z}); + if( below and below.name and below.name == "cottages:rope" ) then + if( player ) then + minetest.chat_send_player( player:get_player_name(), + 'The entire rope would be too heavy. Start digging at its lowest end!'); + end + return false; + end + return true; + end +}) + +minetest.register_craft({ + output = "cottages:rope", + recipe = { + {"farming:cotton","farming:cotton","farming:cotton"} + } +}) + + +-- Note: This rope also counts as a rail node; thus, carts can move through it +minetest.register_node("cottages:ladder_with_rope_and_rail", { + description = "Ladder with rail support", + drawtype = "signlike", + tiles = {"default_ladder_wood.png^carts_rail_straight.png^cottages_rope.png"}, + inventory_image = "default_ladder_wood.png", + wield_image = "default_ladder_wood.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + }, + groups = {choppy=2,oddly_breakable_by_hand=3,rail=1,connect_to_raillike=1}, --connect_to_raillike=minetest.raillike_group("rail")}, + legacy_wallmounted = true, + sounds = cottages.sounds.wood, +}) + + + +minetest.register_craft({ + output = "cottages:ladder_with_rope_and_rail 3", + recipe = { + {"default:ladder","cottages:rope", "default:rail"} + } +}) diff --git a/mods/cottages/nodes_pitchfork.lua b/mods/cottages/nodes_pitchfork.lua new file mode 100644 index 00000000..8e0cad9c --- /dev/null +++ b/mods/cottages/nodes_pitchfork.lua @@ -0,0 +1,114 @@ + +local S = cottages.S + +-- fast tool for digging nodes with the group "hay"; +-- can also be placed as a node + +-- the straw node from default and similar nodes can be digged with the pitchfork as well +local add_hay_group = {"farming:straw", "dryplants:reed", "darkage:straw_bale"} +for i, v in ipairs(add_hay_group) do + if( minetest.registered_items[v]) then + new_groups = minetest.registered_items[v].groups + new_groups.hay = 3 + minetest.override_item(v, {groups = new_groups}) + end +end + +-- creates hay when digging dirt_with_grass (thanks to the override above); +-- useful for digging hay and straw +-- can be placed as a node +minetest.register_tool("cottages:pitchfork", { + description = S("pitchfork (dig dirt with grass to get hay, place with right-click)"), + groups = {}, + inventory_image = "cottages_pitchfork.png", + wield_image = "cottages_pitchfork.png^[transformFYR180", + wield_scale = {x=1.5,y=1.5,z=0.5}, + stack_max = 1, + liquids_pointable = false, + -- very useful for digging hay, straw and bales of those materials + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + fleshy={times={[2]=0.80, [3]=0.40}, maxlevel=1, uses=1/0.002 }, + snappy={times={[2]=0.80, [3]=0.40}, maxlevel=1, uses=1/0.002 }, + hay ={times={[2]=0.10, [3]=0.10}, maxlevel=1, uses=1/0.002 }, + }, + damage_groups = {fleshy=5}, -- slightly stronger than a stone sword + }, + sound = {breaks = "default_tool_breaks"}, + -- place the pitchfork somewhere + on_place = function(itemstack, placer, pointed_thing) + if( placer == nil or pointed_thing == nil or pointed_thing.type ~= "node") then + return nil + end + local pos = minetest.get_pointed_thing_position( pointed_thing, 1 ) + local node = minetest.get_node_or_nil( pos ) + if( node == nil or not(node.name) or node.name ~= "air") then + return nil + end + if minetest.is_protected(pos, placer:get_player_name()) then + return nil + end + minetest.rotate_and_place(ItemStack("cottages:pitchfork_placed"), placer, pointed_thing) + -- did the placing succeed? + local nnode = minetest.get_node(pos) + if( not(nnode) or not(nnode.name) or nnode.name ~= "cottages:pitchfork_placed") then + return nil + end + local meta = minetest.get_meta(pos) + meta:set_int( "wear", itemstack:get_wear()) + meta:set_string("infotext", S("pitchfork (for hay and straw)")) + -- the tool has been placed; consume it + return ItemStack("") + end, +}) + + +-- a ptichfork placed somewhere +minetest.register_node("cottages:pitchfork_placed", { + description = S("pitchfork (for hay and straw)"), + tiles = {"default_wood.png^[transformR90"}, --default_tree.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {snappy = 2, dig_immediate = 3, falling_node = 1, attached_node = 1, not_in_creative_inventory=1}, + sounds = cottages.sounds.wood, + node_box = { + type = "fixed", + fixed = { + -- handle (goes a bit into the ground) + { -(1/32), -(11/16), -(1/32), (1/32), 16/16, (1/32)}, + -- middle connection + { -(7/32), -(4/16), -(1/32), (7/32), -(2/16), (1/32)}, + -- thongs + { -(7/32), -(11/16), -(1/32), -(5/32), -(4/16), (1/32)}, + { (5/32), -(11/16), -(1/32), (7/32), -(4/16), (1/32)}, + }, + }, + selection_box = { + type = "fixed", + fixed = { -0.3, -0.5, -0.1, 0.3, 1.0, 0.1 } + }, + drop = "cottages:pitchfork", + -- perserve wear + preserve_metadata = function(pos, oldnode, oldmeta, drops) + if(oldmeta["wear"]) then + -- the first drop is the pitchfork + drops[1]:set_wear(oldmeta["wear"]) + end + end, +}) + +-- +-- craft recipes +-- +minetest.register_craft({ + output = 'cottages:pitchfork', + recipe = { + { 'default:stick','default:stick','default:stick' }, + { '','default:stick', '' }, + { '','default:stick','' }, + } +}) diff --git a/mods/cottages/nodes_roof.lua b/mods/cottages/nodes_roof.lua new file mode 100644 index 00000000..240f94ff --- /dev/null +++ b/mods/cottages/nodes_roof.lua @@ -0,0 +1,230 @@ +-- Boilerplate to support localized strings if intllib mod is installed. +local S = cottages.S + +--------------------------------------------------------------------------------------- +-- roof parts +--------------------------------------------------------------------------------------- +-- a better roof than the normal stairs; can be replaced by stairs:stair_wood + + +-- create the three basic roof parts plus receipes for them; +cottages.register_roof = function( name, tiles, basic_material, homedecor_alternative ) + + minetest.register_node("cottages:roof_"..name, { + description = S("Roof "..name), + drawtype = "nodebox", + --tiles = {cottages.textures_roof_wood,cottages.texture_roof_sides,cottages.texture_roof_sides,cottages.texture_roof_sides,cottages.texture_roof_sides,cottages.textures_roof_wood}, + tiles = tiles, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + is_ground_content = false, + }) + + -- a better roof than the normal stairs; this one is for usage directly on top of walls (it has the form of a stair) + if( name~="straw" or not(minetest.registered_nodes["stairs:stair_straw"]) or not(cottages.use_farming_straw_stairs)) then + minetest.register_node("cottages:roof_connector_"..name, { + description = S("Roof connector "..name), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + tiles = tiles, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + is_ground_content = false, + }) + else + minetest.register_alias("cottages:roof_connector_straw", "stairs:stair_straw") + end + + -- this one is the slab version of the above roof + if( name~="straw" or not(minetest.registered_nodes["stairs:slab_straw"]) or not(cottages.use_farming_straw_stairs)) then + minetest.register_node("cottages:roof_flat_"..name, { + description = S("Roof (flat) "..name), + drawtype = "nodebox", + -- top, bottom, side1, side2, inner, outer + -- this one is from all sides - except from the underside - of the given material + tiles = { tiles[1], tiles[2], tiles[1], tiles[1], tiles[1], tiles[1] }; + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + }, + is_ground_content = false, + }) + else + minetest.register_alias("cottages:roof_flat_straw", "stairs:slab_straw") + end + + + if( not( homedecor_alternative ) + or ( minetest.get_modpath("homedecor") ~= nil )) then + + minetest.register_craft({ + output = "cottages:roof_"..name.." 6", + recipe = { + {'', '', basic_material }, + {'', basic_material, '' }, + {basic_material, '', '' } + } + }) + end + + -- make those roof parts that use homedecor craftable without that mod + if( homedecor_alternative ) then + basic_material = 'cottages:roof_wood'; + + minetest.register_craft({ + output = "cottages:roof_"..name.." 3", + recipe = { + {homedecor_alternative, '', basic_material }, + {'', basic_material, '' }, + {basic_material, '', '' } + } + }) + end + + + minetest.register_craft({ + output = "cottages:roof_connector_"..name, + recipe = { + {'cottages:roof_'..name }, + {cottages.craftitem_wood }, + } + }) + + minetest.register_craft({ + output = "cottages:roof_flat_"..name..' 2', + recipe = { + {'cottages:roof_'..name, 'cottages:roof_'..name }, + } + }) + + -- convert flat roofs back to normal roofs + minetest.register_craft({ + output = "cottages:roof_"..name, + recipe = { + {"cottages:roof_flat_"..name, "cottages:roof_flat_"..name } + } + }) + +end -- of cottages.register_roof( name, tiles, basic_material ) + + + + +--------------------------------------------------------------------------------------- +-- add the diffrent roof types +--------------------------------------------------------------------------------------- +cottages.register_roof( 'straw', + {cottages.straw_texture, cottages.straw_texture, + cottages.straw_texture, cottages.straw_texture, + cottages.straw_texture, cottages.straw_texture}, + 'cottages:straw_mat', nil ); +cottages.register_roof( 'reet', + {"cottages_reet.png","cottages_reet.png", + "cottages_reet.png","cottages_reet.png", + "cottages_reet.png","cottages_reet.png"}, + cottages.craftitem_papyrus, nil ); +cottages.register_roof( 'wood', + {cottages.textures_roof_wood, cottages.texture_roof_sides, + cottages.texture_roof_sides, cottages.texture_roof_sides, + cottages.texture_roof_sides, cottages.textures_roof_wood}, + cottages.craftitem_wood, nil); +cottages.register_roof( 'black', + {"cottages_homedecor_shingles_asphalt.png", cottages.texture_roof_sides, + cottages.texture_roof_sides, cottages.texture_roof_sides, + cottages.texture_roof_sides, "cottages_homedecor_shingles_asphalt.png"}, + 'homedecor:shingles_asphalt', cottages.craftitem_coal_lump); +cottages.register_roof( 'red', + {"cottages_homedecor_shingles_terracotta.png", cottages.texture_roof_sides, + cottages.texture_roof_sides, cottages.texture_roof_sides, + cottages.texture_roof_sides, "cottages_homedecor_shingles_terracotta.png"}, + 'homedecor:shingles_terracotta', cottages.craftitem_clay_brick); +cottages.register_roof( 'brown', + {"cottages_homedecor_shingles_wood.png", cottages.texture_roof_sides, + cottages.texture_roof_sides, cottages.texture_roof_sides, + cottages.texture_roof_sides, "cottages_homedecor_shingles_wood.png"}, + 'homedecor:shingles_wood', cottages.craftitem_dirt); +cottages.register_roof( 'slate', + {"cottages_slate.png", cottages.texture_roof_sides, + "cottages_slate.png", "cottages_slate.png", + cottages.texture_roof_sides,"cottages_slate.png"}, + cottages.craftitem_stone, nil); + + +--------------------------------------------------------------------------------------- +-- slate roofs are sometimes on vertical fronts of houses +--------------------------------------------------------------------------------------- +minetest.register_node("cottages:slate_vertical", { + description = S("Vertical Slate"), + tiles = {"cottages_slate.png",cottages.texture_roof_sides,"cottages_slate.png","cottages_slate.png",cottages.texture_roof_sides,"cottages_slate.png"}, + paramtype2 = "facedir", + groups = {cracky=2, stone=1}, + sounds = cottages.sounds.stone, + is_ground_content = false, +}) + + +minetest.register_craft({ + output = "cottages:slate_vertical", + recipe = { {cottages.craftitem_stone, cottages.craftitem_wood, '' } + } +}); + +--------------------------------------------------------------------------------------- +-- Reed might also be needed as a full block +--------------------------------------------------------------------------------------- +minetest.register_node("cottages:reet", { + description = S("Reet for thatching"), + tiles = {"cottages_reet.png"}, + groups = {hay = 3, snappy=3,choppy=3,oddly_breakable_by_hand=3,flammable=3}, + sounds = cottages.sounds.leaves, + is_ground_content = false, +}) + + +minetest.register_craft({ + output = "cottages:reet", + recipe = { {cottages.craftitem_papyrus,cottages.craftitem_papyrus}, + {cottages.craftitem_papyrus,cottages.craftitem_papyrus}, + }, +}) diff --git a/mods/cottages/nodes_straw.lua b/mods/cottages/nodes_straw.lua new file mode 100644 index 00000000..d26f6b81 --- /dev/null +++ b/mods/cottages/nodes_straw.lua @@ -0,0 +1,585 @@ +--------------------------------------------------------------------------------------- +-- straw - a very basic material +--------------------------------------------------------------------------------------- +-- * straw mat - for animals and very poor NPC; also basis for other straw things +-- * straw bale - well, just a good source for building and decoration + +local S = cottages.S + + +-- an even simpler from of bed - usually for animals +-- it is a nodebox and not wallmounted because that makes it easier to replace beds with straw mats +minetest.register_node("cottages:straw_mat", { + description = S("layer of straw"), + drawtype = 'nodebox', + tiles = { cottages.straw_texture }, -- done by VanessaE + wield_image = cottages.straw_texture, + inventory_image = cottages.straw_texture, + sunlight_propagates = true, + paramtype = 'light', + paramtype2 = "facedir", + walkable = false, + groups = { hay = 3, snappy = 2, oddly_breakable_by_hand = 2, flammable=3 }, + sounds = cottages.sounds.leaves, + node_box = { + type = "fixed", + fixed = { + {-0.48, -0.5,-0.48, 0.48, -0.45, 0.48}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.48, -0.5,-0.48, 0.48, -0.25, 0.48}, + } + }, + is_ground_content = false, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + return cottages.sleep_in_bed( pos, node, clicker, itemstack, pointed_thing ); + end +}) + +-- straw bales are a must for farming environments; if you for some reason do not have the darkage mod installed, this here gets you a straw bale +minetest.register_node("cottages:straw_bale", { + drawtype = "nodebox", + description = S("straw bale"), + tiles = {"cottages_darkage_straw_bale.png"}, + paramtype = "light", + groups = { hay = 3, snappy = 2, oddly_breakable_by_hand = 2, flammable=3 }, + sounds = cottages.sounds.leaves, + -- the bale is slightly smaller than a full node + node_box = { + type = "fixed", + fixed = { + {-0.45, -0.5,-0.45, 0.45, 0.45, 0.45}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.45, -0.5,-0.45, 0.45, 0.45, 0.45}, + } + }, + is_ground_content = false, +}) + +-- just straw +if( not(minetest.registered_nodes["farming:straw"])) then + minetest.register_node("cottages:straw", { + drawtype = "normal", + description = S("straw"), + tiles = {cottages.straw_texture}, + groups = { hay = 3, snappy = 2, oddly_breakable_by_hand = 2, flammable=3 }, + sounds = cottages.sounds.leaves, + -- the bale is slightly smaller than a full node + is_ground_content = false, + }) +else + minetest.register_alias("cottages:straw", "farming:straw") +end + + +local cottages_formspec_treshing_floor = + "size[8,8]".. + "image[1.5,0;1,1;"..cottages.texture_stick.."]".. + "image[0,1;1,1;farming_wheat.png]".. + "button_exit[6.8,0.0;1.5,0.5;public;"..S("Public?").."]".. + "list[current_name;harvest;1,1;2,1;]".. + "list[current_name;straw;5,0;2,2;]".. + "list[current_name;seeds;5,2;2,2;]".. + "label[1,0.5;"..S("Harvested wheat:").."]".. + "label[4,0.0;"..S("Straw:").."]".. + "label[4,2.0;"..S("Seeds:").."]".. + "label[0,-0.5;"..S("Threshing floor").."]".. + "label[0,2.5;"..S("Punch threshing floor with a stick").."]".. + "label[0,3.0;"..S("to get straw and seeds from wheat.").."]".. + "list[current_player;main;0,4;8,4;]"; + +minetest.register_node("cottages:threshing_floor", { + drawtype = "nodebox", + description = S("threshing floor"), +-- TODO: stone also looks pretty well for this + tiles = {"cottages_junglewood.png^farming_wheat.png","cottages_junglewood.png","cottages_junglewood.png^"..cottages.texture_stick}, + paramtype = "light", + paramtype2 = "facedir", + -- can be digged with axe and pick + groups = {cracky=2, choppy=2}, + is_ground_content = false, + node_box = { + type = "fixed", + fixed = { + {-0.50, -0.5,-0.50, 0.50, -0.40, 0.50}, + + {-0.50, -0.4,-0.50,-0.45, -0.20, 0.50}, + { 0.45, -0.4,-0.50, 0.50, -0.20, 0.50}, + + {-0.45, -0.4,-0.50, 0.45, -0.20,-0.45}, + {-0.45, -0.4, 0.45, 0.45, -0.20, 0.50}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.50, -0.5,-0.50, 0.50, -0.20, 0.50}, + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos); + meta:set_string("infotext", S("Public threshing floor")); + local inv = meta:get_inventory(); + inv:set_size("harvest", 2); + inv:set_size("straw", 4); + inv:set_size("seeds", 4); + meta:set_string("formspec", cottages_formspec_treshing_floor ); + meta:set_string("public", "public") + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos); + meta:set_string("owner", placer:get_player_name() or ""); + meta:set_string("infotext", S("Private threshing floor (owned by %s)"):format(meta:get_string("owner") or "")); + meta:set_string("formspec", + cottages_formspec_treshing_floor.. + "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string("owner") or "").."]" ); + meta:set_string("public", "private") + end, + + on_receive_fields = function(pos, formname, fields, sender) + cottages.switch_public(pos, formname, fields, sender, 'threshing floor') + end, + + can_dig = function(pos,player) + + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory(); + local owner = meta:get_string('owner'); + + if( not( inv:is_empty("harvest")) + or not( inv:is_empty("straw")) + or not( inv:is_empty("seeds")) + or not( player ) + or ( owner and owner ~= '' and player:get_player_name() ~= owner )) then + + return false; + end + return true; + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if( not( cottages.player_can_use( meta, player ))) then + return 0 + end + return count; + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + -- only accept input the threshing floor can use/process + if( listname=='straw' + or listname=='seeds' + or (listname=='harvest' and stack and stack:get_name() ~= 'farming:wheat' )) then + return 0; + end + + if( not( cottages.player_can_use( meta, player ))) then + return 0 + end + return stack:get_count() + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if( not( cottages.player_can_use( meta, player ))) then + return 0 + end + return stack:get_count() + end, + + + on_punch = function(pos, node, puncher) + if( not( pos ) or not( node ) or not( puncher )) then + return; + end + -- only punching with a normal stick is supposed to work + local wielded = puncher:get_wielded_item(); + if( not( wielded ) + or not( wielded:get_name() ) + or not( minetest.registered_items[ wielded:get_name() ]) + or not( minetest.registered_items[ wielded:get_name() ].groups ) + or not( minetest.registered_items[ wielded:get_name() ].groups.stick )) then + return; + end + local name = puncher:get_player_name(); + + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory(); + + local input = inv:get_list('harvest'); + -- we have two input slots + local stack1 = inv:get_stack( 'harvest', 1); + local stack2 = inv:get_stack( 'harvest', 2); + + if( ( stack1:is_empty() and stack2:is_empty()) + or( not( stack1:is_empty()) and stack1:get_name() ~= 'farming:wheat') + or( not( stack2:is_empty()) and stack2:get_name() ~= 'farming:wheat')) then + +-- minetest.chat_send_player( name, 'One of the input slots contains something else than wheat, or there is no wheat at all.'); + -- update the formspec + meta:set_string("formspec", + cottages_formspec_treshing_floor.. + "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string("owner") or "").."]" ); + return; + end + + -- on average, process 25 wheat at each punch (10..40 are possible) + local anz_wheat = 10 + math.random( 0, 30 ); + -- we already made sure there is only wheat inside + local found_wheat = stack1:get_count() + stack2:get_count(); + + -- do not process more wheat than present in the input slots + if( found_wheat < anz_wheat ) then + anz_wheat = found_wheat; + end + + local overlay1 = "^farming_wheat.png"; + local overlay2 = "^"..cottages.straw_texture; + local overlay3 = "^"..cottages.texture_wheat_seed; + + -- this can be enlarged by a multiplicator if desired + local anz_straw = anz_wheat; + local anz_seeds = anz_wheat; + + if( inv:room_for_item('straw','cottages:straw_mat '..tostring( anz_straw )) + and inv:room_for_item('seeds',cottages.craftitem_seed_wheat..' '..tostring( anz_seeds ))) then + + -- the player gets two kind of output + inv:add_item("straw",'cottages:straw_mat '..tostring( anz_straw )); + inv:add_item("seeds",cottages.craftitem_seed_wheat..' '..tostring( anz_seeds )); + -- consume the wheat + inv:remove_item("harvest", 'farming:wheat '..tostring( anz_wheat )); + + local anz_left = found_wheat - anz_wheat; + if( anz_left > 0 ) then +-- minetest.chat_send_player( name, S('You have threshed %s wheat (%s are left).'):format(anz_wheat,anz_left)); + else +-- minetest.chat_send_player( name, S('You have threshed the last %s wheat.'):format(anz_wheat)); + overlay1 = ""; + end + end + + local hud0 = puncher:hud_add({ + hud_elem_type = "image", + scale = {x = 38, y = 38}, + text = "cottages_junglewood.png^[colorize:#888888:128", + position = {x = 0.5, y = 0.5}, + alignment = {x = 0, y = 0} + }); + + local hud1 = puncher:hud_add({ + hud_elem_type = "image", + scale = {x = 15, y = 15}, + text = "cottages_junglewood.png"..overlay1, + position = {x = 0.4, y = 0.5}, + alignment = {x = 0, y = 0} + }); + local hud2 = puncher:hud_add({ + hud_elem_type = "image", + scale = {x = 15, y = 15}, + text = "cottages_junglewood.png"..overlay2, + position = {x = 0.6, y = 0.35}, + alignment = {x = 0, y = 0} + }); + local hud3 = puncher:hud_add({ + hud_elem_type = "image", + scale = {x = 15, y = 15}, + text = "cottages_junglewood.png"..overlay3, + position = {x = 0.6, y = 0.65}, + alignment = {x = 0, y = 0} + }); + + local hud4 = puncher:hud_add({ + hud_elem_type = "text", + text = tostring( found_wheat-anz_wheat ), + number = 0x00CC00, + alignment = {x = 0, y = 0}, + scale = {x = 100, y = 100}, -- bounding rectangle of the text + position = {x = 0.4, y = 0.5}, + }); + if( not( anz_straw )) then + anz_straw = "0"; + end + if( not( anz_seed )) then + anz_seed = "0"; + end + local hud5 = puncher:hud_add({ + hud_elem_type = "text", + text = '+ '..tostring( anz_straw )..' straw', + number = 0x00CC00, + alignment = {x = 0, y = 0}, + scale = {x = 100, y = 100}, -- bounding rectangle of the text + position = {x = 0.6, y = 0.35}, + }); + local hud6 = puncher:hud_add({ + hud_elem_type = "text", + text = '+ '..tostring( anz_seed )..' seeds', + number = 0x00CC00, + alignment = {x = 0, y = 0}, + scale = {x = 100, y = 100}, -- bounding rectangle of the text + position = {x = 0.6, y = 0.65}, + }); + + + + minetest.after(2, function() + if( puncher ) then + puncher:hud_remove(hud1); + puncher:hud_remove(hud2); + puncher:hud_remove(hud3); + puncher:hud_remove(hud4); + puncher:hud_remove(hud5); + puncher:hud_remove(hud6); + puncher:hud_remove(hud0); + end + end) + end, +}) + + +local cottages_handmill_formspec = "size[8,8]".. + "image[0,1;1,1;"..cottages.texture_wheat_seed.."]".. + "button_exit[6.0,0.0;1.5,0.5;public;"..S("Public?").."]".. + "list[current_name;seeds;1,1;1,1;]".. + "list[current_name;flour;5,1;2,2;]".. + "label[0,0.5;"..S("Wheat seeds:").."]".. + "label[4,0.5;"..S("Flour:").."]".. + "label[0,-0.3;"..S("Mill").."]".. + "label[0,2.5;"..S("Punch this hand-driven mill").."]".. + "label[0,3.0;"..S("to convert wheat seeds into flour.").."]".. + "list[current_player;main;0,4;8,4;]"; + +minetest.register_node("cottages:handmill", { + description = S("mill, powered by punching"), + drawtype = "mesh", + mesh = "cottages_handmill.obj", + tiles = {"cottages_stone.png"}, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = { + {-0.50, -0.5,-0.50, 0.50, 0.25, 0.50}, + } + }, + collision_box = { + type = "fixed", + fixed = { + {-0.50, -0.5,-0.50, 0.50, 0.25, 0.50}, + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos); + meta:set_string("infotext", S("Public mill, powered by punching")); + local inv = meta:get_inventory(); + inv:set_size("seeds", 1); + inv:set_size("flour", 4); + meta:set_string("formspec", cottages_handmill_formspec ); + meta:set_string("public", "public") + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos); + meta:set_string("owner", placer:get_player_name() or ""); + meta:set_string("infotext", S("Private mill, powered by punching (owned by %s)"):format(meta:get_string("owner") or "")); + meta:set_string("formspec", + cottages_handmill_formspec.. + "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]" ); + meta:set_string("public", "private") + end, + + on_receive_fields = function(pos, formname, fields, sender) + cottages.switch_public(pos, formname, fields, sender, 'mill, powered by punching') + end, + + can_dig = function(pos,player) + + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory(); + local owner = meta:get_string('owner'); + + if( not( inv:is_empty("flour")) + or not( inv:is_empty("seeds")) + or not( player ) + or ( owner and owner ~= '' and player:get_player_name() ~= owner )) then + + return false; + end + return true; + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if( not( cottages.player_can_use( meta, player ))) then + return 0 + end + return count; + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + -- only accept input the threshing floor can use/process + if( listname=='flour' + or (listname=='seeds' and stack and not( cottages.handmill_product[ stack:get_name()] ))) then + return 0; + end + + if( not( cottages.player_can_use( meta, player ))) then + return 0 + end + return stack:get_count() + end, + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if( not( cottages.player_can_use( meta, player ))) then + return 0 + end + return stack:get_count() + end, + + -- this code is very similar to the threshing floor; except that it has only one input- and output-slot + -- and does not require the usage of a stick + on_punch = function(pos, node, puncher) + if( not( pos ) or not( node ) or not( puncher )) then + return; + end + local name = puncher:get_player_name(); + + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory(); + + local input = inv:get_list('seeds'); + local stack1 = inv:get_stack( 'seeds', 1); + + if( ( stack1:is_empty()) + or( not( stack1:is_empty()) + and not( cottages.handmill_product[ stack1:get_name() ] ))) then + + if not( stack1:is_empty() ) then + minetest.chat_send_player(name,"Nothing happens...") + end + -- update the formspec + meta:set_string("formspec", + cottages_handmill_formspec.. + "label[2.5,-0.5;"..S("Owner: %s"):format(meta:get_string('owner') or "").."]" ); + return; + end + + -- turning the mill is a slow process; 1-21 flour are generated per turn + local anz = 1 + math.random( cottages.handmill_min_per_turn, cottages.handmill_max_per_turn ); + -- we already made sure there is only wheat inside + local found = stack1:get_count(); + + -- do not process more wheat than present in the input slots + if( found < anz ) then + anz = found; + end + + local product_stack = ItemStack( cottages.handmill_product[ stack1:get_name() ]); + local anz_result = anz; + -- items that produce more + if( product_stack:get_count()> 1 ) then + anz_result = anz * product_stack:get_count(); + end + + if( inv:room_for_item('flour', product_stack:get_name()..' '..tostring( anz_result ))) then + + inv:add_item( 'flour', product_stack:get_name()..' '..tostring( anz_result )); + inv:remove_item( 'seeds', stack1:get_name()..' '..tostring( anz )); + + local anz_left = found - anz; + if( anz_left > 0 ) then + minetest.chat_send_player( name, S('You have ground a %s (%s are left).'):format(stack1:get_definition().description,(anz_left))); + else + minetest.chat_send_player( name, S('You have ground the last %s.'):format(stack1:get_definition().description)); + end + + -- if the version of MT is recent enough, rotate the mill a bit + if( minetest.swap_node ) then + node.param2 = node.param2 + 1; + if( node.param2 > 3 ) then + node.param2 = 0; + end + minetest.swap_node( pos, node ); + end + end + end, +}) + + + + +--------------------------------------------------------------------------------------- +-- crafting receipes +--------------------------------------------------------------------------------------- +-- this returns corn as well +-- the replacements work only if the replaced slot gets empty... +minetest.register_craft({ + output = "cottages:straw_mat 6", + recipe = { + {cottages.craftitem_stone,'',''}, + {"farming:wheat", "farming:wheat", "farming:wheat", }, + }, + replacements = {{ cottages.craftitem_stone, cottages.craftitem_seed_wheat.." 3" }}, +}) + +-- this is a better way to get straw mats +minetest.register_craft({ + output = "cottages:threshing_floor", + recipe = { + {cottages.craftitem_junglewood, cottages.craftitem_chest_locked, cottages.craftitem_junglewood, }, + {cottages.craftitem_junglewood, cottages.craftitem_stone, cottages.craftitem_junglewood, }, + }, +}) + +-- and a way to turn wheat seeds into flour +minetest.register_craft({ + output = "cottages:handmill", + recipe = { + {cottages.craftitem_stick, cottages.craftitem_stone, "", }, + {"", cottages.craftitem_steel, "", }, + {"", cottages.craftitem_stone, "", }, + }, +}) + +minetest.register_craft({ + output = "cottages:straw_bale", + recipe = { + {"cottages:straw_mat"}, + {"cottages:straw_mat"}, + {"cottages:straw_mat"}, + }, +}) + +minetest.register_craft({ + output = "cottages:straw", + recipe = { + {"cottages:straw_bale"}, + }, +}) + +minetest.register_craft({ + output = "cottages:straw_bale", + recipe = { + {"cottages:straw"}, + }, +}) + +minetest.register_craft({ + output = "cottages:straw_mat 3", + recipe = { + {"cottages:straw_bale"}, + }, +}) diff --git a/mods/cottages/nodes_water.lua b/mods/cottages/nodes_water.lua new file mode 100644 index 00000000..44e41192 --- /dev/null +++ b/mods/cottages/nodes_water.lua @@ -0,0 +1,314 @@ + +-- TODO: play sound while working +-- TODO: play sound when emptying a bucket +-- TODO: store correct bucket texture when loading the world anew +-- TODO: show particles when running? distinguish between running/idle state? (with punch?) + +-- well for getting water +-- * has some storage space for buckets (filled with water, river water or empty) +-- * only the owner can use the bucket store and the well +-- * the bucket will be added as an entity and slowly rotate; +-- once filled, the texture of the bucket is changed +-- * full (water or river water) buckets can be emptied +-- * by default public; but can also be made private + + +-- how many seconds does it take to fill a bucket? +cottages.water_fill_time = 10 + +local S = cottages.S + +-- code taken from the itemframes mod in homedecor +-- (the relevant functions are sadly private there and thus cannot be reused) +local tmp = {} +minetest.register_entity("cottages:bucket_entity",{ + hp_max = 1, + visual="wielditem", + visual_size={x = 0.33, y = 0.33}, + collisionbox = {0, 0, 0, 0, 0, 0}, + physical = false, + textures = {"air"}, + on_activate = function(self, staticdata) + if tmp.nodename ~= nil and tmp.texture ~= nil then + self.nodename = tmp.nodename + tmp.nodename = nil + self.texture = tmp.texture + tmp.texture = nil + else + if staticdata ~= nil 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 + end + if self.texture ~= nil then + self.object:set_properties({textures = {self.texture}}) + end + self.object:set_properties({automatic_rotate = 1}) + if self.texture ~= nil and self.nodename ~= nil then + local entity_pos = vector.round(self.object:get_pos()) + local objs = minetest.get_objects_inside_radius(entity_pos, 0.5) + for _, obj in ipairs(objs) do + if obj ~= self.object and + obj:get_luaentity() and + obj:get_luaentity().name == "cottages:bucket_entity" and + obj:get_luaentity().nodename == self.nodename and + obj:get_properties() and + obj:get_properties().textures and + obj:get_properties().textures[1] == self.texture then + minetest.log("action","[cottages] Removing extra " .. + self.texture .. " found in " .. self.nodename .. " at " .. + minetest.pos_to_string(entity_pos)) + self.object:remove() + break + end + end + end + end, + get_staticdata = function(self) + if self.nodename ~= nil and self.texture ~= nil then + return self.nodename .. ';' .. self.texture + end + return "" + end, +}) + +cottages.water_gen_fill_bucket = function(pos) + if( not(pos)) then + return + end + local meta = minetest.get_meta(pos) + local bucket = meta:get_string("bucket") + -- nothing to do + if( not(bucket) or bucket ~= "bucket:bucket_empty") then + return + end + -- abort if the water has not been running long enough + -- (the player may have removed a bucket before it was full) + start = meta:get_string("fillstarttime") + if( (minetest.get_us_time()/1000000) - tonumber(start) < cottages.water_fill_time -2) then + return + end + + -- the bucket has been filled + meta:set_string("bucket", "bucket:bucket_river_water") + + -- change the texture of the bucket to that of one filled with river water + local objs = nil + objs = minetest.get_objects_inside_radius(pos, .5) + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "cottages:bucket_entity" then + obj:set_properties( { textures = { "bucket:bucket_river_water" }}) + obj:get_luaentity().nodename = "bucket:bucket_river_water" + obj:get_luaentity().texture = "bucket:bucket_river_water" + end + end + end +end + + +minetest.register_node("cottages:water_gen", { + description = "Tree Trunk Well", + tiles = {"default_tree_top.png", "default_tree.png^[transformR90", "default_tree.png^[transformR90"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = cottages.sounds.wood, + node_box = { + type = "fixed", + fixed = { + -- floor of water bassin + {-0.5, -0.5+(3/16), -0.5, 0.5, -0.5+(4/16), 0.5}, + -- walls + {-0.5, -0.5+(3/16), -0.5, 0.5, (4/16), -0.5+(2/16)}, + {-0.5, -0.5+(3/16), -0.5, -0.5+(2/16), (4/16), 0.5}, + { 0.5, -0.5+(3/16), 0.5, 0.5-(2/16), (4/16), -0.5}, + { 0.5, -0.5+(3/16), 0.5, -0.5+(2/16), (4/16), 0.5-(2/16)}, + -- feet + {-0.5+(3/16), -0.5, -0.5+(3/16), -0.5+(6/16), -0.5+(3/16), 0.5-(3/16)}, + { 0.5-(3/16), -0.5, -0.5+(3/16), 0.5-(6/16), -0.5+(3/16), 0.5-(3/16)}, + -- real pump + { 0.5-(4/16), -0.5, -(2/16), 0.5, 0.5+(4/16), (2/16)}, + -- water pipe inside wooden stem + { 0.5-(8/16), 0.5+(1/16), -(1/16), 0.5, 0.5+(3/16), (1/16)}, + -- where the water comes out + { 0.5-(15/32), 0.5, -(1/32), 0.5-(12/32), 0.5+(1/16), (1/32)}, + }, + }, + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5+(4/16), 0.5 } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local spos = pos.x .. "," .. pos.y .. "," .. pos.z + meta:set_string("formspec", + "size[8,9]" .. + "label[3.0,0.0;Tree trunk well]".. + "label[1.5,0.7;Punch the well while wielding an empty bucket.]".. + "label[1.5,1.0;Your bucket will slowly be filled with river water.]".. + "label[1.5,1.3;Punch again to get the bucket back when it is full.]".. + "label[1.0,2.9;Internal bucket storage (passive storage only):]".. + "item_image[0.2,0.7;1.0,1.0;bucket:bucket_empty]".. + "item_image[0.2,1.7;1.0,1.0;bucket:bucket_river_water]".. + "label[1.5,1.9;Punch well with full water bucket in order to empty bucket.]".. + "button_exit[6.0,0.0;2,0.5;public;"..S("Public?").."]".. + "list[nodemeta:" .. spos .. ";main;1,3.3;8,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]") + local inv = meta:get_inventory() + inv:set_size('main', 6) + meta:set_string("infotext", S("Public tree trunk well")) -- (punch with empty bucket to fill bucket)") + end, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", S("Public tree trunk well (owned by %s)"):format(meta:get_string("owner"))) + -- no bucket loaded + meta:set_string("bucket", "") + meta:set_string("public", "public") + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and + default.can_interact_with_node(player, pos) + end, + -- no inventory move allowed + allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + return 0 + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not(stack) or not cottages.player_can_use(meta, player) then + return 0 + end + local inv = meta:get_inventory() + -- only for buckets + local sname = stack:get_name() + if( sname ~= "bucket:bucket_empty" + and sname ~= "bucket:bucket_water" + and sname ~= "bucket:bucket_river_water") then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not(cottages.player_can_use(meta, player)) then + return 0 + end + return stack:get_count() + end, + on_blast = function() end, + on_receive_fields = function(pos, formname, fields, sender) + cottages.switch_public(pos, formname, fields, sender, 'tree trunk well') + end, + -- punch to place and retrieve bucket + on_punch = function(pos, node, puncher) + if( not( pos ) or not( node ) or not( puncher )) then + return + end + -- only the owner can use the well + local name = puncher:get_player_name() + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local public = meta:get_string("public") + if( name ~= owner and public~="public") then + minetest.chat_send_player( name, S("This tree trunk well is owned by %s. You can't use it."):format(name)) + return + end + + -- we will either add or take from the players inventory + local pinv = puncher:get_inventory() + + -- is the well working on something? (either empty or full bucket) + local bucket = meta:get_string("bucket") + -- there is a bucket loaded - either empty or full + if( bucket and bucket~="") then + if( not(pinv:room_for_item("main", bucket))) then + minetest.chat_send_player( puncher:get_player_name(), + S("Sorry. You have no room for the bucket. Please free some ".. + "space in your inventory first!")) + return + end + end + + -- remove the old entity (either a bucket will be placed now or a bucket taken) + local objs = nil + objs = minetest.get_objects_inside_radius(pos, .5) + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "cottages:bucket_entity" then + obj:remove() + end + end + end + + -- the player gets the bucket (either empty or full) into his inventory + if( bucket and bucket ~= "") then + pinv:add_item("main", bucket ) + meta:set_string("bucket", "") + -- we are done + return + end + + -- punching with empty bucket will put that bucket into the well (as an entity) + -- and will slowly fill it + local wielded = puncher:get_wielded_item() + if( wielded + and wielded:get_name() + and wielded:get_name() == "bucket:bucket_empty") then + -- remove the bucket from the players inventory + pinv:remove_item( "main", "bucket:bucket_empty") + -- remember that we got a bucket loaded + meta:set_string("bucket", "bucket:bucket_empty") + -- create the entity + tmp.nodename = "bucket:bucket_empty" + -- TODO: add a special texture with a handle for the bucket here + tmp.texture = "bucket:bucket_empty" + local e = minetest.add_entity({x=pos.x,y=pos.y+(4/16),z=pos.z},"cottages:bucket_entity") + -- fill the bucket with water + minetest.after(cottages.water_fill_time, cottages.water_gen_fill_bucket, pos) + -- the bucket will only be filled if the water ran long enough + meta:set_string("fillstarttime", tostring(minetest.get_us_time()/1000000)) + return; + end + -- buckets can also be emptied here + if( wielded + and wielded:get_name() + and (wielded:get_name() == "bucket:bucket_water" + or wielded:get_name() == "bucket:bucket_river_water") + and (pinv:room_for_item("main", "bucket:bucket_empty"))) then + -- remove the full bucket from the players inventory + pinv:remove_item( "main", wielded:get_name()) + -- add empty bucket + pinv:add_item("main", "bucket:bucket_empty") + -- TODO: play diffrent sound when pouring a bucket + return; + end + + -- else check if there is a bucket that can be retrieved + meta:set_string("bucket","") + end, +}) + + +-- a well (will fill water buckets) crafted from wooden materials +minetest.register_craft({ + output = 'cottages:water_gen', + recipe = { + {'default:stick', '', ''}, + {'default:tree', 'bucket:bucket_empty', 'bucket:bucket_empty'}, + {'default:tree', 'default:tree', 'default:tree'}, + } +}) + diff --git a/mods/cottages/screenshot.jpg b/mods/cottages/screenshot.jpg new file mode 100644 index 00000000..62916daa Binary files /dev/null and b/mods/cottages/screenshot.jpg differ diff --git a/mods/cottages/textures/cottages_barrel.png b/mods/cottages/textures/cottages_barrel.png new file mode 100644 index 00000000..174c5d77 Binary files /dev/null and b/mods/cottages/textures/cottages_barrel.png differ diff --git a/mods/cottages/textures/cottages_beds_bed_side.png b/mods/cottages/textures/cottages_beds_bed_side.png new file mode 100644 index 00000000..c9e79e2a Binary files /dev/null and b/mods/cottages/textures/cottages_beds_bed_side.png differ diff --git a/mods/cottages/textures/cottages_beds_bed_side_top_l.png b/mods/cottages/textures/cottages_beds_bed_side_top_l.png new file mode 100644 index 00000000..4b8dc66d Binary files /dev/null and b/mods/cottages/textures/cottages_beds_bed_side_top_l.png differ diff --git a/mods/cottages/textures/cottages_beds_bed_side_top_r.png b/mods/cottages/textures/cottages_beds_bed_side_top_r.png new file mode 100644 index 00000000..daae624e Binary files /dev/null and b/mods/cottages/textures/cottages_beds_bed_side_top_r.png differ diff --git a/mods/cottages/textures/cottages_beds_bed_top_bottom.png b/mods/cottages/textures/cottages_beds_bed_top_bottom.png new file mode 100644 index 00000000..2639dd2d Binary files /dev/null and b/mods/cottages/textures/cottages_beds_bed_top_bottom.png differ diff --git a/mods/cottages/textures/cottages_beds_bed_top_top.png b/mods/cottages/textures/cottages_beds_bed_top_top.png new file mode 100644 index 00000000..fc46ee19 Binary files /dev/null and b/mods/cottages/textures/cottages_beds_bed_top_top.png differ diff --git a/mods/cottages/textures/cottages_clay.png b/mods/cottages/textures/cottages_clay.png new file mode 100644 index 00000000..76e5a40a Binary files /dev/null and b/mods/cottages/textures/cottages_clay.png differ diff --git a/mods/cottages/textures/cottages_darkage_straw.png b/mods/cottages/textures/cottages_darkage_straw.png new file mode 100644 index 00000000..9817316a Binary files /dev/null and b/mods/cottages/textures/cottages_darkage_straw.png differ diff --git a/mods/cottages/textures/cottages_darkage_straw_bale.png b/mods/cottages/textures/cottages_darkage_straw_bale.png new file mode 100644 index 00000000..f607c2f0 Binary files /dev/null and b/mods/cottages/textures/cottages_darkage_straw_bale.png differ diff --git a/mods/cottages/textures/cottages_feldweg.png b/mods/cottages/textures/cottages_feldweg.png new file mode 100644 index 00000000..65456a82 Binary files /dev/null and b/mods/cottages/textures/cottages_feldweg.png differ diff --git a/mods/cottages/textures/cottages_feldweg_ecke.png b/mods/cottages/textures/cottages_feldweg_ecke.png new file mode 100644 index 00000000..937b7df3 Binary files /dev/null and b/mods/cottages/textures/cottages_feldweg_ecke.png differ diff --git a/mods/cottages/textures/cottages_feldweg_edges.png b/mods/cottages/textures/cottages_feldweg_edges.png new file mode 100644 index 00000000..a81653d8 Binary files /dev/null and b/mods/cottages/textures/cottages_feldweg_edges.png differ diff --git a/mods/cottages/textures/cottages_feldweg_end.png b/mods/cottages/textures/cottages_feldweg_end.png new file mode 100644 index 00000000..81ac09e6 Binary files /dev/null and b/mods/cottages/textures/cottages_feldweg_end.png differ diff --git a/mods/cottages/textures/cottages_feldweg_kreuzung.png b/mods/cottages/textures/cottages_feldweg_kreuzung.png new file mode 100644 index 00000000..d26d94b2 Binary files /dev/null and b/mods/cottages/textures/cottages_feldweg_kreuzung.png differ diff --git a/mods/cottages/textures/cottages_feldweg_surface.png b/mods/cottages/textures/cottages_feldweg_surface.png new file mode 100644 index 00000000..1e9510c4 Binary files /dev/null and b/mods/cottages/textures/cottages_feldweg_surface.png differ diff --git a/mods/cottages/textures/cottages_feldweg_t-kreuzung.png b/mods/cottages/textures/cottages_feldweg_t-kreuzung.png new file mode 100644 index 00000000..e78594ca Binary files /dev/null and b/mods/cottages/textures/cottages_feldweg_t-kreuzung.png differ diff --git a/mods/cottages/textures/cottages_glass_pane.png b/mods/cottages/textures/cottages_glass_pane.png new file mode 100644 index 00000000..f07912ee Binary files /dev/null and b/mods/cottages/textures/cottages_glass_pane.png differ diff --git a/mods/cottages/textures/cottages_homedecor_shingles_asphalt.png b/mods/cottages/textures/cottages_homedecor_shingles_asphalt.png new file mode 100644 index 00000000..057546ce Binary files /dev/null and b/mods/cottages/textures/cottages_homedecor_shingles_asphalt.png differ diff --git a/mods/cottages/textures/cottages_homedecor_shingles_terracotta.png b/mods/cottages/textures/cottages_homedecor_shingles_terracotta.png new file mode 100644 index 00000000..3f42cca5 Binary files /dev/null and b/mods/cottages/textures/cottages_homedecor_shingles_terracotta.png differ diff --git a/mods/cottages/textures/cottages_homedecor_shingles_wood.png b/mods/cottages/textures/cottages_homedecor_shingles_wood.png new file mode 100644 index 00000000..b982747a Binary files /dev/null and b/mods/cottages/textures/cottages_homedecor_shingles_wood.png differ diff --git a/mods/cottages/textures/cottages_junglewood.png b/mods/cottages/textures/cottages_junglewood.png new file mode 100644 index 00000000..2507706d Binary files /dev/null and b/mods/cottages/textures/cottages_junglewood.png differ diff --git a/mods/cottages/textures/cottages_loam.png b/mods/cottages/textures/cottages_loam.png new file mode 100644 index 00000000..bdf058fa Binary files /dev/null and b/mods/cottages/textures/cottages_loam.png differ diff --git a/mods/cottages/textures/cottages_minimal_wood.png b/mods/cottages/textures/cottages_minimal_wood.png new file mode 100644 index 00000000..57c1d7c1 Binary files /dev/null and b/mods/cottages/textures/cottages_minimal_wood.png differ diff --git a/mods/cottages/textures/cottages_pitchfork.png b/mods/cottages/textures/cottages_pitchfork.png new file mode 100644 index 00000000..7253a7a0 Binary files /dev/null and b/mods/cottages/textures/cottages_pitchfork.png differ diff --git a/mods/cottages/textures/cottages_reet.png b/mods/cottages/textures/cottages_reet.png new file mode 100644 index 00000000..67a4bddf Binary files /dev/null and b/mods/cottages/textures/cottages_reet.png differ diff --git a/mods/cottages/textures/cottages_rope.png b/mods/cottages/textures/cottages_rope.png new file mode 100644 index 00000000..0045c4c3 Binary files /dev/null and b/mods/cottages/textures/cottages_rope.png differ diff --git a/mods/cottages/textures/cottages_slate.png b/mods/cottages/textures/cottages_slate.png new file mode 100644 index 00000000..a52f185e Binary files /dev/null and b/mods/cottages/textures/cottages_slate.png differ diff --git a/mods/cottages/textures/cottages_sleepingmat.png b/mods/cottages/textures/cottages_sleepingmat.png new file mode 100644 index 00000000..5721a5b6 Binary files /dev/null and b/mods/cottages/textures/cottages_sleepingmat.png differ diff --git a/mods/cottages/textures/cottages_steel_block.png b/mods/cottages/textures/cottages_steel_block.png new file mode 100644 index 00000000..7f49f61f Binary files /dev/null and b/mods/cottages/textures/cottages_steel_block.png differ diff --git a/mods/cottages/textures/cottages_stone.png b/mods/cottages/textures/cottages_stone.png new file mode 100644 index 00000000..63cb7c4e Binary files /dev/null and b/mods/cottages/textures/cottages_stone.png differ diff --git a/mods/cottages/textures/cottages_wagonwheel.png b/mods/cottages/textures/cottages_wagonwheel.png new file mode 100644 index 00000000..6175bba0 Binary files /dev/null and b/mods/cottages/textures/cottages_wagonwheel.png differ diff --git a/mods/cottages/textures/cottages_wool.png b/mods/cottages/textures/cottages_wool.png new file mode 100644 index 00000000..2bbb9cf6 Binary files /dev/null and b/mods/cottages/textures/cottages_wool.png differ diff --git a/mods/cottages/textures/glooptest_tool_steelhammer.png b/mods/cottages/textures/glooptest_tool_steelhammer.png new file mode 100644 index 00000000..b662a71c Binary files /dev/null and b/mods/cottages/textures/glooptest_tool_steelhammer.png differ diff --git a/mods/display_modpack/LICENSE.txt b/mods/display_modpack/LICENSE.txt new file mode 100644 index 00000000..65c5ca88 --- /dev/null +++ b/mods/display_modpack/LICENSE.txt @@ -0,0 +1,165 @@ + 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. diff --git a/mods/display_modpack/README.md b/mods/display_modpack/README.md new file mode 100644 index 00000000..c37a4696 --- /dev/null +++ b/mods/display_modpack/README.md @@ -0,0 +1,115 @@ +# Display Modpack +Version 1.3.1 + +This modpack provides mods with dynamic display. Mods are : + +- **[display_api](https://github.com/pyrollo/display_modpack/tree/master/display_api)**: A library for adding display entities to nodes; +- **[font_api](https://github.com/pyrollo/display_modpack/tree/master/font_api)**: A library for displaying fonts on entities; +- **[signs_api](https://github.com/pyrollo/display_modpack/tree/master/signs_api)**: A library for the easy creation of signs; +- **[font_metro](https://github.com/pyrollo/display_modpack/tree/master/font_metro)**: A font mod used as default font (includes uppercase, lowercase and accentuated latin letters, usual signs, cyrillic and greek letters) + +- **[boards](https://github.com/pyrollo/display_modpack/tree/master/boards)**: A mod providing school boards (includes *tiny cursive font*, a handwriting style font); +- **[ontime_clocks](https://github.com/pyrollo/display_modpack/tree/master/ontime_clocks)**: A mod providing clocks which display the ingame time; +- **[signs](https://github.com/pyrollo/display_modpack/tree/master/signs)**: A mod providing signs and direction signs displaying text; +- **[signs_road](https://github.com/pyrollo/display_modpack/tree/master/signs_road)**: A mod providing road signs displaying text; +- **[steles](https://github.com/pyrollo/display_modpack/tree/master/steles)**: A mod providing stone steles with text; + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=19365) at the Minetest forums. + +![Presentation image of Display_Modpack](screenshot.png) + +## Extra fonts + +*Metro* and *Tiny Cursive* fonts are provided in **Display Modpack** (in **font_metro** and **boards** mods) but you can add more fonts by installing font mods. Be aware that each font mod comes with numerous textures. This can result in slowing media downloading and/or client display. + +Extra font mods can be found here: + * [OldWizard](https://github.com/pyrollo/font_oldwizard): An old style gothic font. + * [Botic](https://github.com/pyrollo/font_botic): A scifi style font. + +## Deprecation notice (for modders) + +### December 2018 +Following objects are deprecated, shows a warning in log when used: +* `display_modpack_node` group (use `display_api` group instead); +* `display_lib_node` group (use `display_api` group instead); +* `display_lib` global table (use `display_api` global table instead); +* `font_lib` global table (use `font_api` global table instead); + +These objects will be removed in the future. + +## Changelog +### 2019-03-14 (Version 1.3.1) +- __dispay_api__: Display API now detects automatically whenr rotation restrictions have to be applied. +- __sign_api__: Screwdriver behavior changed. Now, left click rotates and changes direction. + +### 2019-03-09 (Version 1.3) +- __display_api__: Display nodes can be rotated in every directions (if running Minetest 5 or above). +- __display_api__: New setting to restrict rotations to Minetest 0.4 abilities (restriction enabled by default). +- __sign_api__: Changed behavior of screwdriver if no rotation restriction. + +### 2018-12-14 (Version 1.2.3) +- __display_api__: New `yaw` attributes, entities can now have different angles with node. +- __font_api__: New `Font:render` method for texture creation +- __font_api__: Specific management for fixed width font. Allows number of columns based texture width. +- __font_api__: Improve `display_api` integration into `font_api`. Display API fully optional. `font_api.on_display_update` defined only if `display_api` enabled. +- __font_api__: Improve management of invalid UTF strings (should not crash anymore) +- __font_api__: Deprecation of `font_lib` +- __signs__: Fixed craft recipe for labels + +### 2018-12-02 (Version 1.2.2) +- Fixed a bug that prevented Display API from working on some systems (Raspberry Pi) + +### 2018-11-01 (Version 1.2.1) +- Now font can be chosen per sign / stele + +### 2018-11-01 (Version 1.2) +- Labels and woodend signs added. +- Fallback mechanism for missing chars (For example: "é" --> "e" --> "E"). +- Several bug fixes by 12Me21 and naturefreshmilk. + +### 2018-07-16 (Version 1.1.1) +- Boards mod added. +- Bug fix in default font chosing when multiple font registered. + +### 2018-07-13 (Version 1.1.0) +- Font API rework introducing Font class. +- Replaced default Epilepsy Font by Metro Font for licensing purposes, +- Rework of all nodes displaying text accordingly to the Font API rework. + +As font_epilepsy mod has been replaced by font_metro mod, **don't forget to activate font_metro mod after updating** or you won't have any text displayed. + +### 2018-05-30 (Version 1.0.1) +Mostly bug fixes : +- Fix steles orientation when placing +- Update entity on mapblock load +- Use default formspec style +- Fix ndef nill value in steles mod when technics not installed +- Seperate signs API from signs définitions +- Allow a greater offset between display and block + +### 2018-01-13 (Version 1.0) +- Switch to Epilepsy font by KREATIVE SOFTWARE +- Add settings "default_font" +- Add horizontal alignment +- Add tool for creating font textures from .ttf font files +- Fix UTF 8 to Unicode decoding +- Updated forum thread link in README.md + +### 2017-12-19 +This change is a preparation to merge Andrzej Pieńkowski fork (apienk) : new font and support of UTF chars. +- Font\_lib support for multiple fonts (nothing yet visible in mods) ; +- Font\_lib support for Unicode characters (limited to Unicode Plane 0: 0000-FFFF, see [Wikipedia](https://en.wikipedia.org/wiki/Unicode)) ; +- New "default" font with original textures from Vanessa Ezekowitz (VanessaE) ; + +### 2017-12-10 +- Compatibility of signs mod with signs_lib (thanks to gpcf) ; +- Added large banner in road signs (thanks to gpcf) ; + +### 2017-08-26 +- Changed signs from wallmounted to facedir to improve textures and make it possible to use screwdriver. +**IMPORTANT** : Map will be updated to change to new nodes but inventory items will turn into "Unknown items" and have to be re-crafted. +- Intllib support added with french translation (whole modpack, thanks to fat115) ; +- Punch on nodes to update entity (signs, signs_road and steles). Usefull in case of /clearobjects ; +- Changed wooden direction sign textures (signs) ; +- Added back and side textures to all signs (road_signs) ; +- Added more sign types : White/yellow/green signs and direction signs (signs_road) ; diff --git a/mods/display_modpack/_config.yml b/mods/display_modpack/_config.yml new file mode 100644 index 00000000..2f7efbea --- /dev/null +++ b/mods/display_modpack/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-minimal \ No newline at end of file diff --git a/mods/display_modpack/boards/LICENSE.txt b/mods/display_modpack/boards/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/display_modpack/boards/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/display_modpack/boards/LICENSE_FONT.txt b/mods/display_modpack/boards/LICENSE_FONT.txt new file mode 100644 index 00000000..29d0f9bf --- /dev/null +++ b/mods/display_modpack/boards/LICENSE_FONT.txt @@ -0,0 +1,4 @@ +The FontStruction “Tiny Cursive” +(https://fontstruct.com/fontstructions/show/63155) by “cyfry77” is licensed +under a Creative Commons Attribution Share Alike license +(http://creativecommons.org/licenses/by-sa/3.0/). diff --git a/mods/display_modpack/boards/copyright.txt b/mods/display_modpack/boards/copyright.txt new file mode 100644 index 00000000..ad83a108 --- /dev/null +++ b/mods/display_modpack/boards/copyright.txt @@ -0,0 +1,2 @@ +Code by Pierre-Yves Rollo (pyrollo) +Font by (cyfry77) diff --git a/mods/display_modpack/boards/depends.txt b/mods/display_modpack/boards/depends.txt new file mode 100644 index 00000000..8c807e3a --- /dev/null +++ b/mods/display_modpack/boards/depends.txt @@ -0,0 +1,2 @@ +default +signs_api diff --git a/mods/display_modpack/boards/font_tinycurs.lua b/mods/display_modpack/boards/font_tinycurs.lua new file mode 100644 index 00000000..a9a323af --- /dev/null +++ b/mods/display_modpack/boards/font_tinycurs.lua @@ -0,0 +1,27 @@ +--[[ + Tinycurs font for Font API + + Original font Tiny Cursive + by cyfry77 + G and J textures by Pierre-Yves Rollo (pyrollo) + released under CC-BY-SA license + + https://fontstruct.com/fontstructions/show/63155/tiny_cursive + + Derivative texture are under CC-BY-SA license + Code is under LGPL v3 license +--]] + +font_api.register_font('tinycurs', + { + default = false, -- Don't register this font as a possible default font + margintop = -2, + marginbottom = -2, + linespacing = -4, + height = 19, + widths = { + [0]=9, [32]=9, [33]=6, [34]=7, [35]=10, [36]=14, [37]=14, [38]=12, [39]=3, [40]=6, [41]=6, [42]=9, [43]=8, [44]=3, [45]=7, [46]=3, [47]=9, [48]=9, [49]=7, [50]=10, [51]=9, [52]=9, [53]=10, [54]=10, [55]=9, [56]=10, [57]=8, [58]=5, [59]=5, [60]=8, [61]=8, [62]=8, [63]=8, [64]=12, [65]=9, [66]=7, [67]=9, [68]=10, [69]=8, [70]=8, [71]=8, [72]=10, [73]=7, [74]=8, [75]=9, [76]=9, [77]=12, [78]=10, [79]=9, [80]=9, [81]=9, [82]=11, [83]=11, [84]=8, [85]=11, [86]=11, [87]=12, [88]=12, [89]=11, [90]=11, [91]=8, [92]=5, [93]=8, [94]=8, [95]=8, [96]=5, [97]=6, [98]=6, [99]=6, [100]=7, [101]=6, [102]=5, [103]=6, [104]=6, [105]=4, [106]=5, [107]=7, [108]=5, [109]=9, [110]=8, [111]=6, [112]=9, [113]=8, [114]=7, [115]=7, [116]=6, [117]=8, [118]=8, [119]=11, [120]=10, [121]=8, [122]=8, [123]=8, [124]=6, [125]=9, [126]=10, [8216]=4, [8217]=4, [8220]=6, [8221]=6 + }, + } +); + diff --git a/mods/display_modpack/boards/init.lua b/mods/display_modpack/boards/init.lua new file mode 100644 index 00000000..4126a6c8 --- /dev/null +++ b/mods/display_modpack/boards/init.lua @@ -0,0 +1,139 @@ +--[[ + boards mod for Minetest. Black boards with text on it. + (c) Pierre-Yves Rollo + + This file is part of boards. + + boards is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + boards is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with boards. If not, see . +--]] + +boards = {} +boards.name = minetest.get_current_modname() +boards.path = minetest.get_modpath(boards.name) + +-- Load support for intllib. +local S, NS = dofile(boards.path.."/intllib.lua") +boards.intllib = S +local F = function(...) return minetest.formspec_escape(S(...)) end + +-- Load font +dofile(boards.path.."/font_tinycurs.lua") + +local function set_formspec(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "size[6,4]"..default.gui_bg..default.gui_bg_img..default.gui_slots.. + "textarea[0.5,0.7;5.5,3;display_text;"..F("Text")..";${display_text}]".. + "button_exit[3,3.5;2,1;ok;"..F("Write").."]".. + "button_exit[1,3.5;2,1;wipe;"..F("Wipe").."]") +end + +-- On boards, everyone is allowed to write and wipe +local function on_receive_fields(pos, formname, fields, player) + if fields then + if fields.ok or fields.key_enter then + signs_api.set_display_text(pos, fields.display_text, fields.font) + end + if fields.wipe then + signs_api.set_display_text(pos, "", fields.font) + end + end +end + +models = { + black_board = { + depth = 1/16, width = 1, height = 1, + entity_fields = { + top = -1/32, + size = { x = 1, y = 15/16 }, + maxlines = 5, + color = "#fff", + font_name = "tinycurs", + valign = "top", + }, + node_fields = { + description = S("Black board"), + tiles = { "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png", + "default_wood.png", "board_black_front.png" }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 7/16, 0.5, 0.5, 0.5}, + {-0.5, -7/16, 6/16, 0.5, -0.5, 7/16} + }, + }, + on_construct = function(pos) + set_formspec(pos) + display_api.on_construct(pos) + end, + on_receive_fields = on_receive_fields, + }, + }, + green_board = { + depth = 1/16, width = 1, height = 1, + entity_fields = { + top = -1/32, + size = { x = 1, y = 15/16 }, + maxlines = 5, + color = "#fff", + font_name = "tinycurs", + valign = "top", + }, + node_fields = { + description = S("Green board"), + tiles = { "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png", + "default_wood.png", "board_green_front.png" }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 7/16, 0.5, 0.5, 0.5}, + {-0.5, -7/16, 6/16, 0.5, -0.5, 7/16} + }, + }, + on_construct = function(pos) + set_formspec(pos) + display_api.on_construct(pos) + end, + on_receive_fields = on_receive_fields, + }, + }, +} + +-- Node registration +for name, model in pairs(models) +do + signs_api.register_sign("boards", name, model) +end + +-- Recipes +minetest.register_craft( + { + output = "boards:black_board", + recipe = { + {"group:wood", "group:stone", "dye:black"}, + } + }) + +minetest.register_craft( + { + output = "boards:green_board", + recipe = { + {"group:wood", "group:stone", "dye:dark_green"}, + } + }) + diff --git a/mods/display_modpack/boards/intllib.lua b/mods/display_modpack/boards/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/display_modpack/boards/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/display_modpack/boards/locale/fr.po b/mods/display_modpack/boards/locale/fr.po new file mode 100644 index 00000000..1b081bea --- /dev/null +++ b/mods/display_modpack/boards/locale/fr.po @@ -0,0 +1,40 @@ +# 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: 2018-07-16 10:00+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" + +#: init.lua +msgid "Text" +msgstr "Texte" + +#: init.lua +msgid "Write" +msgstr "Ecrire" + +#: init.lua +msgid "Wipe" +msgstr "Effacer" + +#: init.lua +msgid "Black board" +msgstr "Tableau noir" + +#: init.lua +msgid "Green board" +msgstr "Tableau vert" + + diff --git a/mods/display_modpack/boards/locale/ms.po b/mods/display_modpack/boards/locale/ms.po new file mode 100644 index 00000000..fe360aa4 --- /dev/null +++ b/mods/display_modpack/boards/locale/ms.po @@ -0,0 +1,35 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Yaya (Nurul Azeera Hidayah @ Muhammad Nur Hidayat) , 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: Display Modpack\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-07-16 10:00+0200\n" +"PO-Revision-Date: 2020-07-05 11:31+0000\n" +"Language-Team: Malay \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3\n" +"Last-Translator: Yaya MNH48 \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Language: ms\n" + +#: init.lua +msgid "Text" +msgstr "Teks" + +#: init.lua +msgid "Write" +msgstr "Tulis" + +#: init.lua +msgid "Wipe" +msgstr "Padam" + +#: init.lua +msgid "Black board" +msgstr "Papan hitam" diff --git a/mods/display_modpack/boards/locale/template.pot b/mods/display_modpack/boards/locale/template.pot new file mode 100644 index 00000000..8db98b8a --- /dev/null +++ b/mods/display_modpack/boards/locale/template.pot @@ -0,0 +1,34 @@ +# 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: 2018-07-16 10:00+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" + +#: init.lua +msgid "Text" +msgstr "" + +#: init.lua +msgid "Write" +msgstr "" + +#: init.lua +msgid "Wipe" +msgstr "" + +#: init.lua +msgid "Black board" +msgstr "" diff --git a/mods/display_modpack/boards/mod.conf b/mods/display_modpack/boards/mod.conf new file mode 100644 index 00000000..2343d07b --- /dev/null +++ b/mods/display_modpack/boards/mod.conf @@ -0,0 +1,3 @@ +name=boards +description=Writable school boards using sign_api +depends=default,signs_api diff --git a/mods/display_modpack/boards/textures/board_black_front.png b/mods/display_modpack/boards/textures/board_black_front.png new file mode 100644 index 00000000..9e4a5341 Binary files /dev/null and b/mods/display_modpack/boards/textures/board_black_front.png differ diff --git a/mods/display_modpack/boards/textures/board_green_front.png b/mods/display_modpack/boards/textures/board_green_front.png new file mode 100644 index 00000000..dd7758d9 Binary files /dev/null and b/mods/display_modpack/boards/textures/board_green_front.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0000.png b/mods/display_modpack/boards/textures/font_tinycurs_0000.png new file mode 100644 index 00000000..981fe5bb Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0000.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0020.png b/mods/display_modpack/boards/textures/font_tinycurs_0020.png new file mode 100644 index 00000000..78711f4c Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0020.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0021.png b/mods/display_modpack/boards/textures/font_tinycurs_0021.png new file mode 100644 index 00000000..30454f5c Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0021.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0022.png b/mods/display_modpack/boards/textures/font_tinycurs_0022.png new file mode 100644 index 00000000..cab45257 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0022.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0023.png b/mods/display_modpack/boards/textures/font_tinycurs_0023.png new file mode 100644 index 00000000..a8afe9c2 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0023.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0024.png b/mods/display_modpack/boards/textures/font_tinycurs_0024.png new file mode 100644 index 00000000..ec0292f3 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0024.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0025.png b/mods/display_modpack/boards/textures/font_tinycurs_0025.png new file mode 100644 index 00000000..c603fc03 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0025.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0026.png b/mods/display_modpack/boards/textures/font_tinycurs_0026.png new file mode 100644 index 00000000..e77f57fe Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0026.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0027.png b/mods/display_modpack/boards/textures/font_tinycurs_0027.png new file mode 100644 index 00000000..46530fd6 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0027.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0028.png b/mods/display_modpack/boards/textures/font_tinycurs_0028.png new file mode 100644 index 00000000..beec1650 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0028.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0029.png b/mods/display_modpack/boards/textures/font_tinycurs_0029.png new file mode 100644 index 00000000..a4d85062 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0029.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_002a.png b/mods/display_modpack/boards/textures/font_tinycurs_002a.png new file mode 100644 index 00000000..e7f86948 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_002a.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_002b.png b/mods/display_modpack/boards/textures/font_tinycurs_002b.png new file mode 100644 index 00000000..ae049696 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_002b.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_002c.png b/mods/display_modpack/boards/textures/font_tinycurs_002c.png new file mode 100644 index 00000000..bff8fdcc Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_002c.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_002d.png b/mods/display_modpack/boards/textures/font_tinycurs_002d.png new file mode 100644 index 00000000..246a1868 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_002d.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_002e.png b/mods/display_modpack/boards/textures/font_tinycurs_002e.png new file mode 100644 index 00000000..08a2e413 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_002e.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_002f.png b/mods/display_modpack/boards/textures/font_tinycurs_002f.png new file mode 100644 index 00000000..4397f28a Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_002f.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0030.png b/mods/display_modpack/boards/textures/font_tinycurs_0030.png new file mode 100644 index 00000000..fa3ad5dd Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0030.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0031.png b/mods/display_modpack/boards/textures/font_tinycurs_0031.png new file mode 100644 index 00000000..cb5516d2 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0031.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0032.png b/mods/display_modpack/boards/textures/font_tinycurs_0032.png new file mode 100644 index 00000000..3958eecb Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0032.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0033.png b/mods/display_modpack/boards/textures/font_tinycurs_0033.png new file mode 100644 index 00000000..34ca0715 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0033.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0034.png b/mods/display_modpack/boards/textures/font_tinycurs_0034.png new file mode 100644 index 00000000..9c7a331e Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0034.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0035.png b/mods/display_modpack/boards/textures/font_tinycurs_0035.png new file mode 100644 index 00000000..a8b4b070 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0035.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0036.png b/mods/display_modpack/boards/textures/font_tinycurs_0036.png new file mode 100644 index 00000000..35fe54f6 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0036.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0037.png b/mods/display_modpack/boards/textures/font_tinycurs_0037.png new file mode 100644 index 00000000..18b279b0 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0037.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0038.png b/mods/display_modpack/boards/textures/font_tinycurs_0038.png new file mode 100644 index 00000000..882d8bc0 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0038.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0039.png b/mods/display_modpack/boards/textures/font_tinycurs_0039.png new file mode 100644 index 00000000..23c8ea0c Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0039.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_003a.png b/mods/display_modpack/boards/textures/font_tinycurs_003a.png new file mode 100644 index 00000000..c6ead96a Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_003a.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_003b.png b/mods/display_modpack/boards/textures/font_tinycurs_003b.png new file mode 100644 index 00000000..28a08d26 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_003b.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_003c.png b/mods/display_modpack/boards/textures/font_tinycurs_003c.png new file mode 100644 index 00000000..0aa8e08b Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_003c.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_003d.png b/mods/display_modpack/boards/textures/font_tinycurs_003d.png new file mode 100644 index 00000000..1761935e Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_003d.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_003e.png b/mods/display_modpack/boards/textures/font_tinycurs_003e.png new file mode 100644 index 00000000..aeebbba9 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_003e.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_003f.png b/mods/display_modpack/boards/textures/font_tinycurs_003f.png new file mode 100644 index 00000000..06f0fe35 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_003f.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0040.png b/mods/display_modpack/boards/textures/font_tinycurs_0040.png new file mode 100644 index 00000000..210b9a47 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0040.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0041.png b/mods/display_modpack/boards/textures/font_tinycurs_0041.png new file mode 100644 index 00000000..271e9587 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0041.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0042.png b/mods/display_modpack/boards/textures/font_tinycurs_0042.png new file mode 100644 index 00000000..14a6e02e Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0042.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0043.png b/mods/display_modpack/boards/textures/font_tinycurs_0043.png new file mode 100644 index 00000000..0bac54c3 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0043.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0044.png b/mods/display_modpack/boards/textures/font_tinycurs_0044.png new file mode 100644 index 00000000..8546bbab Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0044.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0045.png b/mods/display_modpack/boards/textures/font_tinycurs_0045.png new file mode 100644 index 00000000..769ccf88 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0045.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0046.png b/mods/display_modpack/boards/textures/font_tinycurs_0046.png new file mode 100644 index 00000000..dc474092 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0046.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0047.png b/mods/display_modpack/boards/textures/font_tinycurs_0047.png new file mode 100644 index 00000000..a67d655c Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0047.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0048.png b/mods/display_modpack/boards/textures/font_tinycurs_0048.png new file mode 100644 index 00000000..9f8ff061 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0048.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0049.png b/mods/display_modpack/boards/textures/font_tinycurs_0049.png new file mode 100644 index 00000000..0df681df Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0049.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_004a.png b/mods/display_modpack/boards/textures/font_tinycurs_004a.png new file mode 100644 index 00000000..c9c79221 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_004a.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_004b.png b/mods/display_modpack/boards/textures/font_tinycurs_004b.png new file mode 100644 index 00000000..9d351e7c Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_004b.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_004c.png b/mods/display_modpack/boards/textures/font_tinycurs_004c.png new file mode 100644 index 00000000..45104cc9 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_004c.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_004d.png b/mods/display_modpack/boards/textures/font_tinycurs_004d.png new file mode 100644 index 00000000..96a27a8b Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_004d.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_004e.png b/mods/display_modpack/boards/textures/font_tinycurs_004e.png new file mode 100644 index 00000000..d7ac6e92 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_004e.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_004f.png b/mods/display_modpack/boards/textures/font_tinycurs_004f.png new file mode 100644 index 00000000..58055b03 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_004f.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0050.png b/mods/display_modpack/boards/textures/font_tinycurs_0050.png new file mode 100644 index 00000000..500aa9ab Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0050.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0051.png b/mods/display_modpack/boards/textures/font_tinycurs_0051.png new file mode 100644 index 00000000..37b30aeb Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0051.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0052.png b/mods/display_modpack/boards/textures/font_tinycurs_0052.png new file mode 100644 index 00000000..840cc1b9 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0052.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0053.png b/mods/display_modpack/boards/textures/font_tinycurs_0053.png new file mode 100644 index 00000000..06b21f7c Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0053.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0054.png b/mods/display_modpack/boards/textures/font_tinycurs_0054.png new file mode 100644 index 00000000..2e4ee5cd Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0054.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0055.png b/mods/display_modpack/boards/textures/font_tinycurs_0055.png new file mode 100644 index 00000000..8667c359 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0055.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0056.png b/mods/display_modpack/boards/textures/font_tinycurs_0056.png new file mode 100644 index 00000000..a50cdb0d Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0056.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0057.png b/mods/display_modpack/boards/textures/font_tinycurs_0057.png new file mode 100644 index 00000000..1002ba6a Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0057.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0058.png b/mods/display_modpack/boards/textures/font_tinycurs_0058.png new file mode 100644 index 00000000..ab59eb3e Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0058.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0059.png b/mods/display_modpack/boards/textures/font_tinycurs_0059.png new file mode 100644 index 00000000..87181037 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0059.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_005a.png b/mods/display_modpack/boards/textures/font_tinycurs_005a.png new file mode 100644 index 00000000..a306f61d Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_005a.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_005b.png b/mods/display_modpack/boards/textures/font_tinycurs_005b.png new file mode 100644 index 00000000..dc3c1758 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_005b.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_005c.png b/mods/display_modpack/boards/textures/font_tinycurs_005c.png new file mode 100644 index 00000000..77f2ef19 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_005c.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_005d.png b/mods/display_modpack/boards/textures/font_tinycurs_005d.png new file mode 100644 index 00000000..996e0e60 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_005d.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_005e.png b/mods/display_modpack/boards/textures/font_tinycurs_005e.png new file mode 100644 index 00000000..5d927570 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_005e.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_005f.png b/mods/display_modpack/boards/textures/font_tinycurs_005f.png new file mode 100644 index 00000000..153ffec0 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_005f.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0060.png b/mods/display_modpack/boards/textures/font_tinycurs_0060.png new file mode 100644 index 00000000..df31daf3 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0060.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0061.png b/mods/display_modpack/boards/textures/font_tinycurs_0061.png new file mode 100644 index 00000000..7aaff242 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0061.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0062.png b/mods/display_modpack/boards/textures/font_tinycurs_0062.png new file mode 100644 index 00000000..2ff008eb Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0062.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0063.png b/mods/display_modpack/boards/textures/font_tinycurs_0063.png new file mode 100644 index 00000000..d0bb6c2a Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0063.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0064.png b/mods/display_modpack/boards/textures/font_tinycurs_0064.png new file mode 100644 index 00000000..c8581254 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0064.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0065.png b/mods/display_modpack/boards/textures/font_tinycurs_0065.png new file mode 100644 index 00000000..5e09ff08 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0065.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0066.png b/mods/display_modpack/boards/textures/font_tinycurs_0066.png new file mode 100644 index 00000000..f8e74709 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0066.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0067.png b/mods/display_modpack/boards/textures/font_tinycurs_0067.png new file mode 100644 index 00000000..f872c2f3 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0067.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0068.png b/mods/display_modpack/boards/textures/font_tinycurs_0068.png new file mode 100644 index 00000000..730e2b48 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0068.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0069.png b/mods/display_modpack/boards/textures/font_tinycurs_0069.png new file mode 100644 index 00000000..5dff5810 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0069.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_006a.png b/mods/display_modpack/boards/textures/font_tinycurs_006a.png new file mode 100644 index 00000000..19c16b84 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_006a.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_006b.png b/mods/display_modpack/boards/textures/font_tinycurs_006b.png new file mode 100644 index 00000000..312fc631 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_006b.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_006c.png b/mods/display_modpack/boards/textures/font_tinycurs_006c.png new file mode 100644 index 00000000..ec7fbc45 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_006c.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_006d.png b/mods/display_modpack/boards/textures/font_tinycurs_006d.png new file mode 100644 index 00000000..6b8b0fe1 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_006d.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_006e.png b/mods/display_modpack/boards/textures/font_tinycurs_006e.png new file mode 100644 index 00000000..a6cc6aa5 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_006e.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_006f.png b/mods/display_modpack/boards/textures/font_tinycurs_006f.png new file mode 100644 index 00000000..5e197670 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_006f.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0070.png b/mods/display_modpack/boards/textures/font_tinycurs_0070.png new file mode 100644 index 00000000..634f1690 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0070.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0071.png b/mods/display_modpack/boards/textures/font_tinycurs_0071.png new file mode 100644 index 00000000..2997b830 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0071.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0072.png b/mods/display_modpack/boards/textures/font_tinycurs_0072.png new file mode 100644 index 00000000..a460efa2 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0072.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0073.png b/mods/display_modpack/boards/textures/font_tinycurs_0073.png new file mode 100644 index 00000000..38a37076 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0073.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0074.png b/mods/display_modpack/boards/textures/font_tinycurs_0074.png new file mode 100644 index 00000000..5bd4d160 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0074.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0075.png b/mods/display_modpack/boards/textures/font_tinycurs_0075.png new file mode 100644 index 00000000..0daa657c Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0075.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0076.png b/mods/display_modpack/boards/textures/font_tinycurs_0076.png new file mode 100644 index 00000000..a97bf650 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0076.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0077.png b/mods/display_modpack/boards/textures/font_tinycurs_0077.png new file mode 100644 index 00000000..08fa1ded Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0077.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0078.png b/mods/display_modpack/boards/textures/font_tinycurs_0078.png new file mode 100644 index 00000000..9440b695 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0078.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_0079.png b/mods/display_modpack/boards/textures/font_tinycurs_0079.png new file mode 100644 index 00000000..9477e400 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_0079.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_007a.png b/mods/display_modpack/boards/textures/font_tinycurs_007a.png new file mode 100644 index 00000000..219e1808 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_007a.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_007b.png b/mods/display_modpack/boards/textures/font_tinycurs_007b.png new file mode 100644 index 00000000..bd8b1c70 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_007b.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_007c.png b/mods/display_modpack/boards/textures/font_tinycurs_007c.png new file mode 100644 index 00000000..8de441fb Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_007c.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_007d.png b/mods/display_modpack/boards/textures/font_tinycurs_007d.png new file mode 100644 index 00000000..b4affd24 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_007d.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_007e.png b/mods/display_modpack/boards/textures/font_tinycurs_007e.png new file mode 100644 index 00000000..175176da Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_007e.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_2018.png b/mods/display_modpack/boards/textures/font_tinycurs_2018.png new file mode 100644 index 00000000..f9d9c2d4 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_2018.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_2019.png b/mods/display_modpack/boards/textures/font_tinycurs_2019.png new file mode 100644 index 00000000..4f389ee1 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_2019.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_201c.png b/mods/display_modpack/boards/textures/font_tinycurs_201c.png new file mode 100644 index 00000000..06b34d62 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_201c.png differ diff --git a/mods/display_modpack/boards/textures/font_tinycurs_201d.png b/mods/display_modpack/boards/textures/font_tinycurs_201d.png new file mode 100644 index 00000000..435d6f40 Binary files /dev/null and b/mods/display_modpack/boards/textures/font_tinycurs_201d.png differ diff --git a/mods/display_modpack/boards/tools/updatepo.sh b/mods/display_modpack/boards/tools/updatepo.sh new file mode 100755 index 00000000..feb2504c --- /dev/null +++ b/mods/display_modpack/boards/tools/updatepo.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --language=Lua \ + --sort-by-file \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --keyword=F \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/display_modpack/display_api/API.md b/mods/display_modpack/display_api/API.md new file mode 100644 index 00000000..2dfff213 --- /dev/null +++ b/mods/display_modpack/display_api/API.md @@ -0,0 +1,92 @@ +# Display API +This document describes Display API. Display API allows to add a dynamic display on a node. Display API limits node rotations. For wallmounted, only vertical positionning is available. For facedir, only first four position are availabel (those with default axis). + +## Provided methods +### update\_entities +**display\_api.update\_entities(pos)** + +This method triggers entities update for the display node at pos. Actual entity update is made by `on_display_update` callback associated to the entity. + +`pos`: Position of the node +### register\_display\_entity +**display\_api.register\_display\_entity(entity_name)** + +This is a helper to register entities used for display. + +`entity_name`: Name of the entity to register. + +## Provided callback implementations +### on_place +**display\_api.on\_place(itemstack, placer, pointed\_thing)** + +`on_place` node callback implementation. Display nodes should have this callback (avoid placement of horizontal display node). +### on_construct +**display\_api.on\_construct(pos)** + +`on_construct` node callback implementation. Display nodes should have this callback (creates, places and updates display entities on node construction). +### on_destruct +**display\_api.on_destruct(pos)** + +`on_destruct` node callback implementation. Display nodes should have this callback (removes display entities on node destruction). +### on_rotate +**display\_api.on\_rotate(pos, node, user, mode, new_param2)** + +`on_rotate` node callback implementation. Display nodes should have this callback (restricts rotations and rotates display entities associated with node). +### on_activate +**display\_api.on_activate(entity, staticdata)** + +`On_activate` entity callback implementation for display entities. No need of this method if display entities have been registered using `register_display_entity` (callback is already set). + +## Howto register a display node +* Register display entities with `register_display_entity` + +* Register node with : + - `on_place`, `on_construct`, `on_destruct` and `on_rotate` callbacks using display_api callbacks.\ + - `display_api` group. This will make this node have their entities updated as soon as the mapblock is loaded (Useful after /clearobjects).\ + - a `display_entities` field in node definition containing a entity name indexed table. See below for description of each display_entities fields.\ + +### Display_entities fields +`on_display_update` is a callback in charge of setting up entity texture. If not set, entity will have no texture and will be displayed as unknown item.\ +`depth`, `right` and `top`: Entity position regarding to node facedir/wallmounted main axis.\ +Values for these fields can be any number between -1.5 and 1.5 (default value is 0). Position 0,0,0 is the center of the node.\ +`depth` goes from front (-0.5) to rear (0.5), `top` goes from bottom (-0.5) to top (0.5) and `right` goes from left (-0.5) to right (0.5).\ +`yaw`: Entity yaw in radians, regarding to main axis. Default is 0, aligned to node face. + +In order to avoid flickering text, it's better to have text a little behind node surface. A good spacing value is given by `display_api.entity_spacing` variable. + +### Example + + display_api.register_display_entity("mymod:entity1") + display_api.register_display_entity("mymod:entity2") + + function my_display_update1(pos, objref) + objref:set_properties({ textures= {"mytexture1.png"}, + visual_size = {x=1, y=1} }) + end + + function my_display_update2(pos, objref) + objref:set_properties({ textures= {"mytexture2.png"}, +                         visual_size = {x=1, y=1} }) + end + + minetest.register_node("mymod:test_display_node", { + ... + paramtype2 = "facedir", + ... + groups = { display_api = 1, ... }, + ... + display_entities = { + ["mymod:entity1"] = { + depth = 0.3, + on_display_update = my_display_update1 }, + ["mymod:entity1"] = { + depth = 0.2, top = 0.1, + on_display_update = my_display_update2 }, + }, + ... + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, + ... + }) diff --git a/mods/display_modpack/display_api/LICENSE.txt b/mods/display_modpack/display_api/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/display_modpack/display_api/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/display_modpack/display_api/README.md b/mods/display_modpack/display_api/README.md new file mode 100644 index 00000000..73acdf97 --- /dev/null +++ b/mods/display_modpack/display_api/README.md @@ -0,0 +1,34 @@ +# Display API + +This library's purpose is to ease creation of nodes with one or more displays on sides. For example, signs and clocks. Display can be dynamic and/or different for each node instance. + +**Limitations**: This lib uses entities to draw display. This means display has to be vertical (and "upside up") on Minetest before version 5.0. + +**Dependancies**:default + +**License**: LGPLv2 + +**API**: See [API.md](https://github.com/pyrollo/display_modpack/blob/master/display_api/API.md) document please. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=19365) at the Minetest forums. + +## Deprecation notice (for modders) + +### December 2018 +Following objects are deprecated, shows a warning in log when used: +* `display_modpack_node` group (use `display_api` group instead); +* `display_lib_node` group (use `display_api` group instead); +* `display_lib` global table (use `display_api` global table instead); + +These objects will be removed in the future. + +## Change log +### 2019-03-14 +- __dispay_api__: Display API now detects automatically whenr rotation restrictions have to be applied. + +### 2019-03-09 +- __display_api__: Display nodes can be rotated in every directions (if running Minetest 5 or above). +- __display_api__: New setting to restrict rotations to Minetest 0.4 abilities (restriction enabled by default). + +### 2018-12-14 +- __display_api__: New `yaw` attributes, entities can now have different angles with node. diff --git a/mods/display_modpack/display_api/copyright.txt b/mods/display_modpack/display_api/copyright.txt new file mode 100644 index 00000000..e242c7c7 --- /dev/null +++ b/mods/display_modpack/display_api/copyright.txt @@ -0,0 +1,5 @@ +Code by Pierre-Yves Rollo (pyrollo) +Contributors: +(gpcf): Compatibility with signs lib +(Thomas--S): Fix /clearobjects bug +(12Me21): on_place and on_rotate improvements diff --git a/mods/display_modpack/display_api/depends.txt b/mods/display_modpack/display_api/depends.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/display_modpack/display_api/deprecation.lua b/mods/display_modpack/display_api/deprecation.lua new file mode 100644 index 00000000..b041f6fa --- /dev/null +++ b/mods/display_modpack/display_api/deprecation.lua @@ -0,0 +1,78 @@ +--[[ + display_api mod for Minetest - Library to add dynamic display + capabilities to nodes + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Deprecation + +function deprecated_group(deprecated_group, replacement_group) + for name, ndef in pairs(minetest.registered_nodes) do + if ndef.groups and ndef.groups[deprecated_group] then + minetest.log("warning", string.format( + 'Node %s belongs to deprecated "%s" group which should be replaced with new "%s" group.', + name, deprecated_group, replacement_group)) + end + end +end + +function deprecated_global_table(deprecated_global_name, replacement_global_name) + assert(type(deprecated_global_name) == 'string', "deprecated_global_name should be a string.") + assert(type(replacement_global_name) == 'string', "replacement_global_name should be a string.") + assert(deprecated_global_name ~= '', "deprecated_global_name should not be empty.") + assert(replacement_global_name ~= '', "replacement_global_name should not be empty.") + assert(rawget(_G, deprecated_global_name) == nil, "deprecated global does not exist.") + if _G[replacement_global_name] == nil then + minetest.log('warning', string.format( + 'Replacement global "%s" does not exists.', replacement_global_name)) + return + end + local meta = { + deprecated = deprecated_global_name, + replacement = replacement_global_name, + __index = function(table, key) + local meta = getmetatable(table) + local dbg = debug.getinfo(2, "lS") + minetest.log("warning", string.format( + 'Accessing deprecated "%s" table, "%s" should be used instead (%s:%d).', + meta.deprecated, meta.replacement, (dbg.short_src or 'unknown'), + (dbg.currentline or 0))) + return _G[meta.replacement][key] + end, + __newindex = function(table, key, value) + local meta = getmetatable(table) + local dbg = debug.getinfo(2, "lS") + minetest.log("warning", string.format( + 'Accessing deprecated "%s" table, "%s" should be used instead (%s:%d).', + meta.deprecated, meta.replacement, (dbg.short_src or 'unknown'), + (dbg.currentline or 0))) + _G[meta.replacement][key]=value + end, + } + rawset(_G, deprecated_global_name, {}) + setmetatable(_G[deprecated_global_name], meta) +end + + +-- deprecated(1) -- December 2018 - Deprecation of groups display_modpack_node and display_lib_node +-- Group to be removed from display API register_lbm +minetest.after(0, function() + deprecated_group("display_modpack_node", "display_api") + deprecated_group("display_lib_node", "display_api") +end) + +-- deprecated(2) -- December 2018 - Deprecation of display_lib +deprecated_global_table('display_lib', 'display_api') diff --git a/mods/display_modpack/display_api/display.lua b/mods/display_modpack/display_api/display.lua new file mode 100644 index 00000000..fa7c8549 --- /dev/null +++ b/mods/display_modpack/display_api/display.lua @@ -0,0 +1,325 @@ +--[[ + display_api mod for Minetest - Library to add dynamic display + capabilities to nodes + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Prefered gap between node and entity +-- Entity positionment is up to mods but it is a good practice to use this +-- variable as spacing between entity and node +display_api.entity_spacing = 0.002 + +-- Maximum entity position relative to the node pos +local max_entity_pos = 1.5 + +local wallmounted_rotations = { + [0]={x=1, y=0, z=0}, [1]={x=3, y=0, z=0}, + [2]={x=0, y=3, z=0}, [3]={x=0, y=1, z=0}, + [4]={x=0, y=0, z=0}, [5]={x=0, y=2, z=0}, + [6]={x=1, y=0, z=0}, [7]={x=1, y=1, z=1}, +} + +local facedir_rotations = { + [ 0]={x=0, y=0, z=0}, [ 1]={x=0, y=3, z=0}, + [ 2]={x=0, y=2, z=0}, [ 3]={x=0, y=1, z=0}, + [ 4]={x=3, y=0, z=0}, [ 5]={x=0, y=3, z=3}, + [ 6]={x=1, y=0, z=2}, [ 7]={x=0, y=1, z=1}, + [ 8]={x=1, y=0, z=0}, [ 9]={x=0, y=3, z=1}, + [10]={x=3, y=0, z=2}, [11]={x=0, y=1, z=3}, + [12]={x=0, y=0, z=1}, [13]={x=3, y=0, z=1}, + [14]={x=2, y=0, z=1}, [15]={x=1, y=0, z=1}, + [16]={x=0, y=0, z=3}, [17]={x=1, y=0, z=3}, + [18]={x=2, y=0, z=3}, [19]={x=3, y=0, z=3}, + [20]={x=0, y=0, z=2}, [21]={x=0, y=1, z=2}, + [22]={x=0, y=2, z=2}, [23]={x=0, y=3, z=2}, +} + +-- Compute other useful values depending on wallmounted and facedir param +local wallmounted_values = {} +local facedir_values = {} + +local function compute_values(r) + local function rx(v) return { x=v.x, y=v.z, z=-v.y} end + local function ry(v) return { x=-v.z, y=v.y, z=v.x} end + local function rz(v) return { x=v.y, y=-v.x, z=v.z} end + + local d = { x = 0, y = 0, z = 1 } + local w = { x = 1, y = 0, z = 0 } + local h = { x = 0, y = 1, z = 0 } + + -- Important to keep z rotation first (not same results) + for _ = 1, r.z do d, w, h = rz(d), rz(w), rz(h) end + for _ = 1, r.x do d, w, h = rx(d), rx(w), rx(h) end + for _ = 1, r.y do d, w, h = ry(d), ry(w), ry(h) end + + return { + rotation=r, depth=d, width=w, height=h, + restricted=(r.x==0 and r.z==0) } +end + +for i, r in pairs(facedir_rotations) do + facedir_values[i] = compute_values(r) +end + +for i, r in pairs(wallmounted_rotations) do + wallmounted_values[i] = compute_values(r) +end + +-- Detect rotation restriction +local rotation_restricted = nil +minetest.register_entity('display_api:dummy_entity', { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {} }) + +function display_api.is_rotation_restricted() + if rotation_restricted == nil then + local objref = minetest.add_entity( + {x=0, y=0, z=0}, 'display_api:dummy_entity') + if objref then + rotation_restricted = objref.set_rotation == nil + objref:remove() + end + end + return rotation_restricted +end + +-- Clip position property to maximum entity position + +local function clip_pos_prop(posprop) + if posprop then + return math.max(-max_entity_pos, math.min(max_entity_pos, posprop)) + else + return 0 + end +end + +-- Get values needed for orientation computation of node + +local function get_orientation_values(node) + local ndef = minetest.registered_nodes[node.name] + + if ndef then + local paramtype2 = ndef.paramtype2 + if paramtype2 == "wallmounted" or paramtype2 == "colorwallmounted" then + return wallmounted_values[node.param2 % 8] + elseif paramtype2 == "facedir" or paramtype2 == "colorfacedir" then + return facedir_values[node.param2 % 32] + else + -- No orientation or unknown orientation type + return facedir_values[0] + end + end +end + +-- Gets the display entities attached with a node. +-- Add missing and remove duplicates + +local function get_display_objrefs(pos, create) + local objrefs = {} + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.display_entities then + for _, objref in + ipairs(minetest.get_objects_inside_radius(pos, max_entity_pos)) do + local entity = objref:get_luaentity() + if entity and ndef.display_entities[entity.name] and + entity.nodepos and vector.equals(pos, entity.nodepos) then + if objrefs[entity.name] then + objref:remove() -- Remove duplicates + else + objrefs[entity.name] = objref + end + end + end + if create then + -- Add missing + for name, _ in pairs(ndef.display_entities) do + if not objrefs[name] then + objrefs[name] = minetest.add_entity(pos, name, + minetest.serialize({ nodepos = pos })) + end + end + end + end + return objrefs +end + +--- Force entity update : position and texture +function display_api.update_entities(pos) + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + local ov = get_orientation_values(node) + if not ndef or not ov then + return + end + + for _, objref in pairs(get_display_objrefs(pos, true)) do + local edef = ndef.display_entities[objref:get_luaentity().name] + local depth = clip_pos_prop(edef.depth) + local right = clip_pos_prop(edef.right) + local top = clip_pos_prop(edef.top) + + objref:set_pos({ + x = pos.x + ov.depth.x*depth + ov.width.x*right - ov.height.x*top, + y = pos.y + ov.depth.y*depth + ov.width.y*right - ov.height.y*top, + z = pos.z + ov.depth.z*depth + ov.width.z*right - ov.height.z*top, + }) + + if objref.set_rotation then + objref:set_rotation({ + x = ov.rotation.x*math.pi/2, + y = ov.rotation.y*math.pi/2 + (edef.yaw or 0), + z = ov.rotation.z*math.pi/2, + }) + else + if ov.rotation.x ~=0 or ov.rotation.y ~= 0 then + minetest.log("warning", string.format( + "[display_api] unable to rotate correctly entity for node at %s without set_rotation method.", + minetest.pos_to_string(pos))) + end + objref:set_yaw(ov.rotation.y*math.pi/2 + (edef.yaw or 0)) + end + + -- Call on_display_update callback of a node for one of its display entities + if edef.on_display_update then + edef.on_display_update(pos, objref) + end + end +end + +--- On_activate callback for display_api entities. Calls on_display_update callbacks +--- of corresponding node for each entity. +function display_api.on_activate(entity, staticdata) + if entity then + if string.sub(staticdata, 1, string.len("return")) == "return" then + local data = minetest.deserialize(staticdata) + if data and type(data) == "table" then + entity.nodepos = data.nodepos + end + entity.object:set_armor_groups({immortal=1}) + end + + if entity.nodepos then + local node = minetest.get_node(entity.nodepos) + local ndef = minetest.registered_nodes[node.name] + if ndef and ndef.display_entities then + local edef = ndef.display_entities[entity.name] + if edef then + -- Call on_display_update callback of the entity to build texture + if edef.on_display_update then + edef.on_display_update(entity.nodepos, entity.object) + end + return + end + end + end + -- If we got here, this display entity is buggy and should be removed + entity.object:remove() + end +end + +--- On_place callback for display_api items. +-- Does nothing more than preventing node from being placed on ceiling or ground +-- TODO:When MT<5 is not in use anymore, simplify this +function display_api.on_place(itemstack, placer, pointed_thing, override_param2) + local ndef = itemstack:get_definition() + local dir = { + x = pointed_thing.under.x - pointed_thing.above.x, + y = pointed_thing.under.y - pointed_thing.above.y, + z = pointed_thing.under.z - pointed_thing.above.z, + } + + local rotation_restriction = display_api.is_rotation_restricted() + + if rotation_restriction then + -- If item is not placed on a wall, use the player's view direction instead + if dir.x == 0 and dir.z == 0 then + dir = placer:get_look_dir() + end + dir.y = 0 + end + + local param2 = 0 + if ndef then + if ndef.paramtype2 == "wallmounted" or + ndef.paramtype2 == "colorwallmounted" then + param2 = minetest.dir_to_wallmounted(dir) + + elseif ndef.paramtype2 == "facedir" or + ndef.paramtype2 == "colorfacedir" then + param2 = minetest.dir_to_facedir(dir, not rotation_restriction) + end + end + return minetest.item_place(itemstack, placer, pointed_thing, + param2 + (override_param2 or 0)) +end + +--- On_construct callback for display_api items. +-- Creates entities and update them. +function display_api.on_construct(pos) + display_api.update_entities(pos) +end + +--- On_destruct callback for display_api items. +-- Removes entities. +function display_api.on_destruct(pos) + for _, objref in pairs(get_display_objrefs(pos)) do + objref:remove() + end +end + +-- On_rotate (screwdriver) callback for display_api items. Prevents invalid +-- rotations and reorients entities. +function display_api.on_rotate(pos, node, user, _, new_param2) + node.param2 = new_param2 + local ov = get_orientation_values(node) + if not ov then + return + end + + if ov.restricted or not display_api.is_rotation_restricted() then + minetest.swap_node(pos, node) + display_api.update_entities(pos) + return true + else + return false + end +end + +--- Creates display entity with some fields and the on_activate callback +function display_api.register_display_entity(entity_name) + if not minetest.registered_entities[entity_name] then + minetest.register_entity(':'..entity_name, { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + on_activate = display_api.on_activate, + get_staticdata = function(self) + return minetest.serialize({ nodepos = self.nodepos }) + end, + }) + end +end + +minetest.register_lbm({ + label = "Update display_api entities", + name = "display_api:update_entities", + run_at_every_load = true, + nodenames = {"group:display_api", + "group:display_modpack_node", "group:display_lib_node"}, -- See deprecated(1) + action = function(pos, node) display_api.update_entities(pos) end, +}) diff --git a/mods/display_modpack/display_api/init.lua b/mods/display_modpack/display_api/init.lua new file mode 100644 index 00000000..f1e54e89 --- /dev/null +++ b/mods/display_modpack/display_api/init.lua @@ -0,0 +1,31 @@ +--[[ + display_api mod for Minetest - Library to add dynamic display + capabilities to nodes + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Global variables +------------------- + +display_api = {} +display_api.name = minetest.get_current_modname() +display_api.path = minetest.get_modpath(display_api.name) + +-- Inclusions +------------- + +dofile(display_api.path.."/display.lua") +dofile(display_api.path.."/deprecation.lua") diff --git a/mods/display_modpack/display_api/mod.conf b/mods/display_modpack/display_api/mod.conf new file mode 100644 index 00000000..d0b1da7c --- /dev/null +++ b/mods/display_modpack/display_api/mod.conf @@ -0,0 +1,2 @@ +name=display_api +description=A library for adding dynamic textures on nodes diff --git a/mods/display_modpack/font_api/API.md b/mods/display_modpack/font_api/API.md new file mode 100644 index 00000000..80b11212 --- /dev/null +++ b/mods/display_modpack/font_api/API.md @@ -0,0 +1,201 @@ +# Font API +This document describes Font API. Font API creates textures for font display on entities. + +## Settings +### default_font +Name of the font to be used when no font is given. The font should be registered. + +If no default\_font given or if default\_font given but not registered, the first registered font will be used as default. + +## Use font_api with display_api (to display text on nodes) +### Base setup +Font_api offers a direct integration with display_api to display text on nodes. + +First of all, create a display node with an entity. +To do this, refer to API.md in display_api mod, in particular "Howto register a display node". + +The only requirement then is to connect the `on_display_update` callback of the display entity to `font_api.on_display_update`: + +``` +minetest.register_node("mymod:test_text_node", { + ... + paramtype2 = "facedir", + ... + groups = { display_api = 1, ... }, + ... + display_entities = { + ["mymod:text"] = { + depth = -0.5 - display_api.entity_spacing, + on_display_update = font_api.on_display_update }, + } + ... + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, + ... +}) +``` + +At this step, your node already displays text form "display_text" (by default) node meta. If you want to store your text into another meta data field, add a `meta_text` field to display entity definition. + +But it uses defaults (default font, default size, default color). Likely you need something more. + +### Style your text +Font style and size can be chosen by adding some more entries to the display_entities definition table. + +#### Font size +Font size can be defined in various ways (maybe more in the future). +Start with a number of lines, and font_api will make it fit to the entity size. + * `maxlines` or `lines`: Number of maximum lines of text to be displayed. The font height will be adjusted accordingly. + +Then specify the char width. Two methods available: + * `aspect_ratio`: Defines the aspect ratio of chars. Works with all fonts. Should not be used if `columns` is specified. + * `columns`: Only if using a fixed width font, specifies the number of columns to display. + +#### Font style + * `font_name`: name of the font to use. Should correspond to a registered font (from a font mod). If not specified or font not found, default font is used. + * `color`: color to be used (default black). + * `halign`: Horizontal alignment: "left", "center" or "right" (default "center"). + * `valign`: Vertical alignement: "top", "middle" or "bottom" (default "middle"). + +### Example +Using blue //botic// font, three lines height, aligned top left. Text stored in "text" node meta. +``` +minetest.register_node("mymod:test_text_node", { + ... + ... + display_entities = { + ["mymod:text"] = { + depth = -0.5 - display_api.entity_spacing, + on_display_update = font_api.on_display_update + meta_text = "text", + font_name = "botic", + color = "#0000FF", + maxlines = 3, + aspect_ratio = 0.5, + halign = "left", + valign = "top", + }, + } + ... +}) +``` +## Provided methods +### font_api.get_default_font_name() +Returns de default font name. + +### font_api.register_font(font_name, font_def) +Register a new font. + * `font_name`: Name of the font to register. If registering different sizes of the same font, add size in the font name (e.g. times_10, times_12...). + * `font_def`: Font definition table (see **Font definition table** below). + +### font_api.on_display_update(pos, objref) +Standard on_display_update entity callback. + * `pos`: Node position + * `objref`: Object reference of entity + +Node should have a corresponding display_entity with size, resolution and maxlines fields and optionally halign, valign and color fields. + +## Font definition table +Font definition table used by **font_api.register_font** and **font\_api.Font:new** may/can contain following elements: + +* `height` (required): Font height in pixels (all font textures should have the same height) . +* `widths` (required): Array of character widths in pixels, indexed by UTF codepoints. +* `margintop` (optional): Margin (in texture pixels) added on top of each char texture. +* `marginbottom` (optional): Margin (in texture pixels) added at bottom of each char texture. +* `linespacing` (optional): Spacing (in texture pixels) between each lines. + +`margintop`, `marginbottom` and `linespacing` can be negative numbers (default 0) and are to be used to adjust various font styles to each other. + +Font attributes around a single char:\ +![Font attributes on a char](doc/font.svg) + +Font attributes effects on several lines:\ +![Font attributes on lines](doc/lines.svg) + +#### Additional requirements + +Font must have a char 0 which will be used to display any unknown char. + +All textures corresponding to the indexes in widths array should be present in textures directory with a name matching the pattern : + +> font\_**{font_name}**_**{utf_code}**.png + +**{font\_name}**: Name of the font as given in the first argument + +**{utf\_code}**: UTF code of the char in 4 hexadecimal digits + +Example : font_courrier_0041.png is for the "A" char in the "courrier" font. + +To ease that declaration (specially to build the **widths** array), a shell is provided to build a {font\_name}.lua file from the texture files (see provided tools). + +## Provided tools + +Still in early stage of development, these tools are helpers to create font mods. + +### make_font_texture.sh + +This scripts takes a .ttf file as input and create one .png file per char, that can be used as font texture. Launch it from your future font mod directory. + +__Advice__ + +This script works much better with pixels font, providing the correct height. There is no antialiasing at all, vector fonts and bad heights gives very ugly results. + +__Syntax__ + +**make\_font\_texture.sh {fontfile} {fontname} {fontsize}** + +**{fontfile}**: A TTF font file to use to create textures. +**{fontname}**: The font name to be used in font_api (should be simple, with no spaces). +**{fontsize}**: Font height to be rendered. + +### make_font_lua.sh + +This script analyses textures in textures directory and creates a font\_{font\_name}.lua files with a call to register_font with images information. Launch it from your future font mod directory. + +Once the font\_{font\_name}.lua created, it can be included by a init.lua file or directly renamed to init.lua if you are creating a simple font mod. + +__Syntax__ + +**make\_font_lua.sh {fontname}** + +**{fontname}**: The font name to be used in font_api (same as given to make\_font\_texture.sh) + +### An exemple generating a font mod + + mkdir font_myfont + cd font_myfont + //tools/make_font_texture.sh myfont.ttf myfont 12 + //tools/make_font_lua.sh myfont + mv font_myfont.lua init.lua + +## Font class +A font usable with font API. This class is supposed to be for internal use but who knows. + +### font\_api.Font:new(def) +Create a new font object. + * `def` is a table containing font definition. See **Font definition table** above. + +### font:get_char_width(codepoint) +Returns the width of char `codepoint` in texture pixels. + * `codepoint`: Unicode codepoint of char. + +### font:get_height(nb_of_lines) +Returns line(s) height. Takes care of top and bottom margins and line spacing. + * `nb_of_lines`: Number of lines in the text. + +### font:get_width(line) +Returns the width of a text line. Beware, if line contains any new line char, they are ignored. + * `line`: Line of text which the width will be computed. + +### font:renter(text, texturew, textureh, style) +Builds texture for a multiline colored text. + * `text`: Text to be rendered. + * `texturew`: Width of the texture (extra text will be truncated). + * `textureh`: Height of the texture (extra text will be truncated). + * `style`: A table with style indications: + - `lines` or `maxlines`: Maximum number of lines (default none). + - `halign`: Horizontal text align: "left"/"center"/"right" (default "center") + - `valign`: Vertical text align: "top"/"middle"/"bottom" (default "middle") + - `color`: Color of the text (default black) diff --git a/mods/display_modpack/font_api/LICENSE.txt b/mods/display_modpack/font_api/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/display_modpack/font_api/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/display_modpack/font_api/README.md b/mods/display_modpack/font_api/README.md new file mode 100644 index 00000000..ff1dd980 --- /dev/null +++ b/mods/display_modpack/font_api/README.md @@ -0,0 +1,31 @@ +# Font API + +A library for rendernig text on textures (to be used with display_api for sign creation). + +**Dependancies**: default + +**License**: LGPL + +(Default font taken from VanessaE's homedecor/signs_lib, originally under WTFPL) + +**API**: See [API.md](https://github.com/pyrollo/display_modpack/blob/master/font_api/API.md) document please. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=13563) at the Minetest forums. + +## Extra fonts + +You can add fonts by installing fonts mod. Be aware that each font comes with numerous textures. This can result in slowing media downloading and/or client display. + +Font mods can be found here: + + * [Metro](https://github.com/pyrollo/display_modpack/tree/master/font_metro): A multipurpose font with many chars (uppercase, lowercase and accentuated latin letters, usual signs, cyrillic and greek letters). + * [OldWizard](https://github.com/pyrollo/font_oldwizard): An old style gothic font. + * [Botic](https://github.com/pyrollo/font_botic): A scifi style font. + + ## Deprecation notice (for modders) + + ### December 2018 + Following object is deprecate, shows a warning in log when used: + * `font_lib` global table (use `font_api` global table instead); + + This object will be removed in the future. diff --git a/mods/display_modpack/font_api/copyright.txt b/mods/display_modpack/font_api/copyright.txt new file mode 100644 index 00000000..ceb54466 --- /dev/null +++ b/mods/display_modpack/font_api/copyright.txt @@ -0,0 +1,3 @@ +Code by Pierre-Yves Rollo (pyrollo) +Contributors: +Andrzej Pieńkowski (apienk): Unicode support and tool for creating texturess diff --git a/mods/display_modpack/font_api/depends.txt b/mods/display_modpack/font_api/depends.txt new file mode 100644 index 00000000..88fa963c --- /dev/null +++ b/mods/display_modpack/font_api/depends.txt @@ -0,0 +1 @@ +display_api? diff --git a/mods/display_modpack/font_api/deprecation.lua b/mods/display_modpack/font_api/deprecation.lua new file mode 100644 index 00000000..1ffed115 --- /dev/null +++ b/mods/display_modpack/font_api/deprecation.lua @@ -0,0 +1,59 @@ +--[[ + font_api mod for Minetest - Library creating textures with fonts and text + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Deprecation + +function deprecated_global_table(deprecated_global_name, replacement_global_name) + assert(type(deprecated_global_name) == 'string', "deprecated_global_name should be a string.") + assert(type(replacement_global_name) == 'string', "replacement_global_name should be a string.") + assert(deprecated_global_name ~= '', "deprecated_global_name should not be empty.") + assert(replacement_global_name ~= '', "replacement_global_name should not be empty.") + assert(rawget(_G, deprecated_global_name) == nil, "deprecated global does not exist.") + if _G[replacement_global_name] == nil then + minetest.log('warning', string.format( + 'Replacement global "%s" does not exists.', replacement_global_name)) + return + end + local meta = { + deprecated = deprecated_global_name, + replacement = replacement_global_name, + __index = function(table, key) + local meta = getmetatable(table) + local dbg = debug.getinfo(2, "lS") + minetest.log("warning", string.format( + 'Accessing deprecated "%s" table, "%s" should be used instead (%s:%d).', + meta.deprecated, meta.replacement, (dbg.short_src or 'unknown'), + (dbg.currentline or 0))) + return _G[meta.replacement][key] + end, + __newindex = function(table, key, value) + local meta = getmetatable(table) + local dbg = debug.getinfo(2, "lS") + minetest.log("warning", string.format( + 'Accessing deprecated "%s" table, "%s" should be used instead (%s:%d).', + meta.deprecated, meta.replacement, (dbg.short_src or 'unknown'), + (dbg.currentline or 0))) + _G[meta.replacement][key]=value + end, + } + rawset(_G, deprecated_global_name, {}) + setmetatable(_G[deprecated_global_name], meta) +end + +-- deprecated(2) -- December 2018 - Deprecation of font_lib +deprecated_global_table('font_lib', 'font_api') diff --git a/mods/display_modpack/font_api/display_api.lua b/mods/display_modpack/font_api/display_api.lua new file mode 100644 index 00000000..51a396db --- /dev/null +++ b/mods/display_modpack/font_api/display_api.lua @@ -0,0 +1,76 @@ +--[[ + font_api mod for Minetest - Library creating textures with fonts and text + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] +-- Integration with display API + +if minetest.get_modpath("display_api") then + --- Standard on_display_update entity callback. + -- Node should have properly configured display_entity. + -- @param pos Node position + -- @param objref Object reference of entity + + font_api.on_display_update = function (pos, objref) + local meta = minetest.get_meta(pos) + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + local entity = objref:get_luaentity() + + if not entity or not ndef.display_entities[entity.name] then + return + end + + local def = ndef.display_entities[entity.name] + local font = font_api.get_font(meta:get_string("font") ~= "" + and meta:get_string("font") or def.font_name) + + local text = meta:get_string(def.meta_text or "display_text") + + -- Compute entity resolution accroding to given attributes + local texturew, textureh + textureh = font:get_height(def.lines or def.maxlines or 1) + + if def.columns then + if font.fixedwidth then + texturew = def.columns * font.fixedwidth + if def.aspect_ratio then + minetest.log('warning', "[font_api] 'aspect_ratio' ignored because 'columns' is specified") + end + else + minetest.log('warning', "[font_api] 'columns' ignored because '"..font.name.."' is not a fixed width font.") + end + end + + if not texturew then + if not def.aspect_ratio then + minetest.log('warning', "[font_api] No 'aspect_ratio' specified, using default 1.") + end + texturew = textureh * def.size.x / def.size.y / (def.aspect_ratio or 1) + end + + objref:set_properties({ + textures={ font:render(text, texturew, textureh, { + lines = def.maxlines or def.lines, + halign = def.halign, + valign = def.valign, + color = def.color} ) }, + visual_size = def.size, + }) + end +else + font_api.on_display_update = function (pos, objref) + minetest.log('error', '[font_api] font_api.on_display_update called but display_api mod not enabled.') + end +end diff --git a/mods/display_modpack/font_api/doc/font.svg b/mods/display_modpack/font_api/doc/font.svg new file mode 100644 index 00000000..e4e8757f --- /dev/null +++ b/mods/display_modpack/font_api/doc/font.svg @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + Texture Height + + Texture Width + + + + MarginTop + Margin Bottom + + Line Height + + + diff --git a/mods/display_modpack/font_api/doc/lines.svg b/mods/display_modpack/font_api/doc/lines.svg new file mode 100644 index 00000000..f75880fd --- /dev/null +++ b/mods/display_modpack/font_api/doc/lines.svg @@ -0,0 +1,544 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + Line Height + + + Text Height + Line Spacing + + + + + + + + + diff --git a/mods/display_modpack/font_api/fallbacks.lua b/mods/display_modpack/font_api/fallbacks.lua new file mode 100644 index 00000000..da3ff03d --- /dev/null +++ b/mods/display_modpack/font_api/fallbacks.lua @@ -0,0 +1,175 @@ +--[[ + font_api mod for Minetest - Library creating textures with fonts and text + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- This is the unicode char fallback map. If a char is not present in +-- font, this maps indicates which char to try to use instead next. + +return { + -- Lowercase chars + ['a'] = 'A', ['b'] = 'B', ['c'] = 'C', ['d'] = 'D', + ['e'] = 'E', ['f'] = 'F', ['g'] = 'G', ['h'] = 'H', + ['i'] = 'I', ['j'] = 'J', ['k'] = 'K', ['l'] = 'L', + ['m'] = 'M', ['n'] = 'N', ['o'] = 'O', ['p'] = 'P', + ['q'] = 'Q', ['r'] = 'R', ['s'] = 'S', ['t'] = 'T', + ['u'] = 'U', ['v'] = 'V', ['w'] = 'W', ['x'] = 'X', + ['y'] = 'Y', ['z'] = 'Z', + + -- Special + ['¢'] = 'c', ['£'] = 'L', ['¥'] = 'Y', ['€'] = 'E', + ['©'] = '(C)', ['®'] = '(R)', ['™'] = 'TM', + ['ª'] = 'a', ['º'] = 'o', + ['«'] = '"', ['»'] = '"', ['´'] = '\'', + ['¹'] = '1', ['²'] = '2', ['³'] = '3', + ['µ'] = 'u', ['¤'] = 'o', + ['¼'] = '1/4', ['½'] = '1/2', ['¾'] = '3/4', + ['⅛'] = '1/8', ['⅜'] = '3/8', ['⅝'] = '5/8', ['⅞'] = '7/8', + ['¿'] = '?', + + -- Upper case accents + ['À'] = 'A', ['Á'] = 'A', ['Â'] = 'A', ['Ã'] = 'A', + ['Ä'] = 'A', ['Å'] = 'A', + ['Æ'] = 'AE', ['Ç'] = 'C', + ['È'] = 'E', ['É'] = 'E', ['Ê'] = 'E', ['Ë'] = 'E', + ['Ì'] = 'I', ['Í'] = 'I', ['Î'] = 'I', ['Ï'] = 'I', + ['Ð'] = 'D', ['Ñ'] = 'N', + ['Ò'] = 'O', ['Ó'] = 'O', ['Ô'] = 'O', ['Õ'] = 'O', + ['Ö'] = 'O', ['Ø'] = 'O', + ['Ú'] = 'U', ['Ù'] = 'U', ['Û'] = 'U', ['Ü'] = 'U', + ['×'] = 'x', ['Ý'] = 'Y', + + -- Lower case accents + ['à'] = 'a', ['à'] = 'a', ['á'] = 'a', ['â'] = 'a', + ['ã'] = 'a', ['ä'] = 'a', ['å'] = 'a', + ['æ'] = 'ae', ['ç'] = 'c', + ['è'] = 'e', ['é'] = 'e', ['ê'] = 'e', ['ë'] = 'e', + ['ì'] = 'i', ['í'] = 'i', ['î'] = 'i', ['ï'] = 'i', + ['ð'] = 'd', ['ñ'] = 'n', + ['ò'] = 'o', ['ó'] = 'o', ['ô'] = 'o', ['õ'] = 'o', + ['ö'] = 'o', ['ø'] = 'o', + ['ù'] = 'u', ['ú'] = 'u', ['û'] = 'u', ['ü'] = 'u', + ['ý'] = 'y', ['ÿ'] = 'y', + + -- Extended latin A + + ['Ā'] = 'A', ['ā'] = 'a', ['Ă'] = 'A', ['ă'] = 'a', + ['Ą'] = 'A', ['ą'] = 'a', ['Ć'] = 'C', ['ć'] = 'c', + ['Ĉ'] = 'C', ['ĉ'] = 'c', ['Ċ'] = 'C', ['ċ'] = 'c', + ['Č'] = 'C', ['č'] = 'c', ['Ď'] = 'D', ['ď'] = 'd', + ['Đ'] = 'D', ['đ'] = 'd', ['Ē'] = 'E', ['ē'] = 'e', + ['Ĕ'] = 'E', ['ĕ'] = 'e', ['Ė'] = 'E', ['ė'] = 'e', + ['Ę'] = 'E', ['ę'] = 'e', ['Ě'] = 'E', ['ě'] = 'e', + ['Ĝ'] = 'G', ['Ğ'] = 'G', ['ğ'] = 'g', ['ĝ'] = 'g', + ['Ġ'] = 'G', ['ġ'] = 'g', ['Ģ'] = 'G', ['ģ'] = 'g', + ['Ĥ'] = 'H', ['ĥ'] = 'h', ['Ħ'] = 'H', ['ħ'] = 'h', + ['Ĩ'] = 'I', ['ĩ'] = 'i', ['Ī'] = 'I', ['ī'] = 'i', + ['Ĭ'] = 'I', ['ĭ'] = 'i', ['Į'] = 'I', ['į'] = 'i', + ['ı'] = 'i', ['İ'] = 'I', ['IJ'] = 'IJ', ['ij'] = 'ij', + ['Ĵ'] = 'J', ['ĵ'] = 'j', ['ķ'] = 'k', ['Ķ'] = 'K', + ['ĸ'] = 'k', + ['Ĺ'] = 'L', ['ĺ'] = 'l', ['Ļ'] = 'L', ['ļ'] = 'l', + ['Ľ'] = 'L', ['ľ'] = 'l', ['Ŀ'] = 'L', ['ŀ'] = 'l', + ['Ł'] = 'L', ['ł'] = 'l', ['Ń'] = 'N', ['ń'] = 'n', + ['Ņ'] = 'N', ['ņ'] = 'n', ['Ň'] = 'N', ['ň'] = 'n', + ['ʼn'] = 'n', ['Ŋ'] = 'n', ['ŋ'] = 'n', + ['Ō'] = 'O', ['ō'] = 'o', ['Ŏ'] = 'O', ['ŏ'] = 'o', + ['ő'] = 'o', ['Ő'] = 'O', ['œ'] = 'oe', ['Œ'] = 'OE', + ['Ŕ'] = 'R', ['ŕ'] = 'r', ['Ŗ'] = 'R', ['ŗ'] = 'r', + ['Ř'] = 'R', ['ř'] = 'r', ['Ś'] = 'S', ['ś'] = 's', + ['Ŝ'] = 'S', ['ŝ'] = 's', ['Ş'] = 'S', ['ş'] = 's', + ['Š'] = 'S', ['š'] = 's', ['Ţ'] = 'T', ['ţ'] = 't', + ['ť'] = 't', ['Ŧ'] = 'T', ['Ť'] = 'T', ['ŧ'] = 't', + ['Ũ'] = 'U', ['ũ'] = 'u', ['Ū'] = 'U', ['ū'] = 'u', + ['Ŭ'] = 'U', ['ŭ'] = 'u', ['Ů'] = 'U', ['ů'] = 'u', + ['Ű'] = 'U', ['ű'] = 'u', ['Ų'] = 'U', ['ų'] = 'u', + ['Ŵ'] = 'W', ['ŵ'] = 'w', ['Ŷ'] = 'Y', ['ŷ'] = 'y', + ['Ÿ'] = 'Y', + ['Ź'] = 'Z', ['ź'] = 'z', ['Ż'] = 'Z', ['ż'] = 'z', + ['Ž'] = 'Z', ['ž'] = 'z', ['ſ'] = 's', + + -- Extended latin B + ['ƀ'] = 'b', ['Ɓ'] = 'B', ['Ƃ'] = 'B', ['ƃ'] = 'b', + ['Ɔ'] = 'O', + ['Ƈ'] = 'C', ['ƈ'] = 'c', ['Ɖ'] = 'D', ['Ɗ'] = 'D', + ['Ƌ'] = 'D', ['ƌ'] = 'd', ['Ǝ'] = 'E', ['Ə'] = 'e', + ['Ɛ'] = 'E', + ['Ƒ'] = 'F', ['ƒ'] = 'f', ['Ɠ'] = 'G', + ['ƕ'] = 'hv', ['Ɨ'] = 'I', ['Ƙ'] = 'K', ['ƙ'] = 'k', + ['ƚ'] = 'l', ['Ɯ'] = 'M', ['Ɲ'] = 'N', ['ƞ'] = 'n', + ['Ɵ'] = 'O', + ['Ơ'] = 'O', ['ơ'] = 'o', ['Ƣ'] = 'OI', ['ƣ'] = 'oi', + ['Ƥ'] = 'P', ['ƥ'] = 'p', ['Ʀ'] = 'YR', + ['Ƨ'] = 'S', ['ƨ'] = 's', ['ƫ'] = 't', + ['Ƭ'] = 'T', ['ƭ'] = 't', ['Ʈ'] = 'T', + ['Ư'] = 'U', ['ư'] = 'u', ['Ʋ'] = 'V', + ['Ƴ'] = 'Y', ['ƴ'] = 'y', ['Ƶ'] = 'Z', ['ƶ'] = 'z', + ['ƻ'] = '2', ['Ƽ'] = '5', ['ƽ'] = '5', + ['DŽ'] = 'DZ', ['Dž'] = 'Dz', ['dž'] = 'dz', + ['LJ'] = 'LJ', ['Lj'] = 'Lj', ['lj'] = 'lj', + ['NJ'] = 'NJ', ['Nj'] = 'Nj', ['nj'] = 'nj', + ['Ǎ'] = 'A', ['ǎ'] = 'a', ['Ǐ'] = 'I', ['ǐ'] = 'i', + ['Ǒ'] = 'O', ['ǒ'] = 'o', ['Ǔ'] = 'U', ['ǔ'] = 'u', + ['Ǖ'] = 'U', ['ǖ'] = 'u', ['Ǘ'] = 'U', ['ǘ'] = 'u', + ['Ǚ'] = 'U', ['ǚ'] = 'u', ['Ǜ'] = 'U', ['ǜ'] = 'u', + ['ǝ'] = 'e', + ['Ǟ'] = 'A', ['ǟ'] = 'a', ['Ǡ'] = 'A', ['ǡ'] = 'a', + ['Ǣ'] = 'Æ', ['ǣ'] = 'æ', ['Ǥ'] = 'G', ['ǥ'] = 'g', + ['Ǧ'] = 'G', ['ǧ'] = 'g', ['Ǩ'] = 'K', ['ǩ'] = 'k', + ['Ǫ'] = 'Q', ['ǫ'] = 'q', ['Ǭ'] = 'Q', ['ǭ'] = 'q', + ['ǰ'] = 'J', + ['DZ'] = 'DZ', ['Dz'] = 'Dz', ['dz'] = 'dz', + ['Ǵ'] = 'G', ['ǵ'] = 'g', ['Ƕ'] = 'H', + ['Ǹ'] = 'N', ['ǹ'] = 'n', ['Ǻ'] = 'A', ['ǻ'] = 'a', + ['Ǽ'] = 'Æ', ['ǽ'] = 'æ', ['Ǿ'] = 'Ø', ['ǿ'] = 'ø', + ['Ȁ'] = 'A', ['ȁ'] = 'a', ['Ȃ'] = 'A', ['ȃ'] = 'a', + ['Ȅ'] = 'E', ['ȅ'] = 'e', ['Ȇ'] = 'E', ['ȇ'] = 'e', + ['Ȉ'] = 'I', ['ȉ'] = 'i', ['Ȋ'] = 'I', ['ȋ'] = 'i', + ['Ȍ'] = 'O', ['ȍ'] = 'o', ['Ȏ'] = 'O', ['ȏ'] = 'o', + ['Ȑ'] = 'R', ['ȑ'] = 'r', ['Ȓ'] = 'R', ['ȓ'] = 'r', + ['Ȕ'] = 'U', ['ȕ'] = 'u', ['Ȗ'] = 'U', ['ȗ'] = 'u', + ['Ș'] = 'S', ['ș'] = 's', ['Ț'] = 'T', ['ț'] = 't', + ['Ȟ'] = 'H', ['ȟ'] = 'h', ['Ƞ'] = 'N', + ['ȡ'] = 'd', + ['Ȣ'] = 'OU', ['ȣ'] = 'ou', ['Ȥ'] = 'Z', ['ȥ'] = 'z', + ['Ȧ'] = 'A', ['ȧ'] = 'a', ['Ȩ'] = 'E', ['ȩ'] = 'e', + ['Ȫ'] = 'O', ['ȫ'] = 'o', ['Ȭ'] = 'O', ['ȭ'] = 'o', + ['Ȯ'] = 'O', ['ȯ'] = 'o', ['Ȱ'] = 'O', ['ȱ'] = 'o', + ['Ȳ'] = 'Y', ['ȳ'] = 'y', ['ȴ'] = 'l', + ['ȵ'] = 'n', ['ȶ'] = 't', ['ȷ'] = 'j', + ['ȸ'] = 'db', ['ȹ'] = 'qp', ['Ⱥ'] = 'A', + ['Ȼ'] = 'C', ['ȼ'] = 'c', ['Ƚ'] = 'L', + ['Ⱦ'] = 'T', ['ȿ'] = 's', ['ɀ'] = 'z', + ['Ƀ'] = 'B', ['Ʉ'] = 'U', ['Ʌ'] = 'V', + ['Ɇ'] = 'E', ['ɇ'] = 'e', ['Ɉ'] = 'J', ['ɉ'] = 'j', + ['Ɋ'] = 'Q', ['ɋ'] = 'q', ['Ɍ'] = 'R', ['ɍ'] = 'r', + ['Ɏ'] = 'Y', ['ɏ'] = 'y', ['ɐ'] = 'a', + ['ɓ'] = 'b', ['ɔ'] = 'o', + ['ɕ'] = 'c', ['ɖ'] = 'd', ['ɗ'] = 'd', + ['ɘ'] = 'e', ['ə'] = 'e', ['ɚ'] = 'e', + ['ɛ'] = 'e', ['ɜ'] = 'e', ['ɝ'] = 'e', ['ɞ'] = 'e', + ['ɟ'] = 'j', + ['ɠ'] = 'g', ['ɡ'] = 'g', ['ɢ'] = 'G', + ['ɥ'] = 'h', ['ɦ'] = 'h', ['ɧ'] = 'h', + ['ɨ'] = 'i', ['ɪ'] = 'I', + ['ɫ'] = 'l', ['ɬ'] = 'l', ['ɭ'] = 'l', + ['ɮ'] = 'lz', + ['ɯ'] = 'm', ['ɰ'] = 'm', ['ɱ'] = 'm', + ['ɲ'] = 'n', ['ɳ'] = 'n', ['ɴ'] = 'N', + ['ɵ'] = 'o', ['ɶ'] = 'Œ', + ['ɹ'] = 'r', ['ɺ'] = 'r', ['ɻ'] = 'r', + ['ɼ'] = 'r', ['ɽ'] = 'r', ['ɾ'] = 'r', ['ɿ'] = 'r', +} diff --git a/mods/display_modpack/font_api/font.lua b/mods/display_modpack/font_api/font.lua new file mode 100644 index 00000000..5794867f --- /dev/null +++ b/mods/display_modpack/font_api/font.lua @@ -0,0 +1,274 @@ +--[[ + font_api mod for Minetest - Library creating textures with fonts and text + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Fallback table +local fallbacks = dofile(font_api.path.."/fallbacks.lua") + +-- Local functions +------------------ + +-- Returns number of UTF8 bytes of the first char of the string +local function get_char_bytes(str) + local msb = str:byte(1) + if msb ~= nil then + if msb < 0x80 then return 1 end + if msb >= 0xF0 then return 4 end + if msb >= 0xE0 then return 3 end + if msb >= 0xC2 then return 2 end + end +end + +-- Returns the unicode codepoint of the first char of the string +local function char_to_codepoint(str) + local bytes = get_char_bytes(str) + if bytes == 1 then + return str:byte(1) + elseif bytes == 2 and str:byte(2) ~= nil then + return (str:byte(1) - 0xC2) * 0x40 + + str:byte(2) + elseif bytes == 3 and str:byte(2) ~= nil and str:byte(3) ~= nil then + return (str:byte(1) - 0xE0) * 0x1000 + + str:byte(2) % 0x40 * 0x40 + + str:byte(3) % 0x40 + elseif bytes == 4 and str:byte(2) ~= nil and str:byte(3) ~= nil + and str:byte(4) ~= nil then -- Not tested + return (str:byte(1) - 0xF0) * 0x40000 + + str:byte(2) % 0x40 * 0x1000 + + str:byte(3) % 0x40 * 0x40 + + str:byte(4) % 0x40 + end +end + +-------------------------------------------------------------------------------- +--- Font class + +local Font = {} +font_api.Font = Font + +function Font:new(def) + + if type(def) ~= "table" then + minetest.log("error", + "[font_api] Font definition must be a table.") + return nil + end + + if def.height == nil or def.height <= 0 then + minetest.log("error", + "[font_api] Font definition must have a positive height.") + return nil + end + + if type(def.widths) ~= "table" then + minetest.log("error", + "[font_api] Font definition must have a widths array.") + return nil + end + + if def.widths[0] == nil then + minetest.log("error", + "[font_api] Font must have a char with codepoint 0 (=unknown char).") + return nil + end + + local font = table.copy(def) + setmetatable(font, self) + self.__index = self + + -- Check if fixedwidth + for codepoint, width in pairs(font.widths) do + font.fixedwidth = font.fixedwidth or width + if width ~= font.fixedwidth then + font.fixedwidth = nil + break + end + end + + return font +end + +--- Gets the next char of a text +-- @return Codepoint of first char, +-- @return Remaining string without this first char + +function Font:get_next_char(text) + local bytes = get_char_bytes(text) + + if bytes == nil then + minetest.log("warning", + "[font_api] Encountered a non UTF char, not displaying text.") + return nil, '' + end + + local codepoint = char_to_codepoint(text) + + if codepoint == nil then + minetest.log("warning", + "[font_api] Encountered a non UTF char, not displaying text.") + return nil, '' + end + + -- Fallback mechanism + if self.widths[codepoint] == nil then + local char = text:sub(1, bytes) + + if fallbacks[char] then + return self:get_next_char(fallbacks[char]..text:sub(bytes+1)) + else + return 0, text:sub(bytes+1) -- Ultimate fallback + end + else + return codepoint, text:sub(bytes+1) + end +end + +--- Returns the width of a given char +-- @param char : codepoint of the char +-- @return Char width +function Font:get_char_width(codepoint) + if self.fixedwidth then + return self.fixedwidth + elseif self.widths[codepoint] then + return self.widths[codepoint] + else + return self.widths[0] + end +end + +--- Text height for multiline text including margins and line spacing +-- @param nb_of_lines : number of text lines (default 1) +-- @return Text height + +function Font:get_height(nb_of_lines) + if nb_of_lines == nil then nb_of_lines = 1 end + + if nb_of_lines > 0 then + return + ( + (self.height or 0) + + (self.margintop or 0) + + (self.marginbottom or 0) + ) * nb_of_lines + + (self.linespacing or 0) * (nb_of_lines -1) + else + return nb_of_lines == 0 and 0 or nil + end +end + +--- Computes text width for a given text (ignores new lines) +-- @param line Line of text which the width will be computed. +-- @return Text width + +function Font:get_width(line) + local codepoint + local width = 0 + line = line or '' + + while line ~= "" do + codepoint, line = self:get_next_char(line) + if codepoint == nil then return 0 end -- UTF Error + width = width + self:get_char_width(codepoint) + end + + return width +end + +--- Legacy make_text_texture method (replaced by "render" - Dec 2018) + +function Font:make_text_texture(text, texturew, textureh, maxlines, + halign, valign, color) + return self:render(text, texturew, textureh, { + lines = maxlines, + valign = valign, + halign = halign, + color = color + }) +end + +--- Render text with the font in a view +-- @param text Text to be rendered +-- @param texturew Width (in pixels) of the texture (extra text will be truncated) +-- @param textureh Height (in pixels) of the texture (extra text will be truncated) +-- @param style Style of the rendering: +-- - lines: maximum number of text lines (if text is limited) +-- - halign: horizontal align ("left"/"center"/"right") +-- - valign: vertical align ("top"/"center"/"bottom") +-- - color: color of the text ("#rrggbb") +-- @return Texture string + +function Font:render(text, texturew, textureh, style) + local style = style or {} + + -- Split text into lines (and limit to style.lines # of lines) + local lines = {} + local pos = 1 + local found, line + repeat + found = string.find(text, "\n", pos) or (#text + 1) + line = string.sub(text, pos, found - 1) + lines[#lines + 1] = { text = line, width = self:get_width(line) } + pos = found + 1 + until (style.lines and (#lines >= style.lines)) or (pos > (#text + 1)) + + if not #lines then + return "" + end + + local x, y, codepoint + local texture = "" + local textheight = self:get_height(#lines) + + if style.valign == "top" then + y = 0 + elseif style.valign == "bottom" then + y = textureh - textheight + else + y = (textureh - textheight) / 2 + end + + y = y + (self.margintop or 0) + + for _, line in pairs(lines) do + if style.halign == "left" then + x = 0 + elseif style.halign == "right" then + x = texturew - line.width + else + x = (texturew - line.width) / 2 + end + + while line.text ~= '' do + codepoint, line.text = self:get_next_char(line.text) + if codepoint == nil then return '' end -- UTF Error + + -- Add image only if it is visible (at least partly) + if x + self.widths[codepoint] >= 0 and x <= texturew then + texture = texture.. + string.format(":%d,%d=font_%s_%04x.png", x, y, self.name, codepoint) + end + x = x + self.widths[codepoint] + end + + y = y + self:get_height() + (self.linespacing or 0) + end + texture = string.format("[combine:%dx%d", texturew, textureh)..texture + if style.color then + texture = texture.."^[colorize:"..style.color + end + return texture +end diff --git a/mods/display_modpack/font_api/fontform.lua b/mods/display_modpack/font_api/fontform.lua new file mode 100644 index 00000000..b7e6724d --- /dev/null +++ b/mods/display_modpack/font_api/fontform.lua @@ -0,0 +1,166 @@ +--[[ + font_api mod for Minetest - Library creating textures with fonts and text + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +local modname = minetest.get_current_modname() + +local contexts = {} + +minetest.register_on_leaveplayer(function(player) + if minetest.is_player(player) then + contexts[player:get_player_name()] = nil + end +end) + +local function get_context(playername) + if not contexts[playername] then + contexts[playername] = { playername = playername } + end + return contexts[playername] +end + +-- Show node formspec functions +local function show_node_formspec(playername, pos) + local meta = minetest.get_meta(pos) + + -- Decontextualize formspec + local fs = meta:get_string('formspec') + + if not fs then + return + end + + -- Change context and currrent_name references to nodemeta references + -- Change context and currrent_name references to nodemeta references + local nodemeta = string.format("nodemeta:%i,%i,%i", pos.x, pos.y ,pos.z) + fs = fs:gsub("current_name", nodemeta) + fs = fs:gsub("context", nodemeta) + + -- Change all ${} to their corresponding metadata values + local s, e + repeat + s, e = fs:find('%${.*}') + if s and e then + fs = fs:sub(1, s-1).. + minetest.formspec_escape(meta:get_string(fs:sub(s+2,e-1))).. + fs:sub(e+1) + end + until s == nil + + local context = get_context(playername) + context.node_pos = pos + + -- Find node on_receive_fields + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.on_receive_fields then + context.on_receive_fields = ndef.on_receive_fields + end + + -- Show formspec + minetest.show_formspec(playername, modname..':context_formspec', fs) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= modname..':context_formspec' then + return + end + + if not minetest.is_player(player) then + return true + end + + local context = get_context(player:get_player_name()) + if context.on_receive_fields then + context.on_receive_fields(context.pos, '', fields, player) + end + return true +end) + +-- Specific functions + +local function show_font_formspec(playername) + local context = get_context(playername) + local fonts = {} + for name, _ in pairs(font_api.registered_fonts) do + fonts[#fonts+1] = name + end + table.sort(fonts) + + local fs = string.format( + "size[4,%s]%s%s%sbutton_exit[0,%s;4,1;cancel;Cancel]", + #fonts + 0.8, default.gui_bg, default.gui_bg_img, default.gui_slots, + #fonts) + + for line = 1, #fonts do + local font = font_api.get_font(fonts[line]) + local texture = font:make_text_texture(font.name, font:get_height()*5, + font:get_height()*1.2, 1, "center", "top", "#fff") + fs = string.format( + "%simage[0.1,%s;4.5,0.8;%s]button_exit[0,%s;4,1;font_%s;]", + fs, line-0.9, texture, line-1, font.name) + end + minetest.show_formspec(context.playername, modname..':font_list', fs) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= modname..':font_list' then + return + end + + if not minetest.is_player(player) then + return true + end + + local playername = player:get_player_name() + local context = get_context(playername) + + if not context.pos + or minetest.is_protected(context.pos, playername) then + return true + end + + if fields.quit == 'true' then + for name, _ in pairs(font_api.registered_fonts) do + if fields['font_'..name] then + local meta = minetest.get_meta(context.pos) + meta:set_string("font", name) + display_api.update_entities(context.pos) + end + end + + if context.callback and type(context.callback) == "function" then + -- Using after to avoid the "double close" bug + minetest.after(0, context.callback, playername, context.pos) + else + -- Using after to avoid the "double close" bug + minetest.after(0, show_node_formspec, playername, context.pos) + end + end + return true +end) + +-- @param player Player viewing the form +-- @param pos Node pos +-- @param callback function(playername, pos) to be called on form close +function font_api.show_font_list(player, pos, callback) + if minetest.is_player(player) then + local context = get_context(player:get_player_name()) + context.pos = pos + context.callback = callback + show_font_formspec(player:get_player_name()) + end +end diff --git a/mods/display_modpack/font_api/init.lua b/mods/display_modpack/font_api/init.lua new file mode 100644 index 00000000..c5858f40 --- /dev/null +++ b/mods/display_modpack/font_api/init.lua @@ -0,0 +1,35 @@ +--[[ + font_api mod for Minetest - Library creating textures with fonts and text + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Global variables +------------------- + +font_api = {} +font_api.name = minetest.get_current_modname() +font_api.path = minetest.get_modpath(font_api.name) + +-- Inclusions +------------- + +dofile(font_api.path.."/font.lua") +dofile(font_api.path.."/registry.lua") +dofile(font_api.path.."/fontform.lua") +if minetest.get_modpath("display_api") then + dofile(font_api.path.."/display_api.lua") +end +dofile(font_api.path.."/deprecation.lua") diff --git a/mods/display_modpack/font_api/mod.conf b/mods/display_modpack/font_api/mod.conf new file mode 100644 index 00000000..1aaccc0d --- /dev/null +++ b/mods/display_modpack/font_api/mod.conf @@ -0,0 +1,3 @@ +name=font_api +description=A library for rendernig text on textures +optional_depends=display_api diff --git a/mods/display_modpack/font_api/registry.lua b/mods/display_modpack/font_api/registry.lua new file mode 100644 index 00000000..e1836755 --- /dev/null +++ b/mods/display_modpack/font_api/registry.lua @@ -0,0 +1,160 @@ +--[[ + font_api mod for Minetest - Library creating textures with fonts and text + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Global variables +------------------- + +font_api.registered_fonts = {} +font_api.registered_fonts_number = 0 + +-- Local variables +------------------ + +local default_font = false + +-- Local functions +------------------ + +-- Gets a default (settings or fist font) +local function get_default_font() + -- First call + if default_font == false then + default_font = nil + + -- First, try with settings + local settings_font = minetest.settings:get("default_font") + + if settings_font ~= nil and settings_font ~= "" then + default_font = font_api.registered_fonts[settings_font] + + if default_font == nil then + minetest.log("warning", "Default font in settings (\"".. + settings_font.."\") is not registered.") + end + end + + -- If failed, choose first font without default = false + if default_font == nil then + for _, font in pairs(font_api.registered_fonts) do + if font.default then + default_font = font + break + end + end + end + + -- If failed, chose first font + if default_font == nil then + for _, font in pairs(font_api.registered_fonts) do + default_font = font + break + end + end + + -- Error, no font registered + if default_font == nil then + minetest.log("error", + "No font registred, unable to choose a default font.") + end + end + + return default_font +end + +--- Returns font object to be used according to font_name +-- @param font_name: Name of the font +-- @return Font object if font found (or default font) + +function font_api.get_font(font_name) + local font = font_api.registered_fonts[font_name] + + if font == nil then + local message + + if font_name == nil then + message = "No font given" + else + message = "Font \""..font_name.."\" unregistered" + end + + font = get_default_font() + + if font ~= nil then + minetest.log("info", message..", using font \""..font.name.."\".") + end + end + + return font +end + +-- API functions +---------------- + +--- Returns de default font name +-- @return Default font name + +function font_api.get_default_font_name() + return get_default_font().name +end + +--- Register a new font +-- Textures corresponding to the font should be named after following patern : +-- font__.png +-- : name of the font +-- : 4 digit hexadecimal unicode of the char +-- @param font_name Name of the font to register +-- If registering different sizes of the same font, add size in the font name +-- (e.g. times_10, times_12...). +-- @param def font definition. A associative array with following keys : +-- @key default True (by default) if this font may be used as default font +-- @key height (mandatory) Height in pixels of all font textures +-- @key widths (mandatory) Array of character widths in pixels, indexed by +-- UTF codepoints +-- @key margintop (optional) Margin (in texture pixels) added on top of each +-- char texture. +-- @key marginbottom (optional) dded at bottom of each char texture. +-- @key linespacing (optional) Spacing (in texture pixels) between each lines. +-- margintop, marginbottom and linespacing can be negative numbers (default 0) +-- and are to be used to adjust various font styles to each other. + +-- TODO: Add something to remove common accent if not defined in font + +function font_api.register_font(font_name, font_def) + + if font_api.registered_fonts[font_name] ~= nil then + minetest.log("error", "Font \""..font_name.."\" already registered.") + return + end + + local font = font_api.Font:new(font_def) + + if font == nil then + minetest.log("error", "Unable to register font \""..font_name.."\".") + return + end + + font.name = font_name + font_api.registered_fonts[font_name] = font + font_api.registered_fonts_number = font_api.registered_fonts_number + 1 + + -- Force to choose again default font + -- (allows use of fonts registered after start) + default_font = false + + minetest.log("action", "New font registered in font_api: "..font_name..".") +end diff --git a/mods/display_modpack/font_api/settingtypes.txt b/mods/display_modpack/font_api/settingtypes.txt new file mode 100644 index 00000000..d1111598 --- /dev/null +++ b/mods/display_modpack/font_api/settingtypes.txt @@ -0,0 +1 @@ +default_font(Default font) string diff --git a/mods/display_modpack/font_api/textures/font_api_center.png b/mods/display_modpack/font_api/textures/font_api_center.png new file mode 100644 index 00000000..967db6ad Binary files /dev/null and b/mods/display_modpack/font_api/textures/font_api_center.png differ diff --git a/mods/display_modpack/font_api/textures/font_api_font.png b/mods/display_modpack/font_api/textures/font_api_font.png new file mode 100644 index 00000000..e4503385 Binary files /dev/null and b/mods/display_modpack/font_api/textures/font_api_font.png differ diff --git a/mods/display_modpack/font_api/textures/font_api_left.png b/mods/display_modpack/font_api/textures/font_api_left.png new file mode 100644 index 00000000..727410bd Binary files /dev/null and b/mods/display_modpack/font_api/textures/font_api_left.png differ diff --git a/mods/display_modpack/font_api/textures/font_api_right.png b/mods/display_modpack/font_api/textures/font_api_right.png new file mode 100644 index 00000000..16401d30 Binary files /dev/null and b/mods/display_modpack/font_api/textures/font_api_right.png differ diff --git a/mods/display_modpack/font_api/tools/make_font_lua.sh b/mods/display_modpack/font_api/tools/make_font_lua.sh new file mode 100755 index 00000000..e8583604 --- /dev/null +++ b/mods/display_modpack/font_api/tools/make_font_lua.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +scriptname=$(basename $0) +identify="identify" + +usage() { + echo "Usage: $0 fontname" + echo "fontname: The name of the font. Must correspond to existing texture/font__????.png files" +} + +if [ $# -ne 1 ] +then + usage + exit 1 +fi + +font_name=$1 + +for f in textures/font_${font_name}_????.png +do + if [[ $f =~ textures/font_${font_name}_([0-9a-fA-F]{4}).png ]] + then + code=$((16#${BASH_REMATCH[1]})) + size=$(identify $f | cut -d " " -f 3) + w=$(echo $size | cut -d "x" -f 1) + h=$(echo $size | cut -d "x" -f 2) + + if [ -z "$font_height" ] + then + font_height=$h + else + if [ $font_height -ne $h ] + then + echo "Error : $f as height of $h pixels, previous textures have a height of $font_height pixels. All textures should have the same height." + fi + fi + + if [ -z "$font_widths" ] + then + font_widths="[$code]=$w" + else + font_widths="$font_widths, [$code]=$w" + fi + fi +done + +echo "--[[ + +$luafile generated by $scriptname $(LANG=en_US date) + +--]] + +font_api.register_font( + '$font_name', + { + height = $font_height, + widths = { + $font_widths + }, + } +); +" > font_$font_name.lua + +if grep -q font_api depends.txt &>/dev/null +then + echo "font_api already in depends.txt." +else + echo "adding font_api to depends.txt." + echo "font_api" >> depends.txt +fi + diff --git a/mods/display_modpack/font_api/tools/make_font_textures.sh b/mods/display_modpack/font_api/tools/make_font_textures.sh new file mode 100755 index 00000000..4a3191c8 --- /dev/null +++ b/mods/display_modpack/font_api/tools/make_font_textures.sh @@ -0,0 +1,111 @@ +#!/bin/bash + +# This program generates a bitmap font for font_api mod for Minetest game. +# (c) Andrzej Pieńkowski +# (c) Pierre-Yves Rollo +# License: GPL + +usage() { + echo "Usage: $0 fontfile fontname fontsize" + echo "fontfile: A TTF font file to use to create textures." + echo "fontname: The font name to be used in font_api (should be simple, with no spaces)." + echo "fontsize: Font height to be rendered." +} + +if [ $# -ne 3 ] +then + usage + exit 1 +fi + +fontfile=$1 +fontname=$2 +fontsize=$3 + +if [ ! -r "$fontfile" ] +then + echo "$fontfile not readable." + exit 1 +fi + +# check imagemagick +hash convert &>/dev/null +if [ $? -eq 1 ]; then + echo -e "Error: This program requires convert from ImageMagick! Please install it by typing 'sudo apt-get install imagemagick' in terminal." + abort=1 +fi + +# check ttx +hash ttx &>/dev/null +if [ $? -eq 1 ]; then + echo -e "Error: This program requires ttx from FontTools! Please install it by typing 'sudo apt-get install fonttools' in terminal." + abort=1 +fi + +if [ $abort ] +then + exit 1 +fi + +generate() { + for i in $(seq $((0x$1)) $((0x$2))) + do + if echo "$codepoints" | grep -qi $(printf "0x%x" $i) + then + hex=$(printf "%04x" $i) + echo -e "Generating textures/font_${fontname}_$hex.png file for \"\\U$hex\" char." + if [[ "$hex" == "005c" ]] # Backslash char + then + convert -background none -fill black -font "$fontfile" -pointsize $fontsize label:"\\\\" -colorspace gray -channel alpha -threshold 50% textures/font_${fontname}_$hex.png + else + convert -background none -fill black -font "$fontfile" -pointsize $fontsize label:"$(echo -en "\\U$hex")" -colorspace gray -channel alpha -threshold 50% textures/font_${fontname}_$hex.png + fi + fi + done +} + +mkdir textures + +# Reads all available code points in the font. +codepoints=$(ttx -o - "$fontfile" | grep " + 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. + diff --git a/mods/display_modpack/ontime_clocks/README.md b/mods/display_modpack/ontime_clocks/README.md new file mode 100644 index 00000000..d9db9984 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/README.md @@ -0,0 +1,49 @@ +# Ontime Clocks + +This mod provides clocks that display real ingame time. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=19365) at the Minetest forums. + +**Dependancies**: display_api, default + +**License**: Code under LGPL, textures under CC-BY-SA + +## Recipes + +**Green and red digital clocks** + + - D - + G M G + - - - + +G = Glass, D = Dye, M = Mese Crystal, - = Empty + +Green dye for green clock, red dye for red clock + +**White clock** + + S P S + - M - + - - - + +P = Paper, S = Steel Ingot, M = Mese Crystal, - = Empty + + +**Frameless clock** + + S D S + - M - + - - - + +D = Dye, S = Steel Ingot, M = Mese Crystal, - = Empty + +Black dye for black clock, White dye for white clock + +**Gold frameless clock** + + G - G + - M - + - - - + +G = Gold Ingot, M = Mese Crystal, - = Empty + diff --git a/mods/display_modpack/ontime_clocks/common.lua b/mods/display_modpack/ontime_clocks/common.lua new file mode 100644 index 00000000..cced2999 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/common.lua @@ -0,0 +1,61 @@ +--[[ + ontime_clocks mod for Minetest - Clock nodes displaying ingame time + (c) Pierre-Yves Rollo + + This file is part of ontime_clocks. + + ontime_clocks is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ontime_clocks is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ontime_clocks. If not, see . +--]] + +-- Entity for time display +display_api.register_display_entity("ontime_clocks:display") + +function ontime_clocks.get_h24() + return math.floor(minetest.get_timeofday()*24)%24 +end + +function ontime_clocks.get_h12() + return math.floor(minetest.get_timeofday()*24)%12 +end + +function ontime_clocks.get_m12() + return math.floor(minetest.get_timeofday()*288)%12 +end + +function ontime_clocks.get_digital_properties(color_off, color_on, hour, minute) + return + { + textures={"ontime_clocks_digital_background.png^[colorize:"..color_off + .."^([combine:21x7" + ..":0,"..(-7*(math.floor(hour/10))).."=ontime_clocks_digital_digit.png" + ..":5,"..(-7*(hour%10)).."=ontime_clocks_digital_digit.png" + ..":9,-70=ontime_clocks_digital_digit.png" + ..":12,"..(-7*(math.floor(minute/2))).."=ontime_clocks_digital_digit.png" + ..":17,"..(-35*(minute%2)).."=ontime_clocks_digital_digit.png" + .."^[colorize:"..color_on..")"}, + visual_size = {x=21/32, y=7/32} + } +end + +function ontime_clocks.get_needles_properties(color, size, hour, minute) + return + { + textures={"[combine:"..size.."x"..size + ..":0,"..(-size*hour).."=ontime_clocks_needle_h"..size..".png" + ..":0,"..(-size*minute).."=ontime_clocks_needle_m"..size..".png" + .."^[colorize:"..color}, + visual_size = {x=size/64, y=size/64} + } +end + diff --git a/mods/display_modpack/ontime_clocks/copyright.txt b/mods/display_modpack/ontime_clocks/copyright.txt new file mode 100644 index 00000000..a2afd940 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/copyright.txt @@ -0,0 +1,8 @@ +Code, Textures and Models by Pierre-Yves Rollo (pyrollo) +intllib support (i18n) by (fat115) +intllib fallback code and tools by Diego Martínez (kaeza) +Extra contibutors: +(Thomas--S) +Translations: +Muhammad Nur Hidayat Yasuyoshi (MuhdNurHidayat) +(fat115) diff --git a/mods/display_modpack/ontime_clocks/crafts.lua b/mods/display_modpack/ontime_clocks/crafts.lua new file mode 100644 index 00000000..c94352af --- /dev/null +++ b/mods/display_modpack/ontime_clocks/crafts.lua @@ -0,0 +1,75 @@ +--[[ + ontime_clocks mod for Minetest - Clock nodes displaying ingame time + (c) Pierre-Yves Rollo + + This file is part of ontime_clocks. + + ontime_clocks is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ontime_clocks is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ontime_clocks. If not, see . +--]] + +minetest.register_craft({ + output = 'ontime_clocks:green_digital', + recipe = { + {'', 'dye:green', ''}, + {'default:glass', 'default:mese_crystal', 'default:glass'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:red_digital', + recipe = { + {'', 'dye:red', ''}, + {'default:glass', 'default:mese_crystal', 'default:glass'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:white', + recipe = { + {'default:steel_ingot', 'default:paper', 'default:steel_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:frameless_black', + recipe = { + {'default:steel_ingot', 'dye:black', 'default:steel_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:frameless_gold', + recipe = { + {'default:gold_ingot', '', 'default:gold_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'ontime_clocks:frameless_white', + recipe = { + {'default:steel_ingot', 'dye:white', 'default:steel_ingot'}, + {'', 'default:mese_crystal', ''}, + {'', '', ''}, + } +}) + + diff --git a/mods/display_modpack/ontime_clocks/depends.txt b/mods/display_modpack/ontime_clocks/depends.txt new file mode 100644 index 00000000..07a2ec14 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/depends.txt @@ -0,0 +1,5 @@ +default +dye +display_api + +intllib? diff --git a/mods/display_modpack/ontime_clocks/init.lua b/mods/display_modpack/ontime_clocks/init.lua new file mode 100644 index 00000000..d0ac3348 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/init.lua @@ -0,0 +1,31 @@ +--[[ + ontime_clocks mod for Minetest - Clock nodes displaying ingame time + (c) Pierre-Yves Rollo + + This file is part of ontime_clocks. + + ontime_clocks is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ontime_clocks is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ontime_clocks. If not, see . +--]] + +ontime_clocks = {} +ontime_clocks.name = minetest.get_current_modname() +ontime_clocks.path = minetest.get_modpath(ontime_clocks.name) + +-- Load support for intllib. +local S, NS = dofile(ontime_clocks.path.."/intllib.lua") +ontime_clocks.intllib = S + +dofile(ontime_clocks.path.."/common.lua") +dofile(ontime_clocks.path.."/nodes.lua") +dofile(ontime_clocks.path.."/crafts.lua") diff --git a/mods/display_modpack/ontime_clocks/intllib.lua b/mods/display_modpack/ontime_clocks/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/display_modpack/ontime_clocks/locale/fr.po b/mods/display_modpack/ontime_clocks/locale/fr.po new file mode 100644 index 00000000..ed5d2b4f --- /dev/null +++ b/mods/display_modpack/ontime_clocks/locale/fr.po @@ -0,0 +1,43 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-05 09:50+0200\n" +"PO-Revision-Date: 2017-05-08 06:20+0200\n" +"Last-Translator: Peppy \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: nodes.lua +msgid "Green digital clock" +msgstr "Horloge numérique verte" + +#: nodes.lua +msgid "Red digital clock" +msgstr "Horloge numérique rouge" + +#: nodes.lua +msgid "White clock" +msgstr "Horloge blanche" + +#: nodes.lua +msgid "Frameless clock" +msgstr "Horloge sans cadre" + +#: nodes.lua +msgid "Frameless gold clock" +msgstr "Horloge dorée sans cadre" + +#: nodes.lua +msgid "Frameless white clock" +msgstr "Horloge blanche sans cadre" diff --git a/mods/display_modpack/ontime_clocks/locale/ms.po b/mods/display_modpack/ontime_clocks/locale/ms.po new file mode 100644 index 00000000..4d52ac28 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/locale/ms.po @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Yaya (Nurul Azeera Hidayah @ Muhammad Nur Hidayat) , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Display Modpack\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 11:21+0200\n" +"PO-Revision-Date: 2020-07-05 11:32+0000\n" +"Last-Translator: Yaya MNH48 \n" +"Language-Team: Malay \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.3\n" + +#: nodes.lua +msgid "Green digital clock" +msgstr "Jam digital hijau" + +#: nodes.lua +msgid "Red digital clock" +msgstr "Jam digital merah" + +#: nodes.lua +msgid "White clock" +msgstr "Jam putih" + +#: nodes.lua +msgid "Frameless clock" +msgstr "Jam tanpa bingkai" + +#: nodes.lua +msgid "Frameless gold clock" +msgstr "Jam emas tanpa bingkai" + +#: nodes.lua +msgid "Frameless white clock" +msgstr "Jam putih tanpa bingkai" diff --git a/mods/display_modpack/ontime_clocks/locale/template.pot b/mods/display_modpack/ontime_clocks/locale/template.pot new file mode 100644 index 00000000..dca736f4 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/locale/template.pot @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 11:21+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" + +#: nodes.lua +msgid "Green digital clock" +msgstr "" + +#: nodes.lua +msgid "Red digital clock" +msgstr "" + +#: nodes.lua +msgid "White clock" +msgstr "" + +#: nodes.lua +msgid "Frameless clock" +msgstr "" + +#: nodes.lua +msgid "Frameless gold clock" +msgstr "" + +#: nodes.lua +msgid "Frameless white clock" +msgstr "" diff --git a/mods/display_modpack/ontime_clocks/mod.conf b/mods/display_modpack/ontime_clocks/mod.conf new file mode 100644 index 00000000..9c1a2e61 --- /dev/null +++ b/mods/display_modpack/ontime_clocks/mod.conf @@ -0,0 +1,4 @@ +name=ontime_clocks +description=Clocks displaing real ingame time +depends=default,dye,display_api +optional_depends=intllib diff --git a/mods/display_modpack/ontime_clocks/nodes.lua b/mods/display_modpack/ontime_clocks/nodes.lua new file mode 100644 index 00000000..107d2e9a --- /dev/null +++ b/mods/display_modpack/ontime_clocks/nodes.lua @@ -0,0 +1,246 @@ +--[[ + ontime_clocks mod for Minetest - Clock nodes displaying ingame time + (c) Pierre-Yves Rollo + + This file is part of ontime_clocks. + + ontime_clocks is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ontime_clocks is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ontime_clocks. If not, see . +--]] + +local S = ontime_clocks.intllib + +-- Green digital clock +minetest.register_node("ontime_clocks:green_digital", { + description = S("Green digital clock"), + inventory_image = "ontime_clocks_green_digital_inventory.png", + wield_image = "ontime_clocks_green_digital_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -3/16, -7/16, -13/32, 7/32, 7/16 }, + wall_top = { -7/16, 0.5, -7/32, 7/16, 13/32, 3/16 }, + wall_bottom = { -7/16, -0.5, -3/16, 7/16, -13/32, 7/32 }, + }, + tiles = {"ontime_clocks_digital.png"}, + groups = {oddly_breakable_by_hand=1, not_blocking_trains=1, display_api=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = 13/32 - 0.01, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_digital_properties( + "#040", "#0F0", ontime_clocks.get_h24(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:green_digital"}, + interval = 5, + chance = 1, + action = display_api.update_entities, +}) + +-- Red digital clock +minetest.register_node("ontime_clocks:red_digital", { + description = S("Red digital clock"), + inventory_image = "ontime_clocks_red_digital_inventory.png", + wield_image = "ontime_clocks_red_digital_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -3/16, -7/16, -13/32, 7/32, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_digital.png"}, + groups = {oddly_breakable_by_hand=1, not_blocking_trains=1, display_api=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = 13/32 - 0.01, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_digital_properties( + "#400", "#F00", ontime_clocks.get_h24(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:red_digital"}, + interval = 5, + chance = 1, + action = display_api.update_entities, +}) + + +minetest.register_node("ontime_clocks:white", { + description = S("White clock"), + inventory_image = "ontime_clocks_white_inventory.png", + wield_image = "ontime_clocks_white_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -6/16, 7/16, 7/16}, + wall_bottom = { -7/16, -0.5, -7/16, 7/16, -7/16, 7/16}, + wall_top = { -7/16, 0.5, -7/16, 7/16, 7/16, 7/16}, + }, + tiles = {"ontime_clocks_white.png"}, + groups = {oddly_breakable_by_hand=1, not_blocking_trains=1, display_api=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = 6/16 - 0.01, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#000", 36, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:white"}, + interval = 5, + chance = 1, + action = display_api.update_entities, +}) + +minetest.register_node("ontime_clocks:frameless_black", { + description = S("Frameless clock"), + inventory_image = "ontime_clocks_frameless_inventory.png", + wield_image = "ontime_clocks_frameless_inventory.png", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -0.45, 7/16, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_frameless.png"}, + groups = {oddly_breakable_by_hand=1, not_blocking_trains=1, display_api=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = 7/16, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#000", 48, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:frameless_black"}, + interval = 5, + chance = 1, + action = display_api.update_entities, +}) + +minetest.register_node("ontime_clocks:frameless_gold", { + description = S("Frameless gold clock"), + inventory_image = "ontime_clocks_frameless_inventory.png^[colorize:#FF0", + wield_image = "ontime_clocks_frameless_inventory.png^[colorize:#FF0", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -0.45, 7/16, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_frameless.png^[colorize:#FF0"}, + groups = {oddly_breakable_by_hand=1, not_blocking_trains=1, display_api=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = 7/16, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#FF0", 48, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:frameless_gold"}, + interval = 5, + chance = 1, + action = display_api.update_entities, +}) + +minetest.register_node("ontime_clocks:frameless_white", { + description = S("Frameless white clock"), + inventory_image = "ontime_clocks_frameless_inventory.png^[colorize:#FFF", + wield_image = "ontime_clocks_frameless_inventory.png^[colorize:#FFF", + paramtype = "light", + paramtype2 = "wallmounted", + drawtype = "nodebox", + node_box = { + type = "wallmounted", + wall_side = { -0.5, -7/16, -7/16, -0.45, 7/16, 7/16 }, + wall_bottom = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + wall_top = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + tiles = {"ontime_clocks_frameless.png^[colorize:#FFF"}, + groups = {oddly_breakable_by_hand=1, not_blocking_trains=1, display_api=1}, + display_entities = { + ["ontime_clocks:display"] = { + depth = 7/16, + on_display_update = function(pos, objref) + objref:set_properties( + ontime_clocks.get_needles_properties( + "#FFF", 48, ontime_clocks.get_h12(), ontime_clocks.get_m12())) + end }, + }, + on_place = display_api.on_place, + on_construct = display_api.on_construct, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, +}) + +minetest.register_abm({ + nodenames = {"ontime_clocks:frameless_white"}, + interval = 5, + chance = 1, + action = display_api.update_entities, +}) diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital.png new file mode 100644 index 00000000..a4876cdd Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital_background.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital_background.png new file mode 100644 index 00000000..c4164929 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital_background.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital_digit.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital_digit.png new file mode 100644 index 00000000..e5b5448f Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_digital_digit.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_frameless.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_frameless.png new file mode 100644 index 00000000..37405d3d Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_frameless.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_frameless_inventory.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_frameless_inventory.png new file mode 100644 index 00000000..59605079 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_frameless_inventory.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_green_digital_inventory.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_green_digital_inventory.png new file mode 100644 index 00000000..2bf90432 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_green_digital_inventory.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_h36.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_h36.png new file mode 100644 index 00000000..e08302f3 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_h36.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_h48.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_h48.png new file mode 100644 index 00000000..1c28ef90 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_h48.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_m36.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_m36.png new file mode 100644 index 00000000..31eb1aea Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_m36.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_m48.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_m48.png new file mode 100644 index 00000000..fd83f41f Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_needle_m48.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_red_digital_inventory.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_red_digital_inventory.png new file mode 100644 index 00000000..54001670 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_red_digital_inventory.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_white.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_white.png new file mode 100644 index 00000000..e4843032 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_white.png differ diff --git a/mods/display_modpack/ontime_clocks/textures/ontime_clocks_white_inventory.png b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_white_inventory.png new file mode 100644 index 00000000..74364089 Binary files /dev/null and b/mods/display_modpack/ontime_clocks/textures/ontime_clocks_white_inventory.png differ diff --git a/mods/display_modpack/ontime_clocks/tools/updatepo.sh b/mods/display_modpack/ontime_clocks/tools/updatepo.sh new file mode 100755 index 00000000..feb2504c --- /dev/null +++ b/mods/display_modpack/ontime_clocks/tools/updatepo.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --language=Lua \ + --sort-by-file \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --keyword=F \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/display_modpack/screenshot.png b/mods/display_modpack/screenshot.png new file mode 100644 index 00000000..e6650d2a Binary files /dev/null and b/mods/display_modpack/screenshot.png differ diff --git a/mods/display_modpack/signs/LICENSE.txt b/mods/display_modpack/signs/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/display_modpack/signs/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/display_modpack/signs/README.md b/mods/display_modpack/signs/README.md new file mode 100644 index 00000000..0282d2e5 --- /dev/null +++ b/mods/display_modpack/signs/README.md @@ -0,0 +1,30 @@ +# Signs + +This mod provides various signs with text display. Text is locked if area is protected. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=19365) at the Minetest forums. + +**Dependancies**: default, display\_lib, font\_lib + +**License**: Code under LGPL, Textures and models under CC-BY-SA + +## Recipes + +**Poster** + + P P - + P P - + P P - + +P = Paper + +Poster displays only title, much more text can be read by right-clicking on it. + +**Wooden direction sign** + + W W W + W W - + - - - + +W = Wooden Plank (group) + diff --git a/mods/display_modpack/signs/common.lua b/mods/display_modpack/signs/common.lua new file mode 100644 index 00000000..733a44cf --- /dev/null +++ b/mods/display_modpack/signs/common.lua @@ -0,0 +1,37 @@ +--[[ + signs mod for Minetest - Various signs with text displayed on + (c) Pierre-Yves Rollo + + This file is part of signs. + + signs is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs. If not, see . +--]] + +local S = signs.intllib +local F = function(...) return minetest.formspec_escape(S(...)) end + +-- Generic callback for show_formspec displayed formspecs of "sign" mod + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local found, _, mod, node_name, pos = formname:find("^([%w_]+):([%w_]+)@([^:]+)") + if found then + if mod ~= 'signs' then return end + + local ndef = minetest.registered_nodes[mod..":"..node_name] + + if ndef and ndef.on_receive_fields then + ndef.on_receive_fields(minetest.string_to_pos(pos), formname, fields, player) + end + end +end) diff --git a/mods/display_modpack/signs/compatibility.lua b/mods/display_modpack/signs/compatibility.lua new file mode 100644 index 00000000..dea87500 --- /dev/null +++ b/mods/display_modpack/signs/compatibility.lua @@ -0,0 +1,117 @@ +--[[ + signs mod for Minetest - Various signs with text displayed on + (c) Pierre-Yves Rollo + + This file is part of signs. + + signs is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs. If not, see . +--]] + + +-- Wallmounted to facedir conversion +------------------------------------ + +local wallmounted_to_facedir = { + [0]=1, -- Should not happend with signs + [1]=1, -- Should not happend with signs + [2]=1, + [3]=3, + [4]=0, + [5]=2 +} + +-- Nodes conversions +local convert_nodes = { + ['signs:wooden_right'] = 'signs:wooden_right_sign', + ['signs:wooden_left'] = 'signs:wooden_left_sign', + ['signs:poster'] = 'signs:paper_poster' +} + +local function compatibility_check_1(pos, node) + -- Old wallmounted modes to new facedir nodes conversion + node.name = convert_nodes[node.name] + if node.name then + node.param2 = wallmounted_to_facedir[node.param2] + display_api.on_destruct(pos) + minetest.swap_node(pos, node) + display_api.on_construct(pos) + end +end + +minetest.register_lbm({ name = "signs:conpatibility_1", + nodenames = {"signs:wooden_right", "signs:wooden_left", "signs:poster"}, + action = compatibility_check_1, +}) + +-- Text entity name change because of signs_lib using signs prefix +------------------------------------------------------------------ + +-- If no other mod registered signs:text, register it. +-- We need to have this entity registered to be able to remove it. +if minetest.registered_entities["signs:text"] == nil then + minetest.register_entity("signs:text", { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + }) +end + +local function compatibility_check_2(pos, node) + -- Remove old entity + for _, objref in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + local entity = objref:get_luaentity() + if entity and entity.name == "signs:text" then + objref:remove() + end + end + -- Create new entity + display_api.update_entities(pos) +end + +minetest.register_lbm({ name = "signs:conpatibility_2", + nodenames = {"signs:wooden_right_sign", "signs:wooden_left_sign", "signs:paper_poster"}, + action = compatibility_check_2, +}) + +--Backwards compatibility API functions + +signs.set_display_text = function(...) + minetest.log("warning", "signs.set_display_text() is deprecated, please use signs_api.set_display_text() instead.") + return signs_api.set_display_text(...) +end + +signs.set_formspec = function(...) + minetest.log("warning", "signs.set_formspec() is deprecated, please use signs_api.set_formspec() instead.") + return signs_api.set_formspec(...) +end + +signs.on_receive_fields = function(...) + minetest.log("warning", "signs.on_receive_fields() is deprecated, please use signs_api.on_receive_fields() instead.") + return signs_api.on_receive_fields(...) +end + +signs.on_place_direction = function(...) + minetest.log("warning", "signs.on_place_direction() is deprecated, please use signs_api.on_place_direction() instead.") + return signs_api.on_place_direction(...) +end + +signs.on_rotate = function(...) + minetest.log("warning", "signs.on_rotate() is deprecated, please use signs_api.on_rotate() instead.") + return signs_api.on_rotate(...) +end + +signs.register_sign = function(...) + minetest.log("warning", "signs.register_sign() is deprecated, please use signs_api.register_sign() instead.") + return signs_api.register_sign(...) +end diff --git a/mods/display_modpack/signs/copyright.txt b/mods/display_modpack/signs/copyright.txt new file mode 100644 index 00000000..9e3b2944 --- /dev/null +++ b/mods/display_modpack/signs/copyright.txt @@ -0,0 +1,10 @@ +Code, Textures and Models by Pierre-Yves Rollo (pyrollo) +intllib support (i18n) by (fat115) +intllib fallback code and tools by Diego Martínez (kaeza) +Extra contributors: +(gpcf) +(Thomas--S) +Translations: +Muhammad Nur Hidayat Yasuyoshi (MuhdNurHidayat) +(fat115) + diff --git a/mods/display_modpack/signs/crafts.lua b/mods/display_modpack/signs/crafts.lua new file mode 100644 index 00000000..4242d5e9 --- /dev/null +++ b/mods/display_modpack/signs/crafts.lua @@ -0,0 +1,61 @@ +minetest.register_craft({ + output = 'signs:wooden_right_sign', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'dye:black'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs:wooden_right_sign', + type = 'shapeless', + recipe = { 'signs:wooden_long_sign' } +}) + +minetest.register_craft({ + output = 'signs:wooden_long_sign', + recipe = { + {'group:wood', 'dye:black', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs:wooden_long_sign', + type = 'shapeless', + recipe = { 'signs:wooden_right_sign' } +}) + +minetest.register_craft({ + output = 'signs:wooden_sign', + recipe = { + {'', 'dye:black', ''}, + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'signs:paper_poster', + recipe = { + {'default:paper', 'default:paper', 'dye:black'}, + {'default:paper', 'default:paper', ''}, + {'default:paper', 'default:paper', ''}, + } +}) + +minetest.register_craft({ + output = 'signs:label_small', + recipe = { + {'default:paper', 'dye:black'}, + } +}) + +minetest.register_craft({ + output = 'signs:label_medium', + recipe = { + {'default:paper', 'default:paper', 'dye:black'}, + } +}) diff --git a/mods/display_modpack/signs/depends.txt b/mods/display_modpack/signs/depends.txt new file mode 100644 index 00000000..afeb8380 --- /dev/null +++ b/mods/display_modpack/signs/depends.txt @@ -0,0 +1,4 @@ +default +dye +signs_api +intllib? diff --git a/mods/display_modpack/signs/init.lua b/mods/display_modpack/signs/init.lua new file mode 100644 index 00000000..4f9239fc --- /dev/null +++ b/mods/display_modpack/signs/init.lua @@ -0,0 +1,36 @@ +--[[ + signs mod for Minetest - Various signs with text displayed on + (c) Pierre-Yves Rollo + + This file is part of signs. + + signs is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs. If not, see . +--]] + +signs = {} +signs.name = minetest.get_current_modname() +signs.path = minetest.get_modpath(signs.name) + +-- Load support for intllib. +local S, NS = dofile(signs.path.."/intllib.lua") +signs.intllib = S + +dofile(signs.path.."/common.lua") +dofile(signs.path.."/nodes.lua") +dofile(signs.path.."/crafts.lua") +dofile(signs.path.."/compatibility.lua") + + + + diff --git a/mods/display_modpack/signs/intllib.lua b/mods/display_modpack/signs/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/display_modpack/signs/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/display_modpack/signs/locale/fr.po b/mods/display_modpack/signs/locale/fr.po new file mode 100644 index 00000000..7a005449 --- /dev/null +++ b/mods/display_modpack/signs/locale/fr.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 13:20+0200\n" +"PO-Revision-Date: 2017-05-08 07:08+0200\n" +"Last-Translator: Peppy \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" + +#: common.lua nodes.lua +msgid "Text" +msgstr "Texte" + +#: common.lua nodes.lua +msgid "Write" +msgstr "Écrire" + +#: common.lua +#, lua-format +msgid " (first %s lines only)" +msgstr " (uniquement les %s premières lignes)" + +#: nodes.lua +msgid "Title" +msgstr "Titre" + +#: nodes.lua +msgid "Close" +msgstr "Fermer" + +#: nodes.lua +msgid "(right-click to read more text)" +msgstr "(Clic-droit pour afficher le texte entier)" + +#: nodes.lua +msgid "Wooden direction sign" +msgstr "Panneau de direction en bois" + +#: nodes.lua +msgid "Poster" +msgstr "Affiche" + +#~ msgid "Textd" +#~ msgstr "Texte" diff --git a/mods/display_modpack/signs/locale/ms.po b/mods/display_modpack/signs/locale/ms.po new file mode 100644 index 00000000..defee7b9 --- /dev/null +++ b/mods/display_modpack/signs/locale/ms.po @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Yaya (Nurul Azeera Hidayah @ Muhammad Nur Hidayat) , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Display Modpack\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 13:20+0200\n" +"PO-Revision-Date: 2020-07-05 11:34+0000\n" +"Last-Translator: Yaya MNH48 \n" +"Language-Team: Malay \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.3\n" + +#: common.lua nodes.lua +msgid "Text" +msgstr "Teks" + +#: common.lua nodes.lua +msgid "Write" +msgstr "Tulis" + +#: common.lua +#, lua-format +msgid " (first %s lines only)" +msgstr " (%s baris pertama sahaja)" + +#: nodes.lua +msgid "Title" +msgstr "Tajuk" + +#: nodes.lua +msgid "Close" +msgstr "Tutup" + +#: nodes.lua +msgid "(right-click to read more text)" +msgstr "(klik-kanan untuk baca teks penuh)" + +#: nodes.lua +msgid "Wooden direction sign" +msgstr "Papan tanda arah kayu" + +#: nodes.lua +msgid "Poster" +msgstr "Poster" diff --git a/mods/display_modpack/signs/locale/template.pot b/mods/display_modpack/signs/locale/template.pot new file mode 100644 index 00000000..a1fc0654 --- /dev/null +++ b/mods/display_modpack/signs/locale/template.pot @@ -0,0 +1,51 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 13:20+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: common.lua nodes.lua +msgid "Text" +msgstr "" + +#: common.lua nodes.lua +msgid "Write" +msgstr "" + +#: common.lua +#, lua-format +msgid " (first %s lines only)" +msgstr "" + +#: nodes.lua +msgid "Title" +msgstr "" + +#: nodes.lua +msgid "Close" +msgstr "" + +#: nodes.lua +msgid "(right-click to read more text)" +msgstr "" + +#: nodes.lua +msgid "Wooden direction sign" +msgstr "" + +#: nodes.lua +msgid "Poster" +msgstr "" diff --git a/mods/display_modpack/signs/mod.conf b/mods/display_modpack/signs/mod.conf new file mode 100644 index 00000000..81d1358a --- /dev/null +++ b/mods/display_modpack/signs/mod.conf @@ -0,0 +1,4 @@ +name=signs +description=Basic signs and posters with text display using signs_api +depends=default,dye,signs_api +optional_depends=intllib diff --git a/mods/display_modpack/signs/models/signs_dir_left.obj b/mods/display_modpack/signs/models/signs_dir_left.obj new file mode 100644 index 00000000..91ead2d8 --- /dev/null +++ b/mods/display_modpack/signs/models/signs_dir_left.obj @@ -0,0 +1,51 @@ +# Blender v2.76 (sub 0) OBJ File: 'signs_dir_right.blend' +# www.blender.org +mtllib signs_dir_right.mtl +o Plane +v -0.500000 0.218750 0.437500 +v -0.500000 -0.218750 0.437500 +v 0.250000 0.218750 0.437500 +v 0.250000 -0.218750 0.437500 +v 0.437500 -0.000000 0.437500 +v -0.500000 0.218750 0.500000 +v -0.500000 -0.218750 0.500000 +v 0.250000 0.218750 0.500000 +v 0.250000 -0.218750 0.500000 +v 0.437500 -0.000000 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.937500 +vt 0.812500 0.937500 +vt 1.000000 0.718750 +vt 0.812500 0.500000 +vt 0.062500 0.437500 +vt 0.812500 0.437500 +vt 1.000000 0.218750 +vt 0.812500 0.000000 +vt 0.062500 0.000000 +vt 1.000000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.625000 +vt 1.000000 0.625000 +vt 0.062500 1.000000 +vt 0.812500 1.000000 +vt 0.000000 0.312500 +vt 0.062500 0.312500 +vt 0.000000 0.000000 +vt 0.000000 0.500000 +vt 0.000000 0.937500 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 0.000000 1.000000 +vn 0.759300 0.650800 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.000000 -1.000000 0.000000 +vn 0.759300 -0.650800 -0.000000 +vn -1.000000 0.000000 0.000000 +usemtl None +s off +f 2/1/1 1/2/1 3/3/1 5/4/1 4/5/1 +f 7/6/2 9/7/2 10/8/2 8/9/2 6/10/2 +f 3/11/3 8/12/3 10/13/3 5/14/3 +f 1/2/4 6/15/4 8/16/4 3/3/4 +f 4/5/5 9/7/5 7/6/5 2/1/5 +f 5/17/6 10/18/6 9/10/6 4/19/6 +f 2/1/7 7/20/7 6/21/7 1/2/7 diff --git a/mods/display_modpack/signs/models/signs_dir_right.obj b/mods/display_modpack/signs/models/signs_dir_right.obj new file mode 100644 index 00000000..6597bfd4 --- /dev/null +++ b/mods/display_modpack/signs/models/signs_dir_right.obj @@ -0,0 +1,51 @@ +# Blender v2.76 (sub 0) OBJ File: 'signs_dir_left.blend' +# www.blender.org +mtllib signs_dir_left.mtl +o Plane +v 0.500000 -0.218750 0.437500 +v 0.500000 0.218750 0.437500 +v -0.250000 -0.218750 0.437500 +v -0.250000 0.218750 0.437500 +v -0.437500 -0.000000 0.437500 +v 0.500000 -0.218750 0.500000 +v 0.500000 0.218750 0.500000 +v -0.250000 -0.218750 0.500000 +v -0.250000 0.218750 0.500000 +v -0.437500 -0.000000 0.500000 +vt 0.062500 0.500000 +vt 0.062500 0.937500 +vt 0.812500 0.937500 +vt 1.000000 0.718750 +vt 0.812500 0.500000 +vt 0.062500 0.437500 +vt 0.812500 0.437500 +vt 1.000000 0.218750 +vt 0.812500 0.000000 +vt 0.062500 0.000000 +vt 1.000000 0.312500 +vt 0.937500 0.312500 +vt 0.937500 0.625000 +vt 1.000000 0.625000 +vt 0.062500 1.000000 +vt 0.812500 1.000000 +vt 0.000000 0.312500 +vt 0.062500 0.312500 +vt 0.000000 0.000000 +vt 0.000000 0.500000 +vt 0.000000 0.937500 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 1.000000 +vn -0.759300 -0.650800 -0.000000 +vn 0.000000 -1.000000 -0.000000 +vn -0.000000 1.000000 0.000000 +vn -0.759300 0.650800 0.000000 +vn 1.000000 0.000000 0.000000 +usemtl None +s off +f 2/1/1 1/2/1 3/3/1 5/4/1 4/5/1 +f 7/6/2 9/7/2 10/8/2 8/9/2 6/10/2 +f 3/11/3 8/12/3 10/13/3 5/14/3 +f 1/2/4 6/15/4 8/16/4 3/3/4 +f 4/5/5 9/7/5 7/6/5 2/1/5 +f 5/17/6 10/18/6 9/10/6 4/19/6 +f 2/1/7 7/20/7 6/21/7 1/2/7 diff --git a/mods/display_modpack/signs/nodes.lua b/mods/display_modpack/signs/nodes.lua new file mode 100644 index 00000000..7c238c4a --- /dev/null +++ b/mods/display_modpack/signs/nodes.lua @@ -0,0 +1,253 @@ +--[[ + signs mod for Minetest - Various signs with text displayed on + (c) Pierre-Yves Rollo + + This file is part of signs. + + signs is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs. If not, see . +--]] + +local S = signs.intllib +local F = function(...) return minetest.formspec_escape(S(...)) end + +-- Poster specific formspec +local function display_poster(pos, node, player) + local meta = minetest.get_meta(pos) + + local def = minetest.registered_nodes[node.name].display_entities["signs:display_text"] + local font = font_api.get_font(meta:get_string("font") or def.font_name) + + local fs + local fname = string.format("%s@%s:display", + node.name, minetest.pos_to_string(pos)) + + -- Title texture + local titletexture = font:render(meta:get_string("display_text"), + font:get_height()*8.4, font:get_height(), { lines = 1 }) + + fs = string.format([=[ + size[7,9]bgcolor[#0000] + background[0,0;7,9;signs_poster_formspec.png] + image[0,-0.2;8.4,2;%s] + style_type[textarea;textcolor=#111] + textarea[0.3,1.5;7,8;;%s;]]=], + titletexture, + minetest.colorize("#111", + minetest.formspec_escape(meta:get_string("text")))) + + if minetest.is_protected(pos, player:get_player_name()) then + fs = string.format("%sbutton_exit[2.5,8;2,1;ok;%s]", fs, F("Close")) + else + fs = string.format( + "%sbutton[1,8;2,1;edit;%s]button_exit[4,8;2,1;ok;%s]", + fs, F("Edit"), F("Close")) + end + minetest.show_formspec(player:get_player_name(), fname, fs) +end + +local function edit_poster(pos, node, player) + local meta = minetest.get_meta(pos) + + local fs + local fname = string.format("%s@%s:edit", + node.name, minetest.pos_to_string(pos)) + + if not minetest.is_protected(pos, player:get_player_name()) then + fs = string.format([=[ + size[6.5,7.5]%s%s%s + field[0.5,0.7;6,1;display_text;%s;%s] + textarea[0.5,1.7;6,6;text;%s;%s] + button[1.25,7;2,1;font;%s] + button_exit[3.25,7;2,1;write;%s]]=], + default.gui_bg, default.gui_bg_img, default.gui_slots, F("Title"), + minetest.formspec_escape(meta:get_string("display_text")), + F("Text"), minetest.formspec_escape(meta:get_string("text")), + F("Title font"), F("Write")) + minetest.show_formspec(player:get_player_name(), fname, fs) + end +end + +-- Poster specific on_receive_fields callback +local function on_receive_fields_poster(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + + if not minetest.is_protected(pos, player:get_player_name()) and fields then + if formname == node.name.."@"..minetest.pos_to_string(pos)..":display" + and fields.edit then + edit_poster(pos, node, player) + return true + end + if formname == node.name.."@"..minetest.pos_to_string(pos)..":edit" + then + if (fields.write or fields.font or fields.key_enter) then + meta:set_string("display_text", fields.display_text) + meta:set_string("text", fields.text) + meta:set_string("infotext", "\""..fields.display_text + .."\"\n"..S("(right-click to read more text)")) + display_api.update_entities(pos) + end + if (fields.write or fields.key_enter) then + display_poster(pos, node, player) + elseif (fields.font) then + font_api.show_font_list(player, pos, function (playername, pos) + local player = minetest.get_player_by_name(playername) + local node = minetest.get_node(pos) + if player and node then + edit_poster(pos, node, player) + end + end) + end + return true + end + end +end + +-- Text entity for all signs +display_api.register_display_entity("signs:display_text") + +-- Sign models and registration +local models = { + wooden_sign = { + depth = 1/16, width = 14/16, height = 12/16, + entity_fields = { + size = { x = 12/16, y = 10/16 }, + maxlines = 3, + color = "#000", + }, + node_fields = { + description = S("Wooden sign"), + tiles = { "signs_wooden.png" }, + inventory_image = "signs_wooden_inventory.png", + groups= { dig_immediate = 2 }, + }, + }, + wooden_long_sign = { + depth = 1/16, width = 1, height = 7/16, + entity_fields = { + size = { x = 1, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("Wooden long sign"), + tiles = { "signs_wooden_long.png", "signs_wooden_long.png", + "signs_wooden_long.png^[transformR90", + "signs_wooden_long.png^[transformR90", + "signs_wooden_long.png", "signs_wooden_long.png", + }, + inventory_image = "signs_wooden_long_inventory.png", + groups= { dig_immediate = 2 }, + }, + }, + wooden_right_sign = { + depth = 1/16, width = 14/16, height = 7/16, + entity_fields = { + right = -3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color="#000", + }, + node_fields = { + description = S("Wooden direction sign"), + tiles = { "signs_wooden_direction.png" }, + inventory_image = "signs_wooden_direction_inventory.png", + signs_other_dir = 'signs:wooden_left_sign', + on_place = signs_api.on_place_direction, + drawtype = "mesh", + mesh = "signs_dir_right.obj", + selection_box = { type="fixed", fixed = {-0.5, -7/32, 0.5, 7/16, 7/32, 7/16}}, + collision_box = { type="fixed", fixed = {-0,5, -7/32, 0.5, 7/16, 7/32, 7/16}}, + groups= { dig_immediate = 2 }, + }, + }, + wooden_left_sign = { + depth = 1/16, width = 14/16, height = 7/16, + entity_fields = { + right = 3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("Wooden direction sign"), + tiles = { "signs_wooden_direction.png" }, + inventory_image = "signs_wooden_direction_inventory.png", + signs_other_dir = 'signs:wooden_right_sign', + drawtype = "mesh", + mesh = "signs_dir_left.obj", + selection_box = { type="fixed", fixed = {-7/16, -7/32, 0.5, 0.5, 7/32, 7/16}}, + collision_box = { type="fixed", fixed = {-7/16, -7/32, 0.5, 0.5, 7/32, 7/16}}, + groups = { not_in_creative_inventory = 1, dig_immediate = 2 }, + drop = "signs:wooden_right_sign", + }, + }, + paper_poster = { + depth = 1/32, width = 26/32, height = 30/32, + entity_fields = { + top = -11/32, + size = { x = 26/32, y = 6/32 }, + maxlines = 1, + color = "#000", + }, + node_fields = { + description = S("Poster"), + tiles = { "signs_poster_sides.png", "signs_poster_sides.png", + "signs_poster_sides.png", "signs_poster_sides.png", + "signs_poster_sides.png", "signs_poster.png" }, + inventory_image = "signs_poster_inventory.png", + groups= { dig_immediate = 3 }, + on_construct = display_api.on_construct, + on_rightclick = display_poster, + on_receive_fields = on_receive_fields_poster, + on_punch = function(pos, node, player, pointed_thing) + display_api.update_entities(pos) + end, + }, + }, + label_small = { + depth = 1/32, width = 4/16, height = 4/16, + entity_fields = { + size = { x = 4/16, y = 4/16 }, + maxlines = 1, + color = "#000", + }, + node_fields = { + description = S("Small label"), + tiles = { "signs_label.png" }, + inventory_image = "signs_label_small_inventory.png", + groups= { dig_immediate = 3 }, + }, + }, + label_medium = { + depth = 1/32, width = 8/16, height = 8/16, + entity_fields = { + size = { x = 8/16, y = 8/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("Label"), + tiles = { "signs_label.png" }, + inventory_image = "signs_label_medium_inventory.png", + groups= { dig_immediate = 3 }, + }, + }, +} + +-- Node registration +for name, model in pairs(models) +do + signs_api.register_sign("signs", name, model) +end diff --git a/mods/display_modpack/signs/svg/black_direction.svg b/mods/display_modpack/signs/svg/black_direction.svg new file mode 100644 index 00000000..8e9b8a9d --- /dev/null +++ b/mods/display_modpack/signs/svg/black_direction.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/mods/display_modpack/signs/svg/blue_street.svg b/mods/display_modpack/signs/svg/blue_street.svg new file mode 100644 index 00000000..0aa87ffc --- /dev/null +++ b/mods/display_modpack/signs/svg/blue_street.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mods/display_modpack/signs/svg/green_street.svg b/mods/display_modpack/signs/svg/green_street.svg new file mode 100644 index 00000000..5d875097 --- /dev/null +++ b/mods/display_modpack/signs/svg/green_street.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/mods/display_modpack/signs/svg/poster-formspec.svg b/mods/display_modpack/signs/svg/poster-formspec.svg new file mode 100644 index 00000000..1aa8fa21 --- /dev/null +++ b/mods/display_modpack/signs/svg/poster-formspec.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/mods/display_modpack/signs/svg/poster.svg b/mods/display_modpack/signs/svg/poster.svg new file mode 100644 index 00000000..cc9e8fd5 --- /dev/null +++ b/mods/display_modpack/signs/svg/poster.svg @@ -0,0 +1,465 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + +   + + + + + + + + diff --git a/mods/display_modpack/signs/textures/signs_label.png b/mods/display_modpack/signs/textures/signs_label.png new file mode 100644 index 00000000..fa38e6aa Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_label.png differ diff --git a/mods/display_modpack/signs/textures/signs_label_medium_inventory.png b/mods/display_modpack/signs/textures/signs_label_medium_inventory.png new file mode 100644 index 00000000..9b9b67a2 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_label_medium_inventory.png differ diff --git a/mods/display_modpack/signs/textures/signs_label_small_inventory.png b/mods/display_modpack/signs/textures/signs_label_small_inventory.png new file mode 100644 index 00000000..86946dd4 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_label_small_inventory.png differ diff --git a/mods/display_modpack/signs/textures/signs_poster.png b/mods/display_modpack/signs/textures/signs_poster.png new file mode 100644 index 00000000..c00b036f Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_poster.png differ diff --git a/mods/display_modpack/signs/textures/signs_poster_formspec.png b/mods/display_modpack/signs/textures/signs_poster_formspec.png new file mode 100644 index 00000000..7b85bdf3 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_poster_formspec.png differ diff --git a/mods/display_modpack/signs/textures/signs_poster_inventory.png b/mods/display_modpack/signs/textures/signs_poster_inventory.png new file mode 100644 index 00000000..da069975 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_poster_inventory.png differ diff --git a/mods/display_modpack/signs/textures/signs_poster_sides.png b/mods/display_modpack/signs/textures/signs_poster_sides.png new file mode 100644 index 00000000..0cf32d68 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_poster_sides.png differ diff --git a/mods/display_modpack/signs/textures/signs_wooden.png b/mods/display_modpack/signs/textures/signs_wooden.png new file mode 100644 index 00000000..bff6324c Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_wooden.png differ diff --git a/mods/display_modpack/signs/textures/signs_wooden_direction.png b/mods/display_modpack/signs/textures/signs_wooden_direction.png new file mode 100644 index 00000000..bf85a34a Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_wooden_direction.png differ diff --git a/mods/display_modpack/signs/textures/signs_wooden_direction_inventory.png b/mods/display_modpack/signs/textures/signs_wooden_direction_inventory.png new file mode 100644 index 00000000..32c49ca5 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_wooden_direction_inventory.png differ diff --git a/mods/display_modpack/signs/textures/signs_wooden_inventory.png b/mods/display_modpack/signs/textures/signs_wooden_inventory.png new file mode 100644 index 00000000..e8e821dd Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_wooden_inventory.png differ diff --git a/mods/display_modpack/signs/textures/signs_wooden_long.png b/mods/display_modpack/signs/textures/signs_wooden_long.png new file mode 100644 index 00000000..6b64a958 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_wooden_long.png differ diff --git a/mods/display_modpack/signs/textures/signs_wooden_long_inventory.png b/mods/display_modpack/signs/textures/signs_wooden_long_inventory.png new file mode 100644 index 00000000..f584b8c8 Binary files /dev/null and b/mods/display_modpack/signs/textures/signs_wooden_long_inventory.png differ diff --git a/mods/display_modpack/signs/tools/updatepo.sh b/mods/display_modpack/signs/tools/updatepo.sh new file mode 100755 index 00000000..feb2504c --- /dev/null +++ b/mods/display_modpack/signs/tools/updatepo.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --language=Lua \ + --sort-by-file \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --keyword=F \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/display_modpack/signs_api/LICENSE.txt b/mods/display_modpack/signs_api/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/display_modpack/signs_api/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/display_modpack/signs_api/README.md b/mods/display_modpack/signs_api/README.md new file mode 100644 index 00000000..38e8d960 --- /dev/null +++ b/mods/display_modpack/signs_api/README.md @@ -0,0 +1,33 @@ +# Signs API + +This mod provides various helper functions for registereing signs with text display. Text is locked if area is protected. +No actual signs get registered by this mod, the signs are defined in the sign submod. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=19365) at the Minetest forums. + +**Dependancies**: default, display\_lib, font\_lib + +**License**: Code under LGPL, Textures and models under CC-BY-SA + +## API Functions +### `signs_api.set_display_text(pos, text)` +Sets the text of a sign. Usually called in `on_receive_fields`. + +### `signs_api.set_formspec(pos)` +Usually called in `on_construct` to set the formspec. + +### `signs_api.on_receive_fields(pos, formname, fields, player)` +Helper function for `on_receive_fields`. Sets the display text and checks for protection. + +### `signs_api.on_place_direction(itemstack, placer, pointed_thing)` +On place callback for direction signs (chooses which sign according to look direction). + +### `signs_api.on_rotate(pos, node, player, mode, new_param2)` +Handles screwdriver rotation. Direction is affected for direction signs. + +### `signs_api.register_sign(mod, name, model)` +A method to quickly register signs. + +## Changelog +### 2019-03-14 +- __sign_api__: Screwdriver behavior changed. Now, left click rotates and changes direction. diff --git a/mods/display_modpack/signs_api/copyright.txt b/mods/display_modpack/signs_api/copyright.txt new file mode 100644 index 00000000..b70e0519 --- /dev/null +++ b/mods/display_modpack/signs_api/copyright.txt @@ -0,0 +1,10 @@ +Code by Pierre-Yves Rollo (pyrollo) +intllib support (i18n) by (fat115) +intllib fallback code and tools by Diego Martínez (kaeza) +Extra contributors: +(gpcf) +(Thomas--S) +Translations: +Muhammad Nur Hidayat Yasuyoshi (MuhdNurHidayat) +(fat115) + diff --git a/mods/display_modpack/signs_api/depends.txt b/mods/display_modpack/signs_api/depends.txt new file mode 100644 index 00000000..f75ffcc2 --- /dev/null +++ b/mods/display_modpack/signs_api/depends.txt @@ -0,0 +1,4 @@ +default +intllib? +display_api +font_api diff --git a/mods/display_modpack/signs_api/init.lua b/mods/display_modpack/signs_api/init.lua new file mode 100644 index 00000000..1bd00d6a --- /dev/null +++ b/mods/display_modpack/signs_api/init.lua @@ -0,0 +1,251 @@ +--[[ + signs mod for Minetest - Various signs with text displayed on + (c) Pierre-Yves Rollo + + This file is part of signs. + + signs is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs. If not, see . +--]] + +signs_api = {} +signs_api.name = minetest.get_current_modname() +signs_api.path = minetest.get_modpath(signs_api.name) + +-- Load support for intllib. +local S, NS = dofile(signs_api.path.."/intllib.lua") +signs_api.intllib = S +local F = function(...) return minetest.formspec_escape(S(...)) end + +function signs_api.set_display_text(pos, text, font) + local meta = minetest.get_meta(pos) + meta:set_string("display_text", text) + if text and text ~= "" then + meta:set_string("infotext", "\""..text.."\"") + else + meta:set_string("infotext", "") + end + if font then + meta:set_string("font", font) + end + display_api.update_entities(pos) +end + +function signs_api.set_formspec(pos) + local meta = minetest.get_meta(pos) + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.display_entities + and ndef.display_entities["signs:display_text"] then + local maxlines = ndef.display_entities["signs:display_text"].maxlines + local fs, y + + if maxlines == 1 then + fs = "field[0.5,0.7;5.5,1;display_text;"..F("Text").. + ";${display_text}]" + y = 1.2 + else + local extralabel = "" + if maxlines then + extralabel = F(" (first %s lines only)"):format(maxlines) + end + + fs = "textarea[0.5,0.7;5.5,2;display_text;"..F("Text").."".. + extralabel..";${display_text}]" + y = 2.4 + end + + fs = fs.."button[1,"..y..";2,1;font;"..F("Font").."]" + fs = fs.."button_exit[3,"..y..";2,1;ok;"..F("Write").."]" + y = y + 0.8 + fs = "size[6,"..y.."]"..default.gui_bg.. + default.gui_bg_img..default.gui_slots..fs + + meta:set_string("formspec", fs) + end +end + +function signs_api.on_receive_fields(pos, formname, fields, player) + if not minetest.is_protected(pos, player:get_player_name()) then + if fields and (fields.ok or fields.key_enter) then + signs_api.set_display_text(pos, fields.display_text) + end + if fields and (fields.font) then + signs_api.set_display_text(pos, fields.display_text) + font_api.show_font_list(player, pos) + end + end +end + +-- On place callback for direction signs +-- (chooses which sign according to look direction) +function signs_api.on_place_direction(itemstack, placer, pointed_thing) + local name = itemstack:get_name() + local ndef = minetest.registered_nodes[name] + local restriction = display_api.is_rotation_restricted() + + local bdir = { + x = pointed_thing.under.x - pointed_thing.above.x, + y = pointed_thing.under.y - pointed_thing.above.y, + z = pointed_thing.under.z - pointed_thing.above.z} + + local pdir = placer:get_look_dir() + + local ndir, test + + if ndef.paramtype2 == "facedir" then + -- If legacy mode, only accept upright nodes + if restriction and bdir.x == 0 and bdir.z == 0 then + -- Ceiling or floor pointed (facedir chosen from player dir) + ndir = minetest.dir_to_facedir({x=pdir.x, y=0, z=pdir.z}) + else + -- Wall pointed or no rotation restriction + ndir = minetest.dir_to_facedir(bdir, not restriction) + end + + test = { [0]=-pdir.x, pdir.z, pdir.x, -pdir.z, -pdir.x, [8]=pdir.x } + end + + if ndef.paramtype2 == "wallmounted" then + ndir = minetest.dir_to_wallmounted(bdir) + -- If legacy mode, only accept upright nodes + if restriction and (ndir == 0 or ndir == 1) then + ndir = minetest.dir_to_wallmounted({x=pdir.x, y=0, z=pdir.z}) + end + + test = { [0]=-pdir.x, -pdir.x, pdir.z, -pdir.z, -pdir.x, pdir.x} + end + + -- Only for direction signs + -- TODO:Maybe improve ground and ceiling placement in every directions + if ndef.signs_other_dir then + if test[ndir] > 0 then + itemstack:set_name(ndef.signs_other_dir) + end + itemstack = minetest.item_place(itemstack, placer, pointed_thing, ndir) + itemstack:set_name(name) + + return itemstack + else + return minetest.item_place(itemstack, placer, pointed_thing, ndir) + end +end + +-- Handles screwdriver rotation +-- (see "if" block below for rotation restriction mode). +signs_api.on_rotate = function(pos, node, player, mode, new_param2) + -- If rotation mode is 1 and sign is directional, swap direction between + -- each rotation. + if mode == 1 then + local ndef = minetest.registered_nodes[node.name] + if ndef.signs_other_dir then + -- Switch direction + node = {name = ndef.signs_other_dir, + param1 = node.param1, param2 = node.param2} + minetest.swap_node(pos, node) + display_api.update_entities(pos) + -- Rotate only if not "main" sign + -- TODO:Improve detection of "main" direction sign + if ndef.groups and ndef.groups.not_in_creative_inventory then + return display_api.on_rotate(pos, node, player, mode, new_param2) + else + return true + end + end + end + return display_api.on_rotate(pos, node, player, mode, new_param2) +end + +-- Legacy mode with rotation restriction +-- TODO:When MT < 5.0 no more in use, to be removed +if display_api.is_rotation_restricted() then + signs_api.on_rotate = function(pos, node, player, mode, new_param2) + -- If rotation mode is 2 and sign is directional, swap direction. + -- Otherwise use display_api's on_rotate function. + if mode == 2 then + local ndef = minetest.registered_nodes[node.name] + if ndef.signs_other_dir then + minetest.swap_node(pos, {name = ndef.signs_other_dir, + param1 = node.param1, param2 = node.param2}) + display_api.update_entities(pos) + return true + end + end + return display_api.on_rotate(pos, node, player, mode, new_param2) + end +end + +function signs_api.register_sign(mod, name, model) + -- Default fields + local fields = { + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-model.width/2, -model.height/2, 0.5, + model.width/2, model.height/2, 0.5 - model.depth}, + }, + groups = {choppy=2, dig_immediate=2, not_blocking_trains=1, display_api=1}, + sounds = default.node_sound_defaults(), + display_entities = { + ["signs:display_text"] = { + on_display_update = font_api.on_display_update, + depth = 0.5 - display_api.entity_spacing - model.depth, + size = { x = model.width, y = model.height }, + aspect_ratio = 1/2, + maxlines = 1, + }, + + }, + on_place = display_api.on_place, + on_construct = function(pos) + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + local meta = minetest.get_meta(pos) + meta:set_string("font", ndef.display_entities.font_name or + font_api.get_default_font_name()) + signs_api.set_formspec(pos) + display_api.on_construct(pos) + end, + on_destruct = display_api.on_destruct, + on_rotate = signs_api.on_rotate, + on_receive_fields = signs_api.on_receive_fields, + on_punch = function(pos, node, player, pointed_thing) + signs_api.set_formspec(pos) + display_api.update_entities(pos) + end, + } + + -- Node fields override + for key, value in pairs(model.node_fields) do + if key == "groups" then + for key2, value2 in pairs(value) do + fields[key][key2] = value2 + end + else + fields[key] = value + end + end + + if not fields.wield_image then fields.wield_image = fields.inventory_image end + + -- Entity fields override + for key, value in pairs(model.entity_fields) do + fields.display_entities["signs:display_text"][key] = value + end + + minetest.register_node(mod..":"..name, fields) +end + +-- Text entity for all signs +display_api.register_display_entity("signs:display_text") diff --git a/mods/display_modpack/signs_api/intllib.lua b/mods/display_modpack/signs_api/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/display_modpack/signs_api/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/display_modpack/signs_api/locale/fr.po b/mods/display_modpack/signs_api/locale/fr.po new file mode 100644 index 00000000..e490d1b4 --- /dev/null +++ b/mods/display_modpack/signs_api/locale/fr.po @@ -0,0 +1,49 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-01 05:56+0100\n" +"PO-Revision-Date: 2017-05-08 07:08+0200\n" +"Last-Translator: Peppy \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" + +#: common.lua +msgid "Text" +msgstr "Texte" + +#: common.lua +msgid "Write" +msgstr "Écrire" + +#: common.lua +#, lua-format +msgid " (first %s lines only)" +msgstr " (uniquement les %s premières lignes)" + +#~ msgid "Title" +#~ msgstr "Titre" + +#~ msgid "Close" +#~ msgstr "Fermer" + +#~ msgid "(right-click to read more text)" +#~ msgstr "(Clic-droit pour afficher le texte entier)" + +#~ msgid "Wooden direction sign" +#~ msgstr "Panneau de direction en bois" + +#~ msgid "Poster" +#~ msgstr "Affiche" + +#~ msgid "Textd" +#~ msgstr "Texte" diff --git a/mods/display_modpack/signs_api/locale/ms.po b/mods/display_modpack/signs_api/locale/ms.po new file mode 100644 index 00000000..0d90222a --- /dev/null +++ b/mods/display_modpack/signs_api/locale/ms.po @@ -0,0 +1,46 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Yaya (Nurul Azeera Hidayah @ Muhammad Nur Hidayat) , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Display Modpack\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-02-01 05:56+0100\n" +"PO-Revision-Date: 2020-07-05 11:31+0000\n" +"Last-Translator: Yaya MNH48 \n" +"Language-Team: Malay \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.3\n" + +#: common.lua +msgid "Text" +msgstr "Teks" + +#: common.lua +msgid "Write" +msgstr "Tulis" + +#: common.lua +#, lua-format +msgid " (first %s lines only)" +msgstr " (%s baris pertama sahaja)" + +#~ msgid "Title" +#~ msgstr "Tajuk" + +#~ msgid "Close" +#~ msgstr "Tutup" + +#~ msgid "(right-click to read more text)" +#~ msgstr "(klik-kanan untuk baca teks penuh)" + +#~ msgid "Wooden direction sign" +#~ msgstr "Papan tanda arah kayu" + +#~ msgid "Poster" +#~ msgstr "Poster" diff --git a/mods/display_modpack/signs_api/locale/template.pot b/mods/display_modpack/signs_api/locale/template.pot new file mode 100644 index 00000000..6004024d --- /dev/null +++ b/mods/display_modpack/signs_api/locale/template.pot @@ -0,0 +1,31 @@ +# 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: 2018-02-01 05:56+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: common.lua +msgid "Text" +msgstr "" + +#: common.lua +msgid "Write" +msgstr "" + +#: common.lua +#, lua-format +msgid " (first %s lines only)" +msgstr "" diff --git a/mods/display_modpack/signs_api/mod.conf b/mods/display_modpack/signs_api/mod.conf new file mode 100644 index 00000000..94ebf6a0 --- /dev/null +++ b/mods/display_modpack/signs_api/mod.conf @@ -0,0 +1,4 @@ +name=signs_api +description=A library providing various helper functions for registereing signs with text display +depends=default,display_api,font_api +optional_depends=intllib diff --git a/mods/display_modpack/signs_api/tools/updatepo.sh b/mods/display_modpack/signs_api/tools/updatepo.sh new file mode 100755 index 00000000..feb2504c --- /dev/null +++ b/mods/display_modpack/signs_api/tools/updatepo.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --language=Lua \ + --sort-by-file \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --keyword=F \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/display_modpack/signs_road/LICENSE.txt b/mods/display_modpack/signs_road/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/display_modpack/signs_road/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/display_modpack/signs_road/README.md b/mods/display_modpack/signs_road/README.md new file mode 100644 index 00000000..0a2f685d --- /dev/null +++ b/mods/display_modpack/signs_road/README.md @@ -0,0 +1,76 @@ +# Signs Road + +This mod provides road signs with text display. Text is locked if area is protected. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=19365) at the Minetest forums. + +**Dependancies**: default, display\_lib, font\_lib, signs + +**License**: Code under LGPL, texture under CC-BY-SA + +## Recipes + +**Blue Street Sign** + + B W - + S S S + - - - + +B = Blue Dye, W = White Dye, S = Steel Ingot + +**Large Banner** + +Shapeless recipe : four white street signs. + + S S S + S - - + - - - + +S = White street sign + +**Red and White Street Sign** + + W R - + S S S + - - - + +W = White Dye, R = Red Dye, S = Steel Ingot + +**Black direction sign** + + B W S + S S - + - - - + +B = Black Dye, W = White Dye, S = Steel Ingot + +**White Signs** + +Two kinds of signs, normal and direction signs : + + W B - W B S + S S S S S - + - - - - - - + +W = White Dye, B = Black Dye, S = Steel Ingot + +**Green Signs** + +Two kinds of signs, normal and direction signs : + + G W - G W S + S S S S S - + - - - - - - + +G = Green Dye, W = White Dye, S = Steel Ingot + +**Yellow Signs** + +Two kinds of signs, normal and direction signs : + + Y B - Y B S + S S S S S - + - - - - - - + +Y = Yellow Dye, B = Black Dye, S = Steel Ingot + diff --git a/mods/display_modpack/signs_road/compatibility.lua b/mods/display_modpack/signs_road/compatibility.lua new file mode 100644 index 00000000..5fb673ae --- /dev/null +++ b/mods/display_modpack/signs_road/compatibility.lua @@ -0,0 +1,90 @@ +--[[ + signs mod for Minetest - Various signs with text displayed on + (c) Pierre-Yves Rollo + + This file is part of signs. + + signs is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs. If not, see . +--]] + +-- Wallmounted to facedir conversion +------------------------------------ + +local wallmounted_to_facedir = { + [0]=1, -- Should not happend with signs + [1]=1, -- Should not happend with signs + [2]=1, + [3]=3, + [4]=0, + [5]=2 +} + +-- Nodes conversions +local convert_nodes = { + ['signs_road:blue_street'] = 'signs_road:blue_street_sign', + ['signs_road:green_street'] = 'signs_road:green_street_sign', + ['signs_road:black_right'] = 'signs_road:black_right_sign', + ['signs_road:black_left'] = 'signs_road:black_left_sign', + ['signs_road:green_right'] = 'signs_road:green_right_sign', + ['signs_road:green_left'] = 'signs_road:green_left_sign' +} + +local function compatibility_check(pos, node) + -- Old wallmounted modes to new facedir nodes conversion + node.name = convert_nodes[node.name] + if node.name then + node.param2 = wallmounted_to_facedir[node.param2] + display_api.on_destruct(pos) + minetest.swap_node(pos, node) + display_api.on_construct(pos) + end +end + +minetest.register_lbm({ name = "signs_road:conpatibility_1", + nodenames = {'signs_road:blue_street', 'signs_road:green_street', 'signs_road:black_right', + 'signs_road:black_left', 'signs_road:green_right', 'signs_road:green_left'}, + action = compatibility_check, +}) + +-- Text entity name change because of signs_lib using signs prefix +------------------------------------------------------------------ + +local function compatibility_check_2(pos, node) + -- Remove old entity + for _, objref in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + local entity = objref:get_luaentity() + if entity and entity.name == "signs:text" then + objref:remove() + end + end + -- Create new entity + display_api.update_entities(pos) +end + +minetest.register_lbm({ name = "signs_road:conpatibility_2", + nodenames = { + "signs_road:blue_street_sign", "signs_road:red_street_sign", "signs_road:white_street_sign", + "signs_road:green_street_sign", "signs_road:yellow_street_sign", "signs_road:black_right_sign", + "signs_road:black_left_sign", "signs_road:green_right_sign", "signs_road:green_left_sign", + "signs_road:yellow_right_sign", "signs_road:yellow_left_sign", "signs_road:white_right_sign", + "signs_road:white_left_sign"}, + action = compatibility_check_2, +}) + +-- Node name tidy up +-------------------- + +minetest.register_alias("signs_road:green_street_sign", "signs_road:green_sign") +minetest.register_alias("signs_road:yellow_street_sign", "signs_road:yellow_sign") +minetest.register_alias("signs_road:white_street_sign", "signs_road:white_sign") diff --git a/mods/display_modpack/signs_road/copyright.txt b/mods/display_modpack/signs_road/copyright.txt new file mode 100644 index 00000000..bb7adc80 --- /dev/null +++ b/mods/display_modpack/signs_road/copyright.txt @@ -0,0 +1,9 @@ +Code, Textures and Models by Pierre-Yves Rollo (pyrollo) +intllib support (i18n) by (fat115) +intllib fallback code and tools by Diego Martínez (kaeza) +Extra contributors: +(gpcf) +(Thomas--S) +Translations: +Muhammad Nur Hidayat Yasuyoshi (MuhdNurHidayat) +(fat115) diff --git a/mods/display_modpack/signs_road/crafts.lua b/mods/display_modpack/signs_road/crafts.lua new file mode 100644 index 00000000..314a91a1 --- /dev/null +++ b/mods/display_modpack/signs_road/crafts.lua @@ -0,0 +1,201 @@ +--[[ + signs_road mod for Minetest - Various road signs with text displayed + on. + (c) Pierre-Yves Rollo + + This file is part of signs_road. + + signs_road is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs_road is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs_road. If not, see . +--]] + +-- Standard rectangle signs + +minetest.register_craft({ + output = 'signs_road:white_sign 2', + recipe = { + {'dye:white', 'dye:black', ''}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:blue_sign 2', + recipe = { + {'dye:blue', 'dye:white', ''}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:green_sign 2', + recipe = { + {'dye:green', 'dye:white', ''}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:yellow_sign 2', + recipe = { + {'dye:yellow', 'dye:black', ''}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:red_sign 2', + recipe = { + {'dye:red', 'dye:white', ''}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +-- Standard direction signs + +minetest.register_craft({ + output = 'signs_road:black_right_sign 2', + recipe = { + {'dye:black', 'dye:white', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:white_right_sign 2', + recipe = { + {'dye:white', 'dye:black', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:blue_right_sign 2', + recipe = { + {'dye:blue', 'dye:white', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:green_right_sign 2', + recipe = { + {'dye:green', 'dye:white', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:yellow_right_sign 2', + recipe = { + {'dye:yellow', 'dye:black', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', ''}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + output = 'signs_road:red_right_sign 2', + recipe = { + {'dye:red', 'dye:white', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', ''}, + {'', '', ''}, + } +}) + +-- Transform Rectangle <-> Direction + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:white_right_sign', + recipe = {'signs_road:white_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:white_sign', + recipe = {'signs_road:white_right_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:blue_right_sign', + recipe = {'signs_road:blue_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:blue_sign', + recipe = {'signs_road:blue_right_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:green_right_sign', + recipe = {'signs_road:green_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:green_sign', + recipe = {'signs_road:green_right_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:yellow_right_sign', + recipe = {'signs_road:yellow_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:yellow_sign', + recipe = {'signs_road:yellow_right_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:red_right_sign', + recipe = {'signs_road:red_sign'}, +}) + +minetest.register_craft({ + type = 'shapeless', output = 'signs_road:red_sign', + recipe = {'signs_road:red_right_sign'}, +}) + +-- Various signs + +minetest.register_craft({ + output = 'signs_road:blue_street_sign 4', + recipe = { + {'dye:blue', 'dye:white', 'dye:blue'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'signs_road:red_street_sign 2', + recipe = { + {'dye:white', 'dye:red', 'dye:black'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', '', ''}, + } +}) + +minetest.register_craft({ + type = "shapeless", + output = 'signs_road:large_street_sign', + recipe = {'signs_road:white_street_sign', 'signs_road:white_street_sign', 'signs_road:white_street_sign', 'signs_road:white_street_sign'}, +}) diff --git a/mods/display_modpack/signs_road/depends.txt b/mods/display_modpack/signs_road/depends.txt new file mode 100644 index 00000000..38a5f41a --- /dev/null +++ b/mods/display_modpack/signs_road/depends.txt @@ -0,0 +1,4 @@ +default +intllib? +dye +signs_api diff --git a/mods/display_modpack/signs_road/init.lua b/mods/display_modpack/signs_road/init.lua new file mode 100644 index 00000000..cd95c6c1 --- /dev/null +++ b/mods/display_modpack/signs_road/init.lua @@ -0,0 +1,37 @@ +--[[ + signs_road mod for Minetest - Various road signs with text displayed + on. + (c) Pierre-Yves Rollo + + This file is part of signs_road. + + signs_road is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs_road is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs_road. If not, see . +--]] + +signs_road = {} +signs_road.name = minetest.get_current_modname() +signs_road.path = minetest.get_modpath(signs_road.name) + +-- Load support for intllib. +local S, NS = dofile(signs_road.path.."/intllib.lua") +signs_road.intllib = S + +dofile(signs_road.path.."/nodes.lua") +dofile(signs_road.path.."/crafts.lua") +dofile(signs_road.path.."/compatibility.lua") + + + + + diff --git a/mods/display_modpack/signs_road/intllib.lua b/mods/display_modpack/signs_road/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/display_modpack/signs_road/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/display_modpack/signs_road/locale/fr.po b/mods/display_modpack/signs_road/locale/fr.po new file mode 100644 index 00000000..833f115e --- /dev/null +++ b/mods/display_modpack/signs_road/locale/fr.po @@ -0,0 +1,56 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 11:26+0200\n" +"PO-Revision-Date: 2017-05-08 06:40+0200\n" +"Last-Translator: Peppy \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: nodes.lua +msgid "Blue street sign" +msgstr "Plaque de rue bleue" + +#: nodes.lua +msgid "Red and white town sign" +msgstr "Panneau de ville rouge et blanc" + +#: nodes.lua +msgid "White street sign" +msgstr "Panneau blanc" + +#: nodes.lua +msgid "Green street sign" +msgstr "Panneau vert" + +#: nodes.lua +msgid "Yellow street sign" +msgstr "Panneau jaune" + +#: nodes.lua +msgid "Black direction sign" +msgstr "Panneau de direction noir" + +#: nodes.lua +msgid "Green direction sign" +msgstr "Panneau de direction vert" + +#: nodes.lua +msgid "Yellow direction sign" +msgstr "Panneau de direction jaune" + +#: nodes.lua +msgid "White direction sign" +msgstr "Panneau de direction blanc" + diff --git a/mods/display_modpack/signs_road/locale/ms.po b/mods/display_modpack/signs_road/locale/ms.po new file mode 100644 index 00000000..30ba1588 --- /dev/null +++ b/mods/display_modpack/signs_road/locale/ms.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Yaya (Nurul Azeera Hidayah @ Muhammad Nur Hidayat) , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Display Modpack\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 11:28+0200\n" +"PO-Revision-Date: 2020-07-05 11:32+0000\n" +"Last-Translator: Yaya MNH48 \n" +"Language-Team: Malay \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.3\n" + +#: nodes.lua +msgid "Blue street sign" +msgstr "Papan tanda jalan biru" + +#: nodes.lua +msgid "Red and white town sign" +msgstr "Papan tanda bandar merah dan putih" + +#: nodes.lua +msgid "White street sign" +msgstr "Papan tanda jalan putih" + +#: nodes.lua +msgid "Green street sign" +msgstr "Papan tanda jalan hijau" + +#: nodes.lua +msgid "Yellow street sign" +msgstr "Papan tanda jalan kuning" + +#: nodes.lua +msgid "Black direction sign" +msgstr "Papan tanda arah hitam" + +#: nodes.lua +msgid "Green direction sign" +msgstr "Papan tanda arah hijau" + +#: nodes.lua +msgid "Yellow direction sign" +msgstr "Papan tanda arah kuning" + +#: nodes.lua +msgid "White direction sign" +msgstr "Papan tanda arah putih" diff --git a/mods/display_modpack/signs_road/locale/template.pot b/mods/display_modpack/signs_road/locale/template.pot new file mode 100644 index 00000000..b15ce94f --- /dev/null +++ b/mods/display_modpack/signs_road/locale/template.pot @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 11:28+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: nodes.lua +msgid "Blue street sign" +msgstr "" + +#: nodes.lua +msgid "Red and white town sign" +msgstr "" + +#: nodes.lua +msgid "White street sign" +msgstr "" + +#: nodes.lua +msgid "Green street sign" +msgstr "" + +#: nodes.lua +msgid "Yellow street sign" +msgstr "" + +#: nodes.lua +msgid "Black direction sign" +msgstr "" + +#: nodes.lua +msgid "Green direction sign" +msgstr "" + +#: nodes.lua +msgid "Yellow direction sign" +msgstr "" + +#: nodes.lua +msgid "White direction sign" +msgstr "" diff --git a/mods/display_modpack/signs_road/mod.conf b/mods/display_modpack/signs_road/mod.conf new file mode 100644 index 00000000..83ae2319 --- /dev/null +++ b/mods/display_modpack/signs_road/mod.conf @@ -0,0 +1,4 @@ +name=signs_road +description=Various road signs with text display using signs_api +depends=default,dye,signs_api +optional_depends=intllib diff --git a/mods/display_modpack/signs_road/nodes.lua b/mods/display_modpack/signs_road/nodes.lua new file mode 100644 index 00000000..74eca23e --- /dev/null +++ b/mods/display_modpack/signs_road/nodes.lua @@ -0,0 +1,451 @@ +--[[ + signs_road mod for Minetest - Various road signs with text displayed + on. + (c) Pierre-Yves Rollo + + This file is part of signs_road. + + signs_road is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + signs_road is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with signs_road. If not, see . +--]] + +local S = signs_road.intllib + +local models = { + blue_street_sign = { + depth = 1/16, + width = 14/16, + height = 12/16, + entity_fields = { + size = { x = 14/16, y = 10/16 }, + maxlines = 3, + color = "#fff", + }, + node_fields = { + description = S("Blue street sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_blue_street.png" }, + inventory_image = "signs_road_blue_street.png", + }, + }, + large_street_sign = { + depth = 1/16, + width = 64/16, + height = 12/16, + entity_fields = { + maxlines = 1, + color = "#000", + }, + node_fields = { + visual_scale = 1, + description = S("Large banner"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_large_white.png" }, + inventory_image = "signs_road_white.png", + }, + }, + red_street_sign = { + depth = 1/16, + width = 1, + height = 7/16, + entity_fields = { + size = { x = 1, y = 4/16 }, + maxlines = 1, + color = "#000", + }, + node_fields = { + description = S("Red and white town sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_red_white.png" }, + inventory_image="signs_road_red_white.png", + }, + }, + white_sign = { + depth = 1/16, + width = 1, + height = 7/16, + entity_fields = { + size = { x = 1, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("White street sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_white.png" }, + inventory_image = "signs_road_white.png", + }, + }, + blue_sign = { + depth = 1/16, + width = 1, + height = 7/16, + entity_fields = { + size = { x = 1, y = 6/16 }, + maxlines = 2, + color = "#fff", + }, + node_fields = { + description = S("Blue road sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_blue.png" }, + inventory_image = "signs_road_blue.png", + }, + }, + green_sign = { + depth = 1/16, + width = 1, + height = 7/16, + entity_fields = { + size = { x = 1, y = 6/16 }, + maxlines = 2, + color = "#fff", + }, + node_fields = { + description = S("Green road sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_green.png" }, + inventory_image = "signs_road_green.png", + }, + }, + yellow_sign = { + depth = 1/16, + width = 1, + height = 7/16, + entity_fields = { + size = { x = 1, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("Yellow road sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_yellow.png" }, + inventory_image="signs_road_yellow.png", + }, + }, + red_sign = { + depth = 1/16, + width = 1, + height = 7/16, + entity_fields = { + size = { x = 1, y = 6/16 }, + maxlines = 2, + color = "#fff", + }, + node_fields = { + description = S("Red road sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_red.png" }, + inventory_image = "signs_road_red.png", + }, + }, + black_right_sign = { + depth = 1/32, + width = 1, + height = 0.5, + entity_fields = { + aspect_ratio = 3/4, + size = { x = 1, y = 3/16 }, + maxlines = 1, + color = "#000", + }, + node_fields = { + description = S("Black direction sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_black_dir_right.png" }, + inventory_image = "signs_road_black_dir_inventory.png", + signs_other_dir = "signs_road:black_left_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + }, + }, + black_left_sign = { + depth = 1/32, + width = 1, + height = 0.5, + entity_fields = { + aspect_ratio = 3/4, + size = { x = 1, y = 3/16 }, + maxlines = 1, + color = "#000", + }, + node_fields = { + description = S("Black direction sign"), + tiles = { "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_sides.png", + "signs_road_sides.png", "signs_road_black_dir_left.png" }, + inventory_image = "signs_road_black_dir_inventory.png", + signs_other_dir = "signs_road:black_right_sign", + groups = { not_in_creative_inventory = 1 }, + drop = "signs_road:black_right_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + }, + }, + white_right_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = -3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("White direction sign"), + tiles = { "signs_road_white_direction.png" }, + inventory_image = "signs_road_white_dir_inventory.png", + signs_other_dir = "signs_road:white_left_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_right.obj", + selection_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + }, + }, + white_left_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = 3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("White direction sign"), + tiles = { "signs_road_white_direction.png" }, + inventory_image = "signs_road_white_dir_inventory.png", + signs_other_dir = "signs_road:white_right_sign", + on_place=signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_left.obj", + selection_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + groups = { not_in_creative_inventory = 1 }, + drop = "signs_road:white_right_sign", + }, + }, + blue_right_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = -3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#fff", + }, + node_fields = { + description = S("Blue direction sign"), + tiles = { "signs_road_blue_direction.png" }, + inventory_image = "signs_road_blue_dir_inventory.png", + signs_other_dir = "signs_road:blue_left_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_right.obj", + selection_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + }, + }, + blue_left_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = 3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color="#fff", + }, + node_fields = { + description = S("Blue direction sign"), + tiles = { "signs_road_blue_direction.png" }, + inventory_image = "signs_road_blue_dir_inventory.png", + signs_other_dir = "signs_road:blue_right_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_left.obj", + selection_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + groups = { not_in_creative_inventory = 1 }, + drop = "signs_road:blue_right_sign", + }, + }, + green_right_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = -3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#fff", + }, + node_fields = { + description = S("Green direction sign"), + tiles = { "signs_road_green_direction.png" }, + inventory_image = "signs_road_green_dir_inventory.png", + signs_other_dir = "signs_road:green_left_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_right.obj", + selection_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + }, + }, + green_left_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = 3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color="#fff", + }, + node_fields = { + description = S("Green direction sign"), + tiles = { "signs_road_green_direction.png" }, + inventory_image = "signs_road_green_dir_inventory.png", + signs_other_dir = "signs_road:green_right_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_left.obj", + selection_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + groups = { not_in_creative_inventory = 1 }, + drop = "signs_road:green_right_sign", + }, + }, + yellow_right_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = -3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("Yellow direction sign"), + tiles = { "signs_road_yellow_direction.png" }, + inventory_image = "signs_road_yellow_dir_inventory.png", + signs_other_dir = "signs_road:yellow_left_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_right.obj", + selection_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + }, + }, + yellow_left_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = 3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#000", + }, + node_fields = { + description = S("Yellow direction sign"), + tiles = { "signs_road_yellow_direction.png" }, + inventory_image = "signs_road_yellow_dir_inventory.png", + signs_other_dir = "signs_road:yellow_right_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_left.obj", + selection_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + groups = { not_in_creative_inventory = 1 }, + drop = "signs_road:yellow_right_sign", + }, + }, + red_right_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = -3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#fff", + }, + node_fields = { + description = S("Red direction sign"), + tiles = { "signs_road_red_direction.png" }, + inventory_image = "signs_road_red_dir_inventory.png", + signs_other_dir = "signs_road:red_left_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_right.obj", + selection_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -0.5, -7/32, 0.5, 7/16, 7/32, 7/16 } }, + }, + }, + red_left_sign = { + depth = 1/16, + width = 14/16, + height = 7/16, + entity_fields = { + right = 3/32, + size = { x = 12/16, y = 6/16 }, + maxlines = 2, + color = "#fff", + }, + node_fields = { + description = S("Red direction sign"), + tiles = { "signs_road_red_direction.png" }, + inventory_image = "signs_road_red_dir_inventory.png", + signs_other_dir = "signs_road:red_right_sign", + on_place = signs_api.on_place_direction, + on_rightclick = signs_api.on_right_click_direction, + drawtype = "mesh", + mesh = "signs_dir_left.obj", + selection_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + collision_box = { type = "fixed", fixed = { -7/16, -7/32, 0.5, 0.5, 7/32, 7/16 } }, + groups = { not_in_creative_inventory = 1 }, + drop = "signs_road:red_right_sign", + }, + }, +} + +-- Node registration +for name, model in pairs(models) +do + signs_api.register_sign("signs_road", name, model) +end diff --git a/mods/display_modpack/signs_road/svg/signs_road_black.svg b/mods/display_modpack/signs_road/svg/signs_road_black.svg new file mode 100644 index 00000000..8e9b8a9d --- /dev/null +++ b/mods/display_modpack/signs_road/svg/signs_road_black.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/mods/display_modpack/signs_road/svg/signs_road_direction.svg b/mods/display_modpack/signs_road/svg/signs_road_direction.svg new file mode 100644 index 00000000..665146bf --- /dev/null +++ b/mods/display_modpack/signs_road/svg/signs_road_direction.svg @@ -0,0 +1,316 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mods/display_modpack/signs_road/svg/signs_road_rectangle.svg b/mods/display_modpack/signs_road/svg/signs_road_rectangle.svg new file mode 100644 index 00000000..3dad58d7 --- /dev/null +++ b/mods/display_modpack/signs_road/svg/signs_road_rectangle.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/mods/display_modpack/signs_road/svg/signs_road_street_blue.svg b/mods/display_modpack/signs_road/svg/signs_road_street_blue.svg new file mode 100644 index 00000000..0aa87ffc --- /dev/null +++ b/mods/display_modpack/signs_road/svg/signs_road_street_blue.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/mods/display_modpack/signs_road/textures/signs_road_black_dir_inventory.png b/mods/display_modpack/signs_road/textures/signs_road_black_dir_inventory.png new file mode 100644 index 00000000..cc919e8f Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_black_dir_inventory.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_black_dir_left.png b/mods/display_modpack/signs_road/textures/signs_road_black_dir_left.png new file mode 100644 index 00000000..46a3323f Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_black_dir_left.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_black_dir_right.png b/mods/display_modpack/signs_road/textures/signs_road_black_dir_right.png new file mode 100644 index 00000000..b6cba13d Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_black_dir_right.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_blue.png b/mods/display_modpack/signs_road/textures/signs_road_blue.png new file mode 100644 index 00000000..7951c161 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_blue.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_blue_dir_inventory.png b/mods/display_modpack/signs_road/textures/signs_road_blue_dir_inventory.png new file mode 100644 index 00000000..835dd882 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_blue_dir_inventory.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_blue_direction.png b/mods/display_modpack/signs_road/textures/signs_road_blue_direction.png new file mode 100644 index 00000000..22b42e0d Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_blue_direction.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_blue_street.png b/mods/display_modpack/signs_road/textures/signs_road_blue_street.png new file mode 100644 index 00000000..9e81e216 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_blue_street.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_green.png b/mods/display_modpack/signs_road/textures/signs_road_green.png new file mode 100644 index 00000000..8f8b04ad Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_green.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_green_dir_inventory.png b/mods/display_modpack/signs_road/textures/signs_road_green_dir_inventory.png new file mode 100644 index 00000000..4b4dc1ec Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_green_dir_inventory.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_green_direction.png b/mods/display_modpack/signs_road/textures/signs_road_green_direction.png new file mode 100644 index 00000000..414d2f79 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_green_direction.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_large_white.png b/mods/display_modpack/signs_road/textures/signs_road_large_white.png new file mode 100644 index 00000000..223900c0 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_large_white.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_red.png b/mods/display_modpack/signs_road/textures/signs_road_red.png new file mode 100644 index 00000000..2c9fd41a Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_red.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_red_dir_inventory.png b/mods/display_modpack/signs_road/textures/signs_road_red_dir_inventory.png new file mode 100644 index 00000000..6ebb189b Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_red_dir_inventory.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_red_direction.png b/mods/display_modpack/signs_road/textures/signs_road_red_direction.png new file mode 100644 index 00000000..c6cca33c Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_red_direction.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_red_white.png b/mods/display_modpack/signs_road/textures/signs_road_red_white.png new file mode 100644 index 00000000..510f6b8b Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_red_white.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_sides.png b/mods/display_modpack/signs_road/textures/signs_road_sides.png new file mode 100644 index 00000000..caea16a0 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_sides.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_white.png b/mods/display_modpack/signs_road/textures/signs_road_white.png new file mode 100644 index 00000000..45b759a0 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_white.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_white_dir_inventory.png b/mods/display_modpack/signs_road/textures/signs_road_white_dir_inventory.png new file mode 100644 index 00000000..ac0b2655 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_white_dir_inventory.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_white_direction.png b/mods/display_modpack/signs_road/textures/signs_road_white_direction.png new file mode 100644 index 00000000..cd19197a Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_white_direction.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_yellow.png b/mods/display_modpack/signs_road/textures/signs_road_yellow.png new file mode 100644 index 00000000..33ced3ba Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_yellow.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_yellow_dir_inventory.png b/mods/display_modpack/signs_road/textures/signs_road_yellow_dir_inventory.png new file mode 100644 index 00000000..6fd34cd2 Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_yellow_dir_inventory.png differ diff --git a/mods/display_modpack/signs_road/textures/signs_road_yellow_direction.png b/mods/display_modpack/signs_road/textures/signs_road_yellow_direction.png new file mode 100644 index 00000000..ef7fbaaf Binary files /dev/null and b/mods/display_modpack/signs_road/textures/signs_road_yellow_direction.png differ diff --git a/mods/display_modpack/signs_road/tools/updatepo.sh b/mods/display_modpack/signs_road/tools/updatepo.sh new file mode 100755 index 00000000..feb2504c --- /dev/null +++ b/mods/display_modpack/signs_road/tools/updatepo.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --language=Lua \ + --sort-by-file \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --keyword=F \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/display_modpack/steles/LICENSE.txt b/mods/display_modpack/steles/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/display_modpack/steles/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/display_modpack/steles/README.md b/mods/display_modpack/steles/README.md new file mode 100644 index 00000000..bc14b537 --- /dev/null +++ b/mods/display_modpack/steles/README.md @@ -0,0 +1,25 @@ +# Steles + +This mod provides stone steles with text display. Text is locked if area is protected. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?t=19365) at the Minetest forums. + +**Dependancies**: default, display\_lib, font\_lib, technic? + +(Technic adds marble and granite steles) + +**License**: LGPL + +## Recipes + + - M - + - B - + M M M + +B = Black Dye, M = Material + +Material (must be all the same) can be : Stone, Desert Stone, Sandstone, Granite or Marble + +Gives 4 steles of corresponding material. Right click on stele to update text. + +(Extra materials can be added in config.lua file) diff --git a/mods/display_modpack/steles/config.lua b/mods/display_modpack/steles/config.lua new file mode 100644 index 00000000..551429d6 --- /dev/null +++ b/mods/display_modpack/steles/config.lua @@ -0,0 +1,37 @@ +--[[ + steles mod for Minetest. Steles / graves with text on it. + (c) Pierre-Yves Rollo + + This file is part of steles. + + steles is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + steles is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with steles. If not, see . +--]] + +local S = steles.intllib + +steles.materials = { + 'default:stone', + 'default:sandstone', + 'default:desert_stone', + 'technic:marble', + 'technic:granite', +} + +steles.materials_desc = { + S("Stone Stele"), + S("Sandstone Stele"), + S("Desert Stone Stele"), + S("Marble Stele"), + S("Granite Stele"), +} diff --git a/mods/display_modpack/steles/copyright.txt b/mods/display_modpack/steles/copyright.txt new file mode 100644 index 00000000..1a4e167b --- /dev/null +++ b/mods/display_modpack/steles/copyright.txt @@ -0,0 +1,9 @@ +Code by Pierre-Yves Rollo +intllib support (i18n) by (fat115) +intllib fallback code and tools by Diego Martínez (kaeza) +Extra contibutors: +(Thomas--S) +Translations: +Muhammad Nur Hidayat Yasuyoshi (MuhdNurHidayat) +(fat115) + diff --git a/mods/display_modpack/steles/crafts.lua b/mods/display_modpack/steles/crafts.lua new file mode 100644 index 00000000..9973aacf --- /dev/null +++ b/mods/display_modpack/steles/crafts.lua @@ -0,0 +1,33 @@ +--[[ + steles mod for Minetest. Steles / graves with text on it. + (c) Pierre-Yves Rollo + + This file is part of steles. + + steles is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + steles is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with steles. If not, see . +--]] + +for _, material in ipairs(steles.materials) do + local parts = material:split(":") + + minetest.register_craft({ + output = 'steles:'..parts[2]..'_stele 4', + recipe = { + {'', material, ''}, + {'', 'dye:black', ''}, + {material, material, material}, + } + }) + +end diff --git a/mods/display_modpack/steles/depends.txt b/mods/display_modpack/steles/depends.txt new file mode 100644 index 00000000..ba432237 --- /dev/null +++ b/mods/display_modpack/steles/depends.txt @@ -0,0 +1,5 @@ +default +intllib? +display_api +font_api +technic? diff --git a/mods/display_modpack/steles/init.lua b/mods/display_modpack/steles/init.lua new file mode 100644 index 00000000..e5d24302 --- /dev/null +++ b/mods/display_modpack/steles/init.lua @@ -0,0 +1,31 @@ +--[[ + steles mod for Minetest. Steles / graves with text on it. + (c) Pierre-Yves Rollo + + This file is part of steles. + + steles is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + steles is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with steles. If not, see . +--]] + +steles = {} +steles.name = minetest.get_current_modname() +steles.path = minetest.get_modpath(steles.name) + +-- Load support for intllib. +local S, NS = dofile(steles.path.."/intllib.lua") +steles.intllib = S + +dofile(steles.path.."/config.lua") +dofile(steles.path.."/nodes.lua") +dofile(steles.path.."/crafts.lua") diff --git a/mods/display_modpack/steles/intllib.lua b/mods/display_modpack/steles/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/display_modpack/steles/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/display_modpack/steles/locale/fr.po b/mods/display_modpack/steles/locale/fr.po new file mode 100644 index 00000000..1785d8a3 --- /dev/null +++ b/mods/display_modpack/steles/locale/fr.po @@ -0,0 +1,47 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-05 10:06+0200\n" +"PO-Revision-Date: 2017-08-05 09:03+0200\n" +"Last-Translator: fat115 \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: config.lua +msgid "Stone Stele" +msgstr "Stèle en pierre" + +#: config.lua +msgid "Sandstone Stele" +msgstr "Stèle en grès" + +#: config.lua +msgid "Desert Stone Stele" +msgstr "Stèle en pierre du désert" + +#: config.lua +msgid "Marble Stele" +msgstr "Stèle en marbre" + +#: config.lua +msgid "Granite Stele" +msgstr "Stèle en granit" + +#: nodes.lua +msgid "Displayed text (3 lines max)" +msgstr "Texte à afficher (3 lignes maxi.)" + +#: nodes.lua +msgid "Write" +msgstr "Écrire" diff --git a/mods/display_modpack/steles/locale/ms.po b/mods/display_modpack/steles/locale/ms.po new file mode 100644 index 00000000..1c589830 --- /dev/null +++ b/mods/display_modpack/steles/locale/ms.po @@ -0,0 +1,46 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Yaya (Nurul Azeera Hidayah @ Muhammad Nur Hidayat) , 2017. +msgid "" +msgstr "" +"Project-Id-Version: Display Modpack\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 11:29+0200\n" +"PO-Revision-Date: 2020-07-05 11:34+0000\n" +"Last-Translator: Yaya MNH48 \n" +"Language-Team: Malay \n" +"Language: ms\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.3\n" + +#: config.lua +msgid "Stone Stele" +msgstr "Tulisan Batu" + +#: config.lua +msgid "Sandstone Stele" +msgstr "Tulisan Batu Pasir" + +#: config.lua +msgid "Desert Stone Stele" +msgstr "Tulisan Batu Gurun" + +#: config.lua +msgid "Marble Stele" +msgstr "Tulisan Marmar" + +#: config.lua +msgid "Granite Stele" +msgstr "Tulisan Granit" + +#: nodes.lua +msgid "Displayed text (3 lines max)" +msgstr "Teks terpapar (maksimum 3 baris)" + +#: nodes.lua +msgid "Write" +msgstr "Tulis" diff --git a/mods/display_modpack/steles/locale/template.pot b/mods/display_modpack/steles/locale/template.pot new file mode 100644 index 00000000..0144acea --- /dev/null +++ b/mods/display_modpack/steles/locale/template.pot @@ -0,0 +1,46 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-08-26 11:29+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" + +#: config.lua +msgid "Stone Stele" +msgstr "" + +#: config.lua +msgid "Sandstone Stele" +msgstr "" + +#: config.lua +msgid "Desert Stone Stele" +msgstr "" + +#: config.lua +msgid "Marble Stele" +msgstr "" + +#: config.lua +msgid "Granite Stele" +msgstr "" + +#: nodes.lua +msgid "Displayed text (3 lines max)" +msgstr "" + +#: nodes.lua +msgid "Write" +msgstr "" diff --git a/mods/display_modpack/steles/mod.conf b/mods/display_modpack/steles/mod.conf new file mode 100644 index 00000000..2b29f050 --- /dev/null +++ b/mods/display_modpack/steles/mod.conf @@ -0,0 +1,4 @@ +name=steles +description=Stone steles with text display on them +depends=default,display_api,font_api +optional_depends=intllib,technic diff --git a/mods/display_modpack/steles/nodes.lua b/mods/display_modpack/steles/nodes.lua new file mode 100644 index 00000000..2245e207 --- /dev/null +++ b/mods/display_modpack/steles/nodes.lua @@ -0,0 +1,94 @@ +--[[ + steles mod for Minetest. Steles / graves with text on it. + (c) Pierre-Yves Rollo + + This file is part of steles. + + steles is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + steles is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with steles. If not, see . +--]] + +local S = steles.intllib +local F = function(...) return minetest.formspec_escape(S(...)) end + +display_api.register_display_entity("steles:text") + +for i, material in ipairs(steles.materials) do + + local ndef = minetest.registered_nodes[material] + + if ndef then + local groups = table.copy(ndef.groups) + local parts = material:split(":") + groups.display_api = 1 + + minetest.register_node("steles:"..parts[2].."_stele", { + description = steles.materials_desc[i], + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + tiles = ndef.tiles, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-5/16, -5/16, -2/16, 5/16, 0.5, 2/16}, + {-7/16, -0.5, -4/16, 7/16, -5/16, 4/16} + }, + }, + groups = groups, + display_entities = { + ["steles:text"] = { + on_display_update = font_api.on_display_update, + depth = -2/16 - display_api.entity_spacing, + top = -2/16, + aspect_ratio = 0.4, + size = { x = 10/16, y = 12/16 }, + maxlines = 3, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + minetest.rotate_node(itemstack, placer, pointed_thing) + return display_api.on_place(itemstack, placer, pointed_thing) + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", string.format([=[ + size[6,4]%s%s%s + textarea[0.5,0.7;5.5,2;display_text;%s;${display_text}] + button[1,3;2,1;font;%s] + button_exit[3,3;2,1;ok;%s]]=], + default.gui_bg, default.gui_bg_img, default.gui_slots, + F("Displayed text (3 lines max)"), + F("Font"), F("Write"))) + display_api.on_construct(pos) + end, + on_destruct = display_api.on_destruct, + on_rotate = display_api.on_rotate, + on_receive_fields = function(pos, formname, fields, player) + if not minetest.is_protected(pos, player:get_player_name()) then + local meta = minetest.get_meta(pos) + if fields.ok or fields.font then + meta:set_string("display_text", fields.display_text) + meta:set_string("infotext", "\""..fields.display_text.."\"") + display_api.update_entities(pos) + end + if fields.font then + font_api.show_font_list(player, pos) + end + end + end, + on_punch = display_api.update_entities, + }) + end +end diff --git a/mods/display_modpack/steles/tools/updatepo.sh b/mods/display_modpack/steles/tools/updatepo.sh new file mode 100755 index 00000000..feb2504c --- /dev/null +++ b/mods/display_modpack/steles/tools/updatepo.sh @@ -0,0 +1,25 @@ +#! /bin/bash + +# To create a new translation: +# msginit --locale=ll_CC -o locale/ll_CC.po -i locale/template.pot + +cd "$(dirname "${BASH_SOURCE[0]}")/.."; + +# Extract translatable strings. +xgettext --from-code=UTF-8 \ + --language=Lua \ + --sort-by-file \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --keyword=F \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + $(find . -name '*.lua') + +# Update translations. +find locale -name '*.po' | while read -r file; do + echo $file + msgmerge --update $file locale/template.pot; +done diff --git a/mods/facade/.luacheckrc b/mods/facade/.luacheckrc new file mode 100644 index 00000000..a1d07a83 --- /dev/null +++ b/mods/facade/.luacheckrc @@ -0,0 +1,19 @@ +unused_args = false +allow_defined_top = true +max_line_length = 999 + +ignore = { + "clay", +} + +globals = { + "minetest" +} + +read_globals = { + string = {fields = {"split", "trim"}}, + table = {fields = {"copy", "getn"}}, + + "stack", "default", + "chisel", +} diff --git a/mods/facade/README.md b/mods/facade/README.md new file mode 100644 index 00000000..e59c6940 --- /dev/null +++ b/mods/facade/README.md @@ -0,0 +1,44 @@ +# Facade + +[![](https://github.com/TumeniNodes/facade/workflows/Check%20&%20Release/badge.svg)](https://github.com/TumeniNodes/facade/actions) +[![License](https://img.shields.io/badge/license-LGPLv2.1%2B-blue.svg)](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html) + +Adds decorative clay and stone-type nodes to Minetest Game. + +## Dependencies +- default (included in minetest_game) +- [mychisel](https://github.com/minetest-mods/mychisel) (**optional dependency!**) + +## Requirements +This requieres MT/MTG 0.4.16+ to run (may work on older versions). + +## License +Click [here](https://github.com/TumeniNodes/facade/blob/master/license.txt) to see the license. + +## Installation +- Unzip the archive, rename the folder to facade and +place it in ..minetest/mods/ + +- GNU/Linux: If you use a system-wide installation place + it in ~/.minetest/mods/. + +- If you only want this to be used in a single world, place + the folder in ..worldmods/ in your world directory. + +For further information or help, see: +https://wiki.minetest.net/Installing_Mods + +## Bugs, suggestions, features & bugfixes. +Report bugs or suggest ideas by [creating an issue](https://github.com/TumeniNodes/facade/issues/new). +If you know how to fix an issue, or want something to be added, consider opening a [pull request](https://github.com/TumeniNodes/facade/compare). + +## Screenshots + +![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot.png) +![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot2.png) +![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot3.png) +![Preview](https://github.com/TumeniNodes/facade/blob/master/screenshot4.png) + + +If you want to get additional info about this mod, go the [Minetest Forums](https://forum.minetest.net/viewtopic.php?f=9&t=18208). +Have fun with Facade! diff --git a/mods/facade/contributors.txt b/mods/facade/contributors.txt new file mode 100644 index 00000000..553fa3c1 --- /dev/null +++ b/mods/facade/contributors.txt @@ -0,0 +1,2 @@ +Special thanks to Napiophelios for taking the time to clean up my sloppy coding style, and making it far more efficient. +(Thanks Nappy!) diff --git a/mods/facade/depends.txt b/mods/facade/depends.txt new file mode 100644 index 00000000..61e8ffe1 --- /dev/null +++ b/mods/facade/depends.txt @@ -0,0 +1,3 @@ +default +mychisel? +columnia? diff --git a/mods/facade/description.txt b/mods/facade/description.txt new file mode 100644 index 00000000..fc99104c --- /dev/null +++ b/mods/facade/description.txt @@ -0,0 +1 @@ +Adds decorative clay and stone-type nodes to Minetest Game. diff --git a/mods/facade/facade_shaper.xcf b/mods/facade/facade_shaper.xcf new file mode 100644 index 00000000..43c0d8a7 Binary files /dev/null and b/mods/facade/facade_shaper.xcf differ diff --git a/mods/facade/init.lua b/mods/facade/init.lua new file mode 100644 index 00000000..f0925cc4 --- /dev/null +++ b/mods/facade/init.lua @@ -0,0 +1,10 @@ +facade = {} + +-- Define the shapes and registration functions +dofile (minetest.get_modpath("facade") .. "/shapes.lua") + +-- Register the nodes made from compatible materials +dofile (minetest.get_modpath("facade") .. "/materials.lua") + +-- Add a dedicated machine to produce the facade shapes +dofile (minetest.get_modpath("facade") .. "/shaper.lua") diff --git a/mods/facade/license.txt b/mods/facade/license.txt new file mode 100644 index 00000000..dc51f2a4 --- /dev/null +++ b/mods/facade/license.txt @@ -0,0 +1,43 @@ +*Textures from Minetest Game mod: default +The licenses for such media can be found in the source for Minetest Game +========================================= + +License of source code: +----------------------- +Copyright (C) 2016-2018 TumeniNodes + +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. + +http://www.gnu.org/licenses/lgpl-2.1.html + +init.lua +bannerstone.lua +bannerstone_corner.lua +carved_stone_a.lua +carved_stone_a_corner.lua +column.lua +column_corner.lua +corbel.lua +corbel_corner.lua +corbel_inner_corner.lua +rgspro.lua +rgspro_corner.lua +rgspro_inner.lua +corner_bricks.lua + +bannerstone.nbe +bannerstone_corner.nbe +carved_stone_a.nbe +carved_stone_a_corner.nbe +column.nbe +column_corner.nbe +corbel.nbe +corbel_corner.nbe +corbel_inner_corner.nbe +rgspro.nbe +rgspro_corner.nbe +rgspro_inner.nbe +corner_bricks.nbe diff --git a/mods/facade/materials.lua b/mods/facade/materials.lua new file mode 100644 index 00000000..47444e93 --- /dev/null +++ b/mods/facade/materials.lua @@ -0,0 +1,58 @@ +-- Registration of materials + +facade.register_facade_nodes("default", "clay", "default:clay", "Clay") +facade.register_facade_nodes("default", "stone", "default:stone", "Stone") +facade.register_facade_nodes("default", "desert_stone", "default:desert_stone", "Desert Stone") +facade.register_facade_nodes("default", "sandstone", "default:sandstone", "Sandstone") +facade.register_facade_nodes("default", "desert_sandstone", "default:desert_sandstone", "Desert Sandstone") +facade.register_facade_nodes("default", "silver_sandstone", "default:silver_sandstone", "Silver Sandstone") +--facade.register_facade_nodes("default", "obsidian", "default:obsidian", "Obsidian") + + +if minetest.get_modpath( "bakedclay") then + local clay = { + {"white", "White"}, + {"grey", "Grey"}, + {"black", "Black"}, + {"red", "Red"}, + {"yellow", "Yellow"}, + {"green", "Green"}, + {"cyan", "Cyan"}, + {"blue", "Blue"}, + {"magenta", "Magenta"}, + {"orange", "Orange"}, + {"violet", "Violet"}, + {"brown", "Brown"}, + {"pink", "Pink"}, + {"dark_grey", "Dark Grey"}, + {"dark_green", "Dark Green"}, + } + + for _, clay in pairs(clay) do + facade.register_facade_nodes("baked_clay", clay[1] , "bakedclay:" .. clay[1], clay[2] .. " Baked Clay") + end +end + + +if minetest.get_modpath( "darkage") then + facade.register_facade_nodes("darkage", "basalt", "darkage:basalt", "Basalt") + facade.register_facade_nodes("darkage", "chalk", "darkage:chalk", "Chalk") + facade.register_facade_nodes("darkage", "gneiss", "darkage:gneiss", "Gneiss") + facade.register_facade_nodes("darkage", "marble", "darkage:marble", "Marble") + facade.register_facade_nodes("darkage", "ors", "darkage:ors", "Ors") + facade.register_facade_nodes("darkage", "schist", "darkage:schist", "Schist") + facade.register_facade_nodes("darkage", "serpentine", "darkage:serpentine", "Serpentine") + facade.register_facade_nodes("darkage", "shale", "darkage:shale", "Shale") + facade.register_facade_nodes("darkage", "slate", "darkage:slate", "Slate") +end + + +if minetest.get_modpath( "nether") then + facade.register_facade_nodes("nether", "rack", "nether:rack", "Netherrack") +end + + +--[[if minetest.get_modpath( "lapis") then + facade.register_facade_nodes("lapis", "lapis_block", "lapis:lapis_block", "Lapis") + facade.register_facade_nodes("lapis", "lapis_lazurite", "lapis:lazurite", "Lazurite") +end]]-- diff --git a/mods/facade/mod.conf b/mods/facade/mod.conf new file mode 100644 index 00000000..ff1e92d9 --- /dev/null +++ b/mods/facade/mod.conf @@ -0,0 +1,4 @@ +name = facade +depends = default +optional_depends = mychisel +description = Adds decorative clay and stone-type nodes to Minetest Game. diff --git a/mods/facade/models/bannerstone.obj b/mods/facade/models/bannerstone.obj new file mode 100644 index 00000000..1aa239ec --- /dev/null +++ b/mods/facade/models/bannerstone.obj @@ -0,0 +1,49 @@ +mtllib bannerstone.mtl +o converted_out +v 0.5 -0.5 -0.5 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v -0.5 -0.5 -0.5 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.5 +v 0.5 0.25 -0.5625 +v 0.5 0.25 -0.5 +v 0.5 0.375 -0.5 +v 0.5 0.375 -0.5625 +v -0.5 0.25 -0.5625 +v -0.5 0.25 -0.5 +v -0.5 0.375 -0.5 +v -0.5 0.375 -0.5625 +v 0.5 -0.375 -0.5625 +v 0.5 -0.375 -0.5 +v 0.5 -0.25 -0.5 +v 0.5 -0.25 -0.5625 +v -0.5 -0.375 -0.5625 +v -0.5 -0.375 -0.5 +v -0.5 -0.25 -0.5 +v -0.5 -0.25 -0.5625 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 diff --git a/mods/facade/models/bannerstone_corner.obj b/mods/facade/models/bannerstone_corner.obj new file mode 100644 index 00000000..f2a4d901 --- /dev/null +++ b/mods/facade/models/bannerstone_corner.obj @@ -0,0 +1,49 @@ +mtllib bannerstone_corner.mtl +o converted_out +v 0.5 -0.5 -0.5 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v -0.5 -0.5 -0.5 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.5 +v 0.5625 0.25 -0.5625 +v 0.5625 0.25 0.5625 +v 0.5625 0.375 0.5625 +v 0.5625 0.375 -0.5625 +v -0.5625 0.25 -0.5625 +v -0.5625 0.25 0.5625 +v -0.5625 0.375 0.5625 +v -0.5625 0.375 -0.5625 +v 0.5625 -0.375 -0.5625 +v 0.5625 -0.375 0.5625 +v 0.5625 -0.25 0.5625 +v 0.5625 -0.25 -0.5625 +v -0.5625 -0.375 -0.5625 +v -0.5625 -0.375 0.5625 +v -0.5625 -0.25 0.5625 +v -0.5625 -0.25 -0.5625 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 diff --git a/mods/facade/models/carved_stone_a.obj b/mods/facade/models/carved_stone_a.obj new file mode 100644 index 00000000..9aead074 --- /dev/null +++ b/mods/facade/models/carved_stone_a.obj @@ -0,0 +1,169 @@ +mtllib carved_stone_a.mtl +o converted_out +v 0.5 -0.5 -0.4375 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.4375 +v -0.5 -0.5 -0.4375 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.4375 +v 0.5 0.4375 -0.5 +v 0.5 0.4375 -0.4375 +v 0.5 0.5 -0.4375 +v 0.5 0.5 -0.5 +v -0.5 0.4375 -0.5 +v -0.5 0.4375 -0.4375 +v -0.5 0.5 -0.4375 +v -0.5 0.5 -0.5 +v 0.5 -0.5 -0.5 +v 0.5 -0.5 0.5 +v 0.5 -0.4375 0.5 +v 0.5 -0.4375 -0.5 +v -0.5 -0.5 -0.5 +v -0.5 -0.5 0.5 +v -0.5 -0.4375 0.5 +v -0.5 -0.4375 -0.5 +v 0.4375 -0.375 -0.5 +v 0.4375 -0.375 -0.4375 +v 0.4375 0.375 -0.4375 +v 0.4375 0.375 -0.5 +v 0.3125 -0.375 -0.5 +v 0.3125 -0.375 -0.4375 +v 0.3125 0.375 -0.4375 +v 0.3125 0.375 -0.5 +v 0.5 -0.375 -0.5 +v 0.5 -0.375 0.5 +v 0.5 -0.25 0.5 +v 0.5 -0.25 -0.5 +v 0.3125 -0.375 -0.5 +v 0.3125 -0.375 0.5 +v 0.3125 -0.25 0.5 +v 0.3125 -0.25 -0.5 +v 0.4375 0.25 -0.5 +v 0.4375 0.25 0.5 +v 0.4375 0.375 0.5 +v 0.4375 0.375 -0.5 +v -0.4375 0.25 -0.5 +v -0.4375 0.25 0.5 +v -0.4375 0.375 0.5 +v -0.4375 0.375 -0.5 +v -0.3125 -0.125 -0.5 +v -0.3125 -0.125 0.5 +v -0.3125 0.25 0.5 +v -0.3125 0.25 -0.5 +v -0.4375 -0.125 -0.5 +v -0.4375 -0.125 0.5 +v -0.4375 0.25 0.5 +v -0.4375 0.25 -0.5 +v 0.1875 -0.375 -0.5 +v 0.1875 -0.375 0.5 +v 0.1875 -0.25 0.5 +v 0.1875 -0.25 -0.5 +v -0.5 -0.375 -0.5 +v -0.5 -0.375 0.5 +v -0.5 -0.25 0.5 +v -0.5 -0.25 -0.5 +v 0.1875 -0.25 -0.5 +v 0.1875 -0.25 0.5 +v 0.1875 0.125 0.5 +v 0.1875 0.125 -0.5 +v 0.0625 -0.25 -0.5 +v 0.0625 -0.25 0.5 +v 0.0625 0.125 0.5 +v 0.0625 0.125 -0.5 +v -0.0625 -0.125 -0.5 +v -0.0625 -0.125 0.5 +v -0.0625 0 0.5 +v -0.0625 0 -0.5 +v -0.3125 -0.125 -0.5 +v -0.3125 -0.125 0.5 +v -0.3125 0 0.5 +v -0.3125 0 -0.5 +v 0.0625 0 -0.5 +v 0.0625 0 0.5 +v 0.0625 0.125 0.5 +v 0.0625 0.125 -0.5 +v -0.1875 0 -0.5 +v -0.1875 0 0.5 +v -0.1875 0.125 0.5 +v -0.1875 0.125 -0.5 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 +g nodebox5 +f 33 34 35 36 +f 37 38 39 40 +f 33 36 40 37 +f 34 35 39 38 +f 33 34 38 37 +f 36 35 39 40 +g nodebox6 +f 41 42 43 44 +f 45 46 47 48 +f 41 44 48 45 +f 42 43 47 46 +f 41 42 46 45 +f 44 43 47 48 +g nodebox7 +f 49 50 51 52 +f 53 54 55 56 +f 49 52 56 53 +f 50 51 55 54 +f 49 50 54 53 +f 52 51 55 56 +g nodebox8 +f 57 58 59 60 +f 61 62 63 64 +f 57 60 64 61 +f 58 59 63 62 +f 57 58 62 61 +f 60 59 63 64 +g nodebox9 +f 65 66 67 68 +f 69 70 71 72 +f 65 68 72 69 +f 66 67 71 70 +f 65 66 70 69 +f 68 67 71 72 +g nodebox10 +f 73 74 75 76 +f 77 78 79 80 +f 73 76 80 77 +f 74 75 79 78 +f 73 74 78 77 +f 76 75 79 80 +g nodebox11 +f 81 82 83 84 +f 85 86 87 88 +f 81 84 88 85 +f 82 83 87 86 +f 81 82 86 85 +f 84 83 87 88 diff --git a/mods/facade/models/carved_stone_a_corner.obj b/mods/facade/models/carved_stone_a_corner.obj new file mode 100644 index 00000000..88f88ac0 --- /dev/null +++ b/mods/facade/models/carved_stone_a_corner.obj @@ -0,0 +1,289 @@ +mtllib carved_stone_a_corner.mtl +o converted_out +v 0.4375 -0.5 -0.4375 +v 0.4375 -0.5 0.5 +v 0.4375 0.5 0.5 +v 0.4375 0.5 -0.4375 +v -0.5 -0.5 -0.4375 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.4375 +v 0.5 0.4375 -0.5 +v 0.5 0.4375 -0.4375 +v 0.5 0.5 -0.4375 +v 0.5 0.5 -0.5 +v -0.5 0.4375 -0.5 +v -0.5 0.4375 -0.4375 +v -0.5 0.5 -0.4375 +v -0.5 0.5 -0.5 +v 0.5 -0.5 -0.5 +v 0.5 -0.5 0.5 +v 0.5 -0.4375 0.5 +v 0.5 -0.4375 -0.5 +v -0.5 -0.5 -0.5 +v -0.5 -0.5 0.5 +v -0.5 -0.4375 0.5 +v -0.5 -0.4375 -0.5 +v 0.4375 -0.375 -0.5 +v 0.4375 -0.375 -0.4375 +v 0.4375 0.375 -0.4375 +v 0.4375 0.375 -0.5 +v 0.3125 -0.375 -0.5 +v 0.3125 -0.375 -0.4375 +v 0.3125 0.375 -0.4375 +v 0.3125 0.375 -0.5 +v 0.5 -0.375 -0.5 +v 0.5 -0.375 0.1875 +v 0.5 -0.25 0.1875 +v 0.5 -0.25 -0.5 +v 0.3125 -0.375 -0.5 +v 0.3125 -0.375 0.1875 +v 0.3125 -0.25 0.1875 +v 0.3125 -0.25 -0.5 +v 0.4375 0.25 -0.5 +v 0.4375 0.25 0.5 +v 0.4375 0.375 0.5 +v 0.4375 0.375 -0.5 +v -0.4375 0.25 -0.5 +v -0.4375 0.25 0.5 +v -0.4375 0.375 0.5 +v -0.4375 0.375 -0.5 +v -0.3125 -0.125 -0.5 +v -0.3125 -0.125 0.5 +v -0.3125 0.25 0.5 +v -0.3125 0.25 -0.5 +v -0.4375 -0.125 -0.5 +v -0.4375 -0.125 0.5 +v -0.4375 0.25 0.5 +v -0.4375 0.25 -0.5 +v 0.1875 -0.375 -0.5 +v 0.1875 -0.375 0.5 +v 0.1875 -0.25 0.5 +v 0.1875 -0.25 -0.5 +v -0.5 -0.375 -0.5 +v -0.5 -0.375 0.5 +v -0.5 -0.25 0.5 +v -0.5 -0.25 -0.5 +v 0.1875 -0.25 -0.5 +v 0.1875 -0.25 0.5 +v 0.1875 0.125 0.5 +v 0.1875 0.125 -0.5 +v 0.0625 -0.25 -0.5 +v 0.0625 -0.25 0.5 +v 0.0625 0.125 0.5 +v 0.0625 0.125 -0.5 +v -0.0625 -0.125 -0.5 +v -0.0625 -0.125 0.5 +v -0.0625 0 0.5 +v -0.0625 0 -0.5 +v -0.3125 -0.125 -0.5 +v -0.3125 -0.125 0.5 +v -0.3125 0 0.5 +v -0.3125 0 -0.5 +v 0.0625 0 -0.5 +v 0.0625 0 0.5 +v 0.0625 0.125 0.5 +v 0.0625 0.125 -0.5 +v -0.1875 0 -0.5 +v -0.1875 0 0.5 +v -0.1875 0.125 0.5 +v -0.1875 0.125 -0.5 +v 0.5 0.4375 -0.5 +v 0.5 0.4375 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v -0.5 0.4375 -0.5 +v -0.5 0.4375 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.5 +v 0.5 -0.125 -0.4375 +v 0.5 -0.125 -0.3125 +v 0.5 0.375 -0.3125 +v 0.5 0.375 -0.4375 +v -0.5 -0.125 -0.4375 +v -0.5 -0.125 -0.3125 +v -0.5 0.375 -0.3125 +v -0.5 0.375 -0.4375 +v 0.5 0.25 -0.3125 +v 0.5 0.25 0.4375 +v 0.5 0.375 0.4375 +v 0.5 0.375 -0.3125 +v -0.5 0.25 -0.3125 +v -0.5 0.25 0.4375 +v -0.5 0.375 0.4375 +v -0.5 0.375 -0.3125 +v 0.5 -0.375 0.3125 +v 0.5 -0.375 0.4375 +v 0.5 0.375 0.4375 +v 0.5 0.375 0.3125 +v -0.4375 -0.375 0.3125 +v -0.4375 -0.375 0.4375 +v -0.4375 0.375 0.4375 +v -0.4375 0.375 0.3125 +v 0.5 -0.375 0.3125 +v 0.5 -0.375 0.5 +v 0.5 -0.25 0.5 +v 0.5 -0.25 0.3125 +v -0.4375 -0.375 0.3125 +v -0.4375 -0.375 0.5 +v -0.4375 -0.25 0.5 +v -0.4375 -0.25 0.3125 +v 0.5 -0.125 -0.3125 +v 0.5 -0.125 -0.0625 +v 0.5 0 -0.0625 +v 0.5 0 -0.3125 +v -0.4375 -0.125 -0.3125 +v -0.4375 -0.125 -0.0625 +v -0.4375 0 -0.0625 +v -0.4375 0 -0.3125 +v 0.5 0 -0.1875 +v 0.5 0 0.1875 +v 0.5 0.125 0.1875 +v 0.5 0.125 -0.1875 +v -0.4375 0 -0.1875 +v -0.4375 0 0.1875 +v -0.4375 0.125 0.1875 +v -0.4375 0.125 -0.1875 +v 0.5 -0.25 0.0625 +v 0.5 -0.25 0.1875 +v 0.5 0.125 0.1875 +v 0.5 0.125 0.0625 +v -0.4375 -0.25 0.0625 +v -0.4375 -0.25 0.1875 +v -0.4375 0.125 0.1875 +v -0.4375 0.125 0.0625 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 +g nodebox5 +f 33 34 35 36 +f 37 38 39 40 +f 33 36 40 37 +f 34 35 39 38 +f 33 34 38 37 +f 36 35 39 40 +g nodebox6 +f 41 42 43 44 +f 45 46 47 48 +f 41 44 48 45 +f 42 43 47 46 +f 41 42 46 45 +f 44 43 47 48 +g nodebox7 +f 49 50 51 52 +f 53 54 55 56 +f 49 52 56 53 +f 50 51 55 54 +f 49 50 54 53 +f 52 51 55 56 +g nodebox8 +f 57 58 59 60 +f 61 62 63 64 +f 57 60 64 61 +f 58 59 63 62 +f 57 58 62 61 +f 60 59 63 64 +g nodebox9 +f 65 66 67 68 +f 69 70 71 72 +f 65 68 72 69 +f 66 67 71 70 +f 65 66 70 69 +f 68 67 71 72 +g nodebox10 +f 73 74 75 76 +f 77 78 79 80 +f 73 76 80 77 +f 74 75 79 78 +f 73 74 78 77 +f 76 75 79 80 +g nodebox11 +f 81 82 83 84 +f 85 86 87 88 +f 81 84 88 85 +f 82 83 87 86 +f 81 82 86 85 +f 84 83 87 88 +g nodebox12 +f 89 90 91 92 +f 93 94 95 96 +f 89 92 96 93 +f 90 91 95 94 +f 89 90 94 93 +f 92 91 95 96 +g nodebox13 +f 97 98 99 100 +f 101 102 103 104 +f 97 100 104 101 +f 98 99 103 102 +f 97 98 102 101 +f 100 99 103 104 +g nodebox14 +f 105 106 107 108 +f 109 110 111 112 +f 105 108 112 109 +f 106 107 111 110 +f 105 106 110 109 +f 108 107 111 112 +g nodebox15 +f 113 114 115 116 +f 117 118 119 120 +f 113 116 120 117 +f 114 115 119 118 +f 113 114 118 117 +f 116 115 119 120 +g nodebox16 +f 121 122 123 124 +f 125 126 127 128 +f 121 124 128 125 +f 122 123 127 126 +f 121 122 126 125 +f 124 123 127 128 +g nodebox17 +f 129 130 131 132 +f 133 134 135 136 +f 129 132 136 133 +f 130 131 135 134 +f 129 130 134 133 +f 132 131 135 136 +g nodebox18 +f 137 138 139 140 +f 141 142 143 144 +f 137 140 144 141 +f 138 139 143 142 +f 137 138 142 141 +f 140 139 143 144 +g nodebox19 +f 145 146 147 148 +f 149 150 151 152 +f 145 148 152 149 +f 146 147 151 150 +f 145 146 150 149 +f 148 147 151 152 diff --git a/mods/facade/models/column.obj b/mods/facade/models/column.obj new file mode 100644 index 00000000..1e51be9d --- /dev/null +++ b/mods/facade/models/column.obj @@ -0,0 +1,79 @@ +mtllib column.mtl +o converted_out +v 0.5 -0.5 -0.4375 +v 0.5 -0.5 0.4375 +v 0.5 0.5 0.4375 +v 0.5 0.5 -0.4375 +v -0.5 -0.5 -0.4375 +v -0.5 -0.5 0.4375 +v -0.5 0.5 0.4375 +v -0.5 0.5 -0.4375 +v 0.5 -0.5 -0.5 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v 0.3125 -0.5 -0.5 +v 0.3125 -0.5 0.5 +v 0.3125 0.5 0.5 +v 0.3125 0.5 -0.5 +v -0.3125 -0.5 -0.5 +v -0.3125 -0.5 0.5 +v -0.3125 0.5 0.5 +v -0.3125 0.5 -0.5 +v -0.5 -0.5 -0.5 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.5 +v -0.0625 -0.5 -0.5 +v -0.0625 -0.5 0.5 +v -0.0625 0.5 0.5 +v -0.0625 0.5 -0.5 +v -0.1875 -0.5 -0.5 +v -0.1875 -0.5 0.5 +v -0.1875 0.5 0.5 +v -0.1875 0.5 -0.5 +v 0.1875 -0.5 -0.5 +v 0.1875 -0.5 0.5 +v 0.1875 0.5 0.5 +v 0.1875 0.5 -0.5 +v 0.0625 -0.5 -0.5 +v 0.0625 -0.5 0.5 +v 0.0625 0.5 0.5 +v 0.0625 0.5 -0.5 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 +g nodebox5 +f 33 34 35 36 +f 37 38 39 40 +f 33 36 40 37 +f 34 35 39 38 +f 33 34 38 37 +f 36 35 39 40 diff --git a/mods/facade/models/column_corner.obj b/mods/facade/models/column_corner.obj new file mode 100644 index 00000000..891215f9 --- /dev/null +++ b/mods/facade/models/column_corner.obj @@ -0,0 +1,139 @@ +mtllib column_corner.mtl +o converted_out +v 0.4375 -0.5 -0.4375 +v 0.4375 -0.5 0.4375 +v 0.4375 0.5 0.4375 +v 0.4375 0.5 -0.4375 +v -0.4375 -0.5 -0.4375 +v -0.4375 -0.5 0.4375 +v -0.4375 0.5 0.4375 +v -0.4375 0.5 -0.4375 +v 0.5 -0.5 0.3125 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 0.3125 +v 0.3125 -0.5 0.3125 +v 0.3125 -0.5 0.5 +v 0.3125 0.5 0.5 +v 0.3125 0.5 0.3125 +v -0.3125 -0.5 -0.5 +v -0.3125 -0.5 -0.3125 +v -0.3125 0.5 -0.3125 +v -0.3125 0.5 -0.5 +v -0.5 -0.5 -0.5 +v -0.5 -0.5 -0.3125 +v -0.5 0.5 -0.3125 +v -0.5 0.5 -0.5 +v -0.0625 -0.5 -0.5 +v -0.0625 -0.5 0.5 +v -0.0625 0.5 0.5 +v -0.0625 0.5 -0.5 +v -0.1875 -0.5 -0.5 +v -0.1875 -0.5 0.5 +v -0.1875 0.5 0.5 +v -0.1875 0.5 -0.5 +v 0.1875 -0.5 -0.5 +v 0.1875 -0.5 0.5 +v 0.1875 0.5 0.5 +v 0.1875 0.5 -0.5 +v 0.0625 -0.5 -0.5 +v 0.0625 -0.5 0.5 +v 0.0625 0.5 0.5 +v 0.0625 0.5 -0.5 +v -0.3125 -0.5 0.3125 +v -0.3125 -0.5 0.5 +v -0.3125 0.5 0.5 +v -0.3125 0.5 0.3125 +v -0.5 -0.5 0.3125 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 0.3125 +v 0.5 -0.5 -0.5 +v 0.5 -0.5 -0.3125 +v 0.5 0.5 -0.3125 +v 0.5 0.5 -0.5 +v 0.3125 -0.5 -0.5 +v 0.3125 -0.5 -0.3125 +v 0.3125 0.5 -0.3125 +v 0.3125 0.5 -0.5 +v 0.5 -0.5 0.0625 +v 0.5 -0.5 0.1875 +v 0.5 0.5 0.1875 +v 0.5 0.5 0.0625 +v -0.5 -0.5 0.0625 +v -0.5 -0.5 0.1875 +v -0.5 0.5 0.1875 +v -0.5 0.5 0.0625 +v 0.5 -0.5 -0.1875 +v 0.5 -0.5 -0.0625 +v 0.5 0.5 -0.0625 +v 0.5 0.5 -0.1875 +v -0.5 -0.5 -0.1875 +v -0.5 -0.5 -0.0625 +v -0.5 0.5 -0.0625 +v -0.5 0.5 -0.1875 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 +g nodebox5 +f 33 34 35 36 +f 37 38 39 40 +f 33 36 40 37 +f 34 35 39 38 +f 33 34 38 37 +f 36 35 39 40 +g nodebox6 +f 41 42 43 44 +f 45 46 47 48 +f 41 44 48 45 +f 42 43 47 46 +f 41 42 46 45 +f 44 43 47 48 +g nodebox7 +f 49 50 51 52 +f 53 54 55 56 +f 49 52 56 53 +f 50 51 55 54 +f 49 50 54 53 +f 52 51 55 56 +g nodebox8 +f 57 58 59 60 +f 61 62 63 64 +f 57 60 64 61 +f 58 59 63 62 +f 57 58 62 61 +f 60 59 63 64 +g nodebox9 +f 65 66 67 68 +f 69 70 71 72 +f 65 68 72 69 +f 66 67 71 70 +f 65 66 70 69 +f 68 67 71 72 diff --git a/mods/facade/models/corbel.obj b/mods/facade/models/corbel.obj new file mode 100644 index 00000000..726d8540 --- /dev/null +++ b/mods/facade/models/corbel.obj @@ -0,0 +1,49 @@ +mtllib corbel.mtl +o converted_out +v 0.5 0 -0.5 +v 0.5 0 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v -0.5 0 -0.5 +v -0.5 0 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.5 +v 0.5 -0.5 0 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 0 +v -0.5 -0.5 0 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 0 +v 0.1875 -0.3125 -0.3125 +v 0.1875 -0.3125 0 +v 0.1875 0.5 0 +v 0.1875 0.5 -0.3125 +v -0.1875 -0.3125 -0.3125 +v -0.1875 -0.3125 0 +v -0.1875 0.5 0 +v -0.1875 0.5 -0.3125 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 diff --git a/mods/facade/models/corbel_corner.obj b/mods/facade/models/corbel_corner.obj new file mode 100644 index 00000000..11b1641d --- /dev/null +++ b/mods/facade/models/corbel_corner.obj @@ -0,0 +1,49 @@ +mtllib corbel_corner.mtl +o converted_out +v 0.5 0 -0.5 +v 0.5 0 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v -0.5 0 -0.5 +v -0.5 0 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.5 +v 0.5 -0.5 0 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 0 +v -0 -0.5 0 +v -0 -0.5 0.5 +v -0 0.5 0.5 +v -0 0.5 0 +v -0 -0.3125 -0.3125 +v -0 -0.3125 0 +v -0 0.5 0 +v -0 0.5 -0.3125 +v -0.3125 -0.3125 -0.3125 +v -0.3125 -0.3125 0 +v -0.3125 0.5 0 +v -0.3125 0.5 -0.3125 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 diff --git a/mods/facade/models/corbel_inner_corner.obj b/mods/facade/models/corbel_inner_corner.obj new file mode 100644 index 00000000..7a3920ce --- /dev/null +++ b/mods/facade/models/corbel_inner_corner.obj @@ -0,0 +1,64 @@ +mtllib corbel_inner_corner.mtl +o converted_out +v 0.5 0 -0.5 +v 0.5 0 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v -0.5 0 -0.5 +v -0.5 0 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 -0.5 +v 0.5 -0.5 0 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 0 +v -0.5 -0.5 0 +v -0.5 -0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 0 +v -0 -0.3125 -0.3125 +v -0 -0.3125 0 +v -0 0.5 0 +v -0 0.5 -0.3125 +v -0.3125 -0.3125 -0.3125 +v -0.3125 -0.3125 0 +v -0.3125 0.5 0 +v -0.3125 0.5 -0.3125 +v 0.5 -0.5 -0.5 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 -0.5 +v -0 -0.5 -0.5 +v -0 -0.5 0.5 +v -0 0.5 0.5 +v -0 0.5 -0.5 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 diff --git a/mods/facade/models/corner_bricks.obj b/mods/facade/models/corner_bricks.obj new file mode 100644 index 00000000..b733f59c --- /dev/null +++ b/mods/facade/models/corner_bricks.obj @@ -0,0 +1,64 @@ +mtllib corner_bricks.mtl +o converted_out +v 0.5625 -0.5 0.4375 +v 0.5625 -0.5 1 +v 0.5625 0 1 +v 0.5625 0 0.4375 +v 0.5 -0.5 0.4375 +v 0.5 -0.5 1 +v 0.5 0 1 +v 0.5 0 0.4375 +v 0.5 -0.5 0.4375 +v 0.5 -0.5 0.5 +v 0.5 0 0.5 +v 0.5 0 0.4375 +v -0 -0.5 0.4375 +v -0 -0.5 0.5 +v -0 0 0.5 +v -0 0 0.4375 +v 0.5625 0 0.5 +v 0.5625 0 1.5 +v 0.5625 0.5 1.5 +v 0.5625 0.5 0.5 +v 0.5 0 0.5 +v 0.5 0 1.5 +v 0.5 0.5 1.5 +v 0.5 0.5 0.5 +v 0.5625 0 0.4375 +v 0.5625 0 0.5 +v 0.5625 0.5 0.5 +v 0.5625 0.5 0.4375 +v -0.5 0 0.4375 +v -0.5 0 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 0.4375 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 diff --git a/mods/facade/models/license.txt b/mods/facade/models/license.txt new file mode 100644 index 00000000..ecc81dcf --- /dev/null +++ b/mods/facade/models/license.txt @@ -0,0 +1,18 @@ +source files for facade +Copyright (C) 2016 - 2018 TumeniNodes +Attribution - ShareAlike 4.0 International (CC BY-SA 4.0) +https://creativecommons.org/licenses/by-sa/4.0/ +========================================================= +bannerstone.obj +bannerstone_corner.obj +carved_stone_a.obj +carved_stone_a_corner.obj +column.obj +column_corner.obj +corbel.obj +corbel_corner.obj +corbel_inner_corner.obj +rgspro.obj +rgspro_corner.obj +rgspro_inner.obj +corner_bricks.obj diff --git a/mods/facade/models/nbe files/bannerstone.nbe b/mods/facade/models/nbe files/bannerstone.nbe new file mode 100644 index 00000000..1c5bbd47 Binary files /dev/null and b/mods/facade/models/nbe files/bannerstone.nbe differ diff --git a/mods/facade/models/nbe files/bannerstone_corner.nbe b/mods/facade/models/nbe files/bannerstone_corner.nbe new file mode 100644 index 00000000..59443441 Binary files /dev/null and b/mods/facade/models/nbe files/bannerstone_corner.nbe differ diff --git a/mods/facade/models/nbe files/carved_stone_a.nbe b/mods/facade/models/nbe files/carved_stone_a.nbe new file mode 100644 index 00000000..a93cd3fe Binary files /dev/null and b/mods/facade/models/nbe files/carved_stone_a.nbe differ diff --git a/mods/facade/models/nbe files/carved_stone_a_corner.nbe b/mods/facade/models/nbe files/carved_stone_a_corner.nbe new file mode 100644 index 00000000..9a0f0c09 Binary files /dev/null and b/mods/facade/models/nbe files/carved_stone_a_corner.nbe differ diff --git a/mods/facade/models/nbe files/column.nbe b/mods/facade/models/nbe files/column.nbe new file mode 100644 index 00000000..e200dba4 Binary files /dev/null and b/mods/facade/models/nbe files/column.nbe differ diff --git a/mods/facade/models/nbe files/column_corner.nbe b/mods/facade/models/nbe files/column_corner.nbe new file mode 100644 index 00000000..59933fcd Binary files /dev/null and b/mods/facade/models/nbe files/column_corner.nbe differ diff --git a/mods/facade/models/nbe files/corbel.nbe b/mods/facade/models/nbe files/corbel.nbe new file mode 100644 index 00000000..b6e12f1e Binary files /dev/null and b/mods/facade/models/nbe files/corbel.nbe differ diff --git a/mods/facade/models/nbe files/corbel_corner.nbe b/mods/facade/models/nbe files/corbel_corner.nbe new file mode 100644 index 00000000..4de43a88 Binary files /dev/null and b/mods/facade/models/nbe files/corbel_corner.nbe differ diff --git a/mods/facade/models/nbe files/corbel_inner_corner.nbe b/mods/facade/models/nbe files/corbel_inner_corner.nbe new file mode 100644 index 00000000..1894b9b5 Binary files /dev/null and b/mods/facade/models/nbe files/corbel_inner_corner.nbe differ diff --git a/mods/facade/models/nbe files/corner_bricks.nbe b/mods/facade/models/nbe files/corner_bricks.nbe new file mode 100644 index 00000000..0573bbaa Binary files /dev/null and b/mods/facade/models/nbe files/corner_bricks.nbe differ diff --git a/mods/facade/models/nbe files/nbe.txt b/mods/facade/models/nbe files/nbe.txt new file mode 100644 index 00000000..a725db23 --- /dev/null +++ b/mods/facade/models/nbe files/nbe.txt @@ -0,0 +1 @@ +These are Node Box Editor saved files diff --git a/mods/facade/models/nbe files/rgspro.nbe b/mods/facade/models/nbe files/rgspro.nbe new file mode 100644 index 00000000..9b9e4489 Binary files /dev/null and b/mods/facade/models/nbe files/rgspro.nbe differ diff --git a/mods/facade/models/nbe files/rgspro_corner.nbe b/mods/facade/models/nbe files/rgspro_corner.nbe new file mode 100644 index 00000000..fef58c76 Binary files /dev/null and b/mods/facade/models/nbe files/rgspro_corner.nbe differ diff --git a/mods/facade/models/nbe files/rgspro_inner.nbe b/mods/facade/models/nbe files/rgspro_inner.nbe new file mode 100644 index 00000000..ee780668 Binary files /dev/null and b/mods/facade/models/nbe files/rgspro_inner.nbe differ diff --git a/mods/facade/models/nbe lua files/bannerstone.lua b/mods/facade/models/nbe lua files/bannerstone.lua new file mode 100644 index 00000000..7fb6c3c7 --- /dev/null +++ b/mods/facade/models/nbe lua files/bannerstone.lua @@ -0,0 +1,25 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5, 0.25, -0.5625, 0.5, 0.375, -0.5}, -- NodeBox2 + {-0.5, -0.375, -0.5625, 0.5, -0.25, -0.5}, -- NodeBox3 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/bannerstone_corner.lua b/mods/facade/models/nbe lua files/bannerstone_corner.lua new file mode 100644 index 00000000..d4ce5e66 --- /dev/null +++ b/mods/facade/models/nbe lua files/bannerstone_corner.lua @@ -0,0 +1,25 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5625, 0.25, -0.5625, 0.5625, 0.375, 0.5625}, -- NodeBox2 + {-0.5625, -0.375, -0.5625, 0.5625, -0.25, 0.5625}, -- NodeBox3 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/carved_stone_a.lua b/mods/facade/models/nbe lua files/carved_stone_a.lua new file mode 100644 index 00000000..0c6fee9b --- /dev/null +++ b/mods/facade/models/nbe lua files/carved_stone_a.lua @@ -0,0 +1,33 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.4375, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375}, -- NodeBox2 + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, -- NodeBox3 + {-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375}, -- NodeBox4 + {-0.5, -0.375, -0.5, -0.3125, -0.25, 0.5}, -- NodeBox5 + {-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5}, -- NodeBox6 + {0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5}, -- NodeBox7 + {-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5}, -- NodeBox8 + {-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5}, -- NodeBox9 + {0.0625, -0.125, -0.5, 0.3125, 0, 0.5}, -- NodeBox10 + {-0.0625, 0, -0.5, 0.1875, 0.125, 0.5}, -- NodeBox11 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/carved_stone_a_corner.lua b/mods/facade/models/nbe lua files/carved_stone_a_corner.lua new file mode 100644 index 00000000..cfb65398 --- /dev/null +++ b/mods/facade/models/nbe lua files/carved_stone_a_corner.lua @@ -0,0 +1,41 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375}, -- NodeBox2 + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, -- NodeBox3 + {-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375}, -- NodeBox4 + {-0.5, -0.375, -0.5, -0.3125, -0.25, 0.1875}, -- NodeBox5 + {-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5}, -- NodeBox6 + {0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5}, -- NodeBox7 + {-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5}, -- NodeBox8 + {-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5}, -- NodeBox9 + {0.0625, -0.125, -0.5, 0.3125, 0, 0.5}, -- NodeBox10 + {-0.0625, 0, -0.5, 0.1875, 0.125, 0.5}, -- NodeBox11 + {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5}, -- NodeBox12 + {-0.5, -0.125, -0.4375, 0.5, 0.375, -0.3125}, -- NodeBox13 + {-0.5, 0.25, -0.3125, 0.5, 0.375, 0.4375}, -- NodeBox14 + {-0.5, -0.375, 0.3125, 0.4375, 0.375, 0.4375}, -- NodeBox15 + {-0.5, -0.375, 0.3125, 0.4375, -0.25, 0.5}, -- NodeBox16 + {-0.5, -0.125, -0.3125, 0.4375, 0, -0.0625}, -- NodeBox17 + {-0.5, 0, -0.1875, 0.4375, 0.125, 0.1875}, -- NodeBox18 + {-0.5, -0.25, 0.0625, 0.4375, 0.125, 0.1875}, -- NodeBox19 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/column.lua b/mods/facade/models/nbe lua files/column.lua new file mode 100644 index 00000000..2ecaf8c4 --- /dev/null +++ b/mods/facade/models/nbe lua files/column.lua @@ -0,0 +1,27 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.4375, 0.5, 0.5, 0.4375}, -- NodeBox1 + {-0.5, -0.5, -0.5, -0.3125, 0.5, 0.5}, -- NodeBox2 + {0.3125, -0.5, -0.5, 0.5, 0.5, 0.5}, -- NodeBox3 + {0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5}, -- NodeBox4 + {-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5}, -- NodeBox5 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/column_corner.lua b/mods/facade/models/nbe lua files/column_corner.lua new file mode 100644 index 00000000..582688fc --- /dev/null +++ b/mods/facade/models/nbe lua files/column_corner.lua @@ -0,0 +1,31 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, 0.4375, 0.5, 0.4375}, -- NodeBox1 + {-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5}, -- NodeBox2 + {0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125}, -- NodeBox3 + {0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5}, -- NodeBox4 + {-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5}, -- NodeBox5 + {0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5}, -- NodeBox6 + {-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125}, -- NodeBox7 + {-0.5, -0.5, 0.0625, 0.5, 0.5, 0.1875}, -- NodeBox8 + {-0.5, -0.5, -0.1875, 0.5, 0.5, -0.0625}, -- NodeBox9 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/corbel.lua b/mods/facade/models/nbe lua files/corbel.lua new file mode 100644 index 00000000..22712ed4 --- /dev/null +++ b/mods/facade/models/nbe lua files/corbel.lua @@ -0,0 +1,25 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, -- NodeBox2 + {-0.1875, -0.3125, -0.3125, 0.1875, 0.5, 0}, -- NodeBox3 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/corbel_corner.lua b/mods/facade/models/nbe lua files/corbel_corner.lua new file mode 100644 index 00000000..c0416a51 --- /dev/null +++ b/mods/facade/models/nbe lua files/corbel_corner.lua @@ -0,0 +1,25 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5, -0.5, 0, 0, 0.5, 0.5}, -- NodeBox2 + {0, -0.3125, -0.3125, 0.3125, 0.5, 0}, -- NodeBox3 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/corbel_inner_corner.lua b/mods/facade/models/nbe lua files/corbel_inner_corner.lua new file mode 100644 index 00000000..f863946b --- /dev/null +++ b/mods/facade/models/nbe lua files/corbel_inner_corner.lua @@ -0,0 +1,26 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, -- NodeBox1 + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, -- NodeBox2 + {0, -0.3125, -0.3125, 0.3125, 0.5, 0}, -- NodeBox3 + {-0.5, -0.5, -0.5, 0, 0.5, 0.5}, -- NodeBox4 + } + } +}) + diff --git a/mods/facade/models/nbe lua files/corner_bricks.lua b/mods/facade/models/nbe lua files/corner_bricks.lua new file mode 100644 index 00000000..9975c02b --- /dev/null +++ b/mods/facade/models/nbe lua files/corner_bricks.lua @@ -0,0 +1,26 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5625, -0.5, 0.4375, -0.5, 0, 1}, + {-0.5, -0.5, 0.4375, 0, 0, 0.5}, + {-0.5625, 0, 0.5, -0.5, 0.5, 1.5}, + {-0.5625, 0, 0.4375, 0.5, 0.5, 0.5}, + } + } +}) + diff --git a/mods/facade/models/nbe lua files/nbe lua.txt b/mods/facade/models/nbe lua files/nbe lua.txt new file mode 100644 index 00000000..62d247f1 --- /dev/null +++ b/mods/facade/models/nbe lua files/nbe lua.txt @@ -0,0 +1 @@ +Lua files from Node Box Editor diff --git a/mods/facade/models/nbe lua files/rgspro.lua b/mods/facade/models/nbe lua files/rgspro.lua new file mode 100644 index 00000000..888badbc --- /dev/null +++ b/mods/facade/models/nbe lua files/rgspro.lua @@ -0,0 +1,25 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5}, + {-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.125, 0.5, 0.5, 0.5}, + } + } +}) + diff --git a/mods/facade/models/nbe lua files/rgspro_corner.lua b/mods/facade/models/nbe lua files/rgspro_corner.lua new file mode 100644 index 00000000..31e70a76 --- /dev/null +++ b/mods/facade/models/nbe lua files/rgspro_corner.lua @@ -0,0 +1,28 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5}, + {-0.5, -0.3125, 0.25, 0.5, -0.0625, 0.5}, + {-0.5, -0.125, 0.125, 0.5, 0.5, 0.5}, + {-0.625, -0.5, 0.375, -0.5, -0.3125, 1.5}, + {-0.75, -0.3125, 0.25, -0.5, -0.125, 1.5}, + {-0.875, -0.125, 0.125, -0.5, 0.5, 1.5}, + } + } +}) + diff --git a/mods/facade/models/nbe lua files/rgspro_inner.lua b/mods/facade/models/nbe lua files/rgspro_inner.lua new file mode 100644 index 00000000..dfe21429 --- /dev/null +++ b/mods/facade/models/nbe lua files/rgspro_inner.lua @@ -0,0 +1,28 @@ +-- GENERATED CODE +-- Node Box Editor, version 0.9.0 +-- Namespace: test + +minetest.register_node("test:node_1", { + tiles = { + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png", + "default_wood.png" + }, + drawtype = "nodebox", + paramtype = "light", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5}, + {-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.125, 0.5, 0.5, 0.5}, + {0.375, -0.5, -0.5, 0.5, -0.3125, 0.375}, + {0.25, -0.3125, -0.5, 0.5, -0.0625, 0.25}, + {0.125, -0.125, -0.5, 0.5, 0.5, 0.125}, + } + } +}) + diff --git a/mods/facade/models/obj_info.txt b/mods/facade/models/obj_info.txt new file mode 100644 index 00000000..8b6cfade --- /dev/null +++ b/mods/facade/models/obj_info.txt @@ -0,0 +1,6 @@ +These .obj files were created using Rubenwardy's NodeBoxEditor https://forum.minetest.net/viewtopic.php?f=14&t=2840&hilit=NBE (which is a very nice and useful tool) + +They do support textures but, do not support UV mapping, and they will still render as individual objects. They are provided merely as a reference for anyone who may whish to create .obj models using Blender, or other similar 3D modeling software. + +However, there is a method with Blender, in which one can delete duplicate faces, etc., which would make these closely workable to a native .obj file, and help with UV mapping. +It would be up to you to do a search on this method, as I have no interest in doing so. diff --git a/mods/facade/models/rgspro.obj b/mods/facade/models/rgspro.obj new file mode 100644 index 00000000..593a2a82 --- /dev/null +++ b/mods/facade/models/rgspro.obj @@ -0,0 +1,49 @@ +mtllib rgspro.mtl +o converted_out +v 0.5 -0.5 0.375 +v 0.5 -0.5 0.5 +v 0.5 -0.3125 0.5 +v 0.5 -0.3125 0.375 +v -0.5 -0.5 0.375 +v -0.5 -0.5 0.5 +v -0.5 -0.3125 0.5 +v -0.5 -0.3125 0.375 +v 0.5 -0.3125 0.25 +v 0.5 -0.3125 0.5 +v 0.5 -0.125 0.5 +v 0.5 -0.125 0.25 +v -0.5 -0.3125 0.25 +v -0.5 -0.3125 0.5 +v -0.5 -0.125 0.5 +v -0.5 -0.125 0.25 +v 0.5 -0.125 0.125 +v 0.5 -0.125 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 0.125 +v -0.5 -0.125 0.125 +v -0.5 -0.125 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 0.125 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 diff --git a/mods/facade/models/rgspro_corner.obj b/mods/facade/models/rgspro_corner.obj new file mode 100644 index 00000000..506df93a --- /dev/null +++ b/mods/facade/models/rgspro_corner.obj @@ -0,0 +1,94 @@ +mtllib rgspro_corner.mtl +o converted_out +v 0.5 -0.5 0.375 +v 0.5 -0.5 0.5 +v 0.5 -0.3125 0.5 +v 0.5 -0.3125 0.375 +v -0.5 -0.5 0.375 +v -0.5 -0.5 0.5 +v -0.5 -0.3125 0.5 +v -0.5 -0.3125 0.375 +v 0.5 -0.3125 0.25 +v 0.5 -0.3125 0.5 +v 0.5 -0.0625 0.5 +v 0.5 -0.0625 0.25 +v -0.5 -0.3125 0.25 +v -0.5 -0.3125 0.5 +v -0.5 -0.0625 0.5 +v -0.5 -0.0625 0.25 +v 0.5 -0.125 0.125 +v 0.5 -0.125 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 0.125 +v -0.5 -0.125 0.125 +v -0.5 -0.125 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 0.125 +v 0.625 -0.5 0.375 +v 0.625 -0.5 1.5 +v 0.625 -0.3125 1.5 +v 0.625 -0.3125 0.375 +v 0.5 -0.5 0.375 +v 0.5 -0.5 1.5 +v 0.5 -0.3125 1.5 +v 0.5 -0.3125 0.375 +v 0.75 -0.3125 0.25 +v 0.75 -0.3125 1.5 +v 0.75 -0.125 1.5 +v 0.75 -0.125 0.25 +v 0.5 -0.3125 0.25 +v 0.5 -0.3125 1.5 +v 0.5 -0.125 1.5 +v 0.5 -0.125 0.25 +v 0.875 -0.125 0.125 +v 0.875 -0.125 1.5 +v 0.875 0.5 1.5 +v 0.875 0.5 0.125 +v 0.5 -0.125 0.125 +v 0.5 -0.125 1.5 +v 0.5 0.5 1.5 +v 0.5 0.5 0.125 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 +g nodebox5 +f 33 34 35 36 +f 37 38 39 40 +f 33 36 40 37 +f 34 35 39 38 +f 33 34 38 37 +f 36 35 39 40 +g nodebox6 +f 41 42 43 44 +f 45 46 47 48 +f 41 44 48 45 +f 42 43 47 46 +f 41 42 46 45 +f 44 43 47 48 diff --git a/mods/facade/models/rgspro_inner.obj b/mods/facade/models/rgspro_inner.obj new file mode 100644 index 00000000..dba753eb --- /dev/null +++ b/mods/facade/models/rgspro_inner.obj @@ -0,0 +1,94 @@ +mtllib rgspro_inner.mtl +o converted_out +v 0.5 -0.5 0.375 +v 0.5 -0.5 0.5 +v 0.5 -0.3125 0.5 +v 0.5 -0.3125 0.375 +v -0.5 -0.5 0.375 +v -0.5 -0.5 0.5 +v -0.5 -0.3125 0.5 +v -0.5 -0.3125 0.375 +v 0.5 -0.3125 0.25 +v 0.5 -0.3125 0.5 +v 0.5 -0.125 0.5 +v 0.5 -0.125 0.25 +v -0.5 -0.3125 0.25 +v -0.5 -0.3125 0.5 +v -0.5 -0.125 0.5 +v -0.5 -0.125 0.25 +v 0.5 -0.125 0.125 +v 0.5 -0.125 0.5 +v 0.5 0.5 0.5 +v 0.5 0.5 0.125 +v -0.5 -0.125 0.125 +v -0.5 -0.125 0.5 +v -0.5 0.5 0.5 +v -0.5 0.5 0.125 +v -0.375 -0.5 -0.5 +v -0.375 -0.5 0.375 +v -0.375 -0.3125 0.375 +v -0.375 -0.3125 -0.5 +v -0.5 -0.5 -0.5 +v -0.5 -0.5 0.375 +v -0.5 -0.3125 0.375 +v -0.5 -0.3125 -0.5 +v -0.25 -0.3125 -0.5 +v -0.25 -0.3125 0.25 +v -0.25 -0.0625 0.25 +v -0.25 -0.0625 -0.5 +v -0.5 -0.3125 -0.5 +v -0.5 -0.3125 0.25 +v -0.5 -0.0625 0.25 +v -0.5 -0.0625 -0.5 +v -0.125 -0.125 -0.5 +v -0.125 -0.125 0.125 +v -0.125 0.5 0.125 +v -0.125 0.5 -0.5 +v -0.5 -0.125 -0.5 +v -0.5 -0.125 0.125 +v -0.5 0.5 0.125 +v -0.5 0.5 -0.5 +usemtl none +s off +g nodebox1 +f 1 2 3 4 +f 5 6 7 8 +f 1 4 8 5 +f 2 3 7 6 +f 1 2 6 5 +f 4 3 7 8 +g nodebox2 +f 9 10 11 12 +f 13 14 15 16 +f 9 12 16 13 +f 10 11 15 14 +f 9 10 14 13 +f 12 11 15 16 +g nodebox3 +f 17 18 19 20 +f 21 22 23 24 +f 17 20 24 21 +f 18 19 23 22 +f 17 18 22 21 +f 20 19 23 24 +g nodebox4 +f 25 26 27 28 +f 29 30 31 32 +f 25 28 32 29 +f 26 27 31 30 +f 25 26 30 29 +f 28 27 31 32 +g nodebox5 +f 33 34 35 36 +f 37 38 39 40 +f 33 36 40 37 +f 34 35 39 38 +f 33 34 38 37 +f 36 35 39 40 +g nodebox6 +f 41 42 43 44 +f 45 46 47 48 +f 41 44 48 45 +f 42 43 47 46 +f 41 42 46 45 +f 44 43 47 48 diff --git a/mods/facade/screenshot.png b/mods/facade/screenshot.png new file mode 100644 index 00000000..8c3ad970 Binary files /dev/null and b/mods/facade/screenshot.png differ diff --git a/mods/facade/screenshot2.png b/mods/facade/screenshot2.png new file mode 100644 index 00000000..e8634b68 Binary files /dev/null and b/mods/facade/screenshot2.png differ diff --git a/mods/facade/screenshot3.png b/mods/facade/screenshot3.png new file mode 100644 index 00000000..c51d72ac Binary files /dev/null and b/mods/facade/screenshot3.png differ diff --git a/mods/facade/screenshot4.png b/mods/facade/screenshot4.png new file mode 100644 index 00000000..7cd8c868 Binary files /dev/null and b/mods/facade/screenshot4.png differ diff --git a/mods/facade/shaper.lua b/mods/facade/shaper.lua new file mode 100644 index 00000000..b89b17a8 --- /dev/null +++ b/mods/facade/shaper.lua @@ -0,0 +1,370 @@ +-- Facade Shaper +-- This machine serves the same purpose as the circular saw from moreblocks or the milling +-- maching from mymillwork. Namely, it provides a tool for creating shaped blocks that does +-- not rely on using recipes. + + +-- Balancing output per 1 input block with respect to apparent volume of output shape. +-- All current shapes are added, but shapes not present in this table will still be produced +-- one at a time — if that is the desired quantity, adding them is not required. +local output_ratios = { + bannerstone = 1, + bannerstone_corner = 1, + centerstone = 1, + column = 1, + column_corner = 1, + corbel = 1, + corbel_corner = 1, + corbel_corner_inner = 1, + carved_stone_a = 1, + carved_stone_a_corner = 1, + rgspro = 2, + rgspro_inner_corner = 1, + rgspro_outer_corner = 1, + corner_bricks = 2, + columnia_mid = 4, + columnia_bottom = 1, + columnia_top = 1, + columnia_crosslink = 1, + columnia_link = 4, + columnia_linkdown = 4, +} + +-- The material to be used for buttons when no material is actually loaded. +-- It should be a generic material for which all the facade shapes are defined. +local demo_material = "default:stone" + +-- Whether the facade should obey area protection for the inventories (as machines in technic mod) +-- or allow anybody to use them, but disallow the removal of machine itself (like circular saw in moreblocks) +local protect_inventories = false + + + +local function prepare_formspec (material_name) + + local output = string.gsub(material_name, "^.*:", "facade:") + + local shaper_formspec = + + "size[8,11;]".. + "label[0,0;" .. "Choose shape to produce:" .. "]".. + + -- row 1, blocky shapes + "item_image_button[0,0.5;1,1;" .. output .. "_bannerstone" .. ";bannerstone; ]".. + "item_image_button[1,0.5;1,1;" .. output .. "_bannerstone_corner" .. ";bannerstone_corner; ]".. + "item_image_button[2,0.5;1,1;" .. output .. "_centerstone" .. ";centerstone; ]".. + "item_image_button[3,0.5;1,1;" .. output .. "_carved_stone_a" .. ";carved_stone_a; ]".. + "item_image_button[4,0.5;1,1;" .. output .. "_carved_stone_a_corner" .. ";carved_stone_a_corner; ]".. + "item_image_button[5,0.5;1,1;" .. output .. "_column" .. ";column; ]".. + "item_image_button[6,0.5;1,1;" .. output .. "_column_corner" .. ";column_corner; ]".. + + -- row 2, corbel + "item_image_button[0,1.5;1,1;" .. output .. "_corbel" .. ";corbel; ]".. + "item_image_button[1,1.5;1,1;" .. output .. "_corbel_corner_inner" .. ";corbel_corner_inner; ]".. + "item_image_button[2,1.5;1,1;" .. output .. "_corbel_corner" .. ";corbel_corner; ]".. + + -- row 3, cornice + "item_image_button[0,2.5;1,1;" .. output .. "_rgspro" .. ";rgspro; ]".. + "item_image_button[1,2.5;1,1;" .. output .. "_rgspro_inner_corner" .. ";rgspro_inner_corner; ]".. + "item_image_button[2,2.5;1,1;" .. output .. "_rgspro_outer_corner" .. ";rgspro_outer_corner; ]" + + -- row 4, columnia + if not minetest.get_modpath("columnia") then + shaper_formspec = shaper_formspec .. + "item_image_button[0,3.5;1,1;" .. output .. "_columnia_mid" .. ";columnia_mid; ]".. + "item_image_button[1,3.5;1,1;" .. output .. "_columnia_bottom" .. ";columnia_bottom; ]".. + "item_image_button[2,3.5;1,1;" .. output .. "_columnia_crosslink" .. ";columnia_crosslink; ]".. + "item_image_button[3,3.5;1,1;" .. output .. "_columnia_link" .. ";columnia_link; ]".. + "item_image_button[4,3.5;1,1;" .. output .. "_columnia_linkdown" .. ";columnia_linkdown; ]" + + -- this code is a provision in case top column pieces enter service + if minetest.registered_nodes[output .. "_columnia_top"] then + shaper_formspec = shaper_formspec .. + "item_image_button[5,3.5;1,1;" .. output .. "_columnia_top" .. ";columnia_top; ]" + end + + end + + -- row 5 for shapes which are not available for all materials + -- only one such shape exists so far, but more should be easy to add here + + if minetest.registered_nodes[output .. "_corner_bricks"] then + shaper_formspec = shaper_formspec .. + "item_image_button[0,4.5;1,1;" .. output .. "_corner_bricks" .. ";corner_bricks; ]" + end + + -- inventory part + + shaper_formspec = shaper_formspec .. + + "label[0, 5.5;".."In:".."]".. + "list[current_name;src;1,5.5;1,1;]".. + "label[3, 5.5;".."Out:".."]".. + "list[current_name;dst;4,5.5;4,1;]".. + + "list[current_player;main;0,7;8,4;]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]" + + return(shaper_formspec) + +end + + +-- a simple check for compatibile materials +local function check_material_applicability (material) + -- using centerstone node here, since it appears to be both one of the oldest + -- and defined for all materials as well, making it suitable for a quick check + if minetest.registered_nodes[string.gsub(material, "^.*:", "facade:") .. "_centerstone"] then + return true + else + return false + end +end + + +-- update the buttons to show shapes made from the actual material +local function update_formspec_put (pos, listname, index, stack, player) + + if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then + return + end + + if listname ~= "src" then + return + end + + local meta = minetest.get_meta(pos) + local material_name = stack:get_name() + + if check_material_applicability(material_name) then + meta:set_string("formspec", prepare_formspec(material_name)) + else + return + end + +end + + +-- update the buttons to show shapes made from demo material if all material is removed +local function update_formspec_take (pos, listname, index, stack, player) + + if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then + return + end + + if listname ~= "src" then + return + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:is_empty("src") then + meta:set_string("formspec", prepare_formspec(demo_material)) + end + + return + +end + + +-- disallow putting in materials which are not supported +local function check_inventory_put (pos, listname, index, stack, player) + + if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + if listname ~= "src" then + return 0 + end + + local material_name = stack:get_name() + + if check_material_applicability(material_name) then + return(stack:get_count()) + else + return 0 + end +end + + +local function check_inventory_take (pos, listname, index, stack, player) + + if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + if listname ~= "src" and listname ~= "dst" then + return 0 + end + + return(stack:get_count()) + +end + +local function check_inventory_move (pos, from_list, from_index, to_list, to_index, count, player) + + if protect_inventories and minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + return(stack:get_count()) + +end + +-- process the form fields and convert source material to desired shapes +local function form_handler(pos, formname, fields, sender) + + if protect_inventories and minetest.is_protected(pos, sender:get_player_name()) then + return + end + + if fields.quit then + return + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:is_empty("src") then + return + end + + local inputstack = inv:get_stack("src", 1) + local inputname = inputstack:get_name() + + for shape,_ in pairs(fields) do + + local result = string.gsub(inputname, "^.*:", "facade:") .. "_" .. shape + + -- one can never be overly paranoid, unlike the quick check before, this one is precise + if not minetest.registered_nodes[result] then + return + end + + -- output quantities are adjusted to preserve roughly same mass of resulting products + if output_ratios[shape] then + result = result .. " " .. output_ratios[shape] + end + + if not inv:room_for_item("dst", result) then + return + end + + inputstack:take_item(1) + inv:set_stack("src", 1, inputstack) + inv:add_item("dst", result) + + end + return +end + +local function check_removability (pos, player) + + local meta = minetest.get_meta(pos) + local owner = meta:set_string("owner") + local pname = player:get_player_name() + local inv = meta:get_inventory() + + -- owner may always remove the device + if owner and owner ~= "" and pname and pname ~= "" and owner == pname then + if inv:is_empty("src") and inv:is_empty("dst") then + return true + else + return false + end + end + + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + + if inv:is_empty("src") and inv:is_empty("dst") then + return true + end + + return false + +end + + +minetest.register_node("facade:shaper", { + description = "Shaper Machine", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- base + {-1/2, -1/2, -1/2, 1/2, -14/32, 1/2}, + -- back + {-8/32, -1/2, 12/32, 8/32, 1/2, 16/32}, + -- table + {-8/32, -4/32, -16/32, 8/32, 4/32, 16/32}, + -- rear table sliding support + {-16/32, -4/32, 12/32, 16/32, 4/32, 16/32}, + -- front table sliding support + {-8/32, -14/32, -12/32, 8/32, -4/32, -16/32}, + -- top tool beam + {-4/32, 16/32, -8/32, 4/32, 12/32, 12/32}, + -- cutter holder + {-2/32, 7/32, -2/32, 2/32, 14/32, 2/32}, + -- cutter + {-1/128, 6/32, -1/32, 1/128, 7/32, 1/32}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}, + }, + }, + tiles = { "facade_shaper_top.png", + "facade_shaper_bottom.png", + "facade_shaper_right.png", + "facade_shaper_left.png", + "facade_shaper_back.png", + "facade_shaper_front.png"}, + groups = { oddly_breakable_by_hand=2, cracky=3, dig_immediate=1 }, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", prepare_formspec(demo_material)) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 4) + end, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local owner = placer and placer:get_player_name() or "" + meta:set_string("owner", owner) + if owner then + meta:set_string("infotext", ("Facade Shaper (owned by %s)"):format(owner)) + else + meta:set_string("infotext", "Facade Shaper") + end + end, + can_dig = check_removability, + allow_metadata_inventory_put = check_inventory_put, + allow_metadata_inventory_take = check_inventory_take, + allow_metadata_inventory_move = check_inventory_move, + on_metadata_inventory_put = update_formspec_put, + on_metadata_inventory_take = update_formspec_take, + on_receive_fields = form_handler, +}) + + +minetest.register_craft({ + output = 'facade:shaper', + recipe = { + {'', 'default:diamond', '' }, + {'default:steel_ingot', 'default:steelblock', 'default:steel_ingot' }, + {'', 'default:steelblock' , '' }, + + }, +}) diff --git a/mods/facade/shapes.lua b/mods/facade/shapes.lua new file mode 100644 index 00000000..94dd8876 --- /dev/null +++ b/mods/facade/shapes.lua @@ -0,0 +1,799 @@ +-- Node (shape) definition and registration + +local wehavechisels = minetest.get_modpath("mychisel") + +-------------- +--Bannerstones +-------------- + +--Node will be called facade:_bannerstone +function facade.register_bannerstone(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_bannerstone" , { + description = desc .. " Bannerstone", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-0.5, 0.25, -0.5625, 0.5, 0.375, -0.5}, + {-0.5, -0.375, -0.5625, 0.5, -0.25, -0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, + }) +end + +--Node will be called facade:_bannerstone_corner +function facade.register_bannerstone_corner(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_bannerstone_corner", { + description = desc .. " Bannerstone Corner", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png", + "" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png", + "" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png", + "" .. modname.. "_" .. subname .. ".png^facade_bannerstone.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + {-0.5625, 0.25, -0.5625, 0.5625, 0.375, 0.5625}, + {-0.5625, -0.375, -0.5625, 0.5625, -0.25, 0.5625}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, + }) +end + +-------------- +--Centerstones +-------------- + +--Node will be called facade:_centerstone +function facade.register_centerstone(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_centerstone", { + description = desc .. " Centerstone", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png^facade_centerstone.png"}, + paramtype = "light", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.4375, -0.4375, 0.4375, 0.4375, 0.4375}, + {-0.5, -0.25, 0.0625, 0.5, 0.25, 0.25}, + {-0.5, -0.25, -0.25, 0.5, 0.25, -0.0625}, + {-0.25, -0.25, -0.5, -0.0625, 0.25, 0.5}, + {0.0625, -0.25, -0.5, 0.25, 0.25, 0.5}, + {-0.5, 0.0625, -0.25, 0.5, 0.25, 0.25}, + {-0.5, -0.25, -0.25, 0.5, -0.0625, 0.25}, + {-0.25, -0.25, -0.5, 0.25, -0.0625, 0.5}, + {-0.25, 0.0625, -0.5, 0.25, 0.25, 0.5}, + {-0.25, -0.5, -0.25, 0.25, 0.5, -0.0625}, + {-0.25, -0.5, 0.0625, 0.25, 0.5, 0.25}, + {0.0625, -0.5, -0.1875, 0.25, 0.5, 0.1875}, + {-0.25, -0.5, -0.1875, -0.0625, 0.5, 0.1875}, + {-0.5, 0.3125, 0.3125, 0.5, 0.5, 0.5}, + {-0.5, 0.3125, -0.5, 0.5, 0.5, -0.3125}, + {0.3125, 0.3125, -0.5, 0.5, 0.5, 0.5}, + {-0.5, 0.3125, -0.5, -0.3125, 0.5, 0.5}, + {-0.5, -0.5, -0.5, -0.3125, -0.3125, 0.5}, + {0.3125, -0.5, -0.5, 0.5, -0.3125, 0.5}, + {-0.5, -0.5, -0.5, 0.5, -0.3125, -0.3125}, + {-0.5, -0.5, 0.3125, 0.5, -0.3125, 0.5}, + {0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125}, + {0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5}, + {-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5}, + {-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, + }) +end + +--------- +--Columns +--------- + +--Node will be called facade:_column +function facade.register_column(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_column" , { + description = desc .. " Column", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_column.png", + "" .. modname.. "_" .. subname .. ".png^facade_column.png" + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.4375, 0.5, 0.5, 0.4375}, + {-0.5, -0.5, -0.5, -0.3125, 0.5, 0.5}, + {0.3125, -0.5, -0.5, 0.5, 0.5, 0.5}, + {0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5}, + {-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, + }) + +end + + +--Node will be called facade:_column_corner +function facade.register_column_corner(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_column_corner", { + description = desc .. " Column Corner", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_column.png", + "" .. modname.. "_" .. subname .. ".png^facade_column.png", + "" .. modname.. "_" .. subname .. ".png^facade_column.png", + "" .. modname.. "_" .. subname .. ".png^facade_column.png" + }, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, 0.4375, 0.5, 0.4375}, + {-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5}, + {0.3125, -0.5, -0.5, 0.5, 0.5, -0.3125}, + {0.0625, -0.5, -0.5, 0.1875, 0.5, 0.5}, + {-0.1875, -0.5, -0.5, -0.0625, 0.5, 0.5}, + {0.3125, -0.5, 0.3125, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.5, -0.3125, 0.5, -0.3125}, + {-0.5, -0.5, 0.0625, 0.5, 0.5, 0.1875}, + {-0.5, -0.5, -0.1875, 0.5, 0.5, -0.0625}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, + }) +end + +--------- +--Corbels +--------- + +--Node will be called facade:_corbel +function facade.register_corbel(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_corbel", { + description = desc .. " Corbel", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, + {-0.1875, -0.3125, -0.3125, 0.1875, 0.5, 0}, + }, + }, +-- selection_box = { +-- type = "fixed", +-- fixed = { +-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, +-- } +-- }, + }) +end + +--Node will be called facade:_corbel_corner +function facade.register_corbel_corner(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_corbel_corner", { + description = desc .. " Corbel Corner", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, + {-0.5, -0.5, 0, 0, 0.5, 0.5}, + {0, -0.3125, -0.3125, 0.3125, 0.5, 0}, + }, + }, +-- selection_box = { +-- type = "fixed", +-- fixed = { +-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, +-- } +-- }, + }) +end + +--Node will be called facade:_corbel_corner_inner +function facade.register_corbel_corner_inner(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_corbel_corner_inner", { + description = desc .. " Corbel Inner Corner", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, + {-0.5, -0.5, 0, 0.5, 0.5, 0.5}, + {0, -0.3125, -0.3125, 0.3125, 0.5, 0}, + {-0.5, -0.5, -0.5, 0, 0.5, 0.5}, + }, + }, +-- selection_box = { +-- type = "fixed", +-- fixed = { +-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, +-- } +-- }, + }) +end + + +-------------------------- +--- Carved Stones +-------------------------- + +--Node will be called facade:_carved_stone_a +function facade.register_carved_stone_a(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_carved_stone_a", { + description = desc .. " Carved Stone A", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.4375, 0.5, 0.5, 0.5}, + {-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + {-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375}, + {-0.5, -0.375, -0.5, -0.3125, -0.25, 0.5}, + {-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5}, + {0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5}, + {-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5}, + {-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5}, + {0.0625, -0.125, -0.5, 0.3125, 0, 0.5}, + {-0.0625, 0, -0.5, 0.1875, 0.125, 0.5}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + }) +end + +--Node will be called facade:_carved_stone_a_corner +function facade.register_carved_stone_a_corner(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_carved_stone_a_corner", { + description = desc .. " Carved Stone A Corner", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_carved_stone_a.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.5, -0.4375, 0.5, 0.5, 0.5}, + {-0.5, 0.4375, -0.5, 0.5, 0.5, -0.4375}, + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, + {-0.4375, -0.375, -0.5, -0.3125, 0.375, -0.4375}, + {-0.5, -0.375, -0.5, -0.3125, -0.25, 0.1875}, + {-0.4375, 0.25, -0.5, 0.4375, 0.375, 0.5}, + {0.3125, -0.125, -0.5, 0.4375, 0.25, 0.5}, + {-0.1875, -0.375, -0.5, 0.5, -0.25, 0.5}, + {-0.1875, -0.25, -0.5, -0.0625, 0.125, 0.5}, + {0.0625, -0.125, -0.5, 0.3125, 0, 0.5}, + {-0.0625, 0, -0.5, 0.1875, 0.125, 0.5}, + {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5}, + {-0.5, -0.125, -0.4375, 0.5, 0.375, -0.3125}, + {-0.5, 0.25, -0.3125, 0.5, 0.375, 0.4375}, + {-0.5, -0.375, 0.3125, 0.4375, 0.375, 0.4375}, + {-0.5, -0.375, 0.3125, 0.4375, -0.25, 0.5}, + {-0.5, -0.125, -0.3125, 0.4375, 0, -0.0625}, + {-0.5, 0, -0.1875, 0.4375, 0.125, 0.1875}, + {-0.5, -0.25, 0.0625, 0.4375, 0.125, 0.1875}, + }, + }, + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + }, + }, + }) +end + + +-------------------------- +--- RGSpro Facia +-------------------------- + +--Node will be called facade:_rgspro +function facade.register_rgspro(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_rgspro", { + description = desc .. " RGSpro", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5}, + {-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.125, 0.5, 0.5, 0.5}, + }, + }, +-- selection_box = { +-- type = "fixed", +-- fixed = { +-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, +-- }, +-- }, + }) +end + +--Node will be called facade:_rgspro_inner_corner +function facade.register_rgspro_inner_corner(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_rgspro_inner_corner", { + description = desc .. " RGSpro Inner Corner", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5}, + {-0.5, -0.3125, 0.25, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.125, 0.5, 0.5, 0.5}, + {0.375, -0.5, -0.5, 0.5, -0.3125, 0.375}, + {0.25, -0.3125, -0.5, 0.5, -0.0625, 0.25}, + {0.125, -0.125, -0.5, 0.5, 0.5, 0.125}, + }, + }, +-- selection_box = { +-- type = "fixed", +-- fixed = { +-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, +-- }, +-- }, + }) +end + + +--Node will be called facade:_rgspro_outer_corner +function facade.register_rgspro_outer_corner(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_rgspro_outer_corner", { + description = desc .. " RGSpro Outer Corner", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png", + "" .. modname.. "_" .. subname .. ".png^facade_rgspro.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, -0.3125, 0.5}, + {-0.5, -0.3125, 0.25, 0.5, -0.0625, 0.5}, + {-0.5, -0.125, 0.125, 0.5, 0.5, 0.5}, + {-0.625, -0.5, 0.375, -0.5, -0.3125, 1.5}, + {-0.75, -0.3125, 0.25, -0.5, -0.125, 1.5}, + {-0.875, -0.125, 0.125, -0.5, 0.5, 1.5}, + }, + }, +-- selection_box = { +-- type = "fixed", +-- fixed = { +-- {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, +-- }, +-- }, + }) +end + + +-------------------------- +--- Corner Bricks +-------------------------- + +--Node will be called facade:_corner_bricks +function facade.register_corner_bricks(modname, subname, recipeitem, desc) + if not string.match(recipeitem,"clay") + then -- do not do for clay things that is ugly + minetest.register_node("facade:" .. subname .. "_corner_bricks", { + description = desc .. " Corner Bricks", + drawtype = "nodebox", + tiles = { + "" .. modname.. "_" .. subname .. "_brick.png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5625, -0.5, 0.4375, -0.5, 0, 1}, + {-0.5, -0.5, 0.4375, 0, 0, 0.5}, + {-0.5625, 0, 0.5, -0.5, 0.5, 1.5}, + {-0.5625, 0, 0.4375, 0.5, 0.5, 0.5}, + }, + }, + }) + end +end + + +-------------------------- +--- Columnia shapes +-------------------------- + +-- From mod Columnia (2014 by Glunggi), LGPL 2.1 +-- The shapes are using stock minetest.rotate_node() for positioning. + +-- These shapes should not be registered if the regular columnia mod is in use +if not minetest.get_modpath("columnia") then + + local columnia_rotate = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y-1 == p1.y then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end + + -- Node will be called facade:_columnia_mid + function facade.register_columnia_mid(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_columnia_mid", { + description = desc .. " Column Middle", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, + node_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}, + }, + }, + }) + end + + -- Normally, a single shape should be fine both for bottom and top parts of + -- a column. If materials with textures that don't match with themselves + -- when rotated upside-down are added later on, then enable the next function. + -- Node will be called facade:_columnia_bottom + function facade.register_columnia_bottom(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_columnia_bottom", { + description = desc .. " Column Bottom/Top", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, + node_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.375, -0.5, -0.375, 0.375, 0, 0.375}, + }, + }, + }) + end + + --[[ + -- This function is commented out, because in the current state, when facade mod + -- uses materials without directional textures, having one shape for top + -- and bottom of columns is enough. However, for materials which have textures + -- that, when rotated, clearly stop matching the other blocks, this function + -- is preserved. + -- Node will be called facade:_columnia_top + function facade.register_columnia_top(modname, subname, recipeitem, desc) + -- whitelist items with textures of clear directionality (e.g. bricks) + if string.match(recipeitem, "brick") + then + minetest.register_node("facade:" .. subname .. "_columnia_top", { + description = desc .. " Column Top/Bottom", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = minetest.rotate_node, + node_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}, + {-0.5, 0.25, -0.5, 0.5, 0.5, 0.5}, + {-0.375, 0, -0.375, 0.375, 0.5, 0.375}, + }, + }, + }) + end + end + ]]-- + + -- Node will be called facade:_columnia_crosslink + function facade.register_columnia_crosslink(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_columnia_crosslink", { + description = desc .. " Column Crosslink", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = columnia_rotate, + node_box = { + type = "fixed", + fixed = { + {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}, + {-0.5, 0, -0.25, 0.5, 0.5, 0.25}, + {-0.25, 0, -0.5, 0.25, 0.5, 0.5}, + {-0.4375, 0.0625, -0.4375, 0.4375, 0.4375, 0.4375}, + }, + }, + }) + end + + -- Node will be called facade:_columnia_link + function facade.register_columnia_link(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_columnia_link", { + description = desc .. " Column Link", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = columnia_rotate, + node_box = { + type = "fixed", + fixed = { + {-0.25, 0, -0.5, 0.25, 0.5, 0.5}, + }, + }, + }) + end + + -- Node will be called facade:_columnia_linkdown + function facade.register_columnia_linkdown(modname, subname, recipeitem, desc) + minetest.register_node("facade:" .. subname .. "_columnia_linkdown", { + description = desc .. " Column Linkdown", + drawtype = "nodebox", + tiles = {"" .. modname.. "_" .. subname .. ".png"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + on_place = columnia_rotate, + node_box = { + type = "fixed", + fixed = { + {-0.25, 0, -0.5, 0.25, 0.5, 0.5}, + {-0.125, -0.5, -0.125, 0.125, 0, 0.125}, + {-0.1875, -0.5, -0.1875, 0.1875, -0.375, 0.1875}, + {-0.1875, -0.125, -0.1875, 0.1875, 0, 0.1875}, + }, + }, + }) + end + +end + +-------------------------- +--Register Nodes +-------------------------- +function facade.register_facade_nodes(modname, subname, recipeitem, desc) + + facade.register_bannerstone(modname, subname, recipeitem, desc) + facade.register_bannerstone_corner(modname, subname, recipeitem, desc) + facade.register_centerstone(modname, subname, recipeitem, desc) + facade.register_column(modname, subname, recipeitem, desc) + facade.register_column_corner(modname, subname, recipeitem, desc) + facade.register_corbel(modname, subname, recipeitem, desc) + facade.register_corbel_corner(modname, subname, recipeitem, desc) + facade.register_corbel_corner_inner(modname, subname, recipeitem, desc) + facade.register_carved_stone_a(modname, subname, recipeitem, desc) + facade.register_carved_stone_a_corner(modname, subname, recipeitem, desc) + facade.register_rgspro(modname, subname, recipeitem, desc) + facade.register_rgspro_inner_corner(modname, subname, recipeitem, desc) + facade.register_rgspro_outer_corner(modname, subname, recipeitem, desc) + facade.register_corner_bricks(modname, subname, recipeitem, desc) + + if not minetest.get_modpath("columnia") then + facade.register_columnia_mid(modname, subname, recipeitem, desc) + facade.register_columnia_bottom(modname, subname, recipeitem, desc) + --facade.register_columnia_top(modname, subname, recipeitem, desc) + facade.register_columnia_crosslink(modname, subname, recipeitem, desc) + facade.register_columnia_link(modname, subname, recipeitem, desc) + facade.register_columnia_linkdown(modname, subname, recipeitem, desc) + end + + if wehavechisels then + -- register all nodes with mychisel mod to use them without creative priv + chisel.register_node("facade",subname, recipeitem, "bannerstone") + chisel.register_node("facade",subname, recipeitem, "bannerstone_corner") + chisel.register_node("facade",subname, recipeitem, "centerstone") + chisel.register_node("facade",subname, recipeitem, "column") + chisel.register_node("facade",subname, recipeitem, "column_corner") + chisel.register_node("facade",subname, recipeitem, "corbel") + chisel.register_node("facade",subname, recipeitem, "corbel_corner") + chisel.register_node("facade",subname, recipeitem, "corbel_corner_inner") + chisel.register_node("facade",subname, recipeitem, "carved_stone_a") + chisel.register_node("facade",subname, recipeitem, "carved_stone_a_corner") + chisel.register_node("facade",subname, recipeitem, "rgspro") + chisel.register_node("facade",subname, recipeitem, "rgspro_inner_corner") + chisel.register_node("facade",subname, recipeitem, "rgspro_outer_corner") + chisel.register_node("facade",subname, recipeitem, "corner_bricks") + + if not minetest.get_modpath("columnia") then + chisel.register_node("facade",subname, recipeitem, "columnia_mid") + chisel.register_node("facade",subname, recipeitem, "columnia_bottom") + --chisel.register_node("facade",subname, recipeitem, "columnia_top") + chisel.register_node("facade",subname, recipeitem, "columnia_crosslink") + chisel.register_node("facade",subname, recipeitem, "columnia_link") + chisel.register_node("facade",subname, recipeitem, "columnia_linkdown") + end + end +end + +-- register the total number of different designs in this mod with mychisel +if wehavechisels then chisel.add_mod("facade",14) end + diff --git a/mods/facade/textures/facade_bannerstone.png b/mods/facade/textures/facade_bannerstone.png new file mode 100644 index 00000000..53a27bf0 Binary files /dev/null and b/mods/facade/textures/facade_bannerstone.png differ diff --git a/mods/facade/textures/facade_carved_stone_a.png b/mods/facade/textures/facade_carved_stone_a.png new file mode 100644 index 00000000..40d6d927 Binary files /dev/null and b/mods/facade/textures/facade_carved_stone_a.png differ diff --git a/mods/facade/textures/facade_centerstone.png b/mods/facade/textures/facade_centerstone.png new file mode 100644 index 00000000..081aae38 Binary files /dev/null and b/mods/facade/textures/facade_centerstone.png differ diff --git a/mods/facade/textures/facade_column.png b/mods/facade/textures/facade_column.png new file mode 100644 index 00000000..c4801fd6 Binary files /dev/null and b/mods/facade/textures/facade_column.png differ diff --git a/mods/facade/textures/facade_rgspro.png b/mods/facade/textures/facade_rgspro.png new file mode 100644 index 00000000..de36926d Binary files /dev/null and b/mods/facade/textures/facade_rgspro.png differ diff --git a/mods/facade/textures/facade_shaper_back.png b/mods/facade/textures/facade_shaper_back.png new file mode 100644 index 00000000..d7516b13 Binary files /dev/null and b/mods/facade/textures/facade_shaper_back.png differ diff --git a/mods/facade/textures/facade_shaper_bottom.png b/mods/facade/textures/facade_shaper_bottom.png new file mode 100644 index 00000000..efa47137 Binary files /dev/null and b/mods/facade/textures/facade_shaper_bottom.png differ diff --git a/mods/facade/textures/facade_shaper_front.png b/mods/facade/textures/facade_shaper_front.png new file mode 100644 index 00000000..38af8b64 Binary files /dev/null and b/mods/facade/textures/facade_shaper_front.png differ diff --git a/mods/facade/textures/facade_shaper_left.png b/mods/facade/textures/facade_shaper_left.png new file mode 100644 index 00000000..9d399bca Binary files /dev/null and b/mods/facade/textures/facade_shaper_left.png differ diff --git a/mods/facade/textures/facade_shaper_right.png b/mods/facade/textures/facade_shaper_right.png new file mode 100644 index 00000000..e8a5d8b6 Binary files /dev/null and b/mods/facade/textures/facade_shaper_right.png differ diff --git a/mods/facade/textures/facade_shaper_top.png b/mods/facade/textures/facade_shaper_top.png new file mode 100644 index 00000000..b528d703 Binary files /dev/null and b/mods/facade/textures/facade_shaper_top.png differ diff --git a/mods/facade/textures/license.txt b/mods/facade/textures/license.txt new file mode 100644 index 00000000..4ac1f990 --- /dev/null +++ b/mods/facade/textures/license.txt @@ -0,0 +1,10 @@ +custom textures for facade +Copyright (C) 2016 - 2018 TumeniNodes +Attribution - ShareAlike 4.0 International (CC BY-SA 4.0) +https://creativecommons.org/licenses/by-sa/4.0/ +========================================================= +facade_bannerstone.png +facade_carved_stone_a.png +facade_cornerstone.png +facade_column.png +facade_rgspro.png diff --git a/mods/gloopblocks/LICENSE b/mods/gloopblocks/LICENSE new file mode 100644 index 00000000..c5885ae9 --- /dev/null +++ b/mods/gloopblocks/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/gloopblocks/README b/mods/gloopblocks/README new file mode 100644 index 00000000..72ca0955 --- /dev/null +++ b/mods/gloopblocks/README @@ -0,0 +1,72 @@ +This mod adds a number of decorative and functional blocks to Minetest, +including cement, rainbow blocks, "evil" blocks and sticks, and the usual +collection of tools of various strengths and speeds made from either cement or +"evil" components. It also supplies a few useful functions - see below. + +Crafting + +(Unless explicitly mentioned, ingredients can go anywhere in the crafting grid +in these recipes). + +* Rainbow Blocks can be crafted by putting one each of red, orange, yellow, + green, blue, and violet dyes plus one stone and one Mese Crystal into the + crafting grid. Yields 1, works with Unified Dyes as well as the game's + default dyes. + +* Three of those can be crafted to form one pop tart cat rainbow, or nine can + be crafted together to form one pop tart cat itself. + +* Wet cement is crafted from a bucket of water and a block of gravel. This + can be cooked into dried cement, which can be crafted into tools or back + into gravel. + +* An "evil" stick can be crafted from one lump of coal, one regular stick, and + one lump of Kalite from the Gloop Ores mod. + +* Four of those can be crafted into an "evil" block, which can also be crafted + back to "evil" sticks. These blocks emit a small amount of light. + +* Cement tools are crafted in the usual manner, using cement blocks for the + tool heads instead of the usual steel, cobble, etc. + +* "Evil" tools can be crafted using the same standard recipes as for other + tools, substitution "evil" sticks for the handles and "evil" blocks for the + tool heads. + +* Regular sticks can be crafted back into wood blocks by placing four of them + in a square. + +* Cement and "evil" blocks can also be crafted into various stairs and slabs, + following the same recipes as with other stairs and slabs. Evil stairs and + slabs emit a small amount of light. + +* Pavement (as for roads or parking lots) can be crafted by placing wet cement + ("W") and basalt ("B") into the crafting grid in a 3x3 checkerboard (yields + 5): + W B W + B W B + W B W + + (you can also swap wet cement and basalt, using five and four portions, + respectively) + +Other useful stuff: +------------------- + +* Cobblestone turns to mossy cobblestone in the presence of water (either + flowing or not). + +* When water and lava come into contact with one another, they will form one + of three materials: Flowing lava coming into contact with standing water + forms basalt, both flowing into one another form pumice, while standing lava + forms obsidian when in contact with flowing or standing water. Note that if + you're using this along with the standard minetest_game repository dated + March 9 or later, this function no longer works, because the game provides a + similar, less capable function. + +Notes: +------ + +The cobblestone and mossy cobblestone road bed textures were derived from: +http://opengameart.org/content/rpg-tiles-cobble-stone-paths-town-objects +...and the default grass texture that comes with minetest_game. diff --git a/mods/gloopblocks/crafts.lua b/mods/gloopblocks/crafts.lua new file mode 100644 index 00000000..634ea9b8 --- /dev/null +++ b/mods/gloopblocks/crafts.lua @@ -0,0 +1,321 @@ +-- Various crafts + +minetest.register_craft( { + type = "shapeless", + output = "gloopblocks:rainbow_block", + recipe = { + "group:dye,color_red", + "group:dye,color_orange", + "group:dye,color_yellow", + "group:dye,color_green", + "group:dye,color_blue", + "group:dye,color_violet", + "default:stone", + "default:mese_crystal", + }, +}) + + +minetest.register_craft({ + type = "shapeless", + output = "default:nyancat_rainbow", + recipe = { + "gloopblocks:rainbow_block", + "default:diamondblock", + "default:steelblock", + "default:copperblock", + "default:bronzeblock", + "default:goldblock", + "default:mese", + "moreores:silver_block", + "moreores:mithril_block" + } +}) + +minetest.register_craft({ + output = "default:nyancat", + recipe = { + {"gloopblocks:rainbow_block", "gloopblocks:rainbow_block", "gloopblocks:rainbow_block"}, + {"gloopblocks:rainbow_block", "gloopblocks:rainbow_block", "gloopblocks:rainbow_block"}, + {"gloopblocks:rainbow_block", "gloopblocks:rainbow_block", "gloopblocks:rainbow_block"}, + } +}) + +if minetest.get_modpath("glooptest") then + + minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:evil_stick", + recipe = { + "glooptest:kalite_lump", + "default:gold_ingot", + "default:coal_lump", + "group:stick" + } + }) + + minetest.register_craft({ + output = "gloopblocks:evil_block", + recipe = { + {"gloopblocks:evil_stick", "gloopblocks:evil_stick"}, + {"gloopblocks:evil_stick", "gloopblocks:evil_stick"}, + } + }) + + minetest.register_craft({ + output = "gloopblocks:evil_stick 4", + recipe = { + {"gloopblocks:evil_block"} + } + }) + + minetest.register_craft({ + output = "gloopblocks:pick_evil", + recipe = { + {"gloopblocks:evil_block", "gloopblocks:evil_block", "gloopblocks:evil_block"}, + {"", "gloopblocks:evil_stick", ""}, + {"", "gloopblocks:evil_stick", ""}, + } + }) + + minetest.register_craft({ + output = "gloopblocks:axe_evil", + recipe = { + {"gloopblocks:evil_block", "gloopblocks:evil_block"}, + {"gloopblocks:evil_block", "gloopblocks:evil_stick"}, + {"", "gloopblocks:evil_stick"}, + } + }) + + minetest.register_craft({ + output = "gloopblocks:axe_evil", + recipe = { + {"gloopblocks:evil_block", "gloopblocks:evil_block"}, + {"gloopblocks:evil_stick", "gloopblocks:evil_block"}, + {"gloopblocks:evil_stick", ""}, + } + }) + + minetest.register_craft({ + output = "gloopblocks:shovel_evil", + recipe = { + {"gloopblocks:evil_block"}, + {"gloopblocks:evil_stick"}, + {"gloopblocks:evil_stick"}, + } + }) + + minetest.register_craft({ + output = "gloopblocks:sword_evil", + recipe = { + {"gloopblocks:evil_block"}, + {"gloopblocks:evil_block"}, + {"gloopblocks:evil_stick"}, + } + }) +end + +minetest.register_craft({ + output = "gloopblocks:scaffolding 12", + recipe = { + {"group:stick", "group:wood", "group:stick"}, + {"", "group:stick", ""}, + {"group:stick", "group:wood", "group:stick"}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:pick_cement", + recipe = { + {"gloopblocks:cement", "gloopblocks:cement", "gloopblocks:cement"}, + {"", "group:stick", ""}, + {"", "group:stick", ""}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:axe_cement", + recipe = { + {"gloopblocks:cement", "gloopblocks:cement"}, + {"gloopblocks:cement", "group:stick"}, + {"", "group:stick"}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:axe_cement", + recipe = { + {"gloopblocks:cement", "gloopblocks:cement"}, + {"group:stick", "gloopblocks:cement"}, + {"group:stick", ""}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:shovel_cement", + recipe = { + {"gloopblocks:cement"}, + {"group:stick"}, + {"group:stick"}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:sword_cement", + recipe = { + {"gloopblocks:cement"}, + {"gloopblocks:cement"}, + {"group:stick"}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:pavement 5", + recipe = { + {"gloopblocks:basalt", "gloopblocks:wet_cement","gloopblocks:basalt"}, + {"gloopblocks:wet_cement","gloopblocks:basalt", "gloopblocks:wet_cement"}, + {"gloopblocks:basalt", "gloopblocks:wet_cement","gloopblocks:basalt"}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:pavement 5", + recipe = { + {"gloopblocks:wet_cement","gloopblocks:basalt", "gloopblocks:wet_cement"}, + {"gloopblocks:basalt", "gloopblocks:wet_cement","gloopblocks:basalt"}, + {"gloopblocks:wet_cement","gloopblocks:basalt", "gloopblocks:wet_cement"}, + } +}) + +minetest.register_craft({ + output = "gloopblocks:oerkki_block 2", + recipe = { + {"default:iron_lump", "default:coal_lump", "default:iron_lump"}, + {"default:coal_lump", "default:bookshelf", "default:coal_lump"}, + {"default:iron_lump", "default:coal_lump", "default:iron_lump"}, + }, + replacements = { { "default:bookshelf", "default:book 3" } } +}) + +minetest.register_craft({ + output = "gloopblocks:oerkki_block 2", + recipe = { + {"default:coal_lump", "default:iron_lump", "default:coal_lump"}, + {"default:iron_lump", "default:bookshelf", "default:iron_lump"}, + {"default:coal_lump", "default:iron_lump", "default:coal_lump"}, + }, + replacements = { { "default:bookshelf", "default:book 3" } } +}) + +minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:stone_brick_mossy 2", + recipe = { + "default:stonebrick", + "default:stonebrick", + "default:junglegrass", + "default:junglegrass" + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:stone_brick_mossy 2", + recipe = { + "default:stonebrick", + "default:stonebrick", + "default:grass_1", + "default:grass_1", + "default:grass_1", + "default:grass_1" + } +}) + +minetest.register_craft({ + type = "cooking", + output = "gloopblocks:stonebrick", + recipe = "default:stone_brick_mossy", + cooktime = 6 +}) + +minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:cobble_road 5", + recipe = { + "default:cobble", + "default:cobble", + "default:cobble", + "default:cobble", + "gloopblocks:pavement" + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:cobble_road_mossy 2", + recipe = { + "gloopblocks:cobble_road", + "gloopblocks:cobble_road", + "default:junglegrass", + "default:junglegrass" + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:cobble_road_mossy 2", + recipe = { + "gloopblocks:cobble_road", + "gloopblocks:cobble_road", + "default:grass_1", + "default:grass_1", + "default:grass_1", + "default:grass_1" + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:stone_mossy 2", + recipe = { + "default:stone", + "default:stone", + "default:junglegrass", + "default:junglegrass" + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "gloopblocks:stone_mossy 2", + recipe = { + "default:stone", + "default:stone", + "default:grass_1", + "default:grass_1", + "default:grass_1", + "default:grass_1" + } +}) + +minetest.register_craft({ + output = "gloopblocks:fence_steel 1", + recipe = { + {"xpanes:bar", "xpanes:bar", "xpanes:bar"}, + {"xpanes:bar", "xpanes:bar", "xpanes:bar"}, + }, +}) + +if minetest.get_modpath("technic") then + technic.register_grinder_recipe({input={"gloopblocks:pumice"},output="default:sand"}) + technic.register_grinder_recipe({input={"gloopblocks:basalt"},output="default:cobble"}) + minetest.register_craft({ + type = "shapeless", + output = "technic:concrete 3", + recipe = { + "gloopblocks:wet_cement", + "group:sand", + "default:gravel", + } + }) +end diff --git a/mods/gloopblocks/depends.txt b/mods/gloopblocks/depends.txt new file mode 100644 index 00000000..57849e5d --- /dev/null +++ b/mods/gloopblocks/depends.txt @@ -0,0 +1,15 @@ +default +basic_materials +moreblocks? +stairs? +glooptest? +gloopores? +intllib? +wool? +xdecor? +caverealms? +technic? +nyancat? +usesdirt? +worldedit? +signs_lib? diff --git a/mods/gloopblocks/description.txt b/mods/gloopblocks/description.txt new file mode 100644 index 00000000..c514a8e1 --- /dev/null +++ b/mods/gloopblocks/description.txt @@ -0,0 +1,2 @@ +Adds decorative and functional blocks, including cement, rainbow blocks, "evil" blocks and sticks, +and the usual collection of tools of various strengths and speeds made from either cement or "evil" components. diff --git a/mods/gloopblocks/init.lua b/mods/gloopblocks/init.lua new file mode 100644 index 00000000..570235d0 --- /dev/null +++ b/mods/gloopblocks/init.lua @@ -0,0 +1,953 @@ +--[[ +GloopBlocks +Originally written by GloopMaster + +Maintained by VanessaE. + +--]] + +gloopblocks = {} + +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") + +-- Nodes + +minetest.register_node("gloopblocks:rainbow_block_diagonal", { + description = S("Diagonal Rainbow Block"), + tiles = {"gloopblocks_rainbow_block.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_defaults(), +}) +minetest.register_alias("gloopblocks:rainbow_block", "gloopblocks:rainbow_block_diagonal") + +minetest.register_node("gloopblocks:rainbow_block_horizontal", { + description = S("Horizontal Rainbow Block"), + tiles = { + "gloopblocks_rainbow_horizontal.png^[transformR90", + "gloopblocks_rainbow_horizontal.png^[transformR90", + "gloopblocks_rainbow_horizontal.png" + }, + paramtype = "light", + light_source = default.LIGHT_MAX, + paramtype2 = "facedir", + groups = {cracky = 2}, + is_ground_content = false, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("gloopblocks:evil_block", { + description = S("Evil Block"), + tiles = {"gloopblocks_evil_block.png"}, + light_source = 5, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("gloopblocks:basalt", { + description = S("Basalt"), + tiles = {"gloopblocks_basalt.png"}, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("gloopblocks:pumice", { + description = S("Pumice"), + tiles = {"gloopblocks_pumice.png"}, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("gloopblocks:pavement", { + description = S("Pavement"), + tiles = {"gloopblocks_pavement.png"}, + groups = {cracky=3, oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("gloopblocks:oerkki_block", { + drawtype = "nodebox", + description = S("Oerkki Block"), + paramtype = "light", + paramtype2 = "facedir", + tiles = { + "gloopblocks_oerkkiblock_tb.png", + "gloopblocks_oerkkiblock_tb.png", + "gloopblocks_oerkkiblock_sides.png", + "gloopblocks_oerkkiblock_sides.png", + "gloopblocks_oerkkiblock_sides.png", + "gloopblocks_oerkkiblock_front.png" + }, + groups = {cracky=3, oddly_breakable_by_hand=3}, + sounds = default.node_sound_stone_defaults(), + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 0.5, 0.5 } + }, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.5, 0.1875}, -- NodeBox1 + {-0.5, -0.5, -0.5, -0.4375, 0.5, 0.5}, -- NodeBox2 + {0.4375, -0.5, -0.5, 0.5, 0.5, 0.5}, -- NodeBox3 + {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5}, -- NodeBox4 + {-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5}, -- NodeBox5 + {-0.5, -0.0625, -0.5, 0.5, 0.0625, 0.5}, -- NodeBox6 + } + } +}) + +minetest.register_node("gloopblocks:stone_brick_mossy", { + description = S("Mossy Stone Brick"), + tiles = {"gloopblocks_stone_brick_mossy.png"}, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("gloopblocks:stone_mossy", { + description = S("Mossy Stone"), + tiles = {"gloopblocks_stone_mossy.png"}, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), + drop = "default:mossycobble" +}) + +minetest.register_node("gloopblocks:cobble_road", { + description = S("Cobblestone Road Bed"), + tiles = {"gloopblocks_cobble_road.png"}, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("gloopblocks:cobble_road_mossy", { + description = S("Mossy Cobblestone Road Bed"), + tiles = {"gloopblocks_cobble_road_mossy.png"}, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("gloopblocks:scaffolding", { + description = S("Wooden Scaffold"), + drawtype = "allfaces", + paramtype = "light", + sunlight_propagates = true, + tiles = {"gloopblocks_scaffold.png"}, + groups = {choppy=3, oddly_breakable_by_hand=3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_alias("moreblocks:oerkkiblock", "gloopblocks:oerkki_block") +minetest.register_alias("gloopblocks:obsidian", "default:obsidian") + +-- Nodes imported from Usesdirt ================================================================================ + +if not minetest.get_modpath("usesdirt") then + + local dirt_brick_tex = "default_dirt.png^gloopblocks_dirt_brick_overlay.png" + local dirt_cobble_tex = "default_cobble.png^(default_dirt.png^[mask:gloopblocks_dirt_cobble_mask.png)" + local dirt_stone_tex = "default_stone.png^(default_dirt.png^[mask:gloopblocks_dirt_stone_mask.png)" + + local dirt_ladder_tex = "(default_dirt.png^[mask:gloopblocks_ladder_mask.png)^gloopblocks_ladder_overlay.png" + local dirt_brick_ladder_tex = "(("..dirt_brick_tex..")^[mask:gloopblocks_ladder_mask.png)^gloopblocks_ladder_overlay.png" + local dirt_cobble_ladder_tex = "(("..dirt_cobble_tex..")^[mask:gloopblocks_ladder_mask.png)^gloopblocks_ladder_overlay.png" + local dirt_stone_ladder_tex = "(("..dirt_stone_tex..")^[mask:gloopblocks_ladder_mask.png)^gloopblocks_ladder_overlay.png" + + minetest.register_node(":usesdirt:dirt_brick", { + tiles = { dirt_brick_tex }, + description = "Dirt Brick", + groups = {snappy=2,choppy=1,oddly_breakable_by_hand=2}, + }) + + minetest.register_node(":usesdirt:dirt_brick_ladder", { + description = "Dirt Brick Ladder", + drawtype = "signlike", + tiles = { dirt_brick_ladder_tex }, + inventory_image = dirt_brick_ladder_tex, + wield_image = dirt_brick_ladder_tex, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = true, + walkable = false, + climbable = true, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky=3, stone=2}, + legacy_wallmounted = true, + }) + minetest.register_craft({ + output = 'usesdirt:dirt_brick_ladder 3', + recipe = { + {'usesdirt:dirt_brick', '', 'usesdirt:dirt_brick'}, + {'usesdirt:dirt_brick', 'usesdirt:dirt_brick','usesdirt:dirt_brick'}, + {'usesdirt:dirt_brick','','usesdirt:dirt_brick'}, + } + }) + + default.register_fence(":usesdirt:dirt_brick_fence", { + description = "Dirt Brick Fence", + texture = dirt_brick_tex, + inventory_image = "default_fence_overlay.png^("..dirt_brick_tex..")^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^("..dirt_brick_tex..")^default_fence_overlay.png^[makealpha:255,126,126", + material = "usesdirt:dirt_brick", + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), + check_for_pole = true + }) + + if minetest.get_modpath("moreblocks") then + minetest.register_craft({ + output = 'usesdirt:dirt_brick 24', + recipe = { + {'moreblocks:dirt_compressed', 'moreblocks:dirt_compressed', '' }, + {'moreblocks:dirt_compressed', 'moreblocks:dirt_compressed', '' } + } + }) + else + minetest.register_craft({ + output = 'usesdirt:dirt_brick 6', + recipe = { + {'default:dirt', 'default:dirt', 'default:dirt'}, + {'default:dirt', 'default:dirt', 'default:dirt'}, + {'default:dirt', 'default:dirt', 'default:dirt'}, + } + }) + end + + minetest.register_node(":usesdirt:dirt_ladder", { + description = "Dirt Ladder", + drawtype = "signlike", + tiles = { dirt_ladder_tex }, + inventory_image = dirt_ladder_tex, + wield_image = dirt_ladder_tex, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = true, + walkable = false, + climbable = true, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3}, + legacy_wallmounted = true, + }) + minetest.register_craft({ + output = 'usesdirt:dirt_ladder 3', + recipe = { + {'usesdirt:dirt_brick', '', 'usesdirt:dirt_brick'}, + {'usesdirt:dirt_brick', 'usesdirt:dirt_brick','usesdirt:dirt_brick'}, + {'usesdirt:dirt_brick','','usesdirt:dirt_brick'}, + } + }) + + default.register_fence(":usesdirt:dirt_fence", { + description = "Dirt Fence", + texture = "default_dirt.png", + inventory_image = "default_fence_overlay.png^default_dirt.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_dirt.png^default_fence_overlay.png^[makealpha:255,126,126", + material = "default:dirt", + groups = {snappy=2,choppy=1,oddly_breakable_by_hand=3}, + sounds = default.node_sound_dirt_defaults(), + check_for_pole = true + }) + +---- + + minetest.register_node(":usesdirt:dirt_cobble_stone", { + tiles = { dirt_cobble_tex }, + description = "Dirt Cobble Stone", + is_ground_content = true, + groups = {cracky=3, stone=2}, + }) + minetest.register_craft({ + output = '"usesdirt:dirt_cobble_stone" 3', + recipe = { + {'usesdirt:dirt_brick', 'usesdirt:dirt_brick', 'usesdirt:dirt_brick'}, + {'usesdirt:dirt_brick', 'usesdirt:dirt_brick', 'usesdirt:dirt_brick'}, + {'usesdirt:dirt_brick', 'usesdirt:dirt_brick', 'usesdirt:dirt_brick'}, + } + }) + + minetest.register_node(":usesdirt:dirt_cobble_stone_ladder", { + description = "Dirt Cobble Stone Ladder", + drawtype = "signlike", + tiles = { dirt_cobble_ladder_tex }, + inventory_image = dirt_cobble_ladder_tex, + wield_image = dirt_cobble_ladder_tex, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = true, + walkable = false, + climbable = true, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky=3, stone=2}, + legacy_wallmounted = true, + }) + minetest.register_craft({ + output = 'usesdirt:dirt_cobble_stone_ladder 3', + recipe = { + {'usesdirt:dirt_cobble_stone', '', 'usesdirt:dirt_cobble_stone'}, + {'usesdirt:dirt_cobble_stone', 'usesdirt:dirt_cobble_stone','usesdirt:dirt_cobble_stone'}, + {'usesdirt:dirt_cobble_stone','','usesdirt:dirt_cobble_stone'}, + } + }) + + default.register_fence(":usesdirt:dirt_cobble_stone_fence", { + description = "Dirt Cobble Stone Fence", + texture = dirt_cobble_tex, + inventory_image = "default_fence_overlay.png^("..dirt_cobble_tex..")^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^("..dirt_cobble_tex..")^default_fence_overlay.png^[makealpha:255,126,126", + material = "usesdirt:dirt_cobble_stone", + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), + check_for_pole = true + }) + +---- + + minetest.register_node(":usesdirt:dirt_stone", { + tiles = { dirt_stone_tex }, + description = "Dirt Stone", + is_ground_content = true, + groups = {cracky=3, stone=2}, + }) + + minetest.register_node(":usesdirt:dirt_stone_ladder", { + description = "Dirt Stone Ladder", + drawtype = "signlike", + tiles = { dirt_stone_ladder_tex }, + inventory_image = dirt_stone_ladder_tex, + wield_image = dirt_stone_ladder_tex, + paramtype = "light", + paramtype2 = "wallmounted", + is_ground_content = true, + walkable = false, + climbable = true, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {cracky=3, stone=2}, + legacy_wallmounted = true, + }) + minetest.register_craft({ + output = 'usesdirt:dirt_stone_ladder 3', + recipe = { + {'usesdirt:dirt_stone', '', 'usesdirt:dirt_stone'}, + {'usesdirt:dirt_stone', 'usesdirt:dirt_stone','usesdirt:dirt_stone'}, + {'usesdirt:dirt_stone','','usesdirt:dirt_stone'}, + } + }) + + default.register_fence(":usesdirt:dirt_stone_fence", { + description = "Dirt Stone Fence", + texture = dirt_stone_tex, + inventory_image = "default_fence_overlay.png^("..dirt_stone_tex..")^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^("..dirt_stone_tex..")^default_fence_overlay.png^[makealpha:255,126,126", + material = "usesdirt:dirt_stone", + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), + check_for_pole = true + }) +end + +-- Stairs/slabs defs, conversion of normal -> mossy items + +if minetest.setting_getbool("gloopblocks_mossy_conversion") ~= false then + + function gloopblocks_register_mossy_conversion(mossyobjects) + for i in ipairs(mossyobjects) do + minetest.register_abm({ + nodenames = { mossyobjects[i][1] }, + neighbors = {"default:water_source", "default:water_flowing"}, + interval = 120, + chance = 50, + action = function(pos, node) + if minetest.find_node_near(pos, 2, "air") then + local fdir = node.param2 + minetest.add_node(pos, {name = mossyobjects[i][2], param2 = fdir}) + end + end, + }) + end + end +end + +if minetest.get_modpath("moreblocks") then + + stairsplus:register_all("gloopblocks", "oerkki_block", "gloopblocks:oerkki_block", { + description = S("Oerkki Block"), + tiles = { + "gloopblocks_oerkkiblock_tb.png", + "gloopblocks_oerkkiblock_tb.png", + "gloopblocks_oerkkiblock_sides.png", + "gloopblocks_oerkkiblock_sides.png", + "gloopblocks_oerkkiblock_sides.png", + "gloopblocks_oerkkiblock_front.png" + }, + groups = {cracky=2, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "stone_brick_mossy", "gloopblocks:stone_brick_mossy", { + description = S("Mossy Stone Brick"), + tiles = {"gloopblocks_stone_brick_mossy.png"}, + groups = {cracky=1, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "stone_mossy", "gloopblocks:stone_mossy", { + description = S("Mossy Stone"), + tiles = {"gloopblocks_stone_mossy.png"}, + groups = {cracky=1, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "cobble_road", "gloopblocks:cobble_road", { + description = S("Cobblestone Roadbed"), + tiles = {"gloopblocks_cobble_road.png"}, + groups = {cracky=3, stone=1, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "cobble_road_mossy", "gloopblocks:cobble_road_mossy", { + description = S("Mossy Cobblestone Roadbed"), + tiles = {"gloopblocks_cobble_road_mossy.png"}, + groups = {cracky=3, stone=1, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "pavement", "gloopblocks:pavement", { + description = S("Pavement"), + tiles = {"gloopblocks_pavement.png"}, + groups = {cracky=2, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "rainbow_block", "gloopblocks:rainbow_block", { + description = S("Rainbow Block"), + tiles = {"gloopblocks_rainbow_block.png"}, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "evil_block", "gloopblocks:evil_block", { + description = S("Evil Block"), + tiles = {"gloopblocks_evil_block.png"}, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_defaults(), + light_source = 5, + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "basalt", "gloopblocks:basalt", { + description = S("Basalt"), + tiles = {"gloopblocks_basalt.png"}, + groups = {cracky=2, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "pumice", "gloopblocks:pumice", { + description = S("Pumice"), + tiles = {"gloopblocks_pumice.png"}, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = true, + }) + + stairsplus:register_all("gloopblocks", "gravel", "default:gravel", { + description = S("Gravel"), + tiles = {"default_gravel.png"}, + groups = {crumbly = 2, falling_node = 1, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + sunlight_propagates = false, + }) + + if minetest.get_modpath("caverealms") then + stairsplus:register_all("caverealms", "glow_crystal", "caverealms:glow_crystal", { + description = S("Glow Crystal"), + tiles = {"caverealms_glow_crystal.png"}, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 12, + use_texture_alpha = true, + paramtype="light", + sunlight_propagates = true, + }) + + stairsplus:register_all("caverealms", "glow_emerald", "caverealms:glow_emerald", { + description = S("Glow Emerald"), + tiles = {"caverealms_glow_emerald.png"}, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 12, + use_texture_alpha = true, + paramtype="light", + sunlight_propagates = true, + }) + + stairsplus:register_all("caverealms", "glow_mese", "caverealms:glow_mese", { + description = S("Glow Mese"), + tiles = {"caverealms_glow_mese.png"}, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 12, + use_texture_alpha = true, + paramtype="light", + sunlight_propagates = true, + }) + end + + -- ABMs for mossy objects + + if minetest.setting_getbool("gloopblocks_mossy_conversion") ~= false then + + gloopblocks_register_mossy_conversion({ + { "moreblocks:stair_cobble", "moreblocks:stair_mossycobble" }, + { "moreblocks:stair_cobble_inner", "moreblocks:stair_mossycobble_inner" }, + { "moreblocks:stair_cobble_outer", "moreblocks:stair_mossycobble_outer" }, + { "moreblocks:stair_cobble_half", "moreblocks:stair_mossycobble_half" }, + { "moreblocks:slab_cobble_quarter", "moreblocks:slab_mossycobble_quarter" }, + { "moreblocks:slab_cobble", "moreblocks:slab_mossycobble" }, + { "moreblocks:slab_cobble_three_quarter", "moreblocks:slab_mossycobble_three_quarter" }, + { "moreblocks:panel_cobble", "moreblocks:panel_mossycobble" }, + { "moreblocks:micro_cobble", "moreblocks:micro_mossycobble" }, + { "moreblocks:stair_cobble_alt", "moreblocks:stair_mossycobble_alt" }, + + { "gloopblocks:cobble_road", "gloopblocks:cobble_road_mossy" }, + { "gloopblocks:stair_cobble_road", "gloopblocks:stair_cobble_road_mossy" }, + { "gloopblocks:slab_cobble_road", "gloopblocks:slab_cobble_road_mossy" }, + { "gloopblocks:stair_cobble_road", "gloopblocks:stair_cobble_road_mossy" }, + { "gloopblocks:stair_cobble_road_inner", "gloopblocks:stair_cobble_road_mossy_inner" }, + { "gloopblocks:stair_cobble_road_outer", "gloopblocks:stair_cobble_road_mossy_outer" }, + { "gloopblocks:stair_cobble_road_half", "gloopblocks:stair_cobble_road_mossy_half" }, + { "gloopblocks:slab_cobble_road_quarter", "gloopblocks:slab_cobble_road_mossy_quarter" }, + { "gloopblocks:slab_cobble_road", "gloopblocks:slab_cobble_road_mossy" }, + { "gloopblocks:slab_cobble_road_three_quarter", "gloopblocks:slab_cobble_road_mossy_three_quarter" }, + { "gloopblocks:panel_cobble_road", "gloopblocks:panel_cobble_road_mossy" }, + { "gloopblocks:micro_cobble_road", "gloopblocks:micro_cobble_road_mossy" }, + { "gloopblocks:stair_cobble_road_alt", "gloopblocks:stair_cobble_road_mossy_alt" }, + + { "default:stonebrick", "gloopblocks:stone_brick_mossy" }, + { "default:stair_stonebrick", "gloopblocks:stair_stone_brick_mossy" }, + { "default:slab_stonebrick", "gloopblocks:slab_stone_brick_mossy" }, + { "moreblocks:stair_stonebrick", "gloopblocks:stair_stone_brick_mossy" }, + { "moreblocks:stair_stonebrick_inner", "gloopblocks:stair_stone_brick_mossy_inner" }, + { "moreblocks:stair_stonebrick_outer", "gloopblocks:stair_stone_brick_mossy_outer" }, + { "moreblocks:stair_stonebrick_half", "gloopblocks:stair_stone_brick_mossy_half" }, + { "moreblocks:slab_stonebrick_quarter", "gloopblocks:slab_stone_brick_mossy_quarter" }, + { "moreblocks:slab_stonebrick", "gloopblocks:slab_stone_brick_mossy" }, + { "moreblocks:slab_stonebrick_three_quarter", "gloopblocks:slab_stone_brick_mossy_three_quarter" }, + { "moreblocks:panel_stonebrick", "gloopblocks:panel_stone_brick_mossy" }, + { "moreblocks:micro_stonebrick", "gloopblocks:micro_stone_brick_mossy" }, + { "moreblocks:stair_stonebrick_alt", "gloopblocks:stair_stone_brick_mossy_alt" }, + + { "default:stone", "gloopblocks:stone_mossy" }, + { "default:stair_stone", "gloopblocks:stair_stone_mossy" }, + { "default:slab_stone", "gloopblocks:slab_stone_mossy" }, + { "moreblocks:stair_stone", "gloopblocks:stair_stone_mossy" }, + { "moreblocks:stair_stone_inner", "gloopblocks:stair_stone_mossy_inner" }, + { "moreblocks:stair_stone_outer", "gloopblocks:stair_stone_mossy_outer" }, + { "moreblocks:stair_stone_half", "gloopblocks:stair_stone_mossy_half" }, + + { "moreblocks:slab_stone_quarter", "gloopblocks:slab_stone_mossy_quarter" }, + { "moreblocks:slab_stone", "gloopblocks:slab_stone_mossy" }, + { "moreblocks:slab_stone_three_quarter", "gloopblocks:slab_stone_mossy_three_quarter" }, + { "moreblocks:panel_stone", "gloopblocks:panel_stone_mossy" }, + { "moreblocks:micro_stone", "gloopblocks:micro_stone_mossy" }, + { "moreblocks:stair_stone_alt", "gloopblocks:stair_stone_mossy_alt" }, + }) + end + +elseif minetest.get_modpath("stairs") then + + --stairs.register_stair(subname, recipeitem, groups, images, description, sounds) + + -- stairs:xxxx_stone_mossy ; xxxx = stair or slab + stairs.register_stair_and_slab("stone_mossy", "gloopblocks:stone_mossy", + {cracky=3}, + {"gloopblocks_stone_mossy.png"}, + S("Mossy Stone Stair"), + S("Mossy Stone Slab"), + default.node_sound_stone_defaults()) + + -- stairs:xxxx_mossycobble + stairs.register_stair_and_slab("mossycobble", "default:mossycobble", + {cracky=3}, + {"default_mossycobble.png"}, + S("Mossy Cobble Stair"), + S("Mossy Cobble Slab"), + default.node_sound_stone_defaults()) + + -- stairs:xxxx_stone_brick_mossy + stairs.register_stair_and_slab("stone_brick_mossy", "gloopblocks:stone_brick_mossy", + {cracky=3}, + {"gloopblocks_stone_brick_mossy.png"}, + S("Mossy Stone Brick Stair"), + S("Mossy Stone Brick Slab"), + default.node_sound_stone_defaults()) + + -- stairs:xxxx_cobble_road + stairs.register_stair_and_slab("cobble_road", "gloopblocks:cobble_road", + {cracky=3}, + {"gloopblocks_cobble_road.png"}, + S("Cobble Roadbed Stair"), + S("Cobble Roadbed Slab"), + default.node_sound_stone_defaults()) + + -- stairs:xxxx_cobble_road_mossy + stairs.register_stair_and_slab("cobble_road_mossy", "gloopblocks:cobble_road_mossy", + {cracky=3}, + {"gloopblocks_cobble_road_mossy.png"}, + S("Mossy Cobble Roadbed Stair"), + S("Mossy Cobble Roadbed Slab"), + default.node_sound_stone_defaults()) + + -- stairs:xxxx_cement + stairs.register_stair_and_slab("cement", "gloopblocks:cement", + {cracky=2}, + {"basic_materials_cement_block.png"}, + S("Cement Stair"), + S("Cement Slab"), + default.node_sound_stone_defaults()) + + -- stairs:xxxx_pavement + stairs.register_stair_and_slab("pavement", "gloopblocks:pavement", + {cracky=3, oddly_breakable_by_hand=3}, + {"gloopblocks_pavement.png"}, + S("Pavement Stair"), + S("Pavement Slab"), + default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab("basalt", "gloopblocks:basalt", + {cracky=2}, + {"gloopblocks_basalt.png"}, + S("Basalt Stair"), + S("Basalt Slab"), + default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab("pumice", "gloopblocks:pumice", + {cracky=3}, + {"gloopblocks_pumice.png"}, + S("Pumice Stair"), + S("Pumice Slab"), + default.node_sound_stone_defaults()) + + stairs.register_stair_and_slab("rainbow_block", "gloopblocks:rainbow_block", + {cracky=3}, + {"gloopblocks_rainbow_block.png"}, + S("Rainbow Block Stair"), + S("Rainbow Block Slab"), + default.node_sound_defaults()) + + if minetest.setting_getbool("gloopblocks_mossy_conversion") ~= false then + + gloopblocks_register_mossy_conversion({ + { "default:cobble", "default:mossycobble" }, + { "stairs:stair_cobble", "stairs:stair_mossycobble" }, + { "stairs:slab_cobble", "stairs:slab_mossycobble" }, + { "gloopblocks:cobble_road", "gloopblocks:cobble_road_mossy" }, + { "stairs:stair_cobble_road", "stairs:stair_cobble_road_mossy" }, + { "stairs:slab_cobble_road", "stairs:slab_cobble_road_mossy" }, + { "default:stonebrick", "gloopblocks:stone_brick_mossy" }, + { "stairs:stair_stonebrick", "stairs:stair_stone_brick_mossy" }, + { "stairs:slab_stonebrick", "stairs:slab_stone_brick_mossy" }, + { "default:stone", "gloopblocks:stone_mossy" }, + { "stairs:stair_stone", "stairs:stair_stone_mossy" }, + { "stairs:slab_stone", "stairs:slab_stone_mossy" }, + }) + end + + minetest.register_alias("default:stair_mossycobble", "stairs:stair_mossycobble") + minetest.register_alias("default:slab_mossycobble", "stairs:slab_mossycobble") + minetest.register_alias("gloopblocks:stair_cobble_road", "stairs:stair_cobble_road") + minetest.register_alias("gloopblocks:slab_cobble_road", "stairs:slab_cobble_road") + minetest.register_alias("gloopblocks:stair_cobble_road_mossy", "stairs:stair_cobble_road_mossy") + minetest.register_alias("gloopblocks:slab_cobble_road_mossy", "stairs:slab_cobble_road_mossy") + minetest.register_alias("gloopblocks:stair_stone_brick_mossy", "stairs:stair_stone_brick_mossy") + minetest.register_alias("gloopblocks:slab_stone_brick_mossy", "stairs:slab_stone_brick_mossy") + minetest.register_alias("gloopblocks:stair_stone_mossy", "stairs:stair_stone_mossy") + minetest.register_alias("gloopblocks:slab_stone_mossy", "stairs:slab_stone_mossy") + minetest.register_alias("gloopblocks:stair_cement", "stairs:stair_cement") + minetest.register_alias("gloopblocks:slab_cement", "stairs:slab_cement") + minetest.register_alias("gloopblocks:stair_pavement", "stairs:stair_pavement") + minetest.register_alias("gloopblocks:slab_pavement", "stairs:slab_pavement") + minetest.register_alias("gloopblocks:stair_pumice", "stairs:stair_pumice") + minetest.register_alias("gloopblocks:slab_pumice", "stairs:slab_pumice") + minetest.register_alias("gloopblocks:stair_basalt", "stairs:stair_basalt") + minetest.register_alias("gloopblocks:slab_basalt", "stairs:slab_basalt") + minetest.register_alias("gloopblocks:stair_rainbow_block", "stairs:stair_rainbow_block") + minetest.register_alias("gloopblocks:slab_rainbow_block", "stairs:slab_rainbow_block") +end + +-- Tools + +minetest.register_tool("gloopblocks:pick_cement", { + description = S("Cement Pickaxe"), + inventory_image = "gloopblocks_cement_pick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky={times={[1]=3.50, [2]=1.40, [3]=0.90}, uses=25, maxlevel=2} + }, + damage_groups = {fleshy=4}, + }, +}) + +minetest.register_tool("gloopblocks:shovel_cement", { + description = S("Cement Shovel"), + inventory_image = "gloopblocks_cement_shovel.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + crumbly={times={[1]=1.50, [2]=0.60, [3]=0.45}, uses=25, maxlevel=2} + }, + damage_groups = {fleshy=4}, + }, +}) + +minetest.register_tool("gloopblocks:axe_cement", { + description = S("Cement Axe"), + inventory_image = "gloopblocks_cement_axe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=3.00, [2]=1.30, [3]=0.80}, uses=25, maxlevel=2}, + fleshy={times={[2]=1.20, [3]=0.65}, uses=30, maxlevel=1} + }, + damage_groups = {fleshy=4}, + }, +}) + +minetest.register_tool("gloopblocks:sword_cement", { + description = S("Cement Sword"), + inventory_image = "gloopblocks_cement_sword.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + fleshy={times={[1]=1.60, [2]=0.80, [3]=0.40}, uses=15, maxlevel=2}, + snappy={times={[2]=0.75, [3]=0.35}, uses=30, maxlevel=1}, + choppy={times={[3]=0.80}, uses=30, maxlevel=0} + }, + damage_groups = {fleshy=6}, + } +}) + +minetest.register_tool("gloopblocks:pick_evil", { + description = S("Evil Pickaxe"), + inventory_image = "gloopblocks_evil_pick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + cracky={times={[1]=0.10, [2]=0.10, [3]=0.10}, uses=10, maxlevel=2} + }, + damage_groups = {fleshy=6}, + }, +}) + +minetest.register_tool("gloopblocks:shovel_evil", { + description = S("Evil Shovel"), + inventory_image = "gloopblocks_evil_shovel.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + crumbly={times={[1]=0.05, [2]=0.05, [3]=0.05}, uses=10, maxlevel=2} + }, + damage_groups = {fleshy=6}, + }, +}) + +minetest.register_tool("gloopblocks:axe_evil", { + description = S("Evil Axe"), + inventory_image = "gloopblocks_evil_axe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + choppy={times={[1]=0.15, [2]=0.15, [3]=0.15}, uses=10, maxlevel=2}, + fleshy={times={[1]=0.15, [2]=0.15, [3]=0.15}, uses=10, maxlevel=2} + }, + damage_groups = {fleshy=6}, + }, +}) + +minetest.register_tool("gloopblocks:sword_evil", { + description = S("Evil Sword"), + inventory_image = "gloopblocks_evil_sword.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + fleshy={times={[1]=0.20, [2]=0.20, [3]=0.20}, uses=10, maxlevel=2}, + snappy={times={[1]=0.20, [2]=0.20, [3]=0.20}, uses=10, maxlevel=2}, + choppy={times={[1]=0.20, [2]=0.20, [3]=0.20}, uses=10, maxlevel=2} + }, + damage_groups = {fleshy=8}, + } +}) + +-- Other items + +minetest.register_craftitem("gloopblocks:evil_stick", { + description = S("Evil Stick"), + inventory_image = "gloopblocks_evil_stick.png", +}) + +-- define lava-cooling-based nodes and hook into the default lavacooling +-- functions to generate basalt, pumice, and obsidian + +if minetest.setting_getbool("gloopblocks_lavacooling") ~= false then + + minetest.register_node("gloopblocks:obsidian_cooled", { + description = S("Obsidian"), + tiles = {"default_obsidian.png"}, + is_ground_content = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1, level=2, not_in_creative_inventory=1}, + drop = "default:obsidian", + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.add_node(pos, {name = "default:obsidian"}) + end + }) + + minetest.register_node("gloopblocks:basalt_cooled", { + description = S("Basalt"), + tiles = {"gloopblocks_basalt.png"}, + groups = {cracky=2, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + drop = "gloopblocks:basalt", + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.add_node(pos, {name = "gloopblocks:basalt"}) + end + }) + + minetest.register_node("gloopblocks:pumice_cooled", { + description = S("Pumice"), + tiles = {"gloopblocks_pumice.png"}, + groups = {cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + drop = "gloopblocks:pumice", + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.add_node(pos, {name = "gloopblocks:pumice"}) + end + }) + + local gloopblocks_search_nearby_nodes = function(pos, node) + if minetest.get_node({x=pos.x-1, y=pos.y, z=pos.z}).name == node then return true end + if minetest.get_node({x=pos.x+1, y=pos.y, z=pos.z}).name == node then return true end + if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == node then return true end + if minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name == node then return true end + if minetest.get_node({x=pos.x, y=pos.y, z=pos.z-1}).name == node then return true end + if minetest.get_node({x=pos.x, y=pos.y, z=pos.z+1}).name == node then return true end + return false + end + + default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + if gloopblocks_search_nearby_nodes(pos,"default:water_source") + or gloopblocks_search_nearby_nodes(pos,"default:water_flowing") then + minetest.set_node(pos, {name="gloopblocks:obsidian_cooled"}) + end + else -- Lava flowing + if gloopblocks_search_nearby_nodes(pos,"default:water_source") then + minetest.set_node(pos, {name="gloopblocks:basalt_cooled"}) + elseif gloopblocks_search_nearby_nodes(pos,"default:water_flowing") then + minetest.set_node(pos, {name="gloopblocks:pumice_cooled"}) + end + end + end +end + +local fence_texture = + "default_fence_overlay.png^default_steel_block.png^default_fence_overlay.png^[makealpha:255,126,126" + +minetest.register_node("gloopblocks:fence_steel", { + description = S("Steel Fence"), + drawtype = "fencelike", + tiles = {"default_steel_block.png"}, + inventory_image = fence_texture, + wield_image = fence_texture, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy = 2, oddly_breakable_by_hand = 2 }, + sounds = default.node_sound_stone_defaults(), +}) + +if minetest.get_modpath("worldedit") then + function gloopblocks.liquid_ungrief(pos1, pos2, name) + local count + local p1to2 = minetest.pos_to_string(pos1).." and "..minetest.pos_to_string(pos2) + local volume = worldedit.volume(pos1, pos2) + minetest.chat_send_player(name, "Cleaning-up lava/water griefing between "..p1to2.."...") + if volume > 1000000 then + minetest.chat_send_player(name, "This operation could affect up to "..volume.." nodes. It may take a while.") + end + minetest.log("action", name.." performs lava/water greifing cleanup between "..p1to2..".") + count = worldedit.replace(pos1, pos2, "default:lava_source", "air") + count = worldedit.replace(pos1, pos2, "default:lava_flowing", "air") + count = worldedit.replace(pos1, pos2, "default:water_source", "air") + count = worldedit.replace(pos1, pos2, "default:water_flowing", "air") + count = worldedit.replace(pos1, pos2, "default:river_water_source", "air") + count = worldedit.replace(pos1, pos2, "default:river_water_flowing", "air") + count = worldedit.replace(pos1, pos2, "gloopblocks:pumice_cooled", "air") + count = worldedit.replace(pos1, pos2, "gloopblocks:basalt_cooled", "air") + count = worldedit.replace(pos1, pos2, "gloopblocks:obsidian_cooled", "air") + count = worldedit.fixlight(pos1, pos2) + minetest.chat_send_player(name, "Operation completed.") + end + + minetest.register_chatcommand("/liquid_ungrief", { + params = "[size]", + privs = {worldedit = true}, + description = "Repairs greifing caused by spilling lava and water (and their \"cooling\" results)", + func = function(name, params) + local pos1 = worldedit.pos1[name] + local pos2 = worldedit.pos2[name] + if not pos1 or not pos2 then return end + gloopblocks.liquid_ungrief(pos1, pos2, name) + end + }) +end + +dofile(minetest.get_modpath("gloopblocks").."/crafts.lua") + +minetest.register_alias("nyancat:nyancat_rainbow", "gloopblocks:rainbow_block_horizontal") +minetest.register_alias("default:nyancat_rainbow", "gloopblocks:rainbow_block_horizontal") + +print(S("Gloopblocks Loaded!")) diff --git a/mods/gloopblocks/intllib.lua b/mods/gloopblocks/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/gloopblocks/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/gloopblocks/locale/de.po b/mods/gloopblocks/locale/de.po new file mode 100644 index 00000000..2cabe6ff --- /dev/null +++ b/mods/gloopblocks/locale/de.po @@ -0,0 +1,235 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-14 07:09+0200\n" +"PO-Revision-Date: 2017-05-14 07:22+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Last-Translator: Xanthin\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de\n" + +#: init.lua +#, fuzzy +msgid "Diagonal Rainbow Block" +msgstr "Regenbogenblock (diagonal)" + +#: init.lua +#, fuzzy +msgid "Horizontal Rainbow Block" +msgstr "Regenbogenblock (horizontal)" + +#: init.lua +msgid "Cement" +msgstr "Zement" + +#: init.lua +msgid "Evil Block" +msgstr "Teuflischer Block" + +#: init.lua +msgid "Basalt" +msgstr "Basalt" + +#: init.lua +msgid "Pumice" +msgstr "Bimsstein" + +#: init.lua +msgid "Pavement" +msgstr "Strassenbelag" + +#: init.lua +msgid "Oerkki Block" +msgstr "Oerkkiblock" + +#: init.lua +msgid "Mossy Stone Brick" +msgstr "Moosiger Steinziegel" + +#: init.lua +msgid "Mossy Stone" +msgstr "Moosiger Stein" + +#: init.lua +msgid "Cobblestone Road Bed" +msgstr "Kopfsteinpflasterstrasse" + +#: init.lua +msgid "Mossy Cobblestone Road Bed" +msgstr "Moosige Kopfsteinpflasterstrasse" + +#: init.lua +msgid "Wooden Scaffold" +msgstr "Holzgeruest" + +#: init.lua +msgid "Cobblestone Roadbed" +msgstr "Kopfsteinpflasterstrasse" + +#: init.lua +msgid "Mossy Cobblestone Roadbed" +msgstr "Moosige Kopfsteinpflasterstrasse" + +#: init.lua +msgid "Rainbow Block" +msgstr "Regenbogenblock" + +#: init.lua +msgid "Glow Crystal" +msgstr "" + +#: init.lua +msgid "Glow Emerald" +msgstr "" + +#: init.lua +msgid "Glow Mese" +msgstr "" + +#: init.lua +msgid "Mossy Stone Stair" +msgstr "Moosige Steintreppe" + +#: init.lua +msgid "Mossy Stone Slab" +msgstr "Moosige Pflastersteintreppe" + +#: init.lua +msgid "Mossy Cobble Stair" +msgstr "Moosige Pflastersteintreppe" + +#: init.lua +msgid "Mossy Cobble Slab" +msgstr "Moosige Pflastersteinstufe" + +#: init.lua +msgid "Mossy Stone Brick Stair" +msgstr "Moosige Steinziegeltreppe" + +#: init.lua +msgid "Mossy Stone Brick Slab" +msgstr "Moosige Steinziegelstufe" + +#: init.lua +msgid "Cobble Roadbed Stair" +msgstr "Kopfsteinstrassentreppe" + +#: init.lua +msgid "Cobble Roadbed Slab" +msgstr "Kopfsteinstrassenstufe" + +#: init.lua +msgid "Mossy Cobble Roadbed Stair" +msgstr "Moosige Kopfsteinstrassentreppe" + +#: init.lua +msgid "Mossy Cobble Roadbed Slab" +msgstr "Moosige Kopfsteinstrassenstufe" + +#: init.lua +msgid "Cement Stair" +msgstr "Zementtreppe" + +#: init.lua +msgid "Cement Slab" +msgstr "Zementstufe" + +#: init.lua +msgid "Pavement Stair" +msgstr "Strassenbelagtreppe" + +#: init.lua +msgid "Pavement Slab" +msgstr "Strassenbelagstufe" + +#: init.lua +#, fuzzy +msgid "Basalt Stair" +msgstr "Basalttreppe" + +#: init.lua +#, fuzzy +msgid "Basalt Slab" +msgstr "Basaltstufe" + +#: init.lua +#, fuzzy +msgid "Pumice Stair" +msgstr "Bimssteintreppe" + +#: init.lua +#, fuzzy +msgid "Pumice Slab" +msgstr "Bimssteinstufe" + +#: init.lua +#, fuzzy +msgid "Rainbow Block Stair" +msgstr "Regenbogenblocktreppe" + +#: init.lua +#, fuzzy +msgid "Rainbow Block Slab" +msgstr "Regenbogenblockstufe" + +#: init.lua +msgid "Cement Pickaxe" +msgstr "Zementspitzhacke" + +#: init.lua +msgid "Cement Shovel" +msgstr "Zementschaufel" + +#: init.lua +msgid "Cement Axe" +msgstr "Zementaxt" + +#: init.lua +msgid "Cement Sword" +msgstr "Zementschwert" + +#: init.lua +msgid "Evil Pickaxe" +msgstr "Teuflische Spitzhacke" + +#: init.lua +msgid "Evil Shovel" +msgstr "Teuflische Schaufel" + +#: init.lua +msgid "Evil Axe" +msgstr "Teuflische Axt" + +#: init.lua +msgid "Evil Sword" +msgstr "Teuflisches Schwert" + +#: init.lua +msgid "Wet Cement" +msgstr "Feuchter Zement" + +#: init.lua +msgid "Evil Stick" +msgstr "Teuflischer Stock" + +#: init.lua +msgid "Obsidian" +msgstr "Obsidian" + +#: init.lua +msgid "Steel Fence" +msgstr "" + +#: init.lua +msgid "Gloopblocks Loaded!" +msgstr "Gloopblocks geladen!" diff --git a/mods/gloopblocks/locale/fr.po b/mods/gloopblocks/locale/fr.po new file mode 100644 index 00000000..2baaa6c1 --- /dev/null +++ b/mods/gloopblocks/locale/fr.po @@ -0,0 +1,227 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-14 06:47+0200\n" +"PO-Revision-Date: 2017-08-06 08:45+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.12\n" +"Last-Translator: fat115 \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#: init.lua +msgid "Diagonal Rainbow Block" +msgstr "Bloc Arc-en-ciel diagonal" + +#: init.lua +msgid "Horizontal Rainbow Block" +msgstr "Bloc Arc-en-ciel horizontal" + +#: init.lua +msgid "Cement" +msgstr "Ciment" + +#: init.lua +msgid "Evil Block" +msgstr "Bloc diabolique" + +#: init.lua +msgid "Basalt" +msgstr "Basalte" + +#: init.lua +msgid "Pumice" +msgstr "Pierre ponce" + +#: init.lua +msgid "Pavement" +msgstr "Chaussée" + +#: init.lua +msgid "Oerkki Block" +msgstr "Bloc Oerkki" + +#: init.lua +msgid "Mossy Stone Brick" +msgstr "Brique moussue en pierre" + +#: init.lua +msgid "Mossy Stone" +msgstr "Pierre moussue" + +#: init.lua +msgid "Cobblestone Road Bed" +msgstr "Ballast en pierres" + +#: init.lua +msgid "Mossy Cobblestone Road Bed" +msgstr "Ballast moussu en pierres" + +#: init.lua +msgid "Wooden Scaffold" +msgstr "Échafaud en bois" + +#: init.lua +msgid "Cobblestone Roadbed" +msgstr "Ballast en pierres" + +#: init.lua +msgid "Mossy Cobblestone Roadbed" +msgstr "Ballast moussu en pierres" + +#: init.lua +msgid "Rainbow Block" +msgstr "Bloc Arc-en-ciel" + +#: init.lua +msgid "Glow Crystal" +msgstr "Cristal brillant" + +#: init.lua +msgid "Glow Emerald" +msgstr "Émeraude brillante" + +#: init.lua +msgid "Glow Mese" +msgstr "Mese brillant" + +#: init.lua +msgid "Mossy Stone Stair" +msgstr "Marche moussue en pierre" + +#: init.lua +msgid "Mossy Stone Slab" +msgstr "Dalle moussue en pierre" + +#: init.lua +msgid "Mossy Cobble Stair" +msgstr "Marche moussue en pierres" + +#: init.lua +msgid "Mossy Cobble Slab" +msgstr "Dalle moussue en pierres" + +#: init.lua +msgid "Mossy Stone Brick Stair" +msgstr "Marche moussue en briques de pierre" + +#: init.lua +msgid "Mossy Stone Brick Slab" +msgstr "Dalle moussue en briques de pierre" + +#: init.lua +msgid "Cobble Roadbed Stair" +msgstr "Marche en ballast (pierres)" + +#: init.lua +msgid "Cobble Roadbed Slab" +msgstr "Dalle en ballast (pierres)" + +#: init.lua +msgid "Mossy Cobble Roadbed Stair" +msgstr "Marche moussue en ballast (pierres)" + +#: init.lua +msgid "Mossy Cobble Roadbed Slab" +msgstr "Dalle moussue en ballast (pierres)" + +#: init.lua +msgid "Cement Stair" +msgstr "Marche en ciment" + +#: init.lua +msgid "Cement Slab" +msgstr "Dalle en ciment" + +#: init.lua +msgid "Pavement Stair" +msgstr "Marche de chaussée" + +#: init.lua +msgid "Pavement Slab" +msgstr "Dalle de chaussée" + +#: init.lua +msgid "Basalt Stair" +msgstr "Marche en basalte" + +#: init.lua +msgid "Basalt Slab" +msgstr "Dalle en basalte" + +#: init.lua +msgid "Pumice Stair" +msgstr "Marche en pierre ponce" + +#: init.lua +msgid "Pumice Slab" +msgstr "Dalle en pierre ponce" + +#: init.lua +msgid "Rainbow Block Stair" +msgstr "Marche en bloc Arc-en-ciel" + +#: init.lua +msgid "Rainbow Block Slab" +msgstr "Dalle en bloc Arc-en-ciel" + +#: init.lua +msgid "Cement Pickaxe" +msgstr "Pioche en ciment" + +#: init.lua +msgid "Cement Shovel" +msgstr "Pelle en ciment" + +#: init.lua +msgid "Cement Axe" +msgstr "Hache en ciment" + +#: init.lua +msgid "Cement Sword" +msgstr "Épée en ciment" + +#: init.lua +msgid "Evil Pickaxe" +msgstr "Pioche diabolique" + +#: init.lua +msgid "Evil Shovel" +msgstr "Pelle diabolique" + +#: init.lua +msgid "Evil Axe" +msgstr "Hache diabolique" + +#: init.lua +msgid "Evil Sword" +msgstr "Épée diabolique" + +#: init.lua +msgid "Wet Cement" +msgstr "Mortier" + +#: init.lua +msgid "Evil Stick" +msgstr "Baton diabolique" + +#: init.lua +msgid "Obsidian" +msgstr "Obsidienne" + +#: init.lua +msgid "Steel Fence" +msgstr "Barrière en acier" + +#: init.lua +msgid "Gloopblocks Loaded!" +msgstr "[Gloopblocks] a été chargé." diff --git a/mods/gloopblocks/locale/ru.po b/mods/gloopblocks/locale/ru.po new file mode 100644 index 00000000..68cb7f8f --- /dev/null +++ b/mods/gloopblocks/locale/ru.po @@ -0,0 +1,176 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-14 06:45+0200\n" +"PO-Revision-Date: 2017-08-17 12:47+0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.3\n" +"Last-Translator: inpos \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Language: ru\n" + +msgid "Diagonal Rainbow Block" +msgstr "Блок с радугой по диагонали" + +msgid "Horizontal Rainbow Block" +msgstr "Блок с радугой по горизонтали" + +msgid "Cement" +msgstr "Цемент" + +msgid "Evil Block" +msgstr "Злой блок" + +msgid "Basalt" +msgstr "Базальт" + +msgid "Pumice" +msgstr "Пемза" + +msgid "Pavement" +msgstr "Мостовая" + +msgid "Oerkki Block" +msgstr "Блок Оеркки" + +msgid "Mossy Stone Brick" +msgstr "Кирпич из мшистого камня" + +msgid "Mossy Stone" +msgstr "Мшистый камень" + +msgid "Cobblestone Road Bed" +msgstr "Брусчатка" + +msgid "Mossy Cobblestone Road Bed" +msgstr "Мшистая брусчатка" + +msgid "Wooden Scaffold" +msgstr "Деревянные строительные леса" + +msgid "Cobblestone Roadbed" +msgstr "Брусчатка" + +msgid "Mossy Cobblestone Roadbed" +msgstr "Мшистая брусчатка" + +msgid "Rainbow Block" +msgstr "Радужный блок" + +msgid "Glow Crystal" +msgstr "Светящийся хрусталь" + +msgid "Glow Emerald" +msgstr "Светящийся изумруд" + +msgid "Glow Mese" +msgstr "Светящийся камень" + +msgid "Mossy Stone Stair" +msgstr "Ступенька из мшистого камня" + +msgid "Mossy Stone Slab" +msgstr "Плита из мшистого камня" + +msgid "Mossy Cobble Stair" +msgstr "Ступенька из мшистого булыжника" + +msgid "Mossy Cobble Slab" +msgstr "Плита из мшистого булыжника" + +msgid "Mossy Stone Brick Stair" +msgstr "Ступенька из мшистого каменного кирпича" + +msgid "Mossy Stone Brick Slab" +msgstr "Плита из мшистого каменного кирпича" + +msgid "Cobble Roadbed Stair" +msgstr "Ступенька из брусчатки" + +msgid "Cobble Roadbed Slab" +msgstr "Плита из брусчатки" + +msgid "Mossy Cobble Roadbed Stair" +msgstr "Ступенька из мшистой брусчатки" + +msgid "Mossy Cobble Roadbed Slab" +msgstr "Плита из мшистой брусчатки" + +msgid "Cement Stair" +msgstr "Ступенька из цемента" + +msgid "Cement Slab" +msgstr "Плита из цемента" + +msgid "Pavement Stair" +msgstr "Ступенька из мостовой" + +msgid "Pavement Slab" +msgstr "Плита из мостовой" + +msgid "Basalt Stair" +msgstr "Базальтовая ступенька" + +msgid "Basalt Slab" +msgstr "Базальтовая плита" + +msgid "Pumice Stair" +msgstr "Ступенька из пемзы" + +msgid "Pumice Slab" +msgstr "Плита из пемзы" + +msgid "Rainbow Block Stair" +msgstr "Ступенька из радужного блока" + +msgid "Rainbow Block Slab" +msgstr "Плита из радужного блока" + +msgid "Cement Pickaxe" +msgstr "Кирка из цемента" + +msgid "Cement Shovel" +msgstr "Лопата из цемента" + +msgid "Cement Axe" +msgstr "Топор из цемента" + +msgid "Cement Sword" +msgstr "Меч из цемента" + +msgid "Evil Pickaxe" +msgstr "Кирка зла" + +msgid "Evil Shovel" +msgstr "Лопата зла" + +msgid "Evil Axe" +msgstr "Топор зла" + +msgid "Evil Sword" +msgstr "Меч зла" + +msgid "Wet Cement" +msgstr "Мокрый цемент" + +msgid "Evil Stick" +msgstr "Злая палка" + +msgid "Obsidian" +msgstr "Обсидиан" + +msgid "Steel Fence" +msgstr "Стальной забор" + +msgid "Gloopblocks Loaded!" +msgstr "Gloopblocks загружен!" + diff --git a/mods/gloopblocks/locale/template.pot b/mods/gloopblocks/locale/template.pot new file mode 100644 index 00000000..fbea21b8 --- /dev/null +++ b/mods/gloopblocks/locale/template.pot @@ -0,0 +1,226 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-05-14 06:45+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" + +#: init.lua +msgid "Diagonal Rainbow Block" +msgstr "" + +#: init.lua +msgid "Horizontal Rainbow Block" +msgstr "" + +#: init.lua +msgid "Cement" +msgstr "" + +#: init.lua +msgid "Evil Block" +msgstr "" + +#: init.lua +msgid "Basalt" +msgstr "" + +#: init.lua +msgid "Pumice" +msgstr "" + +#: init.lua +msgid "Pavement" +msgstr "" + +#: init.lua +msgid "Oerkki Block" +msgstr "" + +#: init.lua +msgid "Mossy Stone Brick" +msgstr "" + +#: init.lua +msgid "Mossy Stone" +msgstr "" + +#: init.lua +msgid "Cobblestone Road Bed" +msgstr "" + +#: init.lua +msgid "Mossy Cobblestone Road Bed" +msgstr "" + +#: init.lua +msgid "Wooden Scaffold" +msgstr "" + +#: init.lua +msgid "Cobblestone Roadbed" +msgstr "" + +#: init.lua +msgid "Mossy Cobblestone Roadbed" +msgstr "" + +#: init.lua +msgid "Rainbow Block" +msgstr "" + +#: init.lua +msgid "Glow Crystal" +msgstr "" + +#: init.lua +msgid "Glow Emerald" +msgstr "" + +#: init.lua +msgid "Glow Mese" +msgstr "" + +#: init.lua +msgid "Mossy Stone Stair" +msgstr "" + +#: init.lua +msgid "Mossy Stone Slab" +msgstr "" + +#: init.lua +msgid "Mossy Cobble Stair" +msgstr "" + +#: init.lua +msgid "Mossy Cobble Slab" +msgstr "" + +#: init.lua +msgid "Mossy Stone Brick Stair" +msgstr "" + +#: init.lua +msgid "Mossy Stone Brick Slab" +msgstr "" + +#: init.lua +msgid "Cobble Roadbed Stair" +msgstr "" + +#: init.lua +msgid "Cobble Roadbed Slab" +msgstr "" + +#: init.lua +msgid "Mossy Cobble Roadbed Stair" +msgstr "" + +#: init.lua +msgid "Mossy Cobble Roadbed Slab" +msgstr "" + +#: init.lua +msgid "Cement Stair" +msgstr "" + +#: init.lua +msgid "Cement Slab" +msgstr "" + +#: init.lua +msgid "Pavement Stair" +msgstr "" + +#: init.lua +msgid "Pavement Slab" +msgstr "" + +#: init.lua +msgid "Basalt Stair" +msgstr "" + +#: init.lua +msgid "Basalt Slab" +msgstr "" + +#: init.lua +msgid "Pumice Stair" +msgstr "" + +#: init.lua +msgid "Pumice Slab" +msgstr "" + +#: init.lua +msgid "Rainbow Block Stair" +msgstr "" + +#: init.lua +msgid "Rainbow Block Slab" +msgstr "" + +#: init.lua +msgid "Cement Pickaxe" +msgstr "" + +#: init.lua +msgid "Cement Shovel" +msgstr "" + +#: init.lua +msgid "Cement Axe" +msgstr "" + +#: init.lua +msgid "Cement Sword" +msgstr "" + +#: init.lua +msgid "Evil Pickaxe" +msgstr "" + +#: init.lua +msgid "Evil Shovel" +msgstr "" + +#: init.lua +msgid "Evil Axe" +msgstr "" + +#: init.lua +msgid "Evil Sword" +msgstr "" + +#: init.lua +msgid "Wet Cement" +msgstr "" + +#: init.lua +msgid "Evil Stick" +msgstr "" + +#: init.lua +msgid "Obsidian" +msgstr "" + +#: init.lua +msgid "Steel Fence" +msgstr "" + +#: init.lua +msgid "Gloopblocks Loaded!" +msgstr "" diff --git a/mods/gloopblocks/mod.conf b/mods/gloopblocks/mod.conf new file mode 100644 index 00000000..a59f835f --- /dev/null +++ b/mods/gloopblocks/mod.conf @@ -0,0 +1,2 @@ +name = gloopblocks +min_minetest_version = 5.2.0 diff --git a/mods/gloopblocks/screenshot.png b/mods/gloopblocks/screenshot.png new file mode 100644 index 00000000..edec75a1 Binary files /dev/null and b/mods/gloopblocks/screenshot.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_basalt.png b/mods/gloopblocks/textures/gloopblocks_basalt.png new file mode 100644 index 00000000..f849d944 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_basalt.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_cement_axe.png b/mods/gloopblocks/textures/gloopblocks_cement_axe.png new file mode 100644 index 00000000..f0ea8982 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_cement_axe.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_cement_pick.png b/mods/gloopblocks/textures/gloopblocks_cement_pick.png new file mode 100644 index 00000000..43a15516 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_cement_pick.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_cement_shovel.png b/mods/gloopblocks/textures/gloopblocks_cement_shovel.png new file mode 100644 index 00000000..69b11ccd Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_cement_shovel.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_cement_sword.png b/mods/gloopblocks/textures/gloopblocks_cement_sword.png new file mode 100644 index 00000000..faf07108 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_cement_sword.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_cobble_road.png b/mods/gloopblocks/textures/gloopblocks_cobble_road.png new file mode 100644 index 00000000..fef1d7f5 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_cobble_road.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_cobble_road_mossy.png b/mods/gloopblocks/textures/gloopblocks_cobble_road_mossy.png new file mode 100644 index 00000000..22346498 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_cobble_road_mossy.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_dirt_brick_overlay.png b/mods/gloopblocks/textures/gloopblocks_dirt_brick_overlay.png new file mode 100644 index 00000000..2eb70c60 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_dirt_brick_overlay.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_dirt_cobble_mask.png b/mods/gloopblocks/textures/gloopblocks_dirt_cobble_mask.png new file mode 100644 index 00000000..f1b500eb Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_dirt_cobble_mask.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_dirt_stone_mask.png b/mods/gloopblocks/textures/gloopblocks_dirt_stone_mask.png new file mode 100644 index 00000000..9b81c105 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_dirt_stone_mask.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_evil_axe.png b/mods/gloopblocks/textures/gloopblocks_evil_axe.png new file mode 100644 index 00000000..8d3a4f3f Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_evil_axe.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_evil_block.png b/mods/gloopblocks/textures/gloopblocks_evil_block.png new file mode 100644 index 00000000..4f3fa195 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_evil_block.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_evil_pick.png b/mods/gloopblocks/textures/gloopblocks_evil_pick.png new file mode 100644 index 00000000..73c77a90 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_evil_pick.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_evil_shovel.png b/mods/gloopblocks/textures/gloopblocks_evil_shovel.png new file mode 100644 index 00000000..1eeafe98 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_evil_shovel.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_evil_stick.png b/mods/gloopblocks/textures/gloopblocks_evil_stick.png new file mode 100644 index 00000000..025b4850 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_evil_stick.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_evil_sword.png b/mods/gloopblocks/textures/gloopblocks_evil_sword.png new file mode 100644 index 00000000..398284cc Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_evil_sword.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_ladder_mask.png b/mods/gloopblocks/textures/gloopblocks_ladder_mask.png new file mode 100644 index 00000000..94fbd163 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_ladder_mask.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_ladder_overlay.png b/mods/gloopblocks/textures/gloopblocks_ladder_overlay.png new file mode 100644 index 00000000..976713d1 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_ladder_overlay.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_oerkkiblock_front.png b/mods/gloopblocks/textures/gloopblocks_oerkkiblock_front.png new file mode 100644 index 00000000..149e38da Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_oerkkiblock_front.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_oerkkiblock_sides.png b/mods/gloopblocks/textures/gloopblocks_oerkkiblock_sides.png new file mode 100644 index 00000000..f3e3061c Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_oerkkiblock_sides.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_oerkkiblock_tb.png b/mods/gloopblocks/textures/gloopblocks_oerkkiblock_tb.png new file mode 100644 index 00000000..2ea3cec6 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_oerkkiblock_tb.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_pavement.png b/mods/gloopblocks/textures/gloopblocks_pavement.png new file mode 100644 index 00000000..88813966 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_pavement.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_pumice.png b/mods/gloopblocks/textures/gloopblocks_pumice.png new file mode 100644 index 00000000..5dd5c342 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_pumice.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_rainbow_block.png b/mods/gloopblocks/textures/gloopblocks_rainbow_block.png new file mode 100644 index 00000000..3dae3ff5 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_rainbow_block.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_rainbow_horizontal.png b/mods/gloopblocks/textures/gloopblocks_rainbow_horizontal.png new file mode 100644 index 00000000..685a22cc Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_rainbow_horizontal.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_scaffold.png b/mods/gloopblocks/textures/gloopblocks_scaffold.png new file mode 100644 index 00000000..e546432e Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_scaffold.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_stone_brick_mossy.png b/mods/gloopblocks/textures/gloopblocks_stone_brick_mossy.png new file mode 100644 index 00000000..96196039 Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_stone_brick_mossy.png differ diff --git a/mods/gloopblocks/textures/gloopblocks_stone_mossy.png b/mods/gloopblocks/textures/gloopblocks_stone_mossy.png new file mode 100644 index 00000000..5903fe3b Binary files /dev/null and b/mods/gloopblocks/textures/gloopblocks_stone_mossy.png differ diff --git a/mods/hiking/LICENSE b/mods/hiking/LICENSE new file mode 100644 index 00000000..6ca207ef --- /dev/null +++ b/mods/hiking/LICENSE @@ -0,0 +1,122 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer 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, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + diff --git a/mods/hiking/README.mkd b/mods/hiking/README.mkd new file mode 100644 index 00000000..af419bbd --- /dev/null +++ b/mods/hiking/README.mkd @@ -0,0 +1,236 @@ +Hiking signs are common where I come from Missing them in minetest. +Not any more! :-) + +Signs are applied to rocks, tree trunks, walls. And where there are no objects +to apply them to, often poles are used to mark the path. (Very useful in +winter.) There are four common colours used: red, blue, yellow and green. Red +and blue are mostly used for longer tracks, while yellow and green for local +ones or to connect blues and reds. + + +Signs: + +To craft a sign apply this simple recipe: + + white dye + colour dye + white dye + +To craft 6 arrows add more of the same colour dye as in: + + sign sign + sign sign more dye + sign sign + +and: + + sign sign + more dye sign sign + sign sign + +To craft 2 end signs: + +sign sign + +Three directional signs of the same colour can be recycled back to basic +signs when crafting together with a white dye. + + +Poles: + +To craft a sign that can be put on a pole, craft: + + sign + sign + +for a thick pole (cobblestone wall) or for a thin pole (wooden fence) craft: + + sign + sign + sign + +Then put the result onto the pole and it attaches. +This works only for non-directional signs. + + +Sign variants: + +Educational path + + sign + sign + +Local route + + sign sign + sign + +Branch towards a castle + + sign + sign sign + +Branch towards a touristic curiosity + + sign + sign sign sign + +Branch towards a peak + + sign + sign + sign sign sign + +Branch towards a spring + + sign sign sign + sign + +Each variant can be recycled to basic signs. + + +Describe: + +Oh, and by the way, right clicking the sign one can add a path id. Yes, hiking +trails have an id here. + +Privileges: + +If you use this mod on a server, only players with the "hiking" privilege will +be able to place or destroy the signs. This is useful so you don't need to +create tiny areas around them. + +In singleplayer, you will get this privilege automatically. + +-- Martian + + +License: +Sourcecode: CC0 (see below) +Graphics: CC0 (see below) + +See also: +http://minetest.net/ + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer 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, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + diff --git a/mods/hiking/depends.txt b/mods/hiking/depends.txt new file mode 100644 index 00000000..2717befb --- /dev/null +++ b/mods/hiking/depends.txt @@ -0,0 +1,2 @@ +default +dye diff --git a/mods/hiking/init.lua b/mods/hiking/init.lua new file mode 100644 index 00000000..d80f5ef9 --- /dev/null +++ b/mods/hiking/init.lua @@ -0,0 +1,337 @@ +--Hume2's Hiking mod + +hiking = {} + +hiking.base_material = "dye:white" + +--You can add another colours here. +hiking.colours = { + {name = "red", colour = "FF0000", material = "dye:red"}, + {name = "blue", colour = "0000FF", material = "dye:blue"}, + {name = "green", colour = "00C000", material = "dye:green"}, + {name = "yellow", colour = "FFFF00", material = "dye:yellow"}, + --Uncomment this line to add Polish black signs + --{name = "black", colour = "000000", material = "dye:black"} +} + +------------------------------------------------------------------------------------ + +minetest.register_privilege("hiking", { + description = "Allows player to place and remove hiking signs and nodes right next to hiking signs.", + give_to_singleplayer = true, +}); + +hiking.sign_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}, +} + +hiking.basic_properties = { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = hiking.sign_box, + groups = {snappy=1, oddly_breakable_by_hand=2, attached_node=1, nostomp=1, hiking=1}, + legacy_wallmounted = true, + on_place = function(itemstack, placer, pointed_thing) + local name = placer:get_player_name() + if not name then + return + end + if minetest.check_player_privs(name, {protection_bypass = true}) or minetest.check_player_privs(name, {hiking = true}) then + return minetest.item_place(itemstack, placer, pointed_thing) + else + minetest.chat_send_player(name, "Missing privilege: hiking") + return itemstack + end + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, +} + +local function merge(a, b) + local c = {} + for k, v in pairs(a) do + c[k] = v + end + for k, v in pairs(b) do + c[k] = v + end + return c +end + +local function firstToUpper(str) + return (str:gsub("^%l", string.upper)) +end + +function hiking.get_texture(colour, style) + return "((hiking_white.png^hiking_noise.png)^[mask:hiking_" .. style.id .. "_white.png)^(((hiking_white.png^[colorize:#" .. colour.colour .. ")^hiking_noise.png)^[mask:hiking_" .. style.id .. "_colour.png)" +end + +function hiking.register_sign(colour, style, direction) + local inv = hiking.get_texture(colour, style) + local inv2 = "hiking_sign_pole.png^" .. inv + local desc = firstToUpper(colour.name) .. " " .. style.title + local my_groups = {snappy=1, oddly_breakable_by_hand=2, attached_node=1, nostomp=1, hiking=1} + if (direction ~= nil) then + desc = desc .. " " .. direction + my_groups["hiking_turn_" .. colour.name] = 1 + end + + minetest.register_node("hiking:" .. style.id .. colour.name, merge(hiking.basic_properties, { + description = desc, + tiles = {inv}, + inventory_image = inv, + wield_image = inv, + groups = my_groups + })) +end + +function hiking.register_pole(colour, style) + local inv = hiking.get_texture(colour, style) + local desc = firstToUpper(colour.name) .. " " .. style.title + local base_id = "hiking:" .. style.id .. colour.name + local inv1 = "hiking_sign_pole.png^" .. inv + local inv2 = "hiking_sign_pole_thin.png^" .. inv + + minetest.register_node("hiking:pole_" .. style.id .. colour.name, merge(hiking.basic_properties, { + description = desc .. " on Pillar", + tiles = {inv}, + inventory_image = inv1, + wield_image = inv1, + drawtype = "mesh", + mesh = "hiking_pole.obj", + selection_box = hiking.sign_box + })) + + minetest.register_node("hiking:pole2_" .. style.id .. colour.name, merge(hiking.basic_properties, { + description = desc .. " on Pole", + tiles = {inv}, + inventory_image = inv2, + wield_image = inv2, + drawtype = "mesh", + mesh = "hiking_pole_thin.obj", + selection_box = hiking.sign_box + })) + + minetest.register_craft({ + output = "hiking:pole_" .. style.id .. colour.name .. " 2", + recipe = {{ base_id }, + { base_id }} + }) + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = { "hiking:pole_" .. style.id .. colour.name} + }) + + minetest.register_craft({ + output = "hiking:pole2_" .. style.id .. colour.name .. " 3", + recipe = {{ base_id }, + { base_id }, + { base_id }} + }) + + minetest.register_craft({ + output = "hiking:" .. style.id .. colour.name, + type = "shapeless", + recipe = { "hiking:pole2_" .. style.id .. colour.name} + }) +end + +function hiking.register_sign_lr(colour, style) + hiking.register_sign(colour, style, nil) + hiking.register_sign(colour, {id = style.id .. "_left", title = style.title}, "Left") + hiking.register_sign(colour, {id = style.id .. "_right", title = style.title}, "Right") + hiking.register_pole(colour, style) + + local base_sign = "hiking:" .. style.id .. colour.name + local left_sign = "hiking:" .. style.id .. "_left" .. colour.name + local right_sign = "hiking:" .. style.id .. "_right" .. colour.name + + minetest.register_craft({ + output = right_sign .. " 6", + recipe = {{ base_sign, base_sign, "" }, + { base_sign, base_sign, colour.material }, + { base_sign, base_sign, "" }} + }) + + minetest.register_craft({ + output = left_sign .. " 6", + recipe = {{ "", base_sign, base_sign }, + { colour.material, base_sign, base_sign }, + { "", base_sign, base_sign }} + }) + +end + +------------------------------------- + +for _, colour in pairs(hiking.colours) do + hiking.register_sign_lr(colour, {id = "sign", title = "Hiking Sign"}) + hiking.register_sign(colour, {id = "end", title = "End Sign"}, nil) + hiking.register_sign_lr(colour, {id = "local", title = "Local Hiking Sign"}) + hiking.register_sign_lr(colour, {id = "educational", title = "Educational Path"}) + hiking.register_sign_lr(colour, {id = "castle", title = "Castle Branch"}) + hiking.register_sign_lr(colour, {id = "curiosity", title = "Curiosity Branch"}) + hiking.register_sign_lr(colour, {id = "peak", title = "Peak Branch"}) + hiking.register_sign_lr(colour, {id = "spring", title = "Spring Branch"}) + + local base_id = "hiking:sign" .. colour.name + + minetest.register_craft({ + output = base_id .. " 18", + recipe = {{ hiking.base_material }, + { colour.material }, + { hiking.base_material }} + }) + + minetest.register_craft({ + output = "hiking:end" .. colour.name .. " 2", + recipe = {{ base_id, base_id }} + }) + + minetest.register_craft({ + output = "hiking:local" .. colour.name .. " 3", + recipe = {{ base_id, base_id }, + { "", base_id }} + }) + + minetest.register_craft({ + output = "hiking:educational" .. colour.name .. " 2", + recipe = {{ base_id, "" }, + { "", base_id }} + }) + + minetest.register_craft({ + output = "hiking:castle" .. colour.name .. " 3", + recipe = {{ base_id, "" }, + { base_id, base_id }} + }) + + minetest.register_craft({ + output = "hiking:curiosity" .. colour.name .. " 4", + recipe = {{ "", base_id, "" }, + { base_id, base_id, base_id }} + }) + + minetest.register_craft({ + output = "hiking:peak" .. colour.name .. " 5", + recipe = {{ "", base_id, "" }, + { "", base_id, ""}, + { base_id, base_id, base_id }} + }) + + minetest.register_craft({ + output = "hiking:spring" .. colour.name .. " 4", + recipe = {{ base_id, base_id, base_id }, + { "", base_id, "" }} + }) + + --recycling + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = {"hiking:end" .. colour.name} + }) + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = {"hiking:local" .. colour.name} + }) + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = {"hiking:educational" .. colour.name} + }) + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = {"hiking:castle" .. colour.name} + }) + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = {"hiking:curiosity" .. colour.name} + }) + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = {"hiking:peak" .. colour.name} + }) + + minetest.register_craft({ + output = base_id, + type = "shapeless", + recipe = {"hiking:spring" .. colour.name} + }) + + local gr = "group:hiking_turn_" .. colour.name + + minetest.register_craft({ + output = base_id .. " 12", + type = "shapeless", + recipe = {gr, gr, gr, hiking.base_material} + }) +end + +local hiking_directions = { + [0] = {x=0, y=-1, z=0}, + [1] = {x=0, y=1, z=0}, + [2] = {x=-1, y=0, z=0}, + [3] = {x=1, y=0, z=0}, + [4] = {x=0, y=0, z=-1}, + [5] = {x=0, y=0, z=1}, +} +local old_is_protected = minetest.is_protected + +minetest.is_protected = function(pos, pname) + if old_is_protected(pos, pname) then + return true + end + + if minetest.check_player_privs(pname, {protection_bypass = true}) or minetest.check_player_privs(pname, {hiking = true}) then + return false + end + + local node = minetest.get_node(pos) + if minetest.get_item_group(node.name, "hiking") > 0 then + return true + end + + for p2, dir in pairs(hiking_directions) do + node = minetest.get_node(vector.add(pos, dir)) + if minetest.get_item_group(node.name, "hiking") > 0 and node.param2 == p2 then + return true + end + end + + return false +end diff --git a/mods/hiking/models/hiking_pole.obj b/mods/hiking/models/hiking_pole.obj new file mode 100644 index 00000000..f0fc375c --- /dev/null +++ b/mods/hiking/models/hiking_pole.obj @@ -0,0 +1,29 @@ +o hiking_pole.obj +v -0.5 -1.251 -0.5 +v 0.5 -1.251 -0.5 +v 0.5 -1.251 0.5 +v -0.5 -1.251 0.5 +v 0.251 -1.5 -0.5 +v 0.251 -0.5 -0.5 +v 0.251 -0.5 0.5 +v 0.251 -1.5 0.5 +v 0.5 -0.749 -0.5 +v -0.5 -0.749 -0.5 +v -0.5 -0.749 0.5 +v 0.5 -0.749 0.5 +v -0.251 -0.5 -0.5 +v -0.251 -1.5 -0.5 +v -0.251 -1.5 0.5 +v -0.251 -0.5 0.5 +vt 0 0 +vt 1 0 +vt 1 1 +vt 0 1 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 0 -1 0 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/1/2 6/2/2 7/3/2 8/4/2 +f 9/1/3 10/2/3 11/3/3 12/4/3 +f 13/1/4 14/2/4 15/3/4 16/4/4 diff --git a/mods/hiking/models/hiking_pole_thin.obj b/mods/hiking/models/hiking_pole_thin.obj new file mode 100644 index 00000000..5666d625 --- /dev/null +++ b/mods/hiking/models/hiking_pole_thin.obj @@ -0,0 +1,29 @@ +o hiking_pole.obj +v -0.25 -1.1255 -0.5 +v 0.25 -1.1255 -0.5 +v 0.25 -1.1255 0.5 +v -0.25 -1.1255 0.5 +v 0.1255 -1.25 -0.5 +v 0.1255 -0.75 -0.5 +v 0.1255 -0.75 0.5 +v 0.1255 -1.25 0.5 +v 0.25 -0.8745 -0.5 +v -0.25 -0.8745 -0.5 +v -0.25 -0.8745 0.5 +v 0.25 -0.8745 0.5 +v -0.1255 -0.75 -0.5 +v -0.1255 -1.25 -0.5 +v -0.1255 -1.25 0.5 +v -0.1255 -0.75 0.5 +vt 0 0 +vt 1 0 +vt 1 1 +vt 0 1 +vn -1 0 0 +vn 0 1 0 +vn 1 0 0 +vn 0 -1 0 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/1/2 6/2/2 7/3/2 8/4/2 +f 9/1/3 10/2/3 11/3/3 12/4/3 +f 13/1/4 14/2/4 15/3/4 16/4/4 diff --git a/mods/hiking/textures/hiking_castle_colour.png b/mods/hiking/textures/hiking_castle_colour.png new file mode 100644 index 00000000..dd13dca3 Binary files /dev/null and b/mods/hiking/textures/hiking_castle_colour.png differ diff --git a/mods/hiking/textures/hiking_castle_left_colour.png b/mods/hiking/textures/hiking_castle_left_colour.png new file mode 100644 index 00000000..0b74babd Binary files /dev/null and b/mods/hiking/textures/hiking_castle_left_colour.png differ diff --git a/mods/hiking/textures/hiking_castle_left_white.png b/mods/hiking/textures/hiking_castle_left_white.png new file mode 100644 index 00000000..59334691 Binary files /dev/null and b/mods/hiking/textures/hiking_castle_left_white.png differ diff --git a/mods/hiking/textures/hiking_castle_right_colour.png b/mods/hiking/textures/hiking_castle_right_colour.png new file mode 100644 index 00000000..8ac71b57 Binary files /dev/null and b/mods/hiking/textures/hiking_castle_right_colour.png differ diff --git a/mods/hiking/textures/hiking_castle_right_white.png b/mods/hiking/textures/hiking_castle_right_white.png new file mode 100644 index 00000000..94ad696d Binary files /dev/null and b/mods/hiking/textures/hiking_castle_right_white.png differ diff --git a/mods/hiking/textures/hiking_castle_white.png b/mods/hiking/textures/hiking_castle_white.png new file mode 100644 index 00000000..5162e664 Binary files /dev/null and b/mods/hiking/textures/hiking_castle_white.png differ diff --git a/mods/hiking/textures/hiking_curiosity_colour.png b/mods/hiking/textures/hiking_curiosity_colour.png new file mode 100644 index 00000000..d1e12458 Binary files /dev/null and b/mods/hiking/textures/hiking_curiosity_colour.png differ diff --git a/mods/hiking/textures/hiking_curiosity_left_colour.png b/mods/hiking/textures/hiking_curiosity_left_colour.png new file mode 100644 index 00000000..7f841b2d Binary files /dev/null and b/mods/hiking/textures/hiking_curiosity_left_colour.png differ diff --git a/mods/hiking/textures/hiking_curiosity_left_white.png b/mods/hiking/textures/hiking_curiosity_left_white.png new file mode 100644 index 00000000..97df1c55 Binary files /dev/null and b/mods/hiking/textures/hiking_curiosity_left_white.png differ diff --git a/mods/hiking/textures/hiking_curiosity_right_colour.png b/mods/hiking/textures/hiking_curiosity_right_colour.png new file mode 100644 index 00000000..af91a88c Binary files /dev/null and b/mods/hiking/textures/hiking_curiosity_right_colour.png differ diff --git a/mods/hiking/textures/hiking_curiosity_right_white.png b/mods/hiking/textures/hiking_curiosity_right_white.png new file mode 100644 index 00000000..9ef5b6fb Binary files /dev/null and b/mods/hiking/textures/hiking_curiosity_right_white.png differ diff --git a/mods/hiking/textures/hiking_curiosity_white.png b/mods/hiking/textures/hiking_curiosity_white.png new file mode 100644 index 00000000..2a396c5c Binary files /dev/null and b/mods/hiking/textures/hiking_curiosity_white.png differ diff --git a/mods/hiking/textures/hiking_educational_colour.png b/mods/hiking/textures/hiking_educational_colour.png new file mode 100644 index 00000000..15e7bcab Binary files /dev/null and b/mods/hiking/textures/hiking_educational_colour.png differ diff --git a/mods/hiking/textures/hiking_educational_left_colour.png b/mods/hiking/textures/hiking_educational_left_colour.png new file mode 100644 index 00000000..f7fdd0ba Binary files /dev/null and b/mods/hiking/textures/hiking_educational_left_colour.png differ diff --git a/mods/hiking/textures/hiking_educational_left_white.png b/mods/hiking/textures/hiking_educational_left_white.png new file mode 100644 index 00000000..c039ad91 Binary files /dev/null and b/mods/hiking/textures/hiking_educational_left_white.png differ diff --git a/mods/hiking/textures/hiking_educational_right_colour.png b/mods/hiking/textures/hiking_educational_right_colour.png new file mode 100644 index 00000000..99137d48 Binary files /dev/null and b/mods/hiking/textures/hiking_educational_right_colour.png differ diff --git a/mods/hiking/textures/hiking_educational_right_white.png b/mods/hiking/textures/hiking_educational_right_white.png new file mode 100644 index 00000000..0f454ac8 Binary files /dev/null and b/mods/hiking/textures/hiking_educational_right_white.png differ diff --git a/mods/hiking/textures/hiking_educational_white.png b/mods/hiking/textures/hiking_educational_white.png new file mode 100644 index 00000000..bdbbc944 Binary files /dev/null and b/mods/hiking/textures/hiking_educational_white.png differ diff --git a/mods/hiking/textures/hiking_end_colour.png b/mods/hiking/textures/hiking_end_colour.png new file mode 100644 index 00000000..4466c3d9 Binary files /dev/null and b/mods/hiking/textures/hiking_end_colour.png differ diff --git a/mods/hiking/textures/hiking_end_white.png b/mods/hiking/textures/hiking_end_white.png new file mode 100644 index 00000000..0e49dbb2 Binary files /dev/null and b/mods/hiking/textures/hiking_end_white.png differ diff --git a/mods/hiking/textures/hiking_local_colour.png b/mods/hiking/textures/hiking_local_colour.png new file mode 100644 index 00000000..32bb89c1 Binary files /dev/null and b/mods/hiking/textures/hiking_local_colour.png differ diff --git a/mods/hiking/textures/hiking_local_left_colour.png b/mods/hiking/textures/hiking_local_left_colour.png new file mode 100644 index 00000000..dcfe1486 Binary files /dev/null and b/mods/hiking/textures/hiking_local_left_colour.png differ diff --git a/mods/hiking/textures/hiking_local_left_white.png b/mods/hiking/textures/hiking_local_left_white.png new file mode 100644 index 00000000..169f9dda Binary files /dev/null and b/mods/hiking/textures/hiking_local_left_white.png differ diff --git a/mods/hiking/textures/hiking_local_right_colour.png b/mods/hiking/textures/hiking_local_right_colour.png new file mode 100644 index 00000000..5d5124ff Binary files /dev/null and b/mods/hiking/textures/hiking_local_right_colour.png differ diff --git a/mods/hiking/textures/hiking_local_right_white.png b/mods/hiking/textures/hiking_local_right_white.png new file mode 100644 index 00000000..940b7051 Binary files /dev/null and b/mods/hiking/textures/hiking_local_right_white.png differ diff --git a/mods/hiking/textures/hiking_local_white.png b/mods/hiking/textures/hiking_local_white.png new file mode 100644 index 00000000..4e30c4de Binary files /dev/null and b/mods/hiking/textures/hiking_local_white.png differ diff --git a/mods/hiking/textures/hiking_noise.png b/mods/hiking/textures/hiking_noise.png new file mode 100644 index 00000000..82854f68 Binary files /dev/null and b/mods/hiking/textures/hiking_noise.png differ diff --git a/mods/hiking/textures/hiking_peak_colour.png b/mods/hiking/textures/hiking_peak_colour.png new file mode 100644 index 00000000..244ffbcd Binary files /dev/null and b/mods/hiking/textures/hiking_peak_colour.png differ diff --git a/mods/hiking/textures/hiking_peak_left_colour.png b/mods/hiking/textures/hiking_peak_left_colour.png new file mode 100644 index 00000000..629f93e8 Binary files /dev/null and b/mods/hiking/textures/hiking_peak_left_colour.png differ diff --git a/mods/hiking/textures/hiking_peak_left_white.png b/mods/hiking/textures/hiking_peak_left_white.png new file mode 100644 index 00000000..5abdea65 Binary files /dev/null and b/mods/hiking/textures/hiking_peak_left_white.png differ diff --git a/mods/hiking/textures/hiking_peak_right_colour.png b/mods/hiking/textures/hiking_peak_right_colour.png new file mode 100644 index 00000000..69d33a63 Binary files /dev/null and b/mods/hiking/textures/hiking_peak_right_colour.png differ diff --git a/mods/hiking/textures/hiking_peak_right_white.png b/mods/hiking/textures/hiking_peak_right_white.png new file mode 100644 index 00000000..1a099f8d Binary files /dev/null and b/mods/hiking/textures/hiking_peak_right_white.png differ diff --git a/mods/hiking/textures/hiking_peak_white.png b/mods/hiking/textures/hiking_peak_white.png new file mode 100644 index 00000000..e7540f62 Binary files /dev/null and b/mods/hiking/textures/hiking_peak_white.png differ diff --git a/mods/hiking/textures/hiking_sign_colour.png b/mods/hiking/textures/hiking_sign_colour.png new file mode 100644 index 00000000..40473e3f Binary files /dev/null and b/mods/hiking/textures/hiking_sign_colour.png differ diff --git a/mods/hiking/textures/hiking_sign_left_colour.png b/mods/hiking/textures/hiking_sign_left_colour.png new file mode 100644 index 00000000..413a71af Binary files /dev/null and b/mods/hiking/textures/hiking_sign_left_colour.png differ diff --git a/mods/hiking/textures/hiking_sign_left_white.png b/mods/hiking/textures/hiking_sign_left_white.png new file mode 100644 index 00000000..6a65eb7d Binary files /dev/null and b/mods/hiking/textures/hiking_sign_left_white.png differ diff --git a/mods/hiking/textures/hiking_sign_pole.png b/mods/hiking/textures/hiking_sign_pole.png new file mode 100644 index 00000000..e6d468a7 Binary files /dev/null and b/mods/hiking/textures/hiking_sign_pole.png differ diff --git a/mods/hiking/textures/hiking_sign_pole_thin.png b/mods/hiking/textures/hiking_sign_pole_thin.png new file mode 100644 index 00000000..24e0500f Binary files /dev/null and b/mods/hiking/textures/hiking_sign_pole_thin.png differ diff --git a/mods/hiking/textures/hiking_sign_right_colour.png b/mods/hiking/textures/hiking_sign_right_colour.png new file mode 100644 index 00000000..439589e5 Binary files /dev/null and b/mods/hiking/textures/hiking_sign_right_colour.png differ diff --git a/mods/hiking/textures/hiking_sign_right_white.png b/mods/hiking/textures/hiking_sign_right_white.png new file mode 100644 index 00000000..2b8b0c10 Binary files /dev/null and b/mods/hiking/textures/hiking_sign_right_white.png differ diff --git a/mods/hiking/textures/hiking_sign_white.png b/mods/hiking/textures/hiking_sign_white.png new file mode 100644 index 00000000..3ff01df3 Binary files /dev/null and b/mods/hiking/textures/hiking_sign_white.png differ diff --git a/mods/hiking/textures/hiking_spring_colour.png b/mods/hiking/textures/hiking_spring_colour.png new file mode 100644 index 00000000..73db0a85 Binary files /dev/null and b/mods/hiking/textures/hiking_spring_colour.png differ diff --git a/mods/hiking/textures/hiking_spring_left_colour.png b/mods/hiking/textures/hiking_spring_left_colour.png new file mode 100644 index 00000000..bea3d075 Binary files /dev/null and b/mods/hiking/textures/hiking_spring_left_colour.png differ diff --git a/mods/hiking/textures/hiking_spring_left_white.png b/mods/hiking/textures/hiking_spring_left_white.png new file mode 100644 index 00000000..c93a39c2 Binary files /dev/null and b/mods/hiking/textures/hiking_spring_left_white.png differ diff --git a/mods/hiking/textures/hiking_spring_right_colour.png b/mods/hiking/textures/hiking_spring_right_colour.png new file mode 100644 index 00000000..0d6daf4c Binary files /dev/null and b/mods/hiking/textures/hiking_spring_right_colour.png differ diff --git a/mods/hiking/textures/hiking_spring_right_white.png b/mods/hiking/textures/hiking_spring_right_white.png new file mode 100644 index 00000000..2cca3a8a Binary files /dev/null and b/mods/hiking/textures/hiking_spring_right_white.png differ diff --git a/mods/hiking/textures/hiking_spring_white.png b/mods/hiking/textures/hiking_spring_white.png new file mode 100644 index 00000000..976d1a65 Binary files /dev/null and b/mods/hiking/textures/hiking_spring_white.png differ diff --git a/mods/hiking/textures/hiking_white.png b/mods/hiking/textures/hiking_white.png new file mode 100644 index 00000000..b8c0a91e Binary files /dev/null and b/mods/hiking/textures/hiking_white.png differ diff --git a/mods/ilights/LICENSE b/mods/ilights/LICENSE new file mode 100644 index 00000000..c5885ae9 --- /dev/null +++ b/mods/ilights/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/ilights/README.md b/mods/ilights/README.md new file mode 100644 index 00000000..6ee54459 --- /dev/null +++ b/mods/ilights/README.md @@ -0,0 +1,4 @@ +ilights +======= + +Repo for ilights mod diff --git a/mods/ilights/depends.txt b/mods/ilights/depends.txt new file mode 100644 index 00000000..fe6a422a --- /dev/null +++ b/mods/ilights/depends.txt @@ -0,0 +1,5 @@ +default +unifieddyes +intllib? +mesecons? +digilines? diff --git a/mods/ilights/description.txt b/mods/ilights/description.txt new file mode 100644 index 00000000..18f81dbf --- /dev/null +++ b/mods/ilights/description.txt @@ -0,0 +1 @@ +Adds various lights. diff --git a/mods/ilights/init.lua b/mods/ilights/init.lua new file mode 100644 index 00000000..fe75d4c8 --- /dev/null +++ b/mods/ilights/init.lua @@ -0,0 +1,299 @@ +-- Industrial lights mod by DanDuncombe +-- rewritten by VanessaE to use param2 colorization + +ilights = {} + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if minetest.global_exists("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + S = intllib.make_gettext_pair() + else + -- Old method using text files. + S = intllib.Getter() + end +else + S = function(s) return s end +end + +if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then + ilights.expect_infinite_stacks = false +else + ilights.expect_infinite_stacks = true +end + +ilights.modpath = minetest.get_modpath("ilights") + +local function is_protected(pos, clicker) + if minetest.is_protected(pos, clicker:get_player_name()) then + minetest.record_protection_violation(pos, + clicker:get_player_name()) + return true + end + return false +end + +if minetest.get_modpath("mesecons") then + actions = { + action_off = function(pos, node) + local sep = string.find(node.name, "_", -5) + local onoff = string.sub(node.name, sep + 1) + if minetest.get_meta(pos):get_int("toggled") > 0 then + minetest.swap_node(pos, { + name = string.sub(node.name, 1, sep - 1).."_off", + param2 = node.param2 + }) + end + end, + action_on = function(pos, node) + minetest.get_meta(pos):set_int("toggled", 1) + local sep = string.find(node.name, "_", -5) + local onoff = string.sub(node.name, sep + 1) + minetest.swap_node(pos, { + name = string.sub(node.name, 1, sep - 1).."_on", + param2 = node.param2 + }) + end + } + + ilights.mesecons = { + effector = table.copy(actions) + } + ilights.mesecons.effector.rules = mesecon.rules.wallmounted_get +end + +-- digilines compatibility +-- this one is based on the so-named one in Jeija's digilines mod + +local player_last_clicked = {} + +local digiline_on_punch + +local onoff_tab = { + ["off"] = "off", + ["low"] = "off", + ["med"] = "on", + ["hi"] = "on", + ["max"] = "on", + ["on"] = "on", +} + +if minetest.get_modpath("digilines") then + + local on_digiline_receive_string = function(pos, node, channel, msg) + local meta = minetest.get_meta(pos) + local setchan = meta:get_string("channel") + + if setchan ~= channel then return end + if msg ~= "" and (type(msg) == "string" or type(msg) == "number" ) then + local n = tonumber(msg) + if n then + msg = (n > 3) and "on" or "off" -- same threshold as in homedecor's lights + end + + local light = onoff_tab[msg] + if light then + local basename = string.sub(node.name, 1, string.find(node.name, "_", -5) - 1) + if minetest.registered_nodes[basename.."_"..light] then + minetest.swap_node(pos, {name = basename.."_"..light, param2 = node.param2}) + end + end + end + end + + minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + local pos = player_last_clicked[name] + if pos and formname == "ilights:set_channel" then + if is_protected(pos, player) then return end + if (fields.channel) then + local meta = minetest.get_meta(pos) + meta:set_string("channel", fields.channel) + end + end + end) + + if minetest.get_modpath("mesecons") then + ilights.digilines = { + effector = { + action = on_digiline_receive_string, + }, + wire = { + rules = mesecon.rules.wallmounted_get + } + } + else + ilights.digilines = { + effector = { + action = on_digiline_receive_string, + }, + wire = { + rules = rules_alldir + } + } + end + + function digiline_on_punch(pos, node, puncher, pointed_thing) + if is_protected(pos, puncher) then return end + + if puncher:get_player_control().sneak then + local name = puncher:get_player_name() + player_last_clicked[name] = pos + local meta = minetest.get_meta(pos) + local form = "field[channel;Channel;]" + minetest.show_formspec(name, "ilights:set_channel", form) + end + end +end + +-- turn on/off + +function ilights.toggle_light(pos, node, clicker, itemstack, pointed_thing) + if is_protected(pos, clicker) then return end + local sep = string.find(node.name, "_o", -5) + local onoff = string.sub(node.name, sep + 1) + local newname = string.sub(node.name, 1, sep - 1)..((onoff == "off") and "_on" or "_off") + minetest.swap_node(pos, {name = newname, param2 = node.param2}) +end + +-- The important stuff! + +local lamp_cbox = { + type = "wallmounted", + wall_top = { -11/32, -4/16, -11/32, 11/32, 8/16, 11/32 }, + wall_bottom = { -11/32, -8/16, -11/32, 11/32, 4/16, 11/32 }, + wall_side = { -8/16, -11/32, -11/32, 4/16, 11/32, 11/32 } +} + +for _, onoff in ipairs({"on", "off"}) do + + local light_source = (onoff == "on") and default.LIGHT_MAX or nil + local nici = (onoff == "off") and 1 or nil + + minetest.register_node("ilights:light_"..onoff, { + description = "Industrial Light", + drawtype = "mesh", + mesh = "ilights_lamp.obj", + tiles = { + { name = "ilights_lamp_base.png", color = 0xffffffff }, + { name = "ilights_lamp_cage.png", color = 0xffffffff }, + "ilights_lamp_bulb_"..onoff..".png", + { name = "ilights_lamp_bulb_base.png", color = 0xffffffff }, + "ilights_lamp_lens_"..onoff..".png" + }, + use_texture_alpha = true, + groups = {cracky=3, ud_param2_colorable = 1, not_in_creative_inventory = nici}, + paramtype = "light", + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + light_source = light_source, + selection_box = lamp_cbox, + node_box = lamp_cbox, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) + end, + drop = { + items = { + {items = {"ilights:light_on"}, inherit_color = true }, + } + }, + on_rightclick = ilights.toggle_light, + mesecons = ilights.mesecons, + digiline = ilights.digilines, + on_punch = digiline_on_punch, + on_dig = unifieddyes.on_dig, + }) +end + +minetest.register_alias("ilights:light", "ilights:light_on") + +minetest.register_craft({ + output = "ilights:light_on 3", + recipe = { + { "", "default:steel_ingot", "" }, + { "", "default:glass", "" }, + { "default:steel_ingot", "default:torch", "default:steel_ingot" } + }, +}) + +unifieddyes.register_color_craft({ + output = "ilights:light_on 3", + palette = "wallmounted", + neutral_node = "", + recipe = { + { "", "default:steel_ingot", "" }, + { "", "default:glass", "MAIN_DYE" }, + { "default:steel_ingot", "default:torch", "default:steel_ingot" } + } +}) + +unifieddyes.register_color_craft({ + output = "ilights:light_on", + palette = "wallmounted", + type = "shapeless", + neutral_node = "ilights:light", + recipe = { + "NEUTRAL_NODE", + "MAIN_DYE", + } +}) + +-- convert old static nodes to param2 coloring + +ilights.colors = { + "white", + "grey", + "black", + "red", + "yellow", + "green", + "cyan", + "blue", + "magenta", + "orange", + "violet", + "dark_grey", + "dark_green", + "pink", + "brown" +} + +ilights.old_static_nodes = {} + +for _, i in ipairs (ilights.colors) do + table.insert(ilights.old_static_nodes, "ilights:light_"..i) +end + +minetest.register_lbm({ + name = "ilights:convert", + label = "Convert ilights static nodes to use param2 color", + run_at_every_load = false, + nodenames = ilights.old_static_nodes, + action = function(pos, node) + local name = node.name + local color = string.sub(name, string.find(name, "_") + 1) + local paletteidx = unifieddyes.getpaletteidx("unifieddyes:"..color, "wallmounted") + local old_fdir = math.floor(node.param2 / 4) + local param2 + + if old_fdir == 5 then + new_fdir = 0 + elseif old_fdir == 1 then + new_fdir = 5 + elseif old_fdir == 2 then + new_fdir = 4 + elseif old_fdir == 3 then + new_fdir = 3 + elseif old_fdir == 4 then + new_fdir = 2 + elseif old_fdir == 0 then + new_fdir = 1 + end + param2 = paletteidx + new_fdir + + minetest.set_node(pos, { name = "ilights:light", param2 = param2 }) + local meta = minetest.get_meta(pos) + meta:set_string("dye", "unifieddyes:"..color) + end +}) diff --git a/mods/ilights/mod.conf b/mods/ilights/mod.conf new file mode 100644 index 00000000..f34535b7 --- /dev/null +++ b/mods/ilights/mod.conf @@ -0,0 +1,2 @@ +name = ilights +min_minetest_version = 5.2.0 diff --git a/mods/ilights/models/ilights_lamp.obj b/mods/ilights/models/ilights_lamp.obj new file mode 100644 index 00000000..988c6f69 --- /dev/null +++ b/mods/ilights/models/ilights_lamp.obj @@ -0,0 +1,2287 @@ +# Blender v2.73 (sub 0) OBJ File: 'industrial-light.blend' +# www.blender.org +o cage_Cylinder.004 +v -0.000146 -0.324541 -0.050004 +v -0.019282 -0.324541 -0.046198 +v -0.035504 -0.324541 -0.035358 +v -0.046344 -0.324541 -0.019136 +v -0.050150 -0.324541 -0.000000 +v -0.046344 -0.324541 0.019135 +v -0.035504 -0.324541 0.035358 +v -0.019282 -0.324541 0.046197 +v -0.000146 -0.324541 0.050004 +v 0.018990 -0.324541 0.046197 +v 0.035212 -0.324541 0.035358 +v 0.046052 -0.324541 0.019135 +v 0.049858 -0.324541 -0.000000 +v 0.046052 -0.324541 -0.019136 +v 0.035212 -0.324541 -0.035358 +v 0.018990 -0.324541 -0.046198 +v -0.000146 -0.394724 -0.280733 +v -0.000146 -0.499999 -0.280733 +v -0.107578 -0.394724 -0.259363 +v -0.107578 -0.499999 -0.259363 +v -0.198654 -0.394724 -0.198508 +v -0.198654 -0.499999 -0.198508 +v -0.259509 -0.394724 -0.107432 +v -0.259509 -0.499999 -0.107432 +v -0.280878 -0.394724 -0.000000 +v -0.280878 -0.499999 -0.000000 +v -0.259509 -0.394724 0.107432 +v -0.259509 -0.499999 0.107432 +v -0.198654 -0.394724 0.198508 +v -0.198654 -0.499999 0.198508 +v -0.107578 -0.394724 0.259363 +v -0.107578 -0.499999 0.259363 +v -0.000146 -0.394724 0.280732 +v -0.000146 -0.499999 0.280732 +v 0.107286 -0.394724 0.259363 +v 0.107286 -0.499999 0.259363 +v 0.198362 -0.394724 0.198508 +v 0.198362 -0.499999 0.198508 +v 0.259217 -0.394724 0.107432 +v 0.259217 -0.499999 0.107432 +v 0.280586 -0.394724 -0.000000 +v 0.280586 -0.499999 -0.000000 +v 0.259217 -0.394724 -0.107432 +v 0.259217 -0.499999 -0.107432 +v 0.198362 -0.394724 -0.198508 +v 0.198362 -0.499999 -0.198508 +v 0.107286 -0.394724 -0.259363 +v 0.107286 -0.499999 -0.259363 +v -0.000146 -0.324541 -0.350916 +v -0.000146 -0.394724 -0.350916 +v -0.134436 -0.324541 -0.324204 +v -0.134436 -0.394724 -0.324204 +v -0.248281 -0.324541 -0.248135 +v -0.248281 -0.394724 -0.248135 +v -0.324350 -0.324541 -0.134290 +v -0.324350 -0.394724 -0.134290 +v -0.351062 -0.324541 -0.000000 +v -0.351062 -0.394724 -0.000000 +v -0.324350 -0.324541 0.134290 +v -0.324350 -0.394724 0.134290 +v -0.248281 -0.324541 0.248135 +v -0.248281 -0.394724 0.248135 +v -0.134436 -0.324541 0.324204 +v -0.134436 -0.394724 0.324204 +v -0.000146 -0.324541 0.350916 +v -0.000146 -0.394724 0.350916 +v 0.134144 -0.324541 0.324204 +v 0.134144 -0.394724 0.324204 +v 0.247989 -0.324541 0.248135 +v 0.247989 -0.394724 0.248135 +v 0.324058 -0.324541 0.134290 +v 0.324058 -0.394724 0.134290 +v 0.350770 -0.324541 -0.000000 +v 0.350770 -0.394724 -0.000000 +v 0.324058 -0.324541 -0.134290 +v 0.324058 -0.394724 -0.134290 +v 0.247989 -0.324541 -0.248135 +v 0.247989 -0.394724 -0.248135 +v 0.134144 -0.324541 -0.324204 +v 0.134144 -0.394724 -0.324204 +v -0.000146 -0.499999 -0.000000 +v -0.000146 0.026373 -0.210548 +v -0.000146 -0.324541 -0.210548 +v -0.080719 0.026373 -0.194521 +v -0.080719 -0.324541 -0.194521 +v -0.149025 0.026373 -0.148880 +v -0.149026 -0.324541 -0.148880 +v -0.194666 0.026373 -0.080573 +v -0.194666 -0.324541 -0.080573 +v -0.210693 0.026373 -0.000000 +v -0.210693 -0.324541 -0.000000 +v -0.194666 0.026373 0.080573 +v -0.194666 -0.324541 0.080573 +v -0.149025 0.026373 0.148880 +v -0.149026 -0.324541 0.148879 +v -0.080719 0.026373 0.194520 +v -0.080719 -0.324541 0.194520 +v -0.000146 0.026373 0.210547 +v -0.000146 -0.324541 0.210547 +v 0.080427 0.026373 0.194520 +v 0.080427 -0.324541 0.194520 +v 0.148734 0.026373 0.148880 +v 0.148734 -0.324541 0.148879 +v 0.194375 0.026373 0.080573 +v 0.194375 -0.324541 0.080573 +v 0.210402 0.026373 -0.000000 +v 0.210402 -0.324541 -0.000000 +v 0.194375 0.026373 -0.080573 +v 0.194375 -0.324541 -0.080573 +v 0.148734 0.026373 -0.148880 +v 0.148734 -0.324541 -0.148880 +v 0.080427 0.026373 -0.194521 +v 0.080427 -0.324541 -0.194521 +v -0.000146 0.166739 -0.000000 +v -0.000146 0.145684 -0.119446 +v -0.045856 0.145684 -0.110354 +v -0.084607 0.145684 -0.084461 +v -0.110500 0.145684 -0.045710 +v -0.119592 0.145684 -0.000000 +v -0.110500 0.145684 0.045710 +v -0.084607 0.145684 0.084461 +v -0.045856 0.145684 0.110354 +v -0.000146 0.145684 0.119446 +v 0.045564 0.145684 0.110354 +v 0.084315 0.145684 0.084461 +v 0.110208 0.145684 0.045710 +v 0.119300 0.145684 -0.000000 +v 0.110208 0.145684 -0.045710 +v 0.084315 0.145684 -0.084461 +v 0.045564 0.145684 -0.110354 +v -0.000146 0.096556 -0.179170 +v -0.021132 0.166739 -0.050666 +v -0.038924 0.166739 -0.038778 +v -0.050812 0.166739 -0.020987 +v -0.054987 0.166739 0.000000 +v -0.050812 0.166739 0.020987 +v -0.038924 0.166739 0.038778 +v -0.021132 0.166739 0.050666 +v -0.000146 0.166739 0.054841 +v 0.020841 0.166739 0.050666 +v 0.038632 0.166739 0.038778 +v 0.050520 0.166739 0.020987 +v 0.054695 0.166739 -0.000000 +v 0.050520 0.166739 -0.020987 +v 0.038632 0.166739 -0.038778 +v 0.020841 0.166739 -0.050666 +v -0.000146 0.166739 -0.054841 +v -0.068711 0.096556 -0.165531 +v -0.126838 0.096556 -0.126692 +v -0.165677 0.096556 -0.068565 +v -0.179315 0.096556 -0.000000 +v -0.165677 0.096556 0.068565 +v -0.126838 0.096556 0.126692 +v -0.068711 0.096556 0.165531 +v -0.000146 0.096556 0.179170 +v 0.068419 0.096556 0.165531 +v 0.126546 0.096556 0.126692 +v 0.165385 0.096556 0.068565 +v 0.179024 0.096556 -0.000000 +v 0.165385 0.096556 -0.068565 +v 0.126546 0.096556 -0.126692 +v 0.068419 0.096556 -0.165531 +v -0.295718 0.007850 -0.081729 +v -0.283854 -0.013423 -0.078550 +v -0.260127 -0.013423 -0.072192 +v -0.248263 0.007850 -0.069013 +v -0.260127 0.029123 -0.072192 +v -0.283854 0.029123 -0.078550 +v -0.216519 0.007850 -0.218904 +v -0.207834 -0.013423 -0.210219 +v -0.190465 -0.013423 -0.192850 +v -0.181780 0.007850 -0.184165 +v -0.190465 0.029123 -0.192850 +v -0.207834 0.029123 -0.210219 +v -0.079344 0.007850 -0.298102 +v -0.076165 -0.013423 -0.286239 +v -0.069807 -0.013423 -0.262512 +v -0.066628 0.007850 -0.250648 +v -0.069807 0.029123 -0.262512 +v -0.076165 0.029123 -0.286239 +v 0.079053 0.007850 -0.298102 +v 0.075874 -0.013423 -0.286239 +v 0.069516 -0.013423 -0.262512 +v 0.066337 0.007850 -0.250648 +v 0.069516 0.029123 -0.262512 +v 0.075874 0.029123 -0.286239 +v 0.216228 0.007850 -0.218904 +v 0.207543 -0.013423 -0.210219 +v 0.190174 -0.013423 -0.192850 +v 0.181489 0.007850 -0.184165 +v 0.190174 0.029123 -0.192850 +v 0.207543 0.029123 -0.210219 +v 0.295426 0.007850 -0.081729 +v 0.283563 -0.013424 -0.078550 +v 0.259836 -0.013424 -0.072192 +v 0.247972 0.007850 -0.069013 +v 0.259836 0.029123 -0.072192 +v 0.283563 0.029123 -0.078550 +v 0.295426 0.007850 0.076668 +v 0.283563 -0.013424 0.073489 +v 0.259836 -0.013424 0.067131 +v 0.247972 0.007850 0.063953 +v 0.259836 0.029123 0.067131 +v 0.283563 0.029123 0.073489 +v 0.216228 0.007850 0.213843 +v 0.207544 -0.013424 0.205159 +v 0.190174 -0.013424 0.187789 +v 0.181489 0.007850 0.179104 +v 0.190174 0.029123 0.187789 +v 0.207544 0.029123 0.205159 +v 0.079053 0.007850 0.293042 +v 0.075874 -0.013424 0.281178 +v 0.069516 -0.013424 0.257451 +v 0.066337 0.007850 0.245587 +v 0.069516 0.029123 0.257451 +v 0.075874 0.029123 0.281178 +v -0.079344 0.007850 0.293042 +v -0.076165 -0.013424 0.281178 +v -0.069807 -0.013424 0.257451 +v -0.066629 0.007850 0.245587 +v -0.069807 0.029123 0.257451 +v -0.076165 0.029123 0.281178 +v -0.216519 0.007850 0.213843 +v -0.207835 -0.013424 0.205159 +v -0.190465 -0.013424 0.187789 +v -0.181780 0.007850 0.179105 +v -0.190465 0.029123 0.187789 +v -0.207835 0.029123 0.205159 +v -0.295718 0.007850 0.076668 +v -0.283854 -0.013423 0.073489 +v -0.260127 -0.013423 0.067131 +v -0.248263 0.007850 0.063953 +v -0.260127 0.029123 0.067131 +v -0.283854 0.029123 0.073489 +v -0.295718 -0.222743 -0.081729 +v -0.283854 -0.244016 -0.078550 +v -0.260127 -0.244016 -0.072192 +v -0.248263 -0.222743 -0.069013 +v -0.260127 -0.201470 -0.072192 +v -0.283854 -0.201470 -0.078550 +v -0.216519 -0.222743 -0.218904 +v -0.207835 -0.244016 -0.210219 +v -0.190465 -0.244016 -0.192850 +v -0.181780 -0.222743 -0.184165 +v -0.190465 -0.201470 -0.192850 +v -0.207834 -0.201470 -0.210219 +v -0.079344 -0.222743 -0.298102 +v -0.076165 -0.244016 -0.286239 +v -0.069807 -0.244016 -0.262512 +v -0.066629 -0.222743 -0.250648 +v -0.069807 -0.201470 -0.262512 +v -0.076165 -0.201470 -0.286239 +v 0.079053 -0.222743 -0.298102 +v 0.075874 -0.244016 -0.286239 +v 0.069516 -0.244016 -0.262512 +v 0.066337 -0.222743 -0.250648 +v 0.069516 -0.201470 -0.262512 +v 0.075874 -0.201470 -0.286239 +v 0.216228 -0.222743 -0.218904 +v 0.207543 -0.244016 -0.210219 +v 0.190174 -0.244016 -0.192850 +v 0.181489 -0.222743 -0.184165 +v 0.190174 -0.201470 -0.192850 +v 0.207543 -0.201470 -0.210219 +v 0.295426 -0.222743 -0.081729 +v 0.283563 -0.244016 -0.078550 +v 0.259836 -0.244016 -0.072192 +v 0.247972 -0.222743 -0.069013 +v 0.259836 -0.201470 -0.072192 +v 0.283563 -0.201470 -0.078550 +v 0.295426 -0.222743 0.076668 +v 0.283563 -0.244016 0.073489 +v 0.259836 -0.244016 0.067131 +v 0.247972 -0.222743 0.063953 +v 0.259836 -0.201470 0.067131 +v 0.283563 -0.201470 0.073489 +v 0.216228 -0.222743 0.213843 +v 0.207543 -0.244016 0.205159 +v 0.190174 -0.244016 0.187789 +v 0.181489 -0.222743 0.179104 +v 0.190174 -0.201470 0.187789 +v 0.207544 -0.201470 0.205159 +v 0.079053 -0.222743 0.293042 +v 0.075874 -0.244016 0.281178 +v 0.069516 -0.244016 0.257451 +v 0.066337 -0.222743 0.245587 +v 0.069516 -0.201470 0.257451 +v 0.075874 -0.201470 0.281178 +v -0.079344 -0.222743 0.293042 +v -0.076165 -0.244016 0.281178 +v -0.069807 -0.244016 0.257451 +v -0.066629 -0.222743 0.245587 +v -0.069807 -0.201470 0.257451 +v -0.076165 -0.201470 0.281178 +v -0.216519 -0.222743 0.213843 +v -0.207835 -0.244016 0.205159 +v -0.190465 -0.244016 0.187789 +v -0.181780 -0.222743 0.179104 +v -0.190465 -0.201470 0.187789 +v -0.207835 -0.201470 0.205159 +v -0.295718 -0.222743 0.076668 +v -0.283854 -0.244016 0.073489 +v -0.260127 -0.244016 0.067131 +v -0.248263 -0.222743 0.063953 +v -0.260127 -0.201470 0.067131 +v -0.283854 -0.201470 0.073489 +v -0.091347 0.228308 0.021907 +v -0.079252 0.206618 0.018666 +v -0.055060 0.206618 0.012184 +v -0.042964 0.228308 0.008943 +v -0.055060 0.249998 0.012184 +v -0.079252 0.249998 0.018666 +v -0.091347 0.228308 -0.026968 +v -0.079252 0.206619 -0.023727 +v -0.055060 0.206618 -0.017245 +v -0.042964 0.228308 -0.014003 +v -0.055060 0.249998 -0.017245 +v -0.079252 0.249998 -0.023727 +v -0.066910 0.228308 -0.069295 +v -0.058055 0.206619 -0.060440 +v -0.040346 0.206619 -0.042730 +v -0.031491 0.228308 -0.033876 +v -0.040346 0.249998 -0.042730 +v -0.058055 0.249998 -0.060440 +v -0.024583 0.228308 -0.093732 +v -0.021342 0.206619 -0.081636 +v -0.014860 0.206619 -0.057445 +v -0.011619 0.228308 -0.045349 +v -0.014860 0.249998 -0.057445 +v -0.021342 0.249998 -0.081636 +v 0.024292 0.228308 -0.093732 +v 0.021051 0.206619 -0.081636 +v 0.014569 0.206618 -0.057445 +v 0.011328 0.228308 -0.045349 +v 0.014569 0.249998 -0.057445 +v 0.021051 0.249998 -0.081636 +v 0.066619 0.228308 -0.069295 +v 0.057764 0.206618 -0.060440 +v 0.040055 0.206618 -0.042730 +v 0.031200 0.228308 -0.033876 +v 0.040055 0.249998 -0.042730 +v 0.057764 0.249998 -0.060440 +v 0.091056 0.228308 -0.026968 +v 0.078961 0.206618 -0.023727 +v 0.054769 0.206618 -0.017245 +v 0.042673 0.228308 -0.014003 +v 0.054769 0.249998 -0.017245 +v 0.078961 0.249998 -0.023727 +v 0.091056 0.228308 0.021907 +v 0.078961 0.206618 0.018666 +v 0.054769 0.206618 0.012184 +v 0.042673 0.228308 0.008943 +v 0.054769 0.249998 0.012184 +v 0.078961 0.249998 0.018666 +v 0.066619 0.228308 0.064234 +v 0.057764 0.206618 0.055379 +v 0.040055 0.206618 0.037670 +v 0.031200 0.228308 0.028815 +v 0.040055 0.249998 0.037670 +v 0.057764 0.249998 0.055379 +v 0.024292 0.228308 0.088672 +v 0.021051 0.206618 0.076576 +v 0.014569 0.206618 0.052384 +v 0.011328 0.228308 0.040288 +v 0.014569 0.249998 0.052384 +v 0.021051 0.249998 0.076576 +v -0.024583 0.228308 0.088672 +v -0.021342 0.206618 0.076576 +v -0.014860 0.206618 0.052384 +v -0.011619 0.228308 0.040288 +v -0.014860 0.249998 0.052384 +v -0.021342 0.249998 0.076576 +v -0.066910 0.228308 0.064234 +v -0.058055 0.206618 0.055379 +v -0.040346 0.206618 0.037670 +v -0.031491 0.228308 0.028815 +v -0.040346 0.249998 0.037670 +v -0.058055 0.249998 0.055379 +v 0.273430 0.031395 0.022982 +v 0.273430 -0.324539 0.022982 +v 0.295524 0.031395 0.010226 +v 0.295524 -0.324539 0.010226 +v 0.295524 0.031395 -0.015286 +v 0.295524 -0.324539 -0.015286 +v 0.273430 0.031395 -0.028042 +v 0.273430 -0.324539 -0.028042 +v 0.251336 0.031395 -0.015286 +v 0.251336 -0.324539 -0.015286 +v 0.251336 0.031395 0.010226 +v 0.251336 -0.324539 0.010226 +v 0.252375 0.101578 0.022982 +v 0.272787 0.110033 0.010226 +v 0.272787 0.110033 -0.015286 +v 0.252375 0.101578 -0.028042 +v 0.231963 0.093123 -0.015286 +v 0.231963 0.093123 0.010226 +v 0.204462 0.159400 0.022982 +v 0.220085 0.175023 0.010226 +v 0.220085 0.175023 -0.015286 +v 0.204462 0.159400 -0.028042 +v 0.188839 0.143777 -0.015286 +v 0.188839 0.143777 0.010226 +v 0.140798 0.202009 0.022982 +v 0.149253 0.222421 0.010226 +v 0.149253 0.222421 -0.015286 +v 0.140798 0.202009 -0.028042 +v 0.132343 0.181597 -0.015286 +v 0.132343 0.181597 0.010226 +v 0.068939 0.228867 0.022982 +v 0.073212 0.249443 0.010226 +v 0.073212 0.249443 -0.015286 +v 0.068939 0.228867 -0.028042 +v 0.068939 0.206773 -0.015286 +v 0.068939 0.206773 0.010226 +v -0.273619 0.031395 -0.028042 +v -0.273619 -0.324539 -0.028042 +v -0.295713 0.031395 -0.015286 +v -0.295713 -0.324539 -0.015286 +v -0.295713 0.031395 0.010226 +v -0.295713 -0.324539 0.010226 +v -0.273619 0.031395 0.022982 +v -0.273619 -0.324539 0.022981 +v -0.251525 0.031395 0.010226 +v -0.251525 -0.324539 0.010226 +v -0.251525 0.031395 -0.015286 +v -0.251525 -0.324539 -0.015286 +v -0.252564 0.101578 -0.028042 +v -0.272976 0.110033 -0.015286 +v -0.272976 0.110033 0.010226 +v -0.252564 0.101578 0.022982 +v -0.232152 0.093123 0.010226 +v -0.232152 0.093123 -0.015286 +v -0.204651 0.159400 -0.028042 +v -0.220274 0.175023 -0.015286 +v -0.220274 0.175023 0.010226 +v -0.204651 0.159400 0.022982 +v -0.189029 0.143778 0.010226 +v -0.189029 0.143778 -0.015286 +v -0.140988 0.202009 -0.028042 +v -0.149443 0.222421 -0.015286 +v -0.149443 0.222421 0.010226 +v -0.140988 0.202009 0.022982 +v -0.132533 0.181597 0.010226 +v -0.132533 0.181597 -0.015286 +v -0.069129 0.228867 -0.028042 +v -0.073401 0.249443 -0.015286 +v -0.073401 0.249443 0.010226 +v -0.069129 0.228867 0.022982 +v -0.069129 0.206773 0.010226 +v -0.069129 0.206773 -0.015286 +v 0.114574 0.031394 0.247105 +v 0.114574 -0.324539 0.247105 +v 0.136667 0.031394 0.259861 +v 0.136667 -0.324539 0.259861 +v 0.158761 0.031394 0.247105 +v 0.158761 -0.324539 0.247105 +v 0.158761 0.031394 0.221593 +v 0.158761 -0.324539 0.221593 +v 0.136667 0.031394 0.208837 +v 0.136667 -0.324539 0.208837 +v 0.114574 0.031394 0.221593 +v 0.114574 -0.324539 0.221593 +v 0.104046 0.101578 0.228871 +v 0.125299 0.110033 0.240170 +v 0.147393 0.110033 0.227414 +v 0.148234 0.101578 0.203359 +v 0.126981 0.093123 0.192059 +v 0.104887 0.093123 0.204815 +v 0.080090 0.159400 0.187377 +v 0.098948 0.175023 0.194529 +v 0.121042 0.175023 0.181773 +v 0.124278 0.159400 0.161865 +v 0.105419 0.143777 0.154713 +v 0.083325 0.143777 0.167469 +v 0.048258 0.202009 0.132243 +v 0.063532 0.222421 0.133187 +v 0.085626 0.222421 0.120431 +v 0.092446 0.202009 0.106731 +v 0.077171 0.181597 0.105787 +v 0.055077 0.181597 0.118542 +v 0.012328 0.228867 0.070011 +v 0.025511 0.249443 0.067333 +v 0.047605 0.249443 0.054577 +v 0.056516 0.228867 0.044499 +v 0.045469 0.206773 0.050877 +v 0.023375 0.206773 0.063633 +v -0.114763 0.031395 -0.252165 +v -0.114763 -0.324539 -0.252165 +v -0.136857 0.031395 -0.264921 +v -0.136857 -0.324539 -0.264921 +v -0.158951 0.031395 -0.252165 +v -0.158951 -0.324539 -0.252166 +v -0.158951 0.031395 -0.226654 +v -0.158951 -0.324539 -0.226654 +v -0.136857 0.031395 -0.213898 +v -0.136857 -0.324539 -0.213898 +v -0.114763 0.031395 -0.226654 +v -0.114763 -0.324539 -0.226654 +v -0.104236 0.101578 -0.233931 +v -0.125489 0.110033 -0.245231 +v -0.147582 0.110033 -0.232475 +v -0.148423 0.101578 -0.208419 +v -0.127170 0.093123 -0.197120 +v -0.105076 0.093123 -0.209876 +v -0.080279 0.159400 -0.192437 +v -0.099137 0.175023 -0.199589 +v -0.121231 0.175023 -0.186833 +v -0.124467 0.159400 -0.166926 +v -0.105609 0.143778 -0.159774 +v -0.083515 0.143778 -0.172530 +v -0.048447 0.202009 -0.137303 +v -0.063722 0.222421 -0.138247 +v -0.085816 0.222421 -0.125491 +v -0.092635 0.202009 -0.111791 +v -0.077361 0.181597 -0.110847 +v -0.055267 0.181597 -0.123603 +v -0.012518 0.228867 -0.075071 +v -0.025701 0.249443 -0.072393 +v -0.047795 0.249443 -0.059637 +v -0.056706 0.228867 -0.049559 +v -0.045659 0.206773 -0.055937 +v -0.023565 0.206773 -0.068693 +v -0.158951 0.031395 0.221593 +v -0.158951 -0.324539 0.221593 +v -0.158951 0.031395 0.247105 +v -0.158951 -0.324539 0.247105 +v -0.136857 0.031395 0.259861 +v -0.136857 -0.324539 0.259861 +v -0.114763 0.031395 0.247105 +v -0.114763 -0.324539 0.247105 +v -0.114763 0.031395 0.221593 +v -0.114763 -0.324539 0.221593 +v -0.136857 0.031395 0.208837 +v -0.136857 -0.324539 0.208837 +v -0.148423 0.101578 0.203359 +v -0.147583 0.110033 0.227414 +v -0.125489 0.110033 0.240170 +v -0.104236 0.101578 0.228871 +v -0.105077 0.093123 0.204815 +v -0.127170 0.093123 0.192059 +v -0.124467 0.159400 0.161865 +v -0.121231 0.175023 0.181773 +v -0.099137 0.175023 0.194529 +v -0.080279 0.159400 0.187377 +v -0.083515 0.143777 0.167469 +v -0.105609 0.143777 0.154713 +v -0.092635 0.202009 0.106731 +v -0.085816 0.222421 0.120431 +v -0.063722 0.222421 0.133187 +v -0.048447 0.202009 0.132243 +v -0.055267 0.181597 0.118542 +v -0.077361 0.181597 0.105786 +v -0.056706 0.228867 0.044499 +v -0.047795 0.249443 0.054577 +v -0.025701 0.249443 0.067333 +v -0.012518 0.228867 0.070011 +v -0.023565 0.206773 0.063633 +v -0.045659 0.206773 0.050877 +v 0.158762 0.031395 -0.226654 +v 0.158761 -0.324539 -0.226654 +v 0.158762 0.031395 -0.252165 +v 0.158762 -0.324539 -0.252165 +v 0.136668 0.031395 -0.264921 +v 0.136668 -0.324539 -0.264921 +v 0.114574 0.031395 -0.252165 +v 0.114574 -0.324539 -0.252165 +v 0.114574 0.031395 -0.226654 +v 0.114574 -0.324539 -0.226654 +v 0.136668 0.031395 -0.213898 +v 0.136668 -0.324539 -0.213898 +v 0.148234 0.101578 -0.208419 +v 0.147393 0.110033 -0.232475 +v 0.125299 0.110033 -0.245231 +v 0.104046 0.101578 -0.233931 +v 0.104887 0.093123 -0.209876 +v 0.126981 0.093123 -0.197120 +v 0.124278 0.159400 -0.166926 +v 0.121042 0.175023 -0.186833 +v 0.098948 0.175023 -0.199589 +v 0.080090 0.159400 -0.192437 +v 0.083325 0.143778 -0.172530 +v 0.105419 0.143778 -0.159774 +v 0.092446 0.202009 -0.111791 +v 0.085626 0.222421 -0.125491 +v 0.063532 0.222421 -0.138247 +v 0.048258 0.202009 -0.137303 +v 0.055077 0.181597 -0.123603 +v 0.077171 0.181597 -0.110847 +v 0.056516 0.228867 -0.049559 +v 0.047605 0.249443 -0.059637 +v 0.025512 0.249443 -0.072393 +v 0.012328 0.228867 -0.075071 +v 0.023375 0.206773 -0.068693 +v 0.045469 0.206773 -0.055937 +v -0.000146 -0.338235 -0.350916 +v -0.134436 -0.338235 -0.324204 +v -0.248281 -0.338235 -0.248135 +v -0.324350 -0.338235 -0.134290 +v -0.351062 -0.338235 -0.000000 +v -0.324350 -0.338235 0.134290 +v -0.248281 -0.338235 0.248135 +v -0.134436 -0.338235 0.324204 +v -0.000146 -0.338235 0.350916 +v 0.134144 -0.338235 0.324204 +v 0.247989 -0.338235 0.248135 +v 0.324058 -0.338235 0.134290 +v 0.350770 -0.338235 -0.000000 +v 0.324058 -0.338235 -0.134290 +v 0.247989 -0.338235 -0.248135 +v 0.134144 -0.338235 -0.324204 +v -0.000146 -0.271438 -0.049716 +v -0.035300 -0.271438 -0.035154 +v -0.049861 -0.271438 -0.000000 +v -0.035300 -0.271438 0.035154 +v -0.000146 -0.271438 0.049715 +v 0.035008 -0.271438 0.035154 +v 0.049569 -0.271438 -0.000000 +v 0.035008 -0.271438 -0.035154 +v -0.000146 0.108671 -0.039456 +v -0.028045 0.108671 -0.027900 +v -0.039602 0.108671 -0.000000 +v -0.028045 0.108671 0.027899 +v -0.000146 0.108671 0.039456 +v 0.027753 0.108671 0.027899 +v 0.039310 0.108671 -0.000000 +v 0.027753 0.108671 -0.027900 +v -0.093497 -0.045772 0.093351 +v -0.132164 -0.045772 -0.000000 +v 0.093205 -0.045772 -0.093351 +v -0.093497 -0.045772 -0.093351 +v 0.131872 -0.045772 -0.000000 +v 0.093205 -0.045772 0.093351 +v -0.000146 -0.045772 0.132018 +v -0.000146 -0.045772 -0.132018 +v -0.089453 0.034592 0.089307 +v -0.126445 0.034592 -0.000000 +v 0.047697 -0.176411 -0.047843 +v -0.089453 0.034592 -0.089307 +v 0.067514 -0.176411 -0.000000 +v 0.047697 -0.176411 0.047843 +v -0.000146 -0.176411 0.067660 +v -0.000146 0.034592 -0.126299 +v -0.047989 -0.176411 0.047843 +v -0.067806 -0.176411 -0.000000 +v 0.089161 0.034592 -0.089307 +v -0.047989 -0.176411 -0.047843 +v 0.126153 0.034592 -0.000000 +v 0.089161 0.034592 0.089307 +v -0.000146 0.034592 0.126299 +v -0.000146 -0.176411 -0.067660 +v -0.069942 0.082106 0.069795 +v -0.098852 0.082106 -0.000000 +v 0.035008 -0.223925 -0.035154 +v -0.069942 0.082106 -0.069796 +v 0.049569 -0.223925 -0.000000 +v 0.035008 -0.223925 0.035154 +v -0.000146 -0.223925 0.049715 +v -0.000146 0.082106 -0.098706 +v -0.076040 -0.128897 0.075894 +v -0.107477 -0.128897 -0.000000 +v -0.076040 -0.128897 -0.075895 +v -0.000146 -0.128897 -0.107331 +v 0.075748 -0.128897 -0.075895 +v 0.107185 -0.128897 -0.000000 +v 0.075749 -0.128897 0.075894 +v -0.000146 -0.128897 0.107331 +v -0.035300 -0.223925 0.035154 +v -0.049861 -0.223925 -0.000000 +v 0.069650 0.082106 -0.069796 +v -0.035300 -0.223925 -0.035154 +v 0.098560 0.082106 -0.000000 +v 0.069650 0.082106 0.069795 +v -0.000146 0.082106 0.098706 +v -0.000146 -0.223925 -0.049716 +v -0.000146 0.108671 -0.000000 +v -0.000146 -0.324540 -0.154732 +v -0.109558 -0.324540 -0.109412 +v -0.154878 -0.324540 -0.000000 +v -0.109558 -0.324540 0.109412 +v -0.000146 -0.324540 0.154732 +v 0.109266 -0.324540 0.109412 +v 0.154586 -0.324540 -0.000000 +v 0.109266 -0.324540 -0.109412 +v -0.059057 -0.324540 -0.142224 +v -0.142369 -0.324540 -0.058911 +v -0.142369 -0.324540 0.058911 +v -0.059057 -0.324540 0.142223 +v 0.058765 -0.324540 0.142223 +v 0.142077 -0.324540 0.058911 +v 0.142077 -0.324540 -0.058911 +v 0.058765 -0.324540 -0.142224 +vt 0.125000 0.093750 +vt 0.125000 0.031250 +vt 0.187500 0.031250 +vt 0.187500 0.093750 +vt 0.250000 0.031250 +vt 0.250000 0.093750 +vt 0.312500 0.031250 +vt 0.312500 0.093750 +vt 0.375000 0.031250 +vt 0.375000 0.093750 +vt 0.437500 0.031250 +vt 0.437500 0.093750 +vt 0.500000 0.031250 +vt 0.500000 0.093750 +vt 0.500000 0.156250 +vt 0.500000 0.218750 +vt 0.437500 0.218750 +vt 0.437500 0.156250 +vt 0.375000 0.218750 +vt 0.375000 0.156250 +vt 0.312500 0.218750 +vt 0.312500 0.156250 +vt 0.250000 0.218750 +vt 0.250000 0.156250 +vt 0.187500 0.218750 +vt 0.187500 0.156250 +vt 0.125000 0.218750 +vt 0.125000 0.156250 +vt 0.062500 0.218750 +vt 0.062500 0.156250 +vt 0.000000 0.218750 +vt 0.000000 0.156250 +vt 0.062500 0.093750 +vt 0.062500 0.031250 +vt 0.000000 0.093750 +vt 0.000000 0.031250 +vt 0.562500 0.703124 +vt 0.524831 0.703124 +vt 0.524831 0.609374 +vt 0.562500 0.609374 +vt 0.524831 0.515624 +vt 0.562500 0.515624 +vt 0.484375 0.437500 +vt 0.484375 0.475169 +vt 0.390625 0.475169 +vt 0.390625 0.437500 +vt 0.296875 0.475169 +vt 0.296875 0.437500 +vt 0.203125 0.475169 +vt 0.203125 0.437500 +vt 0.109375 0.475169 +vt 0.109375 0.437500 +vt 0.031250 0.515624 +vt 0.068919 0.515624 +vt 0.068919 0.609374 +vt 0.031250 0.609374 +vt 0.068919 0.703124 +vt 0.031250 0.703124 +vt 0.068919 0.796874 +vt 0.031250 0.796874 +vt 0.068919 0.890624 +vt 0.031250 0.890624 +vt 0.109375 0.968750 +vt 0.109375 0.931080 +vt 0.203125 0.931080 +vt 0.203125 0.968750 +vt 0.296875 0.931080 +vt 0.296875 0.968750 +vt 0.390625 0.931080 +vt 0.390625 0.968750 +vt 0.484375 0.931080 +vt 0.484375 0.968750 +vt 0.465358 0.633337 +vt 0.479239 0.703125 +vt 0.296875 0.703125 +vt 0.562500 0.796874 +vt 0.524831 0.796874 +vt 0.562500 0.890624 +vt 0.524831 0.890624 +vt 0.465358 0.772912 +vt 0.425826 0.832076 +vt 0.366663 0.871607 +vt 0.296875 0.885489 +vt 0.227087 0.871607 +vt 0.167924 0.832076 +vt 0.128392 0.772912 +vt 0.114511 0.703125 +vt 0.128392 0.633337 +vt 0.167924 0.574174 +vt 0.227087 0.534642 +vt 0.296875 0.520761 +vt 0.366663 0.534642 +vt 0.425826 0.574174 +vt 0.135686 0.541935 +vt 0.209640 0.492521 +vt 0.384110 0.492521 +vt 0.458064 0.541935 +vt 0.507479 0.615890 +vt 0.507479 0.790359 +vt 0.458064 0.864313 +vt 0.384110 0.913728 +vt 0.209640 0.913728 +vt 0.135686 0.864313 +vt 0.086271 0.790359 +vt 0.086271 0.615890 +vt 0.726902 0.335598 +vt 0.737499 0.342679 +vt 0.662273 0.524291 +vt 0.587902 0.474598 +vt 0.719821 0.325001 +vt 0.538209 0.400227 +vt 0.717334 0.312500 +vt 0.520759 0.312500 +vt 0.719821 0.299999 +vt 0.538209 0.224773 +vt 0.726902 0.289402 +vt 0.587902 0.150402 +vt 0.737499 0.282321 +vt 0.662273 0.100709 +vt 0.750000 0.279834 +vt 0.750000 0.083259 +vt 0.762501 0.282321 +vt 0.837727 0.100709 +vt 0.773098 0.289402 +vt 0.912098 0.150402 +vt 0.780179 0.299999 +vt 0.961791 0.224773 +vt 0.782666 0.312500 +vt 0.979241 0.312500 +vt 0.780179 0.325001 +vt 0.961791 0.400227 +vt 0.773098 0.335598 +vt 0.912098 0.474598 +vt 0.762501 0.342679 +vt 0.837727 0.524291 +vt 0.750000 0.345166 +vt 0.750000 0.541741 +vt 0.571706 0.890624 +vt 0.571706 0.796874 +vt 0.571706 0.703124 +vt 0.390625 0.977955 +vt 0.484375 0.977955 +vt 0.296875 0.977955 +vt 0.203125 0.977955 +vt 0.109375 0.977955 +vt 0.022044 0.796874 +vt 0.022044 0.890624 +vt 0.022044 0.703124 +vt 0.022044 0.609374 +vt 0.022044 0.515624 +vt 0.203125 0.428294 +vt 0.109375 0.428294 +vt 0.296875 0.428294 +vt 0.390625 0.428294 +vt 0.484375 0.428294 +vt 0.571706 0.609374 +vt 0.571706 0.515624 +vt 0.500000 0.875000 +vt 0.437500 0.875000 +vt 0.437500 0.812500 +vt 0.500000 0.812500 +vt 0.437500 0.750000 +vt 0.500000 0.750000 +vt 0.437500 0.687500 +vt 0.500000 0.687500 +vt 0.437500 0.625000 +vt 0.500000 0.625000 +vt 0.500000 1.000000 +vt 0.437500 1.000000 +vt 0.437500 0.937500 +vt 0.500000 0.937500 +vt 0.375000 0.875000 +vt 0.375000 0.812500 +vt 0.375000 0.750000 +vt 0.375000 0.687500 +vt 0.375000 0.625000 +vt 0.375000 1.000000 +vt 0.375000 0.937500 +vt 0.312500 0.875000 +vt 0.312500 0.812500 +vt 0.312500 0.750000 +vt 0.312500 0.687500 +vt 0.312500 0.625000 +vt 0.312500 1.000000 +vt 0.312500 0.937500 +vt 0.250000 0.875000 +vt 0.250000 0.812500 +vt 0.250000 0.750000 +vt 0.250000 0.687500 +vt 0.250000 0.625000 +vt 0.250000 1.000000 +vt 0.250000 0.937500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.187500 0.750000 +vt 0.187500 0.687500 +vt 0.187500 0.625000 +vt 0.187500 1.000000 +vt 0.187500 0.937500 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.125000 0.750000 +vt 0.125000 0.687500 +vt 0.125000 0.625000 +vt 0.125000 1.000000 +vt 0.125000 0.937500 +vt 0.062500 0.875000 +vt 0.062500 0.812500 +vt 0.062500 0.750000 +vt 0.062500 0.687500 +vt 0.062500 0.625000 +vt 0.062500 1.000000 +vt 0.062500 0.937500 +vt 0.000000 0.875000 +vt 0.000000 0.812500 +vt 0.000000 0.750000 +vt 0.000000 0.687500 +vt 0.000000 0.625000 +vt 0.000000 1.000000 +vt 0.000000 0.937500 +vt 0.750000 0.875000 +vt 0.687500 0.875000 +vt 0.687500 0.812500 +vt 0.750000 0.812500 +vt 0.687500 0.750000 +vt 0.750000 0.750000 +vt 0.687500 0.687500 +vt 0.750000 0.687500 +vt 0.687500 0.625000 +vt 0.750000 0.625000 +vt 0.750000 1.000000 +vt 0.687500 1.000000 +vt 0.687500 0.937500 +vt 0.750000 0.937500 +vt 0.625000 0.875000 +vt 0.625000 0.812500 +vt 0.625000 0.750000 +vt 0.625000 0.687500 +vt 0.625000 0.625000 +vt 0.625000 1.000000 +vt 0.625000 0.937500 +vt 0.562500 0.875000 +vt 0.562500 0.812500 +vt 0.562500 0.750000 +vt 0.562500 0.687500 +vt 0.562500 0.625000 +vt 0.562500 1.000000 +vt 0.562500 0.937500 +vt 0.437500 0.125000 +vt 0.500000 0.125000 +vt 0.500000 0.187500 +vt 0.437500 0.187500 +vt 0.500000 0.250000 +vt 0.437500 0.250000 +vt 0.500000 0.312500 +vt 0.437500 0.312500 +vt 0.500000 0.375000 +vt 0.437500 0.375000 +vt 0.437500 0.000000 +vt 0.500000 0.000000 +vt 0.500000 0.062500 +vt 0.437500 0.062500 +vt 0.562500 0.125000 +vt 0.562500 0.187500 +vt 0.562500 0.250000 +vt 0.562500 0.312500 +vt 0.562500 0.375000 +vt 0.562500 0.000000 +vt 0.562500 0.062500 +vt 0.625000 0.125000 +vt 0.625000 0.187500 +vt 0.625000 0.250000 +vt 0.625000 0.312500 +vt 0.625000 0.375000 +vt 0.625000 0.000000 +vt 0.625000 0.062500 +vt 0.687500 0.125000 +vt 0.687500 0.187500 +vt 0.687500 0.250000 +vt 0.687500 0.312500 +vt 0.687500 0.375000 +vt 0.687500 0.000000 +vt 0.687500 0.062500 +vt 0.750000 0.125000 +vt 0.750000 0.187500 +vt 0.750000 0.250000 +vt 0.750000 0.312500 +vt 0.750000 0.375000 +vt 0.750000 0.000000 +vt 0.750000 0.062500 +vt 0.812500 0.125000 +vt 0.812500 0.187500 +vt 0.812500 0.250000 +vt 0.812500 0.312500 +vt 0.812500 0.375000 +vt 0.812500 0.000000 +vt 0.812500 0.062500 +vt 0.875000 0.125000 +vt 0.875000 0.187500 +vt 0.875000 0.250000 +vt 0.875000 0.312500 +vt 0.875000 0.375000 +vt 0.875000 0.000000 +vt 0.875000 0.062500 +vt 0.937500 0.125000 +vt 0.937500 0.187500 +vt 0.937500 0.250000 +vt 0.937500 0.312500 +vt 0.937500 0.375000 +vt 0.937500 0.000000 +vt 0.937500 0.062500 +vt 1.000000 0.125000 +vt 1.000000 0.187500 +vt 1.000000 0.250000 +vt 1.000000 0.312500 +vt 1.000000 0.375000 +vt 1.000000 0.000000 +vt 1.000000 0.062500 +vt 0.250000 0.125000 +vt 0.312500 0.125000 +vt 0.312500 0.187500 +vt 0.250000 0.187500 +vt 0.312500 0.250000 +vt 0.250000 0.250000 +vt 0.312500 0.312500 +vt 0.250000 0.312500 +vt 0.312500 0.375000 +vt 0.250000 0.375000 +vt 0.250000 0.000000 +vt 0.312500 0.000000 +vt 0.312500 0.062500 +vt 0.250000 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.000000 +vt 0.375000 0.062500 +vt 0.062500 0.250000 +vt 0.062500 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.375000 0.500000 +vt 0.312500 0.500000 +vt 0.250000 0.500000 +vt 0.187500 0.500000 +vt 0.187500 0.250000 +vt 0.125000 0.250000 +vt 0.125000 0.500000 +vt 0.062500 0.187500 +vt 0.125000 0.187500 +vt 0.062500 0.125000 +vt 0.125000 0.125000 +vt 0.187500 0.187500 +vt 0.000000 0.187500 +vt 0.062500 0.062500 +vt 0.125000 0.062500 +vt 0.187500 0.125000 +vt 0.000000 0.125000 +vt 0.062500 -0.000000 +vt 0.125000 -0.000000 +vt 0.187500 0.062500 +vt 0.000000 0.062500 +vt 0.187500 -0.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.875000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.875000 +vt 0.500000 0.562500 +vt 0.375000 0.562500 +vt 1.000000 0.562500 +vt 0.875000 0.562500 +vt 0.000000 0.375000 +vt 0.125000 0.375000 +vt 0.125000 0.562500 +vt 0.000000 0.562500 +vt 0.250000 0.562500 +vt 0.750000 0.562500 +vt 0.625000 0.562500 +vt 1.000000 0.750000 +vt 0.875000 0.750000 +vt 0.728932 0.363362 +vt 0.699138 0.333568 +vt 0.699138 0.291432 +vt 0.728932 0.261638 +vt 0.771068 0.261638 +vt 0.800862 0.291432 +vt 0.800862 0.333568 +vt 0.771068 0.363362 +vt 0.500000 0.565189 +vt 0.546095 0.546095 +vt 0.571733 0.673178 +vt 0.565189 0.500000 +vt 0.673178 0.571733 +vt 0.546095 0.453905 +vt 0.673178 0.428267 +vt 0.500000 0.434811 +vt 0.571733 0.326822 +vt 0.453905 0.453905 +vt 0.428267 0.326822 +vt 0.434811 0.500000 +vt 0.326822 0.428267 +vt 0.453905 0.546095 +vt 0.326822 0.571733 +vt 0.428267 0.673178 +vt 0.500000 0.702891 +vt 0.643465 0.643465 +vt 0.702891 0.500000 +vt 0.643465 0.356535 +vt 0.500000 0.297110 +vt 0.356535 0.356535 +vt 0.297109 0.500000 +vt 0.356535 0.643465 +vt 0.062500 0.562500 +vt 0.187500 0.562500 +vt 0.312500 0.562500 +vt 0.437500 0.562500 +vt 0.562500 0.562500 +vt 0.687500 0.562500 +vt 0.812500 0.562500 +vt 0.812500 0.937500 +vt 0.875000 0.937500 +vt 0.536015 0.286015 +vt 0.519491 0.297056 +vt 0.937500 0.937500 +vt 0.937500 0.562500 +vt 1.000000 0.937500 +vt 0.563679 0.403736 +vt 0.500000 0.416403 +vt 0.500000 0.360934 +vt 0.542453 0.352490 +vt 0.547056 0.269491 +vt 0.550933 0.250000 +vt 0.547056 0.230509 +vt 0.536015 0.213985 +vt 0.519491 0.202944 +vt 0.500000 0.199067 +vt 0.480509 0.202944 +vt 0.463985 0.213985 +vt 0.452945 0.230509 +vt 0.449068 0.250000 +vt 0.452945 0.269491 +vt 0.463985 0.286015 +vt 0.480509 0.297056 +vt 0.500000 0.300933 +vt 0.617664 0.367664 +vt 0.578443 0.328443 +vt 0.653736 0.313679 +vt 0.602490 0.292453 +vt 0.666402 0.250000 +vt 0.610935 0.250000 +vt 0.653736 0.186321 +vt 0.602490 0.207547 +vt 0.617664 0.132336 +vt 0.578443 0.171557 +vt 0.563679 0.096265 +vt 0.542453 0.147510 +vt 0.500000 0.083598 +vt 0.500000 0.139065 +vt 0.436321 0.096265 +vt 0.457547 0.147510 +vt 0.382336 0.132336 +vt 0.421558 0.171557 +vt 0.346265 0.186321 +vt 0.397510 0.207547 +vt 0.333598 0.250000 +vt 0.389065 0.250000 +vt 0.346265 0.313679 +vt 0.397510 0.292453 +vt 0.382336 0.367664 +vt 0.421558 0.328443 +vt 0.436321 0.403735 +vt 0.457547 0.352490 +vt 0.812500 1.000000 +vt 0.937500 1.000000 +vn 0.000000 -0.753700 -0.657100 +vn 0.000000 -0.665700 -0.746200 +vn -0.285500 -0.665700 -0.689400 +vn -0.251500 -0.753700 -0.607100 +vn -0.527600 -0.665700 -0.527600 +vn -0.464600 -0.753700 -0.464600 +vn -0.689400 -0.665700 -0.285500 +vn -0.607100 -0.753700 -0.251500 +vn -0.746200 -0.665700 0.000000 +vn -0.657100 -0.753700 0.000000 +vn -0.689400 -0.665700 0.285500 +vn -0.607100 -0.753700 0.251500 +vn -0.527600 -0.665700 0.527600 +vn -0.464600 -0.753700 0.464600 +vn -0.285500 -0.665700 0.689400 +vn -0.251500 -0.753700 0.607100 +vn 0.000000 -0.665700 0.746200 +vn 0.000000 -0.753700 0.657100 +vn 0.285500 -0.665700 0.689400 +vn 0.251500 -0.753700 0.607100 +vn 0.527600 -0.665700 0.527600 +vn 0.464600 -0.753700 0.464600 +vn 0.689400 -0.665700 0.285500 +vn 0.607100 -0.753700 0.251500 +vn 0.746200 -0.665700 0.000000 +vn 0.657100 -0.753700 0.000000 +vn 0.689400 -0.665700 -0.285500 +vn 0.607100 -0.753700 -0.251500 +vn 0.527600 -0.665700 -0.527600 +vn 0.464600 -0.753700 -0.464600 +vn 0.251500 -0.753700 -0.607100 +vn 0.285500 -0.665700 -0.689400 +vn -0.000000 0.000000 -1.000000 +vn -0.382700 0.000000 -0.923900 +vn -0.707100 0.000000 -0.707100 +vn -0.923900 0.000000 -0.382700 +vn -1.000000 0.000000 -0.000000 +vn -0.923900 -0.000000 0.382700 +vn -0.707100 -0.000000 0.707100 +vn -0.382700 -0.000000 0.923900 +vn -0.000000 -0.000000 1.000000 +vn 0.382700 -0.000000 0.923900 +vn 0.707100 -0.000000 0.707100 +vn 0.923900 -0.000000 0.382700 +vn 1.000000 -0.000000 -0.000000 +vn 0.923900 -0.000000 -0.382700 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 -1.000000 0.000000 +vn 0.382700 0.000000 -0.923900 +vn -0.000000 1.000000 -0.000000 +vn -0.285500 0.665700 -0.689400 +vn -0.527600 0.665700 -0.527600 +vn -0.689400 0.665700 -0.285500 +vn -0.746200 0.665700 0.000000 +vn -0.689400 0.665700 0.285500 +vn -0.527600 0.665700 0.527600 +vn -0.285500 0.665700 0.689400 +vn 0.000000 0.665700 0.746200 +vn 0.285500 0.665700 0.689400 +vn 0.527600 0.665700 0.527600 +vn 0.689400 0.665700 0.285500 +vn 0.746200 0.665700 0.000000 +vn 0.689400 0.665700 -0.285500 +vn 0.527600 0.665700 -0.527600 +vn 0.285500 0.665700 -0.689400 +vn 0.000000 0.665700 -0.746200 +vn -0.965900 0.000000 -0.258800 +vn -0.394100 -0.830300 -0.394100 +vn -0.538300 -0.830300 -0.144200 +vn 0.305800 -0.901600 0.305800 +vn 0.417700 -0.901600 0.111900 +vn 0.965900 0.000000 0.258800 +vn 0.305800 0.901600 0.305800 +vn 0.417700 0.901600 0.111900 +vn -0.394100 0.830300 -0.394100 +vn -0.538300 0.830300 -0.144200 +vn -0.258800 0.000000 -0.965900 +vn -0.144200 -0.830300 -0.538300 +vn 0.111900 -0.901600 0.417700 +vn 0.258800 0.000000 0.965900 +vn 0.111900 0.901600 0.417700 +vn -0.144200 0.830300 -0.538300 +vn 0.258800 0.000000 -0.965900 +vn 0.144200 -0.830300 -0.538300 +vn -0.111900 -0.901600 0.417700 +vn -0.258800 0.000000 0.965900 +vn -0.111900 0.901600 0.417700 +vn 0.144200 0.830300 -0.538300 +vn 0.394100 -0.830300 -0.394100 +vn -0.305800 -0.901600 0.305800 +vn -0.305800 0.901600 0.305800 +vn 0.394100 0.830300 -0.394100 +vn 0.965900 0.000000 -0.258800 +vn 0.538300 -0.830300 -0.144200 +vn -0.417700 -0.901600 0.111900 +vn -0.965900 0.000000 0.258800 +vn -0.417700 0.901600 0.111900 +vn 0.538300 0.830300 -0.144200 +vn 0.538300 -0.830300 0.144200 +vn -0.417700 -0.901600 -0.111900 +vn -0.417700 0.901600 -0.111900 +vn 0.538300 0.830300 0.144200 +vn 0.394100 -0.830300 0.394100 +vn -0.305800 -0.901600 -0.305800 +vn -0.305800 0.901600 -0.305800 +vn 0.394100 0.830300 0.394100 +vn 0.144200 -0.830300 0.538300 +vn -0.111900 -0.901600 -0.417700 +vn -0.111900 0.901600 -0.417700 +vn 0.144200 0.830300 0.538300 +vn -0.144200 -0.830300 0.538300 +vn 0.111900 -0.901600 -0.417700 +vn 0.111900 0.901600 -0.417700 +vn -0.144200 0.830300 0.538300 +vn -0.394100 -0.830300 0.394100 +vn 0.305800 -0.901600 -0.305800 +vn 0.305800 0.901600 -0.305800 +vn -0.394100 0.830300 0.394100 +vn -0.538300 -0.830300 0.144200 +vn 0.417700 -0.901600 -0.111900 +vn 0.417700 0.901600 -0.111900 +vn -0.538300 0.830300 0.144200 +vn 0.045500 0.011900 0.998900 +vn 0.866000 -0.000000 0.500000 +vn 0.868100 0.120600 0.481500 +vn 0.866000 0.000000 -0.500000 +vn 0.868100 0.120600 -0.481500 +vn 0.045500 0.011900 -0.998900 +vn -0.866000 0.000000 -0.500000 +vn -0.842900 -0.132100 -0.521600 +vn -0.842900 -0.132100 0.521600 +vn -0.866000 0.000000 0.500000 +vn 0.054500 0.032700 0.998000 +vn -0.742400 -0.411600 0.528600 +vn 0.030300 0.034600 0.998900 +vn -0.569100 -0.639000 0.517500 +vn -0.742400 -0.411600 -0.528600 +vn 0.054500 0.032700 -0.998000 +vn 0.781300 0.406200 -0.473800 +vn 0.781300 0.406200 0.473800 +vn 0.017100 0.032500 0.999300 +vn -0.399700 -0.760900 0.511200 +vn -0.569100 -0.639000 -0.517500 +vn 0.030300 0.034600 -0.998900 +vn 0.592200 0.648300 -0.478500 +vn 0.592200 0.648300 0.478500 +vn 0.025600 0.083400 0.996200 +vn -0.307600 -0.784100 0.539100 +vn -0.399700 -0.760900 -0.511200 +vn 0.017100 0.032500 -0.999300 +vn 0.393300 0.783900 -0.480400 +vn 0.393300 0.783900 0.480400 +vn -0.307600 -0.784100 -0.539100 +vn 0.025600 0.083400 -0.996200 +vn 0.296700 0.828400 -0.475100 +vn 0.296700 0.828400 0.475100 +vn -0.045500 0.011900 -0.998900 +vn -0.868100 0.120600 -0.481500 +vn -0.868100 0.120600 0.481500 +vn -0.045500 0.011900 0.998900 +vn 0.842900 -0.132100 0.521600 +vn 0.842900 -0.132100 -0.521600 +vn -0.054500 0.032700 -0.998000 +vn 0.742400 -0.411600 -0.528600 +vn -0.030300 0.034600 -0.998900 +vn 0.569100 -0.639000 -0.517500 +vn 0.742400 -0.411600 0.528600 +vn -0.054500 0.032700 0.998000 +vn -0.781300 0.406200 0.473800 +vn -0.781300 0.406200 -0.473800 +vn -0.017100 0.032500 -0.999300 +vn 0.399700 -0.760900 -0.511200 +vn 0.569100 -0.639000 0.517500 +vn -0.030300 0.034600 0.998900 +vn -0.592200 0.648300 0.478500 +vn -0.592200 0.648300 -0.478500 +vn -0.025600 0.083400 -0.996200 +vn 0.307600 -0.784100 -0.539100 +vn 0.399700 -0.760900 0.511200 +vn -0.017100 0.032500 0.999300 +vn -0.393300 0.783900 0.480400 +vn -0.393300 0.783900 -0.480400 +vn 0.307600 -0.784100 0.539100 +vn -0.025600 0.083400 0.996200 +vn -0.296700 0.828400 0.475100 +vn -0.296700 0.828400 -0.475100 +vn -0.842300 0.011900 0.538800 +vn 0.017000 0.120600 0.992600 +vn 0.851000 0.120600 0.511000 +vn 0.887800 0.011900 -0.460000 +vn 0.030300 -0.132100 -0.990800 +vn -0.873200 -0.132100 -0.469100 +vn -0.837000 0.032700 0.546200 +vn -0.829000 -0.411600 -0.378600 +vn -0.849900 0.034600 0.525700 +vn -0.732700 -0.639000 -0.234100 +vn 0.086600 -0.411600 -0.907200 +vn 0.891500 0.032700 -0.451800 +vn 0.801000 0.406200 0.439700 +vn -0.019700 0.406200 0.913500 +vn -0.856800 0.032500 0.514500 +vn -0.642500 -0.760900 -0.090500 +vn 0.163600 -0.639000 -0.751600 +vn 0.880200 0.034600 -0.473200 +vn 0.710500 0.648300 0.273600 +vn -0.118300 0.648300 0.752100 +vn -0.849900 0.083400 0.520200 +vn -0.620700 -0.784100 0.003200 +vn 0.242800 -0.760900 -0.601700 +vn 0.874000 0.032500 -0.484800 +vn 0.612700 0.783900 0.100400 +vn -0.219400 0.783900 0.580800 +vn 0.313100 -0.784100 -0.535900 +vn 0.875500 0.083400 -0.476000 +vn 0.559800 0.828400 0.019500 +vn -0.263000 0.828400 0.494500 +vn 0.842300 0.011900 -0.538800 +vn -0.017000 0.120600 -0.992600 +vn -0.851000 0.120600 -0.511000 +vn -0.887800 0.011900 0.460000 +vn -0.030300 -0.132100 0.990800 +vn 0.873200 -0.132100 0.469100 +vn 0.837000 0.032700 -0.546200 +vn 0.829000 -0.411600 0.378600 +vn 0.849900 0.034600 -0.525700 +vn 0.732700 -0.639000 0.234100 +vn -0.086600 -0.411600 0.907200 +vn -0.891500 0.032700 0.451800 +vn -0.801000 0.406200 -0.439700 +vn 0.019700 0.406200 -0.913500 +vn 0.856800 0.032500 -0.514500 +vn 0.642500 -0.760900 0.090500 +vn -0.163600 -0.639000 0.751600 +vn -0.880200 0.034600 0.473200 +vn -0.710500 0.648300 -0.273600 +vn 0.118300 0.648300 -0.752100 +vn 0.849900 0.083400 -0.520200 +vn 0.620700 -0.784100 -0.003200 +vn -0.242800 -0.760900 0.601700 +vn -0.874000 0.032500 0.484800 +vn -0.612700 0.783900 -0.100400 +vn 0.219400 0.783900 -0.580800 +vn -0.313100 -0.784100 0.535900 +vn -0.875500 0.083400 0.476000 +vn -0.559800 0.828400 -0.019500 +vn 0.263000 0.828400 -0.494500 +vn -0.887800 0.011900 -0.460000 +vn -0.851000 0.120600 0.511000 +vn -0.017000 0.120600 0.992600 +vn 0.842300 0.011900 0.538800 +vn 0.873200 -0.132100 -0.469100 +vn -0.030300 -0.132100 -0.990800 +vn -0.891500 0.032700 -0.451800 +vn -0.086600 -0.411600 -0.907200 +vn -0.880200 0.034600 -0.473200 +vn -0.163600 -0.639000 -0.751600 +vn 0.829000 -0.411600 -0.378600 +vn 0.837000 0.032700 0.546200 +vn 0.019700 0.406200 0.913500 +vn -0.801000 0.406200 0.439700 +vn -0.874000 0.032500 -0.484800 +vn -0.242800 -0.760900 -0.601700 +vn 0.732700 -0.639000 -0.234100 +vn 0.849900 0.034600 0.525700 +vn 0.118300 0.648300 0.752100 +vn -0.710500 0.648300 0.273600 +vn -0.875500 0.083400 -0.476000 +vn -0.313100 -0.784100 -0.535900 +vn 0.642500 -0.760900 -0.090500 +vn 0.856800 0.032500 0.514500 +vn 0.219400 0.783900 0.580800 +vn -0.612700 0.783900 0.100400 +vn 0.620700 -0.784100 0.003200 +vn 0.849900 0.083400 0.520200 +vn 0.263000 0.828400 0.494500 +vn -0.559800 0.828400 0.019500 +vn 0.887800 0.011900 0.460000 +vn 0.851000 0.120600 -0.511000 +vn 0.017000 0.120600 -0.992600 +vn -0.842300 0.011900 -0.538800 +vn -0.873200 -0.132100 0.469100 +vn 0.030300 -0.132100 0.990800 +vn 0.891500 0.032700 0.451800 +vn 0.086600 -0.411600 0.907200 +vn 0.880200 0.034600 0.473200 +vn 0.163600 -0.639000 0.751600 +vn -0.829000 -0.411600 0.378600 +vn -0.837000 0.032700 -0.546200 +vn -0.019700 0.406200 -0.913500 +vn 0.801000 0.406200 -0.439700 +vn 0.874000 0.032500 0.484800 +vn 0.242800 -0.760900 0.601700 +vn -0.732700 -0.639000 0.234100 +vn -0.849900 0.034600 -0.525700 +vn -0.118300 0.648300 -0.752100 +vn 0.710500 0.648300 -0.273600 +vn 0.875500 0.083400 0.476000 +vn 0.313100 -0.784100 0.535900 +vn -0.642500 -0.760900 0.090500 +vn -0.856800 0.032500 -0.514500 +vn -0.219400 0.783900 -0.580800 +vn 0.612700 0.783900 -0.100400 +vn -0.620700 -0.784100 -0.003200 +vn -0.849900 0.083400 -0.520200 +vn -0.263000 0.828400 -0.494500 +vn 0.559800 0.828400 -0.019500 +vn -0.499900 0.707200 -0.499900 +vn -0.707000 0.707200 0.000000 +vn -0.257900 0.966200 0.000000 +vn -0.182400 0.966200 -0.182400 +vn 0.707000 0.707200 0.000000 +vn 0.257900 0.966200 0.000000 +vn 0.182400 0.966200 0.182400 +vn 0.499900 0.707200 0.499900 +vn 0.000000 0.966200 0.257900 +vn 0.000000 0.707200 0.707000 +vn -0.182400 0.966200 0.182400 +vn -0.499900 0.707200 0.499900 +vn 0.630400 -0.453000 -0.630400 +vn 0.000000 -0.453000 -0.891400 +vn 0.000000 -0.104200 -0.994500 +vn 0.703200 -0.104200 -0.703200 +vn -0.852400 -0.522800 0.000000 +vn -0.602800 -0.522800 0.602800 +vn -0.630400 -0.453000 0.630400 +vn -0.891400 -0.453000 0.000000 +vn 0.000000 -0.453000 0.891400 +vn 0.000000 -0.104200 0.994500 +vn -0.703200 -0.104200 0.703200 +vn 0.630400 -0.453000 0.630400 +vn 0.703200 -0.104200 0.703200 +vn 0.994500 -0.104200 0.000000 +vn 0.678900 0.279800 -0.678900 +vn 0.960100 0.279800 0.000000 +vn 0.891400 -0.453000 0.000000 +vn 0.000000 0.279800 -0.960100 +vn -0.994500 -0.104200 0.000000 +vn -0.703200 -0.104200 -0.703200 +vn -0.630400 -0.453000 -0.630400 +vn -0.661500 -0.353300 -0.661500 +vn -0.935500 -0.353300 -0.000000 +vn -0.602800 -0.522800 -0.602800 +vn 0.000000 0.707200 -0.707000 +vn 0.499900 0.707200 -0.499900 +vn -0.678900 0.279800 -0.678900 +vn 0.935500 -0.353300 -0.000000 +vn 0.852400 -0.522800 0.000000 +vn 0.602800 -0.522800 0.602800 +vn 0.661500 -0.353300 0.661500 +vn 0.000000 -0.522800 0.852400 +vn -0.000000 -0.353300 0.935500 +vn -0.661500 -0.353300 0.661500 +vn 0.000000 0.279800 0.960100 +vn -0.678900 0.279800 0.678900 +vn 0.678900 0.279800 0.678900 +vn 0.602800 -0.522800 -0.602800 +vn 0.000000 -0.522800 -0.852400 +vn -0.960100 0.279800 0.000000 +vn 0.000000 0.966200 -0.257900 +vn 0.182400 0.966200 -0.182400 +vn 0.661500 -0.353300 -0.661500 +vn -0.000000 -0.353300 -0.935500 +vn 0.562300 0.606300 -0.562300 +vn 0.000000 0.606300 -0.795200 +vn -0.562300 0.606300 -0.562300 +vn 0.795200 0.606300 0.000000 +vn -0.562300 0.606300 0.562300 +vn 0.000000 0.606300 0.795200 +vn 0.562300 0.606300 0.562300 +vn -0.795200 0.606300 0.000000 +vn 0.172900 0.892100 -0.417400 +vn 0.417400 0.892100 -0.172900 +vn 0.417400 0.892100 0.172900 +vn 0.172900 0.892100 0.417400 +vn -0.172900 0.892100 0.417400 +vn -0.417400 0.892100 0.172900 +vn -0.417400 0.892100 -0.172900 +vn -0.172900 0.892100 -0.417400 +vn 0.000000 0.892400 -0.451200 +vn 0.319100 0.892400 -0.319100 +vn 0.451200 0.892400 0.000000 +vn 0.319100 0.892400 0.319100 +vn -0.000000 0.892400 0.451200 +vn -0.319100 0.892400 0.319100 +vn -0.451200 0.892400 0.000000 +vn -0.319100 0.892400 -0.319100 +vn 0.000000 0.203600 -0.979000 +vn -0.374600 0.203600 -0.904500 +vn -0.692300 0.203600 -0.692300 +vn -0.904500 0.203600 -0.374600 +vn -0.979000 0.203600 0.000000 +vn -0.904500 0.203600 0.374600 +vn -0.692300 0.203600 0.692300 +vn -0.374600 0.203600 0.904500 +vn 0.000000 0.203600 0.979000 +vn 0.374600 0.203600 0.904500 +vn 0.692300 0.203600 0.692300 +vn 0.904500 0.203600 0.374600 +vn 0.979000 0.203600 0.000000 +vn 0.904500 0.203600 -0.374600 +vn 0.692300 0.203600 -0.692300 +vn 0.124300 0.984400 -0.124300 +vn 0.067300 0.984400 -0.162500 +vn 0.374600 0.203600 -0.904500 +vn 0.308100 0.592900 -0.743900 +vn 0.000000 0.592900 -0.805200 +vn 0.000000 0.867000 -0.498300 +vn 0.190700 0.867000 -0.460400 +vn 0.162500 0.984400 -0.067300 +vn 0.175800 0.984400 0.000000 +vn 0.162500 0.984400 0.067300 +vn 0.124300 0.984400 0.124300 +vn 0.067300 0.984400 0.162500 +vn 0.000000 0.984400 0.175800 +vn -0.067300 0.984400 0.162500 +vn -0.124300 0.984400 0.124300 +vn -0.162500 0.984400 0.067300 +vn -0.175800 0.984400 0.000000 +vn -0.162500 0.984400 -0.067300 +vn -0.124300 0.984400 -0.124300 +vn -0.067300 0.984400 -0.162500 +vn 0.000000 0.984400 -0.175800 +vn 0.569400 0.592900 -0.569400 +vn 0.352400 0.867000 -0.352400 +vn 0.743900 0.592900 -0.308100 +vn 0.460400 0.867000 -0.190700 +vn 0.805200 0.592900 0.000000 +vn 0.498300 0.867000 0.000000 +vn 0.743900 0.592900 0.308100 +vn 0.460400 0.867000 0.190700 +vn 0.569400 0.592900 0.569400 +vn 0.352400 0.867000 0.352400 +vn 0.308100 0.592900 0.743900 +vn 0.190700 0.867000 0.460400 +vn 0.000000 0.592900 0.805200 +vn 0.000000 0.867000 0.498300 +vn -0.308100 0.592900 0.743900 +vn -0.190700 0.867000 0.460400 +vn -0.569400 0.592900 0.569400 +vn -0.352400 0.867000 0.352400 +vn -0.743900 0.592900 0.308100 +vn -0.460400 0.867000 0.190700 +vn -0.805200 0.592900 0.000000 +vn -0.498300 0.867000 0.000000 +vn -0.743900 0.592900 -0.308100 +vn -0.460400 0.867000 -0.190700 +vn -0.569400 0.592900 -0.569400 +vn -0.352400 0.867000 -0.352400 +vn -0.308100 0.592900 -0.743900 +vn -0.190700 0.867000 -0.460400 +g cage_Cylinder.004_base +s 1 +f 17/1/1 18/2/2 20/3/3 19/4/4 +f 19/4/4 20/3/3 22/5/5 21/6/6 +f 21/6/6 22/5/5 24/7/7 23/8/8 +f 23/8/8 24/7/7 26/9/9 25/10/10 +f 25/10/10 26/9/9 28/11/11 27/12/12 +f 27/12/12 28/11/11 30/13/13 29/14/14 +f 29/15/14 30/16/13 32/17/15 31/18/16 +f 31/18/16 32/17/15 34/19/17 33/20/18 +f 33/20/18 34/19/17 36/21/19 35/22/20 +f 35/22/20 36/21/19 38/23/21 37/24/22 +f 37/24/22 38/23/21 40/25/23 39/26/24 +f 39/26/24 40/25/23 42/27/25 41/28/26 +f 41/28/26 42/27/25 44/29/27 43/30/28 +f 43/30/28 44/29/27 46/31/29 45/32/30 +f 47/33/31 48/34/32 18/2/2 17/1/1 +f 45/35/30 46/36/29 48/34/32 47/33/31 +f 595/37/33 50/38/2 52/39/3 596/40/34 +f 596/40/34 52/39/3 54/41/5 597/42/35 +f 597/43/35 54/44/5 56/45/7 598/46/36 +f 598/46/36 56/45/7 58/47/9 599/48/37 +f 599/48/37 58/47/9 60/49/11 600/50/38 +f 600/50/38 60/49/11 62/51/13 601/52/39 +f 601/53/39 62/54/13 64/55/15 602/56/40 +f 602/56/40 64/55/15 66/57/17 603/58/41 +f 603/58/41 66/57/17 68/59/19 604/60/42 +f 604/60/42 68/59/19 70/61/21 605/62/43 +f 605/63/43 70/64/21 72/65/23 606/66/44 +f 606/66/44 72/65/23 74/67/25 607/68/45 +f 607/68/45 74/67/25 76/69/27 608/70/46 +f 608/70/46 76/69/27 78/71/29 609/72/47 +f 20/73/3 18/74/2 81/75/48 +f 610/76/49 80/77/32 50/38/2 595/37/33 +f 609/78/47 78/79/29 80/77/32 610/76/49 +f 18/74/2 48/80/32 81/75/48 +f 48/80/32 46/81/29 81/75/48 +f 46/81/29 44/82/27 81/75/48 +f 44/82/27 42/83/25 81/75/48 +f 42/83/25 40/84/23 81/75/48 +f 40/84/23 38/85/21 81/75/48 +f 38/85/21 36/86/19 81/75/48 +f 36/86/19 34/87/17 81/75/48 +f 34/87/17 32/88/15 81/75/48 +f 32/88/15 30/89/13 81/75/48 +f 30/89/13 28/90/11 81/75/48 +f 28/90/11 26/91/9 81/75/48 +f 26/91/9 24/92/7 81/75/48 +f 24/92/7 22/93/5 81/75/48 +f 22/93/5 20/73/3 81/75/48 +f 27/90/12 29/89/14 62/94/13 60/95/11 +f 25/91/10 27/90/12 60/95/11 58/47/9 +f 23/92/8 25/91/10 58/47/9 56/96/7 +f 21/93/6 23/92/8 56/96/7 54/97/5 +f 19/73/4 21/93/6 54/97/5 52/98/3 +f 17/74/1 19/73/4 52/98/3 50/38/2 +f 47/80/31 17/74/1 50/38/2 80/99/32 +f 45/81/30 47/80/31 80/99/32 78/100/29 +f 43/82/28 45/81/30 78/100/29 76/101/27 +f 41/83/26 43/82/28 76/101/27 74/67/25 +f 39/84/24 41/83/26 74/67/25 72/102/23 +f 37/85/22 39/84/24 72/102/23 70/103/21 +f 35/86/20 37/85/22 70/103/21 68/104/19 +f 33/87/18 35/86/20 68/104/19 66/57/17 +f 31/88/16 33/87/18 66/57/17 64/105/15 +f 29/89/14 31/88/16 64/105/15 62/94/13 +f 3/106/50 2/107/50 51/108/51 53/109/52 +f 4/110/50 3/106/50 53/109/52 55/111/53 +f 5/112/50 4/110/50 55/111/53 57/113/54 +f 6/114/50 5/112/50 57/113/54 59/115/55 +f 7/116/50 6/114/50 59/115/55 61/117/56 +f 8/118/50 7/116/50 61/117/56 63/119/57 +f 9/120/50 8/118/50 63/119/57 65/121/58 +f 10/122/50 9/120/50 65/121/58 67/123/59 +f 11/124/50 10/122/50 67/123/59 69/125/60 +f 12/126/50 11/124/50 69/125/60 71/127/61 +f 13/128/50 12/126/50 71/127/61 73/129/62 +f 14/130/50 13/128/50 73/129/62 75/131/63 +f 15/132/50 14/130/50 75/131/63 77/133/64 +f 16/134/50 15/132/50 77/133/64 79/135/65 +f 1/136/50 16/134/50 79/135/65 49/137/66 +f 2/107/50 1/136/50 49/137/66 51/108/51 +f 77/138/64 609/78/47 610/76/49 79/139/65 +f 79/139/65 610/76/49 595/37/33 49/140/66 +f 75/141/63 608/70/46 609/72/47 77/142/64 +f 73/143/62 607/68/45 608/70/46 75/141/63 +f 71/144/61 606/66/44 607/68/45 73/143/62 +f 69/145/60 605/63/43 606/66/44 71/144/61 +f 67/146/59 604/60/42 605/62/43 69/147/60 +f 65/148/58 603/58/41 604/60/42 67/146/59 +f 63/149/57 602/56/40 603/58/41 65/148/58 +f 61/150/56 601/53/39 602/56/40 63/149/57 +f 59/151/55 600/50/38 601/52/39 61/152/56 +f 57/153/54 599/48/37 600/50/38 59/151/55 +f 55/154/53 598/46/36 599/48/37 57/153/54 +f 53/155/52 597/43/35 598/46/36 55/154/53 +f 51/156/51 596/40/34 597/42/35 53/157/52 +f 49/140/66 595/37/33 596/40/34 51/156/51 +g cage_Cylinder.004_cage +f 163/158/67 169/159/35 170/160/68 164/161/69 +f 164/161/69 170/160/68 171/162/70 165/163/71 +f 165/163/71 171/162/70 172/164/43 166/165/72 +f 166/165/72 172/164/43 173/166/73 167/167/74 +f 167/168/74 173/169/73 174/170/75 168/171/76 +f 163/158/67 168/171/76 174/170/75 169/159/35 +f 169/159/35 175/172/77 176/173/78 170/160/68 +f 170/160/68 176/173/78 177/174/79 171/162/70 +f 171/162/70 177/174/79 178/175/80 172/164/43 +f 172/164/43 178/175/80 179/176/81 173/166/73 +f 173/169/73 179/177/81 180/178/82 174/170/75 +f 174/170/75 180/178/82 175/172/77 169/159/35 +f 175/172/77 181/179/83 182/180/84 176/173/78 +f 176/173/78 182/180/84 183/181/85 177/174/79 +f 177/174/79 183/181/85 184/182/86 178/175/80 +f 178/175/80 184/182/86 185/183/87 179/176/81 +f 179/177/81 185/184/87 186/185/88 180/178/82 +f 180/178/82 186/185/88 181/179/83 175/172/77 +f 181/179/83 187/186/47 188/187/89 182/180/84 +f 182/180/84 188/187/89 189/188/90 183/181/85 +f 183/181/85 189/188/90 190/189/39 184/182/86 +f 184/182/86 190/189/39 191/190/91 185/183/87 +f 185/184/87 191/191/91 192/192/92 186/185/88 +f 186/185/88 192/192/92 187/186/47 181/179/83 +f 187/186/47 193/193/93 194/194/94 188/187/89 +f 188/187/89 194/194/94 195/195/95 189/188/90 +f 189/188/90 195/195/95 196/196/96 190/189/39 +f 190/189/39 196/196/96 197/197/97 191/190/91 +f 191/191/91 197/198/97 198/199/98 192/192/92 +f 192/192/92 198/199/98 193/193/93 187/186/47 +f 193/193/93 199/200/72 200/201/99 194/194/94 +f 194/194/94 200/201/99 201/202/100 195/195/95 +f 195/195/95 201/202/100 202/203/67 196/196/96 +f 196/196/96 202/203/67 203/204/101 197/197/97 +f 197/198/97 203/205/101 204/206/102 198/199/98 +f 198/199/98 204/206/102 199/200/72 193/193/93 +f 199/200/72 205/207/43 206/208/103 200/201/99 +f 200/201/99 206/208/103 207/209/104 201/202/100 +f 201/202/100 207/209/104 208/210/35 202/203/67 +f 202/203/67 208/210/35 209/211/105 203/204/101 +f 203/205/101 209/212/105 210/213/106 204/206/102 +f 204/206/102 210/213/106 205/207/43 199/200/72 +f 205/207/43 211/214/80 212/215/107 206/208/103 +f 206/208/103 212/215/107 213/216/108 207/209/104 +f 207/209/104 213/216/108 214/217/77 208/210/35 +f 208/210/35 214/217/77 215/218/109 209/211/105 +f 209/212/105 215/219/109 216/220/110 210/213/106 +f 210/213/106 216/220/110 211/214/80 205/207/43 +f 211/221/80 217/222/86 218/223/111 212/224/107 +f 212/224/107 218/223/111 219/225/112 213/226/108 +f 213/226/108 219/225/112 220/227/83 214/228/77 +f 214/228/77 220/227/83 221/229/113 215/230/109 +f 215/231/109 221/232/113 222/233/114 216/234/110 +f 216/234/110 222/233/114 217/222/86 211/221/80 +f 217/222/86 223/235/39 224/236/115 218/223/111 +f 218/223/111 224/236/115 225/237/116 219/225/112 +f 219/225/112 225/237/116 226/238/47 220/227/83 +f 220/227/83 226/238/47 227/239/117 221/229/113 +f 221/232/113 227/240/117 228/241/118 222/233/114 +f 222/233/114 228/241/118 223/235/39 217/222/86 +f 223/235/39 229/242/96 230/243/119 224/236/115 +f 224/236/115 230/243/119 231/244/120 225/237/116 +f 225/237/116 231/244/120 232/245/93 226/238/47 +f 226/238/47 232/245/93 233/246/121 227/239/117 +f 227/240/117 233/247/121 234/248/122 228/241/118 +f 228/241/118 234/248/122 229/242/96 223/235/39 +f 229/242/96 163/158/67 164/161/69 230/243/119 +f 230/243/119 164/161/69 165/163/71 231/244/120 +f 231/244/120 165/163/71 166/165/72 232/245/93 +f 232/245/93 166/165/72 167/167/74 233/246/121 +f 233/247/121 167/168/74 168/171/76 234/248/122 +f 234/248/122 168/171/76 163/158/67 229/242/96 +f 235/158/67 241/159/35 242/160/68 236/161/69 +f 236/161/69 242/160/68 243/162/70 237/163/71 +f 237/163/71 243/162/70 244/164/43 238/165/72 +f 238/165/72 244/164/43 245/166/73 239/167/74 +f 239/168/74 245/169/73 246/170/75 240/171/76 +f 235/158/67 240/171/76 246/170/75 241/159/35 +f 241/159/35 247/172/77 248/173/78 242/160/68 +f 242/160/68 248/173/78 249/174/79 243/162/70 +f 243/162/70 249/174/79 250/175/80 244/164/43 +f 244/164/43 250/175/80 251/176/81 245/166/73 +f 245/169/73 251/177/81 252/178/82 246/170/75 +f 246/170/75 252/178/82 247/172/77 241/159/35 +f 247/172/77 253/179/83 254/180/84 248/173/78 +f 248/173/78 254/180/84 255/181/85 249/174/79 +f 249/174/79 255/181/85 256/182/86 250/175/80 +f 250/175/80 256/182/86 257/183/87 251/176/81 +f 251/177/81 257/184/87 258/185/88 252/178/82 +f 252/178/82 258/185/88 253/179/83 247/172/77 +f 253/179/83 259/186/47 260/187/89 254/180/84 +f 254/180/84 260/187/89 261/188/90 255/181/85 +f 255/181/85 261/188/90 262/189/39 256/182/86 +f 256/182/86 262/189/39 263/190/91 257/183/87 +f 257/184/87 263/191/91 264/192/92 258/185/88 +f 258/185/88 264/192/92 259/186/47 253/179/83 +f 259/186/47 265/193/93 266/194/94 260/187/89 +f 260/187/89 266/194/94 267/195/95 261/188/90 +f 261/188/90 267/195/95 268/196/96 262/189/39 +f 262/189/39 268/196/96 269/197/97 263/190/91 +f 263/191/91 269/198/97 270/199/98 264/192/92 +f 264/192/92 270/199/98 265/193/93 259/186/47 +f 265/193/93 271/200/72 272/201/99 266/194/94 +f 266/194/94 272/201/99 273/202/100 267/195/95 +f 267/195/95 273/202/100 274/203/67 268/196/96 +f 268/196/96 274/203/67 275/204/101 269/197/97 +f 269/198/97 275/205/101 276/206/102 270/199/98 +f 270/199/98 276/206/102 271/200/72 265/193/93 +f 271/200/72 277/207/43 278/208/103 272/201/99 +f 272/201/99 278/208/103 279/209/104 273/202/100 +f 273/202/100 279/209/104 280/210/35 274/203/67 +f 274/203/67 280/210/35 281/211/105 275/204/101 +f 275/205/101 281/212/105 282/213/106 276/206/102 +f 276/206/102 282/213/106 277/207/43 271/200/72 +f 277/207/43 283/214/80 284/215/107 278/208/103 +f 278/208/103 284/215/107 285/216/108 279/209/104 +f 279/209/104 285/216/108 286/217/77 280/210/35 +f 280/210/35 286/217/77 287/218/109 281/211/105 +f 281/212/105 287/219/109 288/220/110 282/213/106 +f 282/213/106 288/220/110 283/214/80 277/207/43 +f 283/221/80 289/222/86 290/223/111 284/224/107 +f 284/224/107 290/223/111 291/225/112 285/226/108 +f 285/226/108 291/225/112 292/227/83 286/228/77 +f 286/228/77 292/227/83 293/229/113 287/230/109 +f 287/231/109 293/232/113 294/233/114 288/234/110 +f 288/234/110 294/233/114 289/222/86 283/221/80 +f 289/222/86 295/235/39 296/236/115 290/223/111 +f 290/223/111 296/236/115 297/237/116 291/225/112 +f 291/225/112 297/237/116 298/238/47 292/227/83 +f 292/227/83 298/238/47 299/239/117 293/229/113 +f 293/232/113 299/240/117 300/241/118 294/233/114 +f 294/233/114 300/241/118 295/235/39 289/222/86 +f 295/235/39 301/242/96 302/243/119 296/236/115 +f 296/236/115 302/243/119 303/244/120 297/237/116 +f 297/237/116 303/244/120 304/245/93 298/238/47 +f 298/238/47 304/245/93 305/246/121 299/239/117 +f 299/240/117 305/247/121 306/248/122 300/241/118 +f 300/241/118 306/248/122 301/242/96 295/235/39 +f 301/242/96 235/158/67 236/161/69 302/243/119 +f 302/243/119 236/161/69 237/163/71 303/244/120 +f 303/244/120 237/163/71 238/165/72 304/245/93 +f 304/245/93 238/165/72 239/167/74 305/246/121 +f 305/247/121 239/168/74 240/171/76 306/248/122 +f 306/248/122 240/171/76 235/158/67 301/242/96 +f 307/249/96 313/250/67 314/251/69 308/252/119 +f 308/252/119 314/251/69 315/253/71 309/254/120 +f 309/254/120 315/253/71 316/255/72 310/256/93 +f 310/256/93 316/255/72 317/257/74 311/258/121 +f 311/259/121 317/260/74 318/261/76 312/262/122 +f 307/249/96 312/262/122 318/261/76 313/250/67 +f 313/250/67 319/263/35 320/264/68 314/251/69 +f 314/251/69 320/264/68 321/265/70 315/253/71 +f 315/253/71 321/265/70 322/266/43 316/255/72 +f 316/255/72 322/266/43 323/267/73 317/257/74 +f 317/260/74 323/268/73 324/269/75 318/261/76 +f 318/261/76 324/269/75 319/263/35 313/250/67 +f 319/263/35 325/270/77 326/271/78 320/264/68 +f 320/264/68 326/271/78 327/272/79 321/265/70 +f 321/265/70 327/272/79 328/273/80 322/266/43 +f 322/266/43 328/273/80 329/274/81 323/267/73 +f 323/268/73 329/275/81 330/276/82 324/269/75 +f 324/269/75 330/276/82 325/270/77 319/263/35 +f 325/270/77 331/277/83 332/278/84 326/271/78 +f 326/271/78 332/278/84 333/279/85 327/272/79 +f 327/272/79 333/279/85 334/280/86 328/273/80 +f 328/273/80 334/280/86 335/281/87 329/274/81 +f 329/275/81 335/282/87 336/283/88 330/276/82 +f 330/276/82 336/283/88 331/277/83 325/270/77 +f 331/277/83 337/284/47 338/285/89 332/278/84 +f 332/278/84 338/285/89 339/286/90 333/279/85 +f 333/279/85 339/286/90 340/287/39 334/280/86 +f 334/280/86 340/287/39 341/288/91 335/281/87 +f 335/282/87 341/289/91 342/290/92 336/283/88 +f 336/283/88 342/290/92 337/284/47 331/277/83 +f 337/284/47 343/291/93 344/292/94 338/285/89 +f 338/285/89 344/292/94 345/293/95 339/286/90 +f 339/286/90 345/293/95 346/294/96 340/287/39 +f 340/287/39 346/294/96 347/295/97 341/288/91 +f 341/289/91 347/296/97 348/297/98 342/290/92 +f 342/290/92 348/297/98 343/291/93 337/284/47 +f 343/291/93 349/298/72 350/299/99 344/292/94 +f 344/292/94 350/299/99 351/300/100 345/293/95 +f 345/293/95 351/300/100 352/301/67 346/294/96 +f 346/294/96 352/301/67 353/302/101 347/295/97 +f 347/296/97 353/303/101 354/304/102 348/297/98 +f 348/297/98 354/304/102 349/298/72 343/291/93 +f 349/298/72 355/305/43 356/306/103 350/299/99 +f 350/299/99 356/306/103 357/307/104 351/300/100 +f 351/300/100 357/307/104 358/308/35 352/301/67 +f 352/301/67 358/308/35 359/309/105 353/302/101 +f 353/303/101 359/310/105 360/311/106 354/304/102 +f 354/304/102 360/311/106 355/305/43 349/298/72 +f 355/305/43 361/312/80 362/313/107 356/306/103 +f 356/306/103 362/313/107 363/314/108 357/307/104 +f 357/307/104 363/314/108 364/315/77 358/308/35 +f 358/308/35 364/315/77 365/316/109 359/309/105 +f 359/310/105 365/317/109 366/318/110 360/311/106 +f 360/311/106 366/318/110 361/312/80 355/305/43 +f 361/319/80 367/320/86 368/321/111 362/322/107 +f 362/322/107 368/321/111 369/323/112 363/324/108 +f 363/324/108 369/323/112 370/325/83 364/326/77 +f 364/326/77 370/325/83 371/327/113 365/328/109 +f 365/329/109 371/330/113 372/331/114 366/332/110 +f 366/332/110 372/331/114 367/320/86 361/319/80 +f 367/320/86 373/333/39 374/334/115 368/321/111 +f 368/321/111 374/334/115 375/335/116 369/323/112 +f 369/323/112 375/335/116 376/336/47 370/325/83 +f 370/325/83 376/336/47 377/337/117 371/327/113 +f 371/330/113 377/338/117 378/339/118 372/331/114 +f 372/331/114 378/339/118 373/333/39 367/320/86 +f 373/333/39 307/249/96 308/252/119 374/334/115 +f 374/334/115 308/252/119 309/254/120 375/335/116 +f 375/335/116 309/254/120 310/256/93 376/336/47 +f 376/336/47 310/256/93 311/258/121 377/337/117 +f 377/338/117 311/259/121 312/262/122 378/339/118 +f 378/339/118 312/262/122 307/249/96 373/333/39 +f 379/340/123 380/341/41 382/342/124 381/343/125 +f 381/335/125 382/344/124 384/345/126 383/323/127 +f 383/323/127 384/345/126 386/346/33 385/324/128 +f 385/324/128 386/346/33 388/347/129 387/348/130 +f 389/349/131 390/350/132 380/341/41 379/340/123 +f 387/348/130 388/347/129 390/350/132 389/349/131 +f 389/349/131 379/340/123 391/351/133 396/352/134 +f 396/352/134 391/351/133 397/353/135 402/354/136 +f 387/348/130 389/349/131 396/352/134 395/355/137 +f 385/324/128 387/348/130 395/355/137 394/322/138 +f 383/323/127 385/324/128 394/322/138 393/321/139 +f 381/335/125 383/323/127 393/321/139 392/334/140 +f 379/340/123 381/343/125 392/356/140 391/351/133 +f 402/354/136 397/353/135 403/357/141 408/358/142 +f 395/355/137 396/352/134 402/354/136 401/359/143 +f 394/322/138 395/355/137 401/359/143 400/319/144 +f 393/321/139 394/322/138 400/319/144 399/320/145 +f 392/334/140 393/321/139 399/320/145 398/333/146 +f 391/351/133 392/356/140 398/360/146 397/353/135 +f 408/358/142 403/357/141 409/361/147 414/362/148 +f 401/359/143 402/354/136 408/358/142 407/363/149 +f 400/319/144 401/359/143 407/363/149 406/332/150 +f 399/320/145 400/319/144 406/332/150 405/331/151 +f 398/333/146 399/320/145 405/331/151 404/339/152 +f 397/353/135 398/360/146 404/364/152 403/357/141 +f 407/363/149 408/358/142 414/362/148 413/365/153 +f 406/332/150 407/363/149 413/365/153 412/329/154 +f 405/331/151 406/332/150 412/329/154 411/330/155 +f 404/339/152 405/331/151 411/330/155 410/338/156 +f 403/357/141 404/364/152 410/366/156 409/361/147 +f 415/340/157 416/341/33 418/342/129 417/343/158 +f 417/335/158 418/344/129 420/345/132 419/323/159 +f 419/323/159 420/345/132 422/346/41 421/324/160 +f 421/324/160 422/346/41 424/347/124 423/348/161 +f 425/349/162 426/350/126 416/341/33 415/340/157 +f 423/348/161 424/347/124 426/350/126 425/349/162 +f 425/349/162 415/340/157 427/351/163 432/352/164 +f 432/352/164 427/351/163 433/353/165 438/354/166 +f 423/348/161 425/349/162 432/352/164 431/355/167 +f 421/324/160 423/348/161 431/355/167 430/322/168 +f 419/323/159 421/324/160 430/322/168 429/321/169 +f 417/335/158 419/323/159 429/321/169 428/334/170 +f 415/340/157 417/343/158 428/356/170 427/351/163 +f 438/354/166 433/353/165 439/357/171 444/358/172 +f 431/355/167 432/352/164 438/354/166 437/359/173 +f 430/322/168 431/355/167 437/359/173 436/319/174 +f 429/321/169 430/322/168 436/319/174 435/320/175 +f 428/334/170 429/321/169 435/320/175 434/333/176 +f 427/351/163 428/356/170 434/360/176 433/353/165 +f 444/358/172 439/357/171 445/361/177 450/362/178 +f 437/359/173 438/354/166 444/358/172 443/363/179 +f 436/319/174 437/359/173 443/363/179 442/332/180 +f 435/320/175 436/319/174 442/332/180 441/331/181 +f 434/333/176 435/320/175 441/331/181 440/339/182 +f 433/353/165 434/360/176 440/364/182 439/357/171 +f 443/363/179 444/358/172 450/362/178 449/365/183 +f 442/332/180 443/363/179 449/365/183 448/329/184 +f 441/331/181 442/332/180 448/329/184 447/330/185 +f 440/339/182 441/331/181 447/330/185 446/338/186 +f 439/357/171 440/364/182 446/366/186 445/361/177 +f 451/340/187 452/341/132 454/342/41 453/343/188 +f 453/335/188 454/344/41 456/345/124 455/323/189 +f 455/323/189 456/345/124 458/346/126 457/324/190 +f 457/324/190 458/346/126 460/347/33 459/348/191 +f 461/349/192 462/350/129 452/341/132 451/340/187 +f 459/348/191 460/347/33 462/350/129 461/349/192 +f 461/349/192 451/340/187 463/351/193 468/352/194 +f 468/352/194 463/351/193 469/353/195 474/354/196 +f 459/348/191 461/349/192 468/352/194 467/355/197 +f 457/324/190 459/348/191 467/355/197 466/322/198 +f 455/323/189 457/324/190 466/322/198 465/321/199 +f 453/335/188 455/323/189 465/321/199 464/334/200 +f 451/340/187 453/343/188 464/356/200 463/351/193 +f 474/354/196 469/353/195 475/357/201 480/358/202 +f 467/355/197 468/352/194 474/354/196 473/359/203 +f 466/322/198 467/355/197 473/359/203 472/319/204 +f 465/321/199 466/322/198 472/319/204 471/320/205 +f 464/334/200 465/321/199 471/320/205 470/333/206 +f 463/351/193 464/356/200 470/360/206 469/353/195 +f 480/358/202 475/357/201 481/361/207 486/362/208 +f 473/359/203 474/354/196 480/358/202 479/363/209 +f 472/319/204 473/359/203 479/363/209 478/332/210 +f 471/320/205 472/319/204 478/332/210 477/331/211 +f 470/333/206 471/320/205 477/331/211 476/339/212 +f 469/353/195 470/360/206 476/364/212 475/357/201 +f 479/363/209 480/358/202 486/362/208 485/365/213 +f 478/332/210 479/363/209 485/365/213 484/329/214 +f 477/331/211 478/332/210 484/329/214 483/330/215 +f 476/339/212 477/331/211 483/330/215 482/338/216 +f 475/357/201 476/364/212 482/366/216 481/361/207 +f 487/340/217 488/341/126 490/342/33 489/343/218 +f 489/335/218 490/344/33 492/345/129 491/323/219 +f 491/323/219 492/345/129 494/346/132 493/324/220 +f 493/324/220 494/346/132 496/347/41 495/348/221 +f 497/349/222 498/350/124 488/341/126 487/340/217 +f 495/348/221 496/347/41 498/350/124 497/349/222 +f 497/349/222 487/340/217 499/351/223 504/352/224 +f 504/352/224 499/351/223 505/353/225 510/354/226 +f 495/348/221 497/349/222 504/352/224 503/355/227 +f 493/324/220 495/348/221 503/355/227 502/322/228 +f 491/323/219 493/324/220 502/322/228 501/321/229 +f 489/335/218 491/323/219 501/321/229 500/334/230 +f 487/340/217 489/343/218 500/356/230 499/351/223 +f 510/354/226 505/353/225 511/357/231 516/358/232 +f 503/355/227 504/352/224 510/354/226 509/359/233 +f 502/322/228 503/355/227 509/359/233 508/319/234 +f 501/321/229 502/322/228 508/319/234 507/320/235 +f 500/334/230 501/321/229 507/320/235 506/333/236 +f 499/351/223 500/356/230 506/360/236 505/353/225 +f 516/358/232 511/357/231 517/361/237 522/362/238 +f 509/359/233 510/354/226 516/358/232 515/363/239 +f 508/319/234 509/359/233 515/363/239 514/332/240 +f 507/320/235 508/319/234 514/332/240 513/331/241 +f 506/333/236 507/320/235 513/331/241 512/339/242 +f 505/353/225 506/360/236 512/364/242 511/357/231 +f 515/363/239 516/358/232 522/362/238 521/365/243 +f 514/332/240 515/363/239 521/365/243 520/329/244 +f 513/331/241 514/332/240 520/329/244 519/330/245 +f 512/339/242 513/331/241 519/330/245 518/338/246 +f 511/357/231 512/364/242 518/366/246 517/361/237 +f 523/340/247 524/341/129 526/342/132 525/343/248 +f 525/335/248 526/344/132 528/345/41 527/323/249 +f 527/323/249 528/345/41 530/346/124 529/324/250 +f 529/324/250 530/346/124 532/347/126 531/348/251 +f 533/349/252 534/350/33 524/341/129 523/340/247 +f 531/348/251 532/347/126 534/350/33 533/349/252 +f 533/349/252 523/340/247 535/351/253 540/352/254 +f 540/352/254 535/351/253 541/353/255 546/354/256 +f 531/348/251 533/349/252 540/352/254 539/355/257 +f 529/324/250 531/348/251 539/355/257 538/322/258 +f 527/323/249 529/324/250 538/322/258 537/321/259 +f 525/335/248 527/323/249 537/321/259 536/334/260 +f 523/340/247 525/343/248 536/356/260 535/351/253 +f 546/354/256 541/353/255 547/357/261 552/358/262 +f 539/355/257 540/352/254 546/354/256 545/359/263 +f 538/322/258 539/355/257 545/359/263 544/319/264 +f 537/321/259 538/322/258 544/319/264 543/320/265 +f 536/334/260 537/321/259 543/320/265 542/333/266 +f 535/351/253 536/356/260 542/360/266 541/353/255 +f 552/358/262 547/357/261 553/361/267 558/362/268 +f 545/359/263 546/354/256 552/358/262 551/363/269 +f 544/319/264 545/359/263 551/363/269 550/332/270 +f 543/320/265 544/319/264 550/332/270 549/331/271 +f 542/333/266 543/320/265 549/331/271 548/339/272 +f 541/353/255 542/360/266 548/364/272 547/357/261 +f 551/363/269 552/358/262 558/362/268 557/365/273 +f 550/332/270 551/363/269 557/365/273 556/329/274 +f 549/331/271 550/332/270 556/329/274 555/330/275 +f 548/339/272 549/331/271 555/330/275 554/338/276 +f 547/357/261 548/364/272 554/366/276 553/361/267 +f 559/340/277 560/341/124 562/342/126 561/343/278 +f 561/335/278 562/344/126 564/345/33 563/323/279 +f 563/323/279 564/345/33 566/346/129 565/324/280 +f 565/324/280 566/346/129 568/347/132 567/348/281 +f 569/349/282 570/350/41 560/341/124 559/340/277 +f 567/348/281 568/347/132 570/350/41 569/349/282 +f 569/349/282 559/340/277 571/351/283 576/352/284 +f 576/352/284 571/351/283 577/353/285 582/354/286 +f 567/348/281 569/349/282 576/352/284 575/355/287 +f 565/324/280 567/348/281 575/355/287 574/322/288 +f 563/323/279 565/324/280 574/322/288 573/321/289 +f 561/335/278 563/323/279 573/321/289 572/334/290 +f 559/340/277 561/343/278 572/356/290 571/351/283 +f 582/354/286 577/353/285 583/357/291 588/358/292 +f 575/355/287 576/352/284 582/354/286 581/359/293 +f 574/322/288 575/355/287 581/359/293 580/319/294 +f 573/321/289 574/322/288 580/319/294 579/320/295 +f 572/334/290 573/321/289 579/320/295 578/333/296 +f 571/351/283 572/356/290 578/360/296 577/353/285 +f 588/358/292 583/357/291 589/361/297 594/362/298 +f 581/359/293 582/354/286 588/358/292 587/363/299 +f 580/319/294 581/359/293 587/363/299 586/332/300 +f 579/320/295 580/319/294 586/332/300 585/331/301 +f 578/333/296 579/320/295 585/331/301 584/339/302 +f 577/353/285 578/360/296 584/364/302 583/357/291 +f 587/363/299 588/358/292 594/362/298 593/365/303 +f 586/332/300 587/363/299 593/365/303 592/329/304 +f 585/331/301 586/332/300 592/329/304 591/330/305 +f 584/339/302 585/331/301 591/330/305 590/338/306 +f 583/357/291 584/364/302 590/366/306 589/361/297 +g cage_Cylinder.004_bulb +f 654/235/307 652/221/308 621/231/309 620/240/310 +f 671/186/311 625/191/312 624/205/313 672/200/314 +f 672/200/314 624/205/313 623/219/315 673/214/316 +f 673/367/316 623/368/315 622/369/317 651/370/318 +f 663/337/319 662/257/320 634/371/321 629/372/322 +f 644/286/323 643/300/324 659/302/325 660/288/326 +f 659/302/325 666/316/327 633/373/328 627/374/329 +f 666/375/327 665/376/330 632/377/331 633/378/328 +f 631/379/332 629/372/322 645/174/333 647/188/334 +f 665/376/330 664/328/335 631/379/332 632/377/331 +f 629/372/322 634/371/321 642/163/336 645/174/333 +f 664/328/335 663/337/319 629/372/322 631/379/332 +f 660/288/326 628/380/337 630/381/338 661/274/339 +f 670/270/340 668/284/341 644/286/323 646/272/342 +f 645/174/333 642/163/336 658/158/343 669/172/344 +f 642/163/336 638/237/345 654/235/307 658/158/343 +f 647/188/334 645/174/333 669/172/344 671/186/311 +f 655/319/346 639/324/347 640/349/348 656/354/349 +f 656/354/349 640/349/348 641/343/350 657/360/351 +f 657/312/351 641/314/350 643/300/324 667/298/352 +f 668/284/341 667/298/352 643/300/324 644/286/323 +f 652/221/308 651/370/318 622/369/317 621/231/309 +f 627/374/329 633/373/328 649/382/353 635/383/354 +f 633/378/328 632/377/331 648/202/355 649/216/353 +f 639/324/347 637/335/356 663/337/319 664/328/335 +f 632/377/331 631/379/332 647/188/334 648/202/355 +f 637/335/356 650/253/357 662/257/320 663/337/319 +f 661/274/339 630/381/338 634/371/321 662/257/320 +f 630/381/338 628/380/337 636/226/358 638/237/345 +f 619/384/359 620/385/310 675/287/50 +f 669/172/344 626/177/360 625/191/312 671/186/311 +f 658/158/343 619/168/359 626/177/360 669/172/344 +f 658/158/343 654/235/307 620/240/310 619/168/359 +f 646/272/342 644/286/323 660/288/326 661/274/339 +f 650/253/357 646/272/342 661/274/339 662/257/320 +f 634/371/321 630/381/338 638/237/345 642/163/336 +f 636/226/358 635/383/354 651/370/318 652/221/308 +f 640/349/348 639/324/347 664/328/335 665/376/330 +f 641/343/350 640/349/348 665/376/330 666/375/327 +f 643/300/324 641/314/350 666/316/327 659/302/325 +f 659/302/325 627/374/329 628/380/337 660/288/326 +f 628/380/337 627/374/329 635/383/354 636/226/358 +f 635/383/354 649/382/353 673/367/316 651/370/318 +f 649/216/353 648/202/355 672/200/314 673/214/316 +f 653/333/361 637/335/356 639/324/347 655/319/346 +f 648/202/355 647/188/334 671/186/311 672/200/314 +f 674/250/362 650/253/357 637/335/356 653/333/361 +f 674/250/362 670/270/340 646/272/342 650/253/357 +f 638/237/345 636/226/358 652/221/308 654/235/307 +f 620/385/310 621/386/309 675/287/50 +f 621/386/309 622/387/317 675/287/50 +f 622/387/317 623/388/315 675/287/50 +f 623/388/315 624/389/313 675/287/50 +f 624/389/313 625/390/312 675/287/50 +f 625/390/312 626/391/360 675/287/50 +f 626/391/360 619/384/359 675/287/50 +g cage_Cylinder.004_brass +f 618/338/363 611/260/364 674/250/33 653/333/47 +f 611/260/364 612/275/365 670/270/35 674/250/33 +f 617/329/366 618/338/363 653/333/47 655/319/45 +f 614/303/367 615/317/368 657/312/41 667/298/39 +f 615/366/368 616/362/369 656/354/43 657/360/41 +f 616/362/369 617/329/366 655/319/45 656/354/43 +f 612/275/365 613/289/370 668/284/37 670/270/35 +f 613/289/370 614/303/367 667/298/39 668/284/37 +f 611/392/364 618/393/363 691/394/371 +f 618/393/363 617/395/366 690/396/372 +f 617/395/366 616/397/369 689/398/373 +f 616/397/369 615/399/368 688/400/374 +f 615/399/368 614/401/367 687/402/375 +f 614/401/367 613/403/370 686/404/376 +f 613/403/370 612/405/365 685/406/377 +f 612/405/365 611/392/364 684/407/378 +f 691/394/371 676/408/379 611/392/364 +f 618/393/363 683/409/380 691/394/371 +f 690/396/372 683/409/380 618/393/363 +f 617/395/366 682/410/381 690/396/372 +f 689/398/373 682/410/381 617/395/366 +f 616/397/369 681/411/382 689/398/373 +f 688/400/374 681/411/382 616/397/369 +f 615/399/368 680/412/383 688/400/374 +f 687/402/375 680/412/383 615/399/368 +f 614/401/367 679/413/384 687/402/375 +f 686/404/376 679/413/384 614/401/367 +f 613/403/370 678/414/385 686/404/376 +f 685/406/377 678/414/385 613/403/370 +f 612/405/365 677/415/386 685/406/377 +f 684/407/378 677/415/386 612/405/365 +f 611/392/364 676/408/379 684/407/378 +g cage_Cylinder.004_lens +f 82/220/387 83/378/33 85/416/34 84/213/388 +f 84/213/388 85/416/34 87/377/35 86/206/389 +f 86/206/389 87/377/35 89/417/36 88/199/390 +f 88/199/390 89/417/36 91/379/37 90/192/391 +f 90/192/391 91/379/37 93/418/38 92/185/392 +f 92/185/392 93/418/38 95/372/39 94/178/393 +f 94/178/393 95/372/39 97/419/40 96/170/394 +f 96/170/394 97/419/40 99/371/41 98/171/395 +f 98/171/395 99/371/41 101/420/42 100/248/396 +f 100/248/396 101/420/42 103/381/43 102/241/397 +f 102/241/397 103/381/43 105/421/44 104/233/398 +f 104/233/398 105/421/44 107/380/45 106/234/399 +f 106/234/399 107/380/45 109/422/46 108/423/400 +f 108/423/400 109/422/46 111/374/47 110/424/401 +f 145/425/402 146/426/403 114/253/50 +f 112/427/404 113/428/49 83/373/33 82/429/387 +f 110/424/401 111/374/47 113/428/49 112/427/404 +f 162/430/405 131/431/406 115/432/407 130/433/408 +f 144/434/409 145/425/402 114/253/50 +f 143/435/410 144/434/409 114/253/50 +f 142/436/411 143/435/410 114/253/50 +f 141/437/412 142/436/411 114/253/50 +f 140/438/413 141/437/412 114/253/50 +f 139/439/414 140/438/413 114/253/50 +f 138/440/415 139/439/414 114/253/50 +f 137/441/416 138/440/415 114/253/50 +f 136/442/417 137/441/416 114/253/50 +f 135/443/418 136/442/417 114/253/50 +f 134/444/419 135/443/418 114/253/50 +f 133/445/420 134/444/419 114/253/50 +f 132/446/421 133/445/420 114/253/50 +f 147/447/422 132/446/421 114/253/50 +f 161/448/423 162/430/405 130/433/408 129/449/424 +f 160/450/425 161/448/423 129/449/424 128/451/426 +f 159/452/427 160/450/425 128/451/426 127/453/428 +f 158/454/429 159/452/427 127/453/428 126/455/430 +f 157/456/431 158/454/429 126/455/430 125/457/432 +f 156/458/433 157/456/431 125/457/432 124/459/434 +f 155/460/435 156/458/433 124/459/434 123/461/436 +f 154/462/437 155/460/435 123/461/436 122/463/438 +f 153/464/439 154/462/437 122/463/438 121/465/440 +f 152/466/441 153/464/439 121/465/440 120/467/442 +f 151/468/443 152/466/441 120/467/442 119/469/444 +f 150/470/445 151/468/443 119/469/444 118/471/446 +f 149/472/447 150/470/445 118/471/446 117/473/448 +f 148/474/449 149/472/447 117/473/448 116/475/450 +f 131/431/406 148/474/449 116/475/450 115/432/407 +f 82/220/387 84/213/388 148/212/449 131/219/406 +f 84/213/388 86/206/389 149/205/447 148/212/449 +f 86/206/389 88/199/390 150/198/445 149/205/447 +f 88/199/390 90/192/391 151/191/443 150/198/445 +f 90/192/391 92/185/392 152/184/441 151/191/443 +f 92/185/392 94/178/393 153/177/439 152/184/441 +f 94/178/393 96/170/394 154/169/437 153/177/439 +f 96/170/394 98/171/395 155/168/435 154/169/437 +f 98/171/395 100/248/396 156/247/433 155/168/435 +f 100/248/396 102/241/397 157/240/431 156/247/433 +f 102/241/397 104/233/398 158/232/429 157/240/431 +f 104/233/398 106/234/399 159/231/427 158/232/429 +f 106/234/399 108/423/400 160/476/425 159/231/427 +f 108/423/400 110/424/401 161/369/423 160/476/425 +f 110/424/401 112/427/404 162/477/405 161/369/423 +f 130/433/408 115/432/407 147/447/422 146/426/403 +f 129/449/424 130/433/408 146/426/403 145/425/402 +f 128/451/426 129/449/424 145/425/402 144/434/409 +f 127/453/428 128/451/426 144/434/409 143/435/410 +f 126/455/430 127/453/428 143/435/410 142/436/411 +f 125/457/432 126/455/430 142/436/411 141/437/412 +f 124/459/434 125/457/432 141/437/412 140/438/413 +f 123/461/436 124/459/434 140/438/413 139/439/414 +f 122/463/438 123/461/436 139/439/414 138/440/415 +f 121/465/440 122/463/438 138/440/415 137/441/416 +f 120/467/442 121/465/440 137/441/416 136/442/417 +f 119/469/444 120/467/442 136/442/417 135/443/418 +f 118/471/446 119/469/444 135/443/418 134/444/419 +f 117/473/448 118/471/446 134/444/419 133/445/420 +f 116/475/450 117/473/448 133/445/420 132/446/421 +f 112/427/404 82/429/387 131/368/406 162/477/405 +f 115/432/407 116/475/450 132/446/421 147/447/422 +f 146/426/403 147/447/422 114/253/50 diff --git a/mods/ilights/textures/ilights_lamp_base.png b/mods/ilights/textures/ilights_lamp_base.png new file mode 100644 index 00000000..335eb507 Binary files /dev/null and b/mods/ilights/textures/ilights_lamp_base.png differ diff --git a/mods/ilights/textures/ilights_lamp_bulb_base.png b/mods/ilights/textures/ilights_lamp_bulb_base.png new file mode 100644 index 00000000..7f9d2997 Binary files /dev/null and b/mods/ilights/textures/ilights_lamp_bulb_base.png differ diff --git a/mods/ilights/textures/ilights_lamp_bulb_off.png b/mods/ilights/textures/ilights_lamp_bulb_off.png new file mode 100644 index 00000000..da906083 Binary files /dev/null and b/mods/ilights/textures/ilights_lamp_bulb_off.png differ diff --git a/mods/ilights/textures/ilights_lamp_bulb_on.png b/mods/ilights/textures/ilights_lamp_bulb_on.png new file mode 100644 index 00000000..16c67cd4 Binary files /dev/null and b/mods/ilights/textures/ilights_lamp_bulb_on.png differ diff --git a/mods/ilights/textures/ilights_lamp_cage.png b/mods/ilights/textures/ilights_lamp_cage.png new file mode 100644 index 00000000..fbbb40af Binary files /dev/null and b/mods/ilights/textures/ilights_lamp_cage.png differ diff --git a/mods/ilights/textures/ilights_lamp_lens_off.png b/mods/ilights/textures/ilights_lamp_lens_off.png new file mode 100644 index 00000000..95e9485d Binary files /dev/null and b/mods/ilights/textures/ilights_lamp_lens_off.png differ diff --git a/mods/ilights/textures/ilights_lamp_lens_on.png b/mods/ilights/textures/ilights_lamp_lens_on.png new file mode 100644 index 00000000..50f2214e Binary files /dev/null and b/mods/ilights/textures/ilights_lamp_lens_on.png differ diff --git a/mods/minetest_colorcubes/README.md b/mods/minetest_colorcubes/README.md new file mode 100644 index 00000000..d26267dd --- /dev/null +++ b/mods/minetest_colorcubes/README.md @@ -0,0 +1,104 @@ +# Color Cubes [`colorcubes`] +## Description +This mod adds various decorational and colorful blocks to Minetest. This is mostly for creative purposes. + +## Current version +The current version of this mod is 0.4. + +## Block types and colors +The blocks come in 5 types and 19 colors. + +Each block can be dug by hand in a half second. + +The following block types are available: + +* Basic color cubes: These blocks have a single square pattern +* Tiled color cubes: These blocks have 4 squares in a tile pattern +* Concentric color cubes: These blocks have a pattern of 4 concentric squares +* Window color cubes: These blocks are semi-transparent and let sunlight go through +* Light color cubes: These blocks emit light + +### Light color cubes +There are 13 light color cubes. Each light color cube has a different +brightness, depending on its color. The available colors for light color +cubes are, sorted by brightness: + +1. White +2. Yellow +3. Orange +4. Red +5. Red-violet +6. Magenta +7. Violet +8. Blue +9. Skyblue +10. Cyan +11. Aqua +12. Green +13. Lime + +## Crafting +Some blocks can be crafted for convenience. + +### Basic color cubes +This is crafted by multiple means. + +Place a tiled color cube of a single color in the crafting grid +to obtain 4 basic color cubes. + +Place a concentric color cube in the crafting grid +to obtain 8 basic color cubes. + +### Tiled color cubes +This is crafted by placing 4 basic color cubes of the same +color into the crafting grid like this: + + XX + XX + +This yields one tiled color cube of the same color. + +There are also a few tiled color cubes with a 2 color mosaic available. +They can be crafted from 4 basic color cubes: + + 12 + 21 + +“1” stands for the first color and “2” for the second color. + +The following color combinations are available (usually complementary colors): + +* Yellow and blue +* Red and cyan +* Green and magenta +* Aqua and red-violet +* Orange and skyblue +* Orange and brown +* Black and white +* Light gray and dark gray + +### Concentric color cubes +This is crafted by placing 8 basic color cubes of the same +color into the crafting grid like this: + + XXX + X X + XXX + +This yields one concentric color cube of the same color. + +## Coloring +All cubes can be colored by multiple means. The first one +is by crafting: Place a dye and a color cube into the crafting +grid (shapeless recipe) to create a color cube of the dye color. + +This mod supports the Paint Roller mod [`paint_roller`]. +All color cubes can be painted to change their color, +provided the color is available. + +This mod is supported by the Color Machine mod [`colormachine`] +for repainting most of the blocks in this mod. + +## License +The entire mod (including all its files) falls under the MIT License. +Do whatever you want, have fun! :-) diff --git a/mods/minetest_colorcubes/init.lua b/mods/minetest_colorcubes/init.lua new file mode 100644 index 00000000..3c26f96f --- /dev/null +++ b/mods/minetest_colorcubes/init.lua @@ -0,0 +1,308 @@ +local S = minetest.get_translator("colorcubes") + +local cc = {} +cc.colors = { "white", "yellow", "orange", "red", "redviolet", "magenta", "violet", "blue", "skyblue", "cyan", "aqua", "green", "lime", "pink", "brown", "dark_green", "light_gray", "dark_gray", "black" } +cc.dye_colors = { + white = "unicolor_white", yellow = "unicolor_yellow", orange = "unicolor_orange", red = "unicolor_red", redviolet = "unicolor_red_violet", magenta = "unicolor_magenta", violet = "unicolor_violet", blue = "unicolor_blue", skyblue = "unicolor_sky_blue", cyan = "unicolor_cyan", aqua = "unicolor_aqua", green = "unicolor_green", lime = "unicolor_lime", pink = "unicolor_light_red", brown = "unicolor_dark_orange", dark_green = "unicolor_dark_green", light_gray = "unicolor_grey", dark_gray = "unicolor_darkgrey", black = "unicolor_black" } +cc.human_colors = { + single = { + white = S("White basic color cube"), + yellow = S("Yellow basic color cube"), + orange = S("Orange basic color cube"), + red = S("Red basic color cube"), + redviolet = S("Red-violet basic color cube"), + magenta = S("Magenta basic color cube"), + violet = S("Violet basic color cube"), + blue = S("Blue basic color cube"), + skyblue = S("Skyblue basic color cube"), + cyan = S("Cyan basic color cube"), + aqua = S("Aqua basic color cube"), + green = S("Green basic color cube"), + lime = S("Lime basic color cube"), + pink = S("Pink basic color cube"), + brown = S("Brown basic color cube"), + dark_green = S("Dark green basic color cube"), + light_gray = S("Light gray basic color cube"), + dark_gray = S("Dark gray basic color cube"), + black = S("Black basic color cube"), + }, + window = { + white = S("White window color cube"), + yellow = S("Yellow window color cube"), + orange = S("Orange window color cube"), + red = S("Red window color cube"), + redviolet = S("Red-violet window color cube"), + magenta = S("Magenta window color cube"), + violet = S("Violet window color cube"), + blue = S("Blue window color cube"), + skyblue = S("Skyblue window color cube"), + cyan = S("Cyan window color cube"), + aqua = S("Aqua window color cube"), + green = S("Green window color cube"), + lime = S("Lime window color cube"), + pink = S("Pink window color cube"), + brown = S("Brown window color cube"), + dark_green = S("Dark green window color cube"), + light_gray = S("Light gray window color cube"), + dark_gray = S("Dark gray window color cube"), + black = S("Black window color cube"), + }, + tiled = { + white = S("White tiled color cube"), + yellow = S("Yellow tiled color cube"), + orange = S("Orange tiled color cube"), + red = S("Red tiled color cube"), + redviolet = S("Red-violet tiled color cube"), + magenta = S("Magenta tiled color cube"), + violet = S("Violet tiled color cube"), + blue = S("Blue tiled color cube"), + skyblue = S("Skyblue tiled color cube"), + cyan = S("Cyan tiled color cube"), + aqua = S("Aqua tiled color cube"), + green = S("Green tiled color cube"), + lime = S("Lime tiled color cube"), + pink = S("Pink tiled color cube"), + brown = S("Brown tiled color cube"), + dark_green = S("Dark green tiled color cube"), + light_gray = S("Light gray tiled color cube"), + dark_gray = S("Dark gray tiled color cube"), + black = S("Black tiled color cube"), + }, + inward = { + white = S("White concentric color cube"), + yellow = S("Yellow concentric color cube"), + orange = S("Orange concentric color cube"), + red = S("Red concentric color cube"), + redviolet = S("Red-violet concentric color cube"), + magenta = S("Magenta concentric color cube"), + violet = S("Violet concentric color cube"), + blue = S("Blue concentric color cube"), + skyblue = S("Skyblue concentric color cube"), + cyan = S("Cyan concentric color cube"), + aqua = S("Aqua concentric color cube"), + green = S("Green concentric color cube"), + lime = S("Lime concentric color cube"), + pink = S("Pink concentric color cube"), + brown = S("Brown concentric color cube"), + dark_green = S("Dark green concentric color cube"), + light_gray = S("Light gray concentric color cube"), + dark_gray = S("Dark gray concentric color cube"), + black = S("Black concentric color cube"), + }, + light = { + white = S("White light color cube"), + yellow = S("Yellow light color cube"), + orange = S("Orange light color cube"), + red = S("Red light color cube"), + redviolet = S("Red-violet light color cube"), + magenta = S("Magenta light color cube"), + violet = S("Violet light color cube"), + blue = S("Blue light color cube"), + skyblue = S("Skyblue light color cube"), + cyan = S("Cyan light color cube"), + aqua = S("Aqua light color cube"), + green = S("Green light color cube"), + lime = S("Lime light color cube"), + } +} + +local light_level = 14 + +local soundmaker = function (mod) + if mod == nil then mod = 0 end + + local scrub = function(value) + return math.min(1, math.max(value, 0)) + end + + return { footstep = { name = "colorcubes_block_footstep", gain = scrub(0.25 + mod) }, + dig = { name = "colorcubes_block_dig", gain = scrub(1) }, + dug = { name = "colorcubes_block_dug", gain = scrub(0.7 + mod) }, + place = { name = "colorcubes_block_place", gain = 0.5 }, } +end + +--[[ +Color Cubes groups for better identification: +colorcube=1: this item is a color cube +colorcube_single=1: basic color cube +colorcube_window=1: window color cube +colorcube_tiled=1: tiled color cube (1 color) +colorcube_tiled=2: tiled color cube (2 colors) +colorcube_inward=1: concentric color cube +colorcube_light=1: light color cube +]] + +for i=1,#cc.colors do + local c = cc.colors[i] + local d = cc.dye_colors[c] + -- Blocks with a simple square pattern + local nodedef1 = { + description = cc.human_colors.single[c], + tiles = { "colorcubes_1_"..c..".png" }, + groups = { dig_immediate = 2, colorcube = 1, colorcube_single = 1 }, + sounds = soundmaker(0), + } + minetest.register_node("colorcubes:"..c.."_single", nodedef1) + -- Windows + local nodedef_window = { + description = cc.human_colors.window[c], + tiles = { "colorcubes_window_"..c..".png" }, + groups = { dig_immediate = 2, colorcube = 1, colorcube_window = 1 }, + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, + paramtype = "light", + sounds = soundmaker(-0.1), + } + minetest.register_node("colorcubes:"..c.."_window", nodedef_window) + -- Blocks with a tile pattern (4 tiles) + local nodedef4 = { + description = cc.human_colors.tiled[c], + tiles = { "colorcubes_4_"..c..".png" }, + groups = { dig_immediate = 2, colorcube = 1, colorcube_tiled = 1 }, + sounds = soundmaker(0.1), + } + minetest.register_node("colorcubes:"..c.."_tiled", nodedef4) + -- Blocks with a concentric square pattern + local nodedef_inward = { + description = cc.human_colors.inward[c], + tiles = { "colorcubes_inward_"..c..".png" }, + groups = { dig_immediate = 2, colorcube = 1, colorcube_inward = 1}, + sounds = soundmaker(0.15), + } + minetest.register_node("colorcubes:"..c.."_inward", nodedef_inward) + -- Lamps in different brightness levels + if light_level > 1 then + local nodedef_light = { + description = cc.human_colors.light[c], + tiles = { "colorcubes_light_"..c..".png" }, + groups = { dig_immediate = 2, colorcube = 1, colorcube_light = 1 }, + sounds = soundmaker(-0.05), + light_source = light_level, + } + minetest.register_node("colorcubes:"..c.."_light", nodedef_light) + if(minetest.get_modpath("paint_roller") ~= nil) then + paint_roller.register_one("colorcubes:"..c.."_light", d, "light color cubes" ) + end + light_level = light_level - 1 + end + + --[[ If the paint_roller mod is installed, register the nodes to it ]] + if(minetest.get_modpath("paint_roller") ~= nil) then + paint_roller.register_one("colorcubes:"..c.."_single", d, "basic color cubes" ) + paint_roller.register_one("colorcubes:"..c.."_tiled", d, "tiled color cubes" ) + paint_roller.register_one("colorcubes:"..c.."_inward", d, "concentric color cubes" ) + paint_roller.register_one("colorcubes:"..c.."_window", d, "window color cubes" ) + end + + -- Register various crafting recipes for convenience + minetest.register_craft({ + output = "colorcubes:"..c.."_tiled", + recipe = { + {"colorcubes:"..c.."_single", "colorcubes:"..c.."_single" }, + {"colorcubes:"..c.."_single", "colorcubes:"..c.."_single" }, + }, + }) + minetest.register_craft({ + output = "colorcubes:"..c.."_inward", + recipe = { + {"colorcubes:"..c.."_single", "colorcubes:"..c.."_single", "colorcubes:"..c.."_single" }, + {"colorcubes:"..c.."_single", "", "colorcubes:"..c.."_single" }, + {"colorcubes:"..c.."_single", "colorcubes:"..c.."_single", "colorcubes:"..c.."_single" }, + }, + }) + minetest.register_craft({ + output = "colorcubes:"..c.."_single 8", + recipe = { + {"colorcubes:"..c.."_inward" } + }, + }) + minetest.register_craft({ + output = "colorcubes:"..c.."_single 4", + recipe = { + {"colorcubes:"..c.."_tiled" } + }, + }) + + -- Color recipes (dye + color cube) + minetest.register_craft({ + type = "shapeless", + output = "colorcubes:"..c.."_single", + recipe = { "group:dye,"..d, "group:colorcube_single" }, + }) + minetest.register_craft({ + type = "shapeless", + output = "colorcubes:"..c.."_tiled", + recipe = { "group:dye,"..d, "group:colorcube_tiled" }, + }) + minetest.register_craft({ + type = "shapeless", + output = "colorcubes:"..c.."_inward", + recipe = { "group:dye,"..d, "group:colorcube_inward" }, + }) + minetest.register_craft({ + type = "shapeless", + output = "colorcubes:"..c.."_light", + recipe = { "group:dye,"..d, "group:colorcube_light" }, + }) + minetest.register_craft({ + type = "shapeless", + output = "colorcubes:"..c.."_window", + recipe = { "group:dye,"..d, "group:colorcube_window" }, + }) + +end + +--[[ Tiled blocks with 2 different colors (usuall complementary colors) ]] + +local complementary = { { "yellow", "blue"}, {"aqua", "redviolet"}, {"red", "cyan"}, {"light_gray", "dark_gray"}, {"green", "magenta"}, {"orange", "skyblue"}, {"lime", "violet"}, {"black", "white"}, {"orange", "brown"} } +local complementary_names = { + S("Yellow/blue tiled color cube"), + S("Aqua/red-violet tiled color cube"), + S("Red/cyan tiled color cube"), + S("Light/dark gray tiled color cube"), + S("Green/magenta tiled color cube"), + S("Orange/skyblue tiled color cube"), + S("Lime/violet tiled color cube"), + S("Black/white tiled color cube"), + S("Orange/brown tiled color cube"), +} + +for i=1,#complementary do + local c1, c2 + c1 = complementary[i][1] + c2 = complementary[i][2] + local nodeid = "colorcubes:"..c1.."_"..c2.."_tiled" + local tex = "colorcubes_4c_"..c1.."_"..c2..".png" + local texR90 = tex .. "^[transformR90" + minetest.register_node(nodeid, { + description = complementary_names[i], + tiles = { tex, tex, tex, tex, texR90, texR90 }, + groups = { dig_immediate = 2, colorcube = 1, colorcube_tiled = 2 }, + sounds = soundmaker(0.1), + + }) + minetest.register_craft({ + output = nodeid, + recipe = { + {"colorcubes:"..c1.."_single", "colorcubes:"..c2.."_single" }, + {"colorcubes:"..c2.."_single", "colorcubes:"..c1.."_single" }, + }, + }) + minetest.register_craft({ + output = nodeid, + recipe = { + {"colorcubes:"..c2.."_single", "colorcubes:"..c1.."_single" }, + {"colorcubes:"..c1.."_single", "colorcubes:"..c2.."_single" }, + }, + }) + + --[[ This register the block to the paint roller mod. Note that this block can + only be painted, but it can not be reversed; it will not be possible to paint a + tiled block so that it becomes a 2-color block. Thus, we use minor hack by using + a fake dye group called “none” to make sure there is no dye to turn a tiled block + into a 2-color tiled block. ]] + if(minetest.get_modpath("paint_roller") ~= nil) then + paint_roller.register_one(nodeid, "none", "tiled color cubes" ) + end +end diff --git a/mods/minetest_colorcubes/locale/colorcubes.de.tr b/mods/minetest_colorcubes/locale/colorcubes.de.tr new file mode 100644 index 00000000..6353ea54 --- /dev/null +++ b/mods/minetest_colorcubes/locale/colorcubes.de.tr @@ -0,0 +1,99 @@ +# textdomain:colorcubes +Aqua basic color cube=Türkiser Basisfarbwürfel +Aqua concentric color cube=Türkiser konzentrischer Farbwürfel +Aqua light color cube=Türkiser Lichtfarbwürfel +Aqua tiled color cube=Türkiser Kachelfarbwürfel +Aqua window color cube=Türkiser Fensterfarbwürfel +Aqua/red-violet tiled color cube=Türkis-rotvioletter Kachelfarbwürfel +Black basic color cube=Schwarzer Basisfarbwürfel +Black concentric color cube=Schwarzer konzentrischer Farbwürfel +Black tiled color cube=Schwarzer Kachelfarbwürfel +Black window color cube=Schwarzer Fensterfarbwürfel +Black/white tiled color cube=Schwarz-weißer Kachelfarbwürfel +Blue basic color cube=Blauer Basisfarbwürfel +Blue concentric color cube=Blauer konzentrischer Farbwürfel +Blue light color cube=Blauer Lichtfarbwürfel +Blue tiled color cube=Blauer Kachelfarbwürfel +Blue window color cube=Blauer Fensterfarbwürfel +Brown basic color cube=Brauner Basisfarbwürfel +Brown concentric color cube=Brauner konzentrischer Farbwürfel +Brown tiled color cube=Brauner Kachelfarbwürfel +Brown window color cube=Brauner Fensterfarbwürfel +Cyan basic color cube=Cyaner Basisfarbwürfel +Cyan concentric color cube=Cyaner konzentrischer Farbwürfel +Cyan light color cube=Cyaner Lichtfarbwürfel +Cyan tiled color cube=Cyaner Kachelfarbwürfel +Cyan window color cube=Cyaner Fensterfarbwürfel +Dark gray basic color cube=Dunkelgrauer Basisfarbwürfel +Dark gray concentric color cube=Dunkelgrauer konzentrischer Farbwürfel +Dark gray tiled color cube=Dunkelgrauer Kachelfarbwürfel +Dark gray window color cube=Dunkelgrauer Fensterfarbwürfel +Dark green basic color cube=Dunkelgrüner Basisfarbwürfel +Dark green concentric color cube=Dunkelgrüner konzentrischer Farbwürfel +Dark green tiled color cube=Dunkelgrüner Kachelfarbwürfel +Dark green window color cube=Dunkelgrüner Fensterfarbwürfel +Green basic color cube=Grüner Basisfarbwürfel +Green concentric color cube=Grüner konzentrischer Farbwürfel +Green light color cube=Grüner Lichtfarbwürfel +Green tiled color cube=Grüner Kachelfarbwürfel +Green window color cube=Grüner Fensterfarbwürfel +Green/magenta tiled color cube=Grün-magenta Kachelfarbwürfel +Light gray basic color cube=Hellgrauer Basisfarbwürfel +Light gray concentric color cube=Hellgrauer konzentrischer Farbwürfel +Light gray tiled color cube=Hellgrauer Kachelfarbwürfel +Light gray window color cube=Hellgrauer Fensterfarbwürfel +Light/dark gray tiled color cube=Hellgrau-dunkelgrauer Kachelfarbwürfel +Lime basic color cube=Lindgrüner Basisfarbwürfel +Lime concentric color cube=Lindgrüner konzentrischer Farbwürfel +Lime light color cube=Lindgrüner Lichtfarbwürfel +Lime tiled color cube=Lindgrüner Kachelfarbwürfel +Lime window color cube=Lindgrüner Fensterfarbwürfel +Lime/violet tiled color cube=Lindgrün-violetter Kachelfarbwürfel +Magenta basic color cube=Magenta Basisfarbwürfel +Magenta concentric color cube=Magenta konzentrischer Farbwürfel +Magenta light color cube=Magenta Lichtfarbwürfel +Magenta tiled color cube=Magenta Kachelfarbwürfel +Magenta window color cube=Magenta Fensterfarbwürfel +Orange basic color cube=Orange Basisfarbwürfel +Orange concentric color cube=Orange konzentrischer Farbwürfel +Orange light color cube=Orange Lichtfarbwürfel +Orange tiled color cube=Orange Kachelfarbwürfel +Orange window color cube=Orange Fensterfarbwürfel +Orange/brown tiled color cube=Orange-brauner Kachelfarbwürfel +Orange/skyblue tiled color cube=Orange-himmelblauer Kachelfarbwürfel +Pink basic color cube=Rosa Basisfarbwürfel +Pink concentric color cube=Rosa konzentrischer Farbwürfel +Pink tiled color cube=Rosa Kachelfarbwürfel +Pink window color cube=Rosa Fensterfarbwürfel +Red basic color cube=Roter Basisfarbwürfel +Red concentric color cube=Roter konzentrischer Farbwürfel +Red light color cube=Roter Lichtfarbwürfel +Red tiled color cube=Roter Kachelfarbwürfel +Red window color cube=Roter Fensterfarbwürfel +Red-violet basic color cube=Rotvioletter Basisfarbwürfel +Red-violet concentric color cube=Rotvioletter konzentrischer Farbwürfel +Red-violet light color cube=Rotvioletter Lichtfarbwürfel +Red-violet tiled color cube=Rotvioletter Kachelfarbwürfel +Red-violet window color cube=Rotvioletter Fensterfarbwürfel +Red/cyan tiled color cube=Rot-cyaner Kachelfarbwürfel +Skyblue basic color cube=Himmelblauer Basisfarbwürfel +Skyblue concentric color cube=Himmelblauer konzentrischer Farbwürfel +Skyblue light color cube=Himmelblauer Lichtfarbwürfel +Skyblue tiled color cube=Himmelblauer Kachelfarbwürfel +Skyblue window color cube=Himmelblauer Fensterfarbwürfel +Violet basic color cube=Violetter Basisfarbwürfel +Violet concentric color cube=Violetter konzentrischer Farbwürfel +Violet light color cube=Violetter Lichtfarbwürfel +Violet tiled color cube=Violetter Kachelfarbwürfel +Violet window color cube=Violetter Fensterfarbwürfel +White basic color cube=Weißer Basisfarbwürfel +White concentric color cube=Weißer konzentrischer Farbwürfel +White light color cube=Weißer Lichtfarbwürfel +White tiled color cube=Weißer Kachelfarbwürfel +White window color cube=Weißer Fensterfarbwürfel +Yellow basic color cube=Gelber Basisfarbwürfel +Yellow concentric color cube=Gelber konzentrischer Farbwürfel +Yellow light color cube=Gelber Lichtfarbwürfel +Yellow tiled color cube=Gelber Kachelfarbwürfel +Yellow window color cube=Gelber Fensterfarbwürfel +Yellow/blue tiled color cube=Gelb-blauer Kachelfarbwürfel diff --git a/mods/minetest_colorcubes/locale/template.txt b/mods/minetest_colorcubes/locale/template.txt new file mode 100644 index 00000000..2b274686 --- /dev/null +++ b/mods/minetest_colorcubes/locale/template.txt @@ -0,0 +1,98 @@ +Aqua basic color cube= +Aqua concentric color cube= +Aqua light color cube= +Aqua tiled color cube= +Aqua window color cube= +Aqua/red-violet tiled color cube= +Black basic color cube= +Black concentric color cube= +Black tiled color cube= +Black window color cube= +Black/white tiled color cube= +Blue basic color cube= +Blue concentric color cube= +Blue light color cube= +Blue tiled color cube= +Blue window color cube= +Brown basic color cube= +Brown concentric color cube= +Brown tiled color cube= +Brown window color cube= +Cyan basic color cube= +Cyan concentric color cube= +Cyan light color cube= +Cyan tiled color cube= +Cyan window color cube= +Dark gray basic color cube= +Dark gray concentric color cube= +Dark gray tiled color cube= +Dark gray window color cube= +Dark green basic color cube= +Dark green concentric color cube= +Dark green tiled color cube= +Dark green window color cube= +Green basic color cube= +Green concentric color cube= +Green light color cube= +Green tiled color cube= +Green window color cube= +Green/magenta tiled color cube= +Light gray basic color cube= +Light gray concentric color cube= +Light gray tiled color cube= +Light gray window color cube= +Light/dark gray tiled color cube= +Lime basic color cube= +Lime concentric color cube= +Lime light color cube= +Lime tiled color cube= +Lime window color cube= +Lime/violet tiled color cube= +Magenta basic color cube= +Magenta concentric color cube= +Magenta light color cube= +Magenta tiled color cube= +Magenta window color cube= +Orange basic color cube= +Orange concentric color cube= +Orange light color cube= +Orange tiled color cube= +Orange window color cube= +Orange/brown tiled color cube= +Orange/skyblue tiled color cube= +Pink basic color cube= +Pink concentric color cube= +Pink tiled color cube= +Pink window color cube= +Red basic color cube= +Red concentric color cube= +Red light color cube= +Red tiled color cube= +Red window color cube= +Red-violet basic color cube= +Red-violet concentric color cube= +Red-violet light color cube= +Red-violet tiled color cube= +Red-violet window color cube= +Red/cyan tiled color cube= +Skyblue basic color cube= +Skyblue concentric color cube= +Skyblue light color cube= +Skyblue tiled color cube= +Skyblue window color cube= +Violet basic color cube= +Violet concentric color cube= +Violet light color cube= +Violet tiled color cube= +Violet window color cube= +White basic color cube= +White concentric color cube= +White light color cube= +White tiled color cube= +White window color cube= +Yellow basic color cube= +Yellow concentric color cube= +Yellow light color cube= +Yellow tiled color cube= +Yellow window color cube= +Yellow/blue tiled color cube= diff --git a/mods/minetest_colorcubes/mod.conf b/mods/minetest_colorcubes/mod.conf new file mode 100644 index 00000000..f5a35995 --- /dev/null +++ b/mods/minetest_colorcubes/mod.conf @@ -0,0 +1,3 @@ +name = colorcubes +description = This mod contains several colorful abstract blocks for decoration. +optional_depends = paint_roller diff --git a/mods/minetest_colorcubes/screenshot.png b/mods/minetest_colorcubes/screenshot.png new file mode 100644 index 00000000..92cac3c7 Binary files /dev/null and b/mods/minetest_colorcubes/screenshot.png differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_dig.1.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.1.ogg new file mode 100644 index 00000000..38909c01 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.1.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_dig.2.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.2.ogg new file mode 100644 index 00000000..c222dc55 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.2.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_dig.3.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.3.ogg new file mode 100644 index 00000000..515c5e57 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.3.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_dig.4.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.4.ogg new file mode 100644 index 00000000..b4fa08da Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_dig.4.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_dug.1.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_dug.1.ogg new file mode 100644 index 00000000..9bf1310b Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_dug.1.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_dug.2.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_dug.2.ogg new file mode 100644 index 00000000..2d6919a9 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_dug.2.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_dug.3.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_dug.3.ogg new file mode 100644 index 00000000..d2efe159 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_dug.3.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.1.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.1.ogg new file mode 100644 index 00000000..08651e9e Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.1.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.2.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.2.ogg new file mode 100644 index 00000000..3995bc8b Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.2.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.3.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.3.ogg new file mode 100644 index 00000000..fb580961 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.3.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.4.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.4.ogg new file mode 100644 index 00000000..6d107c11 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.4.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.5.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.5.ogg new file mode 100644 index 00000000..0390e17d Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_footstep.5.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_place.1.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_place.1.ogg new file mode 100644 index 00000000..bd5c11c4 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_place.1.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_place.2.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_place.2.ogg new file mode 100644 index 00000000..d141f67a Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_place.2.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_place.3.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_place.3.ogg new file mode 100644 index 00000000..de01dc87 Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_place.3.ogg differ diff --git a/mods/minetest_colorcubes/sounds/colorcubes_block_place.4.ogg b/mods/minetest_colorcubes/sounds/colorcubes_block_place.4.ogg new file mode 100644 index 00000000..7545c4fc Binary files /dev/null and b/mods/minetest_colorcubes/sounds/colorcubes_block_place.4.ogg differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_aqua.png b/mods/minetest_colorcubes/textures/colorcubes_1_aqua.png new file mode 100644 index 00000000..b596fd7f Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_aqua.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_black.png b/mods/minetest_colorcubes/textures/colorcubes_1_black.png new file mode 100644 index 00000000..86fb0174 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_black.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_blue.png b/mods/minetest_colorcubes/textures/colorcubes_1_blue.png new file mode 100644 index 00000000..76291f20 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_blue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_brown.png b/mods/minetest_colorcubes/textures/colorcubes_1_brown.png new file mode 100644 index 00000000..b394eb86 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_brown.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_cyan.png b/mods/minetest_colorcubes/textures/colorcubes_1_cyan.png new file mode 100644 index 00000000..02895d4c Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_cyan.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_dark_gray.png b/mods/minetest_colorcubes/textures/colorcubes_1_dark_gray.png new file mode 100644 index 00000000..03e5bfcf Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_dark_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_dark_green.png b/mods/minetest_colorcubes/textures/colorcubes_1_dark_green.png new file mode 100644 index 00000000..19c12acf Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_dark_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_green.png b/mods/minetest_colorcubes/textures/colorcubes_1_green.png new file mode 100644 index 00000000..c38442cc Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_light_gray.png b/mods/minetest_colorcubes/textures/colorcubes_1_light_gray.png new file mode 100644 index 00000000..4ed27461 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_light_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_lime.png b/mods/minetest_colorcubes/textures/colorcubes_1_lime.png new file mode 100644 index 00000000..1793feb8 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_lime.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_magenta.png b/mods/minetest_colorcubes/textures/colorcubes_1_magenta.png new file mode 100644 index 00000000..233abba1 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_magenta.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_orange.png b/mods/minetest_colorcubes/textures/colorcubes_1_orange.png new file mode 100644 index 00000000..5ed1cda7 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_orange.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_pink.png b/mods/minetest_colorcubes/textures/colorcubes_1_pink.png new file mode 100644 index 00000000..8ea22223 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_pink.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_red.png b/mods/minetest_colorcubes/textures/colorcubes_1_red.png new file mode 100644 index 00000000..871c87bf Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_red.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_redviolet.png b/mods/minetest_colorcubes/textures/colorcubes_1_redviolet.png new file mode 100644 index 00000000..00820597 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_redviolet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_skyblue.png b/mods/minetest_colorcubes/textures/colorcubes_1_skyblue.png new file mode 100644 index 00000000..4abb3e84 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_skyblue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_violet.png b/mods/minetest_colorcubes/textures/colorcubes_1_violet.png new file mode 100644 index 00000000..af7e3d50 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_violet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_white.png b/mods/minetest_colorcubes/textures/colorcubes_1_white.png new file mode 100644 index 00000000..b90b5e4b Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_white.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_1_yellow.png b/mods/minetest_colorcubes/textures/colorcubes_1_yellow.png new file mode 100644 index 00000000..9abc5dcc Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_1_yellow.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_aqua.png b/mods/minetest_colorcubes/textures/colorcubes_4_aqua.png new file mode 100644 index 00000000..954f3ef4 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_aqua.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_black.png b/mods/minetest_colorcubes/textures/colorcubes_4_black.png new file mode 100644 index 00000000..025967aa Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_black.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_blue.png b/mods/minetest_colorcubes/textures/colorcubes_4_blue.png new file mode 100644 index 00000000..ae4fd74e Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_blue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_brown.png b/mods/minetest_colorcubes/textures/colorcubes_4_brown.png new file mode 100644 index 00000000..567bb632 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_brown.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_cyan.png b/mods/minetest_colorcubes/textures/colorcubes_4_cyan.png new file mode 100644 index 00000000..b0883f3c Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_cyan.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_dark_gray.png b/mods/minetest_colorcubes/textures/colorcubes_4_dark_gray.png new file mode 100644 index 00000000..13682f5a Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_dark_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_dark_green.png b/mods/minetest_colorcubes/textures/colorcubes_4_dark_green.png new file mode 100644 index 00000000..2a8080ca Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_dark_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_green.png b/mods/minetest_colorcubes/textures/colorcubes_4_green.png new file mode 100644 index 00000000..ac21f432 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_light_gray.png b/mods/minetest_colorcubes/textures/colorcubes_4_light_gray.png new file mode 100644 index 00000000..1bdb67b3 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_light_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_lime.png b/mods/minetest_colorcubes/textures/colorcubes_4_lime.png new file mode 100644 index 00000000..5c4643ee Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_lime.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_magenta.png b/mods/minetest_colorcubes/textures/colorcubes_4_magenta.png new file mode 100644 index 00000000..07fcd5ad Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_magenta.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_orange.png b/mods/minetest_colorcubes/textures/colorcubes_4_orange.png new file mode 100644 index 00000000..763ec635 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_orange.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_pink.png b/mods/minetest_colorcubes/textures/colorcubes_4_pink.png new file mode 100644 index 00000000..7d9a5675 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_pink.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_red.png b/mods/minetest_colorcubes/textures/colorcubes_4_red.png new file mode 100644 index 00000000..413fde4a Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_red.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_redviolet.png b/mods/minetest_colorcubes/textures/colorcubes_4_redviolet.png new file mode 100644 index 00000000..6ea97580 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_redviolet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_skyblue.png b/mods/minetest_colorcubes/textures/colorcubes_4_skyblue.png new file mode 100644 index 00000000..24ea4e0e Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_skyblue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_violet.png b/mods/minetest_colorcubes/textures/colorcubes_4_violet.png new file mode 100644 index 00000000..d3e83cd7 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_violet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_white.png b/mods/minetest_colorcubes/textures/colorcubes_4_white.png new file mode 100644 index 00000000..b5407257 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_white.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4_yellow.png b/mods/minetest_colorcubes/textures/colorcubes_4_yellow.png new file mode 100644 index 00000000..261a191f Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4_yellow.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_aqua_redviolet.png b/mods/minetest_colorcubes/textures/colorcubes_4c_aqua_redviolet.png new file mode 100644 index 00000000..3a12dd9d Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_aqua_redviolet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_black_white.png b/mods/minetest_colorcubes/textures/colorcubes_4c_black_white.png new file mode 100644 index 00000000..de6fed6a Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_black_white.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_green_magenta.png b/mods/minetest_colorcubes/textures/colorcubes_4c_green_magenta.png new file mode 100644 index 00000000..28ed231c Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_green_magenta.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_light_gray_dark_gray.png b/mods/minetest_colorcubes/textures/colorcubes_4c_light_gray_dark_gray.png new file mode 100644 index 00000000..9fde53d0 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_light_gray_dark_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_lime_violet.png b/mods/minetest_colorcubes/textures/colorcubes_4c_lime_violet.png new file mode 100644 index 00000000..1a853387 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_lime_violet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_orange_brown.png b/mods/minetest_colorcubes/textures/colorcubes_4c_orange_brown.png new file mode 100644 index 00000000..c8c1571f Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_orange_brown.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_orange_skyblue.png b/mods/minetest_colorcubes/textures/colorcubes_4c_orange_skyblue.png new file mode 100644 index 00000000..a3cd1cec Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_orange_skyblue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_red_cyan.png b/mods/minetest_colorcubes/textures/colorcubes_4c_red_cyan.png new file mode 100644 index 00000000..9c8c94fe Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_red_cyan.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_white_black.png b/mods/minetest_colorcubes/textures/colorcubes_4c_white_black.png new file mode 100644 index 00000000..6d39c818 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_white_black.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_4c_yellow_blue.png b/mods/minetest_colorcubes/textures/colorcubes_4c_yellow_blue.png new file mode 100644 index 00000000..5afb61e9 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_4c_yellow_blue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_aqua.png b/mods/minetest_colorcubes/textures/colorcubes_inward_aqua.png new file mode 100644 index 00000000..bc067f82 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_aqua.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_black.png b/mods/minetest_colorcubes/textures/colorcubes_inward_black.png new file mode 100644 index 00000000..4ac227a3 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_black.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_blue.png b/mods/minetest_colorcubes/textures/colorcubes_inward_blue.png new file mode 100644 index 00000000..226fed46 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_blue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_brown.png b/mods/minetest_colorcubes/textures/colorcubes_inward_brown.png new file mode 100644 index 00000000..1ae90cf3 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_brown.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_cyan.png b/mods/minetest_colorcubes/textures/colorcubes_inward_cyan.png new file mode 100644 index 00000000..ccd6e220 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_cyan.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_dark_gray.png b/mods/minetest_colorcubes/textures/colorcubes_inward_dark_gray.png new file mode 100644 index 00000000..a0757aa0 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_dark_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_dark_green.png b/mods/minetest_colorcubes/textures/colorcubes_inward_dark_green.png new file mode 100644 index 00000000..6b04014b Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_dark_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_green.png b/mods/minetest_colorcubes/textures/colorcubes_inward_green.png new file mode 100644 index 00000000..17dc173d Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_light_gray.png b/mods/minetest_colorcubes/textures/colorcubes_inward_light_gray.png new file mode 100644 index 00000000..acda08ca Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_light_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_lime.png b/mods/minetest_colorcubes/textures/colorcubes_inward_lime.png new file mode 100644 index 00000000..722b8623 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_lime.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_magenta.png b/mods/minetest_colorcubes/textures/colorcubes_inward_magenta.png new file mode 100644 index 00000000..ddf1e736 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_magenta.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_orange.png b/mods/minetest_colorcubes/textures/colorcubes_inward_orange.png new file mode 100644 index 00000000..3ac44233 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_orange.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_pink.png b/mods/minetest_colorcubes/textures/colorcubes_inward_pink.png new file mode 100644 index 00000000..03416eca Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_pink.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_red.png b/mods/minetest_colorcubes/textures/colorcubes_inward_red.png new file mode 100644 index 00000000..80279f35 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_red.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_redviolet.png b/mods/minetest_colorcubes/textures/colorcubes_inward_redviolet.png new file mode 100644 index 00000000..5c5018b2 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_redviolet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_skyblue.png b/mods/minetest_colorcubes/textures/colorcubes_inward_skyblue.png new file mode 100644 index 00000000..504e2107 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_skyblue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_violet.png b/mods/minetest_colorcubes/textures/colorcubes_inward_violet.png new file mode 100644 index 00000000..8908dc04 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_violet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_white.png b/mods/minetest_colorcubes/textures/colorcubes_inward_white.png new file mode 100644 index 00000000..7927e30d Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_white.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_inward_yellow.png b/mods/minetest_colorcubes/textures/colorcubes_inward_yellow.png new file mode 100644 index 00000000..94c6ca7c Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_inward_yellow.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_aqua.png b/mods/minetest_colorcubes/textures/colorcubes_light_aqua.png new file mode 100644 index 00000000..9d79e9a7 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_aqua.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_blue.png b/mods/minetest_colorcubes/textures/colorcubes_light_blue.png new file mode 100644 index 00000000..0c2b078c Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_blue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_cyan.png b/mods/minetest_colorcubes/textures/colorcubes_light_cyan.png new file mode 100644 index 00000000..afb3ab4a Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_cyan.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_green.png b/mods/minetest_colorcubes/textures/colorcubes_light_green.png new file mode 100644 index 00000000..34112055 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_lime.png b/mods/minetest_colorcubes/textures/colorcubes_light_lime.png new file mode 100644 index 00000000..a4284641 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_lime.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_magenta.png b/mods/minetest_colorcubes/textures/colorcubes_light_magenta.png new file mode 100644 index 00000000..c88470be Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_magenta.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_orange.png b/mods/minetest_colorcubes/textures/colorcubes_light_orange.png new file mode 100644 index 00000000..f351c642 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_orange.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_red.png b/mods/minetest_colorcubes/textures/colorcubes_light_red.png new file mode 100644 index 00000000..955d4100 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_red.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_redviolet.png b/mods/minetest_colorcubes/textures/colorcubes_light_redviolet.png new file mode 100644 index 00000000..ce8e30d8 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_redviolet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_skyblue.png b/mods/minetest_colorcubes/textures/colorcubes_light_skyblue.png new file mode 100644 index 00000000..eb619b1b Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_skyblue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_violet.png b/mods/minetest_colorcubes/textures/colorcubes_light_violet.png new file mode 100644 index 00000000..3ac92f99 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_violet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_white.png b/mods/minetest_colorcubes/textures/colorcubes_light_white.png new file mode 100644 index 00000000..f1642d0e Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_white.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_light_yellow.png b/mods/minetest_colorcubes/textures/colorcubes_light_yellow.png new file mode 100644 index 00000000..f94a86b5 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_light_yellow.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_black.png b/mods/minetest_colorcubes/textures/colorcubes_slab_black.png new file mode 100644 index 00000000..51a61093 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_black.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_blue.png b/mods/minetest_colorcubes/textures/colorcubes_slab_blue.png new file mode 100644 index 00000000..05d13259 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_blue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_brown.png b/mods/minetest_colorcubes/textures/colorcubes_slab_brown.png new file mode 100644 index 00000000..9eda3512 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_brown.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_cyan.png b/mods/minetest_colorcubes/textures/colorcubes_slab_cyan.png new file mode 100644 index 00000000..2c0bb1f4 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_cyan.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_dark_gray.png b/mods/minetest_colorcubes/textures/colorcubes_slab_dark_gray.png new file mode 100644 index 00000000..33d428a3 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_dark_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_dark_green.png b/mods/minetest_colorcubes/textures/colorcubes_slab_dark_green.png new file mode 100644 index 00000000..f38a47e4 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_dark_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_green.png b/mods/minetest_colorcubes/textures/colorcubes_slab_green.png new file mode 100644 index 00000000..ca1997db Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_light_gray.png b/mods/minetest_colorcubes/textures/colorcubes_slab_light_gray.png new file mode 100644 index 00000000..adae40a9 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_light_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_magenta.png b/mods/minetest_colorcubes/textures/colorcubes_slab_magenta.png new file mode 100644 index 00000000..b8cd4094 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_magenta.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_orange.png b/mods/minetest_colorcubes/textures/colorcubes_slab_orange.png new file mode 100644 index 00000000..27ef4c8e Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_orange.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_pink.png b/mods/minetest_colorcubes/textures/colorcubes_slab_pink.png new file mode 100644 index 00000000..0b80c841 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_pink.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_red.png b/mods/minetest_colorcubes/textures/colorcubes_slab_red.png new file mode 100644 index 00000000..9cb0c414 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_red.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_redviolet.png b/mods/minetest_colorcubes/textures/colorcubes_slab_redviolet.png new file mode 100644 index 00000000..9412f957 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_redviolet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_violet.png b/mods/minetest_colorcubes/textures/colorcubes_slab_violet.png new file mode 100644 index 00000000..19c0621e Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_violet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_white.png b/mods/minetest_colorcubes/textures/colorcubes_slab_white.png new file mode 100644 index 00000000..9a2402e3 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_white.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_slab_yellow.png b/mods/minetest_colorcubes/textures/colorcubes_slab_yellow.png new file mode 100644 index 00000000..9338c75c Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_slab_yellow.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_aqua.png b/mods/minetest_colorcubes/textures/colorcubes_window_aqua.png new file mode 100644 index 00000000..c82ea82a Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_aqua.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_black.png b/mods/minetest_colorcubes/textures/colorcubes_window_black.png new file mode 100644 index 00000000..a87d6cf2 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_black.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_blue.png b/mods/minetest_colorcubes/textures/colorcubes_window_blue.png new file mode 100644 index 00000000..e110d9ca Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_blue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_brown.png b/mods/minetest_colorcubes/textures/colorcubes_window_brown.png new file mode 100644 index 00000000..804fe186 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_brown.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_cyan.png b/mods/minetest_colorcubes/textures/colorcubes_window_cyan.png new file mode 100644 index 00000000..d652317b Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_cyan.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_dark_gray.png b/mods/minetest_colorcubes/textures/colorcubes_window_dark_gray.png new file mode 100644 index 00000000..49ed2134 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_dark_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_dark_green.png b/mods/minetest_colorcubes/textures/colorcubes_window_dark_green.png new file mode 100644 index 00000000..81d95318 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_dark_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_green.png b/mods/minetest_colorcubes/textures/colorcubes_window_green.png new file mode 100644 index 00000000..ff01f322 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_green.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_light_gray.png b/mods/minetest_colorcubes/textures/colorcubes_window_light_gray.png new file mode 100644 index 00000000..f661a537 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_light_gray.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_lime.png b/mods/minetest_colorcubes/textures/colorcubes_window_lime.png new file mode 100644 index 00000000..143ebc04 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_lime.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_magenta.png b/mods/minetest_colorcubes/textures/colorcubes_window_magenta.png new file mode 100644 index 00000000..34f9cbc1 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_magenta.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_orange.png b/mods/minetest_colorcubes/textures/colorcubes_window_orange.png new file mode 100644 index 00000000..fa959135 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_orange.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_pink.png b/mods/minetest_colorcubes/textures/colorcubes_window_pink.png new file mode 100644 index 00000000..7965f8b2 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_pink.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_red.png b/mods/minetest_colorcubes/textures/colorcubes_window_red.png new file mode 100644 index 00000000..f07e305f Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_red.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_redviolet.png b/mods/minetest_colorcubes/textures/colorcubes_window_redviolet.png new file mode 100644 index 00000000..681e88a7 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_redviolet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_skyblue.png b/mods/minetest_colorcubes/textures/colorcubes_window_skyblue.png new file mode 100644 index 00000000..04cbffa4 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_skyblue.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_violet.png b/mods/minetest_colorcubes/textures/colorcubes_window_violet.png new file mode 100644 index 00000000..97736632 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_violet.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_white.png b/mods/minetest_colorcubes/textures/colorcubes_window_white.png new file mode 100644 index 00000000..7ce55198 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_white.png differ diff --git a/mods/minetest_colorcubes/textures/colorcubes_window_yellow.png b/mods/minetest_colorcubes/textures/colorcubes_window_yellow.png new file mode 100644 index 00000000..f05b4cc5 Binary files /dev/null and b/mods/minetest_colorcubes/textures/colorcubes_window_yellow.png differ diff --git a/mods/minetest_mtg_plus/README.md b/mods/minetest_mtg_plus/README.md new file mode 100644 index 00000000..8868a1e8 --- /dev/null +++ b/mods/minetest_mtg_plus/README.md @@ -0,0 +1,45 @@ +# Minetest Game Plus [`mtg_plus`] +This mods adds various simple decorative blocks, doors, panes and more to extend Minetest Game. +The focus lies on: + +* Snow and ice +* Panes +* Doors +* Metals + +Current version: 1.1.0 +For Minetest/Minetest Game 5.1.0 or later + +## Special stuff +Most new items are purely decorational and self-explanationary, but a few items are somewhat unique: + +* Dirty Glass: Like glass, but sunlight will not go through unlimited +* Aggregated Diamond Block: Not even a diamond pickaxe can break it. But TNT will do +* Ice-themed doors and trapdoors: Solid doors for which (like for ice) light goes through +* Goldwood: Fireproof wood + +## Compability +This mod is optionally compatible with: + +* `xdecor`: For adding more recipes for compability +* `moreblocks`: For adding recipes involving the sweeper +* `furniture`: For adding furniture for goldwood and the cobblestone variants +* `doc_items`: For providing item descriptions (incomplete) +* `awards`: More achievements + +## Credits and licenses +This mod is free software. + +### Code +* Author: Wuzzy +* Licensed under: MIT License + +### Graphics +All graphics are derivate works of Minetest Game textures. +They are licensed under [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/). + +### Sounds +* `mtg_plus_door_icesteel_close.ogg`: Derivate work of `door_steel_door_close.ogg` by HazMatt from Minetest Game, licensed under [CC-BY 3.0](https://creativecommons.org/licenses/by/3.0/) +* `mtg_plus_door_icesteel_open.ogg`: Derivate work of `door_steel_door_open.ogg` by HazMatt from Minetest Game, licensed under CC-BY 3.0 +* Everything else is licensed under the MIT License. + diff --git a/mods/minetest_mtg_plus/aliases.lua b/mods/minetest_mtg_plus/aliases.lua new file mode 100644 index 00000000..f51c303a --- /dev/null +++ b/mods/minetest_mtg_plus/aliases.lua @@ -0,0 +1,12 @@ +-- Legacy aliases +-- Earlier versions had beds, but those were removed because they were considered ugly +minetest.register_alias("mtg_plus:gold_bed_bottom", "beds:fancy_bed_bottom") +minetest.register_alias("mtg_plus:gold_bed_top", "beds:fancy_bed_top") +minetest.register_alias("mtg_plus:bed_simple_white_bottom", "beds:bed_bottom") +minetest.register_alias("mtg_plus:bed_simple_white_top", "beds:bed_top") +minetest.register_alias("mtg_plus:goldapple", "default:apple") +minetest.register_alias("xpanes:obsidian_glass_flat", "xpanes:obsidian_pane_flat") +minetest.register_alias("xpanes:obsidian_glass", "xpanes:obsidian_pane") +minetest.register_alias("doors:door_iron_bar", "xpanes:door_steel_bar") +minetest.register_alias("doors:door_iron_bar_a", "xpanes:door_steel_bar_a") +minetest.register_alias("doors:door_iron_bar_b", "xpanes:door_steel_bar_b") diff --git a/mods/minetest_mtg_plus/awards.lua b/mods/minetest_mtg_plus/awards.lua new file mode 100644 index 00000000..059df2b2 --- /dev/null +++ b/mods/minetest_mtg_plus/awards.lua @@ -0,0 +1,94 @@ +local S = minetest.get_translator("mtg_plus") + +if minetest.get_modpath("awards") then + awards.register_achievement("mtg_plus_goldwood", { + title = S("Rich Carpenter"), + description = S("Craft 100 goldwood."), + icon = "mtg_plus_goldwood.png", + trigger = { + type = "craft", + item = "mtg_plus:goldwood", + target = 100 + } + }) + awards.register_achievement("mtg_plus_gravel_cobble", { + title = S("Historic City"), + description = S("Craft 400 cobbled gravel."), + icon = "mtg_plus_gravel_cobble.png", + trigger = { + type = "craft", + item = "mtg_plus:gravel_cobble", + target = 400 + } + }) + awards.register_achievement("mtg_plus_papyrus_block", { + title = S("Papyrus Panic"), + description = S("Build 100 papyrus blocks."), + icon = "mtg_plus_papyrus_block_side.png", + trigger = { + type = "place", + node = "mtg_plus:papyrus_block", + target = 100 + } + }) + awards.register_achievement("mtg_plus_harddiamondblock", { + title = S("Can't dig me!"), + description = S("Place a aggregated diamond block."), + icon = "mtg_plus_hard_diamond_block.png", + trigger = { + type = "place", + node = "mtg_plus:harddiamondblock", + target = 1 + } + }) + awards.register_achievement("mtg_plus_ice_tile16", { + title = S("Ice Crazy"), + description = S("Craft 128 dense ice tiles."), + icon = "mtg_plus_ice_tile16.png", + trigger = { + type = "craft", + item = "mtg_plus:ice_tile16", + target = 128 + } + }) + awards.register_achievement("mtg_plus_hard_snow_brick", { + title = S("Let's build an igloo!"), + description = S("Place 225 hard snow bricks."), + icon = "mtg_plus_hard_snow_brick.png", + trigger = { + type = "place", + node = "mtg_plus:hard_snow_brick", + target = 225 + } + }) + awards.register_achievement("mtg_plus_gold_bed", { + title = S("Luxurious Adornment"), + description = S("Craft 4 small gold-framed diamond blocks."), + icon = "mtg_plus_gold_diamond_block.png", + trigger = { + type = "craft", + item = "mtg_plus:gold_diamond_block", + target = 4 + } + }) + awards.register_achievement("mtg_plus_jungle_cobble", { + title = S("Green Jungle"), + description = S("Craft 512 jungle cobblestone."), + icon = "mtg_plus_jungle_cobble.png", + trigger = { + type = "craft", + item = "mtg_plus:jungle_cobble", + target = 512 + } + }) + awards.register_achievement("mtg_plus_sandstone_cobble", { + title = S("Yellow Desert"), + description = S("Craft 512 cobbled sandstone."), + icon = "mtg_plus_sandstone_cobble.png", + trigger = { + type = "craft", + item = "mtg_plus:sandstone_cobble", + target = 512 + } + }) +end diff --git a/mods/minetest_mtg_plus/brickblocks.lua b/mods/minetest_mtg_plus/brickblocks.lua new file mode 100644 index 00000000..9df36dc9 --- /dev/null +++ b/mods/minetest_mtg_plus/brickblocks.lua @@ -0,0 +1,419 @@ +local S = minetest.get_translator("mtg_plus") + +local deco, build +if minetest.get_modpath("doc_items") then + deco = doc.sub.items.temp.deco + build = doc.sub.items.temp.build +end + +local metal_sounds +if default.node_sound_metal_defaults then + metal_sounds = default.node_sound_metal_defaults() +else + metal_sounds = default.node_sound_stone_defaults() +end + + +-- Dirt bricks + +minetest.register_node("mtg_plus:dirtbrick", { + description = S("Soft Dirt Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_dirt_brick.png"}, + is_ground_content = false, + groups = { crumbly = 2, soil = 1 }, + sounds = default.node_sound_dirt_defaults(), + drop = "default:dirt", +}) + +minetest.register_craft({ + output = "mtg_plus:dirtbrick 4", + recipe = { { "default:dirt", "default:dirt", }, + { "default:dirt", "default:dirt", }, }, +}) + +minetest.register_node("mtg_plus:harddirtbrick", { + description = S("Hardened Dirt Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_dirt_brick_hard.png"}, + is_ground_content = false, + groups = { crumbly = 1, level = 1, soil = 1 }, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_craft({ + type = "cooking", + output = "mtg_plus:harddirtbrick", + recipe = "mtg_plus:dirtbrick", + cooktime = 5, +}) + +-- Metal bricks + +minetest.register_node("mtg_plus:goldbrick", { + description = S("Gold Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_gold_brick.png"}, + is_ground_content = false, + groups = { cracky = 1, }, + sounds = metal_sounds, +}) + +minetest.register_craft({ + output = "mtg_plus:goldbrick 4", + recipe = { { "default:goldblock", "default:goldblock", }, + { "default:goldblock", "default:goldblock", }, }, +}) + +minetest.register_node("mtg_plus:bronzebrick", { + description = S("Bronze Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_bronze_brick.png"}, + is_ground_content = false, + groups = { cracky = 1, level = 2 }, + sounds = metal_sounds, +}) + +minetest.register_craft({ + output = "mtg_plus:bronzebrick 4", + recipe = { { "default:bronzeblock", "default:bronzeblock", }, + { "default:bronzeblock", "default:bronzeblock", }, }, +}) + +minetest.register_node("mtg_plus:tinbrick", { + description = S("Tin Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_tin_brick.png"}, + is_ground_content = false, + groups = { cracky = 1, level = 2 }, + sounds = metal_sounds, +}) + +minetest.register_craft({ + output = "mtg_plus:tinbrick 4", + recipe = { { "default:tinblock", "default:tinblock", }, + { "default:tinblock", "default:tinblock", }, }, +}) + +minetest.register_node("mtg_plus:copperbrick", { + description = S("Copper Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_copper_brick.png"}, + is_ground_content = false, + groups = { cracky = 1, level = 2 }, + sounds = metal_sounds, +}) + +minetest.register_craft({ + output = "mtg_plus:copperbrick 4", + recipe = { { "default:copperblock", "default:copperblock", }, + { "default:copperblock", "default:copperblock", }, }, +}) + +minetest.register_node("mtg_plus:steelbrick", { + description = S("Steel Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_steel_brick.png"}, + is_ground_content = false, + groups = { cracky = 1, level = 2 }, + sounds = metal_sounds, +}) + +minetest.register_craft({ + output = "mtg_plus:steelbrick 4", + recipe = { { "default:steelblock", "default:steelblock", }, + { "default:steelblock", "default:steelblock", }, }, +}) + + +-- Golden edges + +minetest.register_node("mtg_plus:stonebrick_gold", { + description = S("Stone Brick with Golden Edges"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_stone_brick_gold.png"}, + is_ground_content = false, + groups = { cracky = 2, stone = 1 }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:stonebrick_gold 4", + recipe = { { "", "default:stonebrick", "", }, + { "default:stonebrick", "default:gold_ingot", "default:stonebrick", }, + { "", "default:stonebrick", "", } } +}) + +minetest.register_node("mtg_plus:desert_stonebrick_gold", { + description = S("Desert Stone Brick with Golden Edges"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_desert_stone_brick_gold.png"}, + is_ground_content = false, + groups = { cracky = 2, stone = 1 }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:desert_stonebrick_gold 4", + recipe = { { "", "default:desert_stonebrick", "" }, + { "default:desert_stonebrick", "default:gold_ingot", "default:desert_stonebrick", }, + { "", "default:desert_stonebrick", "", } } +}) + +minetest.register_node("mtg_plus:sandstonebrick_gold", { + description = S("Sandstone Brick with Golden Edges"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_sandstone_brick_gold.png"}, + is_ground_content = false, + groups = { cracky = 2, }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:sandstonebrick_gold 4", + recipe = { { "", "default:sandstonebrick", "", }, + { "default:sandstonebrick", "default:gold_ingot", "default:sandstonebrick", }, + { "", "default:sandstonebrick", "", } } +}) + +minetest.register_node("mtg_plus:desert_sandstone_brick_gold", { + description = S("Desert Sandstone Brick with Golden Edges"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_desert_sandstone_brick_gold.png"}, + is_ground_content = false, + groups = { cracky = 2, }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:desert_sandstone_brick_gold 4", + recipe = { { "", "default:desert_sandstone_brick", "", }, + { "default:desert_sandstone_brick", "default:gold_ingot", "default:desert_sandstone_brick", }, + { "", "default:desert_sandstone_brick", "", } } +}) + +minetest.register_node("mtg_plus:silver_sandstone_brick_gold", { + description = S("Silver Sandstone Brick with Golden Edges"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_silver_sandstone_brick_gold.png"}, + is_ground_content = false, + groups = { cracky = 2, }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:silver_sandstone_brick_gold 4", + recipe = { { "", "default:silver_sandstone_brick", "", }, + { "default:silver_sandstone_brick", "default:gold_ingot", "default:silver_sandstone_brick", }, + { "", "default:silver_sandstone_brick", "", } } +}) + +minetest.register_node("mtg_plus:obsidianbrick_gold", { + description = S("Obsidian Brick with Golden Edges"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_obsidian_brick_gold.png"}, + is_ground_content = false, + groups = { cracky = 1, level = 2 }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:obsidianbrick_gold 4", + recipe = { { "", "default:obsidianbrick", "", }, + { "default:obsidianbrick", "default:gold_ingot", "default:obsidianbrick", }, + { "", "default:obsidianbrick", "", } } +}) + + +-- Snow and ice + +minetest.register_node("mtg_plus:ice_block", { + description = S("Ice Block"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_ice_block.png"}, + groups = {cracky = 3, cools_lava = 1, slippery = 3 }, + is_ground_content = false, + paramtype = "light", + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:ice_block 9", + recipe = { { "default:ice", "default:ice", "default:ice" }, + { "default:ice", "default:ice", "default:ice" }, + { "default:ice", "default:ice", "default:ice" } } +}) + + + +minetest.register_node("mtg_plus:ice_tile4", { + description = S("Ice Tile"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_ice_tile4.png"}, + groups = {cracky = 3, level = 1, cools_lava = 1, slippery = 3 }, + is_ground_content = false, + paramtype = "light", + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:ice_tile4", + recipe = { { "mtg_plus:ice_block", "mtg_plus:ice_block" }, + { "mtg_plus:ice_block", "mtg_plus:ice_block" },} +}) + +minetest.register_node("mtg_plus:ice_tile16", { + description = S("Dense Ice Tile"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_ice_tile16.png"}, + groups = {cracky = 3, level = 2, cools_lava = 1, slippery = 2 }, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:ice_tile16", + recipe = { { "mtg_plus:ice_tile4", "mtg_plus:ice_tile4" }, + { "mtg_plus:ice_tile4", "mtg_plus:ice_tile4" } } +}) + +minetest.register_node("mtg_plus:snow_brick", { + description = S("Soft Snow Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_snow_brick.png"}, + groups = {crumbly = 2, cools_lava = 1, snowy = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults({ + footstep={name="default_snow_footstep", gain = 0.15}, + dig={name="default_snow_footstep", gain = 0.2}, + dug={name="default_snow_footstep", gain = 0.2} + }), +}) + +minetest.register_craft({ + output = "mtg_plus:snow_brick 4", + recipe = { { "default:snowblock", "default:snowblock" }, + { "default:snowblock", "default:snowblock", } }, +}) + +minetest.register_craft({ + output = "default:snowblock 4", + recipe = { { "mtg_plus:snow_brick" } }, +}) + +minetest.register_node("mtg_plus:hard_snow_brick", { + description = S("Hard Snow Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_hard_snow_brick.png"}, + groups = {crumbly = 1, cracky = 2, cools_lava = 1, snowy = 1}, + is_ground_content = false, + sounds = default.node_sound_dirt_defaults({ + dig={name="default_snow_footstep", gain = 0.2}, + dug={name="default_snow_footstep", gain = 0.2} + }), +}) + +minetest.register_craft({ + output = "mtg_plus:hard_snow_brick", + recipe = { { "mtg_plus:snow_brick", "mtg_plus:snow_brick" }, + { "mtg_plus:snow_brick", "mtg_plus:snow_brick" } }, +}) + +minetest.register_node("mtg_plus:ice_snow_brick", { + description = S("Icy Snow Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_ice_snow_brick.png"}, + groups = {cracky = 2, cools_lava = 1, slippery=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:ice_snow_brick 2", + type = "shapeless", + recipe = { "mtg_plus:hard_snow_brick", "mtg_plus:ice_brick" }, +}) + +minetest.register_node("mtg_plus:ice_brick", { + description = S("Ice Brick"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_ice_brick.png"}, + paramtype = "light", + groups = {cracky = 3, cools_lava = 1, slippery = 3}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +-- Papyrus Block + +minetest.register_node("mtg_plus:papyrus_block", { + description = S("Papyrus Block"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_papyrus_block_y.png","mtg_plus_papyrus_block_y.png","mtg_plus_papyrus_block_side2.png","mtg_plus_papyrus_block_side2.png","mtg_plus_papyrus_block_side.png","mtg_plus_papyrus_block_side.png"}, + groups = {snappy = 2, choppy = 2, flammable = 3}, + is_ground_content = false, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:papyrus_block", + recipe = { { "default:papyrus", "default:papyrus", "default:papyrus", }, + { "default:papyrus", "default:papyrus", "default:papyrus", }, + { "default:papyrus", "default:papyrus", "default:papyrus", } } +}) + +minetest.register_craft({ + output = "default:papyrus 9", + recipe = { { "mtg_plus:papyrus_block" } } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mtg_plus:papyrus_block", + burntime = 9, +}) + + +-- Flint block + +minetest.register_node("mtg_plus:flint_block", { + description = S("Flint Block"), + _doc_items_longdesc = deco, + tiles = {"mtg_plus_flint_block.png"}, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:flint_block", + recipe = { + { "default:flint", "default:flint", "default:flint" }, + { "default:flint", "default:flint", "default:flint" }, + { "default:flint", "default:flint", "default:flint" }, + } +}) + +minetest.register_craft({ + output = "default:flint 9 ", + recipe = { + { "mtg_plus:flint_block" }, + } +}) + +-- Gold-framed diamond block, just an absurd luxurious decoration. :D +minetest.register_node("mtg_plus:gold_diamond_block", { + description = S("Small Gold-framed Diamond Block"), + _doc_items_longdesc = deco, + tiles = {"mtg_plus_gold_diamond_block.png"}, + is_ground_content = false, + groups = {cracky = 1, level = 3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:gold_diamond_block", + recipe = { { "default:gold_ingot", "default:diamond", "default:gold_ingot", }, + { "default:diamond", "default:diamond", "default:diamond" }, + { "default:gold_ingot", "default:diamond", "default:gold_ingot", } }, +}) diff --git a/mods/minetest_mtg_plus/cobble.lua b/mods/minetest_mtg_plus/cobble.lua new file mode 100644 index 00000000..beef4e09 --- /dev/null +++ b/mods/minetest_mtg_plus/cobble.lua @@ -0,0 +1,117 @@ +local S = minetest.get_translator("mtg_plus") + +local build +if minetest.get_modpath("doc_items") then + build = doc.sub.items.temp.build +end + +-- Cobblestone + +minetest.register_node("mtg_plus:gravel_cobble", { + description = S("Cobbled Gravel"), + _doc_items_longdesc = S("Cobbled gravel is solidified gravel, carefully arranged in a mosaic-like pattern. It makes a nice building material."), + tiles = {"mtg_plus_gravel_cobble.png"}, + is_ground_content = false, + groups = { cracky = 3, stone = 1 }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:gravel_cobble 2", + recipe = { { "default:gravel", "default:gravel" }, + { "default:gravel", "default:gravel" } }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gravel", + recipe = "mtg_plus:gravel_cobble", +}) + + +minetest.register_node("mtg_plus:sandstone_cobble", { + description = S("Cobbled Sandstone"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_sandstone_cobble.png"}, + groups = {cracky = 3, }, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:sandstone_cobble 2", + recipe = { { "default:sandstone", "default:sandstone" } }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:sandstone", + recipe = "mtg_plus:sandstone_cobble", +}) + +minetest.register_node("mtg_plus:desert_sandstone_cobble", { + description = S("Cobbled Desert Sandstone"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_desert_sandstone_cobble.png"}, + groups = {cracky = 3, }, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:desert_sandstone_cobble 2", + recipe = { { "default:desert_sandstone", "default:desert_sandstone" } }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:desert_sandstone", + recipe = "mtg_plus:desert_sandstone_cobble", +}) + +minetest.register_node("mtg_plus:silver_sandstone_cobble", { + description = S("Cobbled Silver Sandstone"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_silver_sandstone_cobble.png"}, + groups = {cracky = 3, }, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:silver_sandstone_cobble 2", + recipe = { { "default:silver_sandstone", "default:silver_sandstone" } }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:silver_sandstone", + recipe = "mtg_plus:silver_sandstone_cobble", +}) + +minetest.register_node("mtg_plus:jungle_cobble", { + description = S("Jungle Cobblestone"), + _doc_items_longdesc = build, + tiles = {"mtg_plus_jungle_cobble.png"}, + groups = {cracky=3, stone=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:jungle_cobble", + type = "shapeless", + recipe = { "default:jungleleaves", "default:jungleleaves", "default:cobble" }, +}) + +minetest.register_craft({ + output = "mtg_plus:jungle_cobble", + type = "shapeless", + recipe = { "default:jungleleaves", "default:mossycobble" }, +}) + +minetest.register_craft({ + output = "default:stone", + type = "cooking", + recipe = "mtg_plus:jungle_cobble", +}) diff --git a/mods/minetest_mtg_plus/compat_xdecor.lua b/mods/minetest_mtg_plus/compat_xdecor.lua new file mode 100644 index 00000000..1aae36bb --- /dev/null +++ b/mods/minetest_mtg_plus/compat_xdecor.lua @@ -0,0 +1,47 @@ +if minetest.get_modpath("xdecor") then + minetest.register_craft({ + output = "xpanes:papyrus 2", + recipe = { + { "", "farming:string", "" }, + { "farming:string", "xpanes:bamboo_frame", "farming:string" }, + } + }) + + minetest.register_craft({ + output = "xpanes:bamboo_frame", + recipe = { { "xpanes:papyrus", "xpanes:papyrus", }, } + }) + + -- xdecor compability + minetest.register_craft({ + output = "xdecor:packed_ice 2", + recipe = { { "mtg_plus:ice_block", "mtg_plus:ice_block", "mtg_plus:ice_block" }, + { "mtg_plus:ice_block", "", "mtg_plus:ice_block" }, + { "mtg_plus:ice_block", "mtg_plus:ice_block", "mtg_plus:ice_block" }, }, + }) + + minetest.register_craft({ + output = "mtg_plus:ice_tile16", + recipe = { { "xdecor:packed_ice", "xdecor:packed_ice" }, + { "xdecor:packed_ice", "xdecor:packed_ice" }, }, + }) + + -- Alternate ice brick crafting recipe for xdecor compability + minetest.register_craft({ + output = "mtg_plus:ice_brick 4", + recipe = { { "", "default:ice", "default:ice" }, + { "default:ice", "default:ice", "" } }, + }) + minetest.register_craft({ + output = "mtg_plus:ice_brick 4", + recipe = { { "default:ice", "default:ice", "" }, + { "", "default:ice", "default:ice" } }, + }) +else + -- Normal ice brick crafting recipe + minetest.register_craft({ + output = "mtg_plus:ice_brick 4", + recipe = { { "default:ice", "default:ice" }, + { "default:ice", "default:ice" } }, + }) +end \ No newline at end of file diff --git a/mods/minetest_mtg_plus/doors.lua b/mods/minetest_mtg_plus/doors.lua new file mode 100644 index 00000000..c22c2364 --- /dev/null +++ b/mods/minetest_mtg_plus/doors.lua @@ -0,0 +1,156 @@ +local S = minetest.get_translator("mtg_plus") + +local door_simple = S("A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player.") +local door_simple_use = S("Use the use key on it to open or close it.") + +local metal_sounds +if default.node_sound_metal_defaults then + metal_sounds = default.node_sound_metal_defaults() +else + metal_sounds = default.node_sound_stone_defaults() +end + +-- Doors +doors.register("door_wood_bar", { + tiles = {{ name = "mtg_plus_door_wood_bar.png", backface_culling = true }}, + description = S("Wooden Bar Door"), + _doc_items_longdesc = door_simple, + _doc_items_usagehelp = door_simple_use, + _doc_items_image = "mtg_plus_door_wood_bar_item.png", + inventory_image = "mtg_plus_door_wood_bar_item.png", + sounds = default.node_sound_wood_defaults(), + sound_open = "doors_fencegate_open", + sound_close = "doors_fencegate_close", + groups = { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + recipe = { + {"xpanes:wood_flat",}, + {"xpanes:wood_flat",}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:door_wood_bar", + burntime = 4, +}) + +doors.register("door_papyrus", { + tiles = {{ name = "mtg_plus_door_papyrus.png", backface_culling = true }}, + description = S("Papyrus Door"), + _doc_items_longdesc = door_simple, + _doc_items_usagehelp = door_simple_use, + _doc_items_image = "mtg_plus_door_papyrus_item.png", + inventory_image = "mtg_plus_door_papyrus_item.png", + sounds = default.node_sound_leaves_defaults(), + sound_open = "doors_fencegate_open", + sound_close = "doors_fencegate_close", + groups = { snappy = 2, choppy = 1, flammable = 2 }, + recipe = { + {"default:papyrus", "default:papyrus"}, + {"farming:string", "farming:string"}, + {"default:papyrus", "default:papyrus"}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:door_papyrus", + burntime = 4, +}) + +doors.register("door_ice", { + tiles = {{ name = "mtg_plus_door_ice.png", backface_culling = true }}, + description = S("Ice Door"), + _doc_items_longdesc = S("Ice doors can be opened and closed. They are solid, but some of the light hitting ice doors can still go through, making them an interesting decoration in icy areas."), + _doc_items_usagehelp = door_simple_use, + _doc_items_image = "mtg_plus_door_ice_item.png", + inventory_image = "mtg_plus_door_ice_item.png", + groups = { cracky = 3, slippery = 3, }, + sounds = default.node_sound_glass_defaults(), + sound_open = "mtg_plus_door_ice_open", + sound_close = "mtg_plus_door_ice_close", + recipe = { + {"default:ice", "default:ice"}, + {"default:ice", "default:ice"}, + {"default:ice", "default:ice"}, + } +}) + +doors.register("door_icesteel", { + tiles = {{ name = "mtg_plus_door_icesteel.png", backface_culling = true }}, + description = S("Icy Steel Door"), + _doc_items_longdesc = S("Icy steel doors are a combination of ice doors and steel doors which can only be opened and closed by their owners. They are solid, but some of the light hitting icy steel doors can still go through."), + _doc_items_usagehelp = S("Point the door to see who owns it. Use the use key on the door to open or close it (if you own it)."), + _doc_items_image = "mtg_plus_door_icesteel_item.png", + protected = true, + sound_open = "mtg_plus_door_icesteel_open", + sound_close = "mtg_plus_door_icesteel_close", + inventory_image = "mtg_plus_door_icesteel_item.png", + sounds = metal_sounds, + groups = { snappy = 1, bendy = 2, cracky = 3, melty = 3, level = 2, slippery = 1, }, +}) + +minetest.register_craft({ + output = "doors:door_icesteel 2", + type = "shapeless", + recipe = {"doors:door_ice", "doors:door_steel"}, +}) + +doors.register_fencegate("mtg_plus:gate_goldwood", { + description = S("Goldwood Fence Gate"), + material = "mtg_plus:goldwood", + texture = "mtg_plus_goldwood.png", + groups = {choppy=2, }, +}) + +minetest.override_item("mtg_plus:gate_goldwood_closed", { + _doc_items_longdesc = S("A fence gate made from precious goldwood. It blocks the path, but it can be opened and easily jumped over. Other fence posts will neatly connect to this fence gate."), + _doc_items_usagehelp = S("Right-click the gate to open or close it."), +}) +minetest.override_item("mtg_plus:gate_goldwood_open", { + _doc_items_create_entry = false, +}) +if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "mtg_plus:gate_goldwood_closed", "nodes", "mtg_plus:gate_goldwood_open") +end + +doors.register_trapdoor("mtg_plus:trapdoor_ice", { + description = S("Ice Trapdoor"), + _doc_items_longdesc = S("An ice trapdoor covers the floor and can be opened and closed by anyone. Ice trapdoors are solid, but some light can pass through nonetheless."), + _doc_items_usagehelp = door_simple_use, + tile_front = "mtg_plus_trapdoor_ice.png", + tile_side = "mtg_plus_trapdoor_ice_side.png", + inventory_image = "mtg_plus_trapdoor_ice.png", + wield_image = "mtg_plus_trapdoor_ice.png", + sound_open = "mtg_plus_door_ice_open", + sound_close = "mtg_plus_door_ice_close", + sounds = default.node_sound_glass_defaults(), + groups = { cracky = 3, slippery = 3, door = 1 }, +}) + +minetest.register_craft({ + output = "mtg_plus:trapdoor_ice 2", + recipe = { { "default:ice", "default:ice", "default:ice" }, + { "default:ice", "default:ice", "default:ice" }, } +}) + +doors.register_trapdoor("mtg_plus:trapdoor_icesteel", { + description = S("Icy Steel Trapdoor"), + _doc_items_longdesc = S("An icy steel trapdoor is a combination of an ice trapdoor and a steel trapdoor. It covers the floor and can only be opened and closed by its placer. Icy steel trapdoors are solid, but some light can pass through nonetheless."), + _doc_items_usagehelp = S("Point the icy steel trapdoor to see who owns it. Use the use key on it to open or close it (if you own it)."), + protected = true, + tile_front = "mtg_plus_trapdoor_icesteel.png", + tile_side = "mtg_plus_trapdoor_icesteel_side.png", + inventory_image = "mtg_plus_trapdoor_icesteel.png", + wield_image = "mtg_plus_trapdoor_icesteel.png", + sound_open = "mtg_plus_door_icesteel_open", + sound_close = "mtg_plus_door_icesteel_close", + sounds = metal_sounds, + groups = { snappy = 1, bendy = 2, cracky = 3, melty = 3, level = 2, slippery = 1, door = 1 }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mtg_plus:trapdoor_icesteel 2", + recipe = { "mtg_plus:trapdoor_ice", "doors:trapdoor_steel" }, +}) diff --git a/mods/minetest_mtg_plus/extras.lua b/mods/minetest_mtg_plus/extras.lua new file mode 100644 index 00000000..c7365b5d --- /dev/null +++ b/mods/minetest_mtg_plus/extras.lua @@ -0,0 +1,64 @@ +local S = minetest.get_translator("mtg_plus") + +-- Add additional crafting recipes and nodes if particular mods were detected + +-- moreblocks extras +if minetest.get_modpath("moreblocks") then + minetest.register_craft({ + type = "shapeless", + output = "default:glass", + recipe = {"mtg_plus:dirty_glass", "moreblocks:sweeper"} + }) + minetest.register_craft({ + type = "shapeless", + output = "moreblocks:clean_glass", + recipe = {"mtg_plus:dirty_glass", "moreblocks:sweeper", "moreblocks:sweeper"} + }) + minetest.register_craft({ + output = "mtg_plus:dirty_glass", + recipe = { + {"default:dirt"}, + {"moreblocks:clean_glass"} + } + }) + minetest.register_craft({ + type = "shapeless", + output = "mtg_plus:ice_window", + recipe = { "mtg_plus:ice_tile4", "moreblocks:sweeper" }, + }) +end + +-- furniture extras +if minetest.get_modpath("furniture") then + furniture.register_wooden("mtg_plus:goldwood", { + description = S("Goldwood"), + description_chair = S("Goldwood Chair"), + description_stool = S("Goldwood Stool"), + description_table = S("Goldwood Table"), + }) + furniture.register_stone("mtg_plus:jungle_cobble", { + description = S("Jungle Cobblestone"), + description_stool = S("Jungle Cobblestone Stool"), + description_table = S("Jungle Cobblestone Table"), + }) + furniture.register_stone("mtg_plus:sandstone_cobble", { + description = S("Cobbled Sandstone"), + description_stool = S("Cobbled Sandstone Stool"), + description_table = S("Cobbled Sandstone Table"), + }) + furniture.register_stone("mtg_plus:desert_sandstone_cobble", { + description = S("Cobbled Desert Sandstone"), + description_stool = S("Cobbled Desert Sandstone Stool"), + description_table = S("Cobbled Desert Sandstone Table"), + }) + furniture.register_stone("mtg_plus:silver_sandstone_cobble", { + description = S("Cobbled Silver Sandstone"), + description_stool = S("Cobbled Silver Sandstone Stool"), + description_table = S("Cobbled Silver Sandstone Table"), + }) + furniture.register_stone("mtg_plus:gravel_cobble", { + description = S("Cobbled Gravel"), + description_stool = S("Cobbled Gravel Stool"), + description_table = S("Cobbled Gravel Table"), + }) +end diff --git a/mods/minetest_mtg_plus/init.lua b/mods/minetest_mtg_plus/init.lua new file mode 100644 index 00000000..0aed8ccd --- /dev/null +++ b/mods/minetest_mtg_plus/init.lua @@ -0,0 +1,24 @@ +mtg_plus = {} + +local path = minetest.get_modpath(minetest.get_current_modname()) + +-- Trivial blocks (full definition included; almost all nodes are full cubes) +dofile(path.."/brickblocks.lua") -- Bricks and blocks +dofile(path.."/cobble.lua") -- Cobblestone +dofile(path.."/seethrough.lua") -- Glasslike nodes +dofile(path.."/specials.lua") -- Nodes with something special (or misc. blocks) + +-- Non-trivial blocks (definition require API) +dofile(path.."/stairslabs.lua") -- Stairs and slabs +dofile(path.."/wallfences.lua") -- Walls and fences +dofile(path.."/xpanes.lua") -- Panes (xpanes mod) +dofile(path.."/doors.lua") -- Doors and trapdoors +dofile(path.."/ladders.lua") -- Ladders + +-- Support for other mods +dofile(path.."/extras.lua") -- Additional blocks and crafts for optional mods +dofile(path.."/awards.lua") -- Achievements for the awards mod + +-- Compability +dofile(path.."/compat_xdecor.lua") -- xdecor compability +dofile(path.."/aliases.lua") -- Aliases for compability diff --git a/mods/minetest_mtg_plus/ladders.lua b/mods/minetest_mtg_plus/ladders.lua new file mode 100644 index 00000000..020e8447 --- /dev/null +++ b/mods/minetest_mtg_plus/ladders.lua @@ -0,0 +1,125 @@ +local S = minetest.get_translator("mtg_plus") + +local metal_sounds, wood_sounds +if default.node_sound_metal_defaults then + metal_sounds = default.node_sound_metal_defaults() +else + metal_sounds = default.node_sound_stone_defaults() +end +wood_sounds = default.node_sound_wood_defaults() + +-- Ladders +minetest.register_node("mtg_plus:ladder_papyrus", { + description = S("Papyrus Ladder"), + _doc_items_longdesc = S("A particulary strong piece of ladder which allows you to move vertically."), + drawtype = "signlike", + tiles = {"mtg_plus_ladder_papyrus.png"}, + inventory_image = "mtg_plus_ladder_papyrus.png", + wield_image = "mtg_plus_ladder_papyrus.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { type = "wallmounted", }, + groups = { snappy = 2, choppy = 1, flammable = 2 }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:ladder_papyrus 2", + recipe = { {"default:papyrus", "", "default:papyrus"}, + {"farming:string", "default:papyrus", "farming:string"}, + {"default:papyrus", "", "default:papyrus"}}, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "mtg_plus:ladder_papyrus", + burntime = 2, +}) + +local simple_ladders = { + { "gold", "metal", S("Golden Ladder"), "default:gold_ingot", { cracky = 3 }, true }, + { "bronze", "metal", S("Bronze Ladder"), "default:bronze_ingot", { cracky = 2 } }, + { "copper", "metal", S("Copper Ladder"), "default:copper_ingot", { cracky = 2 } }, + { "tin", "metal", S("Tin Ladder"), "default:tin_ingot", { cracky = 2 } }, + { "aspen_wood", "wood", S("Aspen Wood Ladder"), "default:aspen_wood", { choppy = 3, flammable = 1 }, nil, 5 }, + { "acacia_wood", "wood", S("Acacia Wood Ladder"), "default:acacia_wood", { choppy = 3, flammable = 1 }, nil, 8 }, + { "pine_wood", "wood", S("Pine Wood Ladder"), "default:pine_wood", { choppy = 3, flammable = 1 }, nil, 6 }, + { "junglewood", "wood", S("Jungle Wood Ladder"), "default:junglewood", { choppy = 3, flammable = 1 }, nil, 9 }, + { "goldwood", "wood", S("Goldwood Ladder"), "mtg_plus:goldwood", { choppy = 2 }, true }, +} + +for m=1, #simple_ladders do + local ladder = simple_ladders[m] + local longdesc + if ladder[6] then + longdesc = S("A luxurious piece of ladder which allows you to move vertically.") + else + longdesc = S("A piece of ladder which allows you to move vertically.") + end + if ladder[2] == "metal" then + sounds = metal_sounds + else + sounds = wood_sounds + end + minetest.register_node("mtg_plus:ladder_"..ladder[1], { + description = ladder[3], + _doc_items_longdesc = longdesc, + drawtype = "signlike", + tiles = {"mtg_plus_ladder_"..ladder[1]..".png"}, + inventory_image = "mtg_plus_ladder_"..ladder[1]..".png", + wield_image = "mtg_plus_ladder_"..ladder[1]..".png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { type = "wallmounted", }, + groups = ladder[5], + sounds = sounds, + }) + if ladder[2] == "metal" then + minetest.register_craft({ + output = "mtg_plus:ladder_"..ladder[1].." 15", + recipe = { + {ladder[4], "", ladder[4]}, + {ladder[4], ladder[4], ladder[4]}, + {ladder[4], "", ladder[4]}, + }, + }) + else + minetest.register_craft({ + output = "mtg_plus:ladder_"..ladder[1].." 9", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", ladder[4], "group:stick"}, + {"group:stick", "", "group:stick"}, + }, + }) + if ladder[7] ~= nil then + minetest.register_craft({ + type = "fuel", + recipe = "mtg_plus:ladder_"..ladder[1], + burntime = ladder[7], + }) + end + end +end + +-- Tweak the default ladder +minetest.override_item("default:ladder_wood", { description = S("Apple Wood Ladder") }) +minetest.register_craft({ + output = "default:ladder_wood 9", + recipe = { + {"group:stick", "", "group:stick"}, + {"group:stick", "default:wood", "group:stick"}, + {"group:stick", "", "group:stick"}, + }, +}) + +-- The default stick-only recipe for default ladder will be intentionally kept for +-- convenience. diff --git a/mods/minetest_mtg_plus/locale/mtg_plus.de.tr b/mods/minetest_mtg_plus/locale/mtg_plus.de.tr new file mode 100644 index 00000000..7abf4965 --- /dev/null +++ b/mods/minetest_mtg_plus/locale/mtg_plus.de.tr @@ -0,0 +1,167 @@ +# textdomain:mtg_plus +Aggregated Diamond Block=Aggregieter Diamantblock +Bronze Brick=Bronzeziegel +Bronze Brick Slab=Bronzeziegelplatte +Bronze Brick Stair=Bronzeziegeltreppe +Copper Brick=Kupferziegel +Copper Brick Slab=Kupferziegelplatte +Copper Brick Stair=Kupferziegeltreppe +Dense Ice Tile=Kompakteiskachel +Desert Stone Brick with Golden Edges=Wüstensteinziegel mit Goldkanten +Diamond Block with Golden Frame=Diamantblock mit Goldrahmen +Dirty Glass=Schmutziges Glas +Soft Dirt Brick=Weicher Erdziegel +Hardened Dirt Brick=Gehärteter Erdziegel +Hardened Dirt Brick Slab=Gehärtete Erdziegelplatte +Hardened Dirt Brick Stair=Gehärtete Erdziegeltreppe +Cobbled Gravel=Kiespflaster +Cobbled Gravel Slab=Kiespflasterplatte +Cobbled Gravel Stair=Kiespflastertreppe +Cobbled Gravel Wall=Kiespflastermauer +Gravel Dirt=Kieserde +Gold Brick=Goldziegel +Gold Brick Slab=Goldziegelplatte +Gold Brick Stair=Goldziegeltreppe +Golden Ladder=Goldleiter +Copper Ladder=Kupferleiter +Bronze Ladder=Bronzeleiter +Tin Ladder=Zinnleiter +Golden Window=Goldfenster +Goldglass=Goldglas +Goldglass Pane=Goldglasscheibe +Goldwood=Goldholz +Goldwood Fence=Goldholzzaun +Goldwood Fence Gate=Goldholzzauntor +Goldwood Fence Rail=Goldholzzaungeländer +Goldwood Slab=Goldholzplatte +Goldwood Stair=Goldholztreppe +Hard Snow Brick=Hartschneeziegel +Hard Snow Brick Slab=Hartschneeziegelplatte +Hard Snow Brick Stair=Hartschneeziegeltreppe +Ice Block=Eisblock +Ice Block Slab=Eisblockplatte +Ice Block Stair=Eisblocktreppe +Ice Brick=Eisziegel +Ice Brick Slab=Eisziegelplatte +Ice Brick Stair=Eisziegeltreppe +Ice Door=Eistür +Ice Trapdoor=Eisfalltür +Ice Tile=Eiskachel +Ice Tile Slab=Eiskachelplatte +Ice Tile Stair=Eiskacheltreppe +Ice Window=Eisfenster +Ice Window Pane=Eisfensterscheibe +Icy Snow Brick=Eisschneeziegel +Icy Snow Brick Slab=Eisschneeziegelplatte +Icy Snow Brick Stair=Eisschneeziegeltreppe +Icy Steel Door=Eisstahltür +Icy Steel Trapdoor=Eisstahlfalltür +Jungle Cobblestone=Dschungelkopfsteinpflaster +Jungle Cobblestone Slab=Dschungelkopfsteinpflasterplatte +Jungle Cobblestone Stair=Dschungelkopfsteinpflastertreppe +Obsidian Brick with Golden Edges=Obsidianziegel mit Goldkanten +Paper Barrier=Papierbarriere +Papyrus Block=Papyrusblock +Papyrus Door=Papyrustür +Papyrus Ladder=Papyrusleiter +Papyrus Lattice=Papyrusgitter +Sandstone Brick with Golden Edges=Sandsteinziegel mit Goldkanten +Cobbled Sandstone=Sandsteinpflaster +Cobbled Sandstone Slab=Sandsteinpflasterplatte +Cobbled Sandstone Stair=Sandsteinpflastertreppe +Soft Snow Brick=Weichschneeziegel +Steel Brick=Stahlziegel +Steel Brick Slab=Stahlziegelplatte +Steel Brick Stair=Stahlziegeltreppe +Stone Brick with Golden Edges=Steinziegel mit Goldkanten +Wooden Bar Door=Holzgittertür +Wooden Bars=Holzgitter +Jungle Cobblestone Wall=Dschungelkopfsteinpflastermauer +Dense Ice Tile Wall=Kompakteiskachelmauer +Cobbled Sandstone Wall=Sandsteinpflastermauer +Goldwood Chair=Goldholzstuhl +Goldwood Stool=Goldholzhocker +Goldwood Table=Goldholztisch +Jungle Cobblestone Stool=Dschungelkopfsteinpflasterhocker +Jungle Cobblestone Table=Dschungelkopfsteinpflastertisch +Cobbled Sandstone Stool=Sandsteinpflasterhocker +Cobbled Sandstone Table=Sandsteinpflastertisch +Cobbled Gravel Stool=Kiespflasterhocker +Cobbled Gravel Table=Kiespflastertisch +Flint Block=Feuersteinblock +Flint Block Stair=Feuersteinblocktreppe +Flint Block Slab=Feuersteinblockplatte +Desert Sandstone Brick with Golden Edges=Wüstensandsteinziegel mit Goldkanten +Silver Sandstone Brick with Golden Edges=Silbersandsteinziegel mit Goldkanten +Tin Brick=Zinnziegel +Tin Brick Slab=Zinnziegelplatte +Tin Brick Stair=Zinnziegeltreppe +Cobbled Silver Sandstone=Silbersandsteinpflaster +Cobbled Silver Sandstone Slab=Silbersandsteinpflasterplatte +Cobbled Silver Sandstone Stair=Silbersandsteinpflastertreppe +Cobbled Silver Sandstone Wall=Silbersandsteinpflastermauer +Cobbled Desert Sandstone=Wüstensandsteinpflaster +Cobbled Desert Sandstone Slab=Wüstensandsteinpflasterplatte +Cobbled Desert Sandstone Stair=Wüstensandsteinpflastertreppe +Cobbled Desert Sandstone Wall=Wüstensandsteinpflastermauer +Cobbled Silver Sandstone Stool=Silbersandsteinpflasterhocker +Cobbled Silver Sandstone Table=Silbersandsteinpflastertisch +Cobbled Desert Sandstone Stool=Wüstensandsteinpflasterhocker +Cobbled Desert Sandstone Table=Wüstensandsteinpflastertisch +Soft Snow Brick Slab=Weichschneeziegelplatte +Soft Snow Brick Stair=Weichschneeziegeltreppe +Historic City=Historische Stadt +Place a aggregated diamond block.=Platzieren Sie einen aggregierten Diamantblock. +Ice doors can be opened and closed. They are solid, but some of the light hitting ice doors can still go through, making them an interesting decoration in icy areas.=Eistüren können geöffnet und geschlossen werden. Sie sind solide, aber etwas des Lichts, welches auf Eistüren einfällt, gelangt hindurch, was sie zu einer interessanten Dekoration in eiskalten Gebieten macht. +A luxurious piece of ladder which allows you to move vertically.=Ein luxoriöses Leitersegment, auf dem Sie sich vertikal bewegen können. +A piece of ladder which allows you to move vertically.=Ein Leitersegment, auf dem Sie sich vertikal bewegen können. +Green Jungle=Grüner Dschungel +This is a fence made out of precious goldwood. The fence will neatly connect to its neighbors, making it easy to build nice-looking fence structures. The fence can be jumped over.=Dies ist ein Zaun, angefertigt aus dem wertvollen Goldholz. Der Zaun verbindet sich praktischerweise mit seinen Nachbarn; damit kann man leicht lange Zäune errichten. Man kann über den Zaun springen. +This is a fence rail made out of precious goldwood. It will neatly connect to its neighbors, but without creating fence posts. It can be jumped over.=Dies ist ein Zaungeländer, angefertigt aus dem wertvollen Goldholz. Er verbindet sich praktischerweise mit seinen Nachbarn, aber ohne dabei Zaunpfosten zu erzeugen. Man kann über das Geländer springen. +Goldwood is a precious artificial kind of wood made by enriching wood with gold. Goldwood is fireproof and notable for its bright yellowy appearance.=Goldholz ist eine wertvolle künstliches Art Holz, welches mit Gold angereichert wurde. Goldholz ist feuersicher und fällt durch seine helle gelbliche Farbe auf. +Ice window panes are thinner than the full ice windows and neatly connect to each other as you build them=Eisfensterscheiben sind dünner als die vollen Eisfenster und verbinden sich praktischerweise zu den anderen Fensterscheiben beim Bauen. +Craft 100 goldwood.=Fertigen Sie 100 Goldholz. +Icy steel doors are a combination of ice doors and steel doors which can only be opened and closed by their owners. They are solid, but some of the light hitting icy steel doors can still go through.=Eisstahltüren sind eine Verbindung von Eistüren und Stahltüren, welche nur von ihrem Eigentümer geöffnet werden können. Sie sind solide, aber etwas Licht scheint durch Eisstahltüren hindurch. +A ornamental and mostly transparent block, made by combining glass with gold.=Ein größtenteils durchsichtiger Zierblock, der durch die Kombinierung von Glas mit Gold entstanden ist. +This decorational ice tile has been crafted in a way that it is partially transparent and looks like a real window.=Diese dekorative Eiskachel wurde so gefertigt, dass sie teilweise durchsichtig ist und wie ein echtes Fenster aussieht. +Small Gold-framed Diamond Block=Kleiner mit Gold umrahmter Diamantblock +Luxurious Adornment=Luxuriöse Verzierung +Craft 4 small gold-framed diamond blocks.=Fertigen sie 4 kleine mit Gold umrahmte Diamantblöcke an. +Papyrus Panic=Papyruspanik +An ice trapdoor covers the floor and can be opened and closed by anyone. Ice trapdoors are solid, but some light can pass through nonetheless.=Eine Eisfalltür bedeckt den Boden und kann von jedem geöffnet und geschlossen werden. Eisfalltüren sind solide, aber etwas Licht scheint durch. +Rich Carpenter=Die Luxus-Zimmerei +Let's build an igloo!=Lasst uns ein Iglu bauen! +Yellow Desert=Gelbe Wüste +Cobbled gravel is solidified gravel, carefully arranged in a mosaic-like pattern. It makes a nice building material.=Kiespflaster ist ein verfestigte Form von Kies, welches behutsam in ein eine Art Mosaik angeordnet wurde. +Gravel dirt is a type of dirt consisting of equal parts of gravel and dirt. It combines some of the properties of gravel and dirt.=Kieserde ist eine Art Erde, welche zu gleichen Teilen aus Kies und Erde besteht. Sie kombiniert ein paar der Eigenschaften von Kies und Erde. +Build 100 papyrus blocks.=Fertigen Sie 100 Papyrusblöcke. +This block is even harder than diamond; diamond pickaxes can't break it. TNT is able to destroy this block.=Dieser Block ist sogar härter als Diamant; Diamantspitzhacken können ihn nicht zerbrechen. TNT kann diesen Block zerstören. +Craft 400 cobbled gravel.=Fertigen Sie 400 Kiespflaster. +A particulary strong piece of ladder which allows you to move vertically.=Ein besonders robustes Leitersegment, auf dem Sie sich vertikal bewegen können. +Self-proclaimed Winner=Selbsternannter Sieger +Place 225 hard snow bricks.=Fertigen Sie 225 Hartschneeziegel. +Craft 512 jungle cobblestone.=Fertigen Sie 512 Dschungelkopfsteinpflaster. +Ice Crazy=Verrückt nach Eis +Craft 128 dense ice tiles.=Fertigen Sie 128 Kompakteiskacheln +A fence gate made from precious goldwood. It blocks the path, but it can be opened and easily jumped over. Other fence posts will neatly connect to this fence gate.=Ein Zauntor aus wertvollem Goldholz. Er blockiert den Durchgang, aber er kann geöffnet werden und man kann einfach rüberspringen. Andere Zaunpfosten werden sich automatisch mit diesem Zauntor verbinden. +Can't dig me!=Ich bin unzerbrechlich! +Craft a golden cup.=Fertigen Sie einen Goldpokal. +Craft 512 cobbled sandstone.=Fertigen Sie 512 Sandsteinpflaster. +An icy steel trapdoor is a combination of an ice trapdoor and a steel trapdoor. It covers the floor and can only be opened and closed by its placer. Icy steel trapdoors are solid, but some light can pass through nonetheless.=Eine Eisstahlfalltür ist eine Kombination aus Eisfalltür und Stahlfalltür. Sie bedeckt den Boden und kann nur vom Eigentümer geöffnet oder geschlossen werden. Eisstahlfalltüren sind solide, aber etwas Licht scheint hindurch. +A decorative, semitransparent block. The dirt makes it hard for the sunlight to pass through.=Ein dekorativer halbtransparenter Block. Der Dreck reduziert die Lichtstärke. +Papier barriers are thin solid layers of paper which neatly connect to their neighbors as you build them. They could be useful to separate rooms.=Papierbarrieren sind dünne feste Papierschichten, die sich mit ihren Nachbarblöcken verbinden. Sie könnten nützlich sein, um Räume zu teilen. +Wooden bars are barriers which neatly connect to their neighbors as you build them.=Holzgitter sind Barrieren, die sich mit ihren Nachbarblöcken verbinden. +Goldglass panes are thin layers of goldglass which neatly connect to their neighbors as you build them.=Goldglasscheiben sind dünne Goldglasschichten, die sich mit ihren Nachbarblöcken verbinden. +Golden windows are decorative blocks which can be placed into holes for nice-looking windows. Golden windows automatically connect to their neighbors as you build them.=Goldfenster sind dünne dekorative Blöcke, die in Lücken als gutaussehende Fenster platziert werden können. Goldfenster verbinden sich automatisch mit ihren Nachbarn. +Papyrus lattices are strong barriers which neatly connect to their neighbors as you build them.=Papyrusgitter sind stabile Barrieren, die sich automatisch mit ihren Nachbarn verbinden. +A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player.=Eine Tür belegt einen vertikalen Bereich von zwei Blöcken, um den Weg zu blockieren. Sie kann von jedem Spieler geöffnet und geschlossen werden. +Use the use key on it to open or close it.=Benutzen Sie die „Benutzen“-Taste auf ihr, um sie zu öffnen oder zu schließen. +Point the icy steel trapdoor to see who owns it. Use the use key on it to open or close it (if you own it).=Zeigen Sie auf die Eisstahlfalltür, um zu sehen, wem sie gehört. Benutzen Sie die „Benutzen“-Taste auf ihr, um sie zu öffnen oder zu schließen (wenn sie Ihnen gehört). +Point the door to see who owns it. Use the use key on the door to open or close it (if you own it).=Zeigen Sie auf die Tür, um zu sehen, wem sie gehört. Benutzen Sie die „Benutzen“-Taste auf ihr, um sie zu öffnen oder zu schließen (wenn sie Ihnen gehört). +Apple Wood Ladder=Apfelholzleiter +Acacia Wood Ladder=Akazienholzleiter +Pine Wood Ladder=Pinienholzleiter +Aspen Wood Ladder=Espenholzleiter +Jungle Wood Ladder=Dschungelholzleiter +Goldwood Ladder=Goldholzleiter +A piece of wall creates simple barriers that connect to neighbor blocks. Walls can be jumped over.=Ein Stück Mauer erzeugt einfache Barrieren, welche sich mit den Nachbarblöcken verbinden. Man kann über Mauern springen. diff --git a/mods/minetest_mtg_plus/locale/template.txt b/mods/minetest_mtg_plus/locale/template.txt new file mode 100644 index 00000000..eb893122 --- /dev/null +++ b/mods/minetest_mtg_plus/locale/template.txt @@ -0,0 +1,166 @@ +# textdomain:mtg_plus +A decorative, semitransparent block. The dirt makes it hard for the sunlight to pass through.= +A fence gate made from precious goldwood. It blocks the path, but it can be opened and easily jumped over. Other fence posts will neatly connect to this fence gate.= +Aggregated Diamond Block= +A luxurious piece of ladder which allows you to move vertically.= +A piece of ladder which allows you to move vertically.= +An ice trapdoor covers the floor and can be opened and closed by anyone. Ice trapdoors are solid, but some light can pass through nonetheless.= +An icy steel trapdoor is a combination of an ice trapdoor and a steel trapdoor. It covers the floor and can only be opened and closed by its placer. Icy steel trapdoors are solid, but some light can pass through nonetheless.= +A ornamental and mostly transparent block, made by combining glass with gold.= +A particulary strong piece of ladder which allows you to move vertically.= +Bronze Brick= +Bronze Brick Slab= +Bronze Brick Stair= +Build 100 papyrus blocks.= +Can't dig me!= +Cobbled Desert Sandstone= +Cobbled Desert Sandstone Slab= +Cobbled Desert Sandstone Stair= +Cobbled Desert Sandstone Stool= +Cobbled Desert Sandstone Table= +Cobbled Desert Sandstone Wall= +Cobbled Gravel= +Cobbled gravel is solidified gravel, carefully arranged in a mosaic-like pattern. It makes a nice building material.= +Cobbled Gravel Slab= +Cobbled Gravel Stair= +Cobbled Gravel Stool= +Cobbled Gravel Table= +Cobbled Gravel Wall= +Cobbled Sandstone= +Cobbled Sandstone Slab= +Cobbled Sandstone Stair= +Cobbled Sandstone Stool= +Cobbled Sandstone Table= +Cobbled Sandstone Wall= +Cobbled Silver Sandstone= +Cobbled Silver Sandstone Slab= +Cobbled Silver Sandstone Stair= +Cobbled Silver Sandstone Stool= +Cobbled Silver Sandstone Table= +Cobbled Silver Sandstone Wall= +Copper Brick= +Copper Brick Slab= +Copper Brick Stair= +Craft 100 goldwood.= +Craft 128 dense ice tiles.= +Craft 400 cobbled gravel.= +Craft 4 small gold-framed diamond blocks.= +Craft 512 cobbled sandstone.= +Craft 512 jungle cobblestone.= +Craft a golden cup.= +Dense Ice Tile= +Dense Ice Tile Wall= +Desert Sandstone Brick with Golden Edges= +Desert Stone Brick with Golden Edges= +Dirty Glass= +Flint Block= +Flint Block Slab= +Flint Block Stair= +Gold Brick= +Gold Brick Slab= +Gold Brick Stair= +Golden Ladder= +Copper Ladder= +Tin Ladder= +Bronze Ladder= +Golden Window= +Goldglass= +Goldglass Pane= +Goldwood= +Goldwood Chair= +Goldwood Fence= +Goldwood Fence Gate= +Goldwood Fence Rail= +Goldwood is a precious artificial kind of wood made by enriching wood with gold. Goldwood is fireproof and notable for its bright yellowy appearance.= +Goldwood Slab= +Goldwood Stair= +Goldwood Stool= +Goldwood Table= +Gravel Dirt= +Gravel dirt is a type of dirt consisting of equal parts of gravel and dirt. It combines some of the properties of gravel and dirt.= +Green Jungle= +Hardened Dirt Brick= +Hardened Dirt Brick Slab= +Hardened Dirt Brick Stair= +Hard Snow Brick= +Hard Snow Brick Slab= +Hard Snow Brick Stair= +Historic City= +Ice Block= +Ice Block Slab= +Ice Block Stair= +Ice Brick= +Ice Brick Slab= +Ice Brick Stair= +Ice Crazy= +Ice Door= +Ice doors can be opened and closed. They are solid, but some of the light hitting ice doors can still go through, making them an interesting decoration in icy areas.= +Ice Tile= +Ice Tile Slab= +Ice Tile Stair= +Ice Trapdoor= +Ice Window= +Ice Window Pane= +Ice window panes are thinner than the full ice windows and neatly connect to each other as you build them= +Icy Snow Brick= +Icy Snow Brick Slab= +Icy Snow Brick Stair= +Icy Steel Door= +Icy steel doors are a combination of ice doors and steel doors which can only be opened and closed by their owners. They are solid, but some of the light hitting icy steel doors can still go through.= +Icy Steel Trapdoor= +Jungle Cobblestone= +Jungle Cobblestone Slab= +Jungle Cobblestone Stair= +Jungle Cobblestone Stool= +Jungle Cobblestone Table= +Jungle Cobblestone Wall= +Let's build an igloo!= +Luxurious Adornment= +Obsidian Brick with Golden Edges= +Paper Barrier= +Papyrus Block= +Papyrus Door= +Papyrus Ladder= +Papyrus Lattice= +Papyrus Panic= +Place 225 hard snow bricks.= +Place a aggregated diamond block.= +Rich Carpenter= +Sandstone Brick with Golden Edges= +Self-proclaimed Winner= +Silver Sandstone Brick with Golden Edges= +Small Gold-framed Diamond Block= +Soft Dirt Brick= +Soft Snow Brick= +Soft Snow Brick Slab= +Soft Snow Brick Stair= +Steel Brick= +Steel Brick Slab= +Steel Brick Stair= +Stone Brick with Golden Edges= +This block is even harder than diamond; diamond pickaxes can't break it. TNT is able to destroy this block.= +This decorational ice tile has been crafted in a way that it is partially transparent and looks like a real window.= +This is a fence made out of precious goldwood. The fence will neatly connect to its neighbors, making it easy to build nice-looking fence structures. The fence can be jumped over.= +This is a fence rail made out of precious goldwood. It will neatly connect to its neighbors, but without creating fence posts. It can be jumped over.= +Tin Brick= +Tin Brick Slab= +Tin Brick Stair= +Wooden Bar Door= +Wooden Bars= +Yellow Desert= +Papier barriers are thin solid layers of paper which neatly connect to their neighbors as you build them. They could be useful to separate rooms.= +Wooden bars are barriers which neatly connect to their neighbors as you build them.= +Goldglass panes are thin layers of goldglass which neatly connect to their neighbors as you build them.= +Golden windows are decorative blocks which can be placed into holes for nice-looking windows. Golden windows automatically connect to their neighbors as you build them.= +Papyrus lattices are strong barriers which neatly connect to their neighbors as you build them.= +A door covers a vertical area of two blocks to block the way. It can be opened and closed by any player.= +Use the use key on it to open or close it.= +Point the icy steel trapdoor to see who owns it. Use the use key on it to open or close it (if you own it).= +Point the door to see who owns it. Use the use key on the door to open or close it (if you own it).= +Apple Wood Ladder= +Acacia Wood Ladder= +Pine Wood Ladder= +Aspen Wood Ladder= +Jungle Wood Ladder= +Goldwood Ladder= +A piece of wall creates simple barriers that connect to neighbor blocks. Walls can be jumped over.= diff --git a/mods/minetest_mtg_plus/mod.conf b/mods/minetest_mtg_plus/mod.conf new file mode 100644 index 00000000..b9b9380a --- /dev/null +++ b/mods/minetest_mtg_plus/mod.conf @@ -0,0 +1,4 @@ +name = mtg_plus +description = Adds various simple decorative blocks, doors, panes and other items to Minetest Game, focusing on snow, ice, luxury, bamboo and more. +depends = default, doors, farming, xpanes, walls, stairs +optional_depends = moreblocks, xdecor, furniture, doc_items, awards diff --git a/mods/minetest_mtg_plus/screenshot.png b/mods/minetest_mtg_plus/screenshot.png new file mode 100644 index 00000000..89a37d27 Binary files /dev/null and b/mods/minetest_mtg_plus/screenshot.png differ diff --git a/mods/minetest_mtg_plus/seethrough.lua b/mods/minetest_mtg_plus/seethrough.lua new file mode 100644 index 00000000..c259f22c --- /dev/null +++ b/mods/minetest_mtg_plus/seethrough.lua @@ -0,0 +1,61 @@ +local S = minetest.get_translator("mtg_plus") + +-- Blocks that you can see through + +minetest.register_node("mtg_plus:goldglass", { + description = S("Goldglass"), + _doc_items_longdesc = S("A ornamental and mostly transparent block, made by combining glass with gold."), + drawtype = "glasslike_framed_optional", + tiles = {"mtg_plus_goldglass.png", "mtg_plus_goldglass_detail.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = { cracky = 3, oddly_breakable_by_hand = 2}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:goldglass 1", + recipe = { { "default:gold_ingot", }, + { "default:glass",}, + { "default:gold_ingot", }, + } +}) + +minetest.register_node("mtg_plus:dirty_glass", { + description = S("Dirty Glass"), + _doc_items_longdesc = S("A decorative, semitransparent block. The dirt makes it hard for the sunlight to pass through."), + drawtype = "glasslike_framed_optional", + tiles = {"mtg_plus_dirty_glass.png", "mtg_plus_dirty_glass_detail.png"}, + paramtype = "light", + sunlight_propagates = false, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:dirty_glass 3", + recipe = { { "", "default:dirt", "" }, + {"default:glass", "default:glass", "default:glass"}, + } +}) + +minetest.register_node("mtg_plus:ice_window", { + description = S("Ice Window"), + _doc_items_longdesc = S("This decorational ice tile has been crafted in a way that it is partially transparent and looks like a real window."), + drawtype = "glasslike", + tiles = {"mtg_plus_ice_window.png"}, + sunlight_propagates = true, + groups = {cracky = 3, cools_lava = 1, slippery = 3 }, + is_ground_content = false, + paramtype = "light", + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:ice_window", + type = "cooking", + recipe = "mtg_plus:ice_tile4", + cooktime = 1, +}) diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_door_ice_close.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_door_ice_close.ogg new file mode 100644 index 00000000..8f37ed21 Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_door_ice_close.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_door_ice_open.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_door_ice_open.ogg new file mode 100644 index 00000000..8a56296d Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_door_ice_open.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_door_icesteel_close.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_door_icesteel_close.ogg new file mode 100644 index 00000000..fb40f8ee Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_door_icesteel_close.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_door_icesteel_open.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_door_icesteel_open.ogg new file mode 100644 index 00000000..55e2d5fb Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_door_icesteel_open.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.1.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.1.ogg new file mode 100644 index 00000000..49ce52a8 Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.1.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.2.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.2.ogg new file mode 100644 index 00000000..d0671282 Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.2.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.3.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.3.ogg new file mode 100644 index 00000000..0ead8612 Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dig.3.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dug.1.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dug.1.ogg new file mode 100644 index 00000000..f760cd14 Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_dug.1.ogg differ diff --git a/mods/minetest_mtg_plus/sounds/mtg_plus_paper_step.1.ogg b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_step.1.ogg new file mode 100644 index 00000000..6c908f1c Binary files /dev/null and b/mods/minetest_mtg_plus/sounds/mtg_plus_paper_step.1.ogg differ diff --git a/mods/minetest_mtg_plus/specials.lua b/mods/minetest_mtg_plus/specials.lua new file mode 100644 index 00000000..8ec7035a --- /dev/null +++ b/mods/minetest_mtg_plus/specials.lua @@ -0,0 +1,65 @@ +local S = minetest.get_translator("mtg_plus") +local deco +if minetest.get_modpath("doc_items") then + deco = doc.sub.items.temp.deco +end + +-- Special: Variant of dirt without the grass/plant spread +minetest.register_node("mtg_plus:graveldirt", { + description = S("Gravel Dirt"), + _doc_items_longdesc = S("Gravel dirt is a type of dirt consisting of equal parts of gravel and dirt. It combines some of the properties of gravel and dirt."), + tiles = {"mtg_plus_graveldirt.png"}, + is_ground_content = true, + groups = { crumbly = 2, level = 1, soil = 1, }, + sounds = default.node_sound_dirt_defaults(), + drop = { + items = { + { items = { "default:gravel" } }, + { items = { "default:dirt" } }, + } + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mtg_plus:graveldirt", + recipe = { "default:gravel", "default:dirt" }, +}) + +-- Special: Extremely hard block +minetest.register_node("mtg_plus:harddiamondblock",{ + description = S("Aggregated Diamond Block"), + _doc_items_longdesc = S("This block is even harder than diamond; diamond pickaxes can't break it. TNT is able to destroy this block."), + tiles = { "mtg_plus_hard_diamond_block.png" }, + is_ground_content = false, + groups = { cracky = 1, level = 4 }, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:harddiamondblock 1", + type = "shapeless", + recipe = { "default:diamondblock", "default:diamondblock" } +}) + +-- Special: Wood that doesn't burn +minetest.register_node("mtg_plus:goldwood", { + description = S("Goldwood"), + _doc_items_longdesc = S("Goldwood is a precious artificial kind of wood made by enriching wood with gold. Goldwood is fireproof and notable for its bright yellowy appearance."), + tiles = {"mtg_plus_goldwood.png"}, + is_ground_content = false, + groups = {choppy = 2, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "mtg_plus:goldwood", + type = "shapeless", + recipe = { "group:wood", "default:gold_ingot" }, +}) + +-- Prevent goldwood from being used as furnace fuel +minetest.clear_craft({ + type = "fuel", + recipe = "mtg_plus:goldwood", +}) diff --git a/mods/minetest_mtg_plus/stairslabs.lua b/mods/minetest_mtg_plus/stairslabs.lua new file mode 100644 index 00000000..0ecf69aa --- /dev/null +++ b/mods/minetest_mtg_plus/stairslabs.lua @@ -0,0 +1,39 @@ +local S = minetest.get_translator("mtg_plus") + +-- Stairs/slabs + +-- Add custom stairs and slabs +local stairslab_ignore_groups = { "wood", "stone", "soil", } + +local function simple_stair_slab(subname, desc_stair, desc_slab) + local itemstring = "mtg_plus:"..subname + local groups = table.copy(minetest.registered_nodes[itemstring].groups) + for i=1,#stairslab_ignore_groups do + groups[stairslab_ignore_groups[i]] = nil + end + stairs.register_stair_and_slab(subname, itemstring, groups, minetest.registered_nodes[itemstring].tiles, desc_stair, desc_slab, minetest.registered_nodes[itemstring].sounds) +end + +simple_stair_slab("sandstone_cobble", S("Cobbled Sandstone Stair"), S("Cobbled Sandstone Slab")) +simple_stair_slab("desert_sandstone_cobble", S("Cobbled Desert Sandstone Stair"), S("Cobbled Desert Sandstone Slab")) +simple_stair_slab("silver_sandstone_cobble", S("Cobbled Silver Sandstone Stair"), S("Cobbled Silver Sandstone Slab")) +simple_stair_slab("jungle_cobble", S("Jungle Cobblestone Stair"), S("Jungle Cobblestone Slab")) +simple_stair_slab("snow_brick", S("Soft Snow Brick Stair"), S("Soft Snow Brick Slab")) +simple_stair_slab("hard_snow_brick", S("Hard Snow Brick Stair"), S("Hard Snow Brick Slab")) +simple_stair_slab("ice_snow_brick", S("Icy Snow Brick Stair"), S("Icy Snow Brick Slab")) +simple_stair_slab("ice_brick", S("Ice Brick Stair"), S("Ice Brick Slab")) +simple_stair_slab("ice_tile4", S("Ice Tile Stair"), S("Ice Tile Slab")) +simple_stair_slab("goldwood", S("Goldwood Stair"), S("Goldwood Slab")) +simple_stair_slab("goldbrick", S("Gold Brick Stair"), S("Gold Brick Slab")) +simple_stair_slab("bronzebrick", S("Bronze Brick Stair"), S("Bronze Brick Slab")) +simple_stair_slab("tinbrick", S("Tin Brick Stair"), S("Tin Brick Slab")) +simple_stair_slab("copperbrick", S("Copper Brick Stair"), S("Copper Brick Slab")) +simple_stair_slab("steelbrick", S("Steel Brick Stair"), S("Steel Brick Slab")) +simple_stair_slab("harddirtbrick", S("Hardened Dirt Brick Stair"), S("Hardened Dirt Brick Slab")) +simple_stair_slab("gravel_cobble", S("Cobbled Gravel Stair"), S("Cobbled Gravel Slab")) + +stairs.register_slab("flint_block", "mtg_plus:flint_block", {cracky=2}, {"mtg_plus_flint_block.png", "mtg_plus_flint_block.png", "mtg_plus_flint_block_slab.png", "mtg_plus_flint_block_slab.png", "mtg_plus_flint_block_slab.png", "mtg_plus_flint_block_slab.png"}, S("Flint Block Slab"), minetest.registered_items["mtg_plus:flint_block"].sounds) +stairs.register_stair("flint_block", "mtg_plus:flint_block", {cracky=2}, {"mtg_plus_flint_block_slab.png", "mtg_plus_flint_block.png", "mtg_plus_flint_block_stair1.png", "mtg_plus_flint_block_stair2.png", "mtg_plus_flint_block.png", "mtg_plus_flint_block_slab.png"}, S("Flint Block Stair"), minetest.registered_items["mtg_plus:flint_block"].sounds) + +stairs.register_slab("ice_block", "mtg_plus:ice_block", {cracky=3, cools_lava=1, slippery=3}, {"mtg_plus_ice_block.png", "mtg_plus_ice_block.png", "mtg_plus_ice_block_slab.png", "mtg_plus_ice_block_slab.png", "mtg_plus_ice_block_slab.png", "mtg_plus_ice_block_slab.png"}, S("Ice Block Slab"), minetest.registered_items["mtg_plus:ice_block"].sounds) +stairs.register_stair("ice_block", "mtg_plus:ice_block", {cracky=3, cools_lava=1, slippery=3}, {"mtg_plus_ice_block_slab.png", "mtg_plus_ice_block.png", "mtg_plus_ice_block_stair1.png", "mtg_plus_ice_block_stair2.png", "mtg_plus_ice_block.png", "mtg_plus_ice_block_slab.png"}, S("Ice Block Stair"), minetest.registered_items["mtg_plus:ice_block"].sounds) diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_bronze_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_bronze_brick.png new file mode 100644 index 00000000..793657e8 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_bronze_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_cobble_jungle.png b/mods/minetest_mtg_plus/textures/mtg_plus_cobble_jungle.png new file mode 100644 index 00000000..fe6143ad Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_cobble_jungle.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_copper_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_copper_brick.png new file mode 100644 index 00000000..ebf43680 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_copper_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_desert_sandstone_brick_gold.png b/mods/minetest_mtg_plus/textures/mtg_plus_desert_sandstone_brick_gold.png new file mode 100644 index 00000000..7de2e04f Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_desert_sandstone_brick_gold.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_desert_sandstone_cobble.png b/mods/minetest_mtg_plus/textures/mtg_plus_desert_sandstone_cobble.png new file mode 100644 index 00000000..6b1cc928 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_desert_sandstone_cobble.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_desert_stone_brick_gold.png b/mods/minetest_mtg_plus/textures/mtg_plus_desert_stone_brick_gold.png new file mode 100644 index 00000000..18860202 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_desert_stone_brick_gold.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_dirt_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_dirt_brick.png new file mode 100644 index 00000000..999dbf59 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_dirt_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_dirt_brick_hard.png b/mods/minetest_mtg_plus/textures/mtg_plus_dirt_brick_hard.png new file mode 100644 index 00000000..0db2208d Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_dirt_brick_hard.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_dirty_glass.png b/mods/minetest_mtg_plus/textures/mtg_plus_dirty_glass.png new file mode 100644 index 00000000..e5bf96cb Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_dirty_glass.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_dirty_glass_detail.png b/mods/minetest_mtg_plus/textures/mtg_plus_dirty_glass_detail.png new file mode 100644 index 00000000..1d1e596f Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_dirty_glass_detail.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_ice.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_ice.png new file mode 100644 index 00000000..7562a3a9 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_ice.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_ice_item.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_ice_item.png new file mode 100644 index 00000000..06198889 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_ice_item.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_icesteel.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_icesteel.png new file mode 100644 index 00000000..6cdc18d3 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_icesteel.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_icesteel_item.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_icesteel_item.png new file mode 100644 index 00000000..7abaecd6 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_icesteel_item.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_papyrus.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_papyrus.png new file mode 100644 index 00000000..4da15147 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_papyrus.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_papyrus_item.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_papyrus_item.png new file mode 100644 index 00000000..067cc46b Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_papyrus_item.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_wood_bar.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_wood_bar.png new file mode 100644 index 00000000..89ba72b1 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_wood_bar.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_door_wood_bar_item.png b/mods/minetest_mtg_plus/textures/mtg_plus_door_wood_bar_item.png new file mode 100644 index 00000000..4708d2e6 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_door_wood_bar_item.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_fence_rail_goldwood.png b/mods/minetest_mtg_plus/textures/mtg_plus_fence_rail_goldwood.png new file mode 100644 index 00000000..dadada71 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_fence_rail_goldwood.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_flint_block.png b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block.png new file mode 100644 index 00000000..4f9cd228 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_slab.png b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_slab.png new file mode 100644 index 00000000..bb013681 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_slab.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_stair1.png b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_stair1.png new file mode 100644 index 00000000..0079f657 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_stair1.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_stair2.png b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_stair2.png new file mode 100644 index 00000000..941f5b23 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_flint_block_stair2.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_gold_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_gold_brick.png new file mode 100644 index 00000000..d926f160 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_gold_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_gold_diamond_block.png b/mods/minetest_mtg_plus/textures/mtg_plus_gold_diamond_block.png new file mode 100644 index 00000000..9ce10469 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_gold_diamond_block.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_goldglass.png b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass.png new file mode 100644 index 00000000..709c68e0 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_goldglass2.png b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass2.png new file mode 100644 index 00000000..d1635216 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass2.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_detail.png b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_detail.png new file mode 100644 index 00000000..2ca3d329 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_detail.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_pane_half.png b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_pane_half.png new file mode 100644 index 00000000..04abcb03 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_pane_half.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_pane_top.png b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_pane_top.png new file mode 100644 index 00000000..c4aeb725 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_goldglass_pane_top.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_goldwood.png b/mods/minetest_mtg_plus/textures/mtg_plus_goldwood.png new file mode 100644 index 00000000..4e96130f Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_goldwood.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_gravel_cobble.png b/mods/minetest_mtg_plus/textures/mtg_plus_gravel_cobble.png new file mode 100644 index 00000000..688bb4c8 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_gravel_cobble.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_graveldirt.png b/mods/minetest_mtg_plus/textures/mtg_plus_graveldirt.png new file mode 100644 index 00000000..0dee7f88 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_graveldirt.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_hard_diamond_block.png b/mods/minetest_mtg_plus/textures/mtg_plus_hard_diamond_block.png new file mode 100644 index 00000000..f9f7cb70 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_hard_diamond_block.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_hard_snow_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_hard_snow_brick.png new file mode 100644 index 00000000..a01501c2 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_hard_snow_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_block.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block.png new file mode 100644 index 00000000..54bea4a4 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_slab.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_slab.png new file mode 100644 index 00000000..08acdab2 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_slab.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair.png new file mode 100644 index 00000000..ffe5b22b Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair1.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair1.png new file mode 100644 index 00000000..7edcc0b2 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair1.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair2.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair2.png new file mode 100644 index 00000000..6044395c Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_block_stair2.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_brick.png new file mode 100644 index 00000000..528361f7 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_snow_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_snow_brick.png new file mode 100644 index 00000000..86e22147 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_snow_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_tile16.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_tile16.png new file mode 100644 index 00000000..8c13dbe3 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_tile16.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_tile4.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_tile4.png new file mode 100644 index 00000000..3f2aa18e Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_tile4.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ice_window.png b/mods/minetest_mtg_plus/textures/mtg_plus_ice_window.png new file mode 100644 index 00000000..09ade69d Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ice_window.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_jungle_cobble.png b/mods/minetest_mtg_plus/textures/mtg_plus_jungle_cobble.png new file mode 100644 index 00000000..d3d2b8c8 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_jungle_cobble.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_acacia_wood.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_acacia_wood.png new file mode 100644 index 00000000..2f327885 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_acacia_wood.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_aspen_wood.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_aspen_wood.png new file mode 100644 index 00000000..0456c0ad Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_aspen_wood.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_bronze.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_bronze.png new file mode 100644 index 00000000..b091a423 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_bronze.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_copper.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_copper.png new file mode 100644 index 00000000..568fc6c3 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_copper.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_gold.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_gold.png new file mode 100644 index 00000000..10e24837 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_gold.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_goldwood.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_goldwood.png new file mode 100644 index 00000000..878c9401 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_goldwood.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_junglewood.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_junglewood.png new file mode 100644 index 00000000..15876a38 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_junglewood.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_papyrus.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_papyrus.png new file mode 100644 index 00000000..616bacb6 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_papyrus.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_pine_wood.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_pine_wood.png new file mode 100644 index 00000000..bb1504ae Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_pine_wood.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_ladder_tin.png b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_tin.png new file mode 100644 index 00000000..56bef072 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_ladder_tin.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_obsidian_brick_gold.png b/mods/minetest_mtg_plus/textures/mtg_plus_obsidian_brick_gold.png new file mode 100644 index 00000000..e10c2ecd Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_obsidian_brick_gold.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_paperwall.png b/mods/minetest_mtg_plus/textures/mtg_plus_paperwall.png new file mode 100644 index 00000000..3c8352db Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_paperwall.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_side.png b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_side.png new file mode 100644 index 00000000..8911664d Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_side.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_side2.png b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_side2.png new file mode 100644 index 00000000..e3a8b317 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_side2.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_y.png b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_y.png new file mode 100644 index 00000000..4e31bc19 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_block_y.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_lattice.png b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_lattice.png new file mode 100644 index 00000000..07ea7aca Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_papyrus_lattice.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_sandstone_brick_gold.png b/mods/minetest_mtg_plus/textures/mtg_plus_sandstone_brick_gold.png new file mode 100644 index 00000000..d1a2b052 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_sandstone_brick_gold.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_sandstone_cobble.png b/mods/minetest_mtg_plus/textures/mtg_plus_sandstone_cobble.png new file mode 100644 index 00000000..61fd1487 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_sandstone_cobble.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_silver_sandstone_brick_gold.png b/mods/minetest_mtg_plus/textures/mtg_plus_silver_sandstone_brick_gold.png new file mode 100644 index 00000000..6fcbf1d3 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_silver_sandstone_brick_gold.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_silver_sandstone_cobble.png b/mods/minetest_mtg_plus/textures/mtg_plus_silver_sandstone_cobble.png new file mode 100644 index 00000000..fc71c832 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_silver_sandstone_cobble.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_snow_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_snow_brick.png new file mode 100644 index 00000000..f2acb619 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_snow_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_steel_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_steel_brick.png new file mode 100644 index 00000000..c1a70863 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_steel_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_stone_brick_gold.png b/mods/minetest_mtg_plus/textures/mtg_plus_stone_brick_gold.png new file mode 100644 index 00000000..b6a72be0 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_stone_brick_gold.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_tin_brick.png b/mods/minetest_mtg_plus/textures/mtg_plus_tin_brick.png new file mode 100644 index 00000000..1b208865 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_tin_brick.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_ice.png b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_ice.png new file mode 100644 index 00000000..aab2c4e5 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_ice.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_ice_side.png b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_ice_side.png new file mode 100644 index 00000000..b5c6cfa9 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_ice_side.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_icesteel.png b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_icesteel.png new file mode 100644 index 00000000..c30da439 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_icesteel.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_icesteel_side.png b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_icesteel_side.png new file mode 100644 index 00000000..8ad1b0b0 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_trapdoor_icesteel_side.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar.png b/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar.png new file mode 100644 index 00000000..ecf53bfd Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar_side.png b/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar_side.png new file mode 100644 index 00000000..9613634c Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar_side.png differ diff --git a/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar_y.png b/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar_y.png new file mode 100644 index 00000000..6bc362d3 Binary files /dev/null and b/mods/minetest_mtg_plus/textures/mtg_plus_wooden_bar_y.png differ diff --git a/mods/minetest_mtg_plus/wallfences.lua b/mods/minetest_mtg_plus/wallfences.lua new file mode 100644 index 00000000..67c61448 --- /dev/null +++ b/mods/minetest_mtg_plus/wallfences.lua @@ -0,0 +1,51 @@ +local S = minetest.get_translator("mtg_plus") + +-- Walls +walls.register("mtg_plus:wall_sandstone_cobble", S("Cobbled Sandstone Wall"), "mtg_plus_sandstone_cobble.png", "mtg_plus:sandstone_cobble", default.node_sound_stone_defaults()) +walls.register("mtg_plus:wall_desert_sandstone_cobble", S("Cobbled Desert Sandstone Wall"), "mtg_plus_desert_sandstone_cobble.png", "mtg_plus:desert_sandstone_cobble", default.node_sound_stone_defaults()) +walls.register("mtg_plus:wall_silver_sandstone_cobble", S("Cobbled Silver Sandstone Wall"), "mtg_plus_silver_sandstone_cobble.png", "mtg_plus:silver_sandstone_cobble", default.node_sound_stone_defaults()) +walls.register("mtg_plus:wall_jungle_cobble", S("Jungle Cobblestone Wall"), "mtg_plus_jungle_cobble.png", "mtg_plus:jungle_cobble", default.node_sound_stone_defaults()) +walls.register("mtg_plus:wall_ice_tile16", S("Dense Ice Tile Wall"), "mtg_plus_ice_tile16.png", "mtg_plus:ice_tile16", default.node_sound_glass_defaults()) +walls.register("mtg_plus:wall_gravel_cobble", S("Cobbled Gravel Wall"), "mtg_plus_gravel_cobble.png", "mtg_plus:gravel_cobble", default.node_sound_stone_defaults()) + + +do + local longdesc = S("A piece of wall creates simple barriers that connect to neighbor blocks. Walls can be jumped over.") + + local groups = minetest.registered_items["mtg_plus:wall_ice_tile16"].groups + groups.stone = nil + groups.slippery = 1 + minetest.override_item("mtg_plus:wall_ice_tile16", { groups = groups, _doc_items_longdesc = longdesc }) + + groups = minetest.registered_items["mtg_plus:wall_sandstone_cobble"].groups + groups.stone = nil + minetest.override_item("mtg_plus:wall_sandstone_cobble", { groups = groups, _doc_items_longdesc = longdesc }) + + minetest.override_item("mtg_plus:wall_desert_sandstone_cobble", { _doc_items_longdesc = longdesc }) + minetest.override_item("mtg_plus:wall_silver_sandstone_cobble", { _doc_items_longdesc = longdesc }) + minetest.override_item("mtg_plus:wall_jungle_cobble", { _doc_items_longdesc = longdesc }) + minetest.override_item("mtg_plus:wall_gravel_cobble", { _doc_items_longdesc = longdesc }) +end + +-- Fences +default.register_fence("mtg_plus:fence_goldwood", { + description = S("Goldwood Fence"), + _doc_items_longdesc = S("This is a fence made out of precious goldwood. The fence will neatly connect to its neighbors, making it easy to build nice-looking fence structures. The fence can be jumped over."), + texture = "mtg_plus_goldwood.png", + material = "mtg_plus:goldwood", + sounds = minetest.registered_nodes["mtg_plus:goldwood"].sounds, + groups = {choppy=2, }, +}) + +default.register_fence_rail("mtg_plus:fence_rail_goldwood", { + description = S("Goldwood Fence Rail"), + _doc_items_longdesc = S("This is a fence rail made out of precious goldwood. It will neatly connect to its neighbors, but without creating fence posts. It can be jumped over."), + texture = "mtg_plus_fence_rail_goldwood.png", + inventory_image = "default_fence_rail_overlay.png^mtg_plus_goldwood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_rail_overlay.png^mtg_plus_goldwood.png^" .. + "default_fence_rail_overlay.png^[makealpha:255,126,126", + material = "mtg_plus:goldwood", + groups = {choppy = 2, }, + sounds = minetest.registered_nodes["mtg_plus:goldwood"].sounds, +}) diff --git a/mods/minetest_mtg_plus/xpanes.lua b/mods/minetest_mtg_plus/xpanes.lua new file mode 100644 index 00000000..6cd37adc --- /dev/null +++ b/mods/minetest_mtg_plus/xpanes.lua @@ -0,0 +1,144 @@ +local S = minetest.get_translator("mtg_plus") + +-- xpanes +xpanes.register_pane("paper", { + description = S("Paper Barrier"), + inventory_image = "mtg_plus_paperwall.png", + wield_image = "mtg_plus_paperwall.png", + textures = {"mtg_plus_paperwall.png", "mtg_plus_paperwall.png", "mtg_plus_paperwall.png"}, + groups = {snappy=3, flammable=4, pane=1}, + sounds = { + footstep = {name="mtg_plus_paper_step", gain=0.1, max_hear_distance=7}, + place = {name="mtg_plus_paper_step", gain=0.3, max_hear_distance=13}, + dig = {name="mtg_plus_paper_dig", gain=0.1, max_hear_distance=11}, + dug = {name="mtg_plus_paper_dug", gain=0.2, max_hear_distance=13}, + }, + recipe = { + { "default:paper", "default:paper", "default:paper" }, + { "default:paper", "default:paper", "default:paper" }, + } +}) + +local r +if minetest.registered_items["xpanes:paper_flat"] then + r = "xpanes:paper_flat" +else + r = "xpanes:paper" +end +minetest.register_craft({ + type = "fuel", + recipe = r, + burntime = 1, +}) + +xpanes.register_pane("wood", { + description = S("Wooden Bars"), + inventory_image = "mtg_plus_wooden_bar.png", + wield_image = "mtg_plus_wooden_bar.png", + textures = {"mtg_plus_wooden_bar.png", "mtg_plus_wooden_bar_side.png", "mtg_plus_wooden_bar_y.png"}, + groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, pane=1}, + sounds = default.node_sound_wood_defaults(), + recipe = { + { "group:wood", "", "group:wood" }, + { "group:wood", "", "group:wood" }, + { "group:wood", "", "group:wood" }, + } +}) + +if minetest.registered_items["xpanes:wood_flat"] then + r = "xpanes:wood_flat" +else + r = "xpanes:wood" +end +minetest.register_craft({ + type = "fuel", + recipe = r, + burntime = 2, +}) + +xpanes.register_pane("goldglass", { + description = S("Goldglass Pane"), + inventory_image = "mtg_plus_goldglass.png", + wield_image = "mtg_plus_goldglass.png", + textures = {"mtg_plus_goldglass.png","mtg_plus_goldglass_pane_half.png","mtg_plus_goldglass_pane_top.png",}, + groups = {cracky=3,oddly_breakable_by_hand=2,pane=1}, + sounds = default.node_sound_glass_defaults(), + recipe = { + { "mtg_plus:goldglass","mtg_plus:goldglass","mtg_plus:goldglass", }, + { "mtg_plus:goldglass","mtg_plus:goldglass","mtg_plus:goldglass", }, + } +}) + +xpanes.register_pane("goldglass2", { + description = S("Golden Window"), + inventory_image = "mtg_plus_goldglass2.png", + wield_image = "mtg_plus_goldglass2.png", + textures = {"mtg_plus_goldglass2.png","mtg_plus_goldglass_pane_half.png","mtg_plus_goldglass_pane_top.png",}, + groups = {cracky=3,oddly_breakable_by_hand=3,pane=1}, + sounds = default.node_sound_glass_defaults(), + recipe = { + { "default:gold_ingot","default:gold_ingot","default:gold_ingot", }, + { "default:gold_ingot","default:glass","default:gold_ingot", }, + { "default:gold_ingot","default:gold_ingot","default:gold_ingot", }, + } +}) + +xpanes.register_pane("papyrus", { + description = S("Papyrus Lattice"), + inventory_image = "mtg_plus_papyrus_lattice.png", + wield_image = "mtg_plus_papyrus_lattice.png", + textures = {"mtg_plus_papyrus_lattice.png","mtg_plus_papyrus_lattice.png","mtg_plus_papyrus_lattice.png"}, + groups = {snappy=2, choppy=1, flammable=2,pane=1}, + sounds = default.node_sound_leaves_defaults(), + recipe = { + { "default:papyrus", "farming:string", "default:papyrus" }, + { "default:papyrus", "farming:string", "default:papyrus" }, + } +}) + +if minetest.registered_items["xpanes:papyrus_flat"] then + r = "xpanes:papyrus_flat" +else + r = "xpanes:papyrus" +end +minetest.register_craft({ + type = "fuel", + recipe = r, + burntime = 1, +}) + + +xpanes.register_pane("ice", { + description = S("Ice Window Pane"), + inventory_image = "mtg_plus_ice_window.png", + wield_image = "mtg_plus_ice_window.png", + textures = {"mtg_plus_ice_window.png", "mtg_plus_ice_window.png", "mtg_plus_ice_window.png"}, + groups = {cracky=3, slippery = 3, pane=1}, + sounds = default.node_sound_glass_defaults(), + recipe = { + { "mtg_plus:ice_window", "mtg_plus:ice_window", "mtg_plus:ice_window", }, + { "mtg_plus:ice_window", "mtg_plus:ice_window", "mtg_plus:ice_window", } + } +}) + +local panes = { + paper = S("Papier barriers are thin solid layers of paper which neatly connect to their neighbors as you build them. They could be useful to separate rooms."), + wood = S("Wooden bars are barriers which neatly connect to their neighbors as you build them."), + goldglass = S("Goldglass panes are thin layers of goldglass which neatly connect to their neighbors as you build them."), + goldglass2 = S("Golden windows are decorative blocks which can be placed into holes for nice-looking windows. Golden windows automatically connect to their neighbors as you build them."), + papyrus = S("Papyrus lattices are strong barriers which neatly connect to their neighbors as you build them."), + ice = S("Ice window panes are thinner than the full ice windows and neatly connect to each other as you build them"), +} + +for pane, longdesc in pairs(panes) do + minetest.override_item("xpanes:"..pane.."_flat", { + _doc_items_longdesc = longdesc, + }) + minetest.override_item("xpanes:"..pane, { + _doc_items_create_entry = false, + }) + if minetest.get_modpath("doc") then + doc.add_entry_alias("nodes", "xpanes:"..pane.."_flat", "nodes", "xpanes:"..pane) + end +end + diff --git a/mods/minislots/LICENSE b/mods/minislots/LICENSE new file mode 100644 index 00000000..624a8eca --- /dev/null +++ b/mods/minislots/LICENSE @@ -0,0 +1,603 @@ +License for code: LGPL 3.0 +License for media and all other assets: CC-by-SA 4.0 + +These licenses apply to all modules and components in this modpack, +unless otherwise stated. + +############################################################################### + + 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/minislots/README.txt b/mods/minislots/README.txt new file mode 100644 index 00000000..20e5b0ef --- /dev/null +++ b/mods/minislots/README.txt @@ -0,0 +1,310 @@ +Minislots Game Engine +===================== + +Written by Vanessa "VanessaE" Dannenberg + +This package provides a simple "engine" to drive slimmed-down slot machines. +It takes-in money (and pays out, in "currency" mod Minegeld), spins reels, +awards wins, and so forth. + +It features wild cards, variable matching, multiple pay lines, and scatter +wins and bonus rounds. + +Machines are fully themeable, from the biggest parts of the UI graphics to the +smallest details of the labels and numerals. Most of the important UI +elements' sizes and positions can be controlled. + +Two example machines are included (described below). + +Note: As of this writing, the "bonus round" feature is only barely implemented +- it only calls a function provided in the machine's definition. This will be +expanded-on in time. + +Depends: Minetest 0.4.17.1 or 5.0.0-dev, a corresponding minetest_game, and +Dan Duncombe's currency mod (my fork, which has 50 Mg notes, +https://gitlab.com/VanessaE/currency ). + + + +Image Geometry: +=============== + +In Minetest, the size and position of an item in a formspec is designated in +units equal to the spacing between two squares in your inventory. In this +documentation (and elsewhere in this modpack), I use "Inventory Units" or "IU" +as shorthand for that. + +For most things in the Minislots engine, scaling is done such that 64 pixels +in the image fits exactly 1 IU, though 1 IU in the formspec doesn't +necessarily correspond with any specific number of screen pixels, since that +will vary with window and screen size, your Minetest GUI scaling setting, and +other things. That's not important here, though, since everything will still +maintain proper proportions. + +Minetest normally uses exact values for sizes, but due to legacy screwiness in +how formspecs are rendered, positioning is done at a scale of about 1.2422:1 +in the horizontal direction, and 1.1538:1 in the vertical direction, at least +for most stuff, and some stuff isn't exact-size either. + +Furthermore, Minetest doesn't treat the upper-left corner of a formspec as the +(0,0) origin, but rather, somewhat below and to the right of that spot +(officially it's off by (0.5, 0.5) IU, but in reality, the offset is closer to +half of that). + +A 1x1 IU label/graphic that should be displayed at position (2,2) will end up +being 1x1 in size as intended, but positioned at about (2.484,2.308) plus the +origin point. + +The Minislots display engine will position the imagery such that there's a +thin shaded border (the default formspec background) around the slot machine's +graphics, and it will correct for the above-mentioned legacy scaling and +positioning where it can. + +The cash slot can be almost any size/shape and can be placed anywhere, so that +you could, for example, draw it to look like a coin slot, with all the chrome +and corrugated edging and such, and position it at the top of the form, to +mimic turn-of-the-20th-century-styled machines. That said, bear in mind that +when you click on it, you're taken to the "cash intake" screen, where the cash +slot image is also shown, at the same size, and in there, it has to fit in +between the single intake slot and the inventory slots. + +The currency label, if printed, is positioned 25% of a digit's width after the +end of the amount. It is scaled to the 1.333 times a digit's width to keep +it's relative scale correct. It should indicate "Minegeld" in some manner, +usually "Mg", as that's what this engine uses internally (from Dan Duncombe's +"currency" mod). + +The "Win" label, if printed, will appear half a digit glyph's width after the +Bet amount's currency label. + +The "Show Pay Lines" and "Show Pay Table" buttons in the help screen are +256x64 px and are always displayed 2x0.5 IU in size, in the lower right +corner of the form. + +Balance, Bet, Win, Scatter Win, and Bonus Win amounts are printed immediately +next to their labels. Be sure you leave a little space on the right in the +images, as needed. + +The scatter and bonus highlight boxes are displayed at a size relative to the +reel image - 1.3333 times its width, by 0.4444 times its height, and +positioned 0.1667 times the reel width above and left, thus centering it over +the symbol area. This extra space is to allow one to draw a "box" around the +reel symbol, and some kind of "glow" just outside of it, as in the example +machines' images. The nominal size of the images is thus 1.3333 times the +reel image width by 0.4444 times its height, but because Minetest does not +support full image alpha on overlaid images in a formspec (that is, when +placing via "image[" rather than compositing with the "^" texture operator), +you'll have to fake it by dithering between some color and transparency -- if +you need alpha for a glow effect, that is. Draw these images large enough, +and the downscaling will blur the dithering, more or less turning it into +alpha anyway (it's odd that you can exploit this "fake" alpha, but can't use +real alpha). Hence, the images used in these example machines are three times +their nominal size. + +The various labels, parenthesis, and colon in the example machines were drawn +with The GIMP using the "Liberation Sans Narrow Bold Condensed" font, 85 point +height, with the inter-character spacing set as small as the wording would +allow (usually -4.0). Anti-aliasing enabled, "Full" hinting. Text is +positioned two pixels from the left, with the baseline at 60 (so the lower +left corner of the "B" in "Bal:" is at (2,60) according to GIMP). + +The numerals use "Century Schoolbook L Bold" font, same size, settings, etc. +Same vertical positioning, and horizontally-centered. + +Reels always show three symbols' of height, not counting the overlap at the +top and bottom to allow for symbols to be positioned "off-screen". + +The pay table, pay lines, admin, and cashout voucher screens all use the +Liberation Sans font (either condensed, regular, or bold). + + +Geometry for the 3-reel "Golden 7's" machine: +--------------------------------------------- + +The upper overlay, reel underlay, and line win overlays are 832x704 px --> 13 x 11 IU +The lower overlay image is 832x128 px --> 13 x 2 IU +A single reel image is 192x576 px --> 3 x 9 IU +A digit glyph is 48x80 px, or 0.75 IU, but is displayed at 75%, 45% or +40 %% of that size, depending on line height (to fit in large values) --> 0.563, 0.338, or 0.30 IU +The currency label is 96x80 px --> 0.4 x screen_line_height_3 IU +The "Bal", "Bet" and "Win" labels are 128x80 px, but should be narrower --> 1.125 x line_height IU +The "Line Win" label is 256x80 px, should be displayed at 50% width --> 3.0 x screen_line_height_3 IU +A colon or parenthesis is 24x80 pixels, displayed at 50% digit width --> 0.188 x screen_line_height_3 IU +The "Scatter Win" is 384x80 px, should be displayed at 50% width --> 3.0 x screen_line_height_3 IU +The "Bonus Win" label is 352x80 px, should be displayed at 50% width --> 2.75 x screen_line_height 3 IU +The cash slot is 320x128 px and is normally shown at full-size --> 5.0 x 2.0 IU +The "screen" in the lower overlay is 384x112 px --> 6.0 x 0.875 IU. +The Scatter and Bonus highlight boxes are 768x768px --> 4.0 x 4.0 IU + + +Geometry for the 5-reel "Golden 7's Deluxe" machine: +---------------------------------------------------- + +The upper overlay, reel underlay, and line win overlays are 939x704 px --> 14.667 x 11 IU +The lower overlay image is 939x128 px --> 14.667 x 2 IU +A single reel image is 128x576 px --> 2 x 9 IU +A digit glyph is 48x80 px --> 0.563, 0.338, or 0.30 IU +The currency label is 96x80 px --> 0.4 x screen_line_height_3 IU +The "Bal", "Bet" and "Win" labels are 128x80 px --> 1.125 x line_height IU +The "Line Win" label is 256x80 px --> 3.0 x screen_line_height_3 IU +A colon or parenthesis is 24x80 pixels --> 0.188 x screen_line_height_3 IU +The "Scatter Win" label is 384x80 px --> 3.0 x screen_line_height_3 IU +The "Bonus Win" label is 352x80 px --> 2.75 x screen_line_height 3 IU +The cash slot is 320x128 px --> 5.0 x 2.0 IU +The "screen" in the lower overlay is 426x112 px --> 6.656 x 0.875 IU. +The Scatter and Bonus highlight boxes are 512x768 px --> 2.667 x 4.0 IU + + +Matching: +========= + +In most cases, line matches are pretty straightforward. If you specify a +line in your match table reading: + +{123, "cherry", "lemon", "melon", "bell", "bar"} + +...then any pay line with those five symbols in exactly that order will be +considered a win, and the player will be awarded 123 times their line bet. + +If an entry in the list is nil, for example: + +{ 99, "cherry", "lemon", "melon", "bell", nil} + +...then the corresponding reel will be ignored when checking if that entry is +a match (reel 5 in this case). This can be used for various effects, but +mainly, it's intended to let you specify a match that only needs a few +matching symbols on the first few reels, rather than requiring all five (or +whatever) reels to match on a pay line, such as a match of three of some +symbol on a five reel machine (one assumes that such a machine would have +matches programmed for four or five of that symbol as well, at progressively +higher values). + +If an entry in the list is itself a list, then the the items in that sub-list +mean "any of these can match". So if you have a match entry like: + +{100, "777", "777", "777", "777", {"7", "77", "777"} } + +...then reels 1, 2, 3, and 4 would need to show a [777] symbol, and reel 5 +would need to have one of [7], [77], or [777] also to complete the match +(which would pay 100 times the line bet). + +You can do this for any reels you want, with as many entries in each sub-list +as you want (well, up to however many the machine has, of course). For +example, the Golden 7's Deluxe machine has an entry in its pay table that pays +out on a line win consisting of five assorted [7], [77], and/or [777] symbols +(it also has one for assorted [bar], [2bar], and/or [3bar] symbols). + + +The human-readable pay table and pay lines screen: +================================================== + +The format of the paytable_desc is pretty simple - it's a table of tables. :-) + +Each line in the table represents one line in the pay table screen. Each item +in the line is either a chunk of text or a symbol prefixed with an "@". In +order to allow mixing symbols among text, it is necessary to break the line +up, because the parser can't decode flat, mixed lines. So if you have a line +reading: + +{ "Any three mixed ", "@bar", "/", "@2bar", "/", "@3bar", " pays 10" }, + +This will tell the parser-renderer to place the phrase "Any three mixed ", +then right next to it the "bar" symbol. A slash next to that, then a 2-bar, +another slash, a 3-bar, then the phrase "pays 10". All of that placed on one +line. + +You can have as many lines as your layout and text size permit, and you may +mix-and-match symbol and text items freely. + +The special symbol "@X" tells the parser to insert a blank space equal to the +size of a symbol - this is useful for making grids of symbols with some spaces +left empty (as in a 3-out-of-5 reel match). + +The parser doesn't have any text positioning commands yet, other than "@wrap" +(below), but some rudimentary layout formatting can be accomplished by +inserting blank lines or chunks of whitespace between items. + +For a layout with fairly large text/symbols as in the 3-reel demo machine, +there's room for up to 19 lines, as long as the top line is not so long that +it overlaps the [X] button. For a layout like the 5-reel machine, with its +smaller text, You can fit up to about 25 lines. Of course, you can just set +your line height to fit more text. + +The symbols are of course picked from the "stopped" reel strip image, and they +are always cropped square, so on a machine like the 5-reel demo, only the +middle 128x128 pixel section of each 128x192 pixel symbol would be shown. + +For the pay lines screen, the item format is simplified. One table item per +screen line, which can be either a line of text, or a key indicating that one +or more pay line images should overlaid onto their background image and placed +on the line. The key for those is "@" followed by a number, a space, and +another number (e.g. "@1 5"). These numbers indicate the first and last pay +line images to display. + +On both screens, lines are "printed" from top to bottom in a column toward the +left side of the form background, overflowing into a second column if +necessary. You can force an overflow into column 2 by inserting a table entry +consisting of the string "@wrap" (in the case of the pay table, it must be on +a line by itself, and not inside an inner table the way the other items are). + +If paytable_desc or paylines_desc is not specified, then only the background, +[X] button, and "Show Pay Lines" or "Show Pay Table" button will be displayed +on their respective screens. This allows you to use the background image +itself as the pay table/lines description, in the event that you want to skip +the text/image printing routines and just roll your own. + + +How wild cards work: +==================== + +[WILD!] is basically "don't care", as far as the engine's concerned, and will +match the highest entry in the table that can theoretically form a match, +regardless of how many symbols actually match, except if a wild_doesnt_match +table is also specified in the machine definition. This table should be +self-explanatory -- whatever symbols are listed there, a [WILD!] symbol will +not match, regardless of its position in the payline or the value of a given +match line. + +For example, suppose you get a normal-looking spin showing +[WILD!][77][77][lemon][cherry] on a line on the 5-reel demo machine. That +won't match anything, because there's no match line that allows for a match +consisting of only three "7" symbols of any kind. + +On the other hand, suppose you get [WILD!][WILD!][WILD!][2bar][cherry]. +Sounds like it should match the {"2bar", "2bar", "2bar", "2bar", nil} entry, +but it'll pick the {"3bar", "3bar", "3bar", nil, nil} entry, because that one +also matches, but it's worth more. + +This extends to as many reels as the machine has, and as many [WILD!]'s as +there are in a pay line, regardless of where in the line they appear (so long +as the symbols that precede and follow the [WILD!]'s can form valid matches, +of course). + +A pay line consisting of all [WILD!]'s is equivalent to whatever the highest +winning combination is in your machine, that doesn't also contain any symbols +in the wild_doesnt_match table (three or five [777]'s in the Golden 7's +example machines, because they're both set to not match against [JACKPOT!]). + +If a wild multiplier is in effect, it'll be applied to the final value for a +given match. Each wild card multiplies the win by the configured amount, but +only for wild cards that actually helped create a win. Thus, the final win +amount will be line_win * ( wild_multiplier ^ number_of_wilds ). + + +DISCLAIMER: +=========== + +THIS IS A SLOT MACHINE "MINI GAME" PROJECT FOR THE MINETEST OPEN SOURCE GAME +ENGINE/PLATFORM. IT IS NOT IN ANY WAY, SHAPE, OR FORM ASSOCIATED WITH, +REGULATED BY, OR OTHERWISE UNDER THE CONTROL OR INFLUENCE OF ANY LOCAL, +COUNTY, STATE, OR FEDERAL GAMING AGENCY, COMMISSION, OR OFFICE. + +THE "CURRENCY" USED BY THIS PROJECT IS ENTIRELY FICTIONAL, EXISTING ONLY +WITHIN THE ONLINE WORLD FOR WHICH IT WAS CREATED, AND NO PART OF THIS PROJECT +SEEKS TO MAKE IT CONVERTIBLE, EXCHANGEABLE, OR OTHERWISE NEGOTIABLE FROM OR +INTO ANY LEGAL TENDER CURRENCY OR OTHER VALUABLE ASSETS OF ANY KIND OR ORIGIN, +WHETHER TANGIBLE OR INTANGIBLE, PHYSICAL OR ELECTRONIC. + +NO CLAIMS REGARDING THE FITNESS OF THIS PROJECT FOR ANY PURPOSE ARE HEREIN +MADE, AND NO WARRANTY OR GUARANTEE OF ANY KIND IS OFFERED BY ANY PARTY. SEE +ALSO, "LICENSE" IN THE MAIN PROJECT DIRECTORY. diff --git a/mods/minislots/minislots_engine/depends.txt b/mods/minislots/minislots_engine/depends.txt new file mode 100644 index 00000000..739f218d --- /dev/null +++ b/mods/minislots/minislots_engine/depends.txt @@ -0,0 +1,2 @@ +default +currency diff --git a/mods/minislots/minislots_engine/engine.lua b/mods/minislots/minislots_engine/engine.lua new file mode 100644 index 00000000..2dc551f6 --- /dev/null +++ b/mods/minislots/minislots_engine/engine.lua @@ -0,0 +1,1897 @@ +-- Minislots game engine +-- by Vanessa "VanessaE" Dannenberg + +local mtver = minetest.get_version() + +math.randomseed(os.time()) + +local char_widths = { + [32] = { regular = 16, condensed = 12, bold = 24 }, + [33] = { regular = 22, condensed = 18, bold = 28 }, + [34] = { regular = 29, condensed = 23, bold = 40 }, + [35] = { regular = 48, condensed = 39, bold = 47 }, + [36] = { regular = 47, condensed = 39, bold = 47 }, + [37] = { regular = 74, condensed = 60, bold = 75 }, + [38] = { regular = 56, condensed = 46, bold = 61 }, + [39] = { regular = 15, condensed = 12, bold = 20 }, + [40] = { regular = 29, condensed = 24, bold = 29 }, + [41] = { regular = 27, condensed = 22, bold = 28 }, + [42] = { regular = 33, condensed = 27, bold = 34 }, + [43] = { regular = 48, condensed = 39, bold = 49 }, + [44] = { regular = 22, condensed = 18, bold = 23 }, + [45] = { regular = 27, condensed = 22, bold = 28 }, + [46] = { regular = 22, condensed = 18, bold = 23 }, + [47] = { regular = 25, condensed = 21, bold = 24 }, + [48] = { regular = 46, condensed = 37, bold = 47 }, + [49] = { regular = 46, condensed = 37, bold = 47 }, + [50] = { regular = 46, condensed = 37, bold = 47 }, + [51] = { regular = 46, condensed = 37, bold = 47 }, + [52] = { regular = 46, condensed = 38, bold = 48 }, + [53] = { regular = 46, condensed = 37, bold = 47 }, + [54] = { regular = 46, condensed = 37, bold = 47 }, + [55] = { regular = 46, condensed = 37, bold = 47 }, + [56] = { regular = 46, condensed = 37, bold = 47 }, + [57] = { regular = 46, condensed = 37, bold = 47 }, + [58] = { regular = 22, condensed = 18, bold = 28 }, + [59] = { regular = 22, condensed = 18, bold = 28 }, + [60] = { regular = 48, condensed = 39, bold = 49 }, + [61] = { regular = 48, condensed = 39, bold = 49 }, + [62] = { regular = 48, condensed = 39, bold = 49 }, + [63] = { regular = 46, condensed = 37, bold = 51 }, + [64] = { regular = 84, condensed = 69, bold = 82 }, + [65] = { regular = 57, condensed = 47, bold = 61 }, + [66] = { regular = 55, condensed = 45, bold = 61 }, + [67] = { regular = 60, condensed = 49, bold = 61 }, + [68] = { regular = 60, condensed = 49, bold = 61 }, + [69] = { regular = 55, condensed = 45, bold = 56 }, + [70] = { regular = 50, condensed = 41, bold = 51 }, + [71] = { regular = 64, condensed = 53, bold = 65 }, + [72] = { regular = 60, condensed = 49, bold = 61 }, + [73] = { regular = 22, condensed = 18, bold = 23 }, + [74] = { regular = 41, condensed = 33, bold = 47 }, + [75] = { regular = 57, condensed = 47, bold = 61 }, + [76] = { regular = 46, condensed = 38, bold = 51 }, + [77] = { regular = 69, condensed = 56, bold = 70 }, + [78] = { regular = 60, condensed = 49, bold = 61 }, + [79] = { regular = 64, condensed = 53, bold = 65 }, + [80] = { regular = 55, condensed = 45, bold = 56 }, + [81] = { regular = 64, condensed = 53, bold = 65 }, + [82] = { regular = 60, condensed = 49, bold = 61 }, + [83] = { regular = 55, condensed = 45, bold = 56 }, + [84] = { regular = 51, condensed = 42, bold = 52 }, + [85] = { regular = 60, condensed = 49, bold = 61 }, + [86] = { regular = 57, condensed = 47, bold = 57 }, + [87] = { regular = 80, condensed = 66, bold = 81 }, + [88] = { regular = 56, condensed = 46, bold = 57 }, + [89] = { regular = 56, condensed = 46, bold = 56 }, + [90] = { regular = 50, condensed = 41, bold = 51 }, + [91] = { regular = 24, condensed = 20, bold = 28 }, + [92] = { regular = 25, condensed = 21, bold = 24 }, + [93] = { regular = 22, condensed = 18, bold = 28 }, + [94] = { regular = 40, condensed = 33, bold = 49 }, + [95] = { regular = 49, condensed = 41, bold = 49 }, + [96] = { regular = 27, condensed = 22, bold = 28 }, + [97] = { regular = 48, condensed = 40, bold = 49 }, + [98] = { regular = 46, condensed = 37, bold = 51 }, + [99] = { regular = 41, condensed = 34, bold = 47 }, + [100] = { regular = 46, condensed = 37, bold = 51 }, + [101] = { regular = 46, condensed = 37, bold = 47 }, + [102] = { regular = 25, condensed = 21, bold = 30 }, + [103] = { regular = 46, condensed = 37, bold = 51 }, + [104] = { regular = 46, condensed = 37, bold = 51 }, + [105] = { regular = 18, condensed = 14, bold = 23 }, + [106] = { regular = 18, condensed = 14, bold = 23 }, + [107] = { regular = 44, condensed = 36, bold = 48 }, + [108] = { regular = 18, condensed = 14, bold = 23 }, + [109] = { regular = 69, condensed = 56, bold = 75 }, + [110] = { regular = 46, condensed = 37, bold = 51 }, + [111] = { regular = 46, condensed = 37, bold = 51 }, + [112] = { regular = 46, condensed = 37, bold = 51 }, + [113] = { regular = 46, condensed = 37, bold = 51 }, + [114] = { regular = 28, condensed = 23, bold = 33 }, + [115] = { regular = 41, condensed = 33, bold = 47 }, + [116] = { regular = 24, condensed = 20, bold = 28 }, + [117] = { regular = 46, condensed = 37, bold = 51 }, + [118] = { regular = 43, condensed = 36, bold = 48 }, + [119] = { regular = 62, condensed = 51, bold = 67 }, + [120] = { regular = 43, condensed = 35, bold = 48 }, + [121] = { regular = 43, condensed = 36, bold = 48 }, + [122] = { regular = 41, condensed = 33, bold = 42 }, + [123] = { regular = 28, condensed = 23, bold = 33 }, + [124] = { regular = 21, condensed = 17, bold = 24 }, + [125] = { regular = 28, condensed = 23, bold = 33 }, + [126] = { regular = 48, condensed = 39, bold = 49 }, + [127] = { regular = 45, condensed = 37, bold = 48 }, +} + +local words_numbers = { -- image widths, in pixels + [0] = "ZERO", + "ONE", + "TWO", + "THREE", + "FOUR", + "FIVE", + "SIX", + "SEVEN", + "EIGHT", + "NINE", + "TEN", + "ELEVEN", + "TWELVE", + "THIRTEEN", + "FOURTEEN", + "FIFTEEN", + "SIXTEEN", + "SEVENTEEN", + "EIGHTEEN", + "NINETEEN", +} + +local words_tens = { + "", + "TWENTY", + "THIRTY", + "FORTY", + "FIFTY", + "SIXTY", + "SEVENTY", + "EIGHTY", + "NINETY", +} + +local words_magnitudes = { + "HUNDRED", + "THOUSAND", + "MILLION", +} + +minislots.player_last_machine_def = {} +minislots.player_last_machine_pos = {} + +function minislots.spin_reels(def) + local spin = { [1] = {}, [2] = {}, [3] = {} } + for reel = 1, def.constants.numreels do + local n = math.random(2, def.constants.numsymbols*2+1)/2 + if math.random(1, 100) >= def.half_stops_weight then n = math.floor(n) end + +-- force a mixed-7's win, 3-reel +-- local n = 3 +-- if reel == 2 then n = 10 end +-- if reel == 3 then n = 14 end + +-- force a mixed-7's win, 5-reel +-- local n = 3 +-- if reel == 2 then n = 10 end +-- if reel == 3 then n = 3 end +-- if reel == 4 then n = 10 end +-- if reel == 5 then n = 14 end + +-- force a mixed-7's win, 5-reel, but with one wild card on the mixed-7's payline +-- local n = 3 +-- if reel == 2 then n = 10 end +-- if reel == 3 then n = 9 end +-- if reel == 4 then n = 10 end +-- if reel == 5 then n = 14 end + +-- force the all-wilds win shown in the cabinet graphics, 3-reel +-- local n = 10 +-- if reel == 2 then n = 9 end +-- if reel == 3 then n = 8 end + +-- force the all-wilds win shown in the cabinet graphics, 5-reel +-- local n = 10 +-- if reel == 3 then n = 9 end +-- if reel > 3 then n = 8 end + +-- force a no-win spin +-- local n = 1 +-- if reel == 2 then n = 4 end +-- if reel == 3 then n = 10 end + +-- local n = 12 -- force a scatter win + +-- local n = 16 -- force a bonus win + 3 line wins + + spin[1][reel] = { n-1, def.symbols[n-1] } + spin[2][reel] = { n, def.symbols[n] } + spin[3][reel] = { n+1, def.symbols[n+1] } + end + return spin +end + +function minislots.reset_reels(def) + local resetspin = { [1] = {}, [2] = {}, [3] = {} } + for reel = 1, def.constants.numreels do + resetspin[1][reel] = { 0, def.symbols[0] } + resetspin[2][reel] = { 1, def.symbols[1] } + resetspin[3][reel] = { 2, def.symbols[2] } + end + return resetspin +end + +function minislots.check_win(spin, def, maxlines) + local allwins = { total = 0, line_wins_total = 0 } + local paylinecontent = {} + allwins.scatter = { count = 0, pos = {} } + allwins.bonus = { value = -1, count = 0, pos = {} } + + for payline,paylineoffsets in ipairs(def.lines) do + local highestwin = nil + local wildcount = 0 + if payline > maxlines then break end + paylinecontent[payline] = {} + for _,m in ipairs(def.matches) do + + local matchwin = true + local wc = 0 + for reel = 1, def.constants.numreels do + local row = paylineoffsets[reel]+2 + if not m[reel+1] or type(m[reel+1]) == "string" then + paylinecontent[payline][reel] = spin[row][reel][2] + if m[reel+1] + and spin[row][reel][2] ~= m[reel+1] + and (spin[row][reel][2] ~= "wild" + or (spin[row][reel][2] == "wild" + and def.wild_doesnt_match + and def.wild_doesnt_match[m[reel+1]])) then + matchwin = false + break + end + if spin[row][reel][2] == "wild" then wc = wc + 1 end + else + local sublistmatch = false + for e in ipairs(m[reel+1]) do + paylinecontent[payline][reel] = spin[row][reel][2] + if spin[row][reel][2] == m[reel+1][e] + or (spin[row][reel][2] == "wild" + and not (def.wild_doesnt_match + and def.wild_doesnt_match[m[reel+1][e]])) then + sublistmatch = true + end + end + if not sublistmatch then + matchwin = false + break + end + if spin[row][reel][2] == "wild" then wc = wc + 1 end + end + end + + if matchwin then + wildcount = wc + highestwin = m[1] + end + end + if highestwin then + if wildcount > 0 then highestwin = highestwin * wildcount * def.wild_multiplier end + table.insert(allwins, { payline = payline, value = highestwin, symbols = paylinecontent[payline]}) + end + end + + for row = 1, 3 do + for reel = 1, def.constants.numreels do + if spin[row][reel][2] == "scatter" then + allwins.scatter.count = allwins.scatter.count + 1 + table.insert(allwins.scatter.pos, { reel, row } ) + elseif spin[row][reel][2] == "bonus" then + allwins.bonus.count = allwins.bonus.count + 1 + table.insert(allwins.bonus.pos, { reel, row } ) + end + end + end + + if #allwins > 0 then + for _, win in ipairs(allwins) do + allwins.line_wins_total = allwins.line_wins_total + win.value + end + end + + return allwins +end + +local horizscale = 0.805 -- scaling to apply to any position values that need it (will be most) +local vertscale = 0.867 +local hanchor = 0.23 -- the position of (0,0) relative to the upper-left formspec corner +local vanchor = 0.24 +local pix2iu = 0.0175 +local spincouthelp_scalex = 0.8455 +local spincouthelp_scaley = 1.0241 + +function minislots.register_machine(mdef) + local mdef_copy = table.copy(mdef) + mdef_copy.constants = {} + + if string.sub(mtver.string, 1, 4) == "5.0." then + print("[Minislots] 5.0.x engine detected, Adjusting display to compensate.") + horizscale = 0.800 + end + + mdef_copy.constants.cashout_screen_ctrx = (mdef_copy.geometry.base_user_interface_width/2)*horizscale - hanchor + mdef_copy.constants.cashoutticketimg_posx = (mdef_copy.geometry.base_user_interface_width/2 - 4)*horizscale - hanchor + + mdef_copy.constants.form_header = "size["..(mdef_copy.geometry.base_user_interface_width*0.785)..",".. + ((mdef_copy.geometry.upper_section_height+mdef_copy.geometry.lower_section_height)*0.823).."]" + mdef_copy.constants.mainpref = "image[-"..hanchor..",-"..vanchor..";".. + mdef_copy.geometry.base_user_interface_width..","..mdef_copy.geometry.upper_section_height..";" + mdef_copy.constants.screenposx = mdef_copy.geometry.screen_posx * horizscale - hanchor + mdef_copy.constants.screenposy = mdef_copy.geometry.screen_posy * vertscale - vanchor + mdef_copy.constants.lscrnpref = "image["..mdef_copy.constants.screenposx + + mdef_copy.constants.lscrnypos1 = ","..(mdef_copy.constants.screenposy)..";" + mdef_copy.constants.lscrnypos2 = ","..(mdef_copy.constants.screenposy + mdef_copy.geometry.screen_line_height * vertscale)..";" + + mdef_copy.constants.cslotposx = mdef_copy.geometry.cash_slot_posx * horizscale - hanchor + mdef_copy.constants.cslotposy = mdef_copy.geometry.cash_slot_posy * vertscale - vanchor + mdef_copy.constants.cslotbtnszx = mdef_copy.geometry.cash_slot_sizex * spincouthelp_scalex + mdef_copy.constants.cslotbtnszy = mdef_copy.geometry.cash_slot_sizey * spincouthelp_scaley + + mdef_copy.constants.spincoutposx = mdef_copy.geometry.spin_cashout_posx * horizscale - hanchor + mdef_copy.constants.spinposy = mdef_copy.geometry.button_rows_posy * vertscale - vanchor + mdef_copy.constants.coutposy = (mdef_copy.geometry.button_rows_posy + + mdef_copy.geometry.main_button_spacing) * vertscale - vanchor + mdef_copy.constants.spincoutsizex = mdef_copy.geometry.main_button_size*2 + mdef_copy.constants.spincoutsizey = mdef_copy.geometry.main_button_size + mdef_copy.constants.spincoutbtnszx = mdef_copy.constants.spincoutsizex * 0.91 + mdef_copy.constants.spincoutbtnszy = mdef_copy.constants.spincoutsizey * 1.05 + + mdef_copy.constants.helpposx = mdef_copy.geometry.button_help_posx * horizscale - hanchor + mdef_copy.constants.helpposy = mdef_copy.geometry.button_help_posy * vertscale - vanchor + mdef_copy.constants.helpbtnsizex = mdef_copy.geometry.button_help_sizex * spincouthelp_scalex + mdef_copy.constants.helpbtnposy = mdef_copy.geometry.button_help_sizey * spincouthelp_scaley + + mdef_copy.constants.reelspc = mdef_copy.geometry.reel_sizex*1.3333 + mdef_copy.constants.highlightboxszx = mdef_copy.geometry.reel_sizex*1.3333 + mdef_copy.constants.highlightboxszy = mdef_copy.geometry.reel_sizey/3*1.3333 + mdef_copy.constants.highlightboxoffsx = 1-(mdef_copy.geometry.reel_sizex/6) + mdef_copy.constants.highlightboxoffsy = 1-(mdef_copy.geometry.reel_sizey/18) + + mdef_copy.constants.screenlnht2 = mdef_copy.geometry.screen_line_height * 0.6667 + mdef_copy.constants.screenlnht3 = mdef_copy.geometry.screen_line_height * 0.3333 + mdef_copy.constants.digitmed = mdef_copy.geometry.digit_glyph_sizex * 0.45 + mdef_copy.constants.digitsm = mdef_copy.geometry.digit_glyph_sizex * 0.4 + mdef_copy.constants.lscrnypos3 = ","..(mdef_copy.constants.screenposy + (mdef_copy.geometry.screen_line_height + mdef_copy.constants.screenlnht2) * vertscale)..";" + mdef_copy.constants.medlblsz1 = mdef_copy.geometry.label_medium_sizex..","..mdef_copy.geometry.screen_line_height..";" + mdef_copy.constants.medlblsz2 = mdef_copy.geometry.label_medium_sizex..","..mdef_copy.constants.screenlnht2..";" + mdef_copy.constants.posy3 = mdef_copy.constants.screenposy + (mdef_copy.geometry.screen_line_height + mdef_copy.constants.screenlnht2) * vertscale + mdef_copy.constants.lnwinlblsz = mdef_copy.geometry.line_win_label_sizex..","..mdef_copy.constants.screenlnht3..";" + mdef_copy.constants.parensize = mdef_copy.geometry.digit_glyph_sizex/4 + mdef_copy.constants.parenlblsz = mdef_copy.constants.parensize..","..mdef_copy.constants.screenlnht3..";" + mdef_copy.constants.ln3dig = mdef_copy.geometry.digit_glyph_sizex/4 + + mdef_copy.constants.numreels = #mdef_copy.lines[1] + mdef_copy.constants.numsymbols = #mdef_copy.symbols + mdef_copy.symbols[#mdef_copy.symbols+1] = mdef_copy.symbols[1] + mdef_copy.symbols[0] = mdef_copy.symbols[mdef_copy.constants.numsymbols] + + mdef_copy.constants.fast_med_cutover = mdef_copy.cutover_frames*2 + mdef_copy.constants.med_slow_cutover = mdef_copy.constants.fast_med_cutover + mdef_copy.cutover_frames*2 + mdef_copy.constants.slow_stop_cutover = mdef_copy.constants.med_slow_cutover + mdef_copy.cutover_frames*2 + mdef_copy.constants.last_step = mdef_copy.inter_reel_steps * (mdef_copy.constants.numreels-1) + mdef_copy.constants.slow_stop_cutover + mdef_copy.constants.reel_wraparound_buf = mdef_copy.constants.numsymbols*10 + + mdef_copy.constants.basename = "minislots_"..mdef_copy.name.."_" + + mdef_copy.constants.emptyimg = "minislots_empty_img.png" + + mdef_copy.constants.reelimg = mdef_copy.constants.basename.."reel_background.png" + mdef_copy.constants.reelshadowimg = ":0,0="..mdef_copy.constants.basename.."reel_shadow.png]" + mdef_copy.constants.scatterhlimg = mdef_copy.constants.highlightboxszx..","..mdef_copy.constants.highlightboxszy..";".. + mdef_copy.constants.basename.."highlight_scatter.png]" + mdef_copy.constants.bonushlimg = mdef_copy.constants.highlightboxszx..","..mdef_copy.constants.highlightboxszy..";".. + mdef_copy.constants.basename.."highlight_bonus.png]" + mdef_copy.constants.cashslotscrnbg = mdef_copy.constants.basename.."cash_slot_screen_background.png" + mdef_copy.constants.paytablescrnbg = mdef_copy.constants.basename.."paytable_bg.png" + mdef_copy.constants.paylinescrnbg = mdef_copy.constants.basename.."payline_bg.png" + mdef_copy.constants.lines_bg = mdef_copy.constants.basename.."paytable_lines_bg.png" + + mdef_copy.constants.symbolsfast = mdef_copy.constants.basename.."reel_symbols_fast.png" + mdef_copy.constants.symbolsmedium = mdef_copy.constants.basename.."reel_symbols_medium.png" + mdef_copy.constants.symbolsslow = mdef_copy.constants.basename.."reel_symbols_slow.png" + mdef_copy.constants.symbolsstopped = mdef_copy.constants.basename.."reel_symbols_stopped.png" + + mdef_copy.constants.ballabelimg = mdef_copy.constants.basename.."label_balance.png]" + mdef_copy.constants.betlabelimg = mdef_copy.constants.basename.."label_bet.png]" + mdef_copy.constants.winlabelimg = mdef_copy.constants.basename.."label_win.png]" + mdef_copy.constants.linewinlabelimg = mdef_copy.constants.basename.."label_linewin.png]" + mdef_copy.constants.scatterwinlabelimg = mdef_copy.geometry.scatter_win_label_sizex..","..mdef_copy.constants.screenlnht3..";"..mdef_copy.constants.basename.."label_scatterwin.png]" + mdef_copy.constants.bonuswinlabelimg = mdef_copy.geometry.bonus_win_label_sizex..","..mdef_copy.constants.screenlnht3..";"..mdef_copy.constants.basename.."label_bonuswin.png]" + mdef_copy.constants.curlabelimg = ";"..mdef_copy.constants.basename.."label_currency.png" + + mdef_copy.constants.lparenimg = mdef_copy.constants.basename.."glyph_lparen.png]" + mdef_copy.constants.rparenimg = mdef_copy.constants.basename.."glyph_rparen.png]" + mdef_copy.constants.colonimg = mdef_copy.constants.basename.."glyph_colon.png]" + + mdef_copy.constants.lnbetpref = mdef_copy.geometry.main_button_size..","..mdef_copy.geometry.main_button_size..";" + + mdef_copy.constants.behindreels = mdef_copy.constants.mainpref..mdef_copy.constants.basename.."behind_reels.png]" + mdef_copy.constants.overlay_upper = mdef_copy.constants.mainpref..mdef_copy.constants.basename.."overlay_upper.png]" + + mdef_copy.constants.buttonspin = "image["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.spinposy..";".. + mdef_copy.constants.spincoutsizex..","..mdef_copy.constants.spincoutsizey..";".. + mdef_copy.constants.basename.."button_spin.png]".. + "image_button["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.spinposy.. + ";"..mdef_copy.constants.spincoutbtnszx..","..mdef_copy.constants.spincoutbtnszy..";".. + mdef_copy.constants.emptyimg..";spin;]" + mdef_copy.constants.buttonspin_dis = "image["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.spinposy..";".. + mdef_copy.constants.spincoutsizex..","..mdef_copy.constants.spincoutsizey..";".. + mdef_copy.constants.basename.."button_spin_dis.png]" + + mdef_copy.constants.buttoncashout = "image["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.coutposy..";".. + mdef_copy.constants.spincoutsizex..","..mdef_copy.constants.spincoutsizey..";".. + mdef_copy.constants.basename.."button_cash_out.png]".. + "image_button["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.coutposy..";".. + mdef_copy.constants.spincoutbtnszx..","..mdef_copy.constants.spincoutbtnszy..";".. + mdef_copy.constants.emptyimg..";cout;]" + mdef_copy.constants.buttoncashout_dis = "image["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.coutposy..";".. + mdef_copy.constants.spincoutsizex..","..mdef_copy.constants.spincoutsizey..";".. + mdef_copy.constants.basename.."button_cash_out_dis.png]" + + mdef_copy.constants.buttonquit = "image["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.coutposy..";".. + mdef_copy.constants.spincoutsizex..","..mdef_copy.constants.spincoutsizey..";".. + mdef_copy.constants.basename.."button_quit.png]".. + "image_button_exit["..mdef_copy.constants.spincoutposx..","..mdef_copy.constants.coutposy..";".. + mdef_copy.constants.spincoutbtnszx..","..mdef_copy.constants.spincoutbtnszy..";".. + mdef_copy.constants.emptyimg..";quit;]" + + mdef_copy.constants.buttoncashslot = "image["..mdef_copy.constants.cslotposx..","..mdef_copy.constants.cslotposy..";".. + mdef_copy.geometry.cash_slot_sizex..","..mdef_copy.geometry.cash_slot_sizey..";".. + mdef_copy.constants.basename.."cash_slot.png]".. + "image_button["..mdef_copy.constants.cslotposx..","..mdef_copy.constants.cslotposy..";".. + mdef_copy.constants.cslotbtnszx..","..mdef_copy.constants.cslotbtnszy..";".. + mdef_copy.constants.emptyimg..";cslot;]" + + mdef_copy.constants.buttoncashslot_dis = "image["..mdef_copy.constants.cslotposx..","..mdef_copy.constants.cslotposy..";".. + mdef_copy.geometry.cash_slot_sizex..","..mdef_copy.geometry.cash_slot_sizey..";".. + mdef_copy.constants.basename.."cash_slot.png]" + + mdef_copy.constants.button_close = "minislots_close_button.png" + + mdef_copy.constants.buttonhelp = "image["..mdef_copy.constants.helpposx..","..mdef_copy.constants.helpposy..";".. + mdef_copy.geometry.button_help_sizex..","..mdef_copy.geometry.button_help_sizey..";".. + mdef_copy.constants.basename.."button_help.png]".. + "image_button["..mdef_copy.constants.helpposx..","..mdef_copy.constants.helpposy..";".. + mdef_copy.constants.helpbtnsizex..","..mdef_copy.constants.helpbtnposy..";".. + mdef_copy.constants.emptyimg..";help;]" + + mdef_copy.constants.buttonhelp_dis = "image["..mdef_copy.constants.helpposx..","..mdef_copy.constants.helpposy..";".. + mdef_copy.geometry.button_help_sizex..","..mdef_copy.geometry.button_help_sizey..";".. + mdef_copy.constants.basename.."button_help.png]" + + mdef_copy.constants.reelsymsizex = mdef_copy.geometry.reel_sizex*64 + mdef_copy.constants.reelsymsizey = mdef_copy.geometry.reel_sizey/3*64 + + mdef_copy.constants.reelcombinepref = ","..(mdef_copy.geometry.reel_posy*vertscale-vanchor)..";".. + (mdef_copy.geometry.reel_sizex)..","..(mdef_copy.geometry.reel_sizey)..";".. + mdef_copy.constants.reelimg.. + "^[combine:"..mdef_copy.constants.reelsymsizex.."x".. + mdef_copy.constants.reelsymsizey + + mdef_copy.constants.reelunderlightpref = mdef_copy.constants.basename.."reel_underlight_" + mdef_copy.constants.overlaylinepref = mdef_copy.constants.basename.."overlay_line_" + mdef_copy.constants.overlay_lower = "image[-"..hanchor..","..(11*vertscale-vanchor)..";".. + mdef_copy.geometry.base_user_interface_width..","..mdef_copy.geometry.lower_section_height..";".. + mdef_copy.constants.basename.."overlay_lower.png]" + + mdef_copy.constants.upperbezel = mdef_copy.constants.mainpref.."minislots_golden7s_overlay_upper_bezel.png]" + mdef_copy.constants.cashoutbackground = mdef_copy.constants.mainpref.."minislots_blue_img.png]" + mdef_copy.constants.cashoutticketimg = "image["..mdef_copy.constants.cashoutticketimg_posx..","..(3.5-vanchor).. + ";8,3;minislots_cashout_ticket.png]" + + mdef_copy.constants.paylinestable_pref = "image_button[8.85,10.28;2,0.5;" + mdef_copy.constants.button_showpaytable = mdef_copy.constants.paylinestable_pref..mdef_copy.constants.basename.. + "button_show_paytable.png;showpaytable;]" + mdef_copy.constants.button_showpaylines = mdef_copy.constants.paylinestable_pref..mdef_copy.constants.basename.. + "button_show_paylines.png;showpaylines;]" + + mdef_copy.constants.buttonadmin = "image[".. + ((mdef_copy.geometry.cash_slot_posx - mdef_copy.constants.cslotbtnszy - 0.02)* horizscale - hanchor)..",".. + (mdef_copy.geometry.cash_slot_posy * vertscale - vanchor)..";".. + mdef_copy.constants.cslotbtnszy..","..mdef_copy.constants.cslotbtnszy.. + ";minislots_button_admin.png]".. + "image_button[".. + ((mdef_copy.geometry.cash_slot_posx - mdef_copy.constants.cslotbtnszy - 0.02)* horizscale - hanchor)..",".. + (mdef_copy.geometry.cash_slot_posy * vertscale - vanchor)..";".. + mdef_copy.constants.cslotbtnszy..","..mdef_copy.constants.cslotbtnszy.. + ";"..mdef_copy.constants.emptyimg..";admin;]" + + mdef_copy.constants.buttonadmin_dis = "image[".. + ((mdef_copy.geometry.cash_slot_posx - mdef_copy.constants.cslotbtnszy - 0.02)* horizscale - hanchor)..",".. + (mdef_copy.geometry.cash_slot_posy * vertscale - vanchor)..";".. + mdef_copy.constants.cslotbtnszy..","..mdef_copy.constants.cslotbtnszy.. + ";minislots_button_admin.png]" + + + mdef_copy.constants.buttons_n_lines = {} + mdef_copy.constants.buttons_bet_n = {} + + for i, value in ipairs(mdef_copy.linebuttons) do + mdef_copy.constants.buttons_n_lines[value] = {} + local posx = ((mdef_copy.geometry.button_rows_posx + + (i-1)*mdef_copy.geometry.main_button_spacing) * horizscale - hanchor) + + for _, state in ipairs( {"dis", "off", "on"} ) do + local btn = "image["..posx..","..mdef_copy.constants.spinposy..";".. + mdef_copy.constants.lnbetpref..mdef_copy.constants.basename.."button_lines_"..state.."_"..value..".png]" + if state ~= "dis" then + btn = btn.."image_button["..posx..","..mdef_copy.constants.spinposy..";".. + mdef_copy.constants.lnbetpref.."minislots_empty_img.png;lines_"..value..";]" + end + mdef_copy.constants.buttons_n_lines[value][state] = btn + end + end + + for i, value in ipairs(mdef_copy.betbuttons) do + mdef_copy.constants.buttons_bet_n[value] = {} + + local posx = ((mdef_copy.geometry.button_rows_posx + + (i-1)*mdef_copy.geometry.main_button_spacing) * horizscale - hanchor) + + for _, state in ipairs( {"dis", "off", "on"} ) do + local btn = "image["..posx..","..mdef_copy.constants.coutposy..";".. + mdef_copy.constants.lnbetpref..mdef_copy.constants.basename.."button_bet_"..state.."_"..value..".png]" + if state ~= "dis" then + btn = btn.."image_button["..posx..","..mdef_copy.constants.coutposy..";".. + mdef_copy.constants.lnbetpref.."minislots_empty_img.png;bet_"..value..";]" + end + mdef_copy.constants.buttons_bet_n[value][state] = btn + end + end + + mdef_copy.constants.digits = {} + for i = 0, 9 do + mdef_copy.constants.digits[tostring(i)] = mdef_copy.constants.basename.."glyph_digit_"..i..".png" + end + + mdef_copy.constants.symlookup = {} + for num,sym in ipairs(mdef_copy.symbols) do + mdef_copy.constants.symlookup["sym_"..sym] = num + end + + local mesh = "" + local tiles = {} + local cbox = {} + + if mdef_copy.machine_shape == "upright" then + mesh = "minislots_generic_machine_upright.obj" + cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5 }, + {-0.5, 0.5, -0.1875, 0.5, 1.5, 0.5 }, + } + } + elseif mdef_copy.machine_shape == "upright_big" then + mesh = "minislots_generic_machine_upright_big.obj" + cbox = { + type = "fixed", + fixed = { -1, -0.5, -0.5, 1.5, 3.5, 1.5 } + } + end + + minetest.register_node(":minislots:"..mdef_copy.name, { + description = mdef_copy.description, + drawtype = "mesh", + mesh = mesh, + tiles = { "minislots_"..mdef_copy.name.."_cabinet_graphics.png" }, + node_box = cbox, -- this is used to create proper collision info. + paramtype2 = "facedir", + selection_box = cbox, + is_ground_content = false, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), + machine_def = table.copy(mdef_copy), + on_timer = minislots.cycle_states, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local player_name = clicker:get_player_name() + local oldform = meta:get_string("formspec") + local balance = meta:get_int("balance") + local def = minetest.registered_items[node.name].machine_def + + minislots.player_last_machine_def[player_name] = def + minislots.player_last_machine_pos[player_name] = pos + + if not string.find(oldform, "locked-out") then + local state = meta:get_string("state") + if state ~= "stopped" then return end + local spin = minetest.deserialize(meta:get_string("spin")) + local linebet = meta:get_int("linebet") + local maxlines = meta:get_int("maxlines") + meta:set_string("last_right_clicker", clicker:get_player_name()) + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = {}, + balance = balance, + linebet = linebet, + maxlines = maxlines, + pos = pos, + admin = default.can_interact_with_node(clicker, pos) + }) + ) + elseif meta:get_string("owner") == player_name then + minetest.get_node_timer(pos):stop() + minetest.show_formspec(player_name, "minislots:admin_form", + minislots.generate_admin_form(def, pos, balance)) + return + end + end, + on_construct = function(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name].machine_def + local meta = minetest.get_meta(pos) + local resetspin = minislots.reset_reels(def) + local balance = 0 + local linebet = 1 + local maxlines = 1 + local emptywins = { + scatter = { count = 0, pos = {} }, + bonus = { value = -1, count = 0, pos = {} } + } + meta:set_int("balance", balance) + meta:set_int("last_cashout", 0) + meta:set_int("linebet", linebet) + meta:set_int("maxlines", maxlines) + meta:set_int("bonus_result", -1) + meta:set_string("state", "stopped") + meta:set_string("spin", minetest.serialize(resetspin)) + meta:set_int("spin_timestamp", os.time()) + + meta:set_string("install_date", os.date()) + meta:set_int("spin_count", 0) + meta:set_int("money_in", 0) + meta:set_int("money_out", 0) + meta:set_int("total_bets", 0) + meta:set_int("total_wins", 0) + meta:set_int("scatter_hits", 0) + meta:set_int("bonus_hits", 0) + + meta:set_string("casino_name", "LocalGames Casino/Hotel") + + meta:set_string("allwins", minetest.serialize(emptywins)) + meta:mark_as_private({ + "balance", + "last_cashout", + "linebet", + "maxlines", + "bonus_result", + "state", + "spin", + "spin_timestamp", + "allwins", + "casino_name", + "install_date", + "spin_count", + "money_in", + "money_out", + "total_bets", + "total_wins", + "scatter_hits", + "bonus_hits" + }) + + local inv = meta:get_inventory() + inv:set_size("main", 1) + end, + on_dig = function(pos, node, digger) + local def = minetest.registered_items[node.name].machine_def + local player_name = digger:get_player_name() + if default.can_interact_with_node(digger, pos) then + local stack = ItemStack("minislots:"..def.name) + local nodemeta = minetest.get_meta(pos) + local stackmeta = stack:get_meta() + + local balance = nodemeta:get_int("balance") or 0 + local casino = nodemeta:get_string("casino_name") + stackmeta:set_int("balance", balance) + stackmeta:set_string("casino_name", casino) + stackmeta:set_int("last_cashout", nodemeta:get_int("last_cashout") ) + stackmeta:set_string("install_date", nodemeta:get_string("install_date") ) + stackmeta:set_int("spin_count", nodemeta:get_int("spin_count") ) + stackmeta:set_int("money_in", nodemeta:get_int("money_in") ) + stackmeta:set_int("money_out", nodemeta:get_int("money_out") ) + stackmeta:set_int("total_bets", nodemeta:get_int("total_bets") ) + stackmeta:set_int("total_wins", nodemeta:get_int("total_wins") ) + stackmeta:set_int("scatter_hits", nodemeta:get_int("scatter_hits") ) + stackmeta:set_int("bonus_hits", nodemeta:get_int("bonus_hits") ) + stackmeta:set_string("description", + def.description.."\n(balance: "..balance.." Mg;\ncasino: "..casino..")") + local inv = digger:get_inventory() + if inv:room_for_item("main", stack) then + if (not creative or not creative.is_enabled_for(player_name)) + or (creative and creative.is_enabled_for(player_name) + and not inv:contains_item("main", stack, true)) then + inv:add_item("main", stack) + end + minetest.remove_node(pos) + end + end + end, + after_place_node = function(pos, placer, itemstack) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name].machine_def + local nodemeta = minetest.get_meta(pos) + local player_name = placer:get_player_name() + local stackmeta = itemstack:get_meta() + + local balance = 0 + local resetspin = minislots.reset_reels(def) + local linebet = 1 + local maxlines = 1 + local emptywins = { + scatter = { count = 0, pos = {} }, + bonus = { value = -1, count = 0, pos = {} } + } + local casino = stackmeta:get_string("casino_name") + + if stackmeta then + balance = stackmeta:get_int("balance") + nodemeta:set_int("balance", balance) + + if casino ~= "" then + nodemeta:set_string("casino_name", casino) + end + nodemeta:set_int("last_cashout", stackmeta:get_int("last_cashout")) + nodemeta:set_int("spin_count", stackmeta:get_int("spin_count") ) + nodemeta:set_int("money_in", stackmeta:get_int("money_in") ) + nodemeta:set_int("money_out", stackmeta:get_int("money_out") ) + nodemeta:set_int("total_bets", stackmeta:get_int("total_bets") ) + nodemeta:set_int("total_wins", stackmeta:get_int("total_wins") ) + nodemeta:set_int("scatter_hits", stackmeta:get_int("scatter_hits")) + nodemeta:set_int("bonus_hits", stackmeta:get_int("bonus_hits") ) + end + nodemeta:set_string("owner", player_name) + nodemeta:set_string("infotext", def.description.."\nOwned by "..player_name) + nodemeta:set_string("formspec", + minislots.generate_display(def, { + state = "stopped", + spin = resetspin, + allwins = emptywins, + balance = balance, + linebet = linebet, + maxlines = maxlines, + admin = default.can_interact_with_node(placer, pos) + }) + ) + end, + can_dig = function(pos, player) + return default.can_interact_with_node(player, pos) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name].machine_def + local player_name = player:get_player_name() + local meta = minetest.get_meta(pos) + local state = meta:get_string("state") + local spin = minetest.deserialize(meta:get_string("spin")) + local balance = meta:get_int("balance") + local linebet = meta:get_int("linebet") + local maxlines = meta:get_int("maxlines") + local timer = minetest.get_node_timer(pos) + local last_cashout = nil + timer:stop() + local inv = meta:get_inventory() + inv:remove_item("main", stack) + local state = "stopped" + meta:set_string("state", state) + meta:set_int("last_cashout", balance) + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = {}, + balance = balance, + linebet = linebet, + maxlines = maxlines, + last_cashout = last_cashout, + admin = default.can_interact_with_node(player, pos) + }) + ) + minetest.show_formspec(player_name, "minislots:cash_intake", + minislots.generate_cashslot_form(def, pos, balance)) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name].machine_def + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local sn = stack:get_name() + local mg + if string.find(sn, "currency:minegeld") and not string.find(sn, "bundle") then + if not string.find(sn, "cent") then + mg = tonumber(string.sub(sn, 19)) + if not mg then mg = 1 end + else + mg = tonumber(string.sub(sn, 24)) / 100 + end + if mg < def.currency_min or mg > def.currency_max then return 0 end + local balance = meta:get_int("balance") + if balance < (def.maxbalance - mg*stack:get_count()) then + local amount = mg*stack:get_count() + balance = balance + amount + meta:set_int("balance", balance) + meta:set_int("money_in", meta:get_int("money_in")+amount) + return -1 + end + end + return 0 + end, + on_receive_fields = function(pos, formname, fields, sender) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name].machine_def + local player_name = sender:get_player_name() + local meta = minetest.get_meta(pos) + local state = meta:get_string("state") + local spin = minetest.deserialize(meta:get_string("spin")) + local balance = meta:get_int("balance") + local linebet = meta:get_int("linebet") + local maxlines = meta:get_int("maxlines") + local timer = minetest.get_node_timer(pos) + timer:stop() + + local allfields = minetest.serialize(fields) + if fields.admin then + if player_name == meta:get_string("owner") then + minetest.get_node_timer(pos):stop() + meta:set_string("formspec", "size[4,1]".. + "image_button_exit[3.65,-0.2;0.55,0.5;"..def.constants.button_close..";close;]".. + "label[0.3,0.2;This machine has been locked-out by]".. + "label[0.1,0.5;the Administrator. Please come back later.]") + minetest.show_formspec(player_name, "minislots:admin_form", + minislots.generate_admin_form(def, pos, balance)) + return + end + elseif fields.cslot then + local meta = minetest.get_meta(pos) + local balance = meta:get_int("balance") + local player_name = sender:get_player_name() + minetest.show_formspec(player_name, "minislots:cash_intake", + minislots.generate_cashslot_form(def, pos, balance)) + return + elseif fields.help then + local meta = minetest.get_meta(pos) + local balance = meta:get_int("balance") + local player_name = sender:get_player_name() + minetest.show_formspec(player_name, "minislots:help_screen", + minislots.generate_paytable_form(def)) + return + elseif fields.cout then + if balance > 0 and balance <= def.maxbalance then + local state = "stopped" + local last_cashout = balance + local casino_name = meta:get_string("casino_name") + balance = 0 + meta:set_string("state", state) + meta:set_int("last_cashout", balance) + meta:set_int("balance", balance) + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = {}, + balance = balance, + linebet = linebet, + maxlines = maxlines, + last_cashout = last_cashout, + pos = pos, + casino_name = casino_name, + admin = default.can_interact_with_node(sender, pos) + }) + ) + local fifties = math.floor(last_cashout/50) + local tens = math.floor((last_cashout - fifties*50)/10) + local fives = math.floor((last_cashout - fifties*50 - tens*10)/5) + local ones = math.floor(last_cashout - fifties*50 - tens*10 - fives*5) + local inv = sender:get_inventory() + if (fifties == 0 or inv:room_for_item("main", "currency:minegeld_50 "..fifties)) + and (tens == 0 or inv:room_for_item("main", "currency:minegeld_10 "..tens)) + and (fives == 0 or inv:room_for_item("main", "currency:minegeld_5 "..fives)) + and (ones == 0 or inv:room_for_item("main", "currency:minegeld "..ones)) then + + if fifties > 0 then inv:add_item("main", "currency:minegeld_50 "..fifties) end + if tens > 0 then inv:add_item("main", "currency:minegeld_10 "..tens) end + if fives > 0 then inv:add_item("main", "currency:minegeld_5 "..fives) end + if ones > 0 then inv:add_item("main", "currency:minegeld "..ones) end + meta:set_int("money_out", meta:get_int("money_out")+last_cashout) + end + return + end + elseif fields.quit then + local allwins = minislots.check_win(spin, def, maxlines) + meta:set_string("allwins", minetest.serialize(allwins)) + local state = "stopped" + meta:set_string("state", state) + local oldform = meta:get_string("formspec") + if not string.find(oldform, "locked-out") then + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = {}, + balance = balance, + linebet = linebet, + maxlines = maxlines, + admin = default.can_interact_with_node(sender, pos) + }) + ) + end + return + elseif fields.spin then + if state == "stopped" or string.find(state, "win") then + if (linebet*maxlines) > balance or balance > def.maxbalance then return end + meta:set_int("spin_timestamp", os.time()) + local node = minetest.get_node(pos) + local spin = minislots.spin_reels(def) + local allwins = minislots.check_win(spin, def, maxlines) + meta:set_string("spin", minetest.serialize(spin)) + meta:set_string("allwins", minetest.serialize(allwins)) + meta:set_string("state", "start") + minislots.cycle_states(pos) + return + end + elseif string.find(allfields, "bet_") then + local s1 = string.sub(allfields, 15) + local s2 = string.find(s1, '"') + local linebet = tonumber(string.sub(s1, 1, s2-1)) or 1 + if def.bet_initiates_spin then + if maxlines*linebet > balance or balance > def.maxbalance then return end + meta:set_int("linebet", linebet) + local node = minetest.get_node(pos) + local spin = minislots.spin_reels(def) + local allwins = minislots.check_win(spin, def, maxlines) + meta:set_string("spin", minetest.serialize(spin)) + meta:set_string("allwins", minetest.serialize(allwins)) + meta:set_string("state", "start") + minislots.cycle_states(pos) + return + else + if maxlines*linebet <= balance then + local state = "stopped" + meta:set_string("state", state) + meta:set_int("linebet", linebet) + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = {}, + balance = balance, + linebet = linebet, + maxlines = maxlines, + showlines = true, + admin = default.can_interact_with_node(sender, pos) + }) + ) + end + end + elseif string.find(allfields, "lines_") then + local s1 = string.sub(allfields, 17) + local s2 = string.find(s1, '"') + local maxlines = tonumber(string.sub(s1, 1, s2-1)) or 1 + if maxlines*linebet <= balance then + local state = "stopped" + meta:set_string("state", state) + meta:set_int("maxlines", maxlines) + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = {}, + balance = balance, + linebet = linebet, + maxlines = maxlines, + showlines = true, + admin = default.can_interact_with_node(sender, pos) + }) + ) + end + end + end + }) +end + + +--################### +-- the state machine +--################### + +function minislots.cycle_states(pos) + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name].machine_def + local meta = minetest.get_meta(pos) + local state = meta:get_string("state") + local spin = minetest.deserialize(meta:get_string("spin")) + local linebet = meta:get_int("linebet") + local maxlines = meta:get_int("maxlines") + local balance = meta:get_int("balance") + local allwins = minetest.deserialize(meta:get_string("allwins")) + local numscatter = (allwins and allwins.scatter and allwins.scatter.count) or 0 + local numbonus = (allwins and allwins.bonus and allwins.bonus.count) or 0 + local last_right_clicker = meta:get_string("last_right_clicker") + local player = minetest.get_player_by_name(last_right_clicker) + local admin = player and default.can_interact_with_node(player, pos) + + local timeout = 0 + + if state == "start" then + balance = meta:get_int("balance") - linebet*maxlines + meta:set_int("balance", balance) + meta:set_int("spin_count", meta:get_int("spin_count")+1) + meta:set_int("total_bets", meta:get_int("total_bets")+linebet*maxlines) + state = "spinning_fast_0" + timeout = def.reel_fast_timeout + elseif string.find(state, "spinning_fast_") then + local c = tonumber(string.sub(state, 15)) + c = c + 2 + if c >= def.constants.fast_med_cutover then + state = "spinning_medm_"..def.constants.fast_med_cutover + timeout = def.reel_medium_timeout + else + state = "spinning_fast_"..c + timeout = def.reel_fast_timeout + end + elseif string.find(state, "spinning_medm_") then + local c = tonumber(string.sub(state, 15)) + c = c + 2 + if c >= def.constants.med_slow_cutover then + state = "spinning_slow_"..def.constants.med_slow_cutover + timeout = def.reel_slow_timeout + else + state = "spinning_medm_"..c + timeout = def.reel_medium_timeout + end + elseif string.find(state, "spinning_slow_") then + local c = tonumber(string.sub(state, 15)) + c = c + 2 + if c >= def.constants.slow_stop_cutover then + state = "reels_stopping_"..def.constants.slow_stop_cutover + timeout = def.reel_slow_timeout + else + state = "spinning_slow_"..c + timeout = def.reel_slow_timeout + end + elseif string.find(state, "reels_stopping_") then + local sr = tonumber(string.sub(state, 16)) + sr = sr + 1 + if sr <= def.constants.last_step then + state = "reels_stopping_"..sr + timeout = def.reel_slow_timeout + else + if numscatter >= def.min_scatter or numbonus >= def.min_bonus then + state = "stopped" + timeout = 0.1 + else + state = "stopped" + timeout = def.win_delay + end + end + elseif state == "stopped" then + if #allwins > 0 then + local amount = allwins.line_wins_total*linebet + balance = balance + amount + allwins.total = allwins.total + amount + meta:set_int("total_wins", meta:get_int("total_wins")+amount) + end + if numscatter >= def.min_scatter then + local amount = allwins.scatter.count*def.scatter_value*linebet + balance = balance + amount + allwins.total = allwins.total + amount + meta:set_int("scatter_hits", meta:get_int("scatter_hits")+1) + meta:set_int("total_wins", meta:get_int("total_wins")+amount) + end + if numbonus >= def.min_bonus and allwins.bonus.value < 0 then + allwins.bonus.value = def.initiate_bonus(spin, def) + balance = balance + allwins.bonus.value + allwins.total = allwins.total + allwins.bonus.value + meta:set_int("bonus_hits", meta:get_int("bonus_hits")+1) + meta:set_int("total_wins", meta:get_int("total_wins")+allwins.bonus.value) + end + meta:set_string("allwins", minetest.serialize(allwins)) + meta:set_int("balance", balance) + if numbonus >= def.min_bonus then + state = "bonus_win" + timeout = def.line_timeout + elseif numscatter >= def.min_scatter then + state = "scatter_win" + timeout = def.line_timeout + elseif #allwins > 0 then + state = "win_1" + timeout = def.line_timeout + end + elseif state == "bonus_win" then + if numscatter >= def.min_scatter then + state = "scatter_win" + timeout = def.line_timeout + elseif #allwins > 0 then + state = "win_1" + timeout = def.line_timeout + end + elseif state == "scatter_win" then + if #allwins > 0 then + state = "win_1" + timeout = def.line_timeout + end + elseif string.find(state, "win_") then + local w = tonumber(string.sub(state, 5)) + 1 + if w > #allwins then + if numbonus >= def.min_bonus then + state = "bonus_win" + timeout = def.line_timeout + elseif numscatter >= def.min_scatter then + state = "scatter_win" + timeout = def.line_timeout + else + state = "win_1" + if #allwins > 1 then + timeout = def.line_timeout + end + end + else + state = "win_"..w + timeout = def.line_timeout + end + end + + if meta:get_int("spin_timestamp") < (os.time() - 60) then + minetest.get_node_timer(pos):stop() + state = "stopped" + meta:set_string("state", state) + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = allwins, + balance = balance, + linebet = linebet, + maxlines = maxlines, + admin = admin + }) + ) + return + end + + meta:set_string("state", state) + meta:set_string("formspec", + minislots.generate_display(def, { + state = state, + spin = spin, + allwins = allwins, + balance = balance, + linebet = linebet, + maxlines = maxlines, + admin = admin + }) + ) + if timeout > 0 then + local timer = minetest.get_node_timer(pos) + timer:start(timeout) + end + return false +end + + +--#################### +-- the display engine +--#################### + +local function calcrp(def, spin, i, statenum) + local rp = ( + spin[2][i+1][1]*2-2 + + statenum + + def.constants.reel_wraparound_buf + - def.constants.last_step + + (def.constants.numreels-i-1)*def.inter_reel_steps + ) % (def.constants.numsymbols * 2) + return rp/2 +end + +function minislots.generate_display(def, options) + local state = options.state + local spin = options.spin + local allwins = options.allwins + local balance = options.balance + local linebet = options.linebet + local maxlines = options.maxlines + local showlines = options.showlines + local last_cashout = options.last_cashout + local pos = options.pos + local casino_name = options.casino_name + local admin = options.admin + + local reels = "" + local lines = "" + local scatters = "" + local bonuses = "" + local underlights = {} + local spinbutton = "" + local cashoutbutton = "" + + for i = 1, def.constants.numreels do underlights[i] = "" end + + if state == "scatter_win" and allwins.scatter.count > 0 then + for reel = 1, def.constants.numreels do + local t = {} + for row = 0, 2 do + if spin[row+1][reel][2] == "scatter" then + t[#t+1] = ":0,"..(row*def.constants.reelsymsizey).."=" + ..def.constants.reelunderlightpref..(row+1)..".png" + end + end + if #t > 0 then + underlights[reel] = table.concat(t, ":") + end + end + elseif state == "bonus_win" and allwins.bonus.count > 0 then + for reel = 1, def.constants.numreels do + local t = {} + for row = 0, 2 do + if spin[row+1][reel][2] == "bonus" then + t[#t+1] = ":0,"..(row*def.constants.reelsymsizey).."=" + ..def.constants.reelunderlightpref..(row+1)..".png" + end + end + if #t > 0 then + underlights[reel] = table.concat(t, ":") + end + end + end + + local statenum = tonumber(string.sub(state, (string.find(state, "stopping") and 16 or 15))) + if string.find(state, "spinning_fast_") then + local t = {} + for i = 0, def.constants.numreels-1 do + local rs = calcrp(def, spin, i, statenum) * -def.constants.reelsymsizey + t[i+1] = "image["..((i*def.constants.reelspc+def.geometry.reel_posx)*horizscale-hanchor).. + def.constants.reelcombinepref.. + ":0,"..rs.."="..def.constants.symbolsfast.. + def.constants.reelshadowimg + end + reels = table.concat(t) + elseif string.find(state, "spinning_medm_") then + local t = {} + for i = 0, def.constants.numreels-1 do + local rs = calcrp(def, spin, i, statenum) * -def.constants.reelsymsizey + t[i+1] = "image["..((i*def.constants.reelspc+def.geometry.reel_posx)*horizscale-hanchor).. + def.constants.reelcombinepref.. + ":0,"..rs.."="..def.constants.symbolsmedium.. + def.constants.reelshadowimg + end + reels = table.concat(t) + elseif string.find(state, "spinning_slow_") then + local t = {} + for i = 0, def.constants.numreels-1 do + local rs = calcrp(def, spin, i, statenum) * -def.constants.reelsymsizey + t[i+1] = "image["..((i*def.constants.reelspc+def.geometry.reel_posx)*horizscale-hanchor).. + def.constants.reelcombinepref.. + ":0,"..rs.."="..def.constants.symbolsslow.. + def.constants.reelshadowimg + end + reels = table.concat(t) + elseif string.find(state, "reels_stopping_") then + local t = {} + for i = 0, def.constants.numreels-1 do + if i > ((statenum-def.constants.slow_stop_cutover-1)/def.inter_reel_steps) then + local rs = calcrp(def, spin, i, statenum) * -def.constants.reelsymsizey + t[i+1] = "image["..((i*def.constants.reelspc+def.geometry.reel_posx)*horizscale-hanchor).. + def.constants.reelcombinepref.. + ":0,"..rs.."="..def.constants.symbolsslow.. + def.constants.reelshadowimg + else + local rs = (spin[2][i+1][1]-1) * -def.constants.reelsymsizey + t[i+1] = "image["..((i*def.constants.reelspc+def.geometry.reel_posx)*horizscale-hanchor).. + def.constants.reelcombinepref.. + underlights[i+1]..":0,"..rs.."="..def.constants.symbolsstopped.. + def.constants.reelshadowimg + end + end + reels = table.concat(t) + elseif state == "stopped" or state == "start" or string.find(state, "win") then + local t = {} + for i = 0, def.constants.numreels-1 do + local rs = (spin[2][i+1][1]-1) * -def.constants.reelsymsizey + t[i+1] = "image["..((i*def.constants.reelspc+def.geometry.reel_posx)*horizscale-hanchor).. + def.constants.reelcombinepref.. + underlights[i+1]..":0,"..rs.."="..def.constants.symbolsstopped.. + def.constants.reelshadowimg + end + reels = table.concat(t) + end + + if not showlines then + if string.find(state, "win_") then + local w = string.sub(state, 5) + local linewin = allwins[tonumber(w)].payline + lines = def.constants.mainpref..def.constants.overlaylinepref..linewin..".png]" + end + else + local t = {} + for i = 1, maxlines do + t[i] = def.constants.mainpref..def.constants.overlaylinepref..i..".png]" + end + lines = table.concat(t) + end + + local t = {} + if state == "scatter_win" and allwins.scatter.count > 0 then + for i,pos in ipairs(allwins.scatter.pos) do + t[i] = "image["..(((pos[1]-1)*def.constants.reelspc+def.constants.highlightboxoffsx)*horizscale-hanchor)..",".. + (((pos[2]-1)*(def.geometry.reel_sizey/3)+def.constants.highlightboxoffsy)*vertscale-vanchor)..";".. + def.constants.scatterhlimg + end + scatters = table.concat(t) + end + + local t = {} + if state == "bonus_win" and allwins.bonus.count > 0 then + for i,pos in ipairs(allwins.bonus.pos) do + t[i] = "image["..(((pos[1]-1)*def.constants.reelspc+def.constants.highlightboxoffsx)*horizscale-hanchor)..",".. + (((pos[2]-1)*(def.geometry.reel_sizey/3)+def.constants.highlightboxoffsy)*vertscale-vanchor)..";".. + def.constants.bonushlimg + end + bonuses = table.concat(t) + end + +-- all the stuff that is shown in the lower section's "screen" + + local posx = def.constants.screenposx + def.geometry.label_medium_sizex * horizscale + local posy2 = def.constants.screenposy + def.geometry.screen_line_height * vertscale + local tb = maxlines*linebet + local dgszx = def.geometry.digit_glyph_sizex*0.75 + + local bal = def.constants.lscrnpref..def.constants.lscrnypos1..def.constants.medlblsz1..def.constants.ballabelimg.. + minislots.print_number(def, + balance, + posx, + def.constants.screenposy, + dgszx, + def.geometry.screen_line_height, + true) + + local betwin = def.constants.lscrnpref..def.constants.lscrnypos2..def.constants.medlblsz1..def.constants.betlabelimg.. + minislots.print_number(def, + tb, + posx, + posy2, + dgszx, + def.geometry.screen_line_height, + true) + + if string.find(state, "win") and allwins.total > 0 then + -- switch to 3-line mode + + local tblen = string.len(tostring(tb)) + + betwin = def.constants.lscrnpref..def.constants.lscrnypos2..def.constants.medlblsz2..def.constants.betlabelimg.. + minislots.print_number(def, + tb, + posx, + posy2, + def.constants.digitmed, + def.constants.screenlnht2, + true).. + + "image["..(def.constants.screenposx + (def.geometry.label_medium_sizex + + def.constants.digitmed * (tblen+2.3333)) * horizscale).. + def.constants.lscrnypos2..def.constants.medlblsz2..def.constants.winlabelimg.. + + minislots.print_number(def, + allwins.total, + def.constants.screenposx + (def.geometry.label_medium_sizex*2 + + def.constants.digitmed * (tblen+2.3333)) * horizscale, + posy2, + def.constants.digitmed, + def.constants.screenlnht2, + true) + + if state == "scatter_win" then + + betwin = betwin..def.constants.lscrnpref..def.constants.lscrnypos3..def.constants.scatterwinlabelimg.. + minislots.print_number(def, + allwins.scatter.count * def.scatter_value * linebet, + def.constants.screenposx + def.geometry.scatter_win_label_sizex * horizscale, + def.constants.posy3, + def.constants.digitsm, + def.constants.screenlnht3, + true) + elseif state == "bonus_win" then + if allwins.bonus.value > -1 then + + betwin = betwin..def.constants.lscrnpref..def.constants.lscrnypos3..def.constants.bonuswinlabelimg.. + minislots.print_number(def, + allwins.bonus.value, + def.constants.screenposx + def.geometry.bonus_win_label_sizex * horizscale, + def.constants.posy3, + def.constants.digitsm, + def.constants.screenlnht3, + true) + end + else + local w = string.sub(state, 5) + local lwlen = string.len(w) + local s = tonumber(w) + local lwn = allwins[s].payline + + betwin = betwin..def.constants.lscrnpref..def.constants.lscrnypos3..def.constants.lnwinlblsz.. + def.constants.linewinlabelimg.. + "image["..( + def.constants.screenposx + + (def.geometry.line_win_label_sizex + + def.constants.ln3dig) * horizscale).. + def.constants.lscrnypos3..def.constants.parenlblsz..def.constants.lparenimg.. + + minislots.print_number(def, + lwn, + def.constants.screenposx + + (def.geometry.line_win_label_sizex + + def.constants.ln3dig + + def.constants.parensize) * horizscale, + def.constants.posy3, + def.constants.digitsm, + def.constants.screenlnht3, + false).. + + "image["..( + def.constants.screenposx + + (def.geometry.line_win_label_sizex + + def.constants.ln3dig + + def.constants.parensize + + def.constants.digitsm * lwlen) * horizscale).. + def.constants.lscrnypos3..def.constants.parenlblsz..def.constants.rparenimg.. + + "image["..( + def.constants.screenposx + + (def.geometry.line_win_label_sizex + + def.constants.ln3dig + + def.constants.parensize*2 -- i.e. two colon/paren spaces' worth + + def.constants.digitsm * lwlen) * horizscale).. + def.constants.lscrnypos3..def.constants.parenlblsz..def.constants.colonimg.. + + minislots.print_number(def, + allwins[s].value*linebet, + def.constants.screenposx + + (def.geometry.line_win_label_sizex + + def.constants.digitsm -- that is, two separate 1/2 spaces' worth + + def.constants.parensize*3 -- i.e. three colon/paren spaces' worth + + def.constants.digitsm * lwlen) * horizscale, + def.constants.posy3, + def.constants.digitsm, + def.constants.screenlnht3, + true) + end + end + + local onoff + local linesbetbuttons = {} + for i,b in ipairs(def.linebuttons) do + onoff = "off" + if b*linebet > balance or string.find(state, "spinning") or string.find(state, "reels_stopping_") then onoff = "dis" + elseif maxlines == tonumber(b) then onoff = "on" + end + linesbetbuttons[#linesbetbuttons+1] = def.constants.buttons_n_lines[b][onoff] + end + + onoff = "off" + for i,b in ipairs(def.betbuttons) do + onoff = "off" + if b*maxlines > balance or string.find(state, "spinning") or string.find(state, "reels_stopping_") then onoff = "dis" + elseif linebet == tonumber(b) then onoff = "on" + end + linesbetbuttons[#linesbetbuttons+1] = def.constants.buttons_bet_n[b][onoff] + end + + local spincashoutbuttons = "" + local upper_screen = "" + local cash_slot = "" + local button_admin = "" + local button_help = "" + + if not (string.find(state, "spinning") or string.find(state, "reels_stopping_")) then + button_help = def.constants.buttonhelp + cash_slot = def.constants.buttoncashslot + if balance > 0 then + spincashoutbuttons = def.constants.buttonspin..def.constants.buttoncashout + else + spincashoutbuttons = def.constants.buttonspin_dis..def.constants.buttonquit + end + if admin then button_admin = def.constants.buttonadmin end + else + button_help = def.constants.buttonhelp_dis + cash_slot = def.constants.buttoncashslot_dis + spincashoutbuttons = def.constants.buttonspin_dis..def.constants.buttoncashout_dis + if admin then button_admin = def.constants.buttonadmin_dis end + end + + if not last_cashout then + upper_screen = + def.constants.behindreels.. + reels.. + def.constants.overlay_upper.. + scatters.. + bonuses.. + cash_slot.. + button_admin.. + button_help + else + local maxw = 6 + local maxmw = 2.25 + + local posy = 3.6 - vanchor + + local txtszy = 0.25 + local numszy = 0.85 + local nameszy = 0.35 + local mstr_sizey = 0.15 + + local w = minislots.str_width_pix(casino_name, "regular")*pix2iu*nameszy + local name_sizex = w < maxw and w or maxw + + local numberwords = minislots.number_to_words(last_cashout).." Minegeld" + local w = minislots.str_width_pix(numberwords, "condensed")*pix2iu*txtszy + local numwords_maxszx = w < maxw and w or maxw + + local lastcoutstr = tostring(last_cashout).." Mg" + local w = minislots.str_width_pix(lastcoutstr, "bold")*pix2iu*numszy + local numstr_maxszx = w < maxw and w or maxw + + local machinestr = "MACHINE #"..string.format("%.0f", minetest.hash_node_position(pos)) + local w = minislots.str_width_pix(machinestr, "bold")*pix2iu*mstr_sizey + local mstr_sizex = w < maxmw and w or maxmw + + local nameposx = def.constants.cashout_screen_ctrx - name_sizex*horizscale/2 + local numwordsposx = def.constants.cashout_screen_ctrx - numwords_maxszx*horizscale/2 + local numstrposx = def.constants.cashout_screen_ctrx - numstr_maxszx*horizscale/2 + local mstr_posx = 6.25 + + upper_screen = + def.constants.cashoutbackground.. + def.constants.upperbezel.. + def.constants.cashoutticketimg.. + minislots.print_string(def, casino_name, nameposx, posy, name_sizex, nameszy, "regular", false, "black").. + minislots.print_string(def, numberwords, numwordsposx, posy+1.4, numwords_maxszx, txtszy, "condensed", false, "black").. + minislots.print_string(def, lastcoutstr, numstrposx, posy+1.6, numstr_maxszx, numszy, "bold", false, "black").. + minislots.print_string(def, machinestr, mstr_posx, posy+2.36, mstr_sizex, mstr_sizey, "bold", false, "black") + end + + return def.constants.form_header.. + def.constants.overlay_lower.. + upper_screen.. + table.concat(linesbetbuttons).. + spincashoutbuttons.. + lines.. + bal.. + betwin +end + +function minislots.str_width_pix(str, weight) + local w = 0 + local len = string.len(str) + for i = 1, len do + w = w + char_widths[string.byte(str, i)][weight] + end + return w +end + +function minislots.print_string(def, str, posx, posy, sizex, sizey, weight, shadow, color) + local t = {} + if not str then return "" end + local len = string.len(str) + if len < 1 then return "" end + local colorize = color and "\\^[colorize\\:"..color.."\\:255" or "" + local shadowcolor = "\\^[colorize\\:black\\:255" + + local px = 0 + for i = 1, len do + local asc = string.byte(str, i) + + t[#t+1] = px..",0=minislots_font_"..weight.."_char_"..asc..".png" + px = px + char_widths[asc][weight] + end + + local text = "image["..posx..","..posy..";"..sizex..","..sizey..";".. + minetest.formspec_escape("[combine:"..px.."x80:").. + table.concat(t, ":")..colorize.."]" + if shadow then + text = "image["..(posx+0.03)..","..(posy+0.03)..";"..sizex..","..sizey..";".. + minetest.formspec_escape("[combine:"..px.."x80:").. + table.concat(t, ":")..shadowcolor.."]"..text + end + return text +end + +function minislots.print_number(def, num, posx, posy, sizex, sizey, cur, color) + local t = {} + local sn = tostring(num) + local len = string.len(sn) + local colorize = color and minetest.formspec_escape("^[colorize:"..color..":255").."]" or "]" + + for i = 1, len do + t[#t+1] = "image["..(posx + (i-1)*sizex * horizscale)..","..posy..";".. + sizex..","..sizey..";"..def.constants.digits[string.sub(sn, i, i)]..colorize + end + + if cur then + t[#t+1] = "image["..(posx + (len*sizex+sizex/4) * horizscale)..","..posy..";".. + (sizex*1.3333)..","..(sizey)..def.constants.curlabelimg..colorize + end + + return table.concat(t) +end + +function minislots.number_to_words(number) + + local numstr = tostring(number) + local numlen = string.len(numstr) + local words = {} + + if number == 0 then return words_numbers[0] end + + local i = 1 + while i <= numlen do + if (i+2)/3 == math.floor((i+2)/3) then -- it's a one's digit + local n = tonumber(string.sub(numstr, -i-1, -i)) + local num = words_numbers[n] + if not num then -- it's > 19 + n = tonumber(string.sub(numstr, -i, -i)) + if n > 0 then + words[#words+1] = words_numbers[n] + end + words[#words+1] = words_tens[tonumber(string.sub(numstr, -i-1, -i-1))] + elseif n > 0 then + words[#words+1] = num + end + i = i + 2 -- skip over the ten's place, since we already handled it. + elseif i/3 == math.floor(i/3) then -- it's a hundred's digit + local h = string.sub(numstr, -i, -i) + if h ~= "0" then -- we should only print "hundred" if the hundreds place is non-zero + words[#words+1] = words_magnitudes[1] + words[#words+1] = words_numbers[tonumber(h)] + end + i = i + 1 + end + if i > numlen then break end + if tonumber(string.sub(numstr, -i-2, -i)) ~= 0 then -- the magnitude is non-zero + if i == 4 then + words[#words+1] = words_magnitudes[2] -- thousand + elseif i == 7 then + words[#words+1] = words_magnitudes[3] -- million + end + end + end + + local w = {} + for i = #words, 1, -1 do + w[#w+1] = words[i] + end + + return table.concat(w, " ") +end + +function minislots.generate_paytable_form(def) + local t = {} + t[1] = "size[10.7,10.4]background[-0.14,-0.17;11,11;"..def.constants.paytablescrnbg.."]".. + "image_button_exit[10.25,-0.1;0.55,0.5;"..def.constants.button_close..";close;]" + + local y = def.geometry.paytable_posy + local sympadding = 0.05 + local column = def.geometry.paytable_column1 + + if def.paytable_desc then + for _, line in ipairs(def.paytable_desc) do + if line == "@wrap" then + column = def.geometry.paytable_column2 + y = def.geometry.paytable_posy + else + local x = column + for _, item in ipairs(line) do + if string.sub(item, 1, 1) == "@" then + if item == "@X" then + t[#t+1] = "image["..(x*horizscale)..","..(y*vertscale)..";".. + def.geometry.paytable_lineheight..","..def.geometry.paytable_lineheight.. + ";"..def.constants.emptyimg.."]" + else + local sym = string.sub(item, 2) + local sympos = def.constants.symlookup["sym_"..sym] * -def.constants.reelsymsizey - (def.constants.reelsymsizey - def.constants.reelsymsizex)/2 + t[#t+1] = "image["..(x*horizscale)..","..(y*vertscale)..";".. + (def.geometry.paytable_lineheight-sympadding)..",".. + (def.geometry.paytable_lineheight-sympadding)..";".. + "[combine:"..def.constants.reelsymsizex.."x"..def.constants.reelsymsizex.. + ":0\\,"..sympos.."="..def.constants.symbolsstopped.."]" + end + x = x + def.geometry.paytable_lineheight + else + local szx = minislots.str_width_pix(item, "regular")*pix2iu*def.geometry.paytable_textheight + t[#t+1] = minislots.print_string(def, item, x*horizscale, (y+def.geometry.paytable_textshift)*vertscale, szx, def.geometry.paytable_textheight, "regular", true) + x = x + szx + end + end + end + y = y + def.geometry.paytable_lineheight + end + end + t[#t+1] = def.constants.button_showpaylines + return table.concat(t) +end + +function minislots.generate_paylines_form(def) + local t = {} + local height = 10.4 + t[1] = "size[10.7,"..height.."]background[-0.14,-0.17;11,11;"..def.constants.paylinescrnbg.."]".. + "image_button_exit[10.25,-0.1;0.55,0.5;"..def.constants.button_close..";close;]" + if def.paylines_desc then + + local x = def.geometry.paylines_column1 + local y = def.geometry.paylines_posy + local maxy = def.geometry.paylines_posy + + for _, item in ipairs(def.paylines_desc) do + if item == "@wrap" then + y = def.geometry.paylines_posy + x = def.geometry.paylines_column2 + elseif string.sub(item, 1, 1) == "@" then + local split = string.find(item, " ") + local s = tonumber(string.sub(item, 2, split)) + local e = tonumber(string.sub(item, split)) + t[#t+1] = "image["..x*horizscale..","..y*vertscale..";".. + def.geometry.paylines_sizex..","..def.geometry.paylines_sizey..";".. + def.constants.lines_bg.."]" + + for l = s, e do + t[#t+1] = "image["..x*horizscale..","..y*vertscale..";".. + def.geometry.paylines_sizex..","..def.geometry.paylines_sizey..";".. + def.constants.overlaylinepref..l..".png]" + end + y = y + def.geometry.paylines_sizey + def.geometry.paylines_img_padding + else + local szx = minislots.str_width_pix(item, "regular")*pix2iu*def.geometry.paylines_textheight + t[#t+1] = minislots.print_string(def, item, x*horizscale, y*vertscale, szx, def.geometry.paylines_textheight, "regular", true) + y = y + def.geometry.paylines_lineheight + end + + if y > height then + y = def.geometry.paylines_posy + x = def.geometry.paylines_column2 + end + end + end + t[#t+1] = def.constants.button_showpaytable + return table.concat(t) +end + +function minislots.generate_admin_form(def, pos, balance) + local meta = minetest.get_meta(pos) + local casino = meta:get_string("casino_name") + + local money_in = meta:get_int("money_in") + local money_out = meta:get_int("money_out") + local total_bets = meta:get_int("total_bets") + local total_wins = meta:get_int("total_wins") + local spin_count = meta:get_int("spin_count") + local scatter_hits = meta:get_int("scatter_hits") + local bonus_hits = meta:get_int("bonus_hits") + local install_date = meta:get_string("install_date") + + local pay_percent = 0 + if total_bets > 0 then pay_percent = math.floor((total_wins/total_bets+0.0005)*1000)/10 end + + local balancestr = "Current Balance: "..balance.." Mg" + local money_instr = "Money in: "..money_in.." Mg" + local money_outstr = "Money out: "..money_out.." Mg" + local total_betsstr = "Total bets: "..total_bets.." Mg" + local total_winsstr = "Total wins: "..total_wins.." Mg" + local percent_str = "Payout percentage: "..pay_percent.."%" + local spin_countstr = "Spin count: "..spin_count + local scatter_hitsstr = "Scatter wins (count): "..scatter_hits + local bonus_hitsstr = "Bonus wins (count): "..bonus_hits + local install_datestr = "Install Date: "..install_date + local cstr = "Casino name:" + + local sizey = 0.23 + + local balw = minislots.str_width_pix(balancestr, "regular")*pix2iu*sizey + local miw = minislots.str_width_pix(money_instr, "regular")*pix2iu*sizey + local mow = minislots.str_width_pix(money_outstr, "regular")*pix2iu*sizey + local tbw = minislots.str_width_pix(total_betsstr, "regular")*pix2iu*sizey + local tww = minislots.str_width_pix(total_winsstr, "regular")*pix2iu*sizey + local pctw = minislots.str_width_pix(percent_str, "regular")*pix2iu*sizey + local spcw = minislots.str_width_pix(spin_countstr, "regular")*pix2iu*sizey + local sccw = minislots.str_width_pix(scatter_hitsstr, "regular")*pix2iu*sizey + local bcw = minislots.str_width_pix(bonus_hitsstr, "regular")*pix2iu*sizey + local idw = minislots.str_width_pix(install_datestr, "regular")*pix2iu*sizey + local cnw = minislots.str_width_pix(cstr, "regular")*pix2iu*sizey + + local formspec = + "size[6,4.5]".. + "image_button_exit[5.65,-0.2;0.55,0.5;"..def.constants.button_close..";close;]".. + minislots.print_string(def, "Admin/configuration", 0.85, -0.15, 5, 0.4, "bold", true).. + minislots.print_string(def, balancestr, 0, 0.5, balw, sizey, "regular", true).. + minislots.print_string(def, money_instr, 0, 0.8, miw, sizey, "regular", true).. + minislots.print_string(def, money_outstr, 0, 1.1, mow, sizey, "regular", true).. + minislots.print_string(def, total_betsstr, 0, 1.4, tbw, sizey, "regular", true).. + minislots.print_string(def, total_winsstr, 0, 1.7, tww, sizey, "regular", true).. + minislots.print_string(def, percent_str, 0, 2, pctw, sizey, "regular", true).. + minislots.print_string(def, spin_countstr, 0, 2.3, spcw, sizey, "regular", true).. + minislots.print_string(def, scatter_hitsstr, 0, 2.6, sccw, sizey, "regular", true).. + minislots.print_string(def, bonus_hitsstr, 0, 2.9, bcw, sizey, "regular", true).. + minislots.print_string(def, install_datestr, 0, 3.2, idw, sizey, "regular", true).. + minislots.print_string(def, cstr, 1, 3.7, cnw, sizey, "regular", true).. + + "field[1.3,3.4;4,3;casino_input;;"..casino.."]".. + "field_close_on_enter[casino_input;true]" + return formspec +end + +function minislots.generate_cashslot_form(def, pos, balance) + local spos = pos.x .. "," .. pos.y .. "," ..pos.z + local formspec = + "size[8,7]".. + "background[-0.2,-0.25;8.4,7.74;"..def.constants.cashslotscrnbg.."]".. + "image_button_exit[7.55,-0.1;0.55,0.5;"..def.constants.button_close..";close;]".. + "list[nodemeta:".. spos .. ";main;3.5,1;1,1;]".. + "label[2.5,-0.25;Insert money into the space below.]".. + "label[2.2,0;When you're done, close this screen, then]".. + "label[2.2,0.25;go back to the machine to continue playing.]".. + "label[2.5,0.5;The machine's balance is: "..balance.." Mg]".. + "image["..def.geometry.cash_slot_cin_posx..","..def.geometry.cash_slot_cin_posy..";".. + def.geometry.cash_slot_sizex..","..def.geometry.cash_slot_sizey..";".. + def.constants.basename.."cash_slot.png]".. + "list[current_player;main;0,3.28;8,4;]".. + "listring[]" + return formspec +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if string.find(formname, "minislots:") then + + local player_name = player:get_player_name() + local def = minislots.player_last_machine_def[player_name] + local pos = minislots.player_last_machine_pos[player_name] + local meta + if pos then meta = minetest.get_meta(pos) end + + if fields.close and (formname == "minislots:cash_intake" + or formname == "minislots:help_screen") then + minetest.close_formspec(player_name, formname) + elseif fields.showpaylines and formname == "minislots:help_screen" then + if not def then + minetest.show_formspec(player_name, "minislots:update_form", minislots.generate_too_old_screen()) + return + end + minetest.show_formspec(player_name, "minislots:help_screen", + minislots.generate_paylines_form(minislots.player_last_machine_def[player_name])) + elseif fields.showpaytable and formname == "minislots:help_screen" then + if not def then + minetest.show_formspec(player_name, "minislots:update_form", minislots.generate_too_old_screen()) + return + end + minetest.show_formspec(player_name, "minislots:help_screen", + minislots.generate_paytable_form(minislots.player_last_machine_def[player_name])) + elseif fields.key_enter_field and fields.key_enter_field == fields.key_enter_field then + if not def then + minetest.show_formspec(player_name, "minislots:update_form", minislots.generate_too_old_screen()) + return + end + if def and pos and meta and meta:get_string("owner") == player_name then + meta:set_string("formspec", "") + meta:set_string("casino_name", minetest.formspec_escape(fields.casino_input)) + end + elseif (fields.close or fields.quit) and formname == "minislots:admin_form" then + if not def then + minetest.show_formspec(player_name, "minislots:update_form", minislots.generate_too_old_screen()) + return + end + if def and pos and meta and meta:get_string("owner") == player_name then + meta:set_string("formspec", "") + end + end + end +end) + +function minislots.generate_too_old_screen() + local form = "size[4,1]".. + "image_button_exit[3.65,-0.2;0.55,0.5;minislots_close_button.png;close;]".. + "label[0.32,0.2;Sorry, your client is too old to]".. + "label[0.15,0.5;show this screen. Please update.]" + return form +end + +print("[Minislots] Loaded!") diff --git a/mods/minislots/minislots_engine/init.lua b/mods/minislots/minislots_engine/init.lua new file mode 100644 index 00000000..d3be008b --- /dev/null +++ b/mods/minislots/minislots_engine/init.lua @@ -0,0 +1,8 @@ +-- Minislots game engine + +minislots = {} + +minislots.modpath = minetest.get_modpath(minetest.get_current_modname()) +local machinelist = minetest.get_dir_list(minislots.modpath.."/machines", true) + +dofile(minislots.modpath.."/engine.lua") diff --git a/mods/minislots/minislots_engine/models/minislots_generic_machine_upright.obj b/mods/minislots/minislots_engine/models/minislots_generic_machine_upright.obj new file mode 100644 index 00000000..2ac02e5b --- /dev/null +++ b/mods/minislots/minislots_engine/models/minislots_generic_machine_upright.obj @@ -0,0 +1,63 @@ +# Blender v2.79 (sub 0) OBJ File: 'minislots generic model console.blend' +# www.blender.org +o Cube +v 0.484375 -0.500000 -0.437500 +v 0.484375 1.500000 -0.125000 +v 0.484375 -0.500000 0.500000 +v 0.484375 1.500000 0.500000 +v -0.484375 -0.500000 -0.437500 +v -0.484375 1.500000 -0.125000 +v -0.484375 -0.500000 0.500000 +v -0.484375 1.500000 0.500000 +v 0.484375 0.562500 -0.437500 +v -0.484375 0.562500 -0.437500 +v 0.484375 0.625000 -0.125000 +v -0.484375 0.625000 -0.125000 +vt 0.500000 0.250000 +vt 0.500000 0.750000 +vt 0.250000 0.750000 +vt 0.250000 0.250000 +vt 1.000000 0.539062 +vt 1.000000 0.750000 +vt 0.750000 0.750000 +vt 0.750000 0.539062 +vt 0.500000 -0.000000 +vt 0.750000 0.000000 +vt 0.750000 0.250000 +vt 0.500000 1.000000 +vt 0.671875 0.750000 +vt 0.671875 1.000000 +vt 1.000000 0.250000 +vt 1.000000 0.500000 +vt 0.750000 0.500000 +vt 0.253906 0.750000 +vt 0.078125 0.750000 +vt 0.078125 0.531250 +vt 0.671875 0.531250 +vt -0.000000 0.515625 +vt 0.000000 0.250000 +vt 0.253906 0.250000 +vt 0.750000 0.515625 +vn 0.0000 0.0000 1.0000 +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.9806 -0.1961 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +g Cube_Cube_Material +s off +f 3/1/1 4/2/1 8/3/1 7/4/1 +f 12/5/2 6/6/2 2/7/2 11/8/2 +f 3/1/3 7/9/3 5/10/3 1/11/3 +f 8/12/4 4/2/4 2/13/4 6/14/4 +f 5/15/2 10/16/2 9/17/2 1/11/2 +f 10/16/5 12/5/5 11/8/5 9/17/5 +f 8/18/6 6/19/6 12/20/6 +f 11/21/7 2/13/7 4/2/7 +f 10/22/6 5/23/6 12/20/6 +f 5/23/6 7/24/6 12/20/6 +f 7/24/6 8/18/6 12/20/6 +f 4/2/7 3/1/7 11/21/7 +f 3/1/7 1/11/7 11/21/7 +f 1/11/7 9/25/7 11/21/7 diff --git a/mods/minislots/minislots_engine/textures/minislots_blue_img.png b/mods/minislots/minislots_engine/textures/minislots_blue_img.png new file mode 100644 index 00000000..827aa3a7 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_blue_img.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_button_admin.png b/mods/minislots/minislots_engine/textures/minislots_button_admin.png new file mode 100644 index 00000000..e78a3cd8 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_button_admin.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_cashout_ticket.png b/mods/minislots/minislots_engine/textures/minislots_cashout_ticket.png new file mode 100644 index 00000000..ee64f4f7 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_cashout_ticket.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_close_button.png b/mods/minislots/minislots_engine/textures/minislots_close_button.png new file mode 100644 index 00000000..0c57b122 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_close_button.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_empty_img.png b/mods/minislots/minislots_engine/textures/minislots_empty_img.png new file mode 100644 index 00000000..f721dcb3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_empty_img.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_100.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_100.png new file mode 100644 index 00000000..2cdab53d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_100.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_101.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_101.png new file mode 100644 index 00000000..72694cc1 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_101.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_102.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_102.png new file mode 100644 index 00000000..a217aaec Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_102.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_103.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_103.png new file mode 100644 index 00000000..239787e3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_103.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_104.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_104.png new file mode 100644 index 00000000..1e63bf42 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_104.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_105.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_105.png new file mode 100644 index 00000000..0703f329 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_105.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_106.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_106.png new file mode 100644 index 00000000..1212a2dc Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_106.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_107.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_107.png new file mode 100644 index 00000000..0a968bd6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_107.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_108.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_108.png new file mode 100644 index 00000000..4a926522 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_108.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_109.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_109.png new file mode 100644 index 00000000..3987345d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_109.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_110.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_110.png new file mode 100644 index 00000000..d8ea8d16 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_110.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_111.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_111.png new file mode 100644 index 00000000..39e32902 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_111.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_112.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_112.png new file mode 100644 index 00000000..ab8d9ca0 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_112.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_113.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_113.png new file mode 100644 index 00000000..82cbf336 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_113.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_114.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_114.png new file mode 100644 index 00000000..81dbb152 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_114.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_115.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_115.png new file mode 100644 index 00000000..ab41f1c9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_115.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_116.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_116.png new file mode 100644 index 00000000..4ef4063a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_116.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_117.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_117.png new file mode 100644 index 00000000..7dcef7e3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_117.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_118.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_118.png new file mode 100644 index 00000000..6a0f67be Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_118.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_119.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_119.png new file mode 100644 index 00000000..aa96d998 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_119.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_120.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_120.png new file mode 100644 index 00000000..cb882bb9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_120.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_121.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_121.png new file mode 100644 index 00000000..ef93de74 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_121.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_122.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_122.png new file mode 100644 index 00000000..96a788b9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_122.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_123.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_123.png new file mode 100644 index 00000000..98f82736 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_123.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_124.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_124.png new file mode 100644 index 00000000..276d307e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_124.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_125.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_125.png new file mode 100644 index 00000000..a93509e4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_125.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_126.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_126.png new file mode 100644 index 00000000..e3000920 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_126.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_127.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_127.png new file mode 100644 index 00000000..3bd7180d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_127.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_32.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_32.png new file mode 100644 index 00000000..c49169c9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_32.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_33.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_33.png new file mode 100644 index 00000000..9e324f3f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_33.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_34.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_34.png new file mode 100644 index 00000000..33746cae Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_34.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_35.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_35.png new file mode 100644 index 00000000..4153bc09 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_35.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_36.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_36.png new file mode 100644 index 00000000..987b71e6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_36.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_37.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_37.png new file mode 100644 index 00000000..57d42087 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_37.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_38.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_38.png new file mode 100644 index 00000000..b4b8057e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_38.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_39.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_39.png new file mode 100644 index 00000000..285ad767 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_39.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_40.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_40.png new file mode 100644 index 00000000..de0471c8 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_40.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_41.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_41.png new file mode 100644 index 00000000..b12c6817 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_41.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_42.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_42.png new file mode 100644 index 00000000..e6858158 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_42.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_43.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_43.png new file mode 100644 index 00000000..e8358af9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_43.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_44.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_44.png new file mode 100644 index 00000000..4cbcf32d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_44.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_45.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_45.png new file mode 100644 index 00000000..b671fa60 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_45.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_46.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_46.png new file mode 100644 index 00000000..4e22d4ca Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_46.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_47.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_47.png new file mode 100644 index 00000000..bc3bf415 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_47.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_48.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_48.png new file mode 100644 index 00000000..de3574c6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_48.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_49.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_49.png new file mode 100644 index 00000000..e2f0e1ac Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_49.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_50.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_50.png new file mode 100644 index 00000000..73c0842b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_50.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_51.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_51.png new file mode 100644 index 00000000..eb90aef4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_51.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_52.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_52.png new file mode 100644 index 00000000..f0bfffa0 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_52.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_53.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_53.png new file mode 100644 index 00000000..ca91ede2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_53.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_54.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_54.png new file mode 100644 index 00000000..0acb8bff Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_54.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_55.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_55.png new file mode 100644 index 00000000..a3e4ec55 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_55.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_56.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_56.png new file mode 100644 index 00000000..36764e89 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_56.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_57.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_57.png new file mode 100644 index 00000000..d98ad776 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_57.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_58.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_58.png new file mode 100644 index 00000000..81628085 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_58.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_59.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_59.png new file mode 100644 index 00000000..bb097db4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_59.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_60.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_60.png new file mode 100644 index 00000000..b3ac3139 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_60.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_61.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_61.png new file mode 100644 index 00000000..2d2b2b29 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_61.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_62.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_62.png new file mode 100644 index 00000000..dacf185e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_62.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_63.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_63.png new file mode 100644 index 00000000..44a16b1b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_63.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_64.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_64.png new file mode 100644 index 00000000..774dc7b5 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_64.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_65.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_65.png new file mode 100644 index 00000000..e72d4b0e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_65.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_66.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_66.png new file mode 100644 index 00000000..fb5ea5fe Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_66.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_67.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_67.png new file mode 100644 index 00000000..726cfa48 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_67.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_68.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_68.png new file mode 100644 index 00000000..029f7515 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_68.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_69.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_69.png new file mode 100644 index 00000000..7499faa8 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_69.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_70.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_70.png new file mode 100644 index 00000000..c9294d64 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_70.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_71.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_71.png new file mode 100644 index 00000000..c3563969 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_71.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_72.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_72.png new file mode 100644 index 00000000..0e53ce8a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_72.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_73.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_73.png new file mode 100644 index 00000000..40b2aef8 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_73.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_74.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_74.png new file mode 100644 index 00000000..59a63421 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_74.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_75.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_75.png new file mode 100644 index 00000000..f40e222c Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_75.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_76.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_76.png new file mode 100644 index 00000000..2e9ec4bb Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_76.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_77.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_77.png new file mode 100644 index 00000000..bfdeb222 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_77.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_78.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_78.png new file mode 100644 index 00000000..68912f6b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_78.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_79.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_79.png new file mode 100644 index 00000000..5150f480 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_79.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_80.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_80.png new file mode 100644 index 00000000..84af0516 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_80.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_81.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_81.png new file mode 100644 index 00000000..2aaf5ce1 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_81.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_82.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_82.png new file mode 100644 index 00000000..92c404eb Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_82.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_83.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_83.png new file mode 100644 index 00000000..ecf2b59d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_83.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_84.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_84.png new file mode 100644 index 00000000..7f9e684a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_84.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_85.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_85.png new file mode 100644 index 00000000..80b1c61f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_85.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_86.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_86.png new file mode 100644 index 00000000..188ee074 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_86.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_87.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_87.png new file mode 100644 index 00000000..3679703d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_87.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_88.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_88.png new file mode 100644 index 00000000..32fbe193 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_88.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_89.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_89.png new file mode 100644 index 00000000..3b950abf Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_89.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_90.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_90.png new file mode 100644 index 00000000..e7327212 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_90.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_91.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_91.png new file mode 100644 index 00000000..56c69d3d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_91.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_92.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_92.png new file mode 100644 index 00000000..70662b30 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_92.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_93.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_93.png new file mode 100644 index 00000000..96fe8eee Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_93.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_94.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_94.png new file mode 100644 index 00000000..3c0d5192 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_94.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_95.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_95.png new file mode 100644 index 00000000..5caa7984 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_95.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_96.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_96.png new file mode 100644 index 00000000..7c9d07be Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_96.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_97.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_97.png new file mode 100644 index 00000000..6b4c1b35 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_97.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_98.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_98.png new file mode 100644 index 00000000..322bfd4e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_98.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_bold_char_99.png b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_99.png new file mode 100644 index 00000000..311a4218 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_bold_char_99.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_100.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_100.png new file mode 100644 index 00000000..15402057 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_100.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_101.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_101.png new file mode 100644 index 00000000..505a525c Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_101.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_102.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_102.png new file mode 100644 index 00000000..2ecd6438 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_102.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_103.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_103.png new file mode 100644 index 00000000..da228a7d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_103.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_104.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_104.png new file mode 100644 index 00000000..2b8df95c Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_104.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_105.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_105.png new file mode 100644 index 00000000..d5bb5fad Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_105.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_106.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_106.png new file mode 100644 index 00000000..9d971271 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_106.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_107.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_107.png new file mode 100644 index 00000000..c7102519 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_107.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_108.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_108.png new file mode 100644 index 00000000..745617cb Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_108.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_109.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_109.png new file mode 100644 index 00000000..a180f959 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_109.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_110.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_110.png new file mode 100644 index 00000000..f56ca6de Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_110.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_111.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_111.png new file mode 100644 index 00000000..6d6a67f2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_111.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_112.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_112.png new file mode 100644 index 00000000..4b045359 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_112.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_113.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_113.png new file mode 100644 index 00000000..fe70097d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_113.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_114.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_114.png new file mode 100644 index 00000000..11a11303 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_114.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_115.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_115.png new file mode 100644 index 00000000..fda8586b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_115.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_116.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_116.png new file mode 100644 index 00000000..1d8cd183 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_116.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_117.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_117.png new file mode 100644 index 00000000..79732050 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_117.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_118.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_118.png new file mode 100644 index 00000000..0adc3870 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_118.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_119.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_119.png new file mode 100644 index 00000000..6c323475 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_119.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_120.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_120.png new file mode 100644 index 00000000..94bdc98e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_120.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_121.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_121.png new file mode 100644 index 00000000..20042692 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_121.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_122.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_122.png new file mode 100644 index 00000000..ed16c1be Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_122.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_123.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_123.png new file mode 100644 index 00000000..52095c2d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_123.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_124.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_124.png new file mode 100644 index 00000000..b8c1e9aa Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_124.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_125.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_125.png new file mode 100644 index 00000000..5b4ea437 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_125.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_126.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_126.png new file mode 100644 index 00000000..8873af19 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_126.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_127.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_127.png new file mode 100644 index 00000000..69dcb6be Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_127.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_32.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_32.png new file mode 100644 index 00000000..8fffabfc Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_32.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_33.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_33.png new file mode 100644 index 00000000..3939d6c5 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_33.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_34.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_34.png new file mode 100644 index 00000000..d4959ea9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_34.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_35.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_35.png new file mode 100644 index 00000000..45d4635b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_35.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_36.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_36.png new file mode 100644 index 00000000..f712151e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_36.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_37.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_37.png new file mode 100644 index 00000000..4de2deba Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_37.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_38.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_38.png new file mode 100644 index 00000000..e7c32cef Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_38.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_39.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_39.png new file mode 100644 index 00000000..6dbab9d2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_39.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_40.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_40.png new file mode 100644 index 00000000..b5d78f7a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_40.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_41.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_41.png new file mode 100644 index 00000000..62a2d149 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_41.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_42.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_42.png new file mode 100644 index 00000000..028095aa Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_42.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_43.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_43.png new file mode 100644 index 00000000..1808826b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_43.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_44.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_44.png new file mode 100644 index 00000000..b5280d3b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_44.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_45.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_45.png new file mode 100644 index 00000000..79d673f6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_45.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_46.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_46.png new file mode 100644 index 00000000..1400c2a7 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_46.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_47.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_47.png new file mode 100644 index 00000000..1d2c81c1 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_47.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_48.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_48.png new file mode 100644 index 00000000..bf8b8d78 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_48.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_49.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_49.png new file mode 100644 index 00000000..5dc41b19 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_49.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_50.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_50.png new file mode 100644 index 00000000..2e18797f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_50.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_51.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_51.png new file mode 100644 index 00000000..12405e15 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_51.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_52.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_52.png new file mode 100644 index 00000000..2ede1a6f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_52.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_53.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_53.png new file mode 100644 index 00000000..4cbae19e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_53.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_54.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_54.png new file mode 100644 index 00000000..e3997de4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_54.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_55.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_55.png new file mode 100644 index 00000000..2e1f1fad Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_55.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_56.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_56.png new file mode 100644 index 00000000..f8747c30 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_56.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_57.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_57.png new file mode 100644 index 00000000..1e53c290 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_57.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_58.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_58.png new file mode 100644 index 00000000..f7546296 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_58.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_59.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_59.png new file mode 100644 index 00000000..103054eb Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_59.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_60.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_60.png new file mode 100644 index 00000000..980b402f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_60.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_61.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_61.png new file mode 100644 index 00000000..4d92bb75 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_61.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_62.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_62.png new file mode 100644 index 00000000..295150a6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_62.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_63.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_63.png new file mode 100644 index 00000000..f4d5999b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_63.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_64.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_64.png new file mode 100644 index 00000000..3bd45374 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_64.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_65.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_65.png new file mode 100644 index 00000000..0b351455 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_65.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_66.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_66.png new file mode 100644 index 00000000..05bbc6d3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_66.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_67.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_67.png new file mode 100644 index 00000000..3e9b0f8a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_67.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_68.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_68.png new file mode 100644 index 00000000..ec62e904 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_68.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_69.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_69.png new file mode 100644 index 00000000..b6d33466 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_69.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_70.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_70.png new file mode 100644 index 00000000..703ed6fc Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_70.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_71.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_71.png new file mode 100644 index 00000000..da30b37d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_71.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_72.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_72.png new file mode 100644 index 00000000..f2d216b5 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_72.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_73.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_73.png new file mode 100644 index 00000000..58e1409a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_73.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_74.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_74.png new file mode 100644 index 00000000..045df64f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_74.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_75.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_75.png new file mode 100644 index 00000000..a8a6a922 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_75.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_76.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_76.png new file mode 100644 index 00000000..04ef74eb Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_76.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_77.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_77.png new file mode 100644 index 00000000..13c444e3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_77.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_78.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_78.png new file mode 100644 index 00000000..dddd5e01 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_78.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_79.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_79.png new file mode 100644 index 00000000..a2945582 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_79.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_80.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_80.png new file mode 100644 index 00000000..87428381 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_80.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_81.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_81.png new file mode 100644 index 00000000..779a6fbb Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_81.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_82.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_82.png new file mode 100644 index 00000000..6084c9cc Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_82.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_83.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_83.png new file mode 100644 index 00000000..639ffed3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_83.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_84.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_84.png new file mode 100644 index 00000000..e7f83d46 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_84.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_85.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_85.png new file mode 100644 index 00000000..0c0ca0aa Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_85.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_86.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_86.png new file mode 100644 index 00000000..bc75b41a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_86.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_87.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_87.png new file mode 100644 index 00000000..21fb0883 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_87.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_88.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_88.png new file mode 100644 index 00000000..bc27d105 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_88.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_89.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_89.png new file mode 100644 index 00000000..e35a89c9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_89.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_90.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_90.png new file mode 100644 index 00000000..8016d6bb Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_90.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_91.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_91.png new file mode 100644 index 00000000..d0b20b67 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_91.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_92.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_92.png new file mode 100644 index 00000000..4fe74343 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_92.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_93.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_93.png new file mode 100644 index 00000000..a5e77cef Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_93.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_94.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_94.png new file mode 100644 index 00000000..fdefbd17 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_94.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_95.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_95.png new file mode 100644 index 00000000..6c8e4ced Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_95.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_96.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_96.png new file mode 100644 index 00000000..b3ff61bd Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_96.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_97.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_97.png new file mode 100644 index 00000000..837661e4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_97.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_98.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_98.png new file mode 100644 index 00000000..d5c75f91 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_98.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_99.png b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_99.png new file mode 100644 index 00000000..3cb62d66 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_condensed_char_99.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_100.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_100.png new file mode 100644 index 00000000..71b6a7ca Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_100.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_101.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_101.png new file mode 100644 index 00000000..8af69823 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_101.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_102.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_102.png new file mode 100644 index 00000000..321db7cf Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_102.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_103.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_103.png new file mode 100644 index 00000000..09f11c06 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_103.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_104.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_104.png new file mode 100644 index 00000000..2a7cca3c Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_104.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_105.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_105.png new file mode 100644 index 00000000..aa4d44e7 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_105.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_106.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_106.png new file mode 100644 index 00000000..3c363dab Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_106.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_107.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_107.png new file mode 100644 index 00000000..725b4a3f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_107.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_108.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_108.png new file mode 100644 index 00000000..733cfde2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_108.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_109.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_109.png new file mode 100644 index 00000000..0a02110e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_109.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_110.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_110.png new file mode 100644 index 00000000..efc296fa Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_110.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_111.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_111.png new file mode 100644 index 00000000..40b9746b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_111.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_112.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_112.png new file mode 100644 index 00000000..f97a9728 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_112.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_113.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_113.png new file mode 100644 index 00000000..5d107559 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_113.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_114.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_114.png new file mode 100644 index 00000000..34b8a9f2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_114.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_115.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_115.png new file mode 100644 index 00000000..e511851f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_115.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_116.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_116.png new file mode 100644 index 00000000..8eac4a80 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_116.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_117.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_117.png new file mode 100644 index 00000000..5220ccf9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_117.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_118.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_118.png new file mode 100644 index 00000000..e4233e32 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_118.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_119.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_119.png new file mode 100644 index 00000000..b3851fe4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_119.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_120.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_120.png new file mode 100644 index 00000000..0c90cb16 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_120.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_121.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_121.png new file mode 100644 index 00000000..4ede4156 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_121.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_122.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_122.png new file mode 100644 index 00000000..1e086ef6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_122.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_123.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_123.png new file mode 100644 index 00000000..ee1cb8ee Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_123.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_124.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_124.png new file mode 100644 index 00000000..0eb2a9e5 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_124.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_125.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_125.png new file mode 100644 index 00000000..09ab2187 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_125.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_126.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_126.png new file mode 100644 index 00000000..f01ec978 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_126.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_127.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_127.png new file mode 100644 index 00000000..50762b72 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_127.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_32.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_32.png new file mode 100644 index 00000000..aa35d6b4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_32.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_33.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_33.png new file mode 100644 index 00000000..12cbae43 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_33.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_34.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_34.png new file mode 100644 index 00000000..c90fa4e3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_34.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_35.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_35.png new file mode 100644 index 00000000..8c6e08ed Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_35.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_36.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_36.png new file mode 100644 index 00000000..6489e6ad Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_36.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_37.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_37.png new file mode 100644 index 00000000..96f47a35 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_37.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_38.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_38.png new file mode 100644 index 00000000..56840cb2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_38.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_39.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_39.png new file mode 100644 index 00000000..72c6bd34 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_39.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_40.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_40.png new file mode 100644 index 00000000..8129fb59 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_40.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_41.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_41.png new file mode 100644 index 00000000..4177dbf4 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_41.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_42.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_42.png new file mode 100644 index 00000000..ab1441b2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_42.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_43.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_43.png new file mode 100644 index 00000000..95ee69f8 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_43.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_44.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_44.png new file mode 100644 index 00000000..9027536f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_44.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_45.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_45.png new file mode 100644 index 00000000..d58f2459 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_45.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_46.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_46.png new file mode 100644 index 00000000..3680c067 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_46.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_47.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_47.png new file mode 100644 index 00000000..7b4c980b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_47.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_48.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_48.png new file mode 100644 index 00000000..562b1318 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_48.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_49.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_49.png new file mode 100644 index 00000000..4c8c9d29 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_49.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_50.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_50.png new file mode 100644 index 00000000..8a13230f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_50.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_51.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_51.png new file mode 100644 index 00000000..86822a41 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_51.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_52.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_52.png new file mode 100644 index 00000000..8d28bb1c Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_52.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_53.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_53.png new file mode 100644 index 00000000..e93209b3 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_53.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_54.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_54.png new file mode 100644 index 00000000..6fdfc507 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_54.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_55.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_55.png new file mode 100644 index 00000000..f872993d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_55.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_56.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_56.png new file mode 100644 index 00000000..968e9197 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_56.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_57.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_57.png new file mode 100644 index 00000000..77b0483a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_57.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_58.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_58.png new file mode 100644 index 00000000..edbc405b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_58.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_59.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_59.png new file mode 100644 index 00000000..e3298721 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_59.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_60.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_60.png new file mode 100644 index 00000000..5329759e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_60.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_61.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_61.png new file mode 100644 index 00000000..d42c4019 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_61.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_62.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_62.png new file mode 100644 index 00000000..83988cd6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_62.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_63.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_63.png new file mode 100644 index 00000000..279e8a25 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_63.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_64.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_64.png new file mode 100644 index 00000000..31cbde70 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_64.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_65.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_65.png new file mode 100644 index 00000000..773543e2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_65.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_66.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_66.png new file mode 100644 index 00000000..d6771d73 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_66.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_67.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_67.png new file mode 100644 index 00000000..77217e2d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_67.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_68.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_68.png new file mode 100644 index 00000000..3a3c652e Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_68.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_69.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_69.png new file mode 100644 index 00000000..8f51a7b9 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_69.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_70.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_70.png new file mode 100644 index 00000000..e08ed75b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_70.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_71.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_71.png new file mode 100644 index 00000000..ea02dc9b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_71.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_72.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_72.png new file mode 100644 index 00000000..8ea1ba9d Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_72.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_73.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_73.png new file mode 100644 index 00000000..c22d23e2 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_73.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_74.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_74.png new file mode 100644 index 00000000..f8be8bf7 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_74.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_75.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_75.png new file mode 100644 index 00000000..e2bc5dfd Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_75.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_76.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_76.png new file mode 100644 index 00000000..8408874b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_76.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_77.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_77.png new file mode 100644 index 00000000..599d8a70 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_77.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_78.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_78.png new file mode 100644 index 00000000..58c77a82 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_78.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_79.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_79.png new file mode 100644 index 00000000..bf8921c0 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_79.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_80.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_80.png new file mode 100644 index 00000000..15314af6 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_80.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_81.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_81.png new file mode 100644 index 00000000..2189314b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_81.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_82.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_82.png new file mode 100644 index 00000000..4c4a6717 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_82.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_83.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_83.png new file mode 100644 index 00000000..7241ae0a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_83.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_84.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_84.png new file mode 100644 index 00000000..05d052ec Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_84.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_85.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_85.png new file mode 100644 index 00000000..5f6055df Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_85.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_86.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_86.png new file mode 100644 index 00000000..89b77c6b Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_86.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_87.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_87.png new file mode 100644 index 00000000..813738bf Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_87.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_88.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_88.png new file mode 100644 index 00000000..d5a35810 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_88.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_89.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_89.png new file mode 100644 index 00000000..c597f42f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_89.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_90.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_90.png new file mode 100644 index 00000000..475f7249 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_90.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_91.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_91.png new file mode 100644 index 00000000..f28bc077 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_91.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_92.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_92.png new file mode 100644 index 00000000..c63cdbea Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_92.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_93.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_93.png new file mode 100644 index 00000000..5968bf41 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_93.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_94.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_94.png new file mode 100644 index 00000000..a11f355a Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_94.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_95.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_95.png new file mode 100644 index 00000000..986e4835 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_95.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_96.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_96.png new file mode 100644 index 00000000..eb07a6ef Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_96.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_97.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_97.png new file mode 100644 index 00000000..1f77a676 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_97.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_98.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_98.png new file mode 100644 index 00000000..3b41822f Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_98.png differ diff --git a/mods/minislots/minislots_engine/textures/minislots_font_regular_char_99.png b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_99.png new file mode 100644 index 00000000..a7cee695 Binary files /dev/null and b/mods/minislots/minislots_engine/textures/minislots_font_regular_char_99.png differ diff --git a/mods/minislots/minislots_golden7s/depends.txt b/mods/minislots/minislots_golden7s/depends.txt new file mode 100644 index 00000000..3628f79c --- /dev/null +++ b/mods/minislots/minislots_golden7s/depends.txt @@ -0,0 +1 @@ +minislots_engine diff --git a/mods/minislots/minislots_golden7s/init.lua b/mods/minislots/minislots_golden7s/init.lua new file mode 100644 index 00000000..0fb2b59c --- /dev/null +++ b/mods/minislots/minislots_golden7s/init.lua @@ -0,0 +1,211 @@ + +-- Golden 7's example machine +-- +-- By Vanessa "VanessaE" Dannenberg +-- +-- Most symbol images taken from clker.com +-- others drawn or rendered by me. + +minislots.register_machine({ + name = "golden7s", -- becomes the node name e.g. "minislots:golden7s" + description = "Golden 7's slot machine", + machine_shape = "upright", + lines = { -- reel symbol pay line positions: 0 = center, -1 = top, +1 = bottom + { 0, 0, 0 }, -- pay line 1: center symbol on each reel + { -1, -1, -1 }, -- pay line 2: top symbol on each reel + { 1, 1, 1 }, -- pay line 3: bottom symbol on each reel + { -1, 0, 1 }, -- pay line 4: top of reel 1, center of 2, bottom of 3 + { 1, 0, -1 }, + { -1, -1, 0 }, + { 1, 1, 0 }, + { 0, -1, -1 }, + { 0, 1, 1 } + }, + symbols = { -- must be in the same order as the symbols in the reel image + "bar", -- but ignore the first one and last two in the image, they're wrap- + "lemon", -- arounds/repeats and are handled specially. + "77", + "cherry", + "jackpot", + "melon", + "2bar", + "lemon", + "wild", + "7", + "bell", + "scatter", + "3bar", + "777", + "melon", + "bonus" + }, + linebuttons = { -- number of lines on each button, from left to right + 1, + 3, + 5, + 9 -- there's room for one more, if desired + }, + betbuttons = { -- line bet amount on each button, from left to right + 1, + 2, + 5, + 10, + 25 + }, + matches = { -- nil == don't care about that reel in a given match + { 1, "lemon" , "lemon" , "lemon" }, + + { 2, "melon" , "melon" , "melon" }, + + { 2, "cherry" , "cherry" , nil }, + { 3, "cherry" , "cherry" , "cherry" }, + + { 5, "bell" , "bell" , nil }, + { 6, "bell" , "bell" , "bell" }, + + { 10, + {"bar", "2bar", "3bar"}, + {"bar", "2bar", "3bar"}, + {"bar", "2bar", "3bar"} + }, + + { 15, "bar" , "bar" , "bar" }, + { 20, "2bar" , "2bar" , "2bar" }, + { 25, "3bar" , "3bar" , "3bar" }, + + + { 25, + {"7", "77", "777"}, + {"7", "77", "777"}, + {"7", "77", "777"} + }, + + { 30, "7" , "7" , "7" }, + { 45, "77" , "77" , "77" }, + { 60, "777" , "777" , "777" }, + + { 200, "jackpot" , "jackpot" , "jackpot" }, + + }, + paytable_desc = { + { "@lemon", "@lemon", "@lemon", " pays 1" }, + { "@melon", "@melon", "@melon", " pays 2" }, + { "@cherry","@cherry", "@X", " pays 2" }, + { "@cherry","@cherry", "@cherry", " pays 3" }, + { "@bell","@bell", "@X", " pays 5" }, + { "@bell","@bell", "@bell", " pays 6" }, + { "Any three mixed ", "@bar", "/", "@2bar", "/", "@3bar", " pays 10" }, + { "@bar", "@bar", "@bar", " pays 15" }, + { "@2bar", "@2bar", "@2bar", " pays 20" }, + { "@3bar", "@3bar", "@3bar", " pays 25" }, + { "Any three mixed ", "@7", "/", "@77", "/", "@777", " pays 25" }, + { "@7", "@7", "@7", " pays 30" }, + { "@77", "@77", "@77", " pays 45" }, + { "@777", "@777", "@777", " pays 60" }, + { "@jackpot", "@jackpot", "@jackpot", " pays 200" }, + { "@wild", " matches any symbol except ", "@scatter", " ", "@bonus", " or ", "@jackpot" }, + { "All wins are multiplied by your line bet." } + }, + paylines_desc = { + "Paylines 1 - 3:", + "@1 3", + "Paylines 4 and 5:", + "@4 5", + "@wrap", + "Paylines 6 and 7:", + "@6 7", + "Paylines 8 and 9:", + "@8 9" + }, + maxbalance = 3260000, -- 65535 50 Mg notes, minus maximum possible payout, minus a fudge amount + currency_min = 1, -- smallest and largest denominations of minegeld to allow + currency_max = 100, + bet_initiates_spin = true, -- Most machines initiate a spin when the user presses a "Bet n" button, using + -- the selected bet value. + + -- timings should be an even multiple of the step interval (usually 0.1s) + reel_fast_timeout = 0.2, -- time between "frames" while spinning fast, medium speed, or slow + reel_medium_timeout = 0.1, + reel_slow_timeout = 0.1, + cutover_frames = 5, -- number of frames to run for each fast, medium, and slow cycle + inter_reel_steps = 4, -- number of frames between stopping reels (using slow timeout) + + win_delay = 0.5, -- time to wait after reels stop before showing winning lines + line_timeout = 1, -- time to wait between cycling among winning lines + half_stops_weight = 25, -- likelihood that a reel will stop between symbols, max 100 (if you want to + -- disable that behavior and always land on a symbol, set this to 1). + min_scatter = 2, -- minimum number of scatter symbols needed before computing a scatter win + scatter_value = 3, -- value of the scatter symbol, will be multiplied by number visible * line bet + min_bonus = 3, -- minimum number of symbols needed to trigger the bonus round + initiate_bonus = function(spin, def) + return 123 + end, + wild_doesnt_match = { + jackpot = true + }, + wild_multiplier = 1, -- For every wild that contributes to a line win, multiply win by this + -- (so one wild mult. by this, two mult. by twice this, etc) + + geometry = { -- all measures are in Minetest formspec "inventory slots" units + base_user_interface_width = 13, -- width of the user interface + upper_section_height = 11, -- height of the upper section (the reels et. al) + lower_section_height = 2, -- height of lower section (screen, buttons) + + reel_posx = 1, -- X/Y position of first reel, others drawn as indicated below + reel_posy = 1, + + reel_sizex = 3, -- Nominal X/Y size of one reel. Note that reels are drawn with a + reel_sizey = 9, -- spacing of 1.3333 times their width (creates a 1 IU gap in this + -- machine). + + button_rows_posx = 6.25, -- X starting pos for "n Lines"/"Bet n" buttons, Y pos for Spin button + spin_cashout_posx = 11.25, -- X pos for Spin and Cash-out/Quit buttons + button_rows_posy = 11.14, -- Y pos for "n Lines" row, and Cash Out/Quit button + + main_button_size = 0.8, -- X/Y size of Lines/Bet buttons; X*2 x Y for Spin and Cash Out + main_button_spacing = 0.9, -- X/Y Spacing between Lines/Bet buttons, and between Spin and + -- Cash Out buttons + + button_help_sizex = 1.6, -- Size and position of the "Help / Pays" button + button_help_sizey = 0.8, + button_help_posx = 0.125, + button_help_posy = 10.0938, + + screen_posx = 0.125, -- X/Y position of top-left corner of lower screen (i.e. (0,0)) + screen_posy = 11.094, + + screen_line_height = 0.875, -- Height of line 1, and 2 in 2-line mode. In 3-line mode, line 2 + -- hight will be 2/3 of this, and line 3 height will be 1/3 of it. + + label_medium_sizex = 1.125, -- X size of "Bal:", "Bet:", "Win:". + line_win_label_sizex = 2.0, -- X size of "Line Win" label + scatter_win_label_sizex = 3.0, -- X size of "Scatter Win:" label + bonus_win_label_sizex = 2.75, -- X size of "Bonus Win:" label + + digit_glyph_sizex = 0.75, -- Nominal X size of digits, before scaling down as noted below + + cash_slot_sizex = 5.0, -- X/Y size and position of the cash slot + cash_slot_sizey = 0.8125, + cash_slot_posx = 7.9063, + cash_slot_posy = 10.0938, + cash_slot_cin_posx = 1.9, -- X/Y position within the "cash intake" form (uses the same size as + cash_slot_cin_posy = 2.27, -- above) + + paytable_column1 = 0.6, -- position of left/right columns in the paytable screen. + paytable_column2 = 6.85, + paytable_posy = 0.5, + paytable_lineheight = 0.65, -- height of a pay table line. sets the Y spacing of the lines, and the + -- X/Y size of reel symbols shown therein, minus a bit of padding. + paytable_textheight = 0.45, -- height of printed text within said line, which will be vert. centered + paytable_textshift = 0.075, -- use this to fine tune the text vertical position relative to symbols + + paylines_column1 = 1, -- position of left and right columns in paylines screen + paylines_column2 = 7.25, + paylines_posy = 1, -- position of first row + paylines_sizex = 5, -- size of the pay lines graphic + paylines_sizey = 4, + paylines_lineheight = 0.65, -- text line height and font height + paylines_textheight = 0.40, + paylines_img_padding = 0.25 -- extra blank space to add below pay lines graphic + } +}) diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_behind_reels.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_behind_reels.png new file mode 100644 index 00000000..1951fded Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_behind_reels.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_1.png new file mode 100644 index 00000000..e59a5230 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_10.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_10.png new file mode 100644 index 00000000..1f48a636 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_10.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_2.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_2.png new file mode 100644 index 00000000..0209f619 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_2.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_25.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_25.png new file mode 100644 index 00000000..561d4b47 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_25.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_5.png new file mode 100644 index 00000000..d332f635 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_dis_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_1.png new file mode 100644 index 00000000..a5bd5120 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_10.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_10.png new file mode 100644 index 00000000..f7c231ab Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_10.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_2.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_2.png new file mode 100644 index 00000000..2a8a3551 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_2.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_25.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_25.png new file mode 100644 index 00000000..552a612d Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_25.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_5.png new file mode 100644 index 00000000..64af31ef Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_off_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_1.png new file mode 100644 index 00000000..46286e0c Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_10.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_10.png new file mode 100644 index 00000000..c43503d7 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_10.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_2.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_2.png new file mode 100644 index 00000000..f970f38f Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_2.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_25.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_25.png new file mode 100644 index 00000000..719b2388 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_25.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_5.png new file mode 100644 index 00000000..327596e4 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_bet_on_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_cash_out.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_cash_out.png new file mode 100644 index 00000000..e9379ac4 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_cash_out.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_cash_out_dis.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_cash_out_dis.png new file mode 100644 index 00000000..6bad0383 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_cash_out_dis.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_help.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_help.png new file mode 100644 index 00000000..132a7ff6 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_help.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_1.png new file mode 100644 index 00000000..9eebafc0 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_15.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_15.png new file mode 100644 index 00000000..7293ba4d Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_15.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_3.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_3.png new file mode 100644 index 00000000..1ec6134b Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_3.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_5.png new file mode 100644 index 00000000..27a9834b Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_9.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_9.png new file mode 100644 index 00000000..c02bc758 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_dis_9.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_1.png new file mode 100644 index 00000000..d7f40669 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_3.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_3.png new file mode 100644 index 00000000..bf13c614 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_3.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_5.png new file mode 100644 index 00000000..bd12ceb6 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_9.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_9.png new file mode 100644 index 00000000..435e950f Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_off_9.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_1.png new file mode 100644 index 00000000..925d9262 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_3.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_3.png new file mode 100644 index 00000000..eecd62bf Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_3.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_5.png new file mode 100644 index 00000000..23271480 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_9.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_9.png new file mode 100644 index 00000000..0ee87c99 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_lines_on_9.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_quit.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_quit.png new file mode 100644 index 00000000..21882d4c Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_quit.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_show_paylines.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_show_paylines.png new file mode 100644 index 00000000..cbd5c164 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_show_paylines.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_show_paytable.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_show_paytable.png new file mode 100644 index 00000000..cc7e0a2a Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_show_paytable.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_spin.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_spin.png new file mode 100644 index 00000000..adfb2bdf Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_spin.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_spin_dis.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_spin_dis.png new file mode 100644 index 00000000..3534c809 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_button_spin_dis.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cabinet_graphics.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cabinet_graphics.png new file mode 100644 index 00000000..6415a494 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cabinet_graphics.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cash_slot.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cash_slot.png new file mode 100644 index 00000000..5232a672 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cash_slot.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cash_slot_screen_background.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cash_slot_screen_background.png new file mode 100644 index 00000000..2f261f56 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_cash_slot_screen_background.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_colon.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_colon.png new file mode 100644 index 00000000..d33cb863 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_colon.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_0.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_0.png new file mode 100644 index 00000000..ef8fe628 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_0.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_1.png new file mode 100644 index 00000000..09262ac1 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_2.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_2.png new file mode 100644 index 00000000..44e5caa4 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_2.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_3.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_3.png new file mode 100644 index 00000000..689e08f5 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_3.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_4.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_4.png new file mode 100644 index 00000000..c13cbf18 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_4.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_5.png new file mode 100644 index 00000000..cc21ef2d Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_6.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_6.png new file mode 100644 index 00000000..a0e76d9d Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_6.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_7.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_7.png new file mode 100644 index 00000000..7f06ba1b Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_7.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_8.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_8.png new file mode 100644 index 00000000..772e52e1 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_8.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_9.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_9.png new file mode 100644 index 00000000..5ca1c97c Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_digit_9.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_lparen.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_lparen.png new file mode 100644 index 00000000..b2c24480 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_lparen.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_rparen.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_rparen.png new file mode 100644 index 00000000..49ae06e7 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_glyph_rparen.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_highlight_bonus.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_highlight_bonus.png new file mode 100644 index 00000000..741542ba Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_highlight_bonus.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_highlight_scatter.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_highlight_scatter.png new file mode 100644 index 00000000..8d899122 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_highlight_scatter.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_balance.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_balance.png new file mode 100644 index 00000000..b52d3e66 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_balance.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_bet.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_bet.png new file mode 100644 index 00000000..fdde2499 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_bet.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_bonuswin.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_bonuswin.png new file mode 100644 index 00000000..8aea37d7 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_bonuswin.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_currency.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_currency.png new file mode 100644 index 00000000..cfee54b8 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_currency.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_linewin.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_linewin.png new file mode 100644 index 00000000..c36d8e9d Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_linewin.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_scatterwin.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_scatterwin.png new file mode 100644 index 00000000..fc8b72c5 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_scatterwin.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_win.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_win.png new file mode 100644 index 00000000..7f5d3985 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_label_win.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_1.png new file mode 100644 index 00000000..36f123ea Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_2.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_2.png new file mode 100644 index 00000000..bdec6fda Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_2.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_3.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_3.png new file mode 100644 index 00000000..78e78194 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_3.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_4.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_4.png new file mode 100644 index 00000000..8a109b1c Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_4.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_5.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_5.png new file mode 100644 index 00000000..a1311bb8 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_5.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_6.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_6.png new file mode 100644 index 00000000..854fa6bb Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_6.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_7.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_7.png new file mode 100644 index 00000000..5e35f7c3 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_7.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_8.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_8.png new file mode 100644 index 00000000..c0f6b163 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_8.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_9.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_9.png new file mode 100644 index 00000000..9cc61c79 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_line_9.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_lower.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_lower.png new file mode 100644 index 00000000..efab5eac Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_lower.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_upper.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_upper.png new file mode 100644 index 00000000..1b61e15f Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_upper.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_upper_bezel.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_upper_bezel.png new file mode 100644 index 00000000..d13e53c1 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_overlay_upper_bezel.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_payline_bg.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_payline_bg.png new file mode 100644 index 00000000..4f0efbaf Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_payline_bg.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_paytable_bg.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_paytable_bg.png new file mode 100644 index 00000000..4f0efbaf Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_paytable_bg.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_paytable_lines_bg.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_paytable_lines_bg.png new file mode 100644 index 00000000..65c42f06 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_paytable_lines_bg.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_background.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_background.png new file mode 100644 index 00000000..c4de6b64 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_background.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_shadow.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_shadow.png new file mode 100644 index 00000000..51b06a90 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_shadow.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_fast.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_fast.png new file mode 100644 index 00000000..bbdbca8a Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_fast.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_medium.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_medium.png new file mode 100644 index 00000000..85a88c5c Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_medium.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_slow.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_slow.png new file mode 100644 index 00000000..5be7883b Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_slow.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_stopped.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_stopped.png new file mode 100644 index 00000000..71e7e1a2 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_symbols_stopped.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_1.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_1.png new file mode 100644 index 00000000..d0df80c2 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_1.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_2.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_2.png new file mode 100644 index 00000000..8b59f52e Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_2.png differ diff --git a/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_3.png b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_3.png new file mode 100644 index 00000000..65d99a41 Binary files /dev/null and b/mods/minislots/minislots_golden7s/textures/minislots_golden7s_reel_underlight_3.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/depends.txt b/mods/minislots/minislots_golden7s_deluxe/depends.txt new file mode 100644 index 00000000..3628f79c --- /dev/null +++ b/mods/minislots/minislots_golden7s_deluxe/depends.txt @@ -0,0 +1 @@ +minislots_engine diff --git a/mods/minislots/minislots_golden7s_deluxe/init.lua b/mods/minislots/minislots_golden7s_deluxe/init.lua new file mode 100644 index 00000000..514d0be4 --- /dev/null +++ b/mods/minislots/minislots_golden7s_deluxe/init.lua @@ -0,0 +1,281 @@ + +-- Golden 7's Deluxe example machine +-- +-- By Vanessa "VanessaE" Dannenberg +-- +-- Most symbol images taken from clker.com +-- others drawn or rendered by me. + +minislots.register_machine({ + name = "golden7s_deluxe", + description = "Golden 7's Deluxe slot machine", + machine_shape = "upright", + lines = { -- reel symbol pay line positions: 0 = center, -1 = top, +1 = bottom + { 0, 0, 0, 0, 0 }, -- pay line 1: center symbol on each reel + { -1, -1, -1, -1, -1 }, -- 2: top symbol on each reel + { 1, 1, 1, 1, 1 }, -- 3: bottom symbol on each reel + { -1, -1, 0, 1, 1 }, -- 4: top of reels 1 and 2, center of 3, bottom of 4 and 5 + { 1, 1, 0, -1, -1 }, -- 5: bottom of reels 1, 2, center 3, top 4, 5 + { -1, -1, -1, 0, 1 }, -- 6: top of 1, 2, 3, center 4, bottom 5 + { 1, 1, 1, 0, -1 }, -- 7: bottom of 1, 2, 3, center 4, top 5 + { -1, 0, 1, 1, 1 }, -- 8: top of 1, center 2, bottom 3, 4, 5 + { 1, 0, -1, -1, -1 }, -- 9: bottom of 1, center 2, top 3, 4, 5 + { 1, 0, -1, 0, 1 }, -- 10: bottom 1, center 2, top 3, center 4, bottom 5 + { -1, 0, 1, 0, -1 }, -- 11: top 1, center 2, bottom 3, center 4, top 5 + { 0, -1, -1, -1, -1 }, -- 12: center 1, top 2, 3, 4, 5 + { 0, 1, 1, 1, 1 }, -- 13: center 1, bottom 2, 3, 4, 5 + { -1, -1, -1, -1, 0 }, -- 14: top 1, 2, 3, 4, center 5 + { 1, 1, 1, 1, 0 }, -- 15: bottom 1, 2, 3, 4, center 5 + }, + symbols = { + "bar", + "lemon", + "77", + "cherry", + "jackpot", + "melon", + "2bar", + "lemon", + "wild", + "7", + "bell", + "scatter", + "3bar", + "777", + "melon", + "bonus" + }, + linebuttons = { -- number of lines on each button, from left to right + 1, + 3, + 5, + 9, + 15 + }, + betbuttons = { -- line bet amount on each button, from left to right + 1, + 2, + 5, + 10, + 25 + }, + matches = { -- nil == don't care about that reel in a given match + { 1, "lemon" , "lemon" , nil , nil , nil }, + { 2, "lemon" , "lemon" , "lemon" , nil , nil }, + { 3, "lemon" , "lemon" , "lemon" , "lemon" , nil }, + { 5, "lemon" , "lemon" , "lemon" , "lemon" , "lemon" }, + + { 5, "melon" , "melon" , "melon" , nil , nil }, + { 6, "melon" , "melon" , "melon" , "melon" , nil }, + { 7, "melon" , "melon" , "melon" , "melon" , "melon" }, + + { 7, "cherry" , "cherry" , nil , nil , nil }, + { 8, "cherry" , "cherry" , "cherry" , nil , nil }, + { 9, "cherry" , "cherry" , "cherry" , "cherry" , nil }, + { 10, "cherry" , "cherry" , "cherry" , "cherry" , "cherry" }, + + { 10, "bell" , "bell" , "bell" , nil , nil }, + { 15, "bell" , "bell" , "bell" , "bell" , nil }, + { 20, "bell" , "bell" , "bell" , "bell" , "bell" }, + + { 25, + {"bar", "2bar", "3bar"}, + {"bar", "2bar", "3bar"}, + {"bar", "2bar", "3bar"}, + {"bar", "2bar", "3bar"}, + {"bar", "2bar", "3bar"} + }, + + { 30, "bar" , "bar" , "bar" , nil , nil }, + { 35, "bar" , "bar" , "bar" , "bar" , nil }, + { 40, "bar" , "bar" , "bar" , "bar" , "bar" }, + + { 50, "2bar" , "2bar" , "2bar" , nil , nil }, + { 55, "2bar" , "2bar" , "2bar" , "2bar" , nil }, + { 60, "2bar" , "2bar" , "2bar" , "2bar" , "2bar" }, + + { 70, "3bar" , "3bar" , "3bar" , nil , nil }, + { 73, "3bar" , "3bar" , "3bar" , "3bar" , nil }, + { 75, "3bar" , "3bar" , "3bar" , "3bar" , "3bar" }, + + { 80, + {"7", "77", "777"}, + {"7", "77", "777"}, + {"7", "77", "777"}, + {"7", "77", "777"}, + {"7", "77", "777"} + }, + + { 85, "7" , "7" , "7" , nil , nil }, + { 88, "7" , "7" , "7" , "7" , nil }, + { 90, "7" , "7" , "7" , "7" , "7" }, + + { 90, "77" , "77" , "77" , nil , nil }, + { 95, "77" , "77" , "77" , "77" , nil }, + { 100, "77" , "77" , "77" , "77" , "77" }, + + { 100, "777" , "777" , "777" , nil , nil }, + { 125, "777" , "777" , "777" , "777" , nil }, + + { 150, "777" , "777" , "777" , "777" , "777" }, + + { 300, "jackpot" , "jackpot" , "jackpot" , "jackpot" , "jackpot" }, + + }, + paytable_desc = { + { "@lemon", "@lemon", "@X", "@X", "@X", " pays 1"} , + { "@lemon", "@lemon", "@lemon", "@X", "@X", " pays 2" }, + { "@lemon", "@lemon", "@lemon", "@lemon", "@X", " pays 3"}, + { "@lemon", "@lemon", "@lemon", "@lemon", "@lemon", " pays 5" }, + + { "@melon", "@melon", "@melon", "@X", "@X", " pays 5"}, + { "@melon", "@melon", "@melon", "@melon", "@X", " pays 6" }, + { "@melon", "@melon", "@melon", "@melon", "@melon", " pays 7" }, + + { "@cherry", "@cherry", "@X", "@X", "@X", " pays 7" }, + { "@cherry", "@cherry", "@cherry", "@X", "@X", " pays 8" }, + { "@cherry", "@cherry", "@cherry", "@cherry", "@X", " pays 9" }, + { "@cherry", "@cherry", "@cherry", "@cherry", "@cherry", " pays 10" }, + + { "@bell", "@bell", "@bell", "@X", "@X", " pays 10" }, + { "@bell", "@bell", "@bell", "@bell", "@X", " pays 15" }, + { "@bell", "@bell", "@bell", "@bell", "@bell", " pays 20" }, + + { "Any five ", "@bar", "/", "@2bar", "/", "@3bar", " pays 25" }, + { "@bar", "@bar", "@bar", "@X", "@X", " pays 30" }, + { "@bar", "@bar", "@bar", "@bar", "@X", " pays 35" }, + { "@bar", "@bar", "@bar", "@bar", "@bar", " pays 40" }, + + { "@2bar", "@2bar", "@2bar", "@X", "@X", " pays 50" }, + { "@2bar", "@2bar", "@2bar", "@2bar", "@X", " pays 55" }, + { "@2bar", "@2bar", "@2bar", "@2bar", "@2bar", " pays 60" }, + + { "@wild", " matches any symbol except ", "@scatter", " ", "@bonus", " or ", "@jackpot" }, + { "All wins are multiplied by your line bet." }, + + "@wrap", + + { "@3bar", "@3bar", "@3bar", "@X", "@X", " pays 70" }, + { "@3bar", "@3bar", "@3bar", "@3bar", "@X", " pays 73" }, + { "@3bar", "@3bar", "@3bar", "@3bar", "@3bar", " pays 75" }, + + { "Any five ", "@7", "/", "@77", "/", "@777", " pays 80" }, + { "@7", "@7", "@7", "@X", "@X", " pays 85" }, + { "@7", "@7", "@7", "@7", "@X", " pays 88" }, + { "@7", "@7", "@7", "@7", "@7", " pays 90" }, + + { "@77", "@77", "@77", "@X", "@X", " pays 90" }, + { "@77", "@77", "@77", "@77", "@X", " pays 95" }, + { "@77", "@77", "@77", "@77", "@77", " pays 100" }, + + { "@777", "@777", "@777", "@777", "@777", " pays 150" }, + { "@jackpot", "@jackpot", "@jackpot", "@jackpot", "@jackpot", " pays 300" }, + + }, + paylines_desc = { + "Paylines 1 - 3:", + "@1 3", + "Paylines 4 and 5:", + "@4 5", + "Paylines 6 and 7:", + "@6 7", + "Paylines 8 and 9:", + "@8 9", + "Paylines 10 and 11:", + "@10 11", + "Paylines 12 - 15:", + "@12 15" + }, + maxbalance = 3260000, -- 65535 50 Mg notes, minus maximum possible payout, minus a fudge amount + currency_min = 1, -- smallest and largest denominations of minegeld to allow + currency_max = 100, + bet_initiates_spin = true, -- Most machines initiate a spin when the user presses a "Bet n" button, using + -- the selected bet value. + + -- timings should be an even multiple of the step interval (usually 0.1s) + reel_fast_timeout = 0.2, -- time between "frames" while spinning fast, medium speed, or slow + reel_medium_timeout = 0.1, + reel_slow_timeout = 0.1, + cutover_frames = 5, -- number of frames to run for each fast, medium, and slow cycle + inter_reel_steps = 3, -- number of frames between stopping reels (using slow timeout) + + win_delay = 0.5, -- time to wait after reels stop before showing winning lines + line_timeout = 1, -- time to wait between cycling among winning lines + half_stops_weight = 5, -- likelihood that a reel will stop between symbols, max 100 (if you want to + -- disable that behavior and always land on a symbol, set this to 1). + min_scatter = 3, -- minimum number of scatter symbols needed before computing a scatter win + scatter_value = 3, -- value of the scatter symbol, will be multiplied by number visible * line bet + min_bonus = 4, -- minimum number of symbols needed to trigger the bonus round + initiate_bonus = function(spin, def) + return 400 + end, + wild_doesnt_match = { + jackpot = true + }, + wild_multiplier = 1, -- For every wild that contributes to a line win, multiply win by this + -- (so one wild mult. by this, two mult. by twice this, etc) + + geometry = { -- all measures are in Minetest formspec "inventory slots" units + + base_user_interface_width = 14.667, -- width of the user interface + upper_section_height = 11, -- height of the upper section (the reels et. al) + lower_section_height = 2, -- height of lower section (screen, buttons) + + reel_posx = 1, -- X/Y position of first reel, others drawn as indicated below + reel_posy = 1, + + reel_sizex = 2, -- Nominal X/Y size of one reel. Note that reels are drawn with a + reel_sizey = 9, -- spacing of 1.3333 times their width (leaves a 0.6667 IU gap between + -- reels on this machine). + + button_rows_posx = 6.9, -- X starting pos for "n Lines"/"Bet n" buttons, Y pos for Spin button + spin_cashout_posx = 12.75, -- X pos for Spin and Cash-out/Quit buttons + button_rows_posy = 11.14, -- Y pos for "n Lines" row, and Cash Out/Quit button + + main_button_size = 0.8, -- X/Y size of Lines/Bet buttons; X*2 x Y for Spin and Cash Out + main_button_spacing = 0.9, -- X/Y Spacing between Lines/Bet buttons, and between Spin and + -- Cash Out buttons + + button_help_sizex = 1.6, -- Size and position of the "Help / Pays" button + button_help_sizey = 0.8, + button_help_posx = 0.125, + button_help_posy = 10.0938, + + screen_posx = 0.125, -- X/Y position of top-left corner of lower screen (i.e. (0,0)) + screen_posy = 11.094, + + screen_line_height = 0.875, -- Height of line 1, and 2 in 2-line mode. In 3-line mode, line 2 + -- hight will be 2/3 of this, and line 3 height will be 1/3 of it. + + label_medium_sizex = 1.125, -- X size of "Bal:", "Bet:", "Win:". + line_win_label_sizex = 2.0, -- X size of "Line Win" label + scatter_win_label_sizex = 3.0, -- X size of "Scatter Win:" label + bonus_win_label_sizex = 2.75, -- X size of "Bonus Win:" label + + digit_glyph_sizex = 0.75, -- Nominal X size of digits, before scaling down as noted below + + cash_slot_sizex = 5.0, -- X/Y size and position of the cash slot + cash_slot_sizey = 0.8125, + cash_slot_posx = 9.5781, + cash_slot_posy = 10.0938, + cash_slot_cin_posx = 1.9, -- X/Y position within the "cash intake" form (uses the same size as + cash_slot_cin_posy = 2.27, -- above) + + paytable_column1 = 0.65, -- position of left/right columns in the paytable screen. + paytable_column2 = 6.9, + paytable_posy = 0.25, + paytable_lineheight = 0.5, -- height of a pay table line. sets the Y spacing of the lines, and the + -- X/Y size of reel symbols shown therein, minus a bit of padding. + paytable_textheight = 0.35, -- height of printed text within said line, which will be vert. centered + paytable_textshift = 0.075, -- use this to fine tune the text vertical position relative to symbols + + paylines_column1 = 1.5, -- position of left and right columns in paylines screen + paylines_column2 = 7.25, + paylines_posy = 0.2, -- position of first row + paylines_sizex = 4, -- size of the pay lines graphic + paylines_sizey = 3, + paylines_lineheight = 0.65, -- text line height and font height + paylines_textheight = 0.35, + paylines_img_padding = 0.3 -- extra blank space to add below pay lines graphic + } +}) diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_behind_reels.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_behind_reels.png new file mode 100644 index 00000000..1951fded Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_behind_reels.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_1.png new file mode 100644 index 00000000..e59a5230 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_10.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_10.png new file mode 100644 index 00000000..1f48a636 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_10.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_2.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_2.png new file mode 100644 index 00000000..0209f619 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_2.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_25.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_25.png new file mode 100644 index 00000000..561d4b47 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_25.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_5.png new file mode 100644 index 00000000..d332f635 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_dis_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_1.png new file mode 100644 index 00000000..a5bd5120 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_10.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_10.png new file mode 100644 index 00000000..f7c231ab Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_10.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_2.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_2.png new file mode 100644 index 00000000..2a8a3551 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_2.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_25.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_25.png new file mode 100644 index 00000000..552a612d Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_25.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_5.png new file mode 100644 index 00000000..64af31ef Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_off_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_1.png new file mode 100644 index 00000000..46286e0c Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_10.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_10.png new file mode 100644 index 00000000..c43503d7 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_10.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_2.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_2.png new file mode 100644 index 00000000..f970f38f Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_2.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_25.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_25.png new file mode 100644 index 00000000..719b2388 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_25.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_5.png new file mode 100644 index 00000000..327596e4 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_bet_on_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_cash_out.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_cash_out.png new file mode 100644 index 00000000..e9379ac4 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_cash_out.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_cash_out_dis.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_cash_out_dis.png new file mode 100644 index 00000000..6bad0383 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_cash_out_dis.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_help.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_help.png new file mode 100644 index 00000000..132a7ff6 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_help.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_1.png new file mode 100644 index 00000000..9eebafc0 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_15.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_15.png new file mode 100644 index 00000000..7293ba4d Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_15.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_3.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_3.png new file mode 100644 index 00000000..1ec6134b Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_3.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_5.png new file mode 100644 index 00000000..27a9834b Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_9.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_9.png new file mode 100644 index 00000000..c02bc758 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_dis_9.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_1.png new file mode 100644 index 00000000..d7f40669 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_15.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_15.png new file mode 100644 index 00000000..32dc12cc Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_15.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_3.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_3.png new file mode 100644 index 00000000..bf13c614 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_3.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_5.png new file mode 100644 index 00000000..bd12ceb6 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_9.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_9.png new file mode 100644 index 00000000..435e950f Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_off_9.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_1.png new file mode 100644 index 00000000..925d9262 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_15.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_15.png new file mode 100644 index 00000000..5ef8cb3e Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_15.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_3.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_3.png new file mode 100644 index 00000000..eecd62bf Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_3.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_5.png new file mode 100644 index 00000000..23271480 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_9.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_9.png new file mode 100644 index 00000000..0ee87c99 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_lines_on_9.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_quit.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_quit.png new file mode 100644 index 00000000..21882d4c Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_quit.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_show_paylines.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_show_paylines.png new file mode 100644 index 00000000..cbd5c164 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_show_paylines.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_show_paytable.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_show_paytable.png new file mode 100644 index 00000000..cc7e0a2a Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_show_paytable.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_spin.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_spin.png new file mode 100644 index 00000000..adfb2bdf Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_spin.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_spin_dis.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_spin_dis.png new file mode 100644 index 00000000..3534c809 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_button_spin_dis.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cabinet_graphics.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cabinet_graphics.png new file mode 100644 index 00000000..45f0965e Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cabinet_graphics.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cash_slot.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cash_slot.png new file mode 100644 index 00000000..5232a672 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cash_slot.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cash_slot_screen_background.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cash_slot_screen_background.png new file mode 100644 index 00000000..2f261f56 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_cash_slot_screen_background.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_colon.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_colon.png new file mode 100644 index 00000000..d33cb863 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_colon.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_0.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_0.png new file mode 100644 index 00000000..ef8fe628 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_0.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_1.png new file mode 100644 index 00000000..09262ac1 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_2.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_2.png new file mode 100644 index 00000000..44e5caa4 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_2.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_3.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_3.png new file mode 100644 index 00000000..689e08f5 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_3.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_4.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_4.png new file mode 100644 index 00000000..c13cbf18 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_4.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_5.png new file mode 100644 index 00000000..cc21ef2d Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_6.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_6.png new file mode 100644 index 00000000..a0e76d9d Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_6.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_7.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_7.png new file mode 100644 index 00000000..7f06ba1b Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_7.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_8.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_8.png new file mode 100644 index 00000000..772e52e1 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_8.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_9.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_9.png new file mode 100644 index 00000000..5ca1c97c Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_digit_9.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_lparen.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_lparen.png new file mode 100644 index 00000000..b2c24480 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_lparen.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_rparen.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_rparen.png new file mode 100644 index 00000000..49ae06e7 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_glyph_rparen.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_highlight_bonus.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_highlight_bonus.png new file mode 100644 index 00000000..3a19b341 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_highlight_bonus.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_highlight_scatter.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_highlight_scatter.png new file mode 100644 index 00000000..573f70c0 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_highlight_scatter.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_balance.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_balance.png new file mode 100644 index 00000000..b52d3e66 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_balance.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_bet.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_bet.png new file mode 100644 index 00000000..fdde2499 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_bet.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_bonuswin.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_bonuswin.png new file mode 100644 index 00000000..8aea37d7 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_bonuswin.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_currency.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_currency.png new file mode 100644 index 00000000..cfee54b8 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_currency.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_linewin.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_linewin.png new file mode 100644 index 00000000..c36d8e9d Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_linewin.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_scatterwin.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_scatterwin.png new file mode 100644 index 00000000..fc8b72c5 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_scatterwin.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_win.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_win.png new file mode 100644 index 00000000..7f5d3985 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_label_win.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_1.png new file mode 100644 index 00000000..8cf89b3e Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_10.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_10.png new file mode 100644 index 00000000..cf2105aa Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_10.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_11.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_11.png new file mode 100644 index 00000000..9112cd9c Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_11.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_12.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_12.png new file mode 100644 index 00000000..0a1144d1 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_12.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_13.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_13.png new file mode 100644 index 00000000..50e4ce7d Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_13.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_14.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_14.png new file mode 100644 index 00000000..b0ae3856 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_14.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_15.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_15.png new file mode 100644 index 00000000..350bbe95 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_15.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_2.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_2.png new file mode 100644 index 00000000..0964ef96 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_2.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_3.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_3.png new file mode 100644 index 00000000..f4a6bca2 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_3.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_4.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_4.png new file mode 100644 index 00000000..f8436526 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_4.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_5.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_5.png new file mode 100644 index 00000000..d9318ed3 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_5.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_6.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_6.png new file mode 100644 index 00000000..0f1ab36e Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_6.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_7.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_7.png new file mode 100644 index 00000000..fd1b6da1 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_7.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_8.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_8.png new file mode 100644 index 00000000..f5eab073 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_8.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_9.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_9.png new file mode 100644 index 00000000..c83a58a0 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_line_9.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_lower.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_lower.png new file mode 100644 index 00000000..a96df484 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_lower.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_upper.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_upper.png new file mode 100644 index 00000000..0431b81d Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_upper.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_upper_bezel.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_upper_bezel.png new file mode 100644 index 00000000..d13e53c1 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_overlay_upper_bezel.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_payline_bg.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_payline_bg.png new file mode 100644 index 00000000..4f0efbaf Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_payline_bg.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_paytable_bg.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_paytable_bg.png new file mode 100644 index 00000000..4f0efbaf Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_paytable_bg.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_paytable_lines_bg.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_paytable_lines_bg.png new file mode 100644 index 00000000..3769d49b Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_paytable_lines_bg.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_background.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_background.png new file mode 100644 index 00000000..1ec0eb75 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_background.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_shadow.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_shadow.png new file mode 100644 index 00000000..6a0829c8 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_shadow.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_fast.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_fast.png new file mode 100644 index 00000000..b1f5947c Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_fast.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_medium.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_medium.png new file mode 100644 index 00000000..5865fe90 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_medium.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_slow.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_slow.png new file mode 100644 index 00000000..10d52200 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_slow.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_stopped.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_stopped.png new file mode 100644 index 00000000..1620bfff Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_symbols_stopped.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_1.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_1.png new file mode 100644 index 00000000..9e5bd580 Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_1.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_2.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_2.png new file mode 100644 index 00000000..b2ad199c Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_2.png differ diff --git a/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_3.png b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_3.png new file mode 100644 index 00000000..2627dabf Binary files /dev/null and b/mods/minislots/minislots_golden7s_deluxe/textures/minislots_golden7s_deluxe_reel_underlight_3.png differ diff --git a/mods/minislots/minislots_work_files/admin button.xcf b/mods/minislots/minislots_work_files/admin button.xcf new file mode 100644 index 00000000..4872de64 Binary files /dev/null and b/mods/minislots/minislots_work_files/admin button.xcf differ diff --git a/mods/minislots/minislots_work_files/font-to-images.sh b/mods/minislots/minislots_work_files/font-to-images.sh new file mode 100755 index 00000000..395421cc --- /dev/null +++ b/mods/minislots/minislots_work_files/font-to-images.sh @@ -0,0 +1,71 @@ +#!/bin/bash + +color="white" + +echo -e "\nWorking...\n" + +convert -size 16x80 xc:transparent "minislots_font_regular_char_32.png" +for i in $(seq 33 127); do + char=$(printf "\x$(printf %x $i)") + if (( $i == 34 )) || (( $i == 92 )); then + char="\\"$char + fi + + convert -background none \ + -fill $color \ + -font /usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf \ + -pointsize 84 \ + label:"$char" \ + -crop 99x80+0+15 \ + +repage \ + "minislots_font_regular_char_"$i.png +done + +convert -size 8x80 xc:transparent "minislots_font_condensed_char_32.png" +for i in $(seq 33 127); do + char=$(printf "\x$(printf %x $i)") + if (( $i == 34 )) || (( $i == 92 )); then + char="\\"$char + fi + + convert -background none \ + -fill $color \ + -font /usr/share/fonts/truetype/liberation/LiberationSansNarrow-Regular.ttf \ + -pointsize 84 \ + label:"$char" \ + -crop 99x80+0+15 \ + +repage \ + "minislots_font_condensed_char_"$i.png +done + +convert -size 24x80 xc:transparent "minislots_font_bold_char_32.png" +for i in $(seq 33 127); do + char=$(printf "\x$(printf %x $i)") + if (( $i == 34 )) || (( $i == 92 )); then + char="\\"$char + fi + + convert -background none \ + -fill $color \ + -font /usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf \ + -pointsize 84 \ + label:"$char" \ + -crop 99x80+0+15 \ + +repage \ + "minislots_font_bold_char_"$i.png +done + +echo -e "\ncopy/paste this to form the char width table:\n\n" + +echo "local char_widths = {" +echo -e "\t[32] = { regular = 16, condensed = 12, bold = 24 }," + +for i in $(seq 33 127); do + echo -en "\t[$i] " + if [ $i -lt 100 ]; then echo -n " "; fi + echo -en "= { regular = "$(identify "minislots_font_regular_char_"$i.png|cut -f 3 -d " "|cut -f 1 -d "x")", " + echo -en "condensed = "$(identify "minislots_font_condensed_char_"$i.png|cut -f 3 -d " "|cut -f 1 -d "x")", " + echo -e "bold = "$(identify "minislots_font_bold_char_"$i.png|cut -f 3 -d " "|cut -f 1 -d "x")" }," +done + +echo "}" diff --git a/mods/minislots/minislots_work_files/init.lua b/mods/minislots/minislots_work_files/init.lua new file mode 100644 index 00000000..d2d388c0 --- /dev/null +++ b/mods/minislots/minislots_work_files/init.lua @@ -0,0 +1,3 @@ +print("[Minislots] Warning: You \"enabled\" the minislots_work_files directory.") +print("[Minislots] Don't do that, it ain't a mod.") +print("[Minislots] It's just... work files. :-P") diff --git a/mods/minislots/minislots_work_files/minislots cashout ticket.xcf b/mods/minislots/minislots_work_files/minislots cashout ticket.xcf new file mode 100644 index 00000000..aab8570b Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots cashout ticket.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s UI graphics.xcf b/mods/minislots/minislots_work_files/minislots golden 7s UI graphics.xcf new file mode 100644 index 00000000..93e45033 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s UI graphics.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s bet button.xcf b/mods/minislots/minislots_work_files/minislots golden 7s bet button.xcf new file mode 100644 index 00000000..d40909b6 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s bet button.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s cabinet.xcf b/mods/minislots/minislots_work_files/minislots golden 7s cabinet.xcf new file mode 100644 index 00000000..bc362b25 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s cabinet.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s cashout button.xcf b/mods/minislots/minislots_work_files/minislots golden 7s cashout button.xcf new file mode 100644 index 00000000..ecf4fea0 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s cashout button.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s deluxe UI graphics.xcf b/mods/minislots/minislots_work_files/minislots golden 7s deluxe UI graphics.xcf new file mode 100644 index 00000000..f65c1eca Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s deluxe UI graphics.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s deluxe payline line background.xcf b/mods/minislots/minislots_work_files/minislots golden 7s deluxe payline line background.xcf new file mode 100644 index 00000000..4c6155d7 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s deluxe payline line background.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s help button.xcf b/mods/minislots/minislots_work_files/minislots golden 7s help button.xcf new file mode 100644 index 00000000..2ec6e5e8 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s help button.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s help screen.xcf b/mods/minislots/minislots_work_files/minislots golden 7s help screen.xcf new file mode 100644 index 00000000..6252d87a Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s help screen.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s jackpot.xcf b/mods/minislots/minislots_work_files/minislots golden 7s jackpot.xcf new file mode 100644 index 00000000..c4f00978 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s jackpot.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s lines button.xcf b/mods/minislots/minislots_work_files/minislots golden 7s lines button.xcf new file mode 100644 index 00000000..8c26f363 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s lines button.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s payline line background.xcf b/mods/minislots/minislots_work_files/minislots golden 7s payline line background.xcf new file mode 100644 index 00000000..963d116f Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s payline line background.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots golden 7s spinbutton.xcf b/mods/minislots/minislots_work_files/minislots golden 7s spinbutton.xcf new file mode 100644 index 00000000..c3464c51 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots golden 7s spinbutton.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots_golden7s_cash_slot_screen_background.xcf b/mods/minislots/minislots_work_files/minislots_golden7s_cash_slot_screen_background.xcf new file mode 100644 index 00000000..7867cf38 Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots_golden7s_cash_slot_screen_background.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots_golden7s_deluxe_button_show_paylines-paytable.xcf b/mods/minislots/minislots_work_files/minislots_golden7s_deluxe_button_show_paylines-paytable.xcf new file mode 100644 index 00000000..40d02bab Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots_golden7s_deluxe_button_show_paylines-paytable.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots_golden7s_deluxe_one_reel.xcf b/mods/minislots/minislots_work_files/minislots_golden7s_deluxe_one_reel.xcf new file mode 100644 index 00000000..0135b66f Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots_golden7s_deluxe_one_reel.xcf differ diff --git a/mods/minislots/minislots_work_files/minislots_golden7s_one_reel.xcf b/mods/minislots/minislots_work_files/minislots_golden7s_one_reel.xcf new file mode 100644 index 00000000..0c95e16c Binary files /dev/null and b/mods/minislots/minislots_work_files/minislots_golden7s_one_reel.xcf differ diff --git a/mods/minislots/modpack.conf b/mods/minislots/modpack.conf new file mode 100644 index 00000000..c06e07df --- /dev/null +++ b/mods/minislots/modpack.conf @@ -0,0 +1 @@ +min_minetest_version = 5.2.0 diff --git a/mods/minislots/modpack.txt b/mods/minislots/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/mobs_redo/api.lua b/mods/mobs_redo/api.lua index e4c64ef2..72947ab8 100644 --- a/mods/mobs_redo/api.lua +++ b/mods/mobs_redo/api.lua @@ -8,7 +8,7 @@ local use_cmi = minetest.global_exists("cmi") mobs = { mod = "redo", - version = "20201029", + version = "20201115", intllib = S, invis = minetest.global_exists("invisibility") and invisibility or {} } @@ -877,7 +877,7 @@ function mob_class:check_for_death(cmi_cause) local pos = self.object:get_pos() -- execute custom death function - if self.on_die then + if pos and self.on_die then self:on_die(pos) @@ -897,7 +897,7 @@ function mob_class:check_for_death(cmi_cause) local frames = self.animation.die_end - self.animation.die_start local speed = self.animation.die_speed or 15 - local length = max(frames / speed, 0) + local length = max((frames / speed), 0) self.attack = nil self.v_start = false @@ -910,23 +910,28 @@ function mob_class:check_for_death(cmi_cause) minetest.after(length, function(self) - if use_cmi and self.object:get_luaentity() then - cmi.notify_die(self.object, cmi_cause) + if self.object:get_luaentity() then + + if use_cmi then + cmi.notify_die(self.object, cmi_cause) + end + + remove_mob(self, true) end - - remove_mob(self, true) - end, self) - else + + return true + + elseif pos then -- otherwise remove mod and show particle effect if use_cmi then cmi.notify_die(self.object, cmi_cause) end remove_mob(self, true) - end - effect(pos, 20, "tnt_smoke.png") + effect(pos, 20, "tnt_smoke.png") + end return true end diff --git a/mods/morelights/LICENSE b/mods/morelights/LICENSE new file mode 100644 index 00000000..0a041280 --- /dev/null +++ b/mods/morelights/LICENSE @@ -0,0 +1,165 @@ + 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. diff --git a/mods/morelights/README.md b/mods/morelights/README.md new file mode 100644 index 00000000..2f1fdef5 --- /dev/null +++ b/mods/morelights/README.md @@ -0,0 +1,23 @@ +# morelights + +[![ContentDB](https://content.minetest.net/packages/random_geek/morelights/shields/downloads/)](https://content.minetest.net/packages/random_geek/morelights/) + +Minetest mod adding additional lighting nodes. + +![Screenshot](screenshot.png) + +The Morelights modpack adds over 30 lighting and accessory nodes to suit various styles of builds, both interior and exterior. +Includes basic light blocks, modern and historical-style lighting, and customizable street lamps. + +Some nodes (ceiling lights, bar lights, poles) can be rotated to serve different purposes. + +The modpack currently supports both Minetest Game and MineClone 2. + +## Craft Recipes + +Craft recipes for all items can be found in [crafts.md](crafts.md). + +## Licenses + +Source code is licensed under the LGPL v3.0 license. +All other media and assets are licensed under the CC BY-SA 4.0 license. diff --git a/mods/morelights/crafts.md b/mods/morelights/crafts.md new file mode 100644 index 00000000..bd394d15 --- /dev/null +++ b/mods/morelights/crafts.md @@ -0,0 +1,352 @@ +# Craft recipes for Morelights items + +Copper = copper ingot (Minetest Game) or redstone (MineClone 2) + +Dye = white or dark grey dye, depending on the desired color of the item. +For MineClone 2, use bone meal or grey dye. + +Dark Wood = jungle wood planks (Minetest Game) or spruce wood (MineClone 2). + +Glass = regular, non-stained glass block. + +Glass Pane = regular, non-stained glass pane. + +Steel = steel ingot (Minetest Game) or iron ingot (MineClone 2). + +## Basic items + +### Light Bulb + +Used for most other recipes. + +``` ++--------+ +| Glass | ++--------+ +| Copper | ++--------+ +| Steel | ++--------+ +``` + +### Metal Pole + +``` ++-----+-------+ +| Dye | Steel | ++-----+-------+ +| | Steel | ++-----+-------+ +| | Steel | ++-----+-------+ +``` + +### Metal Chain + +``` ++-----+-------+ +| Dye | Steel | ++-----+-------+ +| | | ++-----+-------+ +| | Steel | ++-----+-------+ +``` + +## Modern + +### Modern Light Block + +``` ++-------+-------+-------+ +| | Steel | | ++-------+-------+-------+ +| Glass | Bulb | Glass | +| Pane | | Pane | ++-------+-------+-------+ +| | Steel | | ++-------+-------+-------+ +``` + +### Modern Light Block (small) + +``` ++-------+-------+-------+ +| | Steel | | ++-------+-------+-------+ +| Glass | Bulb | Glass | +| Pane | | Pane | ++-------+-------+-------+ +``` + +### Modern Post Light + +``` ++-----+-------+ +| Dye | Steel | ++-----+-------+ +| | Bulb | ++-----+-------+ +| | Steel | ++-----+-------+ +``` + +### Street Lamp Post + +``` ++-----+-------+-------+ +| Dye | Steel | Steel | ++-----+-------+-------+ +| | Steel | | ++-----+-------+-------+ +| | Steel | | ++-----+-------+-------+ +``` + +### Ceiling Bar Light (connecting) + +``` ++--------+-------+--------+ +| Steel | Steel | Steel | ++--------+-------+--------+ +| Copper | Glass | Copper | ++--------+-------+--------+ +``` + +Also can be crafted from one straight bar light. + +### Ceiling Bar Light (straight) + +Craft from one connecting bar light. + +### Modern Ceiling Light + +``` ++-------+-------+-------+ +| Steel | Bulb | Steel | ++-------+-------+-------+ +| | Glass | | +| | Pane | | ++-------+-------+-------+ +``` + +### Modern Can Light + +``` ++-------+-------+-------+ +| Dye | Steel | | ++-------+-------+-------+ +| Steel | Bulb | Steel | ++-------+-------+-------+ +``` + +### Modern Wall Lamp + +``` ++-------+-------+-------+ +| | Glass | | +| | Pane | | ++-------+-------+-------+ +| Glass | Bulb | Steel | +| Pane | | | ++-------+-------+-------+ +| | Dark | Steel | +| | Dye | | ++-------+-------+-------+ +``` + +### Modern Table Lamp + +``` ++------+-------+------+ +| | Steel | | ++------+-------+------+ +| Wool | Bulb | Wool | ++------+-------+------+ +| | Steel | | ++------+-------+------+ +``` + +Use light/dark grey wool. + +### Modern Path Light + +``` ++-----+-------+ +| Dye | Bulb | ++-----+-------+ +| | Steel | ++-----+-------+ +| | Steel | ++-----+-------+ +``` + +## Vintage + +### Brass Ingot + +Minetest Game: Craft from one steel and one tin ingot. + +MineClone 2: Craft from one iron ingot and one redstone. + +### Brass Chain + +``` ++-------+ +| Brass | ++-------+ +| | ++-------+ +| Brass | ++-------+ +``` + +### Vintage Light Block + +``` ++-------+------+-------+ +| | Dark | | +| | Wood | | ++-------+------+-------+ +| Glass | Bulb | Glass | +| Pane | | Pane | ++-------+------+-------+ +| | Dark | | +| | Wood | | ++-------+------+-------+ +``` + +### Vintage Light Block (small) + +``` ++-------+------+-------+ +| | Dark | | +| | Wood | | ++-------+------+-------+ +| Glass | Bulb | Glass | +| Pane | | Pane | ++-------+------+-------+ +``` + +### Vintage Lantern (floor, wall, or ceiling) + +``` ++-------+-------+-------+ +| | Steel | | ++-------+-------+-------+ +| Glass | Bulb | Glass | +| Pane | | Pane | ++-------+-------+-------+ +| Stick | Steel | Stick | ++-------+-------+-------+ +``` + +### Vintage Hanging Light Bulb + +``` ++--------+ +| Steel | ++--------+ +| Copper | ++--------+ +| Bulb | ++--------+ +``` + +### Vintage Oil Lamp + +``` ++--------+ +| Glass | ++--------+ +| Cotton | ++--------+ +| Brass | ++--------+ +``` + +For MineClone 2, use string instead of cotton. + +### Vintage Chandelier + +``` ++-------+-------+-------+ +| | Brass | | ++-------+-------+-------+ +| Bulb | Brass | Bulb | ++-------+-------+-------+ +| Steel | Brass | Steel | ++-------+-------+-------+ +``` + +# Extras + +### Futuristic Light Block + +``` ++---------+-------+---------+ +| Crystal | Steel | Crystal | ++---------+-------+---------+ +| Glass | Bulb | Glass | +| Pane | | Pane | ++---------+-------+---------+ +| Crystal | Steel | Crystal | ++---------+-------+---------+ +``` + +Crystal = mese fragment (Minetest Game) or nether quartz (MineClone 2). + +### Grass Light + +``` ++-------+-------+ +| | Glass | +| | Pane | ++-------+-------+ +| | Bulb | ++-------+-------+ +| Grass | Dirt | ++-------+-------+ +``` + +Note: use regular grass, NOT a grass block. + +### Stone Block Light + +``` ++-------+ +| Glass | +| Pane | ++-------+ +| Bulb | ++-------+ +| Stone | +| Block | ++-------+ +``` + +For MineClone 2, use polished stone. + +### Sandstone Block Light + +``` ++-----------+ +| Glass | +| Pane | ++-----------+ +| Bulb | ++-----------+ +| Sandstone | +| Block | ++-----------+ +``` + +For MineClone 2, use cut sandstone. + +### Stair Light + +``` ++-------+------+-------+ +| Steel | Bulb | Steel | ++-------+------+-------+ +``` diff --git a/mods/morelights/modpack.conf b/mods/morelights/modpack.conf new file mode 100644 index 00000000..17afa252 --- /dev/null +++ b/mods/morelights/modpack.conf @@ -0,0 +1,2 @@ +name = mp_morelights +description = A lightweight modpack providing flexible interior and exterior lighting options for different styles of builds. diff --git a/mods/morelights/modpack.txt b/mods/morelights/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/morelights/morelights/init.lua b/mods/morelights/morelights/init.lua new file mode 100644 index 00000000..01c8f2be --- /dev/null +++ b/mods/morelights/morelights/init.lua @@ -0,0 +1,124 @@ +morelights = {} + +-- TODO: Change node definition based on game if groups get too unwieldy. + +function morelights.register_variants(variants, fixedDef) + for _, variant in ipairs(variants) do + local name = variant.name + local def = table.copy(fixedDef) + + for k, v in pairs(variant) do + if k ~= "name" then + def[k] = v + end + end + + minetest.register_node(name, def) + end +end + +function morelights.on_place_hanging(itemstack, placer, pointed_thing, + ceilingName) + local ceiling = minetest.get_node(vector.add(pointed_thing.above, + {x=0, y=1, z=0})) + + if ceiling.name ~= "air" + and minetest.get_item_group(ceiling.name, "mounted_ceiling") == 0 + and not (placer and placer:get_player_control().sneak) then + -- Create a dummy itemstack with the ceiling variant's name. + local fakeStack = ItemStack(itemstack) + fakeStack:set_name(ceilingName) + + minetest.item_place(fakeStack, placer, pointed_thing, 0) + + -- Subtract an item from the real itemstack if a node was placed. + itemstack:set_count(fakeStack:get_count()) + return itemstack + end + + minetest.item_place(itemstack, placer, pointed_thing, 0) + return itemstack +end + +function morelights.rotate_and_place(itemstack, placer, pointed_thing, lookup) + local dir = minetest.dir_to_wallmounted( + vector.subtract(pointed_thing.under, pointed_thing.above)) + local fDirs = lookup or {[0] = 20, 0, 16, 12, 8, 4} + minetest.item_place(itemstack, placer, pointed_thing, fDirs[dir] or 0) + return itemstack +end + + +if minetest.get_modpath("mcl_core") then + morelights.game = "mineclone2" +elseif minetest.get_modpath("default") then + morelights.game = "minetest_game" +else + error("Morelights requires a compatible game " .. + "(Minetest Game or MineClone 2).") +end + +if morelights.game == "minetest_game" then + morelights.sounds = { + default = default.node_sound_defaults(), + glass = default.node_sound_glass_defaults(), + metal = default.node_sound_metal_defaults() + } +elseif morelights.game == "mineclone2" then + morelights.sounds = { + default = mcl_sounds.node_sound_defaults(), + glass = mcl_sounds.node_sound_glass_defaults(), + metal = mcl_sounds.node_sound_metal_defaults() + } +end + +morelights.craft_items = { + glass = "default:glass", + glass_pane = "xpanes:pane_flat", + steel = "default:steel_ingot", + copper = "default:copper_ingot", + tin = "default:tin_ingot", + crystal_fragment = "default:mese_crystal_fragment", + dye_dark = "dye:dark_grey", + dye_light = "dye:white", + wool_dark = "wool:dark_grey", + wool_light = "wool:white", + wood_dark = "default:junglewood", + stone_block = "default:stone_block", + sandstone_block = "default:sandstone_block", + dirt = "default:dirt", + grass = "default:grass_1", + cotton = "farming:cotton", + stick = "default:stick", +} + +local a = morelights.craft_items + +if morelights.game == "mineclone2" then + a.glass = "mcl_core:glass" + a.glass_pane = "xpanes:pane_natural_flat" + a.steel = "mcl_core:iron_ingot" + -- MCL has neither copper nor tin. :( + a.copper = "mesecons:redstone" + a.tin = "mcl_core:iron_ingot" + a.crystal_fragment = "mcl_nether:quartz" + a.dye_dark = "mcl_dye:dark_grey" + a.dye_light = "mcl_dye:white" + a.wool_dark = "mcl_wool:grey" + a.wool_light = "mcl_wool:white" + a.wood_dark = "mcl_core:sprucewood" + a.stone_block = "mcl_core:stone_smooth" + a.sandstone_block = "mcl_core:sandstonesmooth" + a.dirt = "mcl_core:dirt" + a.grass = "mcl_flowers:tallgrass" + a.cotton = "mcl_mobitems:string" + a.stick = "mcl_core:stick" +end + +-- Use basic_materials brass if available, otherwise register our own. +if minetest.get_modpath("basic_materials") then + a.brass = "basic_materials:brass_ingot" +end + +local path = minetest.get_modpath("morelights") +dofile(path .. DIR_DELIM .. "nodes.lua") diff --git a/mods/morelights/morelights/locale/template.txt b/mods/morelights/morelights/locale/template.txt new file mode 100644 index 00000000..f2caa815 --- /dev/null +++ b/mods/morelights/morelights/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain:morelights + +dark= +light= +Light Bulb= +Metal Pole (@1)= +Metal Chain (@1)= diff --git a/mods/morelights/morelights/mod.conf b/mods/morelights/morelights/mod.conf new file mode 100644 index 00000000..6b597e94 --- /dev/null +++ b/mods/morelights/morelights/mod.conf @@ -0,0 +1,3 @@ +name = morelights +description = Base mod providing basic items, which the rest of the modpack depends on. +optional_depends = default, mcl_core diff --git a/mods/morelights/morelights/models/morelights_chain.obj b/mods/morelights/morelights/models/morelights_chain.obj new file mode 100644 index 00000000..70402883 --- /dev/null +++ b/mods/morelights/morelights/models/morelights_chain.obj @@ -0,0 +1,590 @@ +# Blender v2.79 (sub 0) OBJ File: 'chain_merged.blend' +# www.blender.org +o Torus +v 0.000000 0.343753 0.000000 +v 0.015625 0.359378 0.000000 +v 0.000000 0.375003 0.000000 +v -0.015625 0.359378 0.000000 +v 0.000000 0.375003 -0.054127 +v 0.015625 0.382815 -0.040595 +v 0.000000 0.390628 -0.027063 +v -0.015625 0.382815 -0.040595 +v 0.000000 0.500003 -0.054127 +v 0.015625 0.492190 -0.040595 +v 0.000000 0.484378 -0.027063 +v -0.015625 0.492190 -0.040595 +v 0.000000 0.531253 -0.000000 +v 0.015625 0.515628 -0.000000 +v 0.000000 0.500003 -0.000000 +v -0.015625 0.515628 -0.000000 +v 0.000000 0.500003 0.054127 +v 0.015625 0.492190 0.040595 +v 0.000000 0.484378 0.027063 +v -0.015625 0.492190 0.040595 +v 0.000000 0.375003 0.054127 +v 0.015625 0.382815 0.040595 +v 0.000000 0.390628 0.027063 +v -0.015625 0.382815 0.040595 +v 0.000000 -0.156247 0.000000 +v 0.015625 -0.140622 0.000000 +v 0.000000 -0.124997 0.000000 +v -0.015625 -0.140622 0.000000 +v 0.000000 -0.124997 -0.054127 +v 0.015625 -0.117185 -0.040595 +v 0.000000 -0.109372 -0.027063 +v -0.015625 -0.117185 -0.040595 +v -0.000000 0.000003 -0.054127 +v 0.015625 -0.007810 -0.040595 +v -0.000000 -0.015622 -0.027063 +v -0.015625 -0.007810 -0.040595 +v -0.000000 0.031253 -0.000000 +v 0.015625 0.015628 -0.000000 +v -0.000000 0.000003 -0.000000 +v -0.015625 0.015628 -0.000000 +v -0.000000 0.000003 0.054127 +v 0.015625 -0.007810 0.040595 +v -0.000000 -0.015622 0.027063 +v -0.015625 -0.007810 0.040595 +v 0.000000 -0.124997 0.054127 +v 0.015625 -0.117185 0.040595 +v 0.000000 -0.109372 0.027063 +v -0.015625 -0.117185 0.040595 +v 0.000000 -0.281247 0.000000 +v 0.000000 -0.265622 0.015625 +v 0.000000 -0.249997 0.000000 +v 0.000000 -0.265622 -0.015625 +v 0.054127 -0.249997 0.000000 +v 0.040595 -0.242185 0.015625 +v 0.027063 -0.234372 0.000000 +v 0.040595 -0.242185 -0.015625 +v 0.054127 -0.124997 0.000000 +v 0.040595 -0.132810 0.015625 +v 0.027063 -0.140622 0.000000 +v 0.040595 -0.132810 -0.015625 +v 0.000000 -0.093747 0.000000 +v -0.000000 -0.109372 0.015625 +v 0.000000 -0.109372 -0.015625 +v -0.054127 -0.124997 -0.000000 +v -0.040595 -0.132810 0.015625 +v -0.027063 -0.140622 -0.000000 +v -0.040595 -0.132810 -0.015625 +v -0.054127 -0.249997 -0.000000 +v -0.040595 -0.242185 0.015625 +v -0.027063 -0.234372 -0.000000 +v -0.040595 -0.242185 -0.015625 +v -0.000000 -0.531247 0.000000 +v -0.000000 -0.515622 0.015625 +v -0.000000 -0.499997 0.000000 +v -0.000000 -0.515622 -0.015625 +v 0.054127 -0.499997 0.000000 +v 0.040595 -0.492185 0.015625 +v 0.027063 -0.484372 0.000000 +v 0.040595 -0.492185 -0.015625 +v 0.054127 -0.374997 0.000000 +v 0.040595 -0.382810 0.015625 +v 0.027063 -0.390622 0.000000 +v 0.040595 -0.382810 -0.015625 +v -0.000000 -0.343747 0.000000 +v -0.000000 -0.359372 0.015625 +v -0.000000 -0.374997 0.000000 +v -0.000000 -0.359372 -0.015625 +v -0.054127 -0.374997 -0.000000 +v -0.040595 -0.382810 0.015625 +v -0.027063 -0.390622 -0.000000 +v -0.040595 -0.382810 -0.015625 +v -0.054127 -0.499997 -0.000000 +v -0.040595 -0.492185 0.015625 +v -0.027063 -0.484372 -0.000000 +v -0.040595 -0.492185 -0.015625 +v 0.000000 -0.406247 0.000000 +v 0.015625 -0.390622 0.000000 +v -0.015625 -0.390622 0.000000 +v 0.000000 -0.374997 -0.054127 +v 0.015625 -0.367185 -0.040595 +v 0.000000 -0.359372 -0.027063 +v -0.015625 -0.367185 -0.040595 +v -0.000000 -0.249997 -0.054127 +v 0.015625 -0.257810 -0.040595 +v -0.000000 -0.265622 -0.027063 +v -0.015625 -0.257810 -0.040595 +v -0.000000 -0.218747 -0.000000 +v 0.015625 -0.234372 -0.000000 +v -0.015625 -0.234372 -0.000000 +v -0.000000 -0.249997 0.054127 +v 0.015625 -0.257810 0.040595 +v -0.000000 -0.265622 0.027063 +v -0.015625 -0.257810 0.040595 +v 0.000000 -0.374997 0.054127 +v 0.015625 -0.367185 0.040595 +v 0.000000 -0.359372 0.027063 +v -0.015625 -0.367185 0.040595 +v 0.000000 0.093753 0.000000 +v 0.015625 0.109378 0.000000 +v -0.015625 0.109378 0.000000 +v 0.000000 0.125003 -0.054127 +v 0.015625 0.132815 -0.040595 +v 0.000000 0.140628 -0.027063 +v -0.015625 0.132815 -0.040595 +v 0.000000 0.250003 -0.054127 +v 0.015625 0.242190 -0.040595 +v 0.000000 0.234378 -0.027063 +v -0.015625 0.242190 -0.040595 +v 0.000000 0.281253 -0.000000 +v 0.015625 0.265628 -0.000000 +v 0.000000 0.250003 -0.000000 +v -0.015625 0.265628 -0.000000 +v 0.000000 0.250003 0.054127 +v 0.015625 0.242190 0.040595 +v 0.000000 0.234378 0.027063 +v -0.015625 0.242190 0.040595 +v 0.000000 0.125003 0.054127 +v 0.015625 0.132815 0.040595 +v 0.000000 0.140628 0.027063 +v -0.015625 0.132815 0.040595 +v 0.000000 -0.031247 0.000000 +v 0.000000 -0.015622 0.015625 +v 0.000000 -0.015622 -0.015625 +v 0.054127 0.000003 0.000000 +v 0.040595 0.007815 0.015625 +v 0.027063 0.015628 0.000000 +v 0.040595 0.007815 -0.015625 +v 0.054127 0.125003 0.000000 +v 0.040595 0.117190 0.015625 +v 0.027063 0.109378 0.000000 +v 0.040595 0.117190 -0.015625 +v 0.000000 0.156253 0.000000 +v 0.000000 0.140628 0.015625 +v 0.000000 0.125003 0.000000 +v 0.000000 0.140628 -0.015625 +v -0.054127 0.125003 -0.000000 +v -0.040595 0.117190 0.015625 +v -0.027063 0.109378 -0.000000 +v -0.040595 0.117190 -0.015625 +v -0.054127 0.000003 -0.000000 +v -0.040595 0.007815 0.015625 +v -0.027063 0.015628 -0.000000 +v -0.040595 0.007815 -0.015625 +v 0.000000 0.218753 0.000000 +v 0.000000 0.234378 0.015625 +v 0.000000 0.234378 -0.015625 +v 0.054127 0.250003 0.000000 +v 0.040595 0.257815 0.015625 +v 0.027063 0.265628 0.000000 +v 0.040595 0.257815 -0.015625 +v 0.054127 0.375003 0.000000 +v 0.040595 0.367190 0.015625 +v 0.027063 0.359378 0.000000 +v 0.040595 0.367190 -0.015625 +v 0.000000 0.406253 0.000000 +v 0.000000 0.390628 0.015625 +v 0.000000 0.390628 -0.015625 +v -0.054127 0.375003 -0.000000 +v -0.040595 0.367190 0.015625 +v -0.027063 0.359378 -0.000000 +v -0.040595 0.367190 -0.015625 +v -0.054127 0.250003 -0.000000 +v -0.040595 0.257815 0.015625 +v -0.027063 0.265628 -0.000000 +v -0.040595 0.257815 -0.015625 +vt 0.500000 0.823529 +vt 0.469913 0.852941 +vt 0.468750 0.860294 +vt 0.491315 0.838235 +vt 0.484957 0.867647 +vt 0.500000 0.852941 +vt 0.486120 0.860294 +vt 0.508685 0.838235 +vt 0.469913 0.970588 +vt 0.468750 0.963235 +vt 0.484957 0.955882 +vt 0.486120 0.963235 +vt 0.500000 1.000000 +vt 0.491315 0.985294 +vt 0.500000 0.970588 +vt 0.508685 0.985294 +vt 0.530087 0.970588 +vt 0.513880 0.963235 +vt 0.515043 0.955882 +vt 0.531250 0.963235 +vt 0.530087 0.852941 +vt 0.513880 0.860294 +vt 0.515043 0.867647 +vt 0.531250 0.860294 +vt 0.500000 0.352941 +vt 0.469913 0.382353 +vt 0.468750 0.389706 +vt 0.491315 0.367647 +vt 0.484957 0.397059 +vt 0.500000 0.382353 +vt 0.486120 0.389706 +vt 0.508685 0.367647 +vt 0.469913 0.500000 +vt 0.468750 0.492647 +vt 0.484957 0.485294 +vt 0.486120 0.492647 +vt 0.500000 0.529412 +vt 0.491315 0.514706 +vt 0.500000 0.500000 +vt 0.508685 0.514706 +vt 0.530087 0.500000 +vt 0.513880 0.492647 +vt 0.515043 0.485294 +vt 0.531250 0.492647 +vt 0.530087 0.382353 +vt 0.513880 0.389706 +vt 0.515043 0.397059 +vt 0.531250 0.389706 +vt 0.500000 0.235294 +vt 0.469913 0.264706 +vt 0.486120 0.272059 +vt 0.508685 0.250000 +vt 0.484957 0.279412 +vt 0.500000 0.264706 +vt 0.468750 0.272059 +vt 0.491315 0.250000 +vt 0.469913 0.382353 +vt 0.486120 0.375000 +vt 0.484957 0.367647 +vt 0.468750 0.375000 +vt 0.500000 0.411765 +vt 0.508685 0.397059 +vt 0.491315 0.397059 +vt 0.530087 0.382353 +vt 0.531250 0.375000 +vt 0.515043 0.367647 +vt 0.513880 0.375000 +vt 0.530087 0.264706 +vt 0.531250 0.272059 +vt 0.515043 0.279412 +vt 0.513880 0.272059 +vt 0.500000 0.000000 +vt 0.469913 0.029412 +vt 0.486120 0.036765 +vt 0.508685 0.014706 +vt 0.484957 0.044118 +vt 0.500000 0.029412 +vt 0.468750 0.036765 +vt 0.491315 0.014706 +vt 0.469913 0.147059 +vt 0.486120 0.139706 +vt 0.484957 0.132353 +vt 0.468750 0.139706 +vt 0.500000 0.176471 +vt 0.508685 0.161765 +vt 0.500000 0.147059 +vt 0.491315 0.161765 +vt 0.530087 0.147059 +vt 0.531250 0.139706 +vt 0.515043 0.132353 +vt 0.513880 0.139706 +vt 0.530087 0.029412 +vt 0.531250 0.036765 +vt 0.515043 0.044118 +vt 0.513880 0.036765 +vt 0.500000 0.117647 +vt 0.469913 0.147059 +vt 0.468750 0.154412 +vt 0.491315 0.132353 +vt 0.484957 0.161765 +vt 0.486120 0.154412 +vt 0.508685 0.132353 +vt 0.469913 0.264706 +vt 0.468750 0.257353 +vt 0.484957 0.250000 +vt 0.486120 0.257353 +vt 0.500000 0.294118 +vt 0.491315 0.279412 +vt 0.508685 0.279412 +vt 0.530087 0.264706 +vt 0.513880 0.257353 +vt 0.515043 0.250000 +vt 0.531250 0.257353 +vt 0.530087 0.147059 +vt 0.513880 0.154412 +vt 0.515043 0.161765 +vt 0.531250 0.154412 +vt 0.500000 0.588235 +vt 0.469913 0.617647 +vt 0.468750 0.625000 +vt 0.491315 0.602941 +vt 0.484957 0.632353 +vt 0.500000 0.617647 +vt 0.486120 0.625000 +vt 0.508685 0.602941 +vt 0.469913 0.735294 +vt 0.468750 0.727941 +vt 0.484957 0.720588 +vt 0.486120 0.727941 +vt 0.500000 0.764706 +vt 0.491315 0.750000 +vt 0.500000 0.735294 +vt 0.508685 0.750000 +vt 0.530087 0.735294 +vt 0.513880 0.727941 +vt 0.515043 0.720588 +vt 0.531250 0.727941 +vt 0.530087 0.617647 +vt 0.513880 0.625000 +vt 0.515043 0.632353 +vt 0.531250 0.625000 +vt 0.500000 0.470588 +vt 0.469913 0.500000 +vt 0.486120 0.507353 +vt 0.508685 0.485294 +vt 0.484957 0.514706 +vt 0.468750 0.507353 +vt 0.491315 0.485294 +vt 0.469913 0.617647 +vt 0.486120 0.610294 +vt 0.484957 0.602941 +vt 0.468750 0.610294 +vt 0.500000 0.647059 +vt 0.508685 0.632353 +vt 0.491315 0.632353 +vt 0.530087 0.617647 +vt 0.531250 0.610294 +vt 0.515043 0.602941 +vt 0.513880 0.610294 +vt 0.530087 0.500000 +vt 0.531250 0.507353 +vt 0.515043 0.514706 +vt 0.513880 0.507353 +vt 0.500000 0.705882 +vt 0.469913 0.735294 +vt 0.486120 0.742647 +vt 0.508685 0.720588 +vt 0.484957 0.750000 +vt 0.468750 0.742647 +vt 0.491315 0.720588 +vt 0.469913 0.852941 +vt 0.486120 0.845588 +vt 0.484957 0.838235 +vt 0.468750 0.845588 +vt 0.500000 0.882353 +vt 0.508685 0.867647 +vt 0.491315 0.867647 +vt 0.530087 0.852941 +vt 0.531250 0.845588 +vt 0.515043 0.838235 +vt 0.513880 0.845588 +vt 0.530087 0.735294 +vt 0.531250 0.742647 +vt 0.515043 0.750000 +vt 0.513880 0.742647 +vn 0.6547 -0.6547 -0.3780 +vn 0.6547 0.6547 0.3780 +vn -0.6547 0.6547 0.3780 +vn -0.6547 -0.6547 -0.3780 +vn 0.6547 0.0000 -0.7559 +vn 0.6547 0.0000 0.7559 +vn -0.6547 -0.0000 0.7559 +vn -0.6547 -0.0000 -0.7559 +vn 0.6547 0.6547 -0.3780 +vn 0.6547 -0.6547 0.3780 +vn -0.6547 -0.6547 0.3780 +vn -0.6547 0.6547 -0.3780 +vn 0.3780 -0.6547 0.6547 +vn -0.3780 0.6547 0.6547 +vn -0.3780 0.6547 -0.6547 +vn 0.3780 -0.6547 -0.6547 +vn 0.7559 0.0000 0.6547 +vn -0.7559 -0.0000 0.6547 +vn -0.7559 -0.0000 -0.6547 +vn 0.7559 0.0000 -0.6547 +vn 0.3780 0.6547 0.6547 +vn -0.3780 -0.6547 0.6547 +vn -0.3780 -0.6547 -0.6547 +vn 0.3780 0.6547 -0.6547 +s off +f 1/1/1 5/2/1 6/3/1 2/4/1 +f 2/4/2 6/3/2 7/5/2 3/6/2 +f 3/6/3 7/5/3 8/7/3 4/8/3 +f 4/8/4 8/7/4 5/2/4 1/1/4 +f 5/2/5 9/9/5 10/10/5 6/3/5 +f 6/3/6 10/10/6 11/11/6 7/5/6 +f 7/5/7 11/11/7 12/12/7 8/7/7 +f 8/7/8 12/12/8 9/9/8 5/2/8 +f 9/9/9 13/13/9 14/14/9 10/10/9 +f 10/10/10 14/14/10 15/15/10 11/11/10 +f 11/11/11 15/15/11 16/16/11 12/12/11 +f 12/12/12 16/16/12 13/13/12 9/9/12 +f 13/13/2 17/17/2 18/18/2 14/14/2 +f 14/14/1 18/18/1 19/19/1 15/15/1 +f 15/15/4 19/19/4 20/20/4 16/16/4 +f 16/16/3 20/20/3 17/17/3 13/13/3 +f 17/17/6 21/21/6 22/22/6 18/18/6 +f 18/18/5 22/22/5 23/23/5 19/19/5 +f 19/19/8 23/23/8 24/24/8 20/20/8 +f 20/20/7 24/24/7 21/21/7 17/17/7 +f 21/21/10 1/1/10 2/4/10 22/22/10 +f 22/22/9 2/4/9 3/6/9 23/23/9 +f 23/23/12 3/6/12 4/8/12 24/24/12 +f 24/24/11 4/8/11 1/1/11 21/21/11 +f 25/25/1 29/26/1 30/27/1 26/28/1 +f 26/28/2 30/27/2 31/29/2 27/30/2 +f 27/30/3 31/29/3 32/31/3 28/32/3 +f 28/32/4 32/31/4 29/26/4 25/25/4 +f 29/26/5 33/33/5 34/34/5 30/27/5 +f 30/27/6 34/34/6 35/35/6 31/29/6 +f 31/29/7 35/35/7 36/36/7 32/31/7 +f 32/31/8 36/36/8 33/33/8 29/26/8 +f 33/33/9 37/37/9 38/38/9 34/34/9 +f 34/34/10 38/38/10 39/39/10 35/35/10 +f 35/35/11 39/39/11 40/40/11 36/36/11 +f 36/36/12 40/40/12 37/37/12 33/33/12 +f 37/37/2 41/41/2 42/42/2 38/38/2 +f 38/38/1 42/42/1 43/43/1 39/39/1 +f 39/39/4 43/43/4 44/44/4 40/40/4 +f 40/40/3 44/44/3 41/41/3 37/37/3 +f 41/41/6 45/45/6 46/46/6 42/42/6 +f 42/42/5 46/46/5 47/47/5 43/43/5 +f 43/43/8 47/47/8 48/48/8 44/44/8 +f 44/44/7 48/48/7 45/45/7 41/41/7 +f 45/45/10 25/25/10 26/28/10 46/46/10 +f 46/46/9 26/28/9 27/30/9 47/47/9 +f 47/47/12 27/30/12 28/32/12 48/48/12 +f 48/48/11 28/32/11 25/25/11 45/45/11 +f 49/49/13 53/50/13 54/51/13 50/52/13 +f 50/52/14 54/51/14 55/53/14 51/54/14 +f 51/54/15 55/53/15 56/55/15 52/56/15 +f 52/56/16 56/55/16 53/50/16 49/49/16 +f 53/50/17 57/57/17 58/58/17 54/51/17 +f 54/51/18 58/58/18 59/59/18 55/53/18 +f 55/53/19 59/59/19 60/60/19 56/55/19 +f 56/55/20 60/60/20 57/57/20 53/50/20 +f 57/57/21 61/61/21 62/62/21 58/58/21 +f 58/58/22 62/62/22 27/30/22 59/59/22 +f 59/59/23 27/30/23 63/63/23 60/60/23 +f 60/60/24 63/63/24 61/61/24 57/57/24 +f 61/61/14 64/64/14 65/65/14 62/62/14 +f 62/62/13 65/65/13 66/66/13 27/30/13 +f 27/30/16 66/66/16 67/67/16 63/63/16 +f 63/63/15 67/67/15 64/64/15 61/61/15 +f 64/64/18 68/68/18 69/69/18 65/65/18 +f 65/65/17 69/69/17 70/70/17 66/66/17 +f 66/66/20 70/70/20 71/71/20 67/67/20 +f 67/67/19 71/71/19 68/68/19 64/64/19 +f 68/68/22 49/49/22 50/52/22 69/69/22 +f 69/69/21 50/52/21 51/54/21 70/70/21 +f 70/70/24 51/54/24 52/56/24 71/71/24 +f 71/71/23 52/56/23 49/49/23 68/68/23 +f 72/72/13 76/73/13 77/74/13 73/75/13 +f 73/75/14 77/74/14 78/76/14 74/77/14 +f 74/77/15 78/76/15 79/78/15 75/79/15 +f 75/79/16 79/78/16 76/73/16 72/72/16 +f 76/73/17 80/80/17 81/81/17 77/74/17 +f 77/74/18 81/81/18 82/82/18 78/76/18 +f 78/76/19 82/82/19 83/83/19 79/78/19 +f 79/78/20 83/83/20 80/80/20 76/73/20 +f 80/80/21 84/84/21 85/85/21 81/81/21 +f 81/81/22 85/85/22 86/86/22 82/82/22 +f 82/82/23 86/86/23 87/87/23 83/83/23 +f 83/83/24 87/87/24 84/84/24 80/80/24 +f 84/84/14 88/88/14 89/89/14 85/85/14 +f 85/85/13 89/89/13 90/90/13 86/86/13 +f 86/86/16 90/90/16 91/91/16 87/87/16 +f 87/87/15 91/91/15 88/88/15 84/84/15 +f 88/88/18 92/92/18 93/93/18 89/89/18 +f 89/89/17 93/93/17 94/94/17 90/90/17 +f 90/90/20 94/94/20 95/95/20 91/91/20 +f 91/91/19 95/95/19 92/92/19 88/88/19 +f 92/92/22 72/72/22 73/75/22 93/93/22 +f 93/93/21 73/75/21 74/77/21 94/94/21 +f 94/94/24 74/77/24 75/79/24 95/95/24 +f 95/95/23 75/79/23 72/72/23 92/92/23 +f 96/96/1 99/97/1 100/98/1 97/99/1 +f 97/99/2 100/98/2 101/100/2 86/86/2 +f 86/86/3 101/100/3 102/101/3 98/102/3 +f 98/102/4 102/101/4 99/97/4 96/96/4 +f 99/97/5 103/103/5 104/104/5 100/98/5 +f 100/98/6 104/104/6 105/105/6 101/100/6 +f 101/100/7 105/105/7 106/106/7 102/101/7 +f 102/101/8 106/106/8 103/103/8 99/97/8 +f 103/103/9 107/107/9 108/108/9 104/104/9 +f 104/104/10 108/108/10 51/54/10 105/105/10 +f 105/105/11 51/54/11 109/109/11 106/106/11 +f 106/106/12 109/109/12 107/107/12 103/103/12 +f 107/107/2 110/110/2 111/111/2 108/108/2 +f 108/108/1 111/111/1 112/112/1 51/54/1 +f 51/54/4 112/112/4 113/113/4 109/109/4 +f 109/109/3 113/113/3 110/110/3 107/107/3 +f 110/110/6 114/114/6 115/115/6 111/111/6 +f 111/111/5 115/115/5 116/116/5 112/112/5 +f 112/112/8 116/116/8 117/117/8 113/113/8 +f 113/113/7 117/117/7 114/114/7 110/110/7 +f 114/114/10 96/96/10 97/99/10 115/115/10 +f 115/115/9 97/99/9 86/86/9 116/116/9 +f 116/116/12 86/86/12 98/102/12 117/117/12 +f 117/117/11 98/102/11 96/96/11 114/114/11 +f 118/118/1 121/119/1 122/120/1 119/121/1 +f 119/121/2 122/120/2 123/122/2 154/123/2 +f 154/123/3 123/122/3 124/124/3 120/125/3 +f 120/125/4 124/124/4 121/119/4 118/118/4 +f 121/119/5 125/126/5 126/127/5 122/120/5 +f 122/120/6 126/127/6 127/128/6 123/122/6 +f 123/122/7 127/128/7 128/129/7 124/124/7 +f 124/124/8 128/129/8 125/126/8 121/119/8 +f 125/126/9 129/130/9 130/131/9 126/127/9 +f 126/127/10 130/131/10 131/132/10 127/128/10 +f 127/128/11 131/132/11 132/133/11 128/129/11 +f 128/129/12 132/133/12 129/130/12 125/126/12 +f 129/130/2 133/134/2 134/135/2 130/131/2 +f 130/131/1 134/135/1 135/136/1 131/132/1 +f 131/132/4 135/136/4 136/137/4 132/133/4 +f 132/133/3 136/137/3 133/134/3 129/130/3 +f 133/134/6 137/138/6 138/139/6 134/135/6 +f 134/135/5 138/139/5 139/140/5 135/136/5 +f 135/136/8 139/140/8 140/141/8 136/137/8 +f 136/137/7 140/141/7 137/138/7 133/134/7 +f 137/138/10 118/118/10 119/121/10 138/139/10 +f 138/139/9 119/121/9 154/123/9 139/140/9 +f 139/140/12 154/123/12 120/125/12 140/141/12 +f 140/141/11 120/125/11 118/118/11 137/138/11 +f 141/142/13 144/143/13 145/144/13 142/145/13 +f 142/145/14 145/144/14 146/146/14 39/39/14 +f 39/39/15 146/146/15 147/147/15 143/148/15 +f 143/148/16 147/147/16 144/143/16 141/142/16 +f 144/143/17 148/149/17 149/150/17 145/144/17 +f 145/144/18 149/150/18 150/151/18 146/146/18 +f 146/146/19 150/151/19 151/152/19 147/147/19 +f 147/147/20 151/152/20 148/149/20 144/143/20 +f 148/149/21 152/153/21 153/154/21 149/150/21 +f 149/150/22 153/154/22 154/123/22 150/151/22 +f 150/151/23 154/123/23 155/155/23 151/152/23 +f 151/152/24 155/155/24 152/153/24 148/149/24 +f 152/153/14 156/156/14 157/157/14 153/154/14 +f 153/154/13 157/157/13 158/158/13 154/123/13 +f 154/123/16 158/158/16 159/159/16 155/155/16 +f 155/155/15 159/159/15 156/156/15 152/153/15 +f 156/156/18 160/160/18 161/161/18 157/157/18 +f 157/157/17 161/161/17 162/162/17 158/158/17 +f 158/158/20 162/162/20 163/163/20 159/159/20 +f 159/159/19 163/163/19 160/160/19 156/156/19 +f 160/160/22 141/142/22 142/145/22 161/161/22 +f 161/161/21 142/145/21 39/39/21 162/162/21 +f 162/162/24 39/39/24 143/148/24 163/163/24 +f 163/163/23 143/148/23 141/142/23 160/160/23 +f 164/164/13 167/165/13 168/166/13 165/167/13 +f 165/167/14 168/166/14 169/168/14 131/132/14 +f 131/132/15 169/168/15 170/169/15 166/170/15 +f 166/170/16 170/169/16 167/165/16 164/164/16 +f 167/165/17 171/171/17 172/172/17 168/166/17 +f 168/166/18 172/172/18 173/173/18 169/168/18 +f 169/168/19 173/173/19 174/174/19 170/169/19 +f 170/169/20 174/174/20 171/171/20 167/165/20 +f 171/171/21 175/175/21 176/176/21 172/172/21 +f 172/172/22 176/176/22 3/6/22 173/173/22 +f 173/173/23 3/6/23 177/177/23 174/174/23 +f 174/174/24 177/177/24 175/175/24 171/171/24 +f 175/175/14 178/178/14 179/179/14 176/176/14 +f 176/176/13 179/179/13 180/180/13 3/6/13 +f 3/6/16 180/180/16 181/181/16 177/177/16 +f 177/177/15 181/181/15 178/178/15 175/175/15 +f 178/178/18 182/182/18 183/183/18 179/179/18 +f 179/179/17 183/183/17 184/184/17 180/180/17 +f 180/180/20 184/184/20 185/185/20 181/181/20 +f 181/181/19 185/185/19 182/182/19 178/178/19 +f 182/182/22 164/164/22 165/167/22 183/183/22 +f 183/183/21 165/167/21 131/132/21 184/184/21 +f 184/184/24 131/132/24 166/170/24 185/185/24 +f 185/185/23 166/170/23 164/164/23 182/182/23 diff --git a/mods/morelights/morelights/models/morelights_chain_ceiling.obj b/mods/morelights/morelights/models/morelights_chain_ceiling.obj new file mode 100644 index 00000000..1caf2fc0 --- /dev/null +++ b/mods/morelights/morelights/models/morelights_chain_ceiling.obj @@ -0,0 +1,620 @@ +# Blender v2.79 (sub 0) OBJ File: 'chain_ceiling.blend' +# www.blender.org +o Cube +v -0.187500 0.437500 0.187500 +v -0.187500 0.500000 0.187500 +v -0.187500 0.437500 -0.187500 +v -0.187500 0.500000 -0.187500 +v 0.187500 0.437500 0.187500 +v 0.187500 0.500000 0.187500 +v 0.187500 0.437500 -0.187500 +v 0.187500 0.500000 -0.187500 +vt 0.687500 0.937500 +vt 0.687500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.937500 +vt 0.687500 0.937500 +vt 0.687500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.937500 +vt 0.687500 0.937500 +vt 0.687500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.937500 +vt 0.687500 0.937500 +vt 0.687500 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.937500 +vt 0.312500 0.312500 +vt 0.312500 0.687500 +vt 0.687500 0.687500 +vt 0.687500 0.312500 +vt 0.312500 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.687500 +vt 0.312500 0.687500 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/5/2 4/6/2 8/7/2 7/8/2 +f 7/9/3 8/10/3 6/11/3 5/12/3 +f 5/13/4 6/14/4 2/15/4 1/16/4 +f 3/17/5 7/18/5 5/19/5 1/20/5 +f 8/21/6 4/22/6 2/23/6 6/24/6 +o Torus +v 0.000000 0.343753 0.000000 +v 0.015625 0.359378 0.000000 +v 0.000000 0.375003 0.000000 +v -0.015625 0.359378 0.000000 +v 0.000000 0.375003 -0.054127 +v 0.015625 0.382815 -0.040595 +v 0.000000 0.390628 -0.027063 +v -0.015625 0.382815 -0.040595 +v 0.000000 0.375003 0.054127 +v 0.015625 0.382815 0.040595 +v 0.000000 0.390628 0.027063 +v -0.015625 0.382815 0.040595 +v 0.000000 -0.156247 0.000000 +v 0.015625 -0.140622 0.000000 +v 0.000000 -0.124997 0.000000 +v -0.015625 -0.140622 0.000000 +v 0.000000 -0.124997 -0.054127 +v 0.015625 -0.117185 -0.040595 +v 0.000000 -0.109372 -0.027063 +v -0.015625 -0.117185 -0.040595 +v -0.000000 0.000003 -0.054127 +v 0.015625 -0.007810 -0.040595 +v -0.000000 -0.015622 -0.027063 +v -0.015625 -0.007810 -0.040595 +v -0.000000 0.031253 -0.000000 +v 0.015625 0.015628 -0.000000 +v -0.000000 0.000003 -0.000000 +v -0.015625 0.015628 -0.000000 +v -0.000000 0.000003 0.054127 +v 0.015625 -0.007810 0.040595 +v -0.000000 -0.015622 0.027063 +v -0.015625 -0.007810 0.040595 +v 0.000000 -0.124997 0.054127 +v 0.015625 -0.117185 0.040595 +v 0.000000 -0.109372 0.027063 +v -0.015625 -0.117185 0.040595 +v 0.000000 -0.281247 0.000000 +v 0.000000 -0.265622 0.015625 +v 0.000000 -0.249997 0.000000 +v 0.000000 -0.265622 -0.015625 +v 0.054127 -0.249997 0.000000 +v 0.040595 -0.242185 0.015625 +v 0.027063 -0.234372 0.000000 +v 0.040595 -0.242185 -0.015625 +v 0.054127 -0.124997 0.000000 +v 0.040595 -0.132810 0.015625 +v 0.027063 -0.140622 0.000000 +v 0.040595 -0.132810 -0.015625 +v 0.000000 -0.093747 0.000000 +v -0.000000 -0.109372 0.015625 +v 0.000000 -0.109372 -0.015625 +v -0.054127 -0.124997 -0.000000 +v -0.040595 -0.132810 0.015625 +v -0.027063 -0.140622 -0.000000 +v -0.040595 -0.132810 -0.015625 +v -0.054127 -0.249997 -0.000000 +v -0.040595 -0.242185 0.015625 +v -0.027063 -0.234372 -0.000000 +v -0.040595 -0.242185 -0.015625 +v -0.000000 -0.531247 0.000000 +v -0.000000 -0.515622 0.015625 +v -0.000000 -0.499997 0.000000 +v -0.000000 -0.515622 -0.015625 +v 0.054127 -0.499997 0.000000 +v 0.040595 -0.492185 0.015625 +v 0.027063 -0.484372 0.000000 +v 0.040595 -0.492185 -0.015625 +v 0.054127 -0.374997 0.000000 +v 0.040595 -0.382810 0.015625 +v 0.027063 -0.390622 0.000000 +v 0.040595 -0.382810 -0.015625 +v -0.000000 -0.343747 0.000000 +v -0.000000 -0.359372 0.015625 +v -0.000000 -0.374997 0.000000 +v -0.000000 -0.359372 -0.015625 +v -0.054127 -0.374997 -0.000000 +v -0.040595 -0.382810 0.015625 +v -0.027063 -0.390622 -0.000000 +v -0.040595 -0.382810 -0.015625 +v -0.054127 -0.499997 -0.000000 +v -0.040595 -0.492185 0.015625 +v -0.027063 -0.484372 -0.000000 +v -0.040595 -0.492185 -0.015625 +v 0.000000 -0.406247 0.000000 +v 0.015625 -0.390622 0.000000 +v -0.015625 -0.390622 0.000000 +v 0.000000 -0.374997 -0.054127 +v 0.015625 -0.367185 -0.040595 +v 0.000000 -0.359372 -0.027063 +v -0.015625 -0.367185 -0.040595 +v -0.000000 -0.249997 -0.054127 +v 0.015625 -0.257810 -0.040595 +v -0.000000 -0.265622 -0.027063 +v -0.015625 -0.257810 -0.040595 +v -0.000000 -0.218747 -0.000000 +v 0.015625 -0.234372 -0.000000 +v -0.015625 -0.234372 -0.000000 +v -0.000000 -0.249997 0.054127 +v 0.015625 -0.257810 0.040595 +v -0.000000 -0.265622 0.027063 +v -0.015625 -0.257810 0.040595 +v 0.000000 -0.374997 0.054127 +v 0.015625 -0.367185 0.040595 +v 0.000000 -0.359372 0.027063 +v -0.015625 -0.367185 0.040595 +v 0.000000 0.093753 0.000000 +v 0.015625 0.109378 0.000000 +v -0.015625 0.109378 0.000000 +v 0.000000 0.125003 -0.054127 +v 0.015625 0.132815 -0.040595 +v 0.000000 0.140628 -0.027063 +v -0.015625 0.132815 -0.040595 +v 0.000000 0.250003 -0.054127 +v 0.015625 0.242190 -0.040595 +v 0.000000 0.234378 -0.027063 +v -0.015625 0.242190 -0.040595 +v 0.000000 0.281253 -0.000000 +v 0.015625 0.265628 -0.000000 +v 0.000000 0.250003 -0.000000 +v -0.015625 0.265628 -0.000000 +v 0.000000 0.250003 0.054127 +v 0.015625 0.242190 0.040595 +v 0.000000 0.234378 0.027063 +v -0.015625 0.242190 0.040595 +v 0.000000 0.125003 0.054127 +v 0.015625 0.132815 0.040595 +v 0.000000 0.140628 0.027063 +v -0.015625 0.132815 0.040595 +v 0.000000 -0.031247 0.000000 +v 0.000000 -0.015622 0.015625 +v 0.000000 -0.015622 -0.015625 +v 0.054127 0.000003 0.000000 +v 0.040595 0.007815 0.015625 +v 0.027063 0.015628 0.000000 +v 0.040595 0.007815 -0.015625 +v 0.054127 0.125003 0.000000 +v 0.040595 0.117190 0.015625 +v 0.027063 0.109378 0.000000 +v 0.040595 0.117190 -0.015625 +v 0.000000 0.156253 0.000000 +v 0.000000 0.140628 0.015625 +v 0.000000 0.125003 0.000000 +v 0.000000 0.140628 -0.015625 +v -0.054127 0.125003 -0.000000 +v -0.040595 0.117190 0.015625 +v -0.027063 0.109378 -0.000000 +v -0.040595 0.117190 -0.015625 +v -0.054127 0.000003 -0.000000 +v -0.040595 0.007815 0.015625 +v -0.027063 0.015628 -0.000000 +v -0.040595 0.007815 -0.015625 +v 0.000000 0.218753 0.000000 +v 0.000000 0.234378 0.015625 +v 0.000000 0.234378 -0.015625 +v 0.054127 0.250003 0.000000 +v 0.040595 0.257815 0.015625 +v 0.027063 0.265628 0.000000 +v 0.040595 0.257815 -0.015625 +v 0.054127 0.375003 0.000000 +v 0.040595 0.367190 0.015625 +v 0.027063 0.359378 0.000000 +v 0.040595 0.367190 -0.015625 +v 0.000000 0.406253 0.000000 +v 0.000000 0.390628 0.015625 +v 0.000000 0.390628 -0.015625 +v -0.054127 0.375003 -0.000000 +v -0.040595 0.367190 0.015625 +v -0.027063 0.359378 -0.000000 +v -0.040595 0.367190 -0.015625 +v -0.054127 0.250003 -0.000000 +v -0.040595 0.257815 0.015625 +v -0.027063 0.265628 -0.000000 +v -0.040595 0.257815 -0.015625 +v 0.000000 0.437500 0.054127 +v -0.015625 0.437500 0.040595 +v 0.000000 0.437500 0.027063 +v 0.015625 0.437500 0.040595 +v 0.000000 0.437500 -0.054127 +v 0.015625 0.437500 -0.040595 +v -0.015625 0.437500 -0.040595 +v 0.000000 0.437500 -0.027063 +vt 0.500000 0.823529 +vt 0.469913 0.852941 +vt 0.468750 0.860294 +vt 0.491315 0.838235 +vt 0.484957 0.867647 +vt 0.500000 0.852941 +vt 0.486120 0.860294 +vt 0.508685 0.838235 +vt 0.469913 0.911762 +vt 0.468750 0.911762 +vt 0.484957 0.911762 +vt 0.486120 0.911762 +vt 0.530087 0.852941 +vt 0.513880 0.860294 +vt 0.515043 0.867647 +vt 0.531250 0.860294 +vt 0.500000 0.352941 +vt 0.469913 0.382353 +vt 0.468750 0.389706 +vt 0.491315 0.367647 +vt 0.484957 0.397059 +vt 0.500000 0.382353 +vt 0.486120 0.389706 +vt 0.508685 0.367647 +vt 0.469913 0.500000 +vt 0.468750 0.492647 +vt 0.484957 0.485294 +vt 0.486120 0.492647 +vt 0.500000 0.529412 +vt 0.491315 0.514706 +vt 0.500000 0.500000 +vt 0.508685 0.514706 +vt 0.530087 0.500000 +vt 0.513880 0.492647 +vt 0.515043 0.485294 +vt 0.531250 0.492647 +vt 0.530087 0.382353 +vt 0.513880 0.389706 +vt 0.515043 0.397059 +vt 0.531250 0.389706 +vt 0.500000 0.235294 +vt 0.469913 0.264706 +vt 0.486120 0.272059 +vt 0.508685 0.250000 +vt 0.484957 0.279412 +vt 0.500000 0.264706 +vt 0.468750 0.272059 +vt 0.491315 0.250000 +vt 0.469913 0.382353 +vt 0.486120 0.375000 +vt 0.484957 0.367647 +vt 0.468750 0.375000 +vt 0.500000 0.411765 +vt 0.508685 0.397059 +vt 0.491315 0.397059 +vt 0.530087 0.382353 +vt 0.531250 0.375000 +vt 0.515043 0.367647 +vt 0.513880 0.375000 +vt 0.530087 0.264706 +vt 0.531250 0.272059 +vt 0.515043 0.279412 +vt 0.513880 0.272059 +vt 0.500000 0.000000 +vt 0.469913 0.029412 +vt 0.486120 0.036765 +vt 0.508685 0.014706 +vt 0.484957 0.044118 +vt 0.500000 0.029412 +vt 0.468750 0.036765 +vt 0.491315 0.014706 +vt 0.469913 0.147059 +vt 0.486120 0.139706 +vt 0.484957 0.132353 +vt 0.468750 0.139706 +vt 0.500000 0.176471 +vt 0.508685 0.161765 +vt 0.500000 0.147059 +vt 0.491315 0.161765 +vt 0.530087 0.147059 +vt 0.531250 0.139706 +vt 0.515043 0.132353 +vt 0.513880 0.139706 +vt 0.530087 0.029412 +vt 0.531250 0.036765 +vt 0.515043 0.044118 +vt 0.513880 0.036765 +vt 0.500000 0.117647 +vt 0.469913 0.147059 +vt 0.468750 0.154412 +vt 0.491315 0.132353 +vt 0.484957 0.161765 +vt 0.486120 0.154412 +vt 0.508685 0.132353 +vt 0.469913 0.264706 +vt 0.468750 0.257353 +vt 0.484957 0.250000 +vt 0.486120 0.257353 +vt 0.500000 0.294118 +vt 0.491315 0.279412 +vt 0.508685 0.279412 +vt 0.530087 0.264706 +vt 0.513880 0.257353 +vt 0.515043 0.250000 +vt 0.531250 0.257353 +vt 0.530087 0.147059 +vt 0.513880 0.154412 +vt 0.515043 0.161765 +vt 0.531250 0.154412 +vt 0.500000 0.588235 +vt 0.469913 0.617647 +vt 0.468750 0.625000 +vt 0.491315 0.602941 +vt 0.484957 0.632353 +vt 0.500000 0.617647 +vt 0.486120 0.625000 +vt 0.508685 0.602941 +vt 0.469913 0.735294 +vt 0.468750 0.727941 +vt 0.484957 0.720588 +vt 0.486120 0.727941 +vt 0.500000 0.764706 +vt 0.491315 0.750000 +vt 0.500000 0.735294 +vt 0.508685 0.750000 +vt 0.530087 0.735294 +vt 0.513880 0.727941 +vt 0.515043 0.720588 +vt 0.531250 0.727941 +vt 0.530087 0.617647 +vt 0.513880 0.625000 +vt 0.515043 0.632353 +vt 0.531250 0.625000 +vt 0.500000 0.470588 +vt 0.469913 0.500000 +vt 0.486120 0.507353 +vt 0.508685 0.485294 +vt 0.484957 0.514706 +vt 0.468750 0.507353 +vt 0.491315 0.485294 +vt 0.469913 0.617647 +vt 0.486120 0.610294 +vt 0.484957 0.602941 +vt 0.468750 0.610294 +vt 0.500000 0.647059 +vt 0.508685 0.632353 +vt 0.491315 0.632353 +vt 0.530087 0.617647 +vt 0.531250 0.610294 +vt 0.515043 0.602941 +vt 0.513880 0.610294 +vt 0.530087 0.500000 +vt 0.531250 0.507353 +vt 0.515043 0.514706 +vt 0.513880 0.507353 +vt 0.500000 0.705882 +vt 0.469913 0.735294 +vt 0.486120 0.742647 +vt 0.508685 0.720588 +vt 0.484957 0.750000 +vt 0.468750 0.742647 +vt 0.491315 0.720588 +vt 0.469913 0.852941 +vt 0.486120 0.845588 +vt 0.484957 0.838235 +vt 0.468750 0.845588 +vt 0.500000 0.882353 +vt 0.508685 0.867647 +vt 0.491315 0.867647 +vt 0.530087 0.852941 +vt 0.531250 0.845588 +vt 0.515043 0.838235 +vt 0.513880 0.845588 +vt 0.530087 0.735294 +vt 0.531250 0.742647 +vt 0.515043 0.750000 +vt 0.513880 0.742647 +vt 0.530087 0.911762 +vt 0.531250 0.911762 +vt 0.515043 0.911762 +vt 0.513880 0.911762 +vn 0.6547 -0.6547 -0.3780 +vn 0.6547 0.6547 0.3780 +vn -0.6547 0.6547 0.3780 +vn -0.6547 -0.6547 -0.3780 +vn 0.6547 0.0000 -0.7559 +vn 0.6547 0.0000 0.7559 +vn -0.6547 -0.0000 0.7559 +vn -0.6547 -0.0000 -0.7559 +vn 0.6547 -0.6547 0.3780 +vn 0.6547 0.6547 -0.3780 +vn -0.6547 0.6547 -0.3780 +vn -0.6547 -0.6547 0.3780 +vn 0.3780 -0.6547 0.6547 +vn -0.3780 0.6547 0.6547 +vn -0.3780 0.6547 -0.6547 +vn 0.3780 -0.6547 -0.6547 +vn 0.7559 0.0000 0.6547 +vn -0.7559 -0.0000 0.6547 +vn -0.7559 -0.0000 -0.6547 +vn 0.7559 0.0000 -0.6547 +vn 0.3780 0.6547 0.6547 +vn -0.3780 -0.6547 0.6547 +vn -0.3780 -0.6547 -0.6547 +vn 0.3780 0.6547 -0.6547 +s off +f 9/25/7 13/26/7 14/27/7 10/28/7 +f 10/28/8 14/27/8 15/29/8 11/30/8 +f 11/30/9 15/29/9 16/31/9 12/32/9 +f 12/32/10 16/31/10 13/26/10 9/25/10 +f 13/26/11 186/33/11 187/34/11 14/27/11 +f 14/27/12 187/34/12 189/35/12 15/29/12 +f 15/29/13 189/35/13 188/36/13 16/31/13 +f 16/31/14 188/36/14 186/33/14 13/26/14 +f 17/37/15 9/25/15 10/28/15 18/38/15 +f 18/38/16 10/28/16 11/30/16 19/39/16 +f 19/39/17 11/30/17 12/32/17 20/40/17 +f 20/40/18 12/32/18 9/25/18 17/37/18 +f 21/41/7 25/42/7 26/43/7 22/44/7 +f 22/44/8 26/43/8 27/45/8 23/46/8 +f 23/46/9 27/45/9 28/47/9 24/48/9 +f 24/48/10 28/47/10 25/42/10 21/41/10 +f 25/42/11 29/49/11 30/50/11 26/43/11 +f 26/43/12 30/50/12 31/51/12 27/45/12 +f 27/45/13 31/51/13 32/52/13 28/47/13 +f 28/47/14 32/52/14 29/49/14 25/42/14 +f 29/49/16 33/53/16 34/54/16 30/50/16 +f 30/50/15 34/54/15 35/55/15 31/51/15 +f 31/51/18 35/55/18 36/56/18 32/52/18 +f 32/52/17 36/56/17 33/53/17 29/49/17 +f 33/53/8 37/57/8 38/58/8 34/54/8 +f 34/54/7 38/58/7 39/59/7 35/55/7 +f 35/55/10 39/59/10 40/60/10 36/56/10 +f 36/56/9 40/60/9 37/57/9 33/53/9 +f 37/57/12 41/61/12 42/62/12 38/58/12 +f 38/58/11 42/62/11 43/63/11 39/59/11 +f 39/59/14 43/63/14 44/64/14 40/60/14 +f 40/60/13 44/64/13 41/61/13 37/57/13 +f 41/61/15 21/41/15 22/44/15 42/62/15 +f 42/62/16 22/44/16 23/46/16 43/63/16 +f 43/63/17 23/46/17 24/48/17 44/64/17 +f 44/64/18 24/48/18 21/41/18 41/61/18 +f 45/65/19 49/66/19 50/67/19 46/68/19 +f 46/68/20 50/67/20 51/69/20 47/70/20 +f 47/70/21 51/69/21 52/71/21 48/72/21 +f 48/72/22 52/71/22 49/66/22 45/65/22 +f 49/66/23 53/73/23 54/74/23 50/67/23 +f 50/67/24 54/74/24 55/75/24 51/69/24 +f 51/69/25 55/75/25 56/76/25 52/71/25 +f 52/71/26 56/76/26 53/73/26 49/66/26 +f 53/73/27 57/77/27 58/78/27 54/74/27 +f 54/74/28 58/78/28 23/46/28 55/75/28 +f 55/75/29 23/46/29 59/79/29 56/76/29 +f 56/76/30 59/79/30 57/77/30 53/73/30 +f 57/77/20 60/80/20 61/81/20 58/78/20 +f 58/78/19 61/81/19 62/82/19 23/46/19 +f 23/46/22 62/82/22 63/83/22 59/79/22 +f 59/79/21 63/83/21 60/80/21 57/77/21 +f 60/80/24 64/84/24 65/85/24 61/81/24 +f 61/81/23 65/85/23 66/86/23 62/82/23 +f 62/82/26 66/86/26 67/87/26 63/83/26 +f 63/83/25 67/87/25 64/84/25 60/80/25 +f 64/84/28 45/65/28 46/68/28 65/85/28 +f 65/85/27 46/68/27 47/70/27 66/86/27 +f 66/86/30 47/70/30 48/72/30 67/87/30 +f 67/87/29 48/72/29 45/65/29 64/84/29 +f 68/88/19 72/89/19 73/90/19 69/91/19 +f 69/91/20 73/90/20 74/92/20 70/93/20 +f 70/93/21 74/92/21 75/94/21 71/95/21 +f 71/95/22 75/94/22 72/89/22 68/88/22 +f 72/89/23 76/96/23 77/97/23 73/90/23 +f 73/90/24 77/97/24 78/98/24 74/92/24 +f 74/92/25 78/98/25 79/99/25 75/94/25 +f 75/94/26 79/99/26 76/96/26 72/89/26 +f 76/96/27 80/100/27 81/101/27 77/97/27 +f 77/97/28 81/101/28 82/102/28 78/98/28 +f 78/98/29 82/102/29 83/103/29 79/99/29 +f 79/99/30 83/103/30 80/100/30 76/96/30 +f 80/100/20 84/104/20 85/105/20 81/101/20 +f 81/101/19 85/105/19 86/106/19 82/102/19 +f 82/102/22 86/106/22 87/107/22 83/103/22 +f 83/103/21 87/107/21 84/104/21 80/100/21 +f 84/104/24 88/108/24 89/109/24 85/105/24 +f 85/105/23 89/109/23 90/110/23 86/106/23 +f 86/106/26 90/110/26 91/111/26 87/107/26 +f 87/107/25 91/111/25 88/108/25 84/104/25 +f 88/108/28 68/88/28 69/91/28 89/109/28 +f 89/109/27 69/91/27 70/93/27 90/110/27 +f 90/110/30 70/93/30 71/95/30 91/111/30 +f 91/111/29 71/95/29 68/88/29 88/108/29 +f 92/112/7 95/113/7 96/114/7 93/115/7 +f 93/115/8 96/114/8 97/116/8 82/102/8 +f 82/102/9 97/116/9 98/117/9 94/118/9 +f 94/118/10 98/117/10 95/113/10 92/112/10 +f 95/113/11 99/119/11 100/120/11 96/114/11 +f 96/114/12 100/120/12 101/121/12 97/116/12 +f 97/116/13 101/121/13 102/122/13 98/117/13 +f 98/117/14 102/122/14 99/119/14 95/113/14 +f 99/119/16 103/123/16 104/124/16 100/120/16 +f 100/120/15 104/124/15 47/70/15 101/121/15 +f 101/121/18 47/70/18 105/125/18 102/122/18 +f 102/122/17 105/125/17 103/123/17 99/119/17 +f 103/123/8 106/126/8 107/127/8 104/124/8 +f 104/124/7 107/127/7 108/128/7 47/70/7 +f 47/70/10 108/128/10 109/129/10 105/125/10 +f 105/125/9 109/129/9 106/126/9 103/123/9 +f 106/126/12 110/130/12 111/131/12 107/127/12 +f 107/127/11 111/131/11 112/132/11 108/128/11 +f 108/128/14 112/132/14 113/133/14 109/129/14 +f 109/129/13 113/133/13 110/130/13 106/126/13 +f 110/130/15 92/112/15 93/115/15 111/131/15 +f 111/131/16 93/115/16 82/102/16 112/132/16 +f 112/132/17 82/102/17 94/118/17 113/133/17 +f 113/133/18 94/118/18 92/112/18 110/130/18 +f 114/134/7 117/135/7 118/136/7 115/137/7 +f 115/137/8 118/136/8 119/138/8 150/139/8 +f 150/139/9 119/138/9 120/140/9 116/141/9 +f 116/141/10 120/140/10 117/135/10 114/134/10 +f 117/135/11 121/142/11 122/143/11 118/136/11 +f 118/136/12 122/143/12 123/144/12 119/138/12 +f 119/138/13 123/144/13 124/145/13 120/140/13 +f 120/140/14 124/145/14 121/142/14 117/135/14 +f 121/142/16 125/146/16 126/147/16 122/143/16 +f 122/143/15 126/147/15 127/148/15 123/144/15 +f 123/144/18 127/148/18 128/149/18 124/145/18 +f 124/145/17 128/149/17 125/146/17 121/142/17 +f 125/146/8 129/150/8 130/151/8 126/147/8 +f 126/147/7 130/151/7 131/152/7 127/148/7 +f 127/148/10 131/152/10 132/153/10 128/149/10 +f 128/149/9 132/153/9 129/150/9 125/146/9 +f 129/150/12 133/154/12 134/155/12 130/151/12 +f 130/151/11 134/155/11 135/156/11 131/152/11 +f 131/152/14 135/156/14 136/157/14 132/153/14 +f 132/153/13 136/157/13 133/154/13 129/150/13 +f 133/154/15 114/134/15 115/137/15 134/155/15 +f 134/155/16 115/137/16 150/139/16 135/156/16 +f 135/156/17 150/139/17 116/141/17 136/157/17 +f 136/157/18 116/141/18 114/134/18 133/154/18 +f 137/158/19 140/159/19 141/160/19 138/161/19 +f 138/161/20 141/160/20 142/162/20 35/55/20 +f 35/55/21 142/162/21 143/163/21 139/164/21 +f 139/164/22 143/163/22 140/159/22 137/158/22 +f 140/159/23 144/165/23 145/166/23 141/160/23 +f 141/160/24 145/166/24 146/167/24 142/162/24 +f 142/162/25 146/167/25 147/168/25 143/163/25 +f 143/163/26 147/168/26 144/165/26 140/159/26 +f 144/165/27 148/169/27 149/170/27 145/166/27 +f 145/166/28 149/170/28 150/139/28 146/167/28 +f 146/167/29 150/139/29 151/171/29 147/168/29 +f 147/168/30 151/171/30 148/169/30 144/165/30 +f 148/169/20 152/172/20 153/173/20 149/170/20 +f 149/170/19 153/173/19 154/174/19 150/139/19 +f 150/139/22 154/174/22 155/175/22 151/171/22 +f 151/171/21 155/175/21 152/172/21 148/169/21 +f 152/172/24 156/176/24 157/177/24 153/173/24 +f 153/173/23 157/177/23 158/178/23 154/174/23 +f 154/174/26 158/178/26 159/179/26 155/175/26 +f 155/175/25 159/179/25 156/176/25 152/172/25 +f 156/176/28 137/158/28 138/161/28 157/177/28 +f 157/177/27 138/161/27 35/55/27 158/178/27 +f 158/178/30 35/55/30 139/164/30 159/179/30 +f 159/179/29 139/164/29 137/158/29 156/176/29 +f 160/180/19 163/181/19 164/182/19 161/183/19 +f 161/183/20 164/182/20 165/184/20 127/148/20 +f 127/148/21 165/184/21 166/185/21 162/186/21 +f 162/186/22 166/185/22 163/181/22 160/180/22 +f 163/181/23 167/187/23 168/188/23 164/182/23 +f 164/182/24 168/188/24 169/189/24 165/184/24 +f 165/184/25 169/189/25 170/190/25 166/185/25 +f 166/185/26 170/190/26 167/187/26 163/181/26 +f 167/187/27 171/191/27 172/192/27 168/188/27 +f 168/188/28 172/192/28 11/30/28 169/189/28 +f 169/189/29 11/30/29 173/193/29 170/190/29 +f 170/190/30 173/193/30 171/191/30 167/187/30 +f 171/191/20 174/194/20 175/195/20 172/192/20 +f 172/192/19 175/195/19 176/196/19 11/30/19 +f 11/30/22 176/196/22 177/197/22 173/193/22 +f 173/193/21 177/197/21 174/194/21 171/191/21 +f 174/194/24 178/198/24 179/199/24 175/195/24 +f 175/195/23 179/199/23 180/200/23 176/196/23 +f 176/196/26 180/200/26 181/201/26 177/197/26 +f 177/197/25 181/201/25 178/198/25 174/194/25 +f 178/198/28 160/180/28 161/183/28 179/199/28 +f 179/199/27 161/183/27 127/148/27 180/200/27 +f 180/200/30 127/148/30 162/186/30 181/201/30 +f 181/201/29 162/186/29 160/180/29 178/198/29 +f 182/202/13 183/203/13 20/40/13 17/37/13 +f 183/203/14 184/204/14 19/39/14 20/40/14 +f 184/204/11 185/205/11 18/38/11 19/39/11 +f 185/205/12 182/202/12 17/37/12 18/38/12 diff --git a/mods/morelights/morelights/nodes.lua b/mods/morelights/morelights/nodes.lua new file mode 100644 index 00000000..663b0122 --- /dev/null +++ b/mods/morelights/morelights/nodes.lua @@ -0,0 +1,222 @@ +local S = minetest.get_translator("morelights") + + +minetest.register_craftitem("morelights:bulb", { + description = S("Light Bulb"), + inventory_image = "morelights_bulb.png" +}) + +morelights.register_variants({ + { + name = "morelights:pole_d", + description = S("Metal Pole (@1)", S("dark")), + tiles = {"morelights_metal_dark_32.png"}, + inventory_image = "morelights_pole_d_inv.png", + wield_image = "morelights_pole_d_inv.png", + + on_place = function(itemstack, placer, pointed_thing) + return morelights.on_place_hanging(itemstack, placer, + pointed_thing, "morelights:pole_ceiling_d") + end + }, + { + name = "morelights:pole_l", + description = S("Metal Pole (@1)", S("light")), + tiles = {"morelights_metal_light_32.png"}, + inventory_image = "morelights_pole_l_inv.png", + wield_image = "morelights_pole_l_inv.png", + + on_place = function(itemstack, placer, pointed_thing) + return morelights.on_place_hanging(itemstack, placer, + pointed_thing, "morelights:pole_ceiling_l") + end + } +}, +{ + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-1/32, -1/2, -1/32, 1/32, 1/2, 1/32} + }, + selection_box = { + type = "fixed", + fixed = {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16} + }, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1, + mounted_ceiling = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal +}) + +morelights.register_variants({ + { + name = "morelights:pole_ceiling_d", + tiles = {"morelights_metal_dark_32.png"}, + drop = "morelights:pole_d" + }, + { + name = "morelights:pole_ceiling_l", + tiles = {"morelights_metal_light_32.png"}, + drop = "morelights:pole_l" + } +}, +{ + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-3/16, -7/16, -3/16, 3/16, -1/2, 3/16}, + {-1/32, 1/2, -1/32, 1/32, -7/16, 1/32} + } + }, + selection_box = { + type = "fixed", + fixed = { + {-3/16, -7/16, -3/16, 3/16, -1/2, 3/16}, + {-1/16, 1/2, -1/16, 1/16, -7/16, 1/16} + } + }, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1, + mounted_ceiling = 1, not_in_creative_inventory = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal +}) + +morelights.register_variants({ + { + name = "morelights:chain_d", + description = S("Metal Chain (@1)", S("dark")), + tiles = {"morelights_metal_dark_32.png"}, + inventory_image = "morelights_chain_d_inv.png", + wield_image = "morelights_chain_d_inv.png", + + on_place = function(itemstack, placer, pointed_thing) + return morelights.on_place_hanging(itemstack, placer, + pointed_thing, "morelights:chain_ceiling_d") + end + }, + { + name = "morelights:chain_l", + description = S("Metal Chain (@1)", S("light")), + tiles = {"morelights_metal_light_32.png"}, + inventory_image = "morelights_chain_l_inv.png", + wield_image = "morelights_chain_l_inv.png", + + on_place = function(itemstack, placer, pointed_thing) + return morelights.on_place_hanging(itemstack, placer, + pointed_thing, "morelights:chain_ceiling_l") + end + } +}, +{ + drawtype = "mesh", + mesh = "morelights_chain.obj", + collision_box = { + type = "fixed", + fixed = {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16} + }, + selection_box = { + type = "fixed", + fixed = {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16} + }, + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1, + mounted_ceiling = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal +}) + +morelights.register_variants({ + { + name = "morelights:chain_ceiling_d", + tiles = {"morelights_metal_dark_32.png"}, + drop = "morelights:chain_d" + }, + { + name = "morelights:chain_ceiling_l", + tiles = {"morelights_metal_light_32.png"}, + drop = "morelights:chain_l" + } +}, +{ + drawtype = "mesh", + mesh = "morelights_chain_ceiling.obj", + collision_box = { + type = "fixed", + fixed = { + {-3/16, 7/16, -3/16, 3/16, 1/2, 3/16}, + {-1/16, -1/2, -1/16, 1/16, 7/16, 1/16} + } + }, + selection_box = { + type = "fixed", + fixed = { + {-3/16, 7/16, -3/16, 3/16, 1/2, 3/16}, + {-1/16, -1/2, -1/16, 1/16, 7/16, 1/16} + } + }, + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1, + mounted_ceiling = 1, not_in_creative_inventory = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal +}) + +-- +-- Craft recipes +-- + +local a = morelights.craft_items + +minetest.register_craft({ + output = "morelights:bulb", + recipe = { + {"", a.glass, ""}, + {"", a.copper, ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights:pole_d 2", + recipe = { + {a.dye_dark, a.steel, ""}, + {"", a.steel, ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights:pole_l 2", + recipe = { + {a.dye_light, a.steel, ""}, + {"", a.steel, ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights:chain_d", + recipe = { + {a.dye_dark, a.steel, ""}, + {"", "", ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights:chain_l", + recipe = { + {a.dye_light, a.steel, ""}, + {"", "", ""}, + {"", a.steel, ""} + } +}) diff --git a/mods/morelights/morelights/textures/morelights_bulb.png b/mods/morelights/morelights/textures/morelights_bulb.png new file mode 100644 index 00000000..5dd8c549 Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_bulb.png differ diff --git a/mods/morelights/morelights/textures/morelights_chain_d_inv.png b/mods/morelights/morelights/textures/morelights_chain_d_inv.png new file mode 100644 index 00000000..506f6ae2 Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_chain_d_inv.png differ diff --git a/mods/morelights/morelights/textures/morelights_chain_l_inv.png b/mods/morelights/morelights/textures/morelights_chain_l_inv.png new file mode 100644 index 00000000..6c1f53f5 Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_chain_l_inv.png differ diff --git a/mods/morelights/morelights/textures/morelights_metal_dark.png b/mods/morelights/morelights/textures/morelights_metal_dark.png new file mode 100644 index 00000000..121f5af9 Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_metal_dark.png differ diff --git a/mods/morelights/morelights/textures/morelights_metal_dark_32.png b/mods/morelights/morelights/textures/morelights_metal_dark_32.png new file mode 100644 index 00000000..d68267a5 Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_metal_dark_32.png differ diff --git a/mods/morelights/morelights/textures/morelights_metal_light.png b/mods/morelights/morelights/textures/morelights_metal_light.png new file mode 100644 index 00000000..5046c24e Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_metal_light.png differ diff --git a/mods/morelights/morelights/textures/morelights_metal_light_32.png b/mods/morelights/morelights/textures/morelights_metal_light_32.png new file mode 100644 index 00000000..8e3cefe7 Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_metal_light_32.png differ diff --git a/mods/morelights/morelights/textures/morelights_pole_d_inv.png b/mods/morelights/morelights/textures/morelights_pole_d_inv.png new file mode 100644 index 00000000..a178c449 Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_pole_d_inv.png differ diff --git a/mods/morelights/morelights/textures/morelights_pole_l_inv.png b/mods/morelights/morelights/textures/morelights_pole_l_inv.png new file mode 100644 index 00000000..eb18277e Binary files /dev/null and b/mods/morelights/morelights/textures/morelights_pole_l_inv.png differ diff --git a/mods/morelights/morelights_extras/init.lua b/mods/morelights/morelights_extras/init.lua new file mode 100644 index 00000000..e2ff0de5 --- /dev/null +++ b/mods/morelights/morelights_extras/init.lua @@ -0,0 +1,215 @@ +local S = minetest.get_translator("morelights_extras") + + +minetest.register_node("morelights_extras:f_block", { + description = S("Futuristic Light Block"), + tiles = {"morelights_extras_f_block.png"}, + paramtype = "light", + light_source = minetest.LIGHT_MAX, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.glass +}) + +do + local def = { + description = S("Grass Light"), + tiles = { + "default_grass.png^morelights_extras_blocklight.png", + "default_dirt.png", + "default_dirt.png^default_grass_side.png" + }, + paramtype = "light", + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.glass + } + + if morelights.game == "mineclone2" then + -- For MineClone 2, use node coloring to match environment. + -- See the mcl_core:dirt_with_grass definition in + -- ITEMS/mcl_core/nodes_base.lua. + local override = { + tiles = { + "mcl_core_grass_block_top.png", + {name = "default_dirt.png", color = "#FFFFFF"} + }, + overlay_tiles = { + {name = "morelights_extras_blocklight.png", color = "#FFFFFF"}, + "", + { + name = "mcl_core_grass_block_side_overlay.png", + tileable_vertical = false + } + }, + paramtype2 = "color", + palette = "mcl_core_palette_grass.png", + palette_index = 0, + color = "#55aa60", + drop = "morelights_extras:dirt_with_grass", + + on_construct = function(pos) + local node = minetest.get_node(pos) + if node.param2 == 0 then + local grass_node = mcl_core.get_grass_block_type(pos) + if grass_node.param2 ~= 0 then + minetest.set_node(pos, { + name = "morelights_extras:dirt_with_grass", + param2 = grass_node.param2 + }) + end + end + end + } + + for k, v in pairs(override) do + def[k] = v + end + end + + minetest.register_node("morelights_extras:dirt_with_grass", def) +end + +do + local tile = "default_stone_block.png" + if morelights.game == "mineclone2" then + tile = "mcl_stairs_stone_slab_top.png" + end + + minetest.register_node("morelights_extras:stone_block", { + description = S("Stone Block Light"), + tiles = {tile .. "^morelights_extras_blocklight.png"}, + paramtype = "light", + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.glass + }) +end + +do + local tile = "default_sandstone_block.png" + if morelights.game == "mineclone2" then + tile = "mcl_core_sandstone_smooth.png" + end + + minetest.register_node("morelights_extras:sandstone_block", { + description = S("Sandstone Block Light"), + tiles = {tile .. "^morelights_extras_blocklight.png"}, + paramtype = "light", + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.glass + }) +end + +minetest.register_node("morelights_extras:stairlight", { + description = S("Stair Light (place on stairs)"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-1/4, -13/16, -1/16, 1/4, -11/16, 0} + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -13/16, -1/16, 1/4, -11/16, 0} + }, + walkable = false, + tiles = {"morelights_metal_dark.png"}, + overlay_tiles = {"", "morelights_extras_stairlight.png", + "", "", "morelights_extras_stairlight.png"}, + inventory_image = "morelights_extras_stairlight_inv.png", + wield_image = "morelights_extras_stairlight_inv.png", + paramtype = "light", + paramtype2 = "facedir", + light_source = 10, + sunlight_propagates = true, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1, + attached_node = 1}, + _mcl_hardness = 0.15, + node_placement_prediction = "", + sounds = morelights.sounds.glass, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- See builtin/game/item.lua. + local node = minetest.get_node(pointed_thing.under) + + if placer and not placer:get_player_control().sneak then + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick then + return def.on_rightclick(pointed_thing.under, node, placer, + itemstack, pointed_thing) or itemstack + end + end + + if node.param2 < 4 + and (node.name:match("^stairs:stair_") + or node.name:match("^mcl_stairs:stair_")) then + -- Set `above` to the node actually above the stair, since that's + -- where the node is placed. + pointed_thing.above = vector.add(pointed_thing.under, + {x=0, y=1, z=0}) + return minetest.item_place_node(itemstack, placer, pointed_thing, + node.param2) + end + + return itemstack + end, + + on_rotate = screwdriver.rotate_simple +}) + +-- +-- Craft recipes +-- + +local a = morelights.craft_items + +minetest.register_craft({ + output = "morelights_extras:f_block", + recipe = { + {a.crystal_fragment, a.steel, a.crystal_fragment}, + {a.glass_pane, "morelights:bulb", a.glass_pane}, + {a.crystal_fragment, a.steel, a.crystal_fragment} + } +}) + +minetest.register_craft({ + output = "morelights_extras:dirt_with_grass", + recipe = { + {"", a.glass_pane, ""}, + {"", "morelights:bulb", ""}, + {a.grass, a.dirt, ""} + } +}) + +minetest.register_craft({ + output = "morelights_extras:stone_block", + recipe = { + {"", a.glass_pane, ""}, + {"", "morelights:bulb", ""}, + {"", a.stone_block, ""} + } +}) + +minetest.register_craft({ + output = "morelights_extras:sandstone_block", + recipe = { + {"", a.glass_pane, ""}, + {"", "morelights:bulb", ""}, + {"", a.sandstone_block, ""} + } +}) + +minetest.register_craft({ + output = "morelights_extras:stairlight", + recipe = { + {a.steel, "morelights:bulb", a.steel} + } +}) diff --git a/mods/morelights/morelights_extras/locale/template.txt b/mods/morelights/morelights_extras/locale/template.txt new file mode 100644 index 00000000..7f9e1962 --- /dev/null +++ b/mods/morelights/morelights_extras/locale/template.txt @@ -0,0 +1,7 @@ +# textdomain:morelights_extras + +Futuristic Light Block= +Grass Light= +Stone Block Light= +Sandstone Block Light= +Stair Light (place on stairs)= diff --git a/mods/morelights/morelights_extras/mod.conf b/mods/morelights/morelights_extras/mod.conf new file mode 100644 index 00000000..cba1468c --- /dev/null +++ b/mods/morelights/morelights_extras/mod.conf @@ -0,0 +1,3 @@ +name = morelights_extras +description = Provides miscellaneous lighting nodes. +depends = morelights diff --git a/mods/morelights/morelights_extras/textures/morelights_extras_blocklight.png b/mods/morelights/morelights_extras/textures/morelights_extras_blocklight.png new file mode 100644 index 00000000..953c2a9c Binary files /dev/null and b/mods/morelights/morelights_extras/textures/morelights_extras_blocklight.png differ diff --git a/mods/morelights/morelights_extras/textures/morelights_extras_f_block.png b/mods/morelights/morelights_extras/textures/morelights_extras_f_block.png new file mode 100644 index 00000000..c898dde8 Binary files /dev/null and b/mods/morelights/morelights_extras/textures/morelights_extras_f_block.png differ diff --git a/mods/morelights/morelights_extras/textures/morelights_extras_stairlight.png b/mods/morelights/morelights_extras/textures/morelights_extras_stairlight.png new file mode 100644 index 00000000..d3957759 Binary files /dev/null and b/mods/morelights/morelights_extras/textures/morelights_extras_stairlight.png differ diff --git a/mods/morelights/morelights_extras/textures/morelights_extras_stairlight_inv.png b/mods/morelights/morelights_extras/textures/morelights_extras_stairlight_inv.png new file mode 100644 index 00000000..c62708be Binary files /dev/null and b/mods/morelights/morelights_extras/textures/morelights_extras_stairlight_inv.png differ diff --git a/mods/morelights/morelights_modern/init.lua b/mods/morelights/morelights_modern/init.lua new file mode 100644 index 00000000..6736aaa5 --- /dev/null +++ b/mods/morelights/morelights_modern/init.lua @@ -0,0 +1,465 @@ +local S = minetest.get_translator("morelights_modern") + + +minetest.register_node("morelights_modern:block", { + description = S("Modern Light Block"), + tiles = {"morelights_metal_dark.png^morelights_modern_block.png"}, + paramtype = "light", + light_source = minetest.LIGHT_MAX, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.glass +}) + +minetest.register_node("morelights_modern:smallblock", { + description = S("Modern Light Block (small)"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 0, 1/4} + }, + tiles = { + "morelights_metal_dark.png^morelights_modern_smallblock.png", + "morelights_metal_dark.png^morelights_modern_smallblock.png", + "[combine:16x16:0,0=morelights_metal_dark.png" .. + ":0,4=morelights_modern_smallblock.png" + }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + light_source = 12, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass, + + on_place = function(itemstack, placer, pointed_thing) + return morelights.rotate_and_place(itemstack, placer, pointed_thing) + end +}) + +morelights.register_variants({ + { + name = "morelights_modern:post_d", + description = S("Modern Post Light (@1)", S("dark")), + tiles = { + "morelights_metal_dark.png", + "morelights_metal_dark.png", + "morelights_metal_dark.png^morelights_modern_post.png" + } + }, + { + name = "morelights_modern:post_l", + description = S("Modern Post Light (@1)", S("light")), + tiles = { + "morelights_metal_light.png", + "morelights_metal_light.png", + "morelights_metal_light.png^morelights_modern_post.png" + } + } +}, +{ + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = minetest.LIGHT_MAX, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.metal +}) + +morelights.register_variants({ + { + name = "morelights_modern:streetpost_d", + description = S("Street Lamp Post (@1) - connects to bar lights", + S("dark")), + tiles = {"morelights_metal_dark.png"} + }, + { + name = "morelights_modern:streetpost_l", + description = S("Street Lamp Post (@1) - connects to bar lights", + S("light")), + tiles = {"morelights_metal_light.png"} + } +}, +{ + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-1/16, -1/2, -1/16, 1/16, 1/2, 1/16}, + connect_front = {-1/16, 3/8, -1/2, 1/16, 7/16, -1/16}, + connect_left = {-1/2, 3/8, -1/16, -1/16, 7/16, 1/16}, + connect_back = {-1/16, 3/8, 1/16, 1/16, 7/16, 1/2}, + connect_right = {1/16, 3/8, -1/16, 1/2, 7/16, 1/16}, + }, + connects_to = { + "morelights_modern:barlight_c", + "morelights_modern:barlight_s" + }, + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.metal +}) + +minetest.register_node("morelights_modern:barlight_c", { + description = S("Ceiling Bar Light (connecting)"), + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {-1/8, 3/8, -1/8, 1/8, 1/2, 1/8}, + connect_front = {-1/8, 3/8, -1/2, 1/8, 1/2, -1/8}, + connect_left = {-1/2, 3/8, -1/8, -1/8, 1/2, 1/8}, + connect_back = {-1/8, 3/8, 1/8, 1/8, 1/2, 1/2}, + connect_right = {1/8, 3/8, -1/8, 1/2, 1/2, 1/8}, + }, + connects_to = { + "morelights_modern:barlight_c", + "morelights_modern:barlight_s", + "morelights_modern:streetpost_d", + "morelights_modern:streetpost_l" + }, + tiles = { + "morelights_metal_dark.png", + "morelights_modern_barlight.png", + "morelights_metal_dark.png" + }, + paramtype = "light", + sunlight_propagates = true, + light_source = minetest.LIGHT_MAX, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.15, + sounds = morelights.sounds.glass +}) + +-- TODO: Determine orientation of bar lights from nearby nodes. +minetest.register_node("morelights_modern:barlight_s", { + description = S("Ceiling Bar Light (straight)"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-1/2, 3/8, -1/8, 1/2, 1/2, 1/8}, + }, + tiles = { + "morelights_metal_dark.png", + "morelights_modern_barlight.png", + "morelights_metal_dark.png" + }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + light_source = minetest.LIGHT_MAX, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.15, + sounds = morelights.sounds.glass +}) + +minetest.register_node("morelights_modern:ceilinglight", { + description = S("Modern Ceiling Light"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-1/4, 3/8, -1/4, 1/4, 1/2, 1/4} + }, + tiles = { + "morelights_metal_dark.png", + "morelights_metal_dark.png^morelights_modern_block.png" + }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + light_source = minetest.LIGHT_MAX, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass, + + on_place = function(itemstack, placer, pointed_thing) + return morelights.rotate_and_place(itemstack, placer, pointed_thing, + {[0] = 0, 20, 12, 16, 4, 8}) + end +}) + +morelights.register_variants({ + { + name = "morelights_modern:canlight_d", + description = S("Modern Can Light (@1)", S("dark")), + tiles = {"morelights_metal_dark.png^morelights_modern_canlight.png"} + }, + { + name = "morelights_modern:canlight_l", + description = S("Modern Can Light (@1)", S("light")), + tiles = {"morelights_metal_light.png^morelights_modern_canlight.png"} + }, +}, +{ + drawtype = "mesh", + mesh = "morelights_modern_canlight.obj", + collision_box = { + type = "fixed", + fixed = {-1/8, 0, -1/8, 1/8, 1/2, 1/8} + }, + selection_box = { + type = "fixed", + fixed = {-1/8, 0, -1/8, 1/8, 1/2, 1/8} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal +}) + +minetest.register_node("morelights_modern:walllamp", { + description = S("Modern Wall Lamp"), + drawtype = "mesh", + mesh = "morelights_modern_walllamp.obj", + collision_box = { + type = "fixed", + fixed = {-1/8, -3/8, 1/8, 1/8, 1/4, 1/2} + }, + selection_box = { + type = "fixed", + fixed = {-1/8, -3/8, 1/8, 1/8, 1/4, 1/2} + }, + tiles = {"morelights_metal_dark_32.png^morelights_modern_walllamp.png"}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass, + + on_place = function(itemstack, placer, pointed_thing) + return morelights.rotate_and_place(itemstack, placer, pointed_thing, + {[0] = 6, 4, 1, 3, 0, 2}) + end +}) + +morelights.register_variants({ + { + name = "morelights_modern:tablelamp_d", + description = S("Modern Table Lamp (@1)", S("dark")), + tiles = { + "morelights_metal_light_32.png^morelights_modern_tablelamp_o.png", + "morelights_modern_tablelamp_d.png" + } + }, + { + name = "morelights_modern:tablelamp_l", + description = S("Modern Table Lamp (@1)", S("light")), + tiles = { + "morelights_metal_dark_32.png^morelights_modern_tablelamp_o.png", + "morelights_modern_tablelamp_l.png" + } + }, +}, +{ + drawtype = "mesh", + mesh = "morelights_modern_tablelamp.obj", + collision_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 7/16, 1/4} + }, + selection_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 7/16, 1/4} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 10, + groups = {choppy = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.default +}) + +morelights.register_variants({ + { + name = "morelights_modern:pathlight_d", + description = S("Modern Path Light (@1)", S("dark")), + tiles = { + "morelights_metal_dark_32.png^morelights_modern_pathlight.png" + } + }, + { + name = "morelights_modern:pathlight_l", + description = S("Modern Path Light (@1)", S("light")), + tiles = { + "morelights_metal_light_32.png^morelights_modern_pathlight.png" + } + } +}, +{ + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-1/32, -8/16, -1/32, 1/32, 1/8, 1/32}, + {-1/16, 1/8, -1/16, 1/16, 5/16, 1/16}, + {-1/8, 5/16, -1/8, 1/8, 3/8, 1/8} + } + }, + selection_box = { + type = "fixed", + fixed = {-1/8, -1/2, -1/8, 1/8, 3/8, 1/8} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 8, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal +}) + +-- +-- Craft recipes +-- + +local a = morelights.craft_items + +minetest.register_craft({ + output = "morelights_modern:block", + recipe = { + {"", a.steel, ""}, + {a.glass_pane, "morelights:bulb", a.glass_pane}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:smallblock", + recipe = { + {"", a.glass_pane, ""}, + {a.steel, "morelights:bulb", a.steel} + } +}) + +minetest.register_craft({ + output = "morelights_modern:post_d", + recipe = { + {a.dye_dark, a.steel, ""}, + {"", "morelights:bulb", ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:post_l", + recipe = { + {a.dye_light, a.steel, ""}, + {"", "morelights:bulb", ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:streetpost_d 2", + recipe = { + {a.dye_dark, a.steel, a.steel}, + {"", a.steel, ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:streetpost_l 2", + recipe = { + {a.dye_light, a.steel, a.steel}, + {"", a.steel, ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:barlight_c 4", + recipe = { + {a.steel, a.steel, a.steel}, + {a.copper, a.glass, a.copper} + } +}) + +minetest.register_craft({ + output = "morelights_modern:barlight_c", + type = "shapeless", + recipe = {"morelights_modern:barlight_s"} +}) + +minetest.register_craft({ + output = "morelights_modern:barlight_s", + type = "shapeless", + recipe = {"morelights_modern:barlight_c"} +}) + +minetest.register_craft({ + output = "morelights_modern:ceilinglight", + recipe = { + {a.steel, "morelights:bulb", a.steel}, + {"", a.glass_pane, ""}, + } +}) + +minetest.register_craft({ + output = "morelights_modern:canlight_d", + recipe = { + {a.dye_dark, a.steel, ""}, + {a.steel, "morelights:bulb", a.steel}, + } +}) + +minetest.register_craft({ + output = "morelights_modern:canlight_l", + recipe = { + {a.dye_light, a.steel, ""}, + {a.steel, "morelights:bulb", a.steel}, + } +}) + +minetest.register_craft({ + output = "morelights_modern:walllamp", + recipe = { + {"", a.glass_pane, ""}, + {a.glass_pane, "morelights:bulb", a.steel}, + {"", a.dye_dark, a.steel} + } +}) + +minetest.register_craft({ + output = "morelights_modern:tablelamp_d", + recipe = { + {"", a.steel, ""}, + {a.wool_dark, "morelights:bulb", a.wool_dark}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:tablelamp_l", + recipe = { + {"", a.steel, ""}, + {a.wool_light, "morelights:bulb", a.wool_light}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:pathlight_d", + recipe = { + {a.dye_dark, "morelights:bulb", ""}, + {"", a.steel, ""}, + {"", a.steel, ""} + } +}) + +minetest.register_craft({ + output = "morelights_modern:pathlight_l", + recipe = { + {a.dye_light, "morelights:bulb", ""}, + {"", a.steel, ""}, + {"", a.steel, ""} + } +}) diff --git a/mods/morelights/morelights_modern/locale/template.txt b/mods/morelights/morelights_modern/locale/template.txt new file mode 100644 index 00000000..516543de --- /dev/null +++ b/mods/morelights/morelights_modern/locale/template.txt @@ -0,0 +1,15 @@ +# textdomain:morelights_modern + +dark= +light= +Modern Light Block= +Modern Light Block (small)= +Modern Post Light (@1)= +Street Lamp Post (@1) - connects to bar lights= +Ceiling Bar Light (connecting)= +Ceiling Bar Light (straight)= +Modern Ceiling Light= +Modern Can Light (@1)= +Modern Wall Lamp= +Modern Table Lamp (@1)= +Modern Path Light (@1)= diff --git a/mods/morelights/morelights_modern/mod.conf b/mods/morelights/morelights_modern/mod.conf new file mode 100644 index 00000000..a39125fc --- /dev/null +++ b/mods/morelights/morelights_modern/mod.conf @@ -0,0 +1,3 @@ +name = morelights_modern +description = Provides modern-style lighting nodes. +depends = morelights diff --git a/mods/morelights/morelights_modern/models/morelights_modern_canlight.obj b/mods/morelights/morelights_modern/models/morelights_modern_canlight.obj new file mode 100644 index 00000000..9c42e467 --- /dev/null +++ b/mods/morelights/morelights_modern/models/morelights_modern_canlight.obj @@ -0,0 +1,124 @@ +# Blender v2.79 (sub 0) OBJ File: 'modern_can_2.blend' +# www.blender.org +o Cylinder_Cylinder.002 +v -0.051777 -0.000000 -0.125000 +v -0.051777 0.500000 -0.125000 +v 0.051777 0.500000 -0.125000 +v 0.051777 -0.000000 -0.125000 +v 0.125000 -0.000000 0.051777 +v 0.051777 -0.000000 0.125000 +v -0.051777 -0.000000 0.125000 +v -0.125000 -0.000000 0.051777 +v -0.125000 -0.000000 -0.051777 +v -0.100000 -0.000000 -0.041421 +v -0.100000 -0.000000 0.041421 +v -0.041421 -0.000000 0.100000 +v 0.041421 -0.000000 0.100000 +v 0.100000 -0.000000 0.041421 +v 0.125000 -0.000000 -0.051777 +v 0.100000 -0.000000 -0.041421 +v 0.041421 -0.000000 -0.100000 +v -0.041421 -0.000000 -0.100000 +v -0.125000 0.500000 -0.051777 +v -0.125000 0.500000 0.051777 +v -0.051777 0.500000 0.125000 +v 0.051777 0.500000 0.125000 +v 0.125000 0.500000 0.051777 +v 0.125000 0.500000 -0.051777 +v 0.041421 0.125000 -0.100000 +v -0.041421 0.125000 -0.100000 +v -0.100000 0.125000 -0.041421 +v 0.100000 0.125000 -0.041421 +v 0.100000 0.125000 0.041421 +v 0.041421 0.125000 0.100000 +v -0.041421 0.125000 0.100000 +v -0.100000 0.125000 0.041421 +vt 0.375000 0.500000 +vt 0.375000 1.000000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.239277 0.937500 +vt 0.135723 0.937500 +vt 0.062500 0.864257 +vt 0.062500 0.760704 +vt 0.135723 0.687500 +vt 0.239277 0.687500 +vt 0.312500 0.760704 +vt 0.312500 0.864257 +vt 0.125000 1.000000 +vt 0.125000 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.875000 1.000000 +vt 0.875000 0.500000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.375000 0.437500 +vt 0.250000 0.437500 +vt 0.250000 0.312500 +vt 0.375000 0.312500 +vt 0.500000 0.437500 +vt 0.500000 0.312500 +vt 0.176777 0.000000 +vt 0.250000 0.073223 +vt 0.250000 0.176777 +vt 0.176777 0.250000 +vt 0.073223 0.250000 +vt 0.000000 0.176777 +vt 0.000000 0.073223 +vt 0.073223 0.000000 +vt 0.125000 0.437500 +vt 0.125000 0.312500 +vt 0.625000 0.437500 +vt 0.625000 0.312500 +vt 0.750000 0.437500 +vt 0.750000 0.312500 +vt 0.875000 0.437500 +vt 0.875000 0.312500 +vt 1.000000 0.437500 +vt 1.000000 0.312500 +vt 0.000000 0.437500 +vt 0.000000 0.312500 +vn 0.0000 0.0000 -1.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 1.0000 -0.0000 +vn 0.7071 0.0000 -0.7071 +vn 1.0000 0.0000 0.0000 +vn 0.7071 0.0000 0.7071 +vn -0.0000 0.0000 1.0000 +vn -0.7071 0.0000 0.7071 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 9/5/2 19/6/2 2/2/2 1/1/2 +f 3/7/3 2/8/3 19/9/3 20/10/3 21/11/3 22/12/3 23/13/3 24/14/3 +f 4/4/4 3/3/4 24/15/4 15/16/4 +f 15/16/5 24/15/5 23/17/5 5/18/5 +f 5/19/6 23/20/6 22/21/6 6/22/6 +f 6/22/7 22/21/7 21/23/7 7/24/7 +f 7/24/8 21/23/8 20/25/8 8/26/8 +f 8/26/9 20/25/9 19/6/9 9/5/9 +f 18/27/7 17/28/7 25/29/7 26/30/7 +f 10/31/6 18/27/6 26/30/6 27/32/6 +f 25/33/10 28/34/10 29/35/10 30/36/10 31/37/10 32/38/10 27/39/10 26/40/10 +f 17/28/8 16/41/8 28/42/8 25/29/8 +f 11/43/5 10/31/5 27/32/5 32/44/5 +f 12/45/4 11/43/4 32/44/4 31/46/4 +f 13/47/1 12/45/1 31/46/1 30/48/1 +f 14/49/2 13/47/2 30/48/2 29/50/2 +f 16/41/9 14/51/9 29/52/9 28/42/9 +f 10/31/10 9/5/10 1/1/10 18/27/10 +f 1/1/10 4/4/10 17/28/10 18/27/10 +f 4/4/10 15/16/10 16/41/10 17/28/10 +f 14/51/10 16/41/10 15/16/10 5/18/10 +f 14/49/10 5/19/10 6/22/10 13/47/10 +f 13/47/10 6/22/10 7/24/10 12/45/10 +f 7/24/10 8/26/10 11/43/10 12/45/10 +f 11/43/10 8/26/10 9/5/10 10/31/10 diff --git a/mods/morelights/morelights_modern/models/morelights_modern_tablelamp.obj b/mods/morelights/morelights_modern/models/morelights_modern_tablelamp.obj new file mode 100644 index 00000000..11f38bb2 --- /dev/null +++ b/mods/morelights/morelights_modern/models/morelights_modern_tablelamp.obj @@ -0,0 +1,204 @@ +# Blender v2.79 (sub 0) OBJ File: 'modern_tablelamp_joined.blend' +# www.blender.org +o support_Plane.001 +v 0.031250 0.312500 0.031250 +v 0.218750 0.312500 0.031250 +v 0.031250 0.343750 0.000000 +v 0.218750 0.343750 0.000000 +v 0.031250 0.312500 -0.031250 +v 0.218750 0.312500 -0.031250 +v -0.218750 0.312500 0.031250 +v -0.031250 0.312500 0.031250 +v -0.218750 0.343750 0.000000 +v -0.031250 0.343750 0.000000 +v -0.218750 0.312500 -0.031250 +v -0.031250 0.312500 -0.031250 +vt 0.531250 0.468748 +vt 0.718750 0.468748 +vt 0.718750 0.499998 +vt 0.531250 0.499998 +vt 0.718750 0.531248 +vt 0.531250 0.531248 +vt 0.281250 0.468748 +vt 0.468750 0.468748 +vt 0.468750 0.499998 +vt 0.281250 0.499998 +vt 0.468750 0.531248 +vt 0.281250 0.531248 +vn 0.0000 0.7071 0.7071 +vn 0.0000 0.7071 -0.7071 +g Material.000 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/4/2 4/3/2 6/5/2 5/6/2 +f 7/7/1 8/8/1 10/9/1 9/10/1 +f 9/10/2 10/9/2 12/11/2 11/12/2 +o pole_Cube.007 +v -0.031250 -0.437500 0.031250 +v -0.031250 0.375000 0.031250 +v -0.031250 -0.437500 -0.031250 +v -0.031250 0.375000 -0.031250 +v 0.031250 -0.437500 0.031250 +v 0.031250 0.375000 0.031250 +v 0.031250 -0.437500 -0.031250 +v 0.031250 0.375000 -0.031250 +vt 0.312500 0.062500 +vt 0.312500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.062500 +vt 0.312501 0.062500 +vt 0.312499 0.875000 +vt 0.250000 0.875000 +vt 0.250000 0.062500 +vt 0.312500 0.531250 +vt 0.250000 0.531250 +vt 0.250000 0.468750 +vt 0.312500 0.468750 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +g Material.000 +s off +f 13/13/3 14/14/3 16/15/3 15/16/3 +f 15/17/4 16/18/4 20/19/4 19/20/4 +f 19/21/5 20/22/5 18/23/5 17/24/5 +f 17/25/6 18/26/6 14/27/6 13/28/6 +f 20/29/7 16/30/7 14/31/7 18/32/7 +o base_Cube.006 +v -0.187500 -0.500000 0.187500 +v -0.187500 -0.437500 0.187500 +v -0.187500 -0.500000 -0.187500 +v -0.187500 -0.437500 -0.187500 +v 0.187500 -0.500000 0.187500 +v 0.187500 -0.437500 0.187500 +v 0.187500 -0.500000 -0.187500 +v 0.187500 -0.437500 -0.187500 +vt 0.312500 0.062500 +vt 0.312500 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.062500 +vt 0.687500 0.000000 +vt 0.687500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.000000 +vt 0.687500 0.000000 +vt 0.687500 0.062500 +vt 0.312500 0.062500 +vt 0.312500 0.000000 +vt 0.687500 0.312500 +vt 0.687500 0.687500 +vt 0.312500 0.687500 +vt 0.312500 0.312500 +vt 0.687500 0.312500 +vt 0.687500 0.687500 +vt 0.312500 0.687500 +vt 0.312500 0.312500 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Material.000 +s off +f 21/33/8 22/34/8 24/35/8 23/36/8 +f 23/37/9 24/38/9 28/39/9 27/40/9 +f 27/41/10 28/42/10 26/43/10 25/44/10 +f 25/45/11 26/46/11 22/47/11 21/48/11 +f 23/49/12 27/50/12 25/51/12 21/52/12 +f 28/53/13 24/54/13 22/55/13 26/56/13 +o shade_Cube.005 +v -0.250000 -0.062500 0.250000 +v -0.250000 0.437500 0.250000 +v -0.250000 -0.062500 -0.250000 +v -0.250000 0.437500 -0.250000 +v 0.250000 -0.062500 0.250000 +v 0.250000 0.437500 0.250000 +v 0.250000 -0.062500 -0.250000 +v 0.250000 0.437500 -0.250000 +v -0.218750 -0.062500 0.218750 +v -0.218750 0.437500 0.218750 +v -0.218750 -0.062500 -0.218750 +v -0.218750 0.437500 -0.218750 +v 0.218750 -0.062500 0.218750 +v 0.218750 0.437500 0.218750 +v 0.218750 -0.062500 -0.218750 +v 0.218750 0.437500 -0.218750 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 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 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.062500 0.000000 +vt 0.062500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 0.000000 +vt 0.062500 0.000000 +vt 0.062500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 0.000000 +vt 0.062500 0.000000 +vt 0.062500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 0.000000 +vt 0.062500 0.000000 +vt 0.062500 1.000000 +vt 0.937500 1.000000 +vt 0.937500 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.937500 0.062500 +vt 0.062500 0.062500 +vt 0.062500 0.937500 +vt 0.937500 0.937500 +vt 0.000000 1.000000 +vt 0.062500 0.062500 +vt 0.062500 0.937500 +vt 0.937500 0.062500 +vt 1.000000 1.000000 +vt 0.937500 0.937500 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +g Material.001 +s off +f 29/57/14 30/58/14 32/59/14 31/60/14 +f 31/61/15 32/62/15 36/63/15 35/64/15 +f 35/64/16 36/63/16 34/65/16 33/66/16 +f 33/67/17 34/68/17 30/58/17 29/57/17 +f 39/69/15 40/70/15 44/71/15 43/72/15 +f 37/73/14 38/74/14 40/75/14 39/76/14 +f 43/77/16 44/78/16 42/79/16 41/80/16 +f 41/81/17 42/82/17 38/83/17 37/84/17 +f 30/85/18 34/86/18 42/87/18 38/88/18 +f 32/62/18 30/85/18 38/88/18 40/89/18 +f 36/63/18 32/62/18 40/89/18 44/90/18 +f 34/86/18 36/63/18 44/90/18 42/87/18 +f 29/91/19 31/61/19 39/92/19 37/93/19 +f 31/61/19 35/64/19 43/94/19 39/92/19 +f 35/64/19 33/95/19 41/96/19 43/94/19 +f 33/95/19 29/91/19 37/93/19 41/96/19 diff --git a/mods/morelights/morelights_modern/models/morelights_modern_walllamp.obj b/mods/morelights/morelights_modern/models/morelights_modern_walllamp.obj new file mode 100644 index 00000000..e9e7fcc9 --- /dev/null +++ b/mods/morelights/morelights_modern/models/morelights_modern_walllamp.obj @@ -0,0 +1,132 @@ +# Blender v2.79 (sub 0) OBJ File: 'walllamp.blend' +# www.blender.org +o Cube.003 +v 0.031250 -0.343750 0.437500 +v 0.031250 -0.281250 0.437500 +v -0.031250 -0.343750 0.437500 +v -0.031250 -0.281250 0.437500 +v 0.031250 -0.343750 0.218750 +v 0.031250 -0.281250 0.281250 +v -0.031250 -0.343750 0.218750 +v -0.031250 -0.281250 0.281250 +v 0.031250 -0.250000 0.218750 +v 0.031250 -0.250000 0.281250 +v -0.031250 -0.250000 0.218750 +v -0.031250 -0.250000 0.281250 +vt 0.031250 0.062500 +vt 0.031250 0.125000 +vt 0.187500 0.125000 +vt 0.250000 0.062500 +vt 0.187500 0.156250 +vt 0.250000 0.156250 +vt 0.250000 0.062500 +vt 0.187500 0.125000 +vt 0.031250 0.125000 +vt 0.031250 0.062500 +vt 0.250000 0.000000 +vt 0.031250 0.000000 +vt 0.187500 0.250000 +vt 0.031250 0.250000 +vt 0.031250 0.187500 +vt 0.187500 0.187500 +vt 0.250000 0.156250 +vt 0.187500 0.156250 +vt 0.343750 0.062500 +vt 0.343750 0.000000 +vt 0.218750 0.187500 +vt 0.218750 0.250000 +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 +s off +f 3/1/1 4/2/1 8/3/1 7/4/1 +f 7/4/1 8/3/1 12/5/1 11/6/1 +f 5/7/2 6/8/2 2/9/2 1/10/2 +f 3/1/3 7/4/3 5/11/3 1/12/3 +f 8/13/4 4/14/4 2/15/4 6/16/4 +f 6/8/2 5/7/2 9/17/2 10/18/2 +f 5/11/5 7/4/5 11/19/5 9/20/5 +f 8/13/6 6/16/6 10/21/6 12/22/6 +o Cube.002 +v 0.125000 -0.375000 0.500000 +v 0.125000 0.125000 0.500000 +v -0.125000 -0.375000 0.500000 +v -0.125000 0.125000 0.500000 +v 0.125000 -0.375000 0.437500 +v 0.125000 0.125000 0.437500 +v -0.125000 -0.375000 0.437500 +v -0.125000 0.125000 0.437500 +vt 0.937500 0.000000 +vt 0.937500 0.500000 +vt 0.687500 0.500000 +vt 0.687500 0.000000 +vt 0.625000 0.500000 +vt 0.625000 0.000000 +vt 0.375000 0.500000 +vt 0.375000 0.000000 +vt 0.312500 0.500000 +vt 0.312500 0.000000 +vt 0.937500 0.250000 +vt 1.000000 0.250000 +vt 1.000000 0.500000 +vt 0.937500 0.500000 +vt 0.937500 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.250000 +vt 0.937500 0.250000 +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.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 13/23/7 14/24/7 16/25/7 15/26/7 +f 15/26/8 16/25/8 20/27/8 19/28/8 +f 19/28/9 20/27/9 18/29/9 17/30/9 +f 17/30/10 18/29/10 14/31/10 13/32/10 +f 15/33/11 19/34/11 17/35/11 13/36/11 +f 20/37/12 16/38/12 14/39/12 18/40/12 +o Cube.001 +v 0.125000 -0.250000 0.375000 +v 0.125000 0.250000 0.375000 +v -0.125000 -0.250000 0.375000 +v -0.125000 0.250000 0.375000 +v 0.125000 -0.250000 0.125000 +v 0.125000 0.250000 0.125000 +v -0.125000 -0.250000 0.125000 +v -0.125000 0.250000 0.125000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.500000 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.250000 1.000000 +vt 0.250000 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.250000 0.250000 +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.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 21/41/13 22/42/13 24/43/13 23/44/13 +f 23/44/14 24/43/14 28/45/14 27/46/14 +f 27/46/15 28/45/15 26/47/15 25/48/15 +f 25/48/16 26/47/16 22/49/16 21/50/16 +f 23/51/17 27/52/17 25/53/17 21/54/17 +f 28/55/18 24/56/18 22/57/18 26/58/18 diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_barlight.png b/mods/morelights/morelights_modern/textures/morelights_modern_barlight.png new file mode 100644 index 00000000..0cc94345 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_barlight.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_block.png b/mods/morelights/morelights_modern/textures/morelights_modern_block.png new file mode 100644 index 00000000..e533a195 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_block.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_canlight.png b/mods/morelights/morelights_modern/textures/morelights_modern_canlight.png new file mode 100644 index 00000000..f2e54878 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_canlight.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_pathlight.png b/mods/morelights/morelights_modern/textures/morelights_modern_pathlight.png new file mode 100644 index 00000000..dabda5e2 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_pathlight.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_post.png b/mods/morelights/morelights_modern/textures/morelights_modern_post.png new file mode 100644 index 00000000..3581a0f9 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_post.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_smallblock.png b/mods/morelights/morelights_modern/textures/morelights_modern_smallblock.png new file mode 100644 index 00000000..d6bd515f Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_smallblock.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_d.png b/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_d.png new file mode 100644 index 00000000..410cd784 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_d.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_l.png b/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_l.png new file mode 100644 index 00000000..2d2b4ee8 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_l.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_o.png b/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_o.png new file mode 100644 index 00000000..826cb089 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_tablelamp_o.png differ diff --git a/mods/morelights/morelights_modern/textures/morelights_modern_walllamp.png b/mods/morelights/morelights_modern/textures/morelights_modern_walllamp.png new file mode 100644 index 00000000..d7fae711 Binary files /dev/null and b/mods/morelights/morelights_modern/textures/morelights_modern_walllamp.png differ diff --git a/mods/morelights/morelights_vintage/init.lua b/mods/morelights/morelights_vintage/init.lua new file mode 100644 index 00000000..9676daae --- /dev/null +++ b/mods/morelights/morelights_vintage/init.lua @@ -0,0 +1,357 @@ +local S = minetest.get_translator("morelights_vintage") + + +-- Register custom brass ingot if a suitable replacement doesn't exist. +if morelights.craft_items.brass == nil then + morelights.craft_items.brass = "morelights_vintage:brass_ingot" + + minetest.register_craftitem("morelights_vintage:brass_ingot", { + description = S("Brass Ingot"), + inventory_image = "default_steel_ingot.png^[multiply:#FFCE69" + }) + + minetest.register_craft({ + output = "morelights_vintage:brass_ingot 2", + type = "shapeless", + recipe = { + morelights.craft_items.copper, + morelights.craft_items.tin + } + }) +end + +minetest.register_node("morelights_vintage:chain_b", { + description = S("Brass Chain"), + drawtype = "mesh", + mesh = "morelights_chain.obj", + collision_box = { + type = "fixed", + fixed = {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16} + }, + selection_box = { + type = "fixed", + fixed = {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16} + }, + tiles = {"morelights_vintage_brass_32.png"}, + inventory_image = "morelights_vintage_chain_b_inv.png", + wield_image = "morelights_vintage_chain_b_inv.png", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1, + mounted_ceiling = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal, + + on_place = function(itemstack, placer, pointed_thing) + return morelights.on_place_hanging(itemstack, placer, pointed_thing, + "morelights_vintage:chain_ceiling_b") + end +}) + +minetest.register_node("morelights_vintage:chain_ceiling_b", { + drawtype = "mesh", + mesh = "morelights_chain_ceiling.obj", + collision_box = { + type = "fixed", + fixed = { + {-3/16, 7/16, -3/16, 3/16, 1/2, 3/16}, + {-1/16, -1/2, -1/16, 1/16, 7/16, 1/16} + } + }, + selection_box = { + type = "fixed", + fixed = { + {-3/16, 7/16, -3/16, 3/16, 1/2, 3/16}, + {-1/16, -1/2, -1/16, 1/16, 7/16, 1/16} + } + }, + tiles = {"morelights_vintage_brass_32.png"}, + drop = "morelights_vintage:chain_b", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 3, oddly_breakable_by_hand = 3, handy = 1, + mounted_ceiling = 1, mounted_ceiling = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.metal +}) + +minetest.register_node("morelights_vintage:block", { + description = S("Vintage Light Block"), + tiles = {"morelights_vintage_block.png"}, + paramtype = "light", + light_source = minetest.LIGHT_MAX, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.glass +}) + +minetest.register_node("morelights_vintage:smallblock", { + description = S("Vintage Light Block (small)"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = {-1/4, -1/2, -1/4, 1/4, 0, 1/4} + }, + tiles = { + "morelights_vintage_block.png", + "morelights_vintage_block.png", + "[combine:16x16:0,4=morelights_vintage_block.png" + }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass, + + on_place = function(itemstack, placer, pointed_thing) + return morelights.rotate_and_place(itemstack, placer, pointed_thing) + end +}) + +minetest.register_node("morelights_vintage:lantern_f", { + description = S("Vintage Lantern (floor, wall, or ceiling)"), + drawtype = "mesh", + mesh = "morelights_vintage_lantern_f.obj", + tiles = { + "morelights_vintage_lantern.png", + "morelights_metal_dark_32.png" + }, + collision_box = { + type = "fixed", + fixed = {-3/16, -1/2, -3/16, 3/16, 1/16, 3/16} + }, + selection_box = { + type = "fixed", + fixed = {-3/16, -1/2, -3/16, 3/16, 1/16, 3/16} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass, + + on_place = function(itemstack, placer, pointed_thing) + local wdir = minetest.dir_to_wallmounted( + vector.subtract(pointed_thing.under, pointed_thing.above)) + local fakeStack = ItemStack(itemstack) + + if wdir == 0 then + fakeStack:set_name("morelights_vintage:lantern_c") + elseif wdir == 1 then + fakeStack:set_name("morelights_vintage:lantern_f") + else + fakeStack:set_name("morelights_vintage:lantern_w") + end + + minetest.item_place(fakeStack, placer, pointed_thing, wdir) + itemstack:set_count(fakeStack:get_count()) + + return itemstack + end +}) + +minetest.register_node("morelights_vintage:lantern_c", { + drawtype = "mesh", + mesh = "morelights_vintage_lantern_c.obj", + tiles = { + "morelights_vintage_lantern.png", + "morelights_metal_dark_32.png" + }, + collision_box = { + type = "fixed", + fixed = {-3/16, -1/16, -3/16, 3/16, 1/2, 3/16} + }, + selection_box = { + type = "fixed", + fixed = {-3/16, 0, -3/16, 3/16, 1/2, 3/16} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1, + not_in_creative_inventory = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass, + drop = "morelights_vintage:lantern_f" +}) + +minetest.register_node("morelights_vintage:lantern_w", { + drawtype = "mesh", + mesh = "morelights_vintage_lantern_w.obj", + tiles = { + "morelights_vintage_lantern.png", + "morelights_metal_dark_32.png" + }, + collision_box = { + type = "fixed", + fixed = {-3/16, -1/4, -5/16, 3/16, 1/8, 3/16} + }, + selection_box = { + type = "fixed", + fixed = {-3/16, -1/4, -5/16, 3/16, 1/8, 3/16} + }, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + light_source = 12, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1, + not_in_creative_inventory = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass, + drop = "morelights_vintage:lantern_f" +}) + +minetest.register_node("morelights_vintage:hangingbulb", { + description = S("Vintage Hanging Light Bulb"), + drawtype = "mesh", + mesh = "morelights_vintage_hangingbulb.obj", + tiles = { + "morelights_vintage_hangingbulb.png" .. + "^[lowpart:50:morelights_metal_dark_32.png" + }, + inventory_image = "morelights_vintage_hangingbulb_inv.png", + wield_image = "morelights_vintage_hangingbulb_inv.png", + use_texture_alpha = true, + collision_box = { + type = "fixed", + fixed = {-1/8, -1/8, -1/8, 1/8, 1/2, 1/8} + }, + selection_box = { + type = "fixed", + fixed = {-1/8, -1/8, -1/8, 1/8, 1/2, 1/8} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 10, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.15, + sounds = morelights.sounds.glass +}) + +minetest.register_node("morelights_vintage:oillamp", { + description = S("Vintage Oil Lamp"), + drawtype = "mesh", + mesh = "morelights_vintage_oillamp.obj", + tiles = { + { + name = "morelights_vintage_oil_flame.png", + animation = { + type = "sheet_2d", + frames_w = 16, + frames_h = 1, + frame_length = 0.3 + } + }, + "morelights_vintage_oillamp.png", + "morelights_vintage_brass_32.png" + }, + collision_box = { + type = "fixed", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/4, 1/8} + }, + selection_box = { + type = "fixed", + fixed = {-1/8, -1/2, -1/8, 1/8, 1/4, 1/8} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 8, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.2, + sounds = morelights.sounds.glass +}) + +minetest.register_node("morelights_vintage:chandelier", { + description = S("Vintage Chandelier"), + drawtype = "mesh", + mesh = "morelights_vintage_chandelier.obj", + tiles = { + "morelights_vintage_chandelier.png", + "morelights_vintage_brass_32.png^[multiply:#DFDFDF" + }, + collision_box = { + type = "fixed", + fixed = {-3/8, -1/2, -3/8, 3/8, 1/2, 3/8} + }, + selection_box = { + type = "fixed", + fixed = {-3/8, -1/2, -3/8, 3/8, 1/2, 3/8} + }, + paramtype = "light", + sunlight_propagates = true, + light_source = 10, + groups = {cracky = 2, oddly_breakable_by_hand = 3, handy = 1}, + _mcl_hardness = 0.3, + sounds = morelights.sounds.glass +}) + +-- +-- Craft recipes +-- + +local a = morelights.craft_items + +minetest.register_craft({ + output = "morelights_vintage:chain_b", + recipe = { + {"", a.brass, ""}, + {"", "", ""}, + {"", a.brass, ""} + } +}) + +minetest.register_craft({ + output = "morelights_vintage:block", + recipe = { + {"", a.wood_dark, ""}, + {a.glass_pane, "morelights:bulb", a.glass_pane}, + {"", a.wood_dark, ""} + } +}) + +minetest.register_craft({ + output = "morelights_vintage:smallblock", + recipe = { + {"", a.glass_pane, ""}, + {a.wood_dark, "morelights:bulb", a.wood_dark} + } +}) + +minetest.register_craft({ + output = "morelights_vintage:lantern_f", + recipe = { + {"", a.steel, ""}, + {a.glass_pane, "morelights:bulb", a.glass_pane}, + {a.stick, a.steel, a.stick} + } +}) + +minetest.register_craft({ + output = "morelights_vintage:hangingbulb", + recipe = { + {"", a.steel, ""}, + {"", a.copper, ""}, + {"", "morelights:bulb", ""} + } +}) + +minetest.register_craft({ + output = "morelights_vintage:oillamp", + recipe = { + {"", a.glass, ""}, + {"", a.cotton, ""}, + {"", a.brass, ""} + } +}) + +minetest.register_craft({ + output = "morelights_vintage:chandelier", + recipe = { + {"", a.brass, ""}, + {"morelights:bulb", a.brass, "morelights:bulb"}, + {a.steel, a.brass, a.steel} + } +}) diff --git a/mods/morelights/morelights_vintage/locale/template.txt b/mods/morelights/morelights_vintage/locale/template.txt new file mode 100644 index 00000000..84913ab4 --- /dev/null +++ b/mods/morelights/morelights_vintage/locale/template.txt @@ -0,0 +1,10 @@ +# textdomain:morelights_vintage + +Brass Ingot= +Brass Chain= +Vintage Light Block= +Vintage Light Block (small)= +Vintage Lantern (floor, wall, or ceiling)= +Vintage Hanging Light Bulb= +Vintage Oil Lamp= +Vintage Chandelier= diff --git a/mods/morelights/morelights_vintage/mod.conf b/mods/morelights/morelights_vintage/mod.conf new file mode 100644 index 00000000..022d03d7 --- /dev/null +++ b/mods/morelights/morelights_vintage/mod.conf @@ -0,0 +1,3 @@ +name = morelights_vintage +description = Provides antique and historical-style lighting nodes. +depends = morelights diff --git a/mods/morelights/morelights_vintage/models/morelights_vintage_chandelier.obj b/mods/morelights/morelights_vintage/models/morelights_vintage_chandelier.obj new file mode 100644 index 00000000..22fd05bd --- /dev/null +++ b/mods/morelights/morelights_vintage/models/morelights_vintage_chandelier.obj @@ -0,0 +1,79 @@ +# Blender v2.79 (sub 0) OBJ File: 'vintage_chandelier.blend' +# www.blender.org +o Plane.001_Plane.005 +v 0.250000 -0.500000 -0.433013 +v -0.250000 -0.500000 0.433013 +v 0.250000 0.500000 -0.433013 +v -0.250000 0.500000 0.433013 +v -0.250000 -0.500000 -0.433013 +v 0.250000 -0.500000 0.433013 +v -0.250000 0.500000 -0.433013 +v 0.250000 0.500000 0.433013 +v 0.500000 -0.500000 0.000000 +v -0.500000 -0.500000 0.000000 +v 0.500000 0.500000 -0.000000 +v -0.500000 0.500000 0.000000 +v 0.000000 -0.500000 0.000000 +v -0.000000 0.500000 -0.000000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn -0.8660 -0.0000 -0.5000 +vn -0.8660 -0.0000 0.5000 +vn -0.0000 -0.0000 -1.0000 +g Plane.001_Plane.005_Material.001 +s off +f 1/1/1 13/2/1 14/3/1 3/4/1 +f 5/5/2 13/2/2 14/3/2 7/6/2 +f 9/7/3 13/2/3 14/3/3 11/8/3 +f 14/3/1 13/2/1 2/9/1 4/10/1 +f 14/3/2 13/2/2 6/11/2 8/12/2 +f 14/3/3 13/2/3 10/13/3 12/14/3 +o Cube +v 0.031250 -0.375000 -0.031250 +v 0.031250 -0.375000 0.031250 +v -0.031250 -0.375000 0.031250 +v -0.031250 -0.375000 -0.031250 +v 0.031250 0.500000 -0.031250 +v 0.031250 0.500000 0.031250 +v -0.031250 0.500000 0.031250 +v -0.031250 0.500000 -0.031250 +vt 0.437500 0.062500 +vt 0.375000 0.062500 +vt 0.375000 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.937500 +vt 0.437500 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.937500 +vt 0.625000 0.062500 +vt 0.625000 0.937500 +vt 0.562500 0.937500 +vt 0.562500 0.062500 +vt 0.500000 0.937500 +vt 0.500000 0.062500 +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 -1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +g Cube_Cube_Material +s off +f 15/15/4 16/16/4 17/17/4 18/18/4 +f 19/19/5 22/20/5 21/21/5 20/22/5 +f 15/15/6 19/19/6 20/22/6 16/16/6 +f 16/23/7 20/24/7 21/25/7 17/26/7 +f 17/26/8 21/25/8 22/27/8 18/28/8 +f 19/19/9 15/15/9 18/28/9 22/27/9 diff --git a/mods/morelights/morelights_vintage/models/morelights_vintage_hangingbulb.obj b/mods/morelights/morelights_vintage/models/morelights_vintage_hangingbulb.obj new file mode 100644 index 00000000..0f1ba38b --- /dev/null +++ b/mods/morelights/morelights_vintage/models/morelights_vintage_hangingbulb.obj @@ -0,0 +1,192 @@ +# Blender v2.79 (sub 0) OBJ File: 'bulb.blend' +# www.blender.org +o Cube_Cube.009 +v -0.031250 0.093750 0.031250 +v -0.031250 0.343750 0.031250 +v -0.031250 0.093750 -0.031250 +v -0.031250 0.343750 -0.031250 +v 0.031250 0.093750 0.031250 +v 0.031250 0.343750 0.031250 +v 0.031250 0.093750 -0.031250 +v 0.031250 0.343750 -0.031250 +v 0.000000 0.343750 0.000000 +v 0.000000 0.093750 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.750000 +vt 0.031251 0.750000 +vt 0.031249 1.000000 +vt 0.062501 0.750000 +vt 0.062499 1.000000 +vt 0.000000 0.750000 +vt 0.000000 1.000000 +vt 0.062499 1.000000 +vt 0.062501 0.750000 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.0000 -0.7071 +s off +f 4/1/1 3/2/1 10/3/1 9/4/1 +f 1/5/2 2/6/2 9/4/2 10/3/2 +f 9/4/1 10/3/1 5/7/1 6/8/1 +f 10/3/2 9/4/2 8/9/2 7/10/2 +o Cube.002_Cube.007 +v -0.062500 0.000000 0.062500 +v -0.062500 0.031250 0.093750 +v -0.093750 0.031250 0.062500 +v -0.062500 0.312500 0.093750 +v -0.062500 0.343750 0.062500 +v -0.093750 0.312500 0.062500 +v -0.062500 0.000000 -0.062500 +v -0.093750 0.031250 -0.062500 +v -0.062500 0.031250 -0.093750 +v -0.062500 0.343750 -0.062500 +v -0.062500 0.312500 -0.093750 +v -0.093750 0.312500 -0.062500 +v 0.062500 0.000000 0.062500 +v 0.093750 0.031250 0.062500 +v 0.062500 0.031250 0.093750 +v 0.062500 0.343750 0.062500 +v 0.062500 0.312500 0.093750 +v 0.093750 0.312500 0.062500 +v 0.062500 0.000000 -0.062500 +v 0.062500 0.031250 -0.093750 +v 0.093750 0.031250 -0.062500 +v 0.062500 0.343750 -0.062500 +v 0.093750 0.312500 -0.062500 +v 0.062500 0.312500 -0.093750 +vt 0.437500 0.656250 +vt 0.437500 0.937500 +vt 0.312500 0.937500 +vt 0.312500 0.656250 +vt 0.625000 0.656250 +vt 0.625000 0.937500 +vt 0.500000 0.937500 +vt 0.500000 0.656250 +vt 1.000003 0.656250 +vt 1.000002 0.937500 +vt 0.875000 0.937500 +vt 0.875000 0.656250 +vt 0.812500 0.656250 +vt 0.812500 0.937500 +vt 0.687500 0.937500 +vt 0.687500 0.656250 +vt 0.281250 0.593750 +vt 0.250000 0.656250 +vt 0.281250 1.000000 +vt 0.250000 0.937500 +vt 0.843750 0.593750 +vt 0.843750 1.000000 +vt 0.468750 0.593750 +vt 0.468750 1.000000 +vt 0.656250 0.593750 +vt 0.656250 1.000000 +vt 0.875000 0.593750 +vt 1.000003 0.593750 +vt 1.000002 1.000000 +vt 0.875000 1.000000 +vt 0.687500 0.593750 +vt 0.812500 0.593750 +vt 0.812500 1.000000 +vt 0.687500 1.000000 +vt 0.500000 0.593750 +vt 0.625000 0.593750 +vt 0.625000 1.000000 +vt 0.500000 1.000000 +vt 0.312500 0.593750 +vt 0.437500 0.593750 +vt 0.437500 1.000000 +vt 0.312500 1.000000 +vt 0.250000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.875000 +vt 0.250000 0.875000 +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.5774 -0.5774 0.5774 +vn -0.5774 0.5774 0.5774 +vn -0.5774 -0.5774 -0.5774 +vn -0.5774 0.5774 -0.5774 +vn 0.5774 -0.5774 0.5774 +vn 0.5774 0.5774 0.5774 +vn 0.5774 -0.5774 -0.5774 +vn 0.5774 0.5774 -0.5774 +vn -0.7071 -0.7071 0.0000 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.7071 0.0000 +vn -0.7071 0.0000 -0.7071 +vn 0.0000 -0.7071 -0.7071 +vn 0.0000 0.7071 -0.7071 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 -0.7071 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.7071 0.0000 0.7071 +vn 0.0000 -0.7071 0.7071 +vn 0.0000 0.7071 0.7071 +vn 0.0000 -1.0000 0.0000 +s off +f 25/11/3 27/12/3 14/13/3 12/14/3 +f 31/15/4 33/16/4 28/17/4 24/18/4 +f 13/19/5 16/20/5 22/21/5 18/22/5 +f 19/23/6 21/24/6 34/25/6 30/26/6 +f 11/27/7 12/14/7 13/28/7 +f 14/13/8 15/29/8 16/30/8 +f 17/31/9 18/22/9 19/23/9 +f 20/32/10 21/24/10 22/21/10 +f 23/33/11 24/18/11 25/11/11 +f 26/34/12 27/12/12 28/17/12 +f 29/35/13 30/26/13 31/15/13 +f 32/36/14 33/16/14 34/25/14 +f 17/37/15 11/38/15 13/19/15 18/22/15 +f 12/14/16 14/13/16 16/30/16 13/28/16 +f 15/39/17 20/40/17 22/21/17 16/20/17 +f 21/24/18 19/23/18 18/22/18 22/21/18 +f 29/41/19 17/42/19 19/23/19 30/26/19 +f 20/43/20 32/44/20 34/25/20 21/24/20 +f 33/16/21 31/15/21 30/26/21 34/25/21 +f 23/45/22 29/46/22 31/15/22 24/18/22 +f 32/47/23 26/48/23 28/17/23 33/16/23 +f 27/12/24 25/11/24 24/18/24 28/17/24 +f 11/49/25 23/50/25 25/11/25 12/14/25 +f 26/51/26 15/52/26 14/13/26 27/12/26 +f 17/53/27 29/54/27 23/55/27 11/56/27 +o Cube.001_Cube.006 +v -0.062500 0.343750 0.062500 +v -0.062500 0.500000 0.062500 +v -0.062500 0.343750 -0.062500 +v -0.062500 0.500000 -0.062500 +v 0.062500 0.343750 0.062500 +v 0.062500 0.500000 0.062500 +v 0.062500 0.343750 -0.062500 +v 0.062500 0.500000 -0.062500 +vt 0.500000 0.000000 +vt 0.500000 0.156250 +vt 0.375000 0.156250 +vt 0.375000 0.000000 +vt 0.250000 0.156250 +vt 0.250000 0.000000 +vt 0.125000 0.156250 +vt 0.125000 0.000000 +vt 0.000000 0.156250 +vt 0.000000 0.000000 +vt 0.125000 0.156250 +vt 0.125000 0.281250 +vt 0.000000 0.281250 +vt 0.000000 0.156250 +vt 0.250000 0.281250 +vt 0.125000 0.281250 +vt 0.125000 0.156250 +vt 0.250000 0.156250 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +s off +f 35/57/28 36/58/28 38/59/28 37/60/28 +f 37/60/29 38/59/29 42/61/29 41/62/29 +f 41/62/30 42/61/30 40/63/30 39/64/30 +f 39/64/31 40/63/31 36/65/31 35/66/31 +f 37/67/32 41/68/32 39/69/32 35/70/32 +f 42/71/33 38/72/33 36/73/33 40/74/33 diff --git a/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_c.obj b/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_c.obj new file mode 100644 index 00000000..27512d1a --- /dev/null +++ b/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_c.obj @@ -0,0 +1,105 @@ +# Blender v2.79 (sub 0) OBJ File: 'vintage_lantern_ceiling.blend' +# www.blender.org +o Cube.003 +v -0.125000 0.000000 0.125000 +v -0.125000 0.375000 0.125000 +v -0.125000 0.000000 -0.125000 +v -0.125000 0.375000 -0.125000 +v 0.125000 0.000000 0.125000 +v 0.125000 0.375000 0.125000 +v 0.125000 0.000000 -0.125000 +v 0.125000 0.375000 -0.125000 +vt 0.750000 0.500000 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.500000 +vt 0.250000 0.875000 +vt 0.250000 0.500000 +vt 0.000000 0.875000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.875000 +vt 0.750000 0.250000 +vt 1.000000 0.250000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +g Cube.003_Cube.003_Material.001 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/4/2 4/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 6/7/3 5/8/3 +f 5/9/4 6/10/4 2/2/4 1/1/4 +f 3/11/5 7/12/5 5/9/5 1/1/5 +o Cube.001 +v -0.156250 0.375000 0.156250 +v -0.156250 0.437500 0.156250 +v -0.156250 0.375000 -0.156250 +v -0.156250 0.437500 -0.156250 +v 0.156250 0.375000 0.156250 +v 0.156250 0.437500 0.156250 +v 0.156250 0.375000 -0.156250 +v 0.156250 0.437500 -0.156250 +v -0.062500 0.437500 0.062500 +v -0.062500 0.500000 0.062500 +v -0.062500 0.437500 -0.062500 +v -0.062500 0.500000 -0.062500 +v 0.062500 0.437500 0.062500 +v 0.062500 0.500000 0.062500 +v 0.062500 0.437500 -0.062500 +v 0.062500 0.500000 -0.062500 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.500000 0.812500 +vt 0.187500 0.812500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.812500 +vt 0.187500 0.812500 +vt 0.187500 0.500000 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 0.875000 0.437500 +vt 0.875000 0.375000 +vt 0.750000 0.437500 +vt 0.750000 0.375000 +vt 0.625000 0.437500 +vt 0.625000 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Cube.001_Cube.001_Material.000 +s off +f 9/13/6 10/14/6 12/15/6 11/16/6 +f 11/17/7 12/18/7 16/19/7 15/20/7 +f 15/20/8 16/19/8 14/21/8 13/22/8 +f 13/23/9 14/24/9 10/14/9 9/13/9 +f 11/25/10 15/26/10 13/27/10 9/28/10 +f 16/29/11 12/30/11 10/31/11 14/32/11 +f 17/33/6 18/34/6 20/35/6 19/36/6 +f 19/36/7 20/35/7 24/37/7 23/38/7 +f 23/38/8 24/37/8 22/39/8 21/40/8 +f 21/40/9 22/39/9 18/41/9 17/42/9 +f 24/43/11 20/44/11 18/45/11 22/46/11 diff --git a/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_f.obj b/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_f.obj new file mode 100644 index 00000000..8f07e1c1 --- /dev/null +++ b/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_f.obj @@ -0,0 +1,131 @@ +# Blender v2.79 (sub 0) OBJ File: 'vintage_lantern.blend' +# www.blender.org +o Cube.003 +v -0.125000 -0.437500 0.125000 +v -0.125000 -0.062500 0.125000 +v -0.125000 -0.437500 -0.125000 +v -0.125000 -0.062500 -0.125000 +v 0.125000 -0.437500 0.125000 +v 0.125000 -0.062500 0.125000 +v 0.125000 -0.437500 -0.125000 +v 0.125000 -0.062500 -0.125000 +vt 0.750000 0.500000 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.500000 +vt 0.250000 0.875000 +vt 0.250000 0.500000 +vt 0.000000 0.875000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.875000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +g Cube.003_Cube.003_Material.001 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/4/2 4/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 6/7/3 5/8/3 +f 5/9/4 6/10/4 2/2/4 1/1/4 +o Cube.001 +v -0.156250 -0.500000 0.156250 +v -0.156250 -0.437500 0.156250 +v -0.156250 -0.500000 -0.156250 +v -0.156250 -0.437500 -0.156250 +v 0.156250 -0.500000 0.156250 +v 0.156250 -0.437500 0.156250 +v 0.156250 -0.500000 -0.156250 +v 0.156250 -0.437500 -0.156250 +v -0.156250 -0.062500 0.156250 +v -0.156250 0.000000 0.156250 +v -0.156250 -0.062500 -0.156250 +v -0.156250 0.000000 -0.156250 +v 0.156250 -0.062500 0.156250 +v 0.156250 0.000000 0.156250 +v 0.156250 -0.062500 -0.156250 +v 0.156250 0.000000 -0.156250 +v -0.062500 0.000000 0.062500 +v -0.062500 0.062500 0.062500 +v -0.062500 0.000000 -0.062500 +v -0.062500 0.062500 -0.062500 +v 0.062500 0.000000 0.062500 +v 0.062500 0.062500 0.062500 +v 0.062500 0.000000 -0.062500 +v 0.062500 0.062500 -0.062500 +vt 0.500000 0.187500 +vt 0.500000 0.125000 +vt 0.812500 0.125000 +vt 0.812500 0.187500 +vt 0.812500 0.125000 +vt 0.812500 0.187500 +vt 0.500000 0.187500 +vt 0.500000 0.125000 +vt 0.187500 0.187500 +vt 0.187500 0.125000 +vt 0.187500 0.187500 +vt 0.187500 0.125000 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.187500 0.500000 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.500000 0.812500 +vt 0.187500 0.812500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.812500 +vt 0.187500 0.812500 +vt 0.187500 0.500000 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 0.875000 0.437500 +vt 0.875000 0.375000 +vt 0.750000 0.437500 +vt 0.750000 0.375000 +vt 0.625000 0.437500 +vt 0.625000 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Cube.001_Cube.001_Material.000 +s off +f 9/11/5 10/12/5 12/13/5 11/14/5 +f 11/15/6 12/16/6 16/17/6 15/18/6 +f 15/18/7 16/17/7 14/19/7 13/20/7 +f 13/21/8 14/22/8 10/12/8 9/11/8 +f 11/23/9 15/24/9 13/21/9 9/11/9 +f 16/17/10 12/25/10 10/26/10 14/19/10 +f 17/27/5 18/28/5 20/29/5 19/30/5 +f 19/31/6 20/32/6 24/33/6 23/34/6 +f 23/34/7 24/33/7 22/35/7 21/36/7 +f 21/37/8 22/38/8 18/28/8 17/27/8 +f 19/39/9 23/40/9 21/41/9 17/42/9 +f 24/43/10 20/44/10 18/45/10 22/46/10 +f 25/47/5 26/48/5 28/49/5 27/50/5 +f 27/50/6 28/49/6 32/51/6 31/52/6 +f 31/52/7 32/51/7 30/53/7 29/54/7 +f 29/54/8 30/53/8 26/55/8 25/56/8 +f 32/57/10 28/58/10 26/59/10 30/60/10 diff --git a/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_w.obj b/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_w.obj new file mode 100644 index 00000000..ceb48b17 --- /dev/null +++ b/mods/morelights/morelights_vintage/models/morelights_vintage_lantern_w.obj @@ -0,0 +1,142 @@ +# Blender v2.79 (sub 0) OBJ File: 'vintage_lantern_wall2_merged.blend' +# www.blender.org +o Cube.003 +v -0.125000 -0.187500 -0.312500 +v -0.125000 -0.187500 0.062500 +v -0.125000 0.062500 -0.312500 +v -0.125000 0.062500 0.062500 +v 0.125000 -0.187500 -0.312500 +v 0.125000 -0.187500 0.062500 +v 0.125000 0.062500 -0.312500 +v 0.125000 0.062500 0.062500 +v -0.000000 -0.437500 0.312500 +v 0.000000 -0.437500 0.062500 +v -0.000000 0.062500 0.312500 +v 0.000000 0.062500 0.062500 +vt 0.750000 0.500000 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.500000 +vt 0.250000 0.875000 +vt 0.250000 0.500000 +vt 0.000000 0.875000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.875000 +vt 0.000000 0.500000 +vt 0.000000 0.250000 +vt 0.500000 0.250000 +vt 0.500000 0.500000 +vt 0.750000 0.250000 +vt 1.000000 0.250000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +g Cube.003_Cube.003_Material.001 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 3/4/2 4/3/2 8/5/2 7/6/2 +f 7/6/3 8/5/3 6/7/3 5/8/3 +f 5/9/4 6/10/4 2/2/4 1/1/4 +f 9/11/3 10/12/3 12/13/3 11/14/3 +f 3/15/5 7/16/5 5/9/5 1/1/5 +o Cube.001 +v -0.156250 -0.218750 0.062500 +v -0.156250 -0.218750 0.125000 +v -0.156250 0.093750 0.062500 +v -0.156250 0.093750 0.125000 +v 0.156250 -0.218750 0.062500 +v 0.156250 -0.218750 0.125000 +v 0.156250 0.093750 0.062500 +v 0.156250 0.093750 0.125000 +v -0.062500 -0.125000 0.125000 +v -0.062500 -0.125000 0.187500 +v -0.062500 -0.000000 0.125000 +v -0.062500 -0.000000 0.187500 +v 0.062500 -0.125000 0.125000 +v 0.062500 -0.125000 0.187500 +v 0.062500 -0.000000 0.125000 +v 0.062500 -0.000000 0.187500 +v 0.125000 -0.500000 -0.125000 +v 0.125000 -0.500000 0.375000 +v -0.125000 -0.500000 -0.125000 +v -0.125000 -0.500000 0.375000 +v 0.125000 -0.437500 -0.125000 +v 0.125000 -0.437500 0.375000 +v -0.125000 -0.437500 -0.125000 +v -0.125000 -0.437500 0.375000 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.812500 0.812500 +vt 0.812500 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.812500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.187500 0.875000 +vt 0.187500 0.812500 +vt 0.500000 0.812500 +vt 0.187500 0.812500 +vt 0.187500 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.812500 +vt 0.187500 0.812500 +vt 0.187500 0.500000 +vt 1.000000 0.375000 +vt 1.000000 0.437500 +vt 0.875000 0.437500 +vt 0.875000 0.375000 +vt 0.750000 0.437500 +vt 0.750000 0.375000 +vt 0.625000 0.437500 +vt 0.625000 0.375000 +vt 0.500000 0.437500 +vt 0.500000 0.375000 +vt 0.625000 0.625000 +vt 0.500000 0.625000 +vt 0.500000 0.500000 +vt 0.625000 0.500000 +vt 0.937500 0.250000 +vt 0.937500 0.750000 +vt 0.687500 0.750000 +vt 0.687500 0.250000 +vt 0.625000 0.750000 +vt 0.625000 0.250000 +vt 0.375000 0.750000 +vt 0.375000 0.250000 +vt 0.312500 0.750000 +vt 0.312500 0.250000 +vt 0.687500 0.187500 +vt 0.937500 0.187500 +vt 0.687500 0.812500 +vt 0.937500 0.812500 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.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 +g Cube.001_Cube.001_Material.000 +s off +f 13/17/6 14/18/6 16/19/6 15/20/6 +f 15/21/7 16/22/7 20/23/7 19/24/7 +f 19/24/8 20/23/8 18/25/8 17/26/8 +f 17/27/9 18/28/9 14/18/9 13/17/9 +f 15/29/10 19/30/10 17/31/10 13/32/10 +f 20/33/11 16/34/11 14/35/11 18/36/11 +f 21/37/6 22/38/6 24/39/6 23/40/6 +f 23/40/7 24/39/7 28/41/7 27/42/7 +f 27/42/8 28/41/8 26/43/8 25/44/8 +f 25/44/9 26/43/9 22/45/9 21/46/9 +f 28/47/11 24/48/11 22/49/11 26/50/11 +f 29/51/9 30/52/9 32/53/9 31/54/9 +f 31/54/6 32/53/6 36/55/6 35/56/6 +f 35/56/7 36/55/7 34/57/7 33/58/7 +f 33/58/8 34/57/8 30/59/8 29/60/8 +f 31/54/10 35/61/10 33/62/10 29/51/10 +f 36/63/11 32/53/11 30/52/11 34/64/11 diff --git a/mods/morelights/morelights_vintage/models/morelights_vintage_oillamp.obj b/mods/morelights/morelights_vintage/models/morelights_vintage_oillamp.obj new file mode 100644 index 00000000..de84b175 --- /dev/null +++ b/mods/morelights/morelights_vintage/models/morelights_vintage_oillamp.obj @@ -0,0 +1,169 @@ +# Blender v2.79 (sub 0) OBJ File: 'vintage_oillamp.blend' +# www.blender.org +o Plane +v -0.031250 -0.468750 -0.031250 +v 0.031250 -0.468750 0.031250 +v -0.031250 0.031250 -0.031250 +v 0.031250 0.031250 0.031250 +v 0.031250 -0.468750 -0.031250 +v -0.031250 -0.468750 0.031250 +v 0.031250 0.031250 -0.031250 +v -0.031250 0.031250 0.031250 +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.7071 -0.0000 0.7071 +vn -0.7071 -0.0000 -0.7071 +g Plane_Plane_Material.003 +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 5/5/2 6/6/2 8/7/2 7/8/2 +o Cube.001 +v -0.125000 -0.499000 0.125000 +v -0.125000 -0.343750 0.125000 +v -0.125000 -0.499000 -0.125000 +v -0.125000 -0.343750 -0.125000 +v 0.125000 -0.499000 0.125000 +v 0.125000 -0.343750 0.125000 +v 0.125000 -0.499000 -0.125000 +v 0.125000 -0.343750 -0.125000 +v -0.125000 -0.218750 0.125000 +v -0.125000 0.250000 0.125000 +v -0.125000 -0.218750 -0.125000 +v -0.125000 0.250000 -0.125000 +v 0.125000 -0.218750 0.125000 +v 0.125000 0.250000 0.125000 +v 0.125000 -0.218750 -0.125000 +v 0.125000 0.250000 -0.125000 +vt 0.750000 0.000000 +vt 0.750000 0.156250 +vt 0.500000 0.156250 +vt 0.500000 0.000000 +vt 0.250000 0.156250 +vt 0.250000 0.000000 +vt 0.000000 0.156250 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.156250 +vt 0.250000 0.406250 +vt 0.000000 0.406250 +vt 0.000000 0.156250 +vt 0.250000 0.156250 +vt 0.750000 0.406250 +vt 0.750000 0.875000 +vt 0.500000 0.875000 +vt 0.500000 0.406250 +vt 0.250000 0.875000 +vt 0.250000 0.406250 +vt 0.000000 0.875000 +vt 0.000000 0.406250 +vt 1.000000 0.406250 +vt 1.000000 0.875000 +vt 0.500000 0.406250 +vt 0.250000 0.406250 +vt 0.250000 0.156250 +vt 0.500000 0.156250 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Cube.001_Cube.001_Material.002 +s off +f 9/9/3 10/10/3 12/11/3 11/12/3 +f 11/12/4 12/11/4 16/13/4 15/14/4 +f 15/14/5 16/13/5 14/15/5 13/16/5 +f 13/17/6 14/18/6 10/10/6 9/9/6 +f 11/19/7 15/20/7 13/21/7 9/22/7 +f 17/23/3 18/24/3 20/25/3 19/26/3 +f 19/26/4 20/25/4 24/27/4 23/28/4 +f 23/28/5 24/27/5 22/29/5 21/30/5 +f 21/31/6 22/32/6 18/24/6 17/23/6 +f 18/33/8 22/34/8 24/35/8 20/36/8 +o Cube +v 0.062500 -0.312500 -0.062500 +v 0.062500 -0.312500 0.062500 +v -0.062500 -0.312500 0.062500 +v -0.062500 -0.312500 -0.062500 +v 0.062500 -0.250000 -0.062500 +v 0.062500 -0.250000 0.062500 +v -0.062500 -0.250000 0.062500 +v -0.062500 -0.250000 -0.062500 +v -0.125000 -0.343750 0.125000 +v -0.125000 -0.312500 0.125000 +v -0.125000 -0.343750 -0.125000 +v -0.125000 -0.312500 -0.125000 +v 0.125000 -0.343750 0.125000 +v 0.125000 -0.312500 0.125000 +v 0.125000 -0.343750 -0.125000 +v 0.125000 -0.312500 -0.125000 +v -0.125000 -0.250000 0.125000 +v -0.125000 -0.218750 0.125000 +v -0.125000 -0.250000 -0.125000 +v -0.125000 -0.218750 -0.125000 +v 0.125000 -0.250000 0.125000 +v 0.125000 -0.218750 0.125000 +v 0.125000 -0.250000 -0.125000 +v 0.125000 -0.218750 -0.125000 +vt 0.625000 0.531250 +vt 0.625000 0.468750 +vt 0.750000 0.468750 +vt 0.750000 0.531250 +vt 0.250000 0.531250 +vt 0.250000 0.468750 +vt 0.375000 0.468750 +vt 0.375000 0.531250 +vt 0.500000 0.468750 +vt 0.500000 0.531250 +vt 0.250000 0.781250 +vt 0.250000 0.750000 +vt 0.500000 0.750000 +vt 0.500000 0.781250 +vt 0.750000 0.750000 +vt 0.750000 0.781250 +vt 1.000000 0.750000 +vt 1.000000 0.781250 +vt 0.000000 0.781250 +vt 0.000000 0.750000 +vt 0.000000 0.500000 +vt 0.250000 0.500000 +vt 0.250000 0.250000 +vt 0.250000 0.218750 +vt 0.500000 0.218750 +vt 0.500000 0.250000 +vt 0.750000 0.218750 +vt 0.750000 0.250000 +vt 1.000000 0.218750 +vt 1.000000 0.250000 +vt 0.000000 0.250000 +vt 0.000000 0.218750 +vt 0.250000 0.500000 +vt 0.000000 0.500000 +vn 1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +g Cube_Cube_Material +s off +f 25/37/9 29/38/9 30/39/9 26/40/9 +f 26/41/10 30/42/10 31/43/10 27/44/10 +f 27/44/11 31/43/11 32/45/11 28/46/11 +f 29/38/12 25/37/12 28/46/12 32/45/12 +f 33/47/11 34/48/11 36/49/11 35/50/11 +f 35/50/12 36/49/12 40/51/12 39/52/12 +f 39/52/9 40/51/9 38/53/9 37/54/9 +f 37/55/10 38/56/10 34/48/10 33/47/10 +f 34/48/13 38/56/13 40/57/13 36/58/13 +f 41/59/11 42/60/11 44/61/11 43/62/11 +f 43/62/12 44/61/12 48/63/12 47/64/12 +f 47/64/9 48/63/9 46/65/9 45/66/9 +f 45/67/10 46/68/10 42/60/10 41/59/10 +f 43/69/14 47/70/14 45/67/14 41/59/14 diff --git a/mods/morelights/morelights_vintage/models/morelights_vintage_streetlamp.obj b/mods/morelights/morelights_vintage/models/morelights_vintage_streetlamp.obj new file mode 100644 index 00000000..1dd847d2 --- /dev/null +++ b/mods/morelights/morelights_vintage/models/morelights_vintage_streetlamp.obj @@ -0,0 +1,42 @@ +# Blender v2.79 (sub 0) OBJ File: 'vintage_streetlamp.blend' +# www.blender.org +mtllib morelights_vintage_streetlamp.mtl +o Plane +v -0.312500 0.075000 0.312500 +v 0.312500 0.075000 0.312500 +v -0.312500 0.075000 -0.312500 +v 0.312500 0.075000 -0.312500 +v 0.000000 0.325000 0.000000 +vn 0.6247 -0.7809 0.0000 +vn 0.0000 -0.7809 -0.6247 +vn -0.6247 -0.7809 0.0000 +vn 0.0000 -0.7809 0.6247 +usemtl None +s off +f 1//1 3//1 5//1 +f 2//2 1//2 5//2 +f 4//3 2//3 5//3 +f 3//4 4//4 5//4 +o Cube.001 +v -0.187500 -0.500000 0.187500 +v -0.250000 0.125000 0.250000 +v -0.187500 -0.500000 -0.187500 +v -0.250000 0.125000 -0.250000 +v 0.187500 -0.500000 0.187500 +v 0.250000 0.125000 0.250000 +v 0.187500 -0.500000 -0.187500 +v 0.250000 0.125000 -0.250000 +vn -0.9950 -0.0995 0.0000 +vn 0.0000 -0.0995 -0.9950 +vn 0.9950 -0.0995 0.0000 +vn 0.0000 -0.0995 0.9950 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +usemtl None +s off +f 6//5 7//5 9//5 8//5 +f 8//6 9//6 13//6 12//6 +f 12//7 13//7 11//7 10//7 +f 10//8 11//8 7//8 6//8 +f 8//9 12//9 10//9 6//9 +f 13//10 9//10 7//10 11//10 diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_block.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_block.png new file mode 100644 index 00000000..89071f94 Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_block.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_brass.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_brass.png new file mode 100644 index 00000000..ff20bb86 Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_brass.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_brass_32.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_brass_32.png new file mode 100644 index 00000000..a6df9f4c Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_brass_32.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_chain_b_inv.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_chain_b_inv.png new file mode 100644 index 00000000..c6f96792 Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_chain_b_inv.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_chandelier.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_chandelier.png new file mode 100644 index 00000000..c1e5816a Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_chandelier.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_hangingbulb.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_hangingbulb.png new file mode 100644 index 00000000..90610ab7 Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_hangingbulb.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_hangingbulb_inv.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_hangingbulb_inv.png new file mode 100644 index 00000000..1c7c628d Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_hangingbulb_inv.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_lantern.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_lantern.png new file mode 100644 index 00000000..cf9d74e9 Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_lantern.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_oil_flame.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_oil_flame.png new file mode 100644 index 00000000..cfab23d0 Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_oil_flame.png differ diff --git a/mods/morelights/morelights_vintage/textures/morelights_vintage_oillamp.png b/mods/morelights/morelights_vintage/textures/morelights_vintage_oillamp.png new file mode 100644 index 00000000..a2d7ab8d Binary files /dev/null and b/mods/morelights/morelights_vintage/textures/morelights_vintage_oillamp.png differ diff --git a/mods/morelights/screenshot.png b/mods/morelights/screenshot.png new file mode 100644 index 00000000..972d45b9 Binary files /dev/null and b/mods/morelights/screenshot.png differ diff --git a/mods/moretrees/locale/moretrees.de.tr b/mods/moretrees/locale/moretrees.de.tr index 10980d62..7cbd17c2 100644 --- a/mods/moretrees/locale/moretrees.de.tr +++ b/mods/moretrees/locale/moretrees.de.tr @@ -1,211 +1,211 @@ # textdomain: moretrees -# Translation by Xanthin +# Translation by Xanthin and heavygale ### cocos_palm.lua ### Coconut=Kokosnuss -Coconut Flower= +Coconut Flower=Kokosnussblüte ### crafts.lua ### Acorn Muffin=Eichelmuffin Acorn Muffin batter=Eichelmuffinteig Coconut Milk=Kokosnussmilch -Date= -Date & nut snack= -Date-nut cake= -Date-nut cake batter= -Date-nut energy bar= +Date=Dattel +Date & nut snack=Dattel & Nuss-Snack +Date-nut cake=Dattelnusskuchen +Date-nut cake batter=Dattelnuss-Kuchenteig +Date-nut energy bar=Dattelnuss-Energieriegel Raw Coconut=Kokosnussfleisch -Roasted Cedar Cone Nuts= -Roasted Fir Cone Nuts=Geroestete Tannenzapfen -Roasted Spruce Cone Nuts=Geroestete Fichtenzapfen +Roasted Cedar Cone Nuts=Geröstete Zedernzapfenkerne +Roasted Fir Cone Nuts=Geroestete Tannenzapfenkerne +Roasted Spruce Cone Nuts=Geroestete Fichtenzapfenkerne ### date_palm.lua ### -Date Flowers= -Date Stem= -Dates= +Date Flowers=Dattelblüten +Date Stem=Dattelstamm +Dates=Datteln ### node_defs.lua ### -@1 (fast growth)= +@1 (fast growth)=@1 (schnelles Wachstum) Acorn=Eichel -Apple Tree= -Apple Tree Fence= -Apple Tree Fence Gate= -Apple Tree Fence Rail= +Apple Tree=Apfelbaum +Apple Tree Fence=Apfelbaum-Zaun +Apple Tree Fence Gate=Apfelbaum-Tor +Apple Tree Fence Rail=Apfelbaum-Schiene Apple Tree Leaves=Apfelbaumlaub Apple Tree Planks=Apfelbaumbretter -Apple Tree Planks Slab= -Apple Tree Planks Stair= +Apple Tree Planks Slab=Apfelbaumplatte +Apple Tree Planks Stair=Apfelbaumstufe Apple Tree Sapling=Apfelbaumsetzling Apple Tree Trunk=Apfelbaumstamm -Apple Tree Trunk Slab= -Apple Tree Trunk Stair= -Beech Tree= -Beech Tree Fence= -Beech Tree Fence Gate= -Beech Tree Fence Rail= +Apple Tree Trunk Slab=Apfelbaumstammplatte +Apple Tree Trunk Stair=Apfelbaumstammstufe +Beech Tree=Buche +Beech Tree Fence=Buchenholz-Zaun +Beech Tree Fence Gate=Buchenholz-Tor +Beech Tree Fence Rail=Buchenholz-Schiene Beech Tree Leaves=Buchenlaub -Beech Tree Planks=Buchebretter -Beech Tree Planks Slab= -Beech Tree Planks Stair= +Beech Tree Planks=Buchenholzbretter +Beech Tree Planks Slab=Buchenholzplatte +Beech Tree Planks Stair=Buchenholzstufe Beech Tree Sapling=Buchesetzling Beech Tree Trunk=Buchenstamm -Beech Tree Trunk Slab= -Beech Tree Trunk Stair= -Birch Tree= -Birch Tree Fence= -Birch Tree Fence Gate= -Birch Tree Fence Rail= +Beech Tree Trunk Slab=Buchenstammplatte +Beech Tree Trunk Stair=Buchenstammstufe +Birch Tree=Birke +Birch Tree Fence=Birkenholz-Zaun +Birch Tree Fence Gate=Birkenholz-Tor +Birch Tree Fence Rail=Birkenholz-Schiene Birch Tree Leaves=Birkenlaub Birch Tree Planks=Birkebretter -Birch Tree Planks Slab= -Birch Tree Planks Stair= +Birch Tree Planks Slab=Birkenholzplatte +Birch Tree Planks Stair=Birkeholzstufe Birch Tree Sapling=Birkensetzling Birch Tree Trunk=Birkenstamm -Birch Tree Trunk Slab= -Birch Tree Trunk Stair= -Cedar Cone= -Cedar Tree= -Cedar Tree Fence= -Cedar Tree Fence Gate= -Cedar Tree Fence Rail= -Cedar Tree Leaves= -Cedar Tree Planks= -Cedar Tree Planks Slab= -Cedar Tree Planks Stair= -Cedar Tree Sapling= -Cedar Tree Trunk= -Cedar Tree Trunk Slab= -Cedar Tree Trunk Stair= -Date Palm Tree= -Date Palm Tree Fence= -Date Palm Tree Fence Gate= -Date Palm Tree Fence Rail= -Date Palm Tree Leaves= -Date Palm Tree Planks= -Date Palm Tree Planks Slab= -Date Palm Tree Planks Stair= -Date Palm Tree Sapling= -Date Palm Tree Trunk= -Date Palm Tree Trunk Slab= -Date Palm Tree Trunk Stair= -Douglas Fir= -Douglas Fir Fence= -Douglas Fir Fence Gate= -Douglas Fir Fence Rail= +Birch Tree Trunk Slab=Birkenstammplatte +Birch Tree Trunk Stair=Birkenstammstufe +Cedar Cone=Zedernzapfen +Cedar Tree=Zeder +Cedar Tree Fence=Zedernholz-Zaun +Cedar Tree Fence Gate=Zedernholz-Tor +Cedar Tree Fence Rail=Zedernholz-Schiene +Cedar Tree Leaves=Zederblätter +Cedar Tree Planks=Zedernholzbretter +Cedar Tree Planks Slab=Zedernholzplatte +Cedar Tree Planks Stair=Zedernholzstufe +Cedar Tree Sapling=Zedersetzling +Cedar Tree Trunk=Zederstamm +Cedar Tree Trunk Slab=Zederstammplatte +Cedar Tree Trunk Stair=Zederstamm Stufe +Date Palm Tree=Dattelpalme +Date Palm Tree Fence=Dattelpalmen-Zaun +Date Palm Tree Fence Gate=Dattelpalmen-Tor +Date Palm Tree Fence Rail=Dattelpalmen-Schiene +Date Palm Tree Leaves=Dattelpalmenblätter +Date Palm Tree Planks=Dattelpalmenbretter +Date Palm Tree Planks Slab=Dattelpalmenplatte +Date Palm Tree Planks Stair=Dattelpalmenstufe +Date Palm Tree Sapling=Dattelpalmensetzling +Date Palm Tree Trunk=Dattelpalmenstamm +Date Palm Tree Trunk Slab=Dattelpalmenstammplatte +Date Palm Tree Trunk Stair=Dattelpalmenstammstufe +Douglas Fir=Douglasie +Douglas Fir Fence=Douglasien-Zaun +Douglas Fir Fence Gate=Douglasien-Tor +Douglas Fir Fence Rail=Douglasien-Schiene Douglas Fir Leaves=Douglasiennadeln Douglas Fir Leaves (Bright)=Douglasiennadeln (breit) Douglas Fir Planks=Douglasienbretter -Douglas Fir Planks Slab= -Douglas Fir Planks Stair= +Douglas Fir Planks Slab=Douglasienplatte +Douglas Fir Planks Stair=Douglasienstufe Douglas Fir Sapling=Douglasiensetzling Douglas Fir Trunk=Douglasienstamm -Douglas Fir Trunk Slab= -Douglas Fir Trunk Stair= +Douglas Fir Trunk Slab=Douglasienstammplatte +Douglas Fir Trunk Stair=Douglasienstammstufe Fir Cone=Tannenzapfen -Giant Sequoia= -Giant Sequoia Fence= -Giant Sequoia Fence Gate= -Giant Sequoia Fence Rail= +Giant Sequoia=Riesenmammutbaum +Giant Sequoia Fence=Riesenmammutbaum-Zaun +Giant Sequoia Fence Gate=Riesenmammutbaum-Tor +Giant Sequoia Fence Rail=Riesenmammutbaum-Schiene Giant Sequoia Leaves=Riesenmammutbaumlaub Giant Sequoia Planks=Riesenmammutbaumbretter -Giant Sequoia Planks Slab= -Giant Sequoia Planks Stair= +Giant Sequoia Planks Slab=Riesenmammutbaumplatte +Giant Sequoia Planks Stair=Riesenmammutbaumstufe Giant Sequoia Sapling=Riesenmammutbaumsetzling Giant Sequoia Trunk=Riesenmammutbaumstamm -Giant Sequoia Trunk Slab= -Giant Sequoia Trunk Stair= -Jungle Tree= -Jungle Tree Fence= -Jungle Tree Fence Gate= -Jungle Tree Fence Rail= +Giant Sequoia Trunk Slab=Riesenmammutbaumstammplatte +Giant Sequoia Trunk Stair=Riesenmammutbaumstammstufe +Jungle Tree=Tropenbaum +Jungle Tree Fence=Tropenbaum-Zaun +Jungle Tree Fence Gate=Tropenbaum-Tor +Jungle Tree Fence Rail=Tropenbaum-Schiene Jungle Tree Leaves=Tropenbaumlaub Jungle Tree Leaves (@1)=Tropenbaumlaub (@1) Jungle Tree Planks=Tropenholzbretter -Jungle Tree Planks Slab= -Jungle Tree Planks Stair= +Jungle Tree Planks Slab=Tropenholzplatte +Jungle Tree Planks Stair=Tropenholzstufe Jungle Tree Sapling=Tropenbaumsetzling Jungle Tree Trunk=Tropenbaumstamm -Jungle Tree Trunk Slab= -Jungle Tree Trunk Stair= -Oak Tree= -Oak Tree Fence= -Oak Tree Fence Gate= -Oak Tree Fence Rail= +Jungle Tree Trunk Slab=Tropenbaumstammplatte +Jungle Tree Trunk Stair=Tropenbaumstammstufe +Oak Tree=Eiche +Oak Tree Fence=Eichenholz-Zaun +Oak Tree Fence Gate=Eichenholz-Tor +Oak Tree Fence Rail=Eichenholz-Schiene Oak Tree Leaves=Eichenlaub Oak Tree Planks=Eichenbretter -Oak Tree Planks Slab= -Oak Tree Planks Stair= +Oak Tree Planks Slab=Eichenholzplatte +Oak Tree Planks Stair=Eichenholzstufe Oak Tree Sapling=Eichensetzling Oak Tree Trunk=Eichenstamm -Oak Tree Trunk Slab= -Oak Tree Trunk Stair= -Palm Tree= -Palm Tree Fence= -Palm Tree Fence Gate= -Palm Tree Fence Rail= +Oak Tree Trunk Slab=Eichenstammplatte +Oak Tree Trunk Stair=Eichenstammstufe +Palm Tree=Palme +Palm Tree Fence=Plamenholz-Zaun +Palm Tree Fence Gate=Plamenholz-Tor +Palm Tree Fence Rail=Plamenholz-Schiene Palm Tree Leaves=Palmenlaub Palm Tree Planks=Palmenbretter -Palm Tree Planks Slab= -Palm Tree Planks Stair= +Palm Tree Planks Slab=Plamenholzplatte +Palm Tree Planks Stair=Plamenholzstufe Palm Tree Sapling=Palmensetzling Palm Tree Trunk=Palmenstamm -Palm Tree Trunk Slab= -Palm Tree Trunk Stair= -Poplar Tree= -Poplar Tree Fence= -Poplar Tree Fence Gate= -Poplar Tree Fence Rail= -Poplar Tree Leaves= -Poplar Tree Planks= -Poplar Tree Planks Slab= -Poplar Tree Planks Stair= -Poplar Tree Sapling= -Poplar Tree Trunk= -Poplar Tree Trunk Slab= -Poplar Tree Trunk Stair= +Palm Tree Trunk Slab=Palmenstammplatte +Palm Tree Trunk Stair=Palmenstammstufe +Poplar Tree=Pappel +Poplar Tree Fence=Pappelholz-Zaun +Poplar Tree Fence Gate=Pappelholz-Tor +Poplar Tree Fence Rail=Pappelholz-Schiene +Poplar Tree Leaves=Pappelblätter +Poplar Tree Planks=Pappelholzbretter +Poplar Tree Planks Slab=Pappelholzsplatte +Poplar Tree Planks Stair=Pappelholzstufe +Poplar Tree Sapling=Pappelsetzling +Poplar Tree Trunk=Pappelstamm +Poplar Tree Trunk Slab=Pappelstammplatte +Poplar Tree Trunk Stair=Pappelstammstufe Red=rot -Rubber Tree= -Rubber Tree Fence= -Rubber Tree Fence Gate= -Rubber Tree Fence Rail= +Rubber Tree=Gummibaum +Rubber Tree Fence=Gummibaum-Zaun +Rubber Tree Fence Gate=Gummibaum-Tor +Rubber Tree Fence Rail=Gummibaum-Schiene Rubber Tree Leaves=Gummibaumlaub Rubber Tree Planks=Gummibaumbretter -Rubber Tree Planks Slab= -Rubber Tree Planks Stair= +Rubber Tree Planks Slab=Gummibaumplatte +Rubber Tree Planks Stair=Gummibaumstufe Rubber Tree Sapling=Gummibaumsetzling Rubber Tree Trunk=Gummibaumstamm Rubber Tree Trunk (Empty)=Gummibaumstamm (leer) -Rubber Tree Trunk Slab= -Rubber Tree Trunk Stair= -Small poplar Tree Sapling= +Rubber Tree Trunk Slab=Gummibaumstammplatte +Rubber Tree Trunk Stair=Gummibaumstammstufe +Small poplar Tree Sapling=Kleiner Pappelsetzling Spruce Cone=Fichtenzapfen -Spruce Tree= -Spruce Tree Fence= -Spruce Tree Fence Gate= -Spruce Tree Fence Rail= +Spruce Tree=Fichte +Spruce Tree Fence=Fichtenholz-Zaun +Spruce Tree Fence Gate=Fichtenholz-Zaun +Spruce Tree Fence Rail=Fichtenholz-Schiene Spruce Tree Leaves=Fichtennadeln Spruce Tree Planks=Fichtenbretter -Spruce Tree Planks Slab= -Spruce Tree Planks Stair= +Spruce Tree Planks Slab=Fichtenholzplatte +Spruce Tree Planks Stair=Fichtenholzstufe Spruce Tree Sapling=Fichtensetzling Spruce Tree Trunk=Fichtenstamm -Spruce Tree Trunk Slab= -Spruce Tree Trunk Stair= -Willow Tree= -Willow Tree Fence= -Willow Tree Fence Gate= -Willow Tree Fence Rail= +Spruce Tree Trunk Slab=Fichtenstammplatte +Spruce Tree Trunk Stair=Fichtenstammstufe +Willow Tree=Weide +Willow Tree Fence=Weidenholz-Zaun +Willow Tree Fence Gate=Weidenholz-Tor +Willow Tree Fence Rail=Weidenholz-Schiene Willow Tree Leaves=Weidenlaub Willow Tree Planks=Weidenbretter -Willow Tree Planks Slab= -Willow Tree Planks Stair= +Willow Tree Planks Slab=Weidenholzplatte +Willow Tree Planks Stair=Weidenholzstufe Willow Tree Sapling=Weidensetzling Willow Tree Trunk=Weidenstamm -Willow Tree Trunk Slab= -Willow Tree Trunk Stair= +Willow Tree Trunk Slab=Weidenstammplatte +Willow Tree Trunk Stair=Weidenstammstufe Yellow=gelb diff --git a/mods/myboardgames/README.md b/mods/myboardgames/README.md new file mode 100644 index 00000000..aa1f94b5 --- /dev/null +++ b/mods/myboardgames/README.md @@ -0,0 +1,35 @@ +# myboardgames + +A modpack for Minetest that adds different mini games. + +mycheckers - a checker board and pieces + +mychess - a chess board and pieces + +myconnect4 - a 4 in a row game + +mylittle_bg - a small board game. Roll the dice and move your player + +mydiamondblock - a large block with a maze of tunnels in it. Race to the top + +mymazes - a couple small mazes + +mypitfall - a simple parkour + +myuno - a card game + +mypachini - board/dice game + +mytrouble - board/dice game + +mypirinola - a top that tells you what to do + +There is no craft for these. Use /giveme or creative to get the placer block. +Place the block and right click it. The schematic places to the north east.(+x,+z) + +For more information please view the topic on the forum. https://forum.minetest.net/viewtopic.php?f=9&t=13209 + +The privilege myboardgames is required to place any of the game placing nodes, by default this is granted to singleplayer, to change that modify the mycanadiancheckers/init.lua file and change give_to_single_player = true to false. + + +Licence - DWYWPL diff --git a/mods/myboardgames/description.txt b/mods/myboardgames/description.txt new file mode 100644 index 00000000..350e7ef3 --- /dev/null +++ b/mods/myboardgames/description.txt @@ -0,0 +1 @@ +This is a modpack with 16 mini games. It includes chess, checkers, connect 4, uno and more. diff --git a/mods/myboardgames/licence.txt b/mods/myboardgames/licence.txt new file mode 100644 index 00000000..f50419b0 --- /dev/null +++ b/mods/myboardgames/licence.txt @@ -0,0 +1,13 @@ +DO WHAT YOU WANT TO PUBLIC LICENSE +or abbreviated DWYWPL + +December 2nd 2015 +License Copyright (C) 2015 Michael Tomaino (PlatinumArts@gmail.com) +www.sandboxgamemaker.com/DWYWPL/ + +DO WHAT YOU WANT TO PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +1. You are allowed to do whatever you want to with what content is using this license. +2. This content is provided 'as-is', without any express or implied warranty. In no event +will the authors be held liable for any damages arising from the use of this content. diff --git a/mods/myboardgames/mod.conf b/mods/myboardgames/mod.conf new file mode 100644 index 00000000..bcdce9f5 --- /dev/null +++ b/mods/myboardgames/mod.conf @@ -0,0 +1 @@ +name = myboardgames diff --git a/mods/myboardgames/modpack.txt b/mods/myboardgames/modpack.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/myboardgames/my_game_pieces/init.lua b/mods/myboardgames/my_game_pieces/init.lua new file mode 100644 index 00000000..28831c2a --- /dev/null +++ b/mods/myboardgames/my_game_pieces/init.lua @@ -0,0 +1,106 @@ +local dice = { + {"1","1","2","3","4","5","6",1}, + {"2","2","3","4","5","6","1",1}, + {"3","3","4","5","6","1","2",0}, + {"4","4","5","6","1","2","3",1}, + {"5","5","6","1","2","3","4",1}, + {"6","6","1","2","3","4","5",1}, + } +for i in ipairs (dice) do +local d1 = dice [i][1] +local i1 = dice [i][2] +local i2 = dice [i][3] +local i3 = dice [i][4] +local i4 = dice [i][5] +local i5 = dice [i][6] +local i6 = dice [i][7] +local nici = dice [i][8] + +minetest.register_node("my_game_pieces:dice_"..d1,{ + description = "Dice", + tiles = {"my_game_pieces_"..i1..".png", + "my_game_pieces_"..i2..".png", + "my_game_pieces_"..i3..".png", + "my_game_pieces_"..i4..".png", + "my_game_pieces_"..i5..".png", + "my_game_pieces_"..i6..".png"}, + drawtype = "normal", + paramtype = "light", + drop = "my_game_pieces:dice_3", + groups = {dig_immediate=3, not_in_creative_inventory=nici}, + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.set_node(pos,{name="my_game_pieces:roll"}) + end, + +}) +end +minetest.register_node("my_game_pieces:roll",{ + description = "Rolling", + tiles = { + {name="my_game_pieces_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="my_game_pieces_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="my_game_pieces_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="my_game_pieces_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="my_game_pieces_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="my_game_pieces_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + }, + drawtype = "normal", + paramtype = "light", + drop = "my_game_pieces:dice_3", + groups = {dig_immediate=3, not_in_creative_inventory=1}, + after_place_node = function(pos, placer, itemstack, pointed_thing) + minetest.after(2, function() + local ran = math.random(1,6) + minetest.set_node(pos,{name="my_game_pieces:dice_"..ran}) + end) + end, +}) + +local pieces = { + {"Red","red","^[colorize:red:120"}, + {"Green","green","^[colorize:green:120"}, + {"Yellow","yellow","^[colorize:yellow:120"}, + {"Blue","blue","^[colorize:blue:120"}, + {"Pink","pink","^[colorize:pink:120"}, + {"White","white","^[colorize:white:120"}, + {"Black","black","^[colorize:black:120"}, + } +for i in ipairs (pieces) do +local desc = pieces[i][1] +local item = pieces[i][2] +local col = pieces[i][3] + +minetest.register_node("my_game_pieces:"..item,{ + description = desc.." Player", + tiles = {"default_gravel.png"..col}, + drawtype = "nodebox", + paramtype = "light", + light_source = 11, + groups = {dig_immediate=3, not_in_creative_inventory=0}, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.125, -0.3125, -0.125, 0.125, 0.125, 0.125}, + {-0.1875, 0.125, -0.1875, 0.1875, 0.3125, 0.1875}, + } + } +}) +end + + + + + + + + + + + + + + + + + diff --git a/mods/myboardgames/my_game_pieces/mod.conf b/mods/myboardgames/my_game_pieces/mod.conf new file mode 100644 index 00000000..8e44392d --- /dev/null +++ b/mods/myboardgames/my_game_pieces/mod.conf @@ -0,0 +1 @@ +name = my_game_pieces diff --git a/mods/myboardgames/my_game_pieces/screenshot.png b/mods/myboardgames/my_game_pieces/screenshot.png new file mode 100644 index 00000000..4b498601 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/screenshot.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_1.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_1.png new file mode 100644 index 00000000..48d8efb6 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_1.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_2.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_2.png new file mode 100644 index 00000000..a3acf7ef Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_2.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_3.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_3.png new file mode 100644 index 00000000..534e635f Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_3.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_4.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_4.png new file mode 100644 index 00000000..5a5e2c23 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_4.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_5.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_5.png new file mode 100644 index 00000000..7143d6c1 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_5.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_6.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_6.png new file mode 100644 index 00000000..670f3780 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_6.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_ani.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_ani.png new file mode 100644 index 00000000..4805c7aa Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_ani.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s1.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s1.png new file mode 100644 index 00000000..ebd6cee5 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s1.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s2.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s2.png new file mode 100644 index 00000000..5470c78e Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s2.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s3.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s3.png new file mode 100644 index 00000000..0a5d72a9 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s3.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s4.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s4.png new file mode 100644 index 00000000..f3a7d3c2 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s4.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s5.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s5.png new file mode 100644 index 00000000..0eecd233 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s5.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s6.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s6.png new file mode 100644 index 00000000..174d7ec0 Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_s6.png differ diff --git a/mods/myboardgames/my_game_pieces/textures/my_game_pieces_sani.png b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_sani.png new file mode 100644 index 00000000..9f9c237f Binary files /dev/null and b/mods/myboardgames/my_game_pieces/textures/my_game_pieces_sani.png differ diff --git a/mods/myboardgames/mycanadiancheckers/depends.txt b/mods/myboardgames/mycanadiancheckers/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mycanadiancheckers/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mycanadiancheckers/init.lua b/mods/myboardgames/mycanadiancheckers/init.lua new file mode 100644 index 00000000..80ba5fac --- /dev/null +++ b/mods/myboardgames/mycanadiancheckers/init.lua @@ -0,0 +1,165 @@ +minetest.register_privilege("myboardgames", { + description = "Place board games", + give_to_singleplayer = true +}) + + +minetest.register_node("mycanadiancheckers:board", { + description = "Canadian Checkers", + inventory_image = "mycanadiancheckers_inv.png", + wield_image = "mycanadiancheckers_inv.png", + light_source = 5, + tiles = {"mycheckers_border_cbl.png","mycheckers_border.png","mycheckers_border_side.png","mycheckers_border_side.png","mycheckers_border_side.png","mycheckers_border_side.png"}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1}, + sounds = default.node_sound_stone_defaults(), + + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mycanadiancheckers").."/schems/mycanadiancheckers.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) + +local board = { + {"mycanadiancheckers:border" ,{"mycheckers_border.png"}}, + + {"mycanadiancheckers:borderb" ,{ +"mycheckers_border_bottom.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}}, + + {"mycanadiancheckers:bordercbl" ,{ +"mycheckers_border_cornerbl.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}}, + + {"mycanadiancheckers:borderocbr",{ +"mycheckers_border_cbr.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}} +, + + {"mycanadiancheckers:white" ,{"mycheckers_wboard.png"}}, + {"mycanadiancheckers:black" ,{"mycheckers_bboard.png"}}, + +} + +for i in ipairs (board) do +local item = board[i][1] +local img = board[i][2] + +minetest.register_node(item, { + description = item, + light_source = 5, + tiles = img, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 1,not_in_creative_inventory=1}, +}) +end + +local regp = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.1875, -0.3125, 0.3125}, + {-0.3125, -0.5, -0.1875, 0.3125, -0.3125, 0.1875}, + {-0.1875, -0.3125, -0.1875, 0.1875, -0.25, 0.1875}, + } + } +local crown = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.1875, -0.3125, 0.3125}, + {-0.3125, -0.5, -0.1875, 0.3125, -0.3125, 0.1875}, + {-0.3125, -0.25, -0.1875, 0.3125, -0.0625, 0.1875}, + {-0.1875, -0.25, -0.3125, 0.1875, -0.0625, 0.3125}, + {-0.1875, -0.3125, -0.1875, 0.1875, -0.25, 0.1875}, + {-0.1875, -0.0625, -0.1875, 0.1875, 0, 0.1875}, + } + } + +minetest.register_node("mycanadiancheckers:redp_c", { + description = "Red Crown", + light_source = 5, + tiles = {"default_acacia_wood.png"}, + drawtype = "nodebox", + paramtype = "light", + drop = "mycanadiancheckers:redp 2", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = crown, +}) +minetest.register_node("mycanadiancheckers:blackp_c", { + description = "Black Crown", + light_source = 5, + tiles = {"default_obsidian.png"}, + drawtype = "nodebox", + paramtype = "light", + drop = "mycanadiancheckers:blackp 2", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = crown, +}) +minetest.register_node("mycanadiancheckers:blackp", { + description = "Black Piece", + light_source = 5, + tiles = {"default_obsidian.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = regp, +after_place_node = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if nodeu.name == "mycanadiancheckers:blackp" and + node.name == "mycanadiancheckers:blackp" then + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "mycanadiancheckers:blackp_c"}) + minetest.set_node(pos,{name = "air"}) + elseif nodeu ~= "mycanadiancheckers:blackp" then + minetest.set_node(pos,{name="mycanadiancheckers:blackp"}) + end + +end +}) +minetest.register_node("mycanadiancheckers:redp", { + description = "Red Piece", + light_source = 5, + tiles = {"default_acacia_wood.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = regp, +after_place_node = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + + if nodeu.name == "mycanadiancheckers:redp" and + node.name == "mycanadiancheckers:redp" then + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "mycanadiancheckers:redp_c"}) + minetest.set_node(pos,{name = "air"}) + elseif nodeu ~= "mycanadiancheckers:redp" then + minetest.set_node(pos,{name="mycanadiancheckers:redp"}) + end + +end +}) diff --git a/mods/myboardgames/mycanadiancheckers/mod.conf b/mods/myboardgames/mycanadiancheckers/mod.conf new file mode 100644 index 00000000..09a1dfff --- /dev/null +++ b/mods/myboardgames/mycanadiancheckers/mod.conf @@ -0,0 +1 @@ +name = mycanadiancheckers diff --git a/mods/myboardgames/mycanadiancheckers/schems/mycanadiancheckers.mts b/mods/myboardgames/mycanadiancheckers/schems/mycanadiancheckers.mts new file mode 100644 index 00000000..d884e8a3 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/schems/mycanadiancheckers.mts differ diff --git a/mods/myboardgames/mycanadiancheckers/screenshot.png b/mods/myboardgames/mycanadiancheckers/screenshot.png new file mode 100644 index 00000000..e2a4d953 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/screenshot.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycanadiancheckers_inv.png b/mods/myboardgames/mycanadiancheckers/textures/mycanadiancheckers_inv.png new file mode 100644 index 00000000..c0d66a18 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycanadiancheckers_inv.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_bboard.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_bboard.png new file mode 100644 index 00000000..985ecac1 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_bboard.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_board_inven.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_board_inven.png new file mode 100644 index 00000000..0f79a63f Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_board_inven.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border.png new file mode 100644 index 00000000..35ec3d99 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_bottom.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_bottom.png new file mode 100644 index 00000000..ca633f0b Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_bottom.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cbl.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cbl.png new file mode 100644 index 00000000..e0a287cc Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cbl.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cbr.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cbr.png new file mode 100644 index 00000000..495b7462 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cbr.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cornerbl.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cornerbl.png new file mode 100644 index 00000000..9bca522a Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_cornerbl.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_ctl.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_ctl.png new file mode 100644 index 00000000..2b6189c6 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_ctl.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_ctr.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_ctr.png new file mode 100644 index 00000000..7e10e34a Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_ctr.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_side.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_side.png new file mode 100644 index 00000000..56c473ce Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_border_side.png differ diff --git a/mods/myboardgames/mycanadiancheckers/textures/mycheckers_wboard.png b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_wboard.png new file mode 100644 index 00000000..faf0ec13 Binary files /dev/null and b/mods/myboardgames/mycanadiancheckers/textures/mycheckers_wboard.png differ diff --git a/mods/myboardgames/mycheckers/depends.txt b/mods/myboardgames/mycheckers/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mycheckers/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mycheckers/init.lua b/mods/myboardgames/mycheckers/init.lua new file mode 100644 index 00000000..ab9a454c --- /dev/null +++ b/mods/myboardgames/mycheckers/init.lua @@ -0,0 +1,160 @@ + +minetest.register_node("mycheckers:board", { + description = "Checkers", + inventory_image = "mycheckers_inv.png", + wield_image = "mycheckers_inv.png", + light_source = 5, + tiles = {"mycheckers_border_cbl.png","mycheckers_border.png","mycheckers_border_side.png","mycheckers_border_side.png","mycheckers_border_side.png","mycheckers_border_side.png"}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1}, + sounds = default.node_sound_stone_defaults(), + + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mycheckers").."/schems/mycheckersboard.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) + +local board = { + {"mycheckers:border" ,{"mycheckers_border.png"}}, + + {"mycheckers:borderb" ,{ +"mycheckers_border_bottom.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}}, + + {"mycheckers:bordercbl" ,{ +"mycheckers_border_cornerbl.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}}, + + {"mycheckers:borderocbr",{ +"mycheckers_border_cbr.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}} +, + + {"mycheckers:white" ,{"mycheckers_wboard.png"}}, + {"mycheckers:black" ,{"mycheckers_bboard.png"}}, + +} + +for i in ipairs (board) do +local item = board[i][1] +local img = board[i][2] + +minetest.register_node(item, { + description = item, + light_source = 5, + tiles = img, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 1,not_in_creative_inventory=1}, +}) +end + +local regp = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.1875, -0.3125, 0.3125}, + {-0.3125, -0.5, -0.1875, 0.3125, -0.3125, 0.1875}, + {-0.1875, -0.3125, -0.1875, 0.1875, -0.25, 0.1875}, + } + } +local crown = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.1875, -0.3125, 0.3125}, + {-0.3125, -0.5, -0.1875, 0.3125, -0.3125, 0.1875}, + {-0.3125, -0.25, -0.1875, 0.3125, -0.0625, 0.1875}, + {-0.1875, -0.25, -0.3125, 0.1875, -0.0625, 0.3125}, + {-0.1875, -0.3125, -0.1875, 0.1875, -0.25, 0.1875}, + {-0.1875, -0.0625, -0.1875, 0.1875, 0, 0.1875}, + } + } + +minetest.register_node("mycheckers:redp_c", { + description = "Red Crown", + light_source = 5, + tiles = {"default_acacia_wood.png"}, + drawtype = "nodebox", + paramtype = "light", + drop = "mycheckers:redp 2", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = crown, +}) +minetest.register_node("mycheckers:blackp_c", { + description = "Black Crown", + light_source = 5, + tiles = {"default_obsidian.png"}, + drawtype = "nodebox", + paramtype = "light", + drop = "mycheckers:blackp 2", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = crown, +}) +minetest.register_node("mycheckers:blackp", { + description = "Black Piece", + light_source = 5, + tiles = {"default_obsidian.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = regp, +after_place_node = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if nodeu.name == "mycheckers:blackp" and + node.name == "mycheckers:blackp" then + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "mycheckers:blackp_c"}) + minetest.set_node(pos,{name = "air"}) + elseif nodeu ~= "mycheckers:blackp" then + minetest.set_node(pos,{name="mycheckers:blackp"}) + end + +end +}) +minetest.register_node("mycheckers:redp", { + description = "Red Piece", + light_source = 5, + tiles = {"default_acacia_wood.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = regp, +after_place_node = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + + if nodeu.name == "mycheckers:redp" and + node.name == "mycheckers:redp" then + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "mycheckers:redp_c"}) + minetest.set_node(pos,{name = "air"}) + elseif nodeu ~= "mycheckers:redp" then + minetest.set_node(pos,{name="mycheckers:redp"}) + end + +end +}) diff --git a/mods/myboardgames/mycheckers/mod.conf b/mods/myboardgames/mycheckers/mod.conf new file mode 100644 index 00000000..955eef21 --- /dev/null +++ b/mods/myboardgames/mycheckers/mod.conf @@ -0,0 +1 @@ +name = mycheckers diff --git a/mods/myboardgames/mycheckers/schems/mycheckersboard.mts b/mods/myboardgames/mycheckers/schems/mycheckersboard.mts new file mode 100644 index 00000000..454e27bd Binary files /dev/null and b/mods/myboardgames/mycheckers/schems/mycheckersboard.mts differ diff --git a/mods/myboardgames/mycheckers/screenshot.png b/mods/myboardgames/mycheckers/screenshot.png new file mode 100644 index 00000000..08546745 Binary files /dev/null and b/mods/myboardgames/mycheckers/screenshot.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_bboard.png b/mods/myboardgames/mycheckers/textures/mycheckers_bboard.png new file mode 100644 index 00000000..985ecac1 Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_bboard.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_board_inven.png b/mods/myboardgames/mycheckers/textures/mycheckers_board_inven.png new file mode 100644 index 00000000..0f79a63f Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_board_inven.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border.png b/mods/myboardgames/mycheckers/textures/mycheckers_border.png new file mode 100644 index 00000000..35ec3d99 Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border_bottom.png b/mods/myboardgames/mycheckers/textures/mycheckers_border_bottom.png new file mode 100644 index 00000000..ca633f0b Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border_bottom.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border_cbl.png b/mods/myboardgames/mycheckers/textures/mycheckers_border_cbl.png new file mode 100644 index 00000000..e0a287cc Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border_cbl.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border_cbr.png b/mods/myboardgames/mycheckers/textures/mycheckers_border_cbr.png new file mode 100644 index 00000000..495b7462 Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border_cbr.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border_cornerbl.png b/mods/myboardgames/mycheckers/textures/mycheckers_border_cornerbl.png new file mode 100644 index 00000000..9bca522a Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border_cornerbl.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border_ctl.png b/mods/myboardgames/mycheckers/textures/mycheckers_border_ctl.png new file mode 100644 index 00000000..2b6189c6 Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border_ctl.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border_ctr.png b/mods/myboardgames/mycheckers/textures/mycheckers_border_ctr.png new file mode 100644 index 00000000..7e10e34a Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border_ctr.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_border_side.png b/mods/myboardgames/mycheckers/textures/mycheckers_border_side.png new file mode 100644 index 00000000..56c473ce Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_border_side.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_inv.png b/mods/myboardgames/mycheckers/textures/mycheckers_inv.png new file mode 100644 index 00000000..1901281b Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_inv.png differ diff --git a/mods/myboardgames/mycheckers/textures/mycheckers_wboard.png b/mods/myboardgames/mycheckers/textures/mycheckers_wboard.png new file mode 100644 index 00000000..faf0ec13 Binary files /dev/null and b/mods/myboardgames/mycheckers/textures/mycheckers_wboard.png differ diff --git a/mods/myboardgames/mychess/board.lua b/mods/myboardgames/mychess/board.lua new file mode 100644 index 00000000..3d26791a --- /dev/null +++ b/mods/myboardgames/mychess/board.lua @@ -0,0 +1,185 @@ + +minetest.register_node("mychess:board", { + description = "Chesss", + inventory_image = "mychess_inv.png", + wield_image = "mychess_inv.png", + light_source = 5, + tiles = {"mychess_border_cbl.png","mychess_border.png","mychess_border_side.png","mychess_border_side.png","mychess_border_side.png","mychess_border_side.png"}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 3}, + sounds = default.node_sound_stone_defaults(), + + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mychess").."/schems/mychessboard.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) + + +--Board Border + +local board = { + {"mychess:border" ,{"mychess_border.png"}}, + + {"mychess:borderb" ,{ +"mychess_border_bottom.png", +"mychess_border.png", +"mychess_border_side.png", +"mychess_border_side.png", +"mychess_border_side.png", +"mychess_border_side.png"}}, + + {"mychess:bordercbl" ,{ +"mychess_border_cornerbl.png", +"mychess_border.png", +"mychess_border_side.png", +"mychess_border_side.png", +"mychess_border_side.png", +"mychess_border_side.png"}}, + + {"mychess:borderocbr",{ +"mychess_border_cbr.png", +"mychess_border.png", +"mychess_border_side.png", +"mychess_border_side.png", +"mychess_border_side.png", +"mychess_border_side.png"}} +, + + {"mychess:white" ,{"mychess_wboard.png"}}, + {"mychess:black" ,{"mychess_bboard.png"}}, + + {"mychess:whitet",{ +"mychess_white_t.png", +"mychess_wboard.png", +"mychess_wboard.png", +"mychess_wboard.png", +"mychess_wboard.png", +"mychess_wboard.png"}}, + + {"mychess:whitebl" ,{ +"mychess_white_bl.png", +"mychess_wboard.png", +"mychess_wboard.png", +"mychess_wboard.png", +"mychess_wboard.png", +"mychess_wboard.png"},}, + +} + +for i in ipairs (board) do +local item = board[i][1] +local img = board[i][2] + +minetest.register_node(item, { + description = item, + light_source = 5, + tiles = img, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 3,not_in_creative_inventory=1}, +}) +end + + +-- Punch on Turn------------------------------------------ + +local function update_node(pos, node) + minetest.set_node(pos, node) +end + +local function punch(pos) + local meta = minetest.get_meta(pos) + local state = meta:get_int("state") + local me = minetest.get_node(pos) + local tmp_node + local tmp_node2 + oben = {x=pos.x, y=pos.y, z=pos.z} + if state == 1 then + state = 0 + minetest.sound_play("mychess_ding", {pos = pos, gain = 0.3, max_hear_distance = 10}) + tmp_node = {name="mychess:turnwhite", param1=me.param1, param2=me.param2} + else + state = 1 + minetest.sound_play("mychess_ding", {pos = pos, gain = 0.3, max_hear_distance = 10}) + tmp_node = {name="mychess:turnblack", param1=me.param1, param2=me.param2} + end + update_node(pos, tmp_node) + meta:set_int("state", state) +end + +minetest.register_node("mychess:turnblack", { + light_source = 5, + tiles = {"mychess_bbutton.png"}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1, not_in_creative_inventory=1}, + on_punch = function(pos, node, clicker) + punch(pos) + end, + + +}) + +minetest.register_node("mychess:turnwhite", { + light_source = 5, + tiles = {"mychess_wbutton.png"}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1, not_in_creative_inventory=1}, + on_punch = function(pos, node, clicker) + punch(pos) + end, + + +}) + +minetest.register_node("mychess:stand", { + tiles = { + "mychess_beige.png", + "mychess_beige.png", + "mychess_beige.png", + "mychess_beige.png", + "mychess_beige.png", + "mychess_beige.png" + }, + drawtype = "nodebox", + paramtype = "light", + groups = {cracky = 1, not_in_creative_inventory=0}, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.375, 0.3125}, + {-0.25, -0.5, -0.25, 0.25, -0.3125, 0.25}, + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, + {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5}, + {-0.4375, 0.375, -0.4375, 0.4375, 0.5, 0.4375}, + {-0.1875, 0.3125, -0.1875, 0.1875, 0.5, 0.1875}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.375, 0.3125}, + {-0.25, -0.5, -0.25, 0.25, -0.3125, 0.25}, + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, + {-0.5, 0.4375, -0.5, 0.5, 0.5, 0.5}, + {-0.4375, 0.375, -0.4375, 0.4375, 0.5, 0.4375}, + {-0.1875, 0.3125, -0.1875, 0.1875, 0.5, 0.1875}, + } + } +}) + + + + + diff --git a/mods/myboardgames/mychess/depends.txt b/mods/myboardgames/mychess/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mychess/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mychess/init.lua b/mods/myboardgames/mychess/init.lua new file mode 100644 index 00000000..563b4e5c --- /dev/null +++ b/mods/myboardgames/mychess/init.lua @@ -0,0 +1,3 @@ +dofile(minetest.get_modpath("mychess").."/pieces.lua") +dofile(minetest.get_modpath("mychess").."/board.lua") +print("[myChess] Loaded!") diff --git a/mods/myboardgames/mychess/mod.conf b/mods/myboardgames/mychess/mod.conf new file mode 100644 index 00000000..f4df6e24 --- /dev/null +++ b/mods/myboardgames/mychess/mod.conf @@ -0,0 +1 @@ +name = mychess diff --git a/mods/myboardgames/mychess/pieces.lua b/mods/myboardgames/mychess/pieces.lua new file mode 100644 index 00000000..7ba8b5bf --- /dev/null +++ b/mods/myboardgames/mychess/pieces.lua @@ -0,0 +1,285 @@ +local king = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.375, 0.375, -0.375, 0.375}, + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.25, -0.5, -0.25, 0.25, -0.25, 0.25}, + {-0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875}, + } + } +local kings = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.375, 0.375, -0.375, 0.375}, + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.25, -0.5, -0.25, 0.25, -0.25, 0.25}, + {-0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875}, + + {-0.3125, -1.5, -0.3125, 0.3125, -1.4375, 0.3125}, + {-0.375, -1.4375, -0.375, 0.375, -1.3125, 0.375}, + {-0.3125, -1.3125, -0.3125, 0.3125, -1.25, 0.3125}, + {-0.0625, -1.5, -0.0625, 0.0625, 1.5, 0.0625}, + {-0.25, 1.1875, -0.0625, 0.25, 1.3125, 0.0625}, + {-0.1875, -1.5, -0.1875, 0.1875, 1, 0.1875}, + {-0.0625, 1.1875, -0.25, 0.0625, 1.3125, 0.25}, + } + } +local kingt = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.4375, 0.3125}, + {-0.375, -0.4375, -0.375, 0.375, -0.3125, 0.375}, + {-0.3125, -0.3125, -0.3125, 0.3125, -0.25, 0.3125}, + {-0.1875, -0.5, -0.1875, 0.1875, 0, 0.1875}, + {-0.0625, -0.5, -0.0625, 0.0625, 0.5, 0.0625}, + {-0.0625, 0.1875, -0.25, 0.0625, 0.3125, 0.25}, + {-0.25, 0.1875, -0.0625, 0.25, 0.3125, 0.0625}, + } + } +local kingts = { + type = "fixed", + fixed = { + {0, 0, 0, 0, 0, 0}, + } + } +local queen = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.375, 0.375, -0.375, 0.375}, + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.25, -0.5, -0.25, 0.25, -0.25, 0.25}, + {-0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875}, + } + } +local queens = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.375, 0.375, -0.375, 0.375}, + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.25, -0.5, -0.25, 0.25, -0.25, 0.25}, + {-0.1875, -0.5, -0.1875, 0.1875, 0.5, 0.1875}, + + {-0.3125, -1.5, -0.3125, 0.3125, -1.4375, 0.3125}, + {-0.375, -1.4375, -0.375, 0.375, -1.3125, 0.375}, + {-0.3125, -1.3125, -0.3125, 0.3125, -1.25, 0.3125}, + {-0.1875, -1.5, -0.1875, 0.1875, 1.0625, 0.1875}, + {-0.0625, 1.0625, -0.0625, 0.0625, 1.25, 0.0625}, + } + } +local queent = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.4375, 0.3125}, + {-0.375, -0.4375, -0.375, 0.375, -0.3125, 0.375}, + {-0.3125, -0.3125, -0.3125, 0.3125, -0.25, 0.3125}, + {-0.1875, -0.5, -0.1875, 0.1875, 0.0625, 0.1875}, + {-0.0625, 0.0625, -0.0625, 0.0625, 0.25, 0.0625}, + } + } +local queents = { + type = "fixed", + fixed = { + {0, 0, 0, 0, 0, 0}, + } + } +local knight = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.4375, 0.3125}, + {-0.25, -0.4375, -0.25, 0.25, -0.375, 0.25}, + {-0.1875, -0.375, -0.1875, 0.1875, -0.3125, 0.1875}, + {-0.25, -0.3125, -0.1875, 0.25, -0.25, 0.25}, + {-0.1875, -0.25, -0.125, 0.1875, -0.1875, 0.1875}, + {-0.1875, -0.1875, -0.0625, 0.1875, -0.125, 0.25}, + {-0.1875, -0.125, 0, 0.1875, -0.0625, 0.3125}, + {-0.1875, -0.0625, 0.0625, 0.1875, 0.0625, 0.4375}, + {-0.1875, 0.0625, 0.125, 0.1875, 0.5, 0.5}, + {-0.125, 0.125, -0.125, 0.125, 0.4375, 0.125}, + {-0.125, 0.125, -0.25, 0.125, 0.375, -0.125}, + {-0.125, 0.0625, -0.1875, 0.125, 0.125, 0}, + } + } +local pon = { + type = "fixed", + fixed = { + + {-0.25, -0.5, -0.25, 0.25, -0.4375, 0.25}, + {-0.1875, -0.5, -0.1875, 0.1875, -0.375, 0.1875}, + {-0.125, -0.5, -0.125, 0.125, -0.3125, 0.125}, + {-0.0625, -0.5, -0.0625, 0.0625, 0.0625, 0.0625}, + {-0.0625, -0.0625, -0.125, 0.0625, 0.0625, 0.125}, + {-0.125, -0.0625, -0.0625, 0.125, 0.0625, 0.0625}, +--[[ + {-0.3125, -0.5, -0.3125, 0.3125, -0.4375, 0.3125}, + {-0.25, -0.4375, -0.25, 0.25, -0.375, 0.25}, + {-0.1875, -0.375, -0.1875, 0.1875, -0.3125, 0.1875}, + {-0.125, -0.3125, -0.125, 0.125, 0.0625, 0.125}, + {-0.1875, 0.0625, -0.1875, 0.1875, 0.375, 0.1875}, +--]] + } + } +local bishop = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.375, 0.3125}, + {-0.25, -0.375, -0.25, 0.25, -0.25, 0.25}, + {-0.1875, -0.25, -0.1875, 0.1875, -0.125, 0.1875}, + {-0.125, -0.125, -0.125, 0.125, 0.1875, 0.125}, + {-0.1875, 0.1875, -0.1875, 0.1875, 0.375, 0.1875}, + {-0.125, 0.5625, -0.125, 0.125, 0.625, 0.125}, + {-0.1875, 0.375, -0.0625, 0.1875, 0.4375, 0.1875}, + {-0.1875, 0.4375, -0.1875, 0.1875, 0.5625, 0.1875}, + } + } +local rook = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.375, 0.3125}, + {-0.25, -0.375, -0.25, 0.25, -0.25, 0.25}, + {-0.1875, -0.25, -0.1875, 0.1875, -0.125, 0.1875}, + {-0.125, -0.125, -0.125, 0.125, 0.125, 0.125}, + {-0.1875, 0.125, -0.1875, 0.1875, 0.3125, 0.1875}, + {-0.1875, 0.3125, -0.1875, -0.125, 0.4375, -0.125}, + {0.125, 0.3125, -0.1875, 0.1875, 0.4375, -0.125}, + {0.125, 0.3125, 0.125, 0.1875, 0.4375, 0.1875}, + {-0.1875, 0.3125, 0.125, -0.125, 0.4375, 0.1875}, + } + } + + +local peices = { --item,desc,inv,img,nodebox + {"mychess:king_white","White King","mychess_king_w_inven.png","default_pine_wood.png",king,kings}, + {"mychess:king_top_white","","","default_pine_wood.png",kingt,kingts}, + {"mychess:king_black","Black King","mychess_king_b_inven.png","default_junglewood.png",king,kings}, + {"mychess:king_top_black","","","default_junglewood.png",kingt,kingts}, + + {"mychess:queen_white","White Queen","mychess_queen_w_inven.png","default_pine_wood.png",queen,queens}, + {"mychess:queen_top_white","","","default_pine_wood.png",queent,queents}, + {"mychess:queen_black","Black Queen","mychess_queen_b_inven.png","default_junglewood.png",queen,queens}, + {"mychess:queen_top_black","","","default_junglewood.png",queent,queents}, + } +for i in ipairs (peices) do +local item = peices[i][1] +local desc = peices[i][2] +local inv = peices[i][3] +local img = peices[i][4] +local nbox = peices[i][5] +local sbox = peices[i][6] + +minetest.register_node(item, { + description = desc, + inventory_image = inv, + light_source = 7, + tiles = {img.."^[transformR90"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {dig_immediate = 3, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + node_box = nbox, + selection_box = sbox, + + after_place_node = function(pos) + local node = minetest.get_node(pos) + if node.name == "mychess:king_white" then + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z},{name = "mychess:king_top_white"}) + elseif node.name == "mychess:king_black" then + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z},{name = "mychess:king_top_black"}) + elseif node.name == "mychess:queen_white" then + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z},{name = "mychess:queen_top_white"}) + elseif node.name == "mychess:queen_black" then + minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z},{name = "mychess:queen_top_black"}) + end + + end, + on_destruct = function(pos) + local pos2 = {x=pos.x,y=pos.y+1,z=pos.z} + local node = minetest.get_node(pos) + local node2 = minetest.get_node(pos2) + if node.name == "mychess:king_white" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + elseif node.name == "mychess:king_black" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + elseif node.name == "mychess:queen_white" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + elseif node.name == "mychess:queen_black" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + elseif node.name == "mychess:king_top_white" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + elseif node.name == "mychess:king_top_black" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + elseif node.name == "mychess:queen_top_white" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + elseif node.name == "mychess:queen_top_black" then + minetest.set_node({x=pos.x,y=pos.y+1,z=pos.z},{name="air"}) + end + end, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + if minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name ~= "air" then + minetest.chat_send_player( placer:get_player_name(), "Not enough vertical space to place it here!" ) + return + end + + return minetest.item_place(itemstack, placer, pointed_thing) + end +}) +end +local peices = { --item,desc,inv,img,nodebox + {"mychess:knight_white","White Knight","myknight_w_inven.png","default_pine_wood.png^[transformR90",knight}, + {"mychess:knight_black","Black Knight","myknight_b_inven.png","default_junglewood.png^[transformR90",knight}, + + {"mychess:pon_white","White Pon","mypon_w_inven.png","default_pine_wood.png^[transformR90",pon}, + {"mychess:pon_black","Black Pon","mypon_b_inven.png","default_junglewood.png^[transformR90",pon}, + + {"mychess:bishop_white","White Bishop","mybishop_w_inven.png","default_pine_wood.png^[transformR90",bishop}, + {"mychess:bishop_black","Black Bishop","mybishop_b_inven.png","default_junglewood.png^[transformR90",bishop}, + + {"mychess:rook_white","White Rook","myrook_w_inven.png","default_pine_wood.png^[transformR90",rook}, + {"mychess:rook_black","Black Rook","myrook_b_inven.png","default_junglewood.png^[transformR90",rook}, + } +for i in ipairs (peices) do +local item = peices[i][1] +local desc = peices[i][2] +local inv = peices[i][3] +local img = peices[i][4] +local nbox = peices[i][5] + +minetest.register_node(item, { + description = desc, +-- inventory_image = inv, + light_source = 7, + tiles = {img}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {dig_immediate = 3, not_in_creative_inventory=1}, + sounds = default.node_sound_stone_defaults(), + node_box = nbox, + selection_box = nbox, + + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + if minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z}).name ~= "air" then + minetest.chat_send_player( placer:get_player_name(), "Not enough vertical space to place it here!" ) + return + end + local node = minetest.get_node(pos) + local par1 = node.param2 + par2 = par1 + 2 + if par2 == 4 then + par2 = 0 + elseif par2 == 5 then + par2 = 1 + end + if node.name == "mychess:knight_black" then + minetest.set_node({pos},{name = "mychess:knight_black", param2 = par2}) + end + + return minetest.item_place(itemstack, placer, pointed_thing) + end +}) +end + + diff --git a/mods/myboardgames/mychess/schems/mychessboard.mts b/mods/myboardgames/mychess/schems/mychessboard.mts new file mode 100644 index 00000000..0c4889ce Binary files /dev/null and b/mods/myboardgames/mychess/schems/mychessboard.mts differ diff --git a/mods/myboardgames/mychess/screenshot.png b/mods/myboardgames/mychess/screenshot.png new file mode 100644 index 00000000..b0e39a79 Binary files /dev/null and b/mods/myboardgames/mychess/screenshot.png differ diff --git a/mods/myboardgames/mychess/sounds/mychess_ding.mp3 b/mods/myboardgames/mychess/sounds/mychess_ding.mp3 new file mode 100644 index 00000000..f18ee797 Binary files /dev/null and b/mods/myboardgames/mychess/sounds/mychess_ding.mp3 differ diff --git a/mods/myboardgames/mychess/textures/mychess_bboard.png b/mods/myboardgames/mychess/textures/mychess_bboard.png new file mode 100644 index 00000000..985ecac1 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_bboard.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_bbutton.png b/mods/myboardgames/mychess/textures/mychess_bbutton.png new file mode 100644 index 00000000..de3ae564 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_bbutton.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_beige.png b/mods/myboardgames/mychess/textures/mychess_beige.png new file mode 100644 index 00000000..14c7dfea Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_beige.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border.png b/mods/myboardgames/mychess/textures/mychess_border.png new file mode 100644 index 00000000..35ec3d99 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border_bottom.png b/mods/myboardgames/mychess/textures/mychess_border_bottom.png new file mode 100644 index 00000000..ca633f0b Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border_bottom.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border_cbl.png b/mods/myboardgames/mychess/textures/mychess_border_cbl.png new file mode 100644 index 00000000..e0a287cc Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border_cbl.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border_cbr.png b/mods/myboardgames/mychess/textures/mychess_border_cbr.png new file mode 100644 index 00000000..495b7462 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border_cbr.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border_cornerbl.png b/mods/myboardgames/mychess/textures/mychess_border_cornerbl.png new file mode 100644 index 00000000..9bca522a Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border_cornerbl.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border_ctl.png b/mods/myboardgames/mychess/textures/mychess_border_ctl.png new file mode 100644 index 00000000..2b6189c6 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border_ctl.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border_ctr.png b/mods/myboardgames/mychess/textures/mychess_border_ctr.png new file mode 100644 index 00000000..7e10e34a Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border_ctr.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_border_side.png b/mods/myboardgames/mychess/textures/mychess_border_side.png new file mode 100644 index 00000000..56c473ce Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_border_side.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_inv.png b/mods/myboardgames/mychess/textures/mychess_inv.png new file mode 100644 index 00000000..08b60d57 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_inv.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_king_b_inven.png b/mods/myboardgames/mychess/textures/mychess_king_b_inven.png new file mode 100644 index 00000000..d6695670 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_king_b_inven.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_king_w_inven.png b/mods/myboardgames/mychess/textures/mychess_king_w_inven.png new file mode 100644 index 00000000..9e43d812 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_king_w_inven.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_queen_b_inven.png b/mods/myboardgames/mychess/textures/mychess_queen_b_inven.png new file mode 100644 index 00000000..7ab47934 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_queen_b_inven.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_queen_w_inven.png b/mods/myboardgames/mychess/textures/mychess_queen_w_inven.png new file mode 100644 index 00000000..b850ced7 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_queen_w_inven.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_wboard.png b/mods/myboardgames/mychess/textures/mychess_wboard.png new file mode 100644 index 00000000..faf0ec13 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_wboard.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_wbutton.png b/mods/myboardgames/mychess/textures/mychess_wbutton.png new file mode 100644 index 00000000..b04afbc3 Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_wbutton.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_white_bl.png b/mods/myboardgames/mychess/textures/mychess_white_bl.png new file mode 100644 index 00000000..69d58eef Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_white_bl.png differ diff --git a/mods/myboardgames/mychess/textures/mychess_white_t.png b/mods/myboardgames/mychess/textures/mychess_white_t.png new file mode 100644 index 00000000..fe0a5bac Binary files /dev/null and b/mods/myboardgames/mychess/textures/mychess_white_t.png differ diff --git a/mods/myboardgames/myconnect4/init.lua b/mods/myboardgames/myconnect4/init.lua new file mode 100644 index 00000000..e2eeaf1f --- /dev/null +++ b/mods/myboardgames/myconnect4/init.lua @@ -0,0 +1,138 @@ + + +minetest.register_node("myconnect4:front",{ + description = "front", + tiles = {"default_sand.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=1,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, 0.375, 0.5, -0.375, 0.5}, + {-0.5, 0.375, 0.375, 0.5, 0.5, 0.5}, + {0.375, -0.5, 0.375, 0.5, 0.5, 0.5}, + {-0.5, -0.5, 0.375, -0.375, 0.5, 0.5}, + {-0.5, 0.25, 0.375, -0.25, 0.5, 0.5}, + {-0.5, -0.5, 0.375, -0.25, -0.25, 0.5}, + {0.25, 0.25, 0.375, 0.5, 0.5, 0.5}, + {0.25, -0.5, 0.375, 0.5, -0.25, 0.5}, + } + }, + selection_box = { + type = "fixed", + fixed = { + {0.5, 0.5, 0.5, 0.5, 0.5, 0.5}, + } + }, +}) +minetest.register_node("myconnect4:red",{ + description = "Red", + tiles = {"myconnect4_red.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3,dig_immediate=3,falling_node=1,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.3125, 0.375, 0.5, -0.5}, + {-0.5, -0.375, -0.3125, 0.5, 0.375, -0.5}, + } + } +}) +minetest.register_node("myconnect4:black",{ + description = "Black", + tiles = {"myconnect4_black.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3,dig_immediate=3,falling_node=1,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.3125, 0.375, 0.5, -0.5}, + {-0.5, -0.375, -0.3125, 0.5, 0.375, -0.5}, + } + } +}) +minetest.register_node("myconnect4:redrf",{ + description = "redrf", + tiles = {"myconnect4_red.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + drop = "myconnect4:red", + groups = {cracky=3,dig_immediate=3,falling_node=1,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.3125, 0.375, 0.5, -0.5}, + {-0.5, -0.375, -0.3125, 0.5, 0.375, -0.5}, + } + }, +after_destruct = function(pos, oldnode) + minetest.set_node(pos,{name="myconnect4:redrf",param2=oldnode.param2}) +end +}) +minetest.register_node("myconnect4:blackrf",{ + description = "blackrf", + tiles = {"myconnect4_black.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + drop = "myconnect4:black", + groups = {cracky=3,dig_immediate=3,falling_node=1,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.375, -0.5, -0.3125, 0.375, 0.5, -0.5}, + {-0.5, -0.375, -0.3125, 0.5, 0.375, -0.5}, + } + }, +after_destruct = function(pos, oldnode) + minetest.set_node(pos,{name="myconnect4:blackrf",param2=oldnode.param2}) +end +}) +minetest.register_node("myconnect4:back",{ + description = "back", + tiles = {"wool_grey.png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=1,falling_node=1,not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-1.125, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + }, +}) +minetest.register_node("myconnect4:reset",{ + description = "Connect 4", + inventory_image = "myconnect4_inv.png", + wield_image = "myconnect4_inv.png", + tiles = {"default_sandstone.png^myconnect4_reset.png"}, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=1}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("myconnect4").."/schems/myconnect4.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) diff --git a/mods/myboardgames/myconnect4/mod.conf b/mods/myboardgames/myconnect4/mod.conf new file mode 100644 index 00000000..754461d5 --- /dev/null +++ b/mods/myboardgames/myconnect4/mod.conf @@ -0,0 +1 @@ +name = myconnect4 diff --git a/mods/myboardgames/myconnect4/schems/myconnect4.mts b/mods/myboardgames/myconnect4/schems/myconnect4.mts new file mode 100644 index 00000000..5803d827 Binary files /dev/null and b/mods/myboardgames/myconnect4/schems/myconnect4.mts differ diff --git a/mods/myboardgames/myconnect4/screenshot.png b/mods/myboardgames/myconnect4/screenshot.png new file mode 100644 index 00000000..8676ac16 Binary files /dev/null and b/mods/myboardgames/myconnect4/screenshot.png differ diff --git a/mods/myboardgames/myconnect4/textures/myconnect4_black.png b/mods/myboardgames/myconnect4/textures/myconnect4_black.png new file mode 100644 index 00000000..11e3585a Binary files /dev/null and b/mods/myboardgames/myconnect4/textures/myconnect4_black.png differ diff --git a/mods/myboardgames/myconnect4/textures/myconnect4_inv.png b/mods/myboardgames/myconnect4/textures/myconnect4_inv.png new file mode 100644 index 00000000..a46b7608 Binary files /dev/null and b/mods/myboardgames/myconnect4/textures/myconnect4_inv.png differ diff --git a/mods/myboardgames/myconnect4/textures/myconnect4_red.png b/mods/myboardgames/myconnect4/textures/myconnect4_red.png new file mode 100644 index 00000000..5a3664a9 Binary files /dev/null and b/mods/myboardgames/myconnect4/textures/myconnect4_red.png differ diff --git a/mods/myboardgames/myconnect4/textures/myconnect4_reset.png b/mods/myboardgames/myconnect4/textures/myconnect4_reset.png new file mode 100644 index 00000000..18ad124f Binary files /dev/null and b/mods/myboardgames/myconnect4/textures/myconnect4_reset.png differ diff --git a/mods/myboardgames/mydiamondblock/init.lua b/mods/myboardgames/mydiamondblock/init.lua new file mode 100644 index 00000000..88a961a4 --- /dev/null +++ b/mods/myboardgames/mydiamondblock/init.lua @@ -0,0 +1,45 @@ +minetest.register_node("mydiamondblock:block",{ + description = "My Diamond Block", + inventory_image = "mydiamondblock_inv.png", + wield_image = "mydiamondblock_inv.png", + tiles = {"mydiamondblock.png"}, + drawtype = "normal", + paramtype = "light", + light_source = 8, + groups = {cracky = 1}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mydiamondblock").."/schems/mydiamondblock.mts" + minetest.place_schematic(pos,schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +for blues = 1,6 do +local blue = blues +minetest.register_node("mydiamondblock:blue"..blue,{ + description = "Blue "..blue, + inventory_image = "mydiamondblock_blue"..blue..".png", + tiles = {"mydiamondblock_blue"..blue..".png"}, + drawtype = "normal", + paramtype = "light", + light_source = 8, + groups = {cracky = 1,not_in_creative_inventory=1}, +}) +end +for browns = 1,4 do +local brown = browns +minetest.register_node("mydiamondblock:brown"..brown,{ + description = "Brown "..brown, + inventory_image = "mydiamondblock_brown"..brown..".png", + tiles = {"mydiamondblock_brown"..brown..".png"}, + drawtype = "normal", + paramtype = "light", + light_source = 8, + groups = {cracky = 1,not_in_creative_inventory=1}, +}) +end diff --git a/mods/myboardgames/mydiamondblock/mod.conf b/mods/myboardgames/mydiamondblock/mod.conf new file mode 100644 index 00000000..613fb5c7 --- /dev/null +++ b/mods/myboardgames/mydiamondblock/mod.conf @@ -0,0 +1 @@ +name = mydiamondblock diff --git a/mods/myboardgames/mydiamondblock/schems/mydiamondblock.mts b/mods/myboardgames/mydiamondblock/schems/mydiamondblock.mts new file mode 100644 index 00000000..cac05fdc Binary files /dev/null and b/mods/myboardgames/mydiamondblock/schems/mydiamondblock.mts differ diff --git a/mods/myboardgames/mydiamondblock/screenshot.png b/mods/myboardgames/mydiamondblock/screenshot.png new file mode 100644 index 00000000..76e9abff Binary files /dev/null and b/mods/myboardgames/mydiamondblock/screenshot.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock.png new file mode 100644 index 00000000..884c6af7 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue1.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue1.png new file mode 100644 index 00000000..a8e507b5 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue1.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue2.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue2.png new file mode 100644 index 00000000..ea83eb36 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue2.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue3.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue3.png new file mode 100644 index 00000000..bbf5e129 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue3.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue4.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue4.png new file mode 100644 index 00000000..afbfc678 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue4.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue5.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue5.png new file mode 100644 index 00000000..20c27010 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue5.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue6.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue6.png new file mode 100644 index 00000000..4c074826 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_blue6.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown1.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown1.png new file mode 100644 index 00000000..b833a45c Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown1.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown2.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown2.png new file mode 100644 index 00000000..bd89ab88 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown2.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown3.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown3.png new file mode 100644 index 00000000..e39ec64b Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown3.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown4.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown4.png new file mode 100644 index 00000000..7f502bad Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_brown4.png differ diff --git a/mods/myboardgames/mydiamondblock/textures/mydiamondblock_inv.png b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_inv.png new file mode 100644 index 00000000..104055d4 Binary files /dev/null and b/mods/myboardgames/mydiamondblock/textures/mydiamondblock_inv.png differ diff --git a/mods/myboardgames/mydraughts/depends.txt b/mods/myboardgames/mydraughts/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mydraughts/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mydraughts/init.lua b/mods/myboardgames/mydraughts/init.lua new file mode 100644 index 00000000..7cabc0c4 --- /dev/null +++ b/mods/myboardgames/mydraughts/init.lua @@ -0,0 +1,160 @@ + +minetest.register_node("mydraughts:board", { + description = "Draughts", + inventory_image = "mydraughts_inv.png", + wield_image = "mydraughts_inv.png", + light_source = 5, + tiles = {"mycheckers_border_cbl.png","mycheckers_border.png","mycheckers_border_side.png","mycheckers_border_side.png","mycheckers_border_side.png","mycheckers_border_side.png"}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1}, + sounds = default.node_sound_stone_defaults(), + + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mydraughts").."/schems/mydraughts.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) + +local board = { + {"mydraughts:border" ,{"mycheckers_border.png"}}, + + {"mydraughts:borderb" ,{ +"mycheckers_border_bottom.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}}, + + {"mydraughts:bordercbl" ,{ +"mycheckers_border_cornerbl.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}}, + + {"mydraughts:borderocbr",{ +"mycheckers_border_cbr.png", +"mycheckers_border.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png", +"mycheckers_border_side.png"}} +, + + {"mydraughts:white" ,{"mycheckers_wboard.png"}}, + {"mydraughts:black" ,{"mycheckers_bboard.png"}}, + +} + +for i in ipairs (board) do +local item = board[i][1] +local img = board[i][2] + +minetest.register_node(item, { + description = item, + light_source = 5, + tiles = img, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky = 1,not_in_creative_inventory=1}, +}) +end + +local regp = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.1875, -0.3125, 0.3125}, + {-0.3125, -0.5, -0.1875, 0.3125, -0.3125, 0.1875}, + {-0.1875, -0.3125, -0.1875, 0.1875, -0.25, 0.1875}, + } + } +local crown = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.3125, 0.1875, -0.3125, 0.3125}, + {-0.3125, -0.5, -0.1875, 0.3125, -0.3125, 0.1875}, + {-0.3125, -0.25, -0.1875, 0.3125, -0.0625, 0.1875}, + {-0.1875, -0.25, -0.3125, 0.1875, -0.0625, 0.3125}, + {-0.1875, -0.3125, -0.1875, 0.1875, -0.25, 0.1875}, + {-0.1875, -0.0625, -0.1875, 0.1875, 0, 0.1875}, + } + } + +minetest.register_node("mydraughts:redp_c", { + description = "Red Crown", + light_source = 5, + tiles = {"default_acacia_wood.png"}, + drawtype = "nodebox", + paramtype = "light", + drop = "mydraughts:redp 2", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = crown, +}) +minetest.register_node("mydraughts:blackp_c", { + description = "Black Crown", + light_source = 5, + tiles = {"default_obsidian.png"}, + drawtype = "nodebox", + paramtype = "light", + drop = "mydraughts:blackp 2", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = crown, +}) +minetest.register_node("mydraughts:blackp", { + description = "Black Piece", + light_source = 5, + tiles = {"default_obsidian.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = regp, +after_place_node = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if nodeu.name == "mydraughts:blackp" and + node.name == "mydraughts:blackp" then + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "mydraughts:blackp_c"}) + minetest.set_node(pos,{name = "air"}) + elseif nodeu ~= "mydraughts:blackp" then + minetest.set_node(pos,{name="mydraughts:blackp"}) + end + +end +}) +minetest.register_node("mydraughts:redp", { + description = "Red Piece", + light_source = 5, + tiles = {"default_acacia_wood.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + groups = {cracky = 1, dig_immediate=3,not_in_creative_inventory=1}, + node_box = regp, +after_place_node = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + + if nodeu.name == "mydraughts:redp" and + node.name == "mydraughts:redp" then + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "mydraughts:redp_c"}) + minetest.set_node(pos,{name = "air"}) + elseif nodeu ~= "mydraughts:redp" then + minetest.set_node(pos,{name="mydraughts:redp"}) + end + +end +}) diff --git a/mods/myboardgames/mydraughts/mod.conf b/mods/myboardgames/mydraughts/mod.conf new file mode 100644 index 00000000..ab751ae0 --- /dev/null +++ b/mods/myboardgames/mydraughts/mod.conf @@ -0,0 +1 @@ +name = mydraughts diff --git a/mods/myboardgames/mydraughts/schems/mydraughts.mts b/mods/myboardgames/mydraughts/schems/mydraughts.mts new file mode 100644 index 00000000..0a13161e Binary files /dev/null and b/mods/myboardgames/mydraughts/schems/mydraughts.mts differ diff --git a/mods/myboardgames/mydraughts/screenshot.png b/mods/myboardgames/mydraughts/screenshot.png new file mode 100644 index 00000000..78640dbb Binary files /dev/null and b/mods/myboardgames/mydraughts/screenshot.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_bboard.png b/mods/myboardgames/mydraughts/textures/mycheckers_bboard.png new file mode 100644 index 00000000..985ecac1 Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_bboard.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_board_inven.png b/mods/myboardgames/mydraughts/textures/mycheckers_board_inven.png new file mode 100644 index 00000000..0f79a63f Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_board_inven.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border.png b/mods/myboardgames/mydraughts/textures/mycheckers_border.png new file mode 100644 index 00000000..35ec3d99 Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border_bottom.png b/mods/myboardgames/mydraughts/textures/mycheckers_border_bottom.png new file mode 100644 index 00000000..ca633f0b Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border_bottom.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border_cbl.png b/mods/myboardgames/mydraughts/textures/mycheckers_border_cbl.png new file mode 100644 index 00000000..e0a287cc Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border_cbl.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border_cbr.png b/mods/myboardgames/mydraughts/textures/mycheckers_border_cbr.png new file mode 100644 index 00000000..495b7462 Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border_cbr.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border_cornerbl.png b/mods/myboardgames/mydraughts/textures/mycheckers_border_cornerbl.png new file mode 100644 index 00000000..9bca522a Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border_cornerbl.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border_ctl.png b/mods/myboardgames/mydraughts/textures/mycheckers_border_ctl.png new file mode 100644 index 00000000..2b6189c6 Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border_ctl.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border_ctr.png b/mods/myboardgames/mydraughts/textures/mycheckers_border_ctr.png new file mode 100644 index 00000000..7e10e34a Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border_ctr.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_border_side.png b/mods/myboardgames/mydraughts/textures/mycheckers_border_side.png new file mode 100644 index 00000000..56c473ce Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_border_side.png differ diff --git a/mods/myboardgames/mydraughts/textures/mycheckers_wboard.png b/mods/myboardgames/mydraughts/textures/mycheckers_wboard.png new file mode 100644 index 00000000..faf0ec13 Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mycheckers_wboard.png differ diff --git a/mods/myboardgames/mydraughts/textures/mydraughts_inv.png b/mods/myboardgames/mydraughts/textures/mydraughts_inv.png new file mode 100644 index 00000000..6e2ed09e Binary files /dev/null and b/mods/myboardgames/mydraughts/textures/mydraughts_inv.png differ diff --git a/mods/myboardgames/mygomoku/init.lua b/mods/myboardgames/mygomoku/init.lua new file mode 100644 index 00000000..7a227868 --- /dev/null +++ b/mods/myboardgames/mygomoku/init.lua @@ -0,0 +1,161 @@ +local board = { +{"cross","Cross"}, +{"crossdot","Cross Dot"}, +{"bordert","Border T"}, +{"borderc","Border C"}, +{"blank","Blank"}, +} +for i in ipairs(board) do +local itm = board[i][1] +local des = board[i][2] + +minetest.register_node("mygomoku:"..itm,{ + description = des, + tiles = { + "mygomoku_"..itm..".png", + "mygomoku_blank.png", + "mygomoku_blank.png", + "mygomoku_blank.png", + "mygomoku_blank.png", + "mygomoku_blank.png", + }, + paramtype2 = "facedir", + drop = "", + light_source = 5, + groups = {cracky=3, not_in_creative_inventory = 1}, +}) +end +minetest.register_node("mygomoku:placer",{ + description = "Gomoku", + inventory_image = "mygomoku_inv.png", + wield_image = "mygomoku_inv.png", + tiles = { + "mygomoku_restart.png", + "mygomoku_blank.png", + "mygomoku_blank.png", + "mygomoku_blank.png", + "mygomoku_blank.png", + "mygomoku_blank.png", + }, + paramtype2 = "facedir", + groups = {cracky=3}, + light_source = 5, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mygomoku").."/schems/mygomoku.mts" + minetest.place_schematic(pos,schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) + +minetest.register_alias("mygomoku:stone_brown","mygomoku:stone_black") +minetest.register_node("mygomoku:stone_black", { + description = "Black Go Stone", + tiles = { + "default_obsidian.png^[colorize:#000:100", + }, + drawtype = "nodebox", + paramtype = "light", + drop = "", + groups = {dig_immediate = 3,not_in_creative_inventory = 1}, + node_box = { + type = "fixed", + fixed = { + {-0.45, -0.425, -0.225, 0.45, -0.35, 0.225}, + {-0.225, -0.425, -0.45, 0.225,-0.35, 0.45}, + {-0.3375, -0.425, -0.3375, 0.3375, -0.35, 0.3375}, + {-0.225, -0.5, -0.225, 0.225, -0.275, 0.225}, + {-0.1125,-0.5, -0.3375, 0.1125, -0.275, 0.3375}, + {-0.3375,-0.5, -0.1125, 0.3375, -0.275, 0.1125}, + } + }, + buildable_to = true, + light_source = 8, +}) +minetest.register_node("mygomoku:stone_white", { + description = "White Go Stone", + tiles = { + "default_obsidian.png^[colorize:#fff:175", + }, + drawtype = "nodebox", + paramtype = "light", + drop = "", + groups = {dig_immediate = 3,not_in_creative_inventory = 1}, + node_box = { + type = "fixed", + fixed = { + {-0.45, -0.425, -0.225, 0.45, -0.35, 0.225}, + {-0.225, -0.425, -0.45, 0.225,-0.35, 0.45}, + {-0.3375, -0.425, -0.3375, 0.3375, -0.35, 0.3375}, + {-0.225, -0.5, -0.225, 0.225, -0.275, 0.225}, + {-0.1125,-0.5, -0.3375, 0.1125, -0.275, 0.3375}, + {-0.3375,-0.5, -0.1125, 0.3375, -0.275, 0.1125}, + } + }, + buildable_to = true, + light_source = 8, +}) +minetest.register_alias("mygomoku:stone_brown_rf","mygomoku:stone_black_rf") +minetest.register_node("mygomoku:stone_black_rf", { + description = "Black Go Stone rf", + tiles = { + "default_obsidian.png^[colorize:#000:100", + }, + drawtype = "nodebox", + paramtype = "light", + drop = "mygomoku:stone_brown", + groups = {dig_immediate = 3,not_in_creative_inventory = 1}, + node_box = { + type = "fixed", + fixed = { + {-0.45, -0.5, -0.225, 0.45, 0, 0.225}, + {-0.225, -0.5, -0.45, 0.225,0, 0.45}, + {-0.3375, -0.5, -0.3375, 0.3375, 0, 0.3375}, + {-0.225, -0.5, -0.225, 0.225, 0.1375, 0.225}, + {-0.1125,-0.5, -0.3375, 0.1125, 0.1375, 0.3375}, + {-0.3375,-0.5, -0.1125, 0.3375, 0.1375, 0.1125}, + } + }, + selection_box = { + type = "fixed", + fixed = {-0.45, -0.5, -0.45, 0.45, 0.1375, 0.45}, + }, + light_source = 5, + after_destruct = function(pos, oldnode) + minetest.set_node(pos,{name="mygomoku:stone_brown_rf",param2=oldnode.param2}) + end, +}) +minetest.register_node("mygomoku:stone_white_rf", { + description = "White Go Stone rf", + tiles = { + "default_obsidian.png^[colorize:#fff:175", + }, + drawtype = "nodebox", + paramtype = "light", + drop = "mygomoku:stone_white", + groups = {dig_immediate = 3,not_in_creative_inventory = 1}, + node_box = { + type = "fixed", + fixed = { + {-0.45, -0.5, -0.225, 0.45, 0, 0.225}, + {-0.225, -0.5, -0.45, 0.225,0, 0.45}, + {-0.3375, -0.5, -0.3375, 0.3375, 0, 0.3375}, + {-0.225, -0.5, -0.225, 0.225, 0.1375, 0.225}, + {-0.1125,-0.5, -0.3375, 0.1125, 0.1375, 0.3375}, + {-0.3375,-0.5, -0.1125, 0.3375, 0.1375, 0.1125}, + } + }, + selection_box = { + type = "fixed", + fixed = {-0.45, -0.5, -0.45, 0.45, 0.1375, 0.45}, + }, + light_source = 5, + after_destruct = function(pos, oldnode) + minetest.set_node(pos,{name="mygomoku:stone_white_rf",param2=oldnode.param2}) + end, +}) diff --git a/mods/myboardgames/mygomoku/mod.conf b/mods/myboardgames/mygomoku/mod.conf new file mode 100644 index 00000000..c35bb377 --- /dev/null +++ b/mods/myboardgames/mygomoku/mod.conf @@ -0,0 +1 @@ +name = mygomoku diff --git a/mods/myboardgames/mygomoku/schems/mygomoku.mts b/mods/myboardgames/mygomoku/schems/mygomoku.mts new file mode 100644 index 00000000..fe05c571 Binary files /dev/null and b/mods/myboardgames/mygomoku/schems/mygomoku.mts differ diff --git a/mods/myboardgames/mygomoku/screenshot.png b/mods/myboardgames/mygomoku/screenshot.png new file mode 100644 index 00000000..7e46a802 Binary files /dev/null and b/mods/myboardgames/mygomoku/screenshot.png differ diff --git a/mods/myboardgames/mygomoku/textures/mygomoku_blank.png b/mods/myboardgames/mygomoku/textures/mygomoku_blank.png new file mode 100644 index 00000000..3a2c3195 Binary files /dev/null and b/mods/myboardgames/mygomoku/textures/mygomoku_blank.png differ diff --git a/mods/myboardgames/mygomoku/textures/mygomoku_borderc.png b/mods/myboardgames/mygomoku/textures/mygomoku_borderc.png new file mode 100644 index 00000000..09a6455e Binary files /dev/null and b/mods/myboardgames/mygomoku/textures/mygomoku_borderc.png differ diff --git a/mods/myboardgames/mygomoku/textures/mygomoku_bordert.png b/mods/myboardgames/mygomoku/textures/mygomoku_bordert.png new file mode 100644 index 00000000..e546d2c1 Binary files /dev/null and b/mods/myboardgames/mygomoku/textures/mygomoku_bordert.png differ diff --git a/mods/myboardgames/mygomoku/textures/mygomoku_cross.png b/mods/myboardgames/mygomoku/textures/mygomoku_cross.png new file mode 100644 index 00000000..3dcbb462 Binary files /dev/null and b/mods/myboardgames/mygomoku/textures/mygomoku_cross.png differ diff --git a/mods/myboardgames/mygomoku/textures/mygomoku_crossdot.png b/mods/myboardgames/mygomoku/textures/mygomoku_crossdot.png new file mode 100644 index 00000000..33634ab4 Binary files /dev/null and b/mods/myboardgames/mygomoku/textures/mygomoku_crossdot.png differ diff --git a/mods/myboardgames/mygomoku/textures/mygomoku_inv.png b/mods/myboardgames/mygomoku/textures/mygomoku_inv.png new file mode 100644 index 00000000..844f2918 Binary files /dev/null and b/mods/myboardgames/mygomoku/textures/mygomoku_inv.png differ diff --git a/mods/myboardgames/mygomoku/textures/mygomoku_restart.png b/mods/myboardgames/mygomoku/textures/mygomoku_restart.png new file mode 100644 index 00000000..cf4ef93e Binary files /dev/null and b/mods/myboardgames/mygomoku/textures/mygomoku_restart.png differ diff --git a/mods/myboardgames/mylittle_bg/init.lua b/mods/myboardgames/mylittle_bg/init.lua new file mode 100644 index 00000000..17ebae41 --- /dev/null +++ b/mods/myboardgames/mylittle_bg/init.lua @@ -0,0 +1,140 @@ +local dice = { + {"mylittle_bg:1",{"mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png"},"1"}, + {"mylittle_bg:2",{"mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png"},"2"}, + {"mylittle_bg:3",{"mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png"},"3"}, + {"mylittle_bg:4",{"mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png"},"4"}, + {"mylittle_bg:5",{"mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png"},"5"}, + {"mylittle_bg:6",{"mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png"},"6"}, + } +for i in ipairs (dice) do +local d1 = dice [i][1] +local d2 = dice [i][2] +local d3 = dice [i][3] + +minetest.register_node(d1,{ + description = d3, + tiles = d2, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 3, not_in_creative_inventory=1}, + +on_punch = function(pos, node, puncher, pointed_thing) + local timer = minetest.get_node_timer(pos) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mylittle_bg:roll"}) + timer:start(2) +end, + +}) +end +minetest.register_node("mylittle_bg:roll",{ + description = "roll", + tiles = { + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + }, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 3, not_in_creative_inventory=1}, + +on_timer = function(pos, elapsed) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mylittle_bg:"..ran}) +end +}) +local pieces = { + {"Red","red","^[colorize:red:120"}, + {"Green","green","^[colorize:green:120"}, + {"Yellow","yellow","^[colorize:yellow:120"}, + {"Blue","blue","^[colorize:blue:120"}, + } +for i in ipairs (pieces) do +local desc = pieces[i][1] +local item = pieces[i][2] +local col = pieces[i][3] + +minetest.register_node("mylittle_bg:"..item,{ + description = desc.." Player", + tiles = {"default_gravel.png"..col}, + drawtype = "nodebox", + paramtype = "light", + light_source = 11, + groups = {cracky = 1, dig_immediate=3, not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.125, -0.3125, -0.125, 0.125, 0.125, 0.125}, + {-0.1875, 0.125, -0.1875, 0.1875, 0.3125, 0.1875}, + } + } +}) +end +minetest.register_node("mylittle_bg:board",{ + description = "Little Board Game", + inventory_image = "mylittle_bg_inv.png", + wield_image = "mylittle_bg_inv.png", + tiles = {"mylittle_bg_inv.png"}, + drawtype = "normal", + paramtype = "light", + light_source = 8, + groups = {cracky = 1}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mylittle_bg").."/schems/my_little_bg.mts" + minetest.place_schematic({x=pos.x,y=pos.y-2,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +local signs = { + {"1","red","^[colorize:red:120"}, + {"2","green","^[colorize:green:120"}, + {"3","yellow","^[colorize:yellow:120"}, + {"4","blue","^[colorize:blue:120"}, + } +for i in ipairs (signs) do +local desc = signs[i][1] +local item = signs[i][2] +local col = signs[i][3] + +minetest.register_node("mylittle_bg:sign"..desc,{ + description = "sign"..desc, + tiles = {"mylittle_bg_sign"..desc..".png"}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + light_source = 11, + groups = {cracky = 1, not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.4375, -0.375, 0.4375, 0.4375, 0.3125, 0.5}, + } + } +}) +end + + + + + + + + + + + + + + + + diff --git a/mods/myboardgames/mylittle_bg/mod.conf b/mods/myboardgames/mylittle_bg/mod.conf new file mode 100644 index 00000000..d66ea28a --- /dev/null +++ b/mods/myboardgames/mylittle_bg/mod.conf @@ -0,0 +1 @@ +name = mylittle_bg diff --git a/mods/myboardgames/mylittle_bg/schems/my_little_bg.mts b/mods/myboardgames/mylittle_bg/schems/my_little_bg.mts new file mode 100644 index 00000000..3f3765ec Binary files /dev/null and b/mods/myboardgames/mylittle_bg/schems/my_little_bg.mts differ diff --git a/mods/myboardgames/mylittle_bg/screenshot.png b/mods/myboardgames/mylittle_bg/screenshot.png new file mode 100644 index 00000000..57c17bd1 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/screenshot.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_1.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_1.png new file mode 100644 index 00000000..48d8efb6 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_1.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_2.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_2.png new file mode 100644 index 00000000..a3acf7ef Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_2.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_3.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_3.png new file mode 100644 index 00000000..534e635f Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_3.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_4.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_4.png new file mode 100644 index 00000000..5a5e2c23 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_4.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_5.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_5.png new file mode 100644 index 00000000..7143d6c1 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_5.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_6.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_6.png new file mode 100644 index 00000000..670f3780 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_6.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_ani.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_ani.png new file mode 100644 index 00000000..4805c7aa Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_ani.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_inv.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_inv.png new file mode 100644 index 00000000..57b8a2bf Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_inv.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_inven.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_inven.png new file mode 100644 index 00000000..36e81d90 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_inven.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign1.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign1.png new file mode 100644 index 00000000..6eba5f21 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign1.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign2.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign2.png new file mode 100644 index 00000000..0bf9415f Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign2.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign3.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign3.png new file mode 100644 index 00000000..9d20551d Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign3.png differ diff --git a/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign4.png b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign4.png new file mode 100644 index 00000000..68569440 Binary files /dev/null and b/mods/myboardgames/mylittle_bg/textures/mylittle_bg_sign4.png differ diff --git a/mods/myboardgames/mymazes/init.lua b/mods/myboardgames/mymazes/init.lua new file mode 100644 index 00000000..f6c830af --- /dev/null +++ b/mods/myboardgames/mymazes/init.lua @@ -0,0 +1,42 @@ +minetest.register_node("mymazes:block1",{ + description = "Maze 1", + inventory_image = "mymazes_1.png", + wield_image = "mymazes_1.png", + tiles = {"mymazes_1.png"}, + drawtype = "normal", + paramtype = "light", + light_source = 8, + groups = {cracky = 1}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mymazes").."/schems/mymaze1.mts" + minetest.place_schematic(pos,schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +minetest.register_node("mymazes:block2",{ + description = "Maze 2", + inventory_image = "mymazes_2.png", + wield_image = "mymazes_2.png", + tiles = {"mymazes_2.png"}, + drawtype = "normal", + paramtype = "light", + light_source = 8, + groups = {cracky = 1}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mymazes").."/schems/mymaze2.mts" + minetest.place_schematic(pos,schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) diff --git a/mods/myboardgames/mymazes/mod.conf b/mods/myboardgames/mymazes/mod.conf new file mode 100644 index 00000000..3b6619f9 --- /dev/null +++ b/mods/myboardgames/mymazes/mod.conf @@ -0,0 +1 @@ +name = mymazes diff --git a/mods/myboardgames/mymazes/schems/mymaze1.mts b/mods/myboardgames/mymazes/schems/mymaze1.mts new file mode 100644 index 00000000..9b300880 Binary files /dev/null and b/mods/myboardgames/mymazes/schems/mymaze1.mts differ diff --git a/mods/myboardgames/mymazes/schems/mymaze2.mts b/mods/myboardgames/mymazes/schems/mymaze2.mts new file mode 100644 index 00000000..64390811 Binary files /dev/null and b/mods/myboardgames/mymazes/schems/mymaze2.mts differ diff --git a/mods/myboardgames/mymazes/screenshot.png b/mods/myboardgames/mymazes/screenshot.png new file mode 100644 index 00000000..5d0193d4 Binary files /dev/null and b/mods/myboardgames/mymazes/screenshot.png differ diff --git a/mods/myboardgames/mymazes/textures/mymazes_1.png b/mods/myboardgames/mymazes/textures/mymazes_1.png new file mode 100644 index 00000000..1f7aada0 Binary files /dev/null and b/mods/myboardgames/mymazes/textures/mymazes_1.png differ diff --git a/mods/myboardgames/mymazes/textures/mymazes_2.png b/mods/myboardgames/mymazes/textures/mymazes_2.png new file mode 100644 index 00000000..feef7587 Binary files /dev/null and b/mods/myboardgames/mymazes/textures/mymazes_2.png differ diff --git a/mods/myboardgames/mypachisi/depends.txt b/mods/myboardgames/mypachisi/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mypachisi/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mypachisi/dice.lua b/mods/myboardgames/mypachisi/dice.lua new file mode 100644 index 00000000..6c6e4994 --- /dev/null +++ b/mods/myboardgames/mypachisi/dice.lua @@ -0,0 +1,48 @@ +local dice = { + {"mypachisi:1",{"mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png"},"1"}, + {"mypachisi:2",{"mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png"},"2"}, + {"mypachisi:3",{"mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png"},"3"}, + {"mypachisi:4",{"mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png"},"4"}, + {"mypachisi:5",{"mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png"},"5"}, + {"mypachisi:6",{"mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png"},"6"}, + } +for i in ipairs (dice) do +local d1 = dice [i][1] +local d2 = dice [i][2] +local d3 = dice [i][3] + +minetest.register_node(d1,{ + description = d3, + tiles = d2, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1, not_in_creative_inventory=1}, + +on_punch = function(pos, node, puncher, pointed_thing) + local timer = minetest.get_node_timer(pos) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mypachisi:roll"}) + timer:start(2) +end, + +}) +end +minetest.register_node("mypachisi:roll",{ + description = "roll", + tiles = { + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + }, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 3, not_in_creative_inventory=1}, + +on_timer = function(pos, elapsed) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mypachisi:"..ran}) +end +}) diff --git a/mods/myboardgames/mypachisi/init.lua b/mods/myboardgames/mypachisi/init.lua new file mode 100644 index 00000000..080fe6eb --- /dev/null +++ b/mods/myboardgames/mypachisi/init.lua @@ -0,0 +1,82 @@ +local dots = { + {"Red","red","mypachisi_b3.png^mypachisi_r.png"}, + {"Blue","blue","mypachisi_b3.png^mypachisi_b.png"}, + {"Green","green","mypachisi_b3.png^mypachisi_g.png"}, + {"Orange","orange","mypachisi_b3.png^mypachisi_o.png"}, + {"Base","base","mypachisi_b1.png^mypachisi_p.png"}, + {"Base X","basex","mypachisi_b1.png^mypachisi_p.png^mypachisi_x.png"}, + {"Main","main","mypachisi_b2.png"}, + {"Main 2","main2","mypachisi_b4.png"}, + {"Main 3","main3","mypachisi_b3.png"}, + } +for i in ipairs(dots) do +local desc = dots[i][1] +local col = dots[i][2] +local img = dots[i][3] + +minetest.register_node("mypachisi:dot_"..col,{ + description = desc.." Dot", + tiles = {img}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1,not_in_creative_inventory=1} +}) + +end +local pieces = { + {"Red","red","^[colorize:red:120"}, + {"Green","green","^[colorize:green:120"}, + {"Yellow","yellow","^[colorize:yellow:120"}, + {"Blue","blue","^[colorize:blue:120"}, + } +for i in ipairs (pieces) do +local desc = pieces[i][1] +local item = pieces[i][2] +local col = pieces[i][3] + +minetest.register_node("mypachisi:"..item,{ + description = desc.." Player", + tiles = {"default_gravel.png"..col}, + drawtype = "nodebox", + paramtype = "light", + light_source = 11, + groups = {cracky = 1, dig_immediate=3, not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.125, -0.3125, -0.125, 0.125, 0.125, 0.125}, + {-0.1875, 0.125, -0.1875, 0.1875, 0.3125, 0.1875}, + } + } +}) +end +minetest.register_node("mypachisi:placer",{ + description = "Pachisi", + inventory_image = "mypachisi_inv.png", + wield_image = "mypachisi_inv.png", + tiles = { + "mypachisi_b2.png^mytrouble_o.png", + "mypachisi_b2.png", + "mypachisi_b2.png", + "mypachisi_b2.png", + "mypachisi_b2.png", + "mypachisi_b2.png", + }, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mypachisi").."/schems/mypachisi.mts" + minetest.place_schematic(pos,schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +dofile(minetest.get_modpath("mypachisi").."/dice.lua") diff --git a/mods/myboardgames/mypachisi/mod.conf b/mods/myboardgames/mypachisi/mod.conf new file mode 100644 index 00000000..073a0a8e --- /dev/null +++ b/mods/myboardgames/mypachisi/mod.conf @@ -0,0 +1 @@ +name = mypachisi diff --git a/mods/myboardgames/mypachisi/schems/mypachisi.mts b/mods/myboardgames/mypachisi/schems/mypachisi.mts new file mode 100644 index 00000000..314c0af7 Binary files /dev/null and b/mods/myboardgames/mypachisi/schems/mypachisi.mts differ diff --git a/mods/myboardgames/mypachisi/screenshot.png b/mods/myboardgames/mypachisi/screenshot.png new file mode 100644 index 00000000..4b1fcc65 Binary files /dev/null and b/mods/myboardgames/mypachisi/screenshot.png differ diff --git a/mods/myboardgames/mypachisi/textures/mylittle_bg_1.png b/mods/myboardgames/mypachisi/textures/mylittle_bg_1.png new file mode 100644 index 00000000..48d8efb6 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mylittle_bg_1.png differ diff --git a/mods/myboardgames/mypachisi/textures/mylittle_bg_2.png b/mods/myboardgames/mypachisi/textures/mylittle_bg_2.png new file mode 100644 index 00000000..a3acf7ef Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mylittle_bg_2.png differ diff --git a/mods/myboardgames/mypachisi/textures/mylittle_bg_3.png b/mods/myboardgames/mypachisi/textures/mylittle_bg_3.png new file mode 100644 index 00000000..534e635f Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mylittle_bg_3.png differ diff --git a/mods/myboardgames/mypachisi/textures/mylittle_bg_4.png b/mods/myboardgames/mypachisi/textures/mylittle_bg_4.png new file mode 100644 index 00000000..5a5e2c23 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mylittle_bg_4.png differ diff --git a/mods/myboardgames/mypachisi/textures/mylittle_bg_5.png b/mods/myboardgames/mypachisi/textures/mylittle_bg_5.png new file mode 100644 index 00000000..7143d6c1 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mylittle_bg_5.png differ diff --git a/mods/myboardgames/mypachisi/textures/mylittle_bg_6.png b/mods/myboardgames/mypachisi/textures/mylittle_bg_6.png new file mode 100644 index 00000000..670f3780 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mylittle_bg_6.png differ diff --git a/mods/myboardgames/mypachisi/textures/mylittle_bg_ani.png b/mods/myboardgames/mypachisi/textures/mylittle_bg_ani.png new file mode 100644 index 00000000..4805c7aa Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mylittle_bg_ani.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_b.png b/mods/myboardgames/mypachisi/textures/mypachisi_b.png new file mode 100644 index 00000000..7cf1b31d Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_b.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_b1.png b/mods/myboardgames/mypachisi/textures/mypachisi_b1.png new file mode 100644 index 00000000..aadf0ebf Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_b1.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_b2.png b/mods/myboardgames/mypachisi/textures/mypachisi_b2.png new file mode 100644 index 00000000..0d10a7e6 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_b2.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_b3.png b/mods/myboardgames/mypachisi/textures/mypachisi_b3.png new file mode 100644 index 00000000..2058f379 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_b3.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_b4.png b/mods/myboardgames/mypachisi/textures/mypachisi_b4.png new file mode 100644 index 00000000..392b844c Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_b4.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_g.png b/mods/myboardgames/mypachisi/textures/mypachisi_g.png new file mode 100644 index 00000000..06fe1d23 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_g.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_inv.png b/mods/myboardgames/mypachisi/textures/mypachisi_inv.png new file mode 100644 index 00000000..536c15a4 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_inv.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_o.png b/mods/myboardgames/mypachisi/textures/mypachisi_o.png new file mode 100644 index 00000000..57738b0e Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_o.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_p.png b/mods/myboardgames/mypachisi/textures/mypachisi_p.png new file mode 100644 index 00000000..68f0cd35 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_p.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_r.png b/mods/myboardgames/mypachisi/textures/mypachisi_r.png new file mode 100644 index 00000000..d2bbd864 Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_r.png differ diff --git a/mods/myboardgames/mypachisi/textures/mypachisi_x.png b/mods/myboardgames/mypachisi/textures/mypachisi_x.png new file mode 100644 index 00000000..0bef1f3c Binary files /dev/null and b/mods/myboardgames/mypachisi/textures/mypachisi_x.png differ diff --git a/mods/myboardgames/mypirinola/init.lua b/mods/myboardgames/mypirinola/init.lua new file mode 100644 index 00000000..1a112fe1 --- /dev/null +++ b/mods/myboardgames/mypirinola/init.lua @@ -0,0 +1,61 @@ +local cbox = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + } + } + +local piri = { +{"Side 1","1","1"}, +{"Side 2","2","1"}, +{"Side 3","3","1"}, +{"Side 4","4","1"}, +{"Side 5","5","1"}, +{"Side 6","6","1"}, +} +for i in ipairs(piri) do +local des = piri[i][1] +local num = piri[i][2] +local nic = piri[i][3] + +minetest.register_node("mypirinola:piri_"..num, { + description = "Pirinola "..des, + drawtype = "mesh", + mesh = "mypirinola_oct.obj", + tiles = {"mypirinola_img_"..num..".png"}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mypirinola:piri_spin", + groups = {choppy=2, dig_immediate=3, not_in_creative_inventory=nic}, + --sounds = default.node_sound_wood_defaults(), + --on_place = minetest.rotate_node, + collision_box = cbox, + selection_box = cbox, +}) +end +minetest.register_node("mypirinola:piri_spin", { + description = "Pirinola", + inventory_image = "mypirinola_inv.png", + wield_image = "mypirinola_inv.png", + drawtype = "mesh", + mesh = "mypirinola_oct.obj", + tiles = { + {name="mypirinola_img_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.2}} + }, + paramtype = "light", + paramtype2 = "facedir", + groups = {choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=0}, + --sounds = default.node_sound_wood_defaults(), + collision_box = cbox, + selection_box = cbox, + after_place_node = function(pos, placer, itemstack, pointed_thing) + local ran = math.random(1,6) + local parn = {5,7,9,11,12,14,16,18} + local par2 = parn[ math.random( #parn ) ] + minetest.after(3, function() + minetest.set_node(pos,{name="mypirinola:piri_"..ran, param2=par2}) + end) + end, +}) + + diff --git a/mods/myboardgames/mypirinola/mod.conf b/mods/myboardgames/mypirinola/mod.conf new file mode 100644 index 00000000..bb002598 --- /dev/null +++ b/mods/myboardgames/mypirinola/mod.conf @@ -0,0 +1 @@ +name = mypirinola diff --git a/mods/myboardgames/mypirinola/models/mypirinola_oct.obj b/mods/myboardgames/mypirinola/models/mypirinola_oct.obj new file mode 100644 index 00000000..a72263fc --- /dev/null +++ b/mods/myboardgames/mypirinola/models/mypirinola_oct.obj @@ -0,0 +1,145 @@ +# Blender v2.76 (sub 1) OBJ File: 'dodad.blend' +# www.blender.org +o Cylinder +v -0.000000 -0.448177 -0.216109 +v 0.000000 0.500000 -0.500000 +v 0.187156 -0.448177 -0.108055 +v 0.433013 0.500000 -0.250000 +v 0.187156 -0.448177 0.108055 +v 0.433013 0.500000 0.250000 +v -0.000000 -0.448177 0.216109 +v -0.000000 0.500000 0.500000 +v -0.187156 -0.448177 0.108055 +v -0.433013 0.500000 0.250000 +v -0.187156 -0.448177 -0.108055 +v -0.433013 0.500000 -0.250000 +v 0.000000 -0.260870 -0.500000 +v 0.433013 -0.260870 -0.250000 +v 0.433013 -0.260870 0.250000 +v -0.000000 -0.260870 0.500000 +v -0.433013 -0.260870 0.250000 +v -0.433013 -0.260870 -0.250000 +v -0.000000 -0.501317 0.000000 +v -0.105690 0.500000 0.061020 +v -0.000000 0.500000 0.122041 +v 0.105690 0.500000 0.061020 +v -0.000000 0.500000 -0.122041 +v 0.105690 0.500000 -0.061020 +v -0.105690 0.500000 -0.061020 +v -0.000000 1.000000 -0.122041 +v -0.105690 1.000000 -0.061020 +v -0.105690 1.000000 0.061020 +v -0.000000 1.000000 0.122041 +v 0.105690 1.000000 0.061020 +v 0.105690 1.000000 -0.061020 +vt 0.320807 0.211545 +vt 0.676194 0.211545 +vt 0.676193 0.366231 +vt 0.320807 0.366231 +vt 0.676193 0.520916 +vt 0.320806 0.520916 +vt 0.676193 0.675602 +vt 0.320806 0.675602 +vt 0.676193 0.830288 +vt 0.320806 0.830288 +vt 0.676257 0.522842 +vt 0.833589 0.444535 +vt 0.833589 0.562922 +vt 0.795187 0.582035 +vt 0.320807 0.056860 +vt 0.676194 0.056859 +vt 0.676193 0.984973 +vt 0.320806 0.984973 +vt 0.713456 0.234236 +vt 0.713456 0.175605 +vt 0.992099 0.175605 +vt 0.992100 0.234235 +vt 0.150411 0.543590 +vt 0.154115 0.443727 +vt 0.312831 0.523594 +vt 0.210658 0.570760 +vt 0.311957 0.682021 +vt 0.213487 0.629324 +vt 0.092993 0.574984 +vt -0.005476 0.522288 +vt 0.095822 0.633548 +vt -0.006351 0.680714 +vt 0.156069 0.660718 +vt 0.152365 0.760581 +vt 0.713456 0.116974 +vt 0.713456 0.058343 +vt 0.992099 0.058343 +vt 0.992099 0.116974 +vt 0.713456 0.351497 +vt 0.713456 0.292866 +vt 0.992100 0.292866 +vt 0.992100 0.351497 +vt 0.940412 0.366524 +vt 0.975430 0.383954 +vt 0.975430 0.418812 +vt 0.940412 0.436241 +vt 0.905394 0.418812 +vt 0.905394 0.383954 +vt 0.990920 0.522841 +vt 0.990920 0.679454 +vt 0.871990 0.620261 +vt 0.871990 0.582035 +vt 0.833589 0.757760 +vt 0.676257 0.679454 +vt 0.795187 0.620261 +vt 0.833589 0.639374 +vt 0.153240 0.602154 +vt 0.713456 -0.000288 +vt 0.992099 -0.000288 +vn 0.500000 0.000000 -0.866000 +vn 1.000000 0.000000 0.000000 +vn 0.500000 0.000000 0.866000 +vn -0.500000 0.000000 0.866000 +vn 0.000000 1.000000 0.000000 +vn -0.500000 0.000000 -0.866000 +vn -1.000000 0.000000 0.000000 +vn -0.606000 -0.795500 0.000000 +vn -0.303000 -0.795500 -0.524800 +vn -0.303000 -0.795500 0.524800 +vn 0.303000 -0.795500 0.524800 +vn 0.606000 -0.795500 0.000000 +vn 0.303000 -0.795500 -0.524800 +vn -0.136600 -0.962000 0.236500 +vn 0.273100 -0.962000 0.000000 +vn -0.273100 -0.962000 0.000000 +vn 0.136600 -0.962000 -0.236500 +vn 0.136600 -0.962000 0.236500 +vn -0.136600 -0.962000 -0.236500 +g Cylinder_Cylinder_None +s off +f 13/1/1 2/2/1 4/3/1 14/4/1 +f 14/4/2 4/3/2 6/5/2 15/6/2 +f 15/6/3 6/5/3 8/7/3 16/8/3 +f 16/8/4 8/7/4 10/9/4 17/10/4 +f 8/11/5 6/12/5 22/13/5 21/14/5 +f 18/15/6 12/16/6 2/2/6 13/1/6 +f 17/10/7 10/9/7 12/17/7 18/18/7 +f 21/19/3 22/20/3 30/21/3 29/22/3 +f 9/23/8 17/24/8 18/25/8 11/26/8 +f 11/26/9 18/25/9 13/27/9 1/28/9 +f 7/29/10 16/30/10 17/24/10 9/23/10 +f 5/31/11 15/32/11 16/30/11 7/29/11 +f 3/33/12 14/34/12 15/32/12 5/31/12 +f 1/28/13 13/27/13 14/34/13 3/33/13 +f 24/35/1 23/36/1 26/37/1 31/38/1 +f 25/39/7 20/40/7 28/41/7 27/42/7 +f 31/43/5 26/44/5 27/45/5 28/46/5 29/47/5 30/48/5 +f 4/49/5 2/50/5 23/51/5 24/52/5 +f 12/53/5 10/54/5 20/55/5 25/56/5 +f 6/12/5 4/49/5 24/52/5 22/13/5 +f 10/54/5 8/11/5 21/14/5 20/55/5 +f 2/50/5 12/53/5 25/56/5 23/51/5 +f 22/20/2 24/35/2 31/38/2 30/21/2 +f 7/29/14 9/23/14 19/57/14 +f 3/33/15 5/31/15 19/57/15 +f 9/23/16 11/26/16 19/57/16 +f 1/28/17 3/33/17 19/57/17 +f 5/31/18 7/29/18 19/57/18 +f 11/26/19 1/28/19 19/57/19 +f 20/40/4 21/19/4 29/22/4 28/41/4 +f 23/36/6 25/58/6 27/59/6 26/37/6 diff --git a/mods/myboardgames/mypirinola/screenshot.png b/mods/myboardgames/mypirinola/screenshot.png new file mode 100644 index 00000000..070e424e Binary files /dev/null and b/mods/myboardgames/mypirinola/screenshot.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_img_1.png b/mods/myboardgames/mypirinola/textures/mypirinola_img_1.png new file mode 100644 index 00000000..53f8173e Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_img_1.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_img_2.png b/mods/myboardgames/mypirinola/textures/mypirinola_img_2.png new file mode 100644 index 00000000..eee42e79 Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_img_2.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_img_3.png b/mods/myboardgames/mypirinola/textures/mypirinola_img_3.png new file mode 100644 index 00000000..1f6981bf Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_img_3.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_img_4.png b/mods/myboardgames/mypirinola/textures/mypirinola_img_4.png new file mode 100644 index 00000000..02d5e1d8 Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_img_4.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_img_5.png b/mods/myboardgames/mypirinola/textures/mypirinola_img_5.png new file mode 100644 index 00000000..e54dbe15 Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_img_5.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_img_6.png b/mods/myboardgames/mypirinola/textures/mypirinola_img_6.png new file mode 100644 index 00000000..8f869f4c Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_img_6.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_img_ani.png b/mods/myboardgames/mypirinola/textures/mypirinola_img_ani.png new file mode 100644 index 00000000..bc077bd1 Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_img_ani.png differ diff --git a/mods/myboardgames/mypirinola/textures/mypirinola_inv.png b/mods/myboardgames/mypirinola/textures/mypirinola_inv.png new file mode 100644 index 00000000..6ccfe785 Binary files /dev/null and b/mods/myboardgames/mypirinola/textures/mypirinola_inv.png differ diff --git a/mods/myboardgames/mypitfall/init.lua b/mods/myboardgames/mypitfall/init.lua new file mode 100644 index 00000000..2547d7cf --- /dev/null +++ b/mods/myboardgames/mypitfall/init.lua @@ -0,0 +1,69 @@ +minetest.register_node("mypitfall:block",{ + description = "Pitfall", + inventory_image = "mypitfall_inv.png", + wield_image = "mypitfall_inv.png", + tiles = {"default_dirt.png^mypitfall_reset.png"}, + drawtype = "normal", + paramtype = "light", + light_source = 8, + groups = {cracky = 1}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mypitfall").."/schems/mypitfall1.mts" + minetest.place_schematic({x=pos.x,y=pos.y-9,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +minetest.register_node("mypitfall:swamp_water", { + description = "Swamp Water", + inventory_image = minetest.inventorycube("mypitfall_swamp_water_inv.png"), + drawtype = "liquid", + tiles = {"mypitfall_swamp_water.png", }, + alpha = 240, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "mypitfall:swamp_water_flowing", + liquid_alternative_source = "mypitfall:swamp_water", + liquid_viscosity = 3, + liquid_renewable = true, + liquid_range = 2, + damage_per_second = 5, + post_effect_color = {a=180, r=25, g=40, b=1}, + groups = {liquid=2,not_in_creative_inventory=1}, +}) +minetest.register_node("mypitfall:swamp_water_flowing", { + description = "Flowing Swamp Water", + inventory_image = minetest.inventorycube("mypitfall_swamp_water_inv.png"), + drawtype = "flowingliquid", + tiles = {"mypitfall_swamp_water.png"}, + special_tiles = {"mypitfall_swamp_water.png"}, + alpha = 240, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "mypitfall:swamp_water_flowing", + liquid_alternative_source = "mypitfall:swamp_water", + liquid_viscosity = 3, + liquid_renewable = true, + liquid_range = 3, + damage_per_second = 5, + post_effect_color = {a=180, r=25, g=40, b=1}, + groups = {liquid=2, not_in_creative_inventory=1}, +}) diff --git a/mods/myboardgames/mypitfall/mod.conf b/mods/myboardgames/mypitfall/mod.conf new file mode 100644 index 00000000..9953ef75 --- /dev/null +++ b/mods/myboardgames/mypitfall/mod.conf @@ -0,0 +1 @@ +name = mypitfall diff --git a/mods/myboardgames/mypitfall/schems/mypitfall1.mts b/mods/myboardgames/mypitfall/schems/mypitfall1.mts new file mode 100644 index 00000000..c3ae7ac7 Binary files /dev/null and b/mods/myboardgames/mypitfall/schems/mypitfall1.mts differ diff --git a/mods/myboardgames/mypitfall/screenshot.png b/mods/myboardgames/mypitfall/screenshot.png new file mode 100644 index 00000000..92c44d88 Binary files /dev/null and b/mods/myboardgames/mypitfall/screenshot.png differ diff --git a/mods/myboardgames/mypitfall/textures/mypitfall_inv.png b/mods/myboardgames/mypitfall/textures/mypitfall_inv.png new file mode 100644 index 00000000..4fe2cfa7 Binary files /dev/null and b/mods/myboardgames/mypitfall/textures/mypitfall_inv.png differ diff --git a/mods/myboardgames/mypitfall/textures/mypitfall_reset.png b/mods/myboardgames/mypitfall/textures/mypitfall_reset.png new file mode 100644 index 00000000..18ad124f Binary files /dev/null and b/mods/myboardgames/mypitfall/textures/mypitfall_reset.png differ diff --git a/mods/myboardgames/mypitfall/textures/mypitfall_swamp_water.png b/mods/myboardgames/mypitfall/textures/mypitfall_swamp_water.png new file mode 100644 index 00000000..46d39679 Binary files /dev/null and b/mods/myboardgames/mypitfall/textures/mypitfall_swamp_water.png differ diff --git a/mods/myboardgames/mypitfall/textures/mypitfall_swamp_water_inv.png b/mods/myboardgames/mypitfall/textures/mypitfall_swamp_water_inv.png new file mode 100644 index 00000000..ef2a02e6 Binary files /dev/null and b/mods/myboardgames/mypitfall/textures/mypitfall_swamp_water_inv.png differ diff --git a/mods/myboardgames/mys_n_l/depends.txt b/mods/myboardgames/mys_n_l/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mys_n_l/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mys_n_l/dice.lua b/mods/myboardgames/mys_n_l/dice.lua new file mode 100644 index 00000000..b0cd6499 --- /dev/null +++ b/mods/myboardgames/mys_n_l/dice.lua @@ -0,0 +1,48 @@ +local dice = { + {"mys_n_l:1",{"mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png"},"1"}, + {"mys_n_l:2",{"mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png"},"2"}, + {"mys_n_l:3",{"mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png"},"3"}, + {"mys_n_l:4",{"mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png"},"4"}, + {"mys_n_l:5",{"mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png"},"5"}, + {"mys_n_l:6",{"mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png"},"6"}, + } +for i in ipairs (dice) do +local d1 = dice [i][1] +local d2 = dice [i][2] +local d3 = dice [i][3] + +minetest.register_node(d1,{ + description = d3, + tiles = d2, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1, not_in_creative_inventory=1}, + +on_punch = function(pos, node, puncher, pointed_thing) + local timer = minetest.get_node_timer(pos) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mys_n_l:roll"}) + timer:start(2) +end, + +}) +end +minetest.register_node("mys_n_l:roll",{ + description = "roll", + tiles = { + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + }, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 3, not_in_creative_inventory=1}, + +on_timer = function(pos, elapsed) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mys_n_l:"..ran}) +end +}) diff --git a/mods/myboardgames/mys_n_l/init.lua b/mods/myboardgames/mys_n_l/init.lua new file mode 100644 index 00000000..3fd3f997 --- /dev/null +++ b/mods/myboardgames/mys_n_l/init.lua @@ -0,0 +1,177 @@ +local board_parts = { + {"1","[colorize:red:200","mys_n_l_1.png",""}, + {"2","[colorize:blue:200","mys_n_l_2.png",""}, + {"3","[colorize:yellow:200","mys_n_l_3.png","mys_n_l_ladbot.png"}, + {"4","[colorize:green:200","mys_n_l_4.png",""}, + {"5","[colorize:red:200","mys_n_l_5.png",""}, + {"6","[colorize:blue:200","mys_n_l_6.png",""}, + {"7","[colorize:yellow:200","mys_n_l_7.png",""}, + {"8","[colorize:green:200","mys_n_l_8.png",""}, + {"9","[colorize:red:200","mys_n_l_9.png",""}, + {"10","[colorize:blue:200","mys_n_l_1.png^mys_n_l_10.png",""}, + {"11","[colorize:yellow:200","mys_n_l_1.png^mys_n_l_11.png",""}, + {"12","[colorize:green:200","mys_n_l_1.png^mys_n_l_12.png",""}, + {"13","[colorize:red:200","mys_n_l_1.png^mys_n_l_13.png","mys_n_l_stail.png"}, + {"14","[colorize:blue:200","mys_n_l_1.png^mys_n_l_14.png",""}, + {"15","[colorize:yellow:200","mys_n_l_1.png^mys_n_l_15.png",""}, + {"16","[colorize:green:200","mys_n_l_1.png^mys_n_l_16.png",""}, + {"17","[colorize:red:200","mys_n_l_1.png^mys_n_l_17.png",""}, + {"18","[colorize:blue:200","mys_n_l_1.png^mys_n_l_18.png","mys_n_l_ladtop.png"}, + {"19","[colorize:yellow:200","mys_n_l_1.png^mys_n_l_19.png",""}, + {"20","[colorize:green:200","mys_n_l_2.png^mys_n_l_10.png",""}, + {"21","[colorize:red:200","mys_n_l_2.png^mys_n_l_11.png",""}, + {"22","[colorize:blue:200","mys_n_l_2.png^mys_n_l_12.png","mys_n_l_stail.png"}, + {"23","[colorize:yellow:200","mys_n_l_2.png^mys_n_l_13.png",""}, + {"24","[colorize:green:200","mys_n_l_2.png^mys_n_l_14.png",""}, + {"25","[colorize:red:200","mys_n_l_2.png^mys_n_l_15.png",""}, + {"26","[colorize:blue:200","mys_n_l_2.png^mys_n_l_16.png","mys_n_l_ladbot.png"}, + {"27","[colorize:yellow:200","mys_n_l_2.png^mys_n_l_17.png",""}, + {"28","[colorize:green:200","mys_n_l_2.png^mys_n_l_18.png","mys_n_l_sturn.png^[transformR180"}, + {"29","[colorize:red:200","mys_n_l_2.png^mys_n_l_19.png","mys_n_l_sturn.png"}, + {"30","[colorize:blue:200","mys_n_l_3.png^mys_n_l_10.png",""}, + {"31","[colorize:red:200","mys_n_l_3.png^mys_n_l_11.png",""}, + {"32","[colorize:blue:200","mys_n_l_3.png^mys_n_l_12.png","mys_n_l_smid.png"}, + {"33","[colorize:yellow:200","mys_n_l_3.png^mys_n_l_13.png",""}, + {"34","[colorize:green:200","mys_n_l_3.png^mys_n_l_14.png",""}, + {"35","[colorize:red:200","mys_n_l_3.png^mys_n_l_15.png","mys_n_l_ladmid.png"}, + {"36","[colorize:blue:200","mys_n_l_3.png^mys_n_l_16.png",""}, + {"37","[colorize:yellow:200","mys_n_l_3.png^mys_n_l_17.png",""}, + {"38","[colorize:green:200","mys_n_l_3.png^mys_n_l_18.png","mys_n_l_sturn.png"}, + {"39","[colorize:red:200","mys_n_l_3.png^mys_n_l_19.png","mys_n_l_sturn.png^[transformR180"}, + {"40","[colorize:blue:200","mys_n_l_4.png^mys_n_l_10.png",""}, + {"41","[colorize:red:200","mys_n_l_4.png^mys_n_l_11.png","mys_n_l_ladbot.png"}, + {"42","[colorize:blue:200","mys_n_l_4.png^mys_n_l_12.png",""}, + {"43","[colorize:yellow:200","mys_n_l_4.png^mys_n_l_13.png","mys_n_l_sturn.png^[transformR180"}, + {"44","[colorize:green:200","mys_n_l_4.png^mys_n_l_14.png","mys_n_l_sturn.png"}, + {"45","[colorize:red:200","mys_n_l_4.png^mys_n_l_15.png",""}, + {"46","[colorize:blue:200","mys_n_l_4.png^mys_n_l_16.png","mys_n_l_ladtop.png"}, + {"47","[colorize:yellow:200","mys_n_l_4.png^mys_n_l_17.png",""}, + {"48","[colorize:green:200","mys_n_l_4.png^mys_n_l_18.png",""}, + {"49","[colorize:red:200","mys_n_l_4.png^mys_n_l_19.png","mys_n_l_shead.png"}, + {"50","[colorize:blue:200","mys_n_l_5.png^mys_n_l_10.png",""}, + {"51","[colorize:red:200","mys_n_l_5.png^mys_n_l_11.png",""}, + {"52","[colorize:blue:200","mys_n_l_5.png^mys_n_l_12.png",""}, + {"53","[colorize:yellow:200","mys_n_l_5.png^mys_n_l_13.png",""}, + {"54","[colorize:green:200","mys_n_l_5.png^mys_n_l_14.png","mys_n_l_ladbot.png"}, + {"55","[colorize:red:200","mys_n_l_5.png^mys_n_l_15.png",""}, + {"56","[colorize:blue:200","mys_n_l_5.png^mys_n_l_16.png",""}, + {"57","[colorize:yellow:200","mys_n_l_5.png^mys_n_l_17.png","mys_n_l_smid.png"}, + {"58","[colorize:green:200","mys_n_l_5.png^mys_n_l_18.png",""}, + {"59","[colorize:red:200","mys_n_l_5.png^mys_n_l_19.png",""}, + {"60","[colorize:blue:200","mys_n_l_6.png^mys_n_l_10.png","mys_n_l_ladmid.png"}, + {"61","[colorize:red:200","mys_n_l_6.png^mys_n_l_11.png","mys_n_l_ladtop.png"}, + {"62","[colorize:blue:200","mys_n_l_6.png^mys_n_l_12.png",""}, + {"63","[colorize:yellow:200","mys_n_l_6.png^mys_n_l_13.png",""}, + {"64","[colorize:green:200","mys_n_l_6.png^mys_n_l_14.png","mys_n_l_shead.png"}, + {"65","[colorize:red:200","mys_n_l_6.png^mys_n_l_15.png",""}, + {"66","[colorize:blue:200","mys_n_l_6.png^mys_n_l_16.png",""}, + {"67","[colorize:yellow:200","mys_n_l_6.png^mys_n_l_17.png","mys_n_l_ladmid.png"}, + {"68","[colorize:green:200","mys_n_l_6.png^mys_n_l_18.png",""}, + {"69","[colorize:red:200","mys_n_l_6.png^mys_n_l_19.png","mys_n_l_stail.png"}, + {"70","[colorize:blue:200","mys_n_l_7.png^mys_n_l_10.png",""}, + {"71","[colorize:red:200","mys_n_l_7.png^mys_n_l_11.png","mys_n_l_sturn.png"}, + {"72","[colorize:blue:200","mys_n_l_7.png^mys_n_l_12.png","mys_n_l_sturn.png^[transformR180"}, + {"73","[colorize:yellow:200","mys_n_l_7.png^mys_n_l_13.png",""}, + {"74","[colorize:green:200","mys_n_l_7.png^mys_n_l_14.png","mys_n_l_ladmid.png"}, + {"75","[colorize:red:200","mys_n_l_7.png^mys_n_l_15.png",""}, + {"76","[colorize:blue:200","mys_n_l_7.png^mys_n_l_16.png",""}, + {"77","[colorize:yellow:200","mys_n_l_7.png^mys_n_l_17.png",""}, + {"78","[colorize:green:200","mys_n_l_7.png^mys_n_l_18.png",""}, + {"79","[colorize:red:200","mys_n_l_7.png^mys_n_l_19.png",""}, + {"80","[colorize:blue:200","mys_n_l_8.png^mys_n_l_10.png",""}, + {"81","[colorize:red:200","mys_n_l_8.png^mys_n_l_11.png",""}, + {"82","[colorize:blue:200","mys_n_l_8.png^mys_n_l_12.png",""}, + {"83","[colorize:yellow:200","mys_n_l_8.png^mys_n_l_13.png","mys_n_l_ladbot.png"}, + {"84","[colorize:green:200","mys_n_l_8.png^mys_n_l_14.png",""}, + {"85","[colorize:red:200","mys_n_l_8.png^mys_n_l_15.png","mys_n_l_stail.png^[transformR270"}, + {"86","[colorize:blue:200","mys_n_l_8.png^mys_n_l_16.png","mys_n_l_sturn.png"}, + {"87","[colorize:yellow:200","mys_n_l_8.png^mys_n_l_17.png","mys_n_l_ladtop.png"}, + {"88","[colorize:green:200","mys_n_l_8.png^mys_n_l_18.png",""}, + {"89","[colorize:red:200","mys_n_l_8.png^mys_n_l_19.png",""}, + {"90","[colorize:blue:200","mys_n_l_9.png^mys_n_l_10.png","mys_n_l_shead.png"}, + {"91","[colorize:red:200","mys_n_l_9.png^mys_n_l_11.png",""}, + {"92","[colorize:blue:200","mys_n_l_9.png^mys_n_l_12.png",""}, + {"93","[colorize:yellow:200","mys_n_l_9.png^mys_n_l_13.png",""}, + {"94","[colorize:green:200","mys_n_l_9.png^mys_n_l_14.png",""}, + {"95","[colorize:red:200","mys_n_l_9.png^mys_n_l_15.png","mys_n_l_shead.png"}, + {"96","[colorize:blue:200","mys_n_l_9.png^mys_n_l_16.png",""}, + {"97","[colorize:yellow:200","mys_n_l_9.png^mys_n_l_17.png",""}, + {"98","[colorize:green:200","mys_n_l_9.png^mys_n_l_18.png","mys_n_l_ladtop.png"}, + {"99","[colorize:red:200","mys_n_l_9.png^mys_n_l_19.png",""}, + {"100","[colorize:blue:200","mys_n_l_1.png^mys_n_l_10.png^mys_n_l_100.png",""}, + } +for i in ipairs(board_parts) do + local num = board_parts[i][1] + local col = board_parts[i][2] + local number = board_parts[i][3] + local sorl = board_parts[i][4] + + +minetest.register_node("mys_n_l:board_block"..num,{ + description = "Block "..num, + tiles = { + "mys_n_l_base.png^"..col.."^mys_n_l_edge.png^"..sorl.."^"..number, + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png" + }, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=1,not_in_creative_inventory = 1}, +}) +end +minetest.register_node("mys_n_l:placer",{ + description = "Snakes and Ladders", + inventory_image = "mys_n_l_inv.png", + wield_image = "mys_n_l_inv.png", + tiles = { + "mys_n_l_base.png^mys_n_l_edge.png^mys_n_l_ladmid.png" + }, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mys_n_l").."/schems/mys_n_l.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +local pieces = { + {"Red","red","^[colorize:red:120"}, + {"Green","green","^[colorize:green:120"}, + {"Yellow","yellow","^[colorize:yellow:120"}, + {"Blue","blue","^[colorize:blue:120"}, + } +for i in ipairs (pieces) do +local desc = pieces[i][1] +local item = pieces[i][2] +local col = pieces[i][3] + +minetest.register_node("mys_n_l:"..item,{ + description = desc.." Player", + tiles = {"default_gravel.png"..col}, + drawtype = "nodebox", + paramtype = "light", + light_source = 11, + groups = {cracky = 1, dig_immediate=3, not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.125, -0.3125, -0.125, 0.125, 0.125, 0.125}, + {-0.1875, 0.125, -0.1875, 0.1875, 0.3125, 0.1875}, + } + } +}) +end +dofile(minetest.get_modpath("mys_n_l").."/dice.lua") diff --git a/mods/myboardgames/mys_n_l/mod.conf b/mods/myboardgames/mys_n_l/mod.conf new file mode 100644 index 00000000..259b89c4 --- /dev/null +++ b/mods/myboardgames/mys_n_l/mod.conf @@ -0,0 +1 @@ +name = mys_n_l diff --git a/mods/myboardgames/mys_n_l/schems/mys_n_l.mts b/mods/myboardgames/mys_n_l/schems/mys_n_l.mts new file mode 100644 index 00000000..55eb3d69 Binary files /dev/null and b/mods/myboardgames/mys_n_l/schems/mys_n_l.mts differ diff --git a/mods/myboardgames/mys_n_l/screenshot.png b/mods/myboardgames/mys_n_l/screenshot.png new file mode 100644 index 00000000..4af5e1e2 Binary files /dev/null and b/mods/myboardgames/mys_n_l/screenshot.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mylittle_bg_1.png b/mods/myboardgames/mys_n_l/textures/mylittle_bg_1.png new file mode 100644 index 00000000..48d8efb6 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mylittle_bg_1.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mylittle_bg_2.png b/mods/myboardgames/mys_n_l/textures/mylittle_bg_2.png new file mode 100644 index 00000000..a3acf7ef Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mylittle_bg_2.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mylittle_bg_3.png b/mods/myboardgames/mys_n_l/textures/mylittle_bg_3.png new file mode 100644 index 00000000..534e635f Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mylittle_bg_3.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mylittle_bg_4.png b/mods/myboardgames/mys_n_l/textures/mylittle_bg_4.png new file mode 100644 index 00000000..5a5e2c23 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mylittle_bg_4.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mylittle_bg_5.png b/mods/myboardgames/mys_n_l/textures/mylittle_bg_5.png new file mode 100644 index 00000000..7143d6c1 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mylittle_bg_5.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mylittle_bg_6.png b/mods/myboardgames/mys_n_l/textures/mylittle_bg_6.png new file mode 100644 index 00000000..670f3780 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mylittle_bg_6.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mylittle_bg_ani.png b/mods/myboardgames/mys_n_l/textures/mylittle_bg_ani.png new file mode 100644 index 00000000..4805c7aa Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mylittle_bg_ani.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_1.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_1.png new file mode 100644 index 00000000..6b930672 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_1.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_10.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_10.png new file mode 100644 index 00000000..60c2331f Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_10.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_100.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_100.png new file mode 100644 index 00000000..b8d3a1b6 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_100.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_11.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_11.png new file mode 100644 index 00000000..b650af32 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_11.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_12.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_12.png new file mode 100644 index 00000000..6c3e5dc1 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_12.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_13.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_13.png new file mode 100644 index 00000000..7c258e31 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_13.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_14.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_14.png new file mode 100644 index 00000000..4976995b Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_14.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_15.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_15.png new file mode 100644 index 00000000..ea0ea644 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_15.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_16.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_16.png new file mode 100644 index 00000000..cfa7b1e3 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_16.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_17.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_17.png new file mode 100644 index 00000000..72a9a791 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_17.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_18.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_18.png new file mode 100644 index 00000000..c037d270 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_18.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_19.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_19.png new file mode 100644 index 00000000..4e23d230 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_19.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_2.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_2.png new file mode 100644 index 00000000..e4a10958 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_2.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_3.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_3.png new file mode 100644 index 00000000..35bae1ea Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_3.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_4.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_4.png new file mode 100644 index 00000000..eb579e44 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_4.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_5.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_5.png new file mode 100644 index 00000000..79618e3f Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_5.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_6.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_6.png new file mode 100644 index 00000000..01ad2976 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_6.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_7.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_7.png new file mode 100644 index 00000000..4ebaf540 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_7.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_8.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_8.png new file mode 100644 index 00000000..60436e5e Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_8.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_9.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_9.png new file mode 100644 index 00000000..683269cb Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_9.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_base.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_base.png new file mode 100644 index 00000000..202bfee8 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_base.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_edge.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_edge.png new file mode 100644 index 00000000..a1db2a9a Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_edge.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_inv.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_inv.png new file mode 100644 index 00000000..4f7e548f Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_inv.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_ladbot.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_ladbot.png new file mode 100644 index 00000000..2a5c6931 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_ladbot.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_ladmid.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_ladmid.png new file mode 100644 index 00000000..54cbcd12 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_ladmid.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_ladtop.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_ladtop.png new file mode 100644 index 00000000..e4a73fdb Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_ladtop.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_shead.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_shead.png new file mode 100644 index 00000000..c61a086c Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_shead.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_smid.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_smid.png new file mode 100644 index 00000000..d0e5b1fe Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_smid.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_stail.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_stail.png new file mode 100644 index 00000000..5eaa0841 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_stail.png differ diff --git a/mods/myboardgames/mys_n_l/textures/mys_n_l_sturn.png b/mods/myboardgames/mys_n_l/textures/mys_n_l_sturn.png new file mode 100644 index 00000000..6546b277 Binary files /dev/null and b/mods/myboardgames/mys_n_l/textures/mys_n_l_sturn.png differ diff --git a/mods/myboardgames/mys_n_l_mini/depends.txt b/mods/myboardgames/mys_n_l_mini/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mys_n_l_mini/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mys_n_l_mini/dice.lua b/mods/myboardgames/mys_n_l_mini/dice.lua new file mode 100644 index 00000000..9cc55a4d --- /dev/null +++ b/mods/myboardgames/mys_n_l_mini/dice.lua @@ -0,0 +1,48 @@ +local dice = { + {"mys_n_l_mini:1",{"mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png"},"1"}, + {"mys_n_l_mini:2",{"mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png"},"2"}, + {"mys_n_l_mini:3",{"mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png"},"3"}, + {"mys_n_l_mini:4",{"mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png"},"4"}, + {"mys_n_l_mini:5",{"mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png"},"5"}, + {"mys_n_l_mini:6",{"mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png"},"6"}, + } +for i in ipairs (dice) do +local d1 = dice [i][1] +local d2 = dice [i][2] +local d3 = dice [i][3] + +minetest.register_node(d1,{ + description = d3, + tiles = d2, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1, not_in_creative_inventory=1}, + +on_punch = function(pos, node, puncher, pointed_thing) + local timer = minetest.get_node_timer(pos) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mys_n_l:roll"}) + timer:start(2) +end, + +}) +end +minetest.register_node("mys_n_l_mini:roll",{ + description = "roll", + tiles = { + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + }, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 3, not_in_creative_inventory=1}, + +on_timer = function(pos, elapsed) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mys_n_l_mini:"..ran}) +end +}) diff --git a/mods/myboardgames/mys_n_l_mini/init.lua b/mods/myboardgames/mys_n_l_mini/init.lua new file mode 100644 index 00000000..e4f8a7b8 --- /dev/null +++ b/mods/myboardgames/mys_n_l_mini/init.lua @@ -0,0 +1,113 @@ +local board_parts = { + {"1","[colorize:red:200","mys_n_l_1.png",""}, + {"2","[colorize:blue:200","mys_n_l_2.png",""}, + {"3","[colorize:yellow:200","mys_n_l_3.png","mys_n_l_stail.png"}, + {"4","[colorize:green:200","mys_n_l_4.png",""}, + {"5","[colorize:red:200","mys_n_l_5.png",""}, + {"6","[colorize:blue:200","mys_n_l_6.png",""}, + {"7","[colorize:yellow:200","mys_n_l_7.png","mys_n_l_ladbot.png"}, + {"8","[colorize:green:200","mys_n_l_8.png",""}, + {"9","[colorize:red:200","mys_n_l_9.png",""}, + {"10","[colorize:blue:200","mys_n_l_1.png^mys_n_l_10.png","mys_n_l_smid.png"}, + {"11","[colorize:yellow:200","mys_n_l_1.png^mys_n_l_11.png","mys_n_l_ladbot.png"}, + {"12","[colorize:green:200","mys_n_l_1.png^mys_n_l_12.png",""}, + {"13","[colorize:red:200","mys_n_l_1.png^mys_n_l_13.png",""}, + {"14","[colorize:blue:200","mys_n_l_1.png^mys_n_l_14.png","mys_n_l_ladmid.png"}, + {"15","[colorize:yellow:200","mys_n_l_1.png^mys_n_l_15.png","mys_n_l_shead.png"}, + {"16","[colorize:green:200","mys_n_l_1.png^mys_n_l_16.png",""}, + {"17","[colorize:red:200","mys_n_l_1.png^mys_n_l_17.png","mys_n_l_stail.png"}, + {"18","[colorize:blue:200","mys_n_l_1.png^mys_n_l_18.png","mys_n_l_ladtop.png"}, + {"19","[colorize:yellow:200","mys_n_l_1.png^mys_n_l_19.png",""}, + {"20","[colorize:green:200","mys_n_l_2.png^mys_n_l_10.png","mys_n_l_smid.png"}, + {"21","[colorize:red:200","mys_n_l_2.png^mys_n_l_11.png",""}, + {"22","[colorize:blue:200","mys_n_l_2.png^mys_n_l_12.png",""}, + {"23","[colorize:yellow:200","mys_n_l_2.png^mys_n_l_13.png","mys_n_l_ladtop.png"}, + {"24","[colorize:green:200","mys_n_l_2.png^mys_n_l_14.png",""}, + {"25","[colorize:red:200","mys_n_l_2.png^mys_n_l_15.png",""}, + {"26","[colorize:blue:200","mys_n_l_2.png^mys_n_l_16.png","mys_n_l_ladbot.png"}, + {"27","[colorize:yellow:200","mys_n_l_2.png^mys_n_l_17.png","mys_n_l_stail.png"}, + {"28","[colorize:green:200","mys_n_l_2.png^mys_n_l_18.png",""}, + {"29","[colorize:red:200","mys_n_l_2.png^mys_n_l_19.png","mys_n_l_shead.png"}, + {"30","[colorize:blue:200","mys_n_l_3.png^mys_n_l_10.png",""}, + {"31","[colorize:red:200","mys_n_l_3.png^mys_n_l_11.png",""}, + {"32","[colorize:blue:200","mys_n_l_3.png^mys_n_l_12.png",""}, + {"33","[colorize:yellow:200","mys_n_l_3.png^mys_n_l_13.png",""}, + {"34","[colorize:green:200","mys_n_l_3.png^mys_n_l_14.png","mys_n_l_shead.png"}, + {"35","[colorize:red:200","mys_n_l_3.png^mys_n_l_15.png","mys_n_l_ladtop.png"}, + {"36","[colorize:blue:200","mys_n_l_3.png^mys_n_l_16.png",""}, + } +for i in ipairs(board_parts) do + local num = board_parts[i][1] + local col = board_parts[i][2] + local number = board_parts[i][3] + local sorl = board_parts[i][4] + + +minetest.register_node("mys_n_l_mini:board_block"..num,{ + description = "Block "..num, + tiles = { + "mys_n_l_base.png^"..col.."^mys_n_l_edge.png^"..sorl.."^"..number, + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png", + "mys_n_l_base.png^"..col.."mys_n_l_edge.png" + }, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=1,not_in_creative_inventory = 1}, +}) +end +minetest.register_node("mys_n_l_mini:placer",{ + description = "Snakes and Ladders Mini", + inventory_image = "mys_n_l_mini_inv.png", + wield_image = "mys_n_l_mini_inv.png", + tiles = { + "mys_n_l_base.png^mys_n_l_ladmid.png^mys_n_l_edgem.png" + }, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mys_n_l_mini").."/schems/mys_n_l_mini.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +local pieces = { + {"Red","red","^[colorize:red:120"}, + {"Green","green","^[colorize:green:120"}, + {"Yellow","yellow","^[colorize:yellow:120"}, + {"Blue","blue","^[colorize:blue:120"}, + } +for i in ipairs (pieces) do +local desc = pieces[i][1] +local item = pieces[i][2] +local col = pieces[i][3] + +minetest.register_node("mys_n_l_mini:"..item,{ + description = desc.." Player", + tiles = {"default_gravel.png"..col}, + drawtype = "nodebox", + paramtype = "light", + light_source = 11, + groups = {cracky = 1, dig_immediate=3, not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.125, -0.3125, -0.125, 0.125, 0.125, 0.125}, + {-0.1875, 0.125, -0.1875, 0.1875, 0.3125, 0.1875}, + } + } +}) +end +dofile(minetest.get_modpath("mys_n_l_mini").."/dice.lua") diff --git a/mods/myboardgames/mys_n_l_mini/mod.conf b/mods/myboardgames/mys_n_l_mini/mod.conf new file mode 100644 index 00000000..befe9a36 --- /dev/null +++ b/mods/myboardgames/mys_n_l_mini/mod.conf @@ -0,0 +1 @@ +name = mys_n_l_mini diff --git a/mods/myboardgames/mys_n_l_mini/schems/mys_n_l_mini.mts b/mods/myboardgames/mys_n_l_mini/schems/mys_n_l_mini.mts new file mode 100644 index 00000000..30e25189 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/schems/mys_n_l_mini.mts differ diff --git a/mods/myboardgames/mys_n_l_mini/screenshot.png b/mods/myboardgames/mys_n_l_mini/screenshot.png new file mode 100644 index 00000000..c6e8dd8a Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/screenshot.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_1.png b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_1.png new file mode 100644 index 00000000..48d8efb6 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_1.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_2.png b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_2.png new file mode 100644 index 00000000..a3acf7ef Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_2.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_3.png b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_3.png new file mode 100644 index 00000000..534e635f Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_3.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_4.png b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_4.png new file mode 100644 index 00000000..5a5e2c23 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_4.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_5.png b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_5.png new file mode 100644 index 00000000..7143d6c1 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_5.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_6.png b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_6.png new file mode 100644 index 00000000..670f3780 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_6.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_ani.png b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_ani.png new file mode 100644 index 00000000..4805c7aa Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mylittle_bg_ani.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_1.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_1.png new file mode 100644 index 00000000..6b930672 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_1.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_10.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_10.png new file mode 100644 index 00000000..60c2331f Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_10.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_100.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_100.png new file mode 100644 index 00000000..b8d3a1b6 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_100.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_11.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_11.png new file mode 100644 index 00000000..b650af32 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_11.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_12.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_12.png new file mode 100644 index 00000000..6c3e5dc1 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_12.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_13.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_13.png new file mode 100644 index 00000000..7c258e31 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_13.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_14.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_14.png new file mode 100644 index 00000000..4976995b Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_14.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_15.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_15.png new file mode 100644 index 00000000..ea0ea644 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_15.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_16.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_16.png new file mode 100644 index 00000000..cfa7b1e3 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_16.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_17.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_17.png new file mode 100644 index 00000000..72a9a791 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_17.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_18.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_18.png new file mode 100644 index 00000000..c037d270 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_18.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_19.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_19.png new file mode 100644 index 00000000..4e23d230 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_19.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_2.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_2.png new file mode 100644 index 00000000..e4a10958 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_2.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_3.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_3.png new file mode 100644 index 00000000..35bae1ea Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_3.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_4.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_4.png new file mode 100644 index 00000000..eb579e44 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_4.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_5.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_5.png new file mode 100644 index 00000000..79618e3f Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_5.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_6.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_6.png new file mode 100644 index 00000000..01ad2976 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_6.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_7.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_7.png new file mode 100644 index 00000000..4ebaf540 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_7.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_8.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_8.png new file mode 100644 index 00000000..60436e5e Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_8.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_9.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_9.png new file mode 100644 index 00000000..683269cb Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_9.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_base.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_base.png new file mode 100644 index 00000000..202bfee8 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_base.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_edge.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_edge.png new file mode 100644 index 00000000..a1db2a9a Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_edge.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_edgem.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_edgem.png new file mode 100644 index 00000000..136fb92f Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_edgem.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladbot.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladbot.png new file mode 100644 index 00000000..2a5c6931 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladbot.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladmid.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladmid.png new file mode 100644 index 00000000..54cbcd12 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladmid.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladtop.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladtop.png new file mode 100644 index 00000000..e4a73fdb Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_ladtop.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_mini_inv.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_mini_inv.png new file mode 100644 index 00000000..cd6cee59 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_mini_inv.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_shead.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_shead.png new file mode 100644 index 00000000..c61a086c Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_shead.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_smid.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_smid.png new file mode 100644 index 00000000..d0e5b1fe Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_smid.png differ diff --git a/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_stail.png b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_stail.png new file mode 100644 index 00000000..5eaa0841 Binary files /dev/null and b/mods/myboardgames/mys_n_l_mini/textures/mys_n_l_stail.png differ diff --git a/mods/myboardgames/mytrouble/depends.txt b/mods/myboardgames/mytrouble/depends.txt new file mode 100644 index 00000000..331d858c --- /dev/null +++ b/mods/myboardgames/mytrouble/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/myboardgames/mytrouble/dice.lua b/mods/myboardgames/mytrouble/dice.lua new file mode 100644 index 00000000..a7a3cf7b --- /dev/null +++ b/mods/myboardgames/mytrouble/dice.lua @@ -0,0 +1,48 @@ +local dice = { + {"mytrouble:1",{"mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png"},"1"}, + {"mytrouble:2",{"mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png"},"2"}, + {"mytrouble:3",{"mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png"},"3"}, + {"mytrouble:4",{"mylittle_bg_4.png","mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png"},"4"}, + {"mytrouble:5",{"mylittle_bg_5.png","mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png"},"5"}, + {"mytrouble:6",{"mylittle_bg_6.png","mylittle_bg_1.png","mylittle_bg_2.png","mylittle_bg_3.png","mylittle_bg_4.png","mylittle_bg_5.png"},"6"}, + } +for i in ipairs (dice) do +local d1 = dice [i][1] +local d2 = dice [i][2] +local d3 = dice [i][3] + +minetest.register_node(d1,{ + description = d3, + tiles = d2, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1, not_in_creative_inventory=1}, + +on_punch = function(pos, node, puncher, pointed_thing) + local timer = minetest.get_node_timer(pos) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mytrouble:roll"}) + timer:start(2) +end, + +}) +end +minetest.register_node("mytrouble:roll",{ + description = "roll", + tiles = { + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + {name="mylittle_bg_ani.png", animation={type="vertical_frames",aspect_w=16, aspect_h=16, length=0.3}}, + }, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 3, not_in_creative_inventory=1}, + +on_timer = function(pos, elapsed) + local ran = math.random(1,6) + minetest.set_node(pos,{name="mytrouble:"..ran}) +end +}) diff --git a/mods/myboardgames/mytrouble/init.lua b/mods/myboardgames/mytrouble/init.lua new file mode 100644 index 00000000..31297fec --- /dev/null +++ b/mods/myboardgames/mytrouble/init.lua @@ -0,0 +1,86 @@ +local dots = { + {"Red","red","r"}, + {"Blue","blue","b"}, + {"Green","green","g"}, + {"Orange","orange","o"}, + {"Base","base","a"}, + } +for i in ipairs(dots) do +local desc = dots[i][1] +local col = dots[i][2] +local let = dots[i][3] + +minetest.register_node("mytrouble:dot_"..col,{ + description = desc.." Dot", + tiles = {"default_clay.png^mytrouble_"..let..".png"}, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1,not_in_creative_inventory=1} +}) +minetest.register_node("mytrouble:squ_"..col,{ + description = desc.." Dot", + tiles = { + "default_clay.png^mytrouble_"..let.."s.png", + "default_clay.png", + "default_clay.png", + "default_clay.png", + "default_clay.png", + "default_clay.png", + }, + drawtype = "normal", + paramtype = "light", + groups = {cracky = 1,not_in_creative_inventory=1} +}) +end +local pieces = { + {"Red","red","^[colorize:red:120"}, + {"Green","green","^[colorize:green:120"}, + {"Yellow","yellow","^[colorize:yellow:120"}, + {"Blue","blue","^[colorize:blue:120"}, + } +for i in ipairs (pieces) do +local desc = pieces[i][1] +local item = pieces[i][2] +local col = pieces[i][3] + +minetest.register_node("mytrouble:"..item,{ + description = desc.." Player", + tiles = {"default_gravel.png"..col}, + drawtype = "nodebox", + paramtype = "light", + light_source = 11, + groups = {cracky = 1, dig_immediate=3, not_in_creative_inventory=1}, + node_box = { + type = "fixed", + fixed = { + {-0.3125, -0.5, -0.3125, 0.3125, -0.3125, 0.3125}, + {-0.125, -0.3125, -0.125, 0.125, 0.125, 0.125}, + {-0.1875, 0.125, -0.1875, 0.1875, 0.3125, 0.1875}, + } + } +}) +end +minetest.register_node("mytrouble:placer",{ + description = "Trouble", + inventory_image = "mytrouble_inv.png", + wield_image = "mytrouble_inv.png", + tiles = { + "default_clay.png^mytrouble_o.png" + }, + drawtype = "normal", + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=3}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("mytrouble").."/schems/mytrouble.mts" + minetest.place_schematic({x=pos.x-1,y=pos.y,z=pos.z-1},schem,0, "air", true) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) +dofile(minetest.get_modpath("mytrouble").."/dice.lua") diff --git a/mods/myboardgames/mytrouble/mod.conf b/mods/myboardgames/mytrouble/mod.conf new file mode 100644 index 00000000..fea2e150 --- /dev/null +++ b/mods/myboardgames/mytrouble/mod.conf @@ -0,0 +1 @@ +name = mytrouble diff --git a/mods/myboardgames/mytrouble/schems/mytrouble.mts b/mods/myboardgames/mytrouble/schems/mytrouble.mts new file mode 100644 index 00000000..7e5152ef Binary files /dev/null and b/mods/myboardgames/mytrouble/schems/mytrouble.mts differ diff --git a/mods/myboardgames/mytrouble/screenshot.png b/mods/myboardgames/mytrouble/screenshot.png new file mode 100644 index 00000000..3aab2fe6 Binary files /dev/null and b/mods/myboardgames/mytrouble/screenshot.png differ diff --git a/mods/myboardgames/mytrouble/textures/mylittle_bg_1.png b/mods/myboardgames/mytrouble/textures/mylittle_bg_1.png new file mode 100644 index 00000000..48d8efb6 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mylittle_bg_1.png differ diff --git a/mods/myboardgames/mytrouble/textures/mylittle_bg_2.png b/mods/myboardgames/mytrouble/textures/mylittle_bg_2.png new file mode 100644 index 00000000..a3acf7ef Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mylittle_bg_2.png differ diff --git a/mods/myboardgames/mytrouble/textures/mylittle_bg_3.png b/mods/myboardgames/mytrouble/textures/mylittle_bg_3.png new file mode 100644 index 00000000..534e635f Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mylittle_bg_3.png differ diff --git a/mods/myboardgames/mytrouble/textures/mylittle_bg_4.png b/mods/myboardgames/mytrouble/textures/mylittle_bg_4.png new file mode 100644 index 00000000..5a5e2c23 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mylittle_bg_4.png differ diff --git a/mods/myboardgames/mytrouble/textures/mylittle_bg_5.png b/mods/myboardgames/mytrouble/textures/mylittle_bg_5.png new file mode 100644 index 00000000..7143d6c1 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mylittle_bg_5.png differ diff --git a/mods/myboardgames/mytrouble/textures/mylittle_bg_6.png b/mods/myboardgames/mytrouble/textures/mylittle_bg_6.png new file mode 100644 index 00000000..670f3780 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mylittle_bg_6.png differ diff --git a/mods/myboardgames/mytrouble/textures/mylittle_bg_ani.png b/mods/myboardgames/mytrouble/textures/mylittle_bg_ani.png new file mode 100644 index 00000000..4805c7aa Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mylittle_bg_ani.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_a.png b/mods/myboardgames/mytrouble/textures/mytrouble_a.png new file mode 100644 index 00000000..5c5a471f Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_a.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_as.png b/mods/myboardgames/mytrouble/textures/mytrouble_as.png new file mode 100644 index 00000000..c897083c Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_as.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_b.png b/mods/myboardgames/mytrouble/textures/mytrouble_b.png new file mode 100644 index 00000000..c1d1c14d Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_b.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_bs.png b/mods/myboardgames/mytrouble/textures/mytrouble_bs.png new file mode 100644 index 00000000..7cf1b31d Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_bs.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_g.png b/mods/myboardgames/mytrouble/textures/mytrouble_g.png new file mode 100644 index 00000000..9abc0990 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_g.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_gs.png b/mods/myboardgames/mytrouble/textures/mytrouble_gs.png new file mode 100644 index 00000000..06fe1d23 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_gs.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_inv.png b/mods/myboardgames/mytrouble/textures/mytrouble_inv.png new file mode 100644 index 00000000..91321aa6 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_inv.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_o.png b/mods/myboardgames/mytrouble/textures/mytrouble_o.png new file mode 100644 index 00000000..0949c797 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_o.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_os.png b/mods/myboardgames/mytrouble/textures/mytrouble_os.png new file mode 100644 index 00000000..57738b0e Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_os.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_r.png b/mods/myboardgames/mytrouble/textures/mytrouble_r.png new file mode 100644 index 00000000..25e96e2d Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_r.png differ diff --git a/mods/myboardgames/mytrouble/textures/mytrouble_rs.png b/mods/myboardgames/mytrouble/textures/mytrouble_rs.png new file mode 100644 index 00000000..d2bbd864 Binary files /dev/null and b/mods/myboardgames/mytrouble/textures/mytrouble_rs.png differ diff --git a/mods/myboardgames/myuno/init.lua b/mods/myboardgames/myuno/init.lua new file mode 100644 index 00000000..d096f67a --- /dev/null +++ b/mods/myboardgames/myuno/init.lua @@ -0,0 +1,279 @@ +local nici = 1 +local lastcard = nil +local rplayers = {} + +local function inform_near_players(pos, msg) + for _,player in pairs(minetest.get_objects_inside_radius(pos, 10)) do + if player:is_player() then + minetest.chat_send_player(player:get_player_name(), msg) + end + end +end + +function apn(pos, placer, itemstack) + local grop = minetest.get_item_group(minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name, "myuno") + if grop > 3 then + return + end + + local name = placer:get_player_name() + if grop == 0 then + minetest.chat_send_player(name, "You can not place a card there!") + minetest.remove_node(pos) + return itemstack + end + + local node = minetest.get_node(pos) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + local descr = minetest.registered_items[node.name].description + if grop == 1 then + inform_near_players(pos, name.." placed a "..descr) + return + end + lastcard = nodeu.name + minetest.set_node({x=pos.x, y=pos.y-1, z=pos.z}, node) + minetest.remove_node(pos) + if grop == 3 then + return itemstack + end + print(node.name) + + + inform_near_players(pos, name.." placed a "..descr) + +end + +function od(pos, node, player, pointed_thing) + local node = minetest.get_node(pos) + local nn = node.name + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + local inv = player:get_inventory() + local lc = lastcard + print(nn) + print(lc) + + if lastcard ~= nil then + inv:add_item("main",nn) + minetest.set_node(pos, {name = lc}) + lastcard = nil + else + return + end +end + +local sbox1 = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.49, 0.5}} + } +local sbox2 = { + type = "fixed", + fixed = { + {-0.3, -0.5, -0.45, 0.3, -0.3, 0.45}} + } + +for nu = 1,13 do + local num = nu + +local deck = { + {"Red "..num,"1_"..num,"^[colorize:red:220","a"..num}, + {"Red "..num,"2_"..num,"^[colorize:red:220","b"..num}, + {"Yellow "..num,"3_"..num,"^[colorize:yellow:220","a"..num}, + {"Yellow "..num,"4_"..num,"^[colorize:yellow:220","b"..num}, + {"Green "..num,"5_"..num,"^[colorize:green:220","a"..num}, + {"Green "..num,"6_"..num,"^[colorize:green:220","b"..num}, + {"Blue "..num,"7_"..num,"^[colorize:blue:220","a"..num}, + {"Blue "..num,"8_"..num,"^[colorize:blue:220","b"..num}, +} + + +for i in ipairs(deck) do + local desc = deck[i][1] + local itm = deck[i][2] + local col = deck[i][3] + local nimg = deck[i][4] + + for imgnum = 1,13 do + local inum = imgnum + if nimg == "b"..inum then + nimg = "a"..inum + else nimg = nimg + +local desc2 = "Card" +if nimg == "a10" or + nimg == "b10" then + desc2 = string.gsub(desc, 10, "Change Direction") +elseif nimg == "a11" or + nimg == "b11" then + desc2 = string.gsub(desc, 11, "Miss A Turn") +elseif nimg == "a12" or + nimg == "b12" then + desc2 = string.gsub(desc, 12, "Pick Up 2") +elseif nimg == "a13" then + desc2 = string.gsub(desc, 13, 0) +elseif nimg == "b13" then + desc2 = "Pick Up 4" +else + desc2 = desc +end + +minetest.register_node("myuno:"..itm,{ + description = desc2, + inventory_image = "myuno_color.png"..col.."^myuno_white.png^myuno_"..nimg..".png", + tiles = {"myuno_color.png"..col.."^myuno_white.png^myuno_"..nimg..".png"}, + drawtype = "mesh", + mesh = "myuno_card.obj", + paramtype = "light", +-- paramtype2 = "facedir", + stack_max = 1, + groups = {oddly_breakable_by_hand = 3,not_in_creative_inventory = nici,myuno=2}, + selection_box = sbox1, + collision_box = sbox1, + after_place_node = apn, + on_punch = od, +}) + + end +end +end +end + minetest.register_node("myuno:col",{ + description = "Any Color ", + inventory_image = "myuno_col.png", + tiles = {"myuno_card.png^myuno_col.png"}, + drawtype = "mesh", + mesh = "myuno_card.obj", + paramtype = "light", +-- paramtype2 = "facedir", + stack_max = 1, + groups = {oddly_breakable_by_hand = 3,not_in_creative_inventory = nici,myuno=3}, + selection_box = sbox1, + collision_box = sbox1, + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + minetest.show_formspec(placer:get_player_name(),"cform", + "size[4,4;]".. + "image_button_exit[0,0;2,2;myuno_form_red.png;red; ]".. + "image_button_exit[2,0;2,2;myuno_form_yellow.png;yellow; ]".. + "image_button_exit[0,2;2,2;myuno_form_blue.png;blue; ]".. + "image_button_exit[2,2;2,2;myuno_form_green.png;green; ]") + minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "cform" then + if fields["red"] then + minetest.set_node(pos,{name="air"}) + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name="myuno:red"}) + return itemstack + elseif fields["blue"] then + minetest.set_node(pos,{name="air"}) + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name="myuno:blue"}) + elseif fields["yellow"] then + minetest.set_node(pos,{name="air"}) + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name="myuno:yellow"}) + elseif fields["green"] then + minetest.set_node(pos,{name="air"}) + minetest.set_node({x=pos.x,y=pos.y-1,z=pos.z},{name="myuno:green"}) + end + end + end) + itemstack:take_item() + return itemstack + end, + after_place_node = apn, + on_punch = od, +}) + + minetest.register_node("myuno:deck",{ + description = "Uno Card Deck", + tiles = {"myuno_deck.png"}, + drawtype = "mesh", + mesh = "myuno_deck.obj", + paramtype = "light", +-- paramtype2 = "facedir", + stack_max = 1, + groups = {oddly_breakable_by_hand = 1,not_in_creative_inventory = nici}, + selection_box = sbox2, + collision_box = sbox2, +on_punch = function(pos, node, puncher, pointed_thing) + local inv = puncher:get_inventory() + local rand = math.random(1,108) + local rcol = math.random(1,8) + local scol = tostring(rcol) + local rnum = math.random(1,13) + local snum = tostring(rnum) + local card = "myuno:"..scol.."_"..snum.." 1" + if rand <= 4 then + if inv + and inv:room_for_item("main", "myuno:col 1") then + inv:add_item("main", "myuno:col 1") + else + minetest.add_item(pos, item) + end + else + if inv + and inv:room_for_item("main", card) then + inv:add_item("main", card) + else + minetest.add_item(pos, item) + end + end +end, + +}) + minetest.register_node("myuno:board",{ + description = "My Uno", + inventory_image = "myuno_inv.png", + wield_image = "myuno_inv.png", + tiles = {"default_clay.png^bubble.png"}, + drawtype = "normal", + paramtype = "light", + groups = {oddly_breakable_by_hand = 1}, + on_rightclick = function(pos, node, player, itemstack, pointed_thing) + local schem = minetest.get_modpath("myuno").."/schems/myuno.mts" + minetest.place_schematic({x=pos.x,y=pos.y,z=pos.z},schem,0, "air", true) + count = 0 + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and minetest.check_player_privs(placer:get_player_name(), {myboardgames = true}) then + else + minetest.remove_node(pos) + return true + end + end, +}) + + minetest.register_node("myuno:placer",{ + description = "Placer", + tiles = {"default_clay.png"}, + drawtype = "normal", + paramtype = "light", + drop = "", + groups = {cracky=1,not_in_creative_inventory = nici,myuno=1}, +}) + +local colcards = { + {"Red Card","red"}, + {"Blue Card","blue"}, + {"Yellow Card","yellow"}, + {"Green Card","green"}, + } +for i in ipairs(colcards) do + local desc = colcards[i][1] + local itm = colcards[i][2] + + minetest.register_node("myuno:"..itm,{ + description = desc, + tiles = {"myuno_"..itm..".png"}, + drawtype = "mesh", + mesh = "myuno_card.obj", + paramtype = "light", +-- paramtype2 = "facedir", + drop = "", + groups = {oddly_breakable_by_hand = 3,not_in_creative_inventory = nici,myuno=2}, + selection_box = sbox1, + collision_box = sbox1, + after_place_node = apn, + on_punch = od, +}) +end diff --git a/mods/myboardgames/myuno/mod.conf b/mods/myboardgames/myuno/mod.conf new file mode 100644 index 00000000..46ffce7d --- /dev/null +++ b/mods/myboardgames/myuno/mod.conf @@ -0,0 +1 @@ +name = myuno diff --git a/mods/myboardgames/myuno/models/myuno_card.obj b/mods/myboardgames/myuno/models/myuno_card.obj new file mode 100644 index 00000000..8e42e181 --- /dev/null +++ b/mods/myboardgames/myuno/models/myuno_card.obj @@ -0,0 +1,47 @@ +# Blender v2.76 (sub 1) OBJ File: 'card.blend' +# www.blender.org +o Plane +v -0.339514 -0.490000 0.485020 +v 0.339514 -0.490000 0.485020 +v -0.339514 -0.490000 -0.485020 +v 0.339514 -0.490000 -0.485020 +v -0.350000 -0.490000 -0.450000 +v -0.350000 -0.490000 0.450000 +v 0.350000 -0.490000 0.450000 +v 0.350000 -0.490000 -0.450000 +v -0.291667 -0.490000 0.500000 +v 0.291667 -0.490000 0.500000 +v 0.291667 -0.490000 -0.500000 +v -0.291667 -0.490000 -0.500000 +v 0.291667 -0.490000 0.450000 +v -0.291667 -0.490000 0.450000 +v 0.291667 -0.490000 -0.450000 +v -0.291667 -0.490000 -0.450000 +vt 0.912513 0.949910 +vt 0.995460 0.949910 +vt 0.980549 0.984923 +vt 0.912513 0.999900 +vt 0.912514 0.000100 +vt 0.980549 0.015077 +vt 0.995460 0.050090 +vt 0.912513 0.050090 +vt 0.000102 0.050090 +vt 0.083048 0.050090 +vt 0.083046 0.949909 +vt 0.000100 0.949909 +vt 0.015012 0.015077 +vt 0.083048 0.000100 +vt 0.083046 0.999899 +vt 0.015010 0.984922 +vn 0.000000 1.000000 0.000000 +g Plane_Plane_None +s off +f 15/1/1 8/2/1 4/3/1 11/4/1 +f 10/5/1 2/6/1 7/7/1 13/8/1 +f 13/8/1 7/7/1 8/2/1 15/1/1 +f 6/9/1 14/10/1 16/11/1 5/12/1 +f 14/10/1 13/8/1 15/1/1 16/11/1 +f 1/13/1 9/14/1 14/10/1 6/9/1 +f 9/14/1 10/5/1 13/8/1 14/10/1 +f 5/12/1 16/11/1 12/15/1 3/16/1 +f 16/11/1 15/1/1 11/4/1 12/15/1 diff --git a/mods/myboardgames/myuno/models/myuno_deck.obj b/mods/myboardgames/myuno/models/myuno_deck.obj new file mode 100644 index 00000000..87692734 --- /dev/null +++ b/mods/myboardgames/myuno/models/myuno_deck.obj @@ -0,0 +1,47 @@ +# Blender v2.76 (sub 1) OBJ File: 'card.blend' +# www.blender.org +o Plane +v -0.339514 -0.490000 0.485020 +v 0.339514 -0.490000 0.485020 +v -0.339514 -0.490000 -0.485020 +v 0.339514 -0.490000 -0.485020 +v -0.350000 -0.490000 -0.450000 +v -0.350000 -0.490000 0.450000 +v 0.350000 -0.490000 0.450000 +v 0.350000 -0.490000 -0.450000 +v -0.291667 -0.490000 0.500000 +v 0.291667 -0.490000 0.500000 +v 0.291667 -0.490000 -0.500000 +v -0.291667 -0.490000 -0.500000 +v 0.291667 -0.2490000 0.450000 +v -0.291667 -0.2490000 0.450000 +v 0.291667 -0.2490000 -0.450000 +v -0.291667 -0.2490000 -0.450000 +vt 0.912513 0.949910 +vt 0.995460 0.949910 +vt 0.980549 0.984923 +vt 0.912513 0.999900 +vt 0.912514 0.000100 +vt 0.980549 0.015077 +vt 0.995460 0.050090 +vt 0.912513 0.050090 +vt 0.000102 0.050090 +vt 0.083048 0.050090 +vt 0.083046 0.949909 +vt 0.000100 0.949909 +vt 0.015012 0.015077 +vt 0.083048 0.000100 +vt 0.083046 0.999899 +vt 0.015010 0.984922 +vn 0.000000 1.000000 0.000000 +g Plane_Plane_None +s off +f 15/1/1 8/2/1 4/3/1 11/4/1 +f 10/5/1 2/6/1 7/7/1 13/8/1 +f 13/8/1 7/7/1 8/2/1 15/1/1 +f 6/9/1 14/10/1 16/11/1 5/12/1 +f 14/10/1 13/8/1 15/1/1 16/11/1 +f 1/13/1 9/14/1 14/10/1 6/9/1 +f 9/14/1 10/5/1 13/8/1 14/10/1 +f 5/12/1 16/11/1 12/15/1 3/16/1 +f 16/11/1 15/1/1 11/4/1 12/15/1 diff --git a/mods/myboardgames/myuno/models/myuno_deck.obj~ b/mods/myboardgames/myuno/models/myuno_deck.obj~ new file mode 100644 index 00000000..67b6a99d --- /dev/null +++ b/mods/myboardgames/myuno/models/myuno_deck.obj~ @@ -0,0 +1,47 @@ +# Blender v2.76 (sub 1) OBJ File: 'card.blend' +# www.blender.org +o Plane +v -0.339514 -0.490000 0.485020 +v 0.339514 -0.490000 0.485020 +v -0.339514 -0.490000 -0.485020 +v 0.339514 -0.490000 -0.485020 +v -0.350000 -0.490000 -0.450000 +v -0.350000 -0.490000 0.450000 +v 0.350000 -0.490000 0.450000 +v 0.350000 -0.490000 -0.450000 +v -0.291667 -0.490000 0.500000 +v 0.291667 -0.490000 0.500000 +v 0.291667 -0.490000 -0.500000 +v -0.291667 -0.490000 -0.500000 +v 0.291667 -0.1490000 0.450000 +v -0.291667 -0.1490000 0.450000 +v 0.291667 -0.1490000 -0.450000 +v -0.291667 -0.1490000 -0.450000 +vt 0.912513 0.949910 +vt 0.995460 0.949910 +vt 0.980549 0.984923 +vt 0.912513 0.999900 +vt 0.912514 0.000100 +vt 0.980549 0.015077 +vt 0.995460 0.050090 +vt 0.912513 0.050090 +vt 0.000102 0.050090 +vt 0.083048 0.050090 +vt 0.083046 0.949909 +vt 0.000100 0.949909 +vt 0.015012 0.015077 +vt 0.083048 0.000100 +vt 0.083046 0.999899 +vt 0.015010 0.984922 +vn 0.000000 1.000000 0.000000 +g Plane_Plane_None +s off +f 15/1/1 8/2/1 4/3/1 11/4/1 +f 10/5/1 2/6/1 7/7/1 13/8/1 +f 13/8/1 7/7/1 8/2/1 15/1/1 +f 6/9/1 14/10/1 16/11/1 5/12/1 +f 14/10/1 13/8/1 15/1/1 16/11/1 +f 1/13/1 9/14/1 14/10/1 6/9/1 +f 9/14/1 10/5/1 13/8/1 14/10/1 +f 5/12/1 16/11/1 12/15/1 3/16/1 +f 16/11/1 15/1/1 11/4/1 12/15/1 diff --git a/mods/myboardgames/myuno/schems/myuno.mts b/mods/myboardgames/myuno/schems/myuno.mts new file mode 100644 index 00000000..773cc7f8 Binary files /dev/null and b/mods/myboardgames/myuno/schems/myuno.mts differ diff --git a/mods/myboardgames/myuno/screenshot.png b/mods/myboardgames/myuno/screenshot.png new file mode 100644 index 00000000..5c5d3a43 Binary files /dev/null and b/mods/myboardgames/myuno/screenshot.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a1.png b/mods/myboardgames/myuno/textures/myuno_a1.png new file mode 100644 index 00000000..13b0be41 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a1.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a10.png b/mods/myboardgames/myuno/textures/myuno_a10.png new file mode 100644 index 00000000..84b61b39 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a10.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a11.png b/mods/myboardgames/myuno/textures/myuno_a11.png new file mode 100644 index 00000000..05b250ae Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a11.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a12.png b/mods/myboardgames/myuno/textures/myuno_a12.png new file mode 100644 index 00000000..c4e93609 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a12.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a13.png b/mods/myboardgames/myuno/textures/myuno_a13.png new file mode 100644 index 00000000..3a92b552 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a13.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a2.png b/mods/myboardgames/myuno/textures/myuno_a2.png new file mode 100644 index 00000000..6c59b5a2 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a2.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a3.png b/mods/myboardgames/myuno/textures/myuno_a3.png new file mode 100644 index 00000000..38a82253 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a3.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a4.png b/mods/myboardgames/myuno/textures/myuno_a4.png new file mode 100644 index 00000000..ee60ac34 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a4.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a5.png b/mods/myboardgames/myuno/textures/myuno_a5.png new file mode 100644 index 00000000..387cc0f5 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a5.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a6.png b/mods/myboardgames/myuno/textures/myuno_a6.png new file mode 100644 index 00000000..c2978800 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a6.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a7.png b/mods/myboardgames/myuno/textures/myuno_a7.png new file mode 100644 index 00000000..27d17c82 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a7.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a8.png b/mods/myboardgames/myuno/textures/myuno_a8.png new file mode 100644 index 00000000..20230475 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a8.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_a9.png b/mods/myboardgames/myuno/textures/myuno_a9.png new file mode 100644 index 00000000..020cdd4f Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_a9.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_b13.png b/mods/myboardgames/myuno/textures/myuno_b13.png new file mode 100644 index 00000000..a2c278c6 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_b13.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_blue.png b/mods/myboardgames/myuno/textures/myuno_blue.png new file mode 100644 index 00000000..74b712e4 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_blue.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_card.png b/mods/myboardgames/myuno/textures/myuno_card.png new file mode 100644 index 00000000..abd38b23 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_card.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_col.png b/mods/myboardgames/myuno/textures/myuno_col.png new file mode 100644 index 00000000..177d8a81 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_col.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_color.png b/mods/myboardgames/myuno/textures/myuno_color.png new file mode 100644 index 00000000..40c5254c Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_color.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_deck.png b/mods/myboardgames/myuno/textures/myuno_deck.png new file mode 100644 index 00000000..032292d1 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_deck.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_form_blue.png b/mods/myboardgames/myuno/textures/myuno_form_blue.png new file mode 100644 index 00000000..02e4561c Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_form_blue.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_form_green.png b/mods/myboardgames/myuno/textures/myuno_form_green.png new file mode 100644 index 00000000..6bf6900a Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_form_green.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_form_red.png b/mods/myboardgames/myuno/textures/myuno_form_red.png new file mode 100644 index 00000000..5fc9549c Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_form_red.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_form_white.png b/mods/myboardgames/myuno/textures/myuno_form_white.png new file mode 100644 index 00000000..8379b7da Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_form_white.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_form_yellow.png b/mods/myboardgames/myuno/textures/myuno_form_yellow.png new file mode 100644 index 00000000..6faf6838 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_form_yellow.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_green.png b/mods/myboardgames/myuno/textures/myuno_green.png new file mode 100644 index 00000000..20e6bdda Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_green.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_inv.png b/mods/myboardgames/myuno/textures/myuno_inv.png new file mode 100644 index 00000000..054d7965 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_inv.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_red.png b/mods/myboardgames/myuno/textures/myuno_red.png new file mode 100644 index 00000000..49503f49 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_red.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_white.png b/mods/myboardgames/myuno/textures/myuno_white.png new file mode 100644 index 00000000..54d1b9d5 Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_white.png differ diff --git a/mods/myboardgames/myuno/textures/myuno_yellow.png b/mods/myboardgames/myuno/textures/myuno_yellow.png new file mode 100644 index 00000000..165aa37c Binary files /dev/null and b/mods/myboardgames/myuno/textures/myuno_yellow.png differ diff --git a/mods/myboardgames/screenshot.png b/mods/myboardgames/screenshot.png new file mode 100644 index 00000000..4b1fcc65 Binary files /dev/null and b/mods/myboardgames/screenshot.png differ diff --git a/mods/mylandscaping/blends/Adaridge_walls.blend b/mods/mylandscaping/blends/Adaridge_walls.blend new file mode 100644 index 00000000..134461fe Binary files /dev/null and b/mods/mylandscaping/blends/Adaridge_walls.blend differ diff --git a/mods/mylandscaping/blends/Cement Mixer.blend b/mods/mylandscaping/blends/Cement Mixer.blend new file mode 100644 index 00000000..8cc0943b Binary files /dev/null and b/mods/mylandscaping/blends/Cement Mixer.blend differ diff --git a/mods/mylandscaping/blends/Column_toppers.blend b/mods/mylandscaping/blends/Column_toppers.blend new file mode 100644 index 00000000..e21e1f1e Binary files /dev/null and b/mods/mylandscaping/blends/Column_toppers.blend differ diff --git a/mods/mylandscaping/blends/Crusher.blend b/mods/mylandscaping/blends/Crusher.blend new file mode 100644 index 00000000..1d42e84f Binary files /dev/null and b/mods/mylandscaping/blends/Crusher.blend differ diff --git a/mods/mylandscaping/blends/Deco_wall.blend b/mods/mylandscaping/blends/Deco_wall.blend new file mode 100644 index 00000000..705b9b16 Binary files /dev/null and b/mods/mylandscaping/blends/Deco_wall.blend differ diff --git a/mods/mylandscaping/blends/Madison_walls.blend b/mods/mylandscaping/blends/Madison_walls.blend new file mode 100644 index 00000000..a113b5c0 Binary files /dev/null and b/mods/mylandscaping/blends/Madison_walls.blend differ diff --git a/mods/mylandscaping/concrete.lua b/mods/mylandscaping/concrete.lua new file mode 100644 index 00000000..128cd80a --- /dev/null +++ b/mods/mylandscaping/concrete.lua @@ -0,0 +1,8 @@ +minetest.register_node('mylandscaping:concrete', { + description = 'Concrete', + tiles = {'mylandscaping_cement.png'}, + groups = {cracky=1, ml=1}, + sounds = default.node_sound_stone_defaults(), +}) + +--THIS NEEDS TO BE CRAFTABLE. Right now it has ZERO purpose. diff --git a/mods/mylandscaping/depends.txt b/mods/mylandscaping/depends.txt new file mode 100644 index 00000000..eb140d9d --- /dev/null +++ b/mods/mylandscaping/depends.txt @@ -0,0 +1,3 @@ +default +bucket +myconcrete? diff --git a/mods/mylandscaping/description.txt b/mods/mylandscaping/description.txt new file mode 100644 index 00000000..b1287f2c --- /dev/null +++ b/mods/mylandscaping/description.txt @@ -0,0 +1 @@ +This is a mod that lets you put up decorative walls around your gardens, and make pretty hardscapes. diff --git a/mods/mylandscaping/formspec.lua b/mods/mylandscaping/formspec.lua new file mode 100644 index 00000000..ce590a1a --- /dev/null +++ b/mods/mylandscaping/formspec.lua @@ -0,0 +1,87 @@ +form = + 'size[10,10;]'.. + 'background[-0.15,-0.25;10.40,10.75;mylandscaping_background.png]'.. + 'button[0,0;2.5,1;retain;Retaining Walls]'.. + 'button[2.5,0;2.5,1;column;Columns]'.. + 'button[5,0;2.5,1;patio;Patio Pavers]'.. + 'button[7.5,0;2.5,1;deco;Deco Walls]' + +input = + 'label[3,4.5;Input]'.. + 'list[context;input;3,5;1,1;]'.. + 'label[4,4.5;Dye]'.. + 'list[context;dye;4,5;1,1;]'.. + --Output + 'label[6,4.5;Output]'.. + 'list[context;output;6,5;1,1;]'.. + --Players Inven + 'list[current_player;main;1,6;8,4;]' + +retaining_walls = + form.. + 'label[1,2.75;Freeport]'.. + 'label[1,3.75;Madison]'.. + 'label[1,1.75;Adaridge]'.. + --Freeport walls + 'item_image_button[3,2.5;1,1;mylandscaping:fwall_left_cement;fwall1; ]'.. + 'item_image_button[4,2.5;1,1;mylandscaping:fwall_middle_cement;fwall2; ]'.. + 'item_image_button[5,2.5;1,1;mylandscaping:fwall_right_cement;fwall3; ]'.. + 'item_image_button[6,2.5;1,1;mylandscaping:fwall_corner_cement;fwall4; ]'.. + --Madison walls + 'item_image_button[3,3.5;1,1;mylandscaping:mwall_middle_cement;mwall1; ]'.. + 'item_image_button[4,3.5;1,1;mylandscaping:mwall_icorner_cement;mwall2; ]'.. + 'item_image_button[5,3.5;1,1;mylandscaping:mwall_ocorner_cement;mwall3; ]'.. + --Adaridge walls + 'item_image_button[3,1.5;1,1;mylandscaping:awall_left_cement;awall1; ]'.. + 'item_image_button[4,1.5;1,1;mylandscaping:awall_middle_cement;awall2; ]'.. + 'item_image_button[5,1.5;1,1;mylandscaping:awall_right_cement;awall3; ]'.. + 'item_image_button[6,1.5;1,1;mylandscaping:awall_icorner_cement;awall4; ]'.. + 'item_image_button[7,1.5;1,1;mylandscaping:awall_ocorner_cement;awall5; ]'.. + input + +columns = --Although all the columns are in the wall files they get their own menu. + form.. + 'label[.75,1;Columns are compatible with all walls.]'.. + 'label[.75,2.75;Freeport]'.. +-- 'label[.75,3.75;Madison]'.. + 'label[.75,1.75;Adaridge]'.. + 'item_image_button[2,2.5;1,1;mylandscaping:fwall_column_m_t_cement;fcolumn1; ]'.. + 'item_image_button[3,2.5;1,1;mylandscaping:fwall_column_ic_t_cement;fcolumn2; ]'.. + 'item_image_button[4,2.5;1,1;mylandscaping:fwall_column_oc_t_cement;fcolumn3; ]'.. + 'item_image_button[2,1.5;1,1;mylandscaping:awall_column_m_t_cement;acolumn1; ]'.. + 'item_image_button[3,1.5;1,1;mylandscaping:awall_column_ic_t_cement;acolumn2; ]'.. + 'item_image_button[4,1.5;1,1;mylandscaping:awall_column_oc_t_cement;acolumn3; ]'.. + 'label[6.5,1;Column toppers]'.. + 'item_image_button[6,1.5;1,1;mylandscaping:column_t_sphere_cement;column_sphere; ]'.. + 'item_image_button[7,1.5;1,1;mylandscaping:column_t_dragon_cement;column_dragon; ]'.. + 'item_image_button[8,1.5;1,1;mylandscaping:column_t_suzanne_cement;column_suzanne; ]'.. + 'item_image_button[9,1.5;1,1;mylandscaping:column_t_cross_cement;column_cross; ]'.. + input + +patio_pavers = + form.. + 'label[1,1.5;Place pavers on top of sand]'.. + 'label[1,2;to achieve best fit, and to be]'.. + 'label[1,2.5;able to place patio decorations.]'.. + 'item_image_button[5.5,1.5;1,1;mylandscaping:stone_squarecement;patio1; ]'.. + 'item_image_button[6.5,1.5;1,1;mylandscaping:stone_square_smcement;patio2; ]'.. + 'item_image_button[7.5,1.5;1,1;mylandscaping:stone_square_xsmcement;patio7; ]'.. + 'item_image_button[8.5,1.5;1,1;mylandscaping:stone_paverscement;patio3; ]'.. + 'item_image_button[6,2.5;1,1;mylandscaping:stone_ashlarcement;patio4; ]'.. + 'item_image_button[7,2.5;1,1;mylandscaping:stone_flagstonecement;patio5; ]'.. + 'item_image_button[8,2.5;1,1;mylandscaping:stone_pinwheelcement;patio6; ]'.. + input + +deco_walls = + form.. + 'image_button[2,1.5;1,1;mylandscaping_deco_scallop.png;deco1;]'.. + 'tooltip[deco1;Scalloped decorative wall]'.. + 'image_button[3,1.5;1,1;mylandscaping_deco_flat.png;deco2;]'.. + 'tooltip[deco2;Flat decorative wall]'.. + 'image_button[4,1.5;1,1;mylandscaping_deco_peak.png;deco3;]'.. + 'tooltip[deco3;Peaked decorative wall]'.. + 'image_button[5,1.5;1,1;mylandscaping_deco_random.png;deco4;]'.. + 'tooltip[deco4;Random decorative wall]'.. + 'image_button[6,1.5;1,1;mylandscaping_deco_column.png;deco5;]'.. + 'tooltip[deco5;Decorative column]'.. + input diff --git a/mods/mylandscaping/init.lua b/mods/mylandscaping/init.lua new file mode 100644 index 00000000..45765478 --- /dev/null +++ b/mods/mylandscaping/init.lua @@ -0,0 +1,19 @@ +mylandscaping = {} +if minetest.settings:get_bool('mylandscaping.creative') then + ml_visible = 0 +else + ml_visible = 1 +end + +--Load File +dofile(minetest.get_modpath('mylandscaping')..'/walls_freeport.lua') +dofile(minetest.get_modpath('mylandscaping')..'/walls_madison.lua') +dofile(minetest.get_modpath('mylandscaping')..'/walls_adaridge.lua') +dofile(minetest.get_modpath('mylandscaping')..'/walls_deco.lua') +dofile(minetest.get_modpath('mylandscaping')..'/stones.lua') +dofile(minetest.get_modpath('mylandscaping')..'/recipes.lua') +dofile(minetest.get_modpath('mylandscaping')..'/machine.lua') +dofile(minetest.get_modpath('mylandscaping')..'/mixer.lua') +dofile(minetest.get_modpath('mylandscaping')..'/concrete.lua') +dofile(minetest.get_modpath('mylandscaping')..'/formspec.lua') +dofile(minetest.get_modpath('mylandscaping')..'/toppers.lua') diff --git a/mods/mylandscaping/machine.lua b/mods/mylandscaping/machine.lua new file mode 100644 index 00000000..23b02008 --- /dev/null +++ b/mods/mylandscaping/machine.lua @@ -0,0 +1,585 @@ +local material = {} +local block = {} +local make_ok = false +local anzahl = 0 +local material2 = {} +local stone = {} +local deco = {} + + +local color_tab = { +{'black', 'Black', 'dye:black'}, +{'blue', 'Blue', 'dye:blue'}, +{'brown', 'Brown', 'dye:brown'}, +{'cyan', 'Cyan', 'dye:cyan'}, +{'dark_green', 'Dark Green', 'dye:dark_green'}, +{'dark_grey', 'Dark Grey', 'dye:dark_grey'}, +{'green', 'Green', 'dye:green'}, +{'grey', 'Grey', 'dye:grey'}, +{'magenta', 'Magenta', 'dye:magenta'}, +{'orange', 'Orange', 'dye:orange'}, +{'pink', 'Pink', 'dye:pink'}, +{'red', 'Red', 'dye:red'}, +{'violet', 'Violet', 'dye:violet'}, +{'white', 'White', 'dye:white'}, +{'yellow', 'Yellow', 'dye:yellow'}, +{'cement', '', ''}, +} + +minetest.register_node('mylandscaping:machine', { + description = 'Concrete Forms', + drawtype = 'mesh', + mesh = 'mylandscaping_cement_mixer.obj', + tiles = { + {name='mylandscaping_tex3.png'},{name='mylandscaping_tex1.png'}, + {name='default_gravel.png'},{name='mylandscaping_tex2.png'}}, + groups = {oddly_breakable_by_hand=2}, + paramtype = 'light', + paramtype2 = 'facedir', + selection_box = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.5, 1.1, 0.5, 0.5}, + {1.1, -0.5, -0.1, 1.5, -0.3, 0.5} + } + }, + collision_box = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.5, 1.1, 0.5, 0.5}, + {1.1, -0.5, -0.1, 1.5, -0.3, 0.5} + } + }, + + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + if player:get_player_name() == meta:get_string('owner') and + inv:is_empty('input') and + inv:is_empty('dye') and + inv:is_empty('output') then + return true + else + return false + end + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local input = stack:get_name() + if listname == 'input' then + if input == 'mylandscaping:concrete' or input == 'mylandscaping:concrete_bag' then + return 99 + else + return 0 + end + elseif listname == 'dye' then + if minetest.get_item_group(input, 'dye') > 0 then + return 99 + else + return 0 + end + elseif listname == 'output' then + return 0 + end + end, + + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string('owner',placer:get_player_name()) + meta:set_string('infotext','Concrete Mixer (owned by '..placer:get_player_name()..')') + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('formspec', retaining_walls) + meta:set_string('infotext', 'Concrete Mixer') + local inv = meta:get_inventory() + inv:set_size('input', 1) + inv:set_size('output', 1) + inv:set_size('dye', 1) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if fields['retain'] then + meta:set_string('formspec', retaining_walls) + elseif fields['patio'] then + meta:set_string('formspec', patio_pavers) + elseif fields['deco'] then + meta:set_string('formspec', deco_walls) + elseif fields['column'] then + meta:set_string('formspec', columns) + end + + for i in ipairs (color_tab) do + local col = color_tab[i][1] + local coldesc = color_tab[i][2] + local dyecol = color_tab[i][3] + + if fields['awall1'] + or fields['awall2'] + or fields['awall3'] + or fields['awall4'] + or fields['awall5'] + then + + if fields['awall1'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:awall_left_' + if inv:is_empty('input') then + return + end + end + if fields['awall2'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:awall_middle_' + if inv:is_empty('input') then + return + end + end + if fields['awall3'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:awall_right_' + if inv:is_empty('input') then + return + end + end + if fields['awall4'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:awall_icorner_' + if inv:is_empty('input') then + return + end + end + if fields['awall5'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:awall_ocorner_' + if inv:is_empty('input') then + return + end + end + local instack = inv:get_stack('input', 1) + local outstack = inv:get_stack('output', 1) + local dyestack = inv:get_stack('dye', 1) + --------------------------------------------------------------------- + if instack:get_name()== 'mylandscaping:concrete_bag' and dyestack:get_name()== dyecol + or instack:get_name()== 'mylandscaping:concrete' and dyestack:get_name()== dyecol then + material = col + make_ok = true + end + --------------------------------------------------------------------- + if make_ok == true then + local give = {} + if inv:room_for_item('output', block..col) then + inv:add_item('output', block..col..' '..anzahl) + instack:take_item() + inv:set_stack('input',1,instack) + if dyestack:get_name() == 'dye:'..col then + dyestack:take_item() + inv:set_stack('dye',1,dyestack) + end + end + end + end + --------------------------------------------------------------------- + if fields['fwall1'] + or fields['fwall2'] + or fields['fwall3'] + or fields['fwall4'] + then + + if fields['fwall1'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:fwall_left_' + if inv:is_empty('input') then + return + end + end + if fields['fwall2'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:fwall_middle_' + if inv:is_empty('input') then + return + end + end + if fields['fwall3'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:fwall_right_' + if inv:is_empty('input') then + return + end + end + if fields['fwall4'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:fwall_corner_' + if inv:is_empty('input') then + return + end + end + local instack = inv:get_stack('input', 1) + local outstack = inv:get_stack('output', 1) + local dyestack = inv:get_stack('dye', 1) + --------------------------------------------------------------------- + if instack:get_name()== 'mylandscaping:concrete_bag' and dyestack:get_name()== dyecol + or instack:get_name()== 'mylandscaping:concrete' and dyestack:get_name()== dyecol then + material = col + make_ok = true + end + --------------------------------------------------------------------- + if make_ok == true then + local give = {} + if inv:room_for_item('output', block..col) then + inv:add_item('output', block..col..' '..anzahl) + instack:take_item() + inv:set_stack('input',1,instack) + if dyestack:get_name() == 'dye:'..col then + dyestack:take_item() + inv:set_stack('dye',1,dyestack) + end + end + end + end + --------------------------------------------------------------------- + if fields['mwall1'] + or fields['mwall2'] + or fields['mwall3'] + then + + if fields['mwall1'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:mwall_middle_' + if inv:is_empty('input') then + return + end + end + if fields['mwall2'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:mwall_icorner_' + if inv:is_empty('input') then + return + end + end + if fields['mwall3'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:mwall_ocorner_' + if inv:is_empty('input') then + return + end + end + local instack = inv:get_stack('input', 1) + local outstack = inv:get_stack('output', 1) + local dyestack = inv:get_stack('dye', 1) + --------------------------------------------------------------------- + if instack:get_name()== 'mylandscaping:concrete_bag' and dyestack:get_name()== dyecol + or instack:get_name()== 'mylandscaping:concrete' and dyestack:get_name()== dyecol then + material = col + make_ok = true + end + --------------------------------------------------------------------- + if make_ok == true then + local give = {} + if inv:room_for_item('output', block..col) then + inv:add_item('output', block..col..' '..anzahl) + instack:take_item() + inv:set_stack('input',1,instack) + if dyestack:get_name() == 'dye:'..col then + dyestack:take_item() + inv:set_stack('dye',1,dyestack) + end + end + end + end + --------------------------------------------------------------------- + --all columns here, possible decorative caps too. + if fields['acolumn1'] + or fields['acolumn2'] + or fields['acolumn3'] + or fields['fcolumn1'] + or fields['fcolumn2'] + or fields['fcolumn3'] + or fields['mcolumn1'] + or fields['mcolumn2'] + or fields['mcolumn3'] + or fields['column_sphere'] + or fields['column_dragon'] + or fields['column_suzanne'] + or fields['column_cross'] + then + if fields['acolumn1'] then + make_ok = false + anzahl = 1 + block = 'mylandscaping:awall_column_m_t_' + if inv:is_empty('input') then + return + end + end + if fields['acolumn2'] then + make_ok = false + anzahl = 1 + block = 'mylandscaping:awall_column_ic_t_' + if inv:is_empty('input') then + return + end + end + if fields['acolumn3'] then + make_ok = false + anzahl = 1 + block = 'mylandscaping:awall_column_oc_t_' + if inv:is_empty('input') then + return + end + end + if fields['fcolumn1'] then + make_ok = false + anzahl = 1 + block = 'mylandscaping:fwall_column_m_t_' + if inv:is_empty('input') then + return + end + end + if fields['fcolumn2'] then + make_ok = false + anzahl = 1 + block = 'mylandscaping:fwall_column_ic_t_' + if inv:is_empty('input') then + return + end + end + if fields['fcolumn3'] then + make_ok = false + anzahl = 1 + block = 'mylandscaping:fwall_column_oc_t_' + if inv:is_empty('input') then + return + end + end + if fields['column_sphere'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:column_t_sphere_' + if inv:is_empty('input') then + return + end + end + if fields['column_dragon'] then + make_ok = false + anzahl = 1 + block = 'mylandscaping:column_t_dragon_' + if inv:is_empty('input') then + return + end + end + if fields['column_suzanne'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:column_t_suzanne_' + if inv:is_empty('input') then + return + end + end + if fields['column_cross'] then + make_ok = false + anzahl = 2 + block = 'mylandscaping:column_t_cross_' + if inv:is_empty('input') then + return + end + end + local instack = inv:get_stack('input', 1) + local outstack = inv:get_stack('output', 1) + local dyestack = inv:get_stack('dye', 1) + --------------------------------------------------------------------- + + if instack:get_name()== 'mylandscaping:concrete_bag' and dyestack:get_name()== dyecol + or instack:get_name()== 'mylandscaping:concrete' and dyestack:get_name()== dyecol then + material = col + make_ok = true + end + if make_ok == true then + local give = {} + if inv:room_for_item('output', block..col) then + inv:add_item('output', block..col..' '..anzahl) + instack:take_item() + inv:set_stack('input',1,instack) + if dyestack:get_name() == 'dye:'..col then + dyestack:take_item() + inv:set_stack('dye',1,dyestack) + end + end + end + end + + if fields['patio1'] + or fields['patio2'] + or fields['patio3'] + or fields['patio4'] + or fields['patio5'] + or fields['patio6'] + or fields['patio7'] + then + + if fields['patio1'] then + make_ok = false + anzahl = 3 + stone = 'mylandscaping:stone_square' + if inv:is_empty('input') then + return + end + end + if fields['patio2'] then + make_ok = false + anzahl = 3 + stone = 'mylandscaping:stone_square_sm' + if inv:is_empty('input') then + return + end + end + if fields['patio7'] then + make_ok = false + anzahl = 3 + stone = 'mylandscaping:stone_square_xsm' + if inv:is_empty('input') then + return + end + end + if fields['patio3'] then + make_ok = false + anzahl = 3 + stone = 'mylandscaping:stone_pavers' + if inv:is_empty('input') then + return + end + end + if fields['patio4'] then + make_ok = false + anzahl = 3 + stone = 'mylandscaping:stone_ashlar' + if inv:is_empty('input') then + return + end + end + if fields['patio5'] then + make_ok = false + anzahl = 3 + stone = 'mylandscaping:stone_flagstone' + if inv:is_empty('input') then + return + end + end + if fields['patio6'] then + make_ok = false + anzahl = 3 + stone = 'mylandscaping:stone_pinwheel' + if inv:is_empty('input') then + return + end + end + local instack = inv:get_stack('input', 1) + local outstack = inv:get_stack('output', 1) + local dyestack = inv:get_stack('dye', 1) + + if instack:get_name()== 'mylandscaping:concrete_bag' and dyestack:get_name()== dyecol + or instack:get_name()== 'mylandscaping:concrete' and dyestack:get_name()== dyecol then + make_ok = true + end + --------------------------------------------------------------------- + if make_ok == true then + local give = {} + if inv:room_for_item('output', stone..col) then + inv:add_item('output', stone..col..' '..anzahl) + instack:take_item() + inv:set_stack('input',1,instack) + if dyestack:get_name() == 'dye:'..col then + dyestack:take_item() + inv:set_stack('dye',1,dyestack) + end + end + end + end + --------------------------------------------------------------------- + if fields['deco1'] + or fields['deco2'] + or fields['deco3'] + or fields['deco4'] + or fields['deco5'] + then + + if fields['deco1'] then + make_ok = false + anzahl = 4 + deco = 'mylandscaping:deco_wall_s_' + if inv:is_empty('input') then + return + end + end + if fields['deco2'] then + make_ok = false + anzahl = 4 + deco = 'mylandscaping:deco_wall_f_' + if inv:is_empty('input') then + return + end + end + if fields['deco3'] then + make_ok = false + anzahl = 4 + deco = 'mylandscaping:deco_wall_p_' + if inv:is_empty('input') then + return + end + end + if fields['deco4'] then + make_ok = false + anzahl = 4 + deco = 'mylandscaping:deco_wall_r_' + if inv:is_empty('input') then + return + end + end + if fields['deco5'] then + make_ok = false + anzahl = 4 + deco = 'mylandscaping:deco_column_' + if inv:is_empty('input') then + return + end + end + + local instack = inv:get_stack('input', 1) + local outstack = inv:get_stack('output', 1) + local dyestack = inv:get_stack('dye', 1) + + if instack:get_name()== 'mylandscaping:concrete_bag' and dyestack:get_name()== dyecol + or instack:get_name()== 'mylandscaping:concrete' and dyestack:get_name()== dyecol then + make_ok = true + end + --------------------------------------------------------------------- + if make_ok == true then + local give = {} + if inv:room_for_item('output', deco..col) then + inv:add_item('output', deco..col..' '..anzahl) + instack:take_item() + inv:set_stack('input',1,instack) + if dyestack:get_name() == 'dye:'..col then + dyestack:take_item() + inv:set_stack('dye',1,dyestack) + end + end + end + end + end +end + }) diff --git a/mods/mylandscaping/mixer.lua b/mods/mylandscaping/mixer.lua new file mode 100644 index 00000000..7f00e698 --- /dev/null +++ b/mods/mylandscaping/mixer.lua @@ -0,0 +1,123 @@ +minetest.register_node('mylandscaping:mixer', { + description = 'Concrete Mixer', + drawtype = 'mesh', + mesh = 'mylandscaping_crusher.obj', + tiles = { + {name='mylandscaping_tex1.png'},{name='mylandscaping_supports.png'}, + {name='mylandscaping_base.png'},{name='mylandscaping_hopper.png'}, + {name='mylandscaping_crusher.png'}}, + groups = {oddly_breakable_by_hand=2}, + paramtype = 'light', + paramtype2 = 'facedir', + selection_box = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.5, 1.5, 1.5, 0.5}, + } + }, + collision_box = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.5, 1.5, 1.5, 0.5}, + } + }, + +can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + if player:get_player_name() == meta:get_string('owner') and + inv:is_empty('cobble') and + inv:is_empty('gravel') and + inv:is_empty('concrete') and + inv:is_empty('sand') then + return true + else + return false + end +end, + +after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + local timer = minetest.get_node_timer(pos) + meta:set_string('owner',placer:get_player_name()) + meta:set_string('infotext','Cement Mixer (owned by '..placer:get_player_name()..')') + timer:start(10) + end, + +on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('formspec', 'size[9,10;]'.. + 'background[-0.15,-0.25;9.40,10.75;mylandscaping_background.png]'.. + --Gravel + 'label[0.5,1;Cobble]'.. + 'label[0.5,1.5;Crusher]'.. + 'label[2.5,2;Cobble]'.. + 'list[context;cobble;2.5,1;1,1;]'.. + 'list[context;gravel;5.5,1;1,1;]'.. + 'label[6.5,1;Gravel]'.. + --Concrete + 'label[5,0.5;Concrete Mixer]'.. + 'list[context;sand;5.5,2.5;1,1;]'.. + 'label[6.5,2.5;Sand]'.. + 'list[context;concrete;5.5,4.5;1,1;]'.. + 'label[6.5,4.5;Output]'.. + --Players Inven + 'list[current_player;main;0.5,6;8,4;]') + meta:set_string('infotext', 'Concrete Mixer') + local inv = meta:get_inventory() + inv:set_size('cobble', 1) + inv:set_size('gravel', 1) + inv:set_size('concrete', 1) + inv:set_size('sand', 1) +end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local input = stack:get_name() + if listname == 'cobble' then + if input == 'default:cobble' or minetest.get_item_group(input, 'ml') > 0 then + return 99 + else + return 0 + end + elseif listname == 'gravel' then + if input ~= 'default:gravel' then + return 0 + else + return 99 + end + elseif listname == 'sand' then + if minetest.get_item_group(input, 'sand') > 0 then + return 99 + else + return 0 + end + elseif listname == 'concrete' then + return 0 + end + end, + +on_timer = function(pos) + local timer = minetest.get_node_timer(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local cobble = inv:get_stack('cobble', 1) + local gravel = inv:get_stack('gravel', 1) + local sand = inv:get_stack('sand', 1) + local cobble_inv= cobble:get_name() + local sand_inv = sand:get_name() +---------------------------------------------------------------------- + if cobble:get_name() == 'default:cobble' or minetest.get_item_group(cobble_inv, 'ml') > 0 then + inv:add_item('gravel','default:gravel') + cobble:take_item() + inv:set_stack('cobble',1,cobble) + end + if gravel:get_name() == 'default:gravel' and minetest.get_item_group(sand_inv, 'sand') > 0 then + inv:add_item('concrete','mylandscaping:concrete_bag') + gravel:take_item() + inv:set_stack('gravel',1,gravel) + sand:take_item() + inv:set_stack('sand',1,sand) + end + timer:start(10) +end, +}) diff --git a/mods/mylandscaping/mod.conf b/mods/mylandscaping/mod.conf new file mode 100644 index 00000000..e490401b --- /dev/null +++ b/mods/mylandscaping/mod.conf @@ -0,0 +1,4 @@ +name = mylandscaping +description = This is a mod that lets you put up decorative walls around your gardens, and make pretty hardscapes. +depends = default, bucket +optional_depends = myconcrete diff --git a/mods/mylandscaping/models/mylandscaping_blocka_ic_b.obj b/mods/mylandscaping/models/mylandscaping_blocka_ic_b.obj new file mode 100644 index 00000000..3ec69f8d --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_ic_b.obj @@ -0,0 +1,200 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_C_B_Cube.016 +v 0.248631 -0.500000 -0.100000 +v 0.248631 -0.500000 -0.300000 +v 0.248631 -0.100000 -0.300000 +v 0.248631 -0.100000 -0.100000 +v 0.048631 0.300000 -0.100000 +v 0.148631 0.300000 -0.700000 +v 0.148631 -0.100000 -0.700000 +v 0.148631 -0.100000 -0.500000 +v 0.048631 0.500000 -0.500000 +v 0.048631 0.100000 -0.500000 +v 0.048631 0.500000 -0.150000 +v 0.148631 0.100000 -0.150000 +v 0.148631 0.100000 -0.500000 +v 0.148631 -0.100000 -0.150000 +v 0.148631 0.500000 -0.500000 +v 0.148631 0.500000 -0.700000 +v 0.148631 0.300000 -0.500000 +v 0.048631 -0.100000 -0.300000 +v 0.048631 -0.100000 -0.500000 +v 0.048631 0.100000 -0.150000 +v 0.048631 -0.100000 -0.150000 +v 0.048631 -0.100000 -0.700000 +v 0.048631 0.300000 -0.500000 +v 0.048631 0.500000 -0.700000 +v 0.298631 -0.500000 -0.250000 +v 0.048631 0.300000 -0.700000 +v -0.251369 0.500000 -0.500000 +v -0.251369 0.500000 -0.150000 +v -0.251369 -0.100000 -0.700000 +v -0.251369 0.500000 -0.700000 +v 0.298631 -0.100000 -0.250000 +v 0.698631 -0.100000 -0.250000 +v 0.048631 0.500000 0.050000 +v 0.048631 0.500000 -0.150000 +v -0.251369 0.300000 -0.700000 +v 0.698631 -0.500000 -0.250000 +v -0.101369 -0.100000 -0.150000 +v -0.101369 0.300000 -0.150000 +v 0.298631 0.300000 -0.150000 +v 0.298631 -0.100000 -0.150000 +v 0.298631 -0.100000 -0.050000 +v 0.698631 -0.100000 -0.050000 +v 0.298631 -0.500000 -0.250000 +v 0.098631 -0.500000 -0.250000 +v 0.098631 -0.100000 -0.250000 +v 0.298631 -0.100000 -0.250000 +v 0.098631 0.300000 -0.150000 +v 0.298631 0.500000 -0.150000 +v 0.098631 0.500000 -0.150000 +v 0.298631 0.300000 -0.150000 +v 0.098631 0.500000 0.240000 +v 0.098631 0.500000 -0.150000 +v 0.298631 0.500000 -0.150000 +v 0.298631 0.500000 0.240000 +v -0.251369 0.500000 0.240000 +v -0.251369 0.500000 0.050000 +v 0.048631 0.500000 0.050000 +v 0.048631 0.500000 0.240000 +v -0.251369 0.500000 -0.150000 +v -0.251369 0.500000 0.050000 +v 0.048631 0.500000 0.240000 +v 0.048631 0.500000 -0.150000 +v 0.098631 0.300000 -0.150000 +v 0.048631 0.300000 -0.150000 +v 0.248631 -0.100000 -0.300000 +v 0.248631 -0.100000 -0.100000 +v 0.248631 -0.100000 -0.250000 +v 0.248631 -0.100000 -0.050000 +v -0.251369 -0.100000 0.240000 +v -0.251369 0.300000 0.240000 +v -0.251369 0.500000 0.240000 +v -0.251369 0.300000 0.240000 +v 0.298631 -0.100000 0.240000 +v 0.298631 0.300000 0.240000 +v 0.298631 0.500000 0.240000 +v 0.298631 0.300000 0.240000 +v -0.151369 -0.500000 -0.300000 +v -0.151369 -0.100000 -0.300000 +v 0.698631 -0.100000 0.150000 +v 0.698631 -0.500000 0.150000 +v -0.151369 -0.100000 0.150000 +v -0.151369 -0.500000 0.150000 +v -0.151369 -0.500000 -0.250000 +v -0.151369 -0.500000 0.150000 +v 0.048631 -0.100000 0.239791 +v -0.251369 -0.100000 0.239791 +v 0.298631 -0.100000 -0.050000 +v 0.698631 -0.100000 -0.050000 +v 0.298631 -0.100000 0.150000 +v 0.698631 -0.100000 0.150000 +vt -0.000000 0.571429 +vt 0.333333 0.571429 +vt 0.333333 0.500000 +vt -0.000000 0.500000 +vt 0.666667 0.571429 +vt 0.666667 0.714286 +vt 0.583333 0.714286 +vt 0.583333 0.571429 +vt 0.333333 0.714286 +vt 0.250000 0.714286 +vt 0.250000 0.571429 +vt -0.000000 0.714286 +vt 1.000000 0.714286 +vt 0.666667 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.428571 +vt 0.750000 0.428571 +vt 0.750000 0.714286 +vt 0.666667 0.428571 +vt 0.333333 0.428571 +vt -0.000000 0.428571 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.166667 0.857143 +vt 0.166667 0.714286 +vt 0.333333 0.857143 +vt 0.333333 0.642857 +vt 0.666667 0.642857 +vt 0.333333 0.625000 +vt 0.666667 0.625000 +vt 0.833333 0.071429 +vt 1.000000 0.071429 +vt 1.000000 -0.000000 +vt 0.833333 0.000000 +vt 0.854167 0.071429 +vt 0.854167 0.000000 +vt 0.250000 0.857143 +vt 0.250000 1.000000 +vt 0.416667 0.571429 +vt 0.416667 0.428571 +vt 0.083333 0.714286 +vt 0.083333 0.571429 +vt 0.416667 0.714286 +vt -0.000000 -0.000000 +vt -0.000000 0.071429 +vt 0.916667 0.428571 +vt 0.916667 0.142857 +vt 1.000000 0.142857 +vt 0.687500 -0.000000 +vt 0.687500 0.071429 +vt 0.833333 0.142857 +vt 0.083333 0.428571 +vt 0.083333 0.142857 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -0.000000 1.000000 +vn 0.000000 1.000000 -0.000000 +vn 1.000000 -0.000000 -0.000000 +vn 0.000000 -1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +g Adaridge_C_B_Cube.016_Face1 +s off +f 6/1/1 7/2/1 22/3/1 26/4/1 +f 17/5/2 15/6/2 9/7/2 23/8/2 +f 15/2/3 16/9/3 24/10/3 9/11/3 +f 9/11/3 24/10/3 30/12/3 27/1/3 +f 11/13/3 9/6/3 27/14/3 28/15/3 +f 26/13/1 22/16/1 29/17/1 35/18/1 +f 3/19/4 4/5/4 1/2/4 2/20/4 +f 6/20/4 17/2/4 8/1/4 7/21/4 +f 9/22/4 11/23/4 20/9/4 10/6/4 +f 12/9/4 14/2/4 8/5/4 13/6/4 +f 15/24/4 17/25/4 6/9/4 16/26/4 +f 4/26/3 3/24/3 18/25/3 21/9/3 +f 8/6/2 17/9/2 23/27/2 19/28/2 +f 12/6/3 13/9/3 10/29/3 20/30/3 +f 31/22/1 32/23/1 36/9/1 25/6/1 +f 8/31/5 14/32/5 21/33/5 19/34/5 +f 7/35/5 8/32/5 19/33/5 22/36/5 +f 16/23/1 6/26/1 26/37/1 24/38/1 +f 33/19/3 34/5/3 59/39/3 60/40/3 +f 58/2/3 57/9/3 56/41/3 55/42/3 +f 24/6/1 26/5/1 35/39/1 30/43/1 +f 38/22/1 39/23/1 40/9/1 37/6/1 +f 32/9/3 31/12/3 41/1/3 42/2/3 +f 45/19/1 46/5/1 43/2/1 44/20/1 +f 48/24/1 50/25/1 47/9/1 49/26/1 +f 51/20/3 54/2/3 53/1/3 52/21/3 +f 51/44/3 52/34/3 62/31/3 61/45/3 +f 62/16/1 52/46/1 63/47/1 64/48/1 +f 41/49/3 31/34/3 67/31/3 68/50/3 +f 35/34/6 29/33/6 69/48/6 70/51/6 +f 30/33/6 35/48/6 72/51/6 71/34/6 +f 71/33/2 72/48/2 76/51/2 75/34/2 +f 70/34/2 69/33/2 73/48/2 74/51/2 +f 3/23/1 2/9/1 77/6/1 78/22/1 +f 36/20/4 32/19/4 79/6/4 80/9/4 +f 80/33/2 79/48/2 81/51/2 82/34/2 +f 78/51/6 77/34/6 82/33/6 81/48/6 +f 50/19/4 48/5/4 75/2/4 76/20/4 +f 39/13/4 74/6/4 73/19/4 40/16/4 +f 36/47/5 80/46/5 84/52/5 83/53/5 +f 29/47/5 22/46/5 85/52/5 86/53/5 +f 88/2/3 87/1/3 89/21/3 90/20/3 +l 11 5 +l 21 5 +l 65 3 +l 4 66 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_ic_t.obj b/mods/mylandscaping/models/mylandscaping_blocka_ic_t.obj new file mode 100644 index 00000000..b4082804 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_ic_t.obj @@ -0,0 +1,256 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_C_T_Cube.020 +v 0.048631 -0.500000 -0.300000 +v 0.048631 -0.100000 -0.300000 +v -0.351369 -0.100000 -0.300000 +v -0.351369 -0.500000 -0.300000 +v -0.513086 0.500000 -0.500000 +v -0.513086 0.600000 -0.500000 +v -0.015393 0.500000 -0.500000 +v -0.015393 0.600000 -0.500000 +v -0.513086 0.500000 0.512788 +v -0.513086 0.600000 0.512788 +v -0.015393 0.500000 0.512788 +v -0.015393 0.600000 0.512788 +v 0.493327 0.500000 0.513086 +v 0.493327 0.600000 0.513086 +v 0.493327 0.500000 0.015393 +v 0.493327 0.600000 0.015393 +v -0.006699 0.600000 0.015393 +v -0.006699 0.500000 0.015393 +v -0.006699 0.600000 0.513086 +v -0.006699 0.500000 0.513086 +v 0.048631 -0.500000 -0.300000 +v 0.048631 -0.500000 0.100000 +v 0.048631 -0.100000 -0.300000 +v 0.048631 -0.100000 0.100000 +v -0.351369 -0.100000 0.100000 +v 0.698631 -0.500000 -0.050000 +v -0.351369 -0.100000 -0.300000 +v -0.101369 0.300000 0.050000 +v -0.101369 -0.100000 0.050000 +v 0.298631 -0.100000 -0.050000 +v 0.298631 -0.100000 0.350000 +v 0.098631 -0.100000 0.350000 +v 0.298631 0.500000 0.050000 +v 0.098631 -0.100000 -0.050000 +v 0.298631 -0.500000 -0.050000 +v 0.098631 -0.500000 -0.050000 +v 0.298631 -0.500000 -0.050000 +v 0.698631 -0.500000 -0.050000 +v 0.298631 -0.100000 -0.050000 +v 0.698631 -0.100000 -0.050000 +v 0.698631 -0.100000 0.350000 +v 0.698631 -0.500000 0.350000 +v 0.298631 -0.100000 0.350000 +v 0.298631 0.300000 0.050000 +v 0.298631 -0.100000 0.050000 +v 0.098631 -0.100000 -0.050000 +v 0.098631 -0.100000 0.350000 +v 0.048631 -0.100000 0.350000 +v 0.298631 0.300000 0.050000 +v 0.048631 -0.100000 -0.050000 +v 0.098631 -0.500000 -0.050000 +v 0.048631 -0.500000 -0.050000 +v -0.101369 0.300000 0.050000 +v -0.101369 0.500000 0.050000 +v -0.051369 0.500000 -0.300000 +v -0.051369 0.300000 -0.300000 +v -0.051369 0.300000 -0.700000 +v -0.051369 0.500000 -0.700000 +v -0.051369 0.300000 -0.500000 +v -0.051369 0.100000 -0.500000 +v -0.051369 0.100000 -0.700000 +v -0.051369 0.300000 -0.700000 +v -0.051369 0.100000 -0.300000 +v -0.051369 -0.100000 -0.300000 +v -0.051369 -0.100000 -0.700000 +v -0.051369 0.100000 -0.700000 +v -0.051369 0.500000 -0.100000 +v -0.051369 0.300000 -0.100000 +v -0.051369 0.300000 -0.300000 +v -0.051369 0.500000 -0.300000 +v -0.051369 0.100000 -0.100000 +v -0.051369 -0.100000 -0.100000 +v -0.051369 -0.100000 -0.300000 +v -0.051369 0.100000 -0.300000 +v -0.151369 0.300000 -0.100000 +v -0.151369 0.100000 -0.100000 +v -0.151369 0.100000 -0.500000 +v -0.151369 0.300000 -0.500000 +v -0.051369 0.500000 -0.100000 +v -0.051369 0.500000 0.100000 +v -0.051369 0.100000 0.100000 +v -0.051369 0.100000 -0.100000 +v -0.051369 0.100000 0.100000 +v -0.051369 -0.100000 0.100000 +v -0.051369 -0.100000 -0.100000 +v -0.051369 0.100000 -0.100000 +v -0.151369 0.300000 -0.300000 +v -0.151369 0.300000 -0.700000 +v -0.151369 0.300000 -0.500000 +v -0.151369 0.100000 -0.500000 +v -0.151369 0.100000 -0.300000 +v -0.151369 0.100000 -0.700000 +v -0.151369 0.300000 -0.100000 +v -0.151369 0.300000 -0.300000 +v -0.151369 0.100000 -0.100000 +v -0.151369 0.100000 -0.300000 +v -0.151369 0.500000 -0.100000 +v -0.151369 0.100000 -0.100000 +v -0.351369 -0.100000 0.350000 +v -0.351369 -0.500000 0.350000 +v -0.351369 -0.100000 -0.300000 +v -0.351369 -0.500000 -0.300000 +v -0.351369 -0.500000 -0.050000 +v 0.298631 0.500000 0.450000 +v 0.298631 0.300000 0.450000 +v 0.298631 -0.100000 0.450000 +v 0.298631 0.300000 0.450000 +v -0.451369 0.500000 0.450000 +v -0.451369 0.300000 0.450000 +v -0.451369 -0.100000 0.450000 +v -0.451369 0.300000 0.450000 +v -0.451369 0.300000 -0.700000 +v -0.451369 0.500000 -0.700000 +v -0.451369 0.100000 -0.700000 +v -0.451369 0.300000 -0.700000 +v -0.451369 -0.100000 -0.700000 +v -0.451369 0.100000 -0.700000 +v -0.451369 0.500000 -0.700000 +v -0.451369 0.300000 -0.700000 +v -0.451369 -0.100000 -0.700000 +v -0.451369 0.300000 -0.700000 +v -0.351369 -0.100000 0.350000 +v -0.351369 -0.100000 -0.700000 +v 0.298631 -0.100000 0.350000 +v -0.351369 -0.100000 0.350000 +v -0.051369 0.500000 -0.300000 +v -0.451369 0.500000 -0.300000 +v -0.351369 -0.100000 -0.300000 +v -0.351369 -0.100000 -0.700000 +vt 1.000000 0.714286 +vt 0.666667 0.714286 +vt 0.666667 0.428571 +vt 1.000000 0.428571 +vt 1.000000 0.142857 +vt 0.916667 0.142857 +vt 0.916667 0.428571 +vt -0.000000 0.071429 +vt 0.833333 0.071429 +vt 0.833333 -0.000000 +vt 0.000000 0.000000 +vt 0.083333 0.142857 +vt 0.083333 0.428571 +vt 0.000000 0.428571 +vt 0.000000 0.142857 +vt 0.833333 0.142857 +vt 0.416667 0.071429 +vt 0.416667 0.000000 +vt 0.083333 0.285714 +vt 0.916667 0.285714 +vt 0.500000 0.428571 +vt 0.500000 0.142857 +vt 0.416667 0.142857 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.333333 0.714286 +vt 0.999900 0.999900 +vt 0.999943 0.000057 +vt 0.666667 0.571429 +vt 0.333333 0.571429 +vt 0.333333 0.428571 +vt -0.000000 0.571429 +vt 0.333333 0.857143 +vt 0.166667 0.857143 +vt 0.166667 0.714286 +vt 0.166667 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.857143 +vt -0.000000 0.714286 +vt 0.166667 0.928571 +vt 0.000000 0.928571 +vt -0.000000 0.785714 +vt 0.166667 0.785714 +vt 0.333333 0.642857 +vt 0.000000 0.642857 +vt 0.666667 0.642857 +vt 0.250000 1.000000 +vt 0.250000 0.857143 +vt 0.666667 0.500000 +vt 0.333333 0.500000 +vt 1.000000 -0.000000 +vt 1.000000 0.071429 +vt 1.000000 0.089286 +vt 0.833333 0.089286 +vt 0.875000 0.267857 +vt 0.166667 0.267857 +vt 0.166667 0.214286 +vt 0.812500 0.214286 +vt 0.708333 0.357143 +vt 0.250000 0.357143 +vt 0.312500 0.303571 +vt 0.708333 0.303571 +vn 0.000000 0.000000 1.000000 +vn -0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 -0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +g Adaridge_C_T_Cube.020_Face1 +s off +f 2/1/1 3/2/1 4/3/1 1/4/1 +f 6/4/2 8/5/2 7/6/2 5/7/2 +f 8/8/3 12/9/3 11/10/3 7/11/3 +f 12/12/1 10/13/1 9/14/1 11/15/1 +f 10/16/4 6/15/4 5/8/4 9/9/4 +f 5/13/5 7/7/5 11/6/5 9/12/5 +f 10/6/6 12/7/6 8/13/6 6/12/6 +f 17/17/2 16/9/2 15/10/2 18/18/2 +f 16/5/3 14/4/3 13/7/3 15/6/3 +f 20/19/5 18/20/5 15/6/5 13/12/5 +f 14/6/6 16/7/6 17/21/6 19/22/6 +f 14/16/1 19/23/1 20/17/1 13/9/1 +f 19/14/4 17/15/4 18/12/4 20/13/4 +f 21/2/3 23/24/3 24/25/3 22/26/3 +f 27/24/6 25/2/6 24/1/6 23/27/6 +f 42/5/5 100/16/5 103/10/5 26/28/5 +f 29/3/2 28/4/2 49/1/2 45/2/2 +f 34/24/6 32/2/6 31/1/6 30/27/6 +f 34/29/2 30/30/2 35/31/2 36/3/2 +f 37/2/2 39/24/2 40/25/2 38/26/2 +f 43/24/6 41/2/6 40/1/6 39/27/6 +f 40/1/3 41/2/3 42/3/3 38/4/3 +f 50/7/6 48/6/6 47/5/6 46/4/6 +f 33/29/2 44/2/2 53/26/2 54/30/2 +f 50/13/2 46/14/2 51/15/2 52/12/2 +f 55/31/3 56/30/3 57/32/3 58/14/3 +f 59/26/3 60/33/3 61/34/3 62/35/3 +f 63/3/3 64/29/3 65/30/3 66/31/3 +f 67/34/3 68/36/3 69/37/3 70/38/3 +f 71/26/3 72/33/3 73/34/3 74/35/3 +f 75/29/3 76/2/3 77/26/3 78/30/3 +f 79/30/3 80/26/3 81/39/3 82/32/3 +f 83/33/3 84/25/3 85/36/3 86/34/3 +f 69/38/5 68/34/5 93/40/5 94/41/5 +f 71/34/6 74/38/6 96/42/6 95/43/6 +f 57/32/5 56/30/5 87/44/5 88/45/5 +f 63/2/6 66/26/6 92/44/6 91/46/6 +f 60/25/1 59/47/1 89/48/1 90/33/1 +f 79/31/2 82/3/2 98/49/2 97/50/2 +f 42/28/1 41/5/1 99/16/1 100/10/1 +f 100/28/4 99/5/4 101/16/4 102/10/4 +f 45/2/3 49/3/3 107/4/3 106/1/3 +f 44/26/3 33/30/3 104/29/3 105/2/3 +f 106/51/1 107/52/1 111/9/1 110/10/1 +f 105/52/1 104/5/1 108/16/1 109/9/1 +f 66/30/2 65/26/2 116/39/2 117/32/2 +f 62/31/2 61/30/2 114/32/2 115/14/2 +f 58/26/2 57/30/2 112/29/2 113/2/2 +f 110/51/4 111/53/4 121/54/4 120/10/4 +f 109/53/4 108/5/4 118/16/4 119/54/4 +f 110/55/5 120/56/5 123/57/5 122/58/5 +f 106/59/5 110/60/5 125/61/5 124/62/5 +f 58/2/6 113/24/6 127/25/6 126/26/6 +f 65/26/5 64/2/5 128/24/5 129/25/5 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_l_b.obj b/mods/mylandscaping/models/mylandscaping_blocka_l_b.obj new file mode 100644 index 00000000..6f30d4b6 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_l_b.obj @@ -0,0 +1,223 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_L_B_Cube.002 +v 0.300000 0.300000 -0.148631 +v 0.300000 -0.100000 -0.148631 +v 0.500000 -0.100000 -0.148631 +v 0.500000 0.500000 -0.048631 +v 0.500000 0.500000 -0.148631 +v 0.300000 0.500000 -0.148631 +v 0.500000 0.300000 -0.148631 +v 0.500000 -0.100000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v 0.500000 0.300000 -0.048631 +v 0.300000 0.500000 -0.048631 +v 0.300000 0.300000 -0.048631 +v 0.500000 0.500000 0.251369 +v 0.300000 0.500000 0.251369 +v 0.300000 -0.300000 -0.248631 +v 0.500000 -0.500000 -0.248631 +v 0.300000 -0.500000 -0.248631 +v 0.500000 -0.100000 -0.248631 +v 0.500000 -0.300000 -0.248631 +v -0.100000 -0.500000 -0.248631 +v 0.300000 -0.100000 -0.248631 +v -0.300000 -0.500000 -0.248631 +v -0.300000 -0.100000 -0.248631 +v -0.100000 -0.100000 -0.248631 +v -0.100000 0.300000 -0.048631 +v 0.300000 0.500000 -0.148631 +v -0.100000 0.500000 -0.148631 +v 0.300000 0.300000 -0.148631 +v -0.100000 0.300000 -0.148631 +v -0.700000 0.300000 -0.148631 +v -0.700000 -0.100000 -0.148631 +v -0.500000 -0.100000 -0.148631 +v -0.500000 0.500000 -0.048631 +v -0.500000 0.100000 -0.048631 +v -0.100000 0.500000 -0.048631 +v -0.100000 0.100000 -0.148631 +v -0.500000 0.100000 -0.148631 +v -0.100000 -0.100000 -0.148631 +v -0.500000 0.500000 -0.148631 +v -0.700000 0.500000 -0.148631 +v -0.500000 0.300000 -0.148631 +v 0.500000 -0.100000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v -0.300000 -0.100000 -0.048631 +v -0.500000 -0.100000 -0.048631 +v -0.100000 0.100000 -0.048631 +v -0.100000 -0.100000 -0.048631 +v -0.700000 -0.100000 -0.048631 +v -0.500000 0.300000 -0.048631 +v 0.300000 0.300000 -0.048631 +v -0.700000 0.500000 -0.048631 +v -0.300000 -0.500000 -0.048631 +v 0.500000 -0.500000 -0.048631 +v 0.500000 -0.300000 -0.048631 +v 0.300000 0.500000 -0.048631 +v -0.700000 0.300000 -0.048631 +v -0.500000 0.500000 0.251369 +v -0.100000 0.500000 0.251369 +v 0.500000 -0.100000 0.251369 +v 0.500000 -0.100000 0.251369 +v -0.700000 -0.100000 0.251369 +v -0.700000 0.500000 0.251369 +v -0.300000 -0.500000 0.251369 +v -0.300000 -0.100000 0.251369 +v -0.500000 -0.100000 0.251369 +v -0.100000 -0.100000 0.251369 +v 0.500000 -0.500000 0.251369 +v 0.500000 -0.300000 0.251369 +v 0.500000 0.500000 0.251369 +v 0.500000 0.300000 0.251369 +v -0.700000 0.300000 0.251369 +v 0.500000 -0.500000 -0.248631 +v 0.500000 -0.100000 0.251369 +v 0.500000 -0.300000 -0.248631 +v 0.500000 -0.100000 -0.248631 +v 0.500000 -0.100000 -0.048631 +v 0.200000 -0.100000 0.251369 +v 0.200000 -0.500000 0.251369 +vt -0.000000 0.571429 +vt 0.333333 0.571429 +vt 0.333333 0.500000 +vt -0.000000 0.500000 +vt 0.666667 0.428571 +vt 0.666667 0.571429 +vt 0.583333 0.571429 +vt 0.583333 0.428571 +vt 0.166667 0.857143 +vt -0.000000 0.857143 +vt -0.000000 0.785714 +vt 0.166667 0.785714 +vt 0.333333 0.714286 +vt 0.583333 0.714286 +vt 0.333333 0.428571 +vt -0.000000 0.428571 +vt 0.166667 0.714286 +vt 0.333333 0.857143 +vt 0.666667 0.714286 +vt 0.666667 1.000000 +vt 0.583333 1.000000 +vt 0.854167 0.071429 +vt 1.000000 0.071429 +vt 1.000000 0.000000 +vt 0.854167 0.000000 +vt 0.333333 1.000000 +vt 0.250000 0.857143 +vt 0.250000 1.000000 +vt 0.606510 0.428339 +vt 0.606510 0.571661 +vt 0.534849 0.571661 +vt 0.534849 0.428339 +vt 0.250000 0.428571 +vt 0.250000 0.571429 +vt 0.666667 0.500000 +vt 0.000000 0.714286 +vt -0.000000 0.642857 +vt 0.333333 0.642857 +vt 0.250000 0.714286 +vt 1.000000 0.714286 +vt 1.000000 0.500000 +vt 1.000000 0.428571 +vt 0.750000 0.428571 +vt 0.750000 0.714286 +vt 0.166667 0.571429 +vt 0.166667 0.428571 +vt 1.000000 1.000000 +vt 0.500000 0.571429 +vt 0.500000 0.428571 +vt 0.666667 0.642857 +vt 0.333333 0.625000 +vt 0.666667 0.625000 +vt 0.833333 0.071429 +vt 0.833333 0.000000 +vt 0.166667 1.000000 +vt -0.000000 1.000000 +vt 0.083333 0.571429 +vt 0.083333 0.428571 +vt 0.416667 0.714286 +vt 0.416667 0.571429 +vt 0.854167 0.142857 +vt 1.000000 0.142857 +vt 0.833333 0.142857 +vt 0.833333 1.000000 +vt 0.666667 0.785714 +vt 0.833333 0.785714 +vt 0.750000 1.000000 +vt 0.916667 0.000000 +vt 0.916667 0.142857 +vt 1.000000 0.107143 +vt 0.833333 0.107143 +vt 0.666667 0.767857 +vt 1.000000 0.767857 +vt 0.083333 0.142857 +vt 0.916667 0.267857 +vt 0.916667 0.446429 +vt 0.083333 0.446429 +vt 0.083333 0.267857 +vn -1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn -0.000000 1.000000 -0.000000 +vn -0.000000 0.000000 -1.000000 +vn -0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +g Adaridge_L_B_Cube.002_Face1 +s off +f 1/1/1 2/2/1 9/3/1 12/4/1 +f 7/5/2 5/6/2 4/7/2 10/8/2 +f 5/9/3 6/10/3 11/11/3 4/12/3 +f 4/13/3 11/2/3 14/7/3 13/14/3 +f 4/7/2 69/2/2 70/15/2 10/8/2 +f 1/15/4 7/2/4 3/1/4 2/16/4 +f 5/9/4 7/17/4 1/13/4 6/18/4 +f 3/19/2 7/20/2 10/21/2 8/14/2 +f 2/22/5 3/23/5 8/24/5 9/25/5 +f 6/26/1 1/18/1 12/27/1 11/28/1 +f 60/13/2 8/14/2 10/21/2 70/26/2 +f 26/5/4 28/6/4 29/2/4 27/15/4 +f 30/1/1 31/2/1 48/3/1 56/4/1 +f 38/29/2 36/30/2 46/31/2 47/32/2 +f 27/2/1 29/15/1 25/33/1 35/34/1 +f 29/2/5 28/6/5 50/35/5 25/3/5 +f 41/6/2 39/19/2 33/14/2 49/7/2 +f 26/13/3 27/36/3 35/37/3 55/38/3 +f 39/9/3 40/10/3 51/11/3 33/12/3 +f 33/39/3 51/36/3 62/1/3 57/34/3 +f 35/40/3 33/19/3 57/35/3 58/41/3 +f 56/40/1 48/42/1 61/43/1 71/44/1 +f 74/45/4 72/46/4 17/15/4 15/2/4 +f 75/17/4 74/45/4 15/2/4 21/13/4 +f 24/47/4 21/20/4 17/19/4 20/40/4 +f 23/5/4 24/6/4 20/2/4 22/15/4 +f 25/40/4 50/19/4 43/5/4 47/42/4 +f 30/15/4 41/2/4 32/1/4 31/16/4 +f 33/20/4 35/26/4 46/13/4 34/19/4 +f 36/13/4 38/2/4 32/6/4 37/19/4 +f 39/9/4 41/17/4 30/13/4 40/18/4 +f 24/18/3 23/9/3 44/17/3 47/13/3 +f 21/19/3 24/13/3 47/2/3 43/6/3 +f 75/48/3 21/2/3 43/15/3 76/49/3 +f 32/19/2 41/13/2 49/38/2 45/50/2 +f 36/19/3 37/13/3 34/51/3 46/52/3 +f 23/6/1 22/2/1 52/13/1 44/19/1 +f 32/53/5 38/23/5 47/24/5 45/54/5 +f 31/22/5 32/23/5 45/24/5 48/25/5 +f 19/13/2 18/18/2 42/9/2 54/17/2 +f 16/9/2 19/55/2 54/56/2 53/10/2 +f 28/2/2 26/13/2 55/39/2 50/34/2 +f 40/26/1 30/18/1 56/27/1 51/28/1 +f 53/15/2 54/2/2 68/57/2 67/58/2 +f 54/6/2 42/19/2 59/59/2 68/60/2 +f 48/61/5 45/62/5 65/24/5 61/25/5 +f 45/63/5 47/62/5 66/24/5 65/54/5 +f 51/19/1 56/6/1 71/60/1 62/59/1 +f 76/64/3 43/20/3 60/65/3 73/66/3 +f 44/47/1 52/40/1 63/44/1 64/67/1 +f 64/63/6 63/54/6 78/68/6 67/24/6 68/23/6 59/62/6 77/69/6 +f 61/54/6 60/24/6 70/70/6 71/71/6 +f 70/70/6 69/62/6 62/63/6 71/71/6 +f 11/47/3 35/20/3 58/72/3 14/73/3 +f 22/74/5 16/69/5 53/75/5 67/76/5 63/77/5 52/78/5 +l 58 69 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_l_t.obj b/mods/mylandscaping/models/mylandscaping_blocka_l_t.obj new file mode 100644 index 00000000..ec3bad53 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_l_t.obj @@ -0,0 +1,177 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_L_T_Cube.003 +v 0.300000 0.500000 0.051369 +v 0.300000 -0.300000 -0.048631 +v 0.100000 -0.100000 -0.048631 +v 0.300000 0.500000 0.451369 +v 0.100000 -0.300000 -0.048631 +v 0.100000 -0.300000 -0.048631 +v 0.500000 0.500000 0.051369 +v 0.500000 0.500000 0.451369 +v -0.500000 0.500000 0.513086 +v -0.500000 0.600000 0.513086 +v -0.500000 0.500000 0.015393 +v -0.500000 0.600000 0.015393 +v 0.493328 0.500000 0.513086 +v 0.493328 0.600000 0.513086 +v 0.493328 0.500000 0.015393 +v 0.493328 0.600000 0.015393 +v -0.700000 0.500000 0.051369 +v 0.300000 -0.300000 -0.048631 +v 0.300000 0.100000 0.051369 +v 0.300000 0.100000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v -0.300000 -0.100000 0.151369 +v -0.300000 0.300000 0.151369 +v 0.100000 0.300000 0.151369 +v -0.300000 -0.500000 -0.048631 +v 0.100000 -0.500000 -0.048631 +v -0.300000 -0.100000 -0.048631 +v 0.100000 -0.100000 -0.048631 +v -0.300000 0.300000 0.051369 +v 0.100000 0.300000 0.051369 +v -0.300000 0.500000 0.051369 +v -0.700000 -0.100000 0.051369 +v -0.300000 -0.100000 0.051369 +v -0.700000 0.100000 0.051369 +v -0.300000 0.100000 0.051369 +v 0.100000 0.500000 0.051369 +v 0.500000 -0.300000 -0.048631 +v 0.100000 -0.500000 -0.048631 +v 0.100000 -0.100000 0.151369 +v 0.100000 -0.100000 0.151369 +v 0.500000 -0.500000 -0.048631 +v 0.100000 0.300000 0.151369 +v 0.500000 -0.100000 0.451369 +v 0.500000 -0.100000 0.451369 +v 0.300000 -0.100000 0.151369 +v 0.300000 0.300000 0.151369 +v -0.300000 0.500000 0.151369 +v -0.300000 0.100000 0.151369 +v 0.500000 -0.500000 0.451369 +v -0.300000 -0.500000 0.451369 +v -0.300000 -0.100000 0.451369 +v -0.700000 0.500000 0.451369 +v -0.700000 -0.100000 0.451369 +v -0.700000 0.100000 0.451369 +v 0.500000 0.500000 0.451369 +v 0.500000 0.100000 0.451369 +v -0.300000 0.500000 0.451369 +v 0.500000 -0.300000 -0.048631 +v 0.500000 0.100000 -0.048631 +v 0.500000 -0.100000 0.451369 +v 0.300000 0.500000 0.051369 +v 0.500000 0.100000 0.051369 +v 0.500000 0.500000 0.051369 +v 0.300000 0.300000 0.051369 +v 0.100000 0.500000 0.051369 +v 0.100000 0.300000 0.051369 +v 0.300000 0.500000 0.051369 +v 0.300000 0.300000 0.151369 +v 0.100000 0.300000 0.151369 +v 0.300000 0.100000 0.151369 +v 0.300000 0.500000 0.151369 +v 0.100000 -0.100000 0.151369 +v 0.300000 -0.100000 0.151369 +v 0.300000 -0.300000 0.151369 +v 0.300000 0.100000 0.151369 +v 0.500000 0.100000 0.151369 +v 0.500000 -0.300000 0.451369 +v 0.500000 -0.300000 0.451369 +v 0.500000 -0.500000 0.451369 +v 0.500000 0.100000 0.451369 +vt 0.333333 0.714286 +vt 0.333333 0.571429 +vt 0.500000 0.571429 +vt 0.500000 0.714286 +vt 0.666667 0.714286 +vt 0.666667 0.428571 +vt 0.833333 0.428571 +vt 0.833333 0.714286 +vt 0.333333 1.000000 +vt 0.500000 1.000000 +vt 0.666667 1.000000 +vt 0.791667 0.714286 +vt 0.791667 1.000000 +vt 0.333333 0.857143 +vt 0.166667 0.857143 +vt 0.166667 0.767857 +vt 0.333333 0.767857 +vt 1.000000 0.428571 +vt 1.000000 0.142857 +vt 0.916667 0.142857 +vt 0.916667 0.428571 +vt -0.000000 0.071429 +vt 0.833333 0.071429 +vt 0.833333 -0.000000 +vt 0.000000 0.000000 +vt 0.083333 0.142857 +vt 0.083333 0.428571 +vt 0.000000 0.428571 +vt 0.000000 0.142857 +vt 0.833333 0.142857 +vt 1.000000 0.714286 +vt 0.333333 0.428571 +vt 0.666667 0.571429 +vt 1.000000 1.000000 +vt -0.000000 0.571429 +vt -0.000000 0.714286 +vt 0.166667 1.000000 +vt 0.208333 0.857143 +vt 0.208333 0.714286 +vt 0.000000 0.464286 +vt 0.333333 0.464286 +vt 0.666667 0.625000 +vt 0.333333 0.625000 +vt 1.000000 0.000000 +vt 0.833333 0.053571 +vt 1.000000 0.053571 +vn -0.000000 1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +g Adaridge_L_T_Cube.003_Face1 +s off +f 59/1/1 20/2/1 75/3/1 76/4/1 +f 20/5/2 18/6/2 74/7/2 75/8/2 +f 1/9/1 4/1/1 8/4/1 7/10/1 +f 61/11/2 19/5/2 70/12/2 71/13/2 +f 66/14/3 64/15/3 68/16/3 69/17/3 +f 10/18/2 12/19/2 11/20/2 9/21/2 +f 12/22/4 16/23/4 15/24/4 11/25/4 +f 16/26/5 14/27/5 13/28/5 15/29/5 +f 14/30/6 10/29/6 9/22/6 13/23/6 +f 9/27/3 11/21/3 15/20/3 13/26/3 +f 14/20/1 16/21/1 12/27/1 10/26/1 +f 25/18/4 27/31/4 28/5/4 26/6/4 +f 32/2/4 34/32/4 35/6/4 33/33/4 +f 25/31/2 50/5/2 51/11/2 27/34/2 +f 32/2/2 53/35/2 54/36/2 34/1/2 +f 34/11/4 17/5/4 31/31/4 35/34/4 +f 22/1/4 23/5/4 24/11/4 40/9/4 +f 36/35/4 30/28/4 29/32/4 31/2/4 +f 19/28/4 61/32/4 63/2/4 62/35/4 +f 66/14/4 65/9/4 67/37/4 64/15/4 +f 41/2/4 38/33/4 6/5/4 37/1/4 +f 27/2/1 22/32/1 40/6/1 28/33/1 +f 41/2/5 37/1/5 78/36/5 79/35/5 +f 5/14/4 3/9/4 21/37/4 2/15/4 +f 46/32/4 45/6/4 39/33/4 42/2/4 +f 35/14/5 48/38/5 22/39/5 33/1/5 +f 31/35/5 47/40/5 48/41/5 35/2/5 +f 30/5/3 24/42/3 23/43/3 29/1/3 +f 21/33/1 3/5/1 72/4/1 73/3/1 +f 34/18/2 54/6/2 52/5/2 17/31/2 +f 33/31/3 51/18/3 53/6/3 32/5/3 +f 17/9/1 52/1/1 57/5/1 31/11/1 +f 51/30/6 50/24/6 49/44/6 44/19/6 +f 54/45/6 56/46/6 55/19/6 52/30/6 +f 54/45/6 53/24/6 43/44/6 56/46/6 +f 58/18/5 59/31/5 80/5/5 77/6/5 +f 18/35/4 20/2/4 59/1/4 58/36/4 +f 62/5/5 63/11/5 55/9/5 56/1/5 +f 25/26/3 41/20/3 79/21/3 50/27/3 +l 60 43 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_m_b.obj b/mods/mylandscaping/models/mylandscaping_blocka_m_b.obj new file mode 100644 index 00000000..0145770b --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_m_b.obj @@ -0,0 +1,182 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_M_B_Cube.004 +v 0.300000 -0.300000 -0.248631 +v 0.700000 -0.500000 -0.248631 +v 0.300000 -0.500000 -0.248631 +v 0.700000 -0.100000 -0.248631 +v 0.700000 -0.300000 -0.248631 +v -0.100000 -0.500000 -0.248631 +v 0.300000 -0.100000 -0.248631 +v -0.300000 -0.500000 -0.248631 +v -0.300000 -0.100000 -0.248631 +v -0.100000 -0.100000 -0.248631 +v -0.100000 0.300000 -0.048631 +v 0.300000 0.500000 -0.148631 +v -0.100000 0.500000 -0.148631 +v 0.300000 0.300000 -0.148631 +v -0.100000 0.300000 -0.148631 +v -0.700000 0.300000 -0.148631 +v -0.700000 -0.100000 -0.148631 +v -0.500000 -0.100000 -0.148631 +v -0.500000 0.500000 -0.048631 +v -0.500000 0.100000 -0.048631 +v -0.100000 0.500000 -0.048631 +v -0.100000 0.100000 -0.148631 +v -0.500000 0.100000 -0.148631 +v -0.100000 -0.100000 -0.148631 +v -0.500000 0.500000 -0.148631 +v -0.700000 0.500000 -0.148631 +v -0.500000 0.300000 -0.148631 +v 0.700000 -0.100000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v -0.300000 -0.100000 -0.048631 +v -0.500000 -0.100000 -0.048631 +v -0.100000 0.100000 -0.048631 +v -0.100000 -0.100000 -0.048631 +v -0.700000 -0.100000 -0.048631 +v -0.500000 0.300000 -0.048631 +v 0.300000 0.300000 -0.048631 +v -0.700000 0.500000 -0.048631 +v -0.300000 -0.500000 -0.048631 +v 0.700000 -0.500000 -0.048631 +v 0.700000 -0.300000 -0.048631 +v 0.300000 0.500000 -0.048631 +v -0.700000 0.300000 -0.048631 +v -0.500000 0.500000 0.251369 +v -0.100000 0.500000 0.251369 +v 0.700000 -0.100000 0.151369 +v 0.300000 -0.100000 0.251369 +v -0.700000 -0.100000 0.251369 +v -0.700000 0.500000 0.251369 +v -0.300000 -0.500000 0.151369 +v -0.300000 -0.100000 0.151369 +v -0.500000 -0.100000 0.251369 +v -0.100000 -0.100000 0.251369 +v 0.700000 -0.500000 0.151369 +v 0.700000 -0.300000 0.151369 +v 0.300000 0.500000 0.251369 +v 0.300000 0.300000 0.251369 +v -0.700000 0.300000 0.251369 +v 0.300000 -0.100000 0.151369 +vt 0.666667 0.428571 +vt 0.666667 0.571429 +vt 0.333333 0.571429 +vt 0.333333 0.428571 +vt -0.000000 0.571429 +vt 0.333333 0.500000 +vt -0.000000 0.500000 +vt 0.606510 0.428339 +vt 0.606510 0.571661 +vt 0.534849 0.571661 +vt 0.534849 0.428339 +vt 0.250000 0.428571 +vt 0.250000 0.571429 +vt 0.666667 0.500000 +vt 0.666667 0.714286 +vt 0.583333 0.714286 +vt 0.583333 0.571429 +vt 0.333333 0.714286 +vt 0.000000 0.714286 +vt -0.000000 0.642857 +vt 0.333333 0.642857 +vt 0.166667 0.857143 +vt -0.000000 0.857143 +vt -0.000000 0.785714 +vt 0.166667 0.785714 +vt 0.250000 0.714286 +vt 1.000000 0.714286 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.666667 1.000000 +vt 0.666667 0.785714 +vt 1.000000 0.785714 +vt 1.000000 0.428571 +vt 0.750000 0.428571 +vt 0.750000 0.714286 +vt 0.000000 0.428571 +vt 0.333333 1.000000 +vt 0.166667 0.714286 +vt 0.333333 0.857143 +vt 0.666667 0.642857 +vt 0.333333 0.625000 +vt 0.666667 0.625000 +vt 0.833333 0.071429 +vt 1.000000 0.071429 +vt 1.000000 -0.000000 +vt 0.833333 0.000000 +vt 0.854167 0.071429 +vt 0.854167 0.000000 +vt 0.166667 1.000000 +vt -0.000000 1.000000 +vt 0.250000 0.857143 +vt 0.250000 1.000000 +vt 0.083333 0.571429 +vt 0.083333 0.428571 +vt 0.416667 0.714286 +vt 0.416667 0.571429 +vt 0.854167 0.142857 +vt 1.000000 0.142857 +vt 0.833333 0.142857 +vt 0.750000 1.000000 +vt 1.000000 0.107143 +vt 0.833333 0.107143 +vt 0.083333 0.142857 +vt 0.916667 0.142857 +vt 0.916667 0.303571 +vt 0.916667 0.428571 +vt 0.083333 0.303571 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +g Adaridge_M_B_Cube.004_Face1 +s off +f 12/1/1 14/2/1 15/3/1 13/4/1 +f 16/5/2 17/3/2 34/6/2 42/7/2 +f 24/8/3 22/9/3 32/10/3 33/11/3 +f 13/3/2 15/4/2 11/12/2 21/13/2 +f 15/3/4 14/2/4 36/14/4 11/6/4 +f 27/2/3 25/15/3 19/16/3 35/17/3 +f 12/18/5 13/19/5 21/20/5 41/21/5 +f 25/22/5 26/23/5 37/24/5 19/25/5 +f 19/26/5 37/19/5 48/5/5 43/13/5 +f 21/27/5 19/15/5 43/14/5 44/28/5 +f 41/29/5 21/30/5 44/31/5 55/32/5 +f 42/27/2 34/33/2 47/34/2 57/35/2 +f 5/5/1 2/36/1 3/4/1 1/3/1 +f 4/19/1 5/5/1 1/3/1 7/18/1 +f 10/29/1 7/30/1 3/15/1 6/27/1 +f 9/1/1 10/2/1 6/3/1 8/4/1 +f 11/27/1 36/15/1 29/1/1 33/33/1 +f 16/4/1 27/3/1 18/5/1 17/36/1 +f 19/30/1 21/37/1 32/18/1 20/15/1 +f 22/18/1 24/3/1 18/2/1 23/15/1 +f 25/22/1 27/38/1 16/18/1 26/39/1 +f 10/39/5 9/22/5 30/38/5 33/18/5 +f 7/18/5 10/19/5 33/5/5 29/3/5 +f 4/2/5 7/3/5 29/4/5 28/1/5 +f 18/15/3 27/18/3 35/21/3 31/40/3 +f 22/15/5 23/18/5 20/41/5 32/42/5 +f 9/2/2 8/3/2 38/18/2 30/15/2 +f 18/43/4 24/44/4 33/45/4 31/46/4 +f 17/47/4 18/44/4 31/45/4 34/48/4 +f 5/18/3 4/39/3 28/22/3 40/38/3 +f 2/22/3 5/49/3 40/50/3 39/23/3 +f 14/3/3 12/18/3 41/26/3 36/13/3 +f 26/37/2 16/39/2 42/51/2 37/52/2 +f 39/4/3 40/3/3 54/53/3 53/54/3 +f 40/2/3 28/15/3 45/55/3 54/56/3 +f 34/57/4 31/58/4 51/45/4 47/48/4 +f 31/59/4 33/58/4 52/45/4 51/46/4 +f 37/15/2 42/2/2 57/56/2 48/55/2 +f 29/27/3 36/29/3 56/60/3 46/35/3 +f 29/18/5 58/3/5 45/2/5 28/15/5 +f 30/29/2 38/27/2 49/35/2 50/60/2 +f 36/2/3 41/15/3 55/55/3 56/56/3 +f 50/59/6 49/46/6 53/45/6 54/44/6 45/58/6 +f 47/46/6 46/45/6 56/61/6 57/62/6 +f 56/61/6 55/58/6 48/59/6 57/62/6 +f 8/63/4 2/64/4 39/65/4 53/66/4 49/54/4 38/67/4 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_m_t.obj b/mods/mylandscaping/models/mylandscaping_blocka_m_t.obj new file mode 100644 index 00000000..8dd0e629 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_m_t.obj @@ -0,0 +1,139 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_M_T_Cube.001 +v -0.500000 0.500000 0.513086 +v -0.500000 0.600000 0.513086 +v -0.500000 0.500000 0.015393 +v -0.500000 0.600000 0.015393 +v 0.493328 0.500000 0.513086 +v 0.493328 0.600000 0.513086 +v 0.493328 0.500000 0.015393 +v 0.493328 0.600000 0.015393 +v -0.700000 0.500000 0.051369 +v 0.300000 -0.500000 -0.048631 +v 0.700000 -0.500000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v 0.700000 -0.100000 -0.048631 +v -0.300000 -0.100000 0.151369 +v -0.300000 0.300000 0.151369 +v 0.100000 0.300000 0.151369 +v -0.300000 -0.500000 -0.048631 +v 0.100000 -0.500000 -0.048631 +v -0.300000 -0.100000 -0.048631 +v 0.100000 -0.100000 -0.048631 +v -0.300000 0.300000 0.051369 +v 0.100000 0.300000 0.051369 +v -0.300000 0.500000 0.051369 +v -0.700000 -0.100000 0.051369 +v -0.300000 -0.100000 0.051369 +v -0.700000 0.100000 0.051369 +v -0.300000 0.100000 0.051369 +v 0.100000 0.500000 0.051369 +v 0.300000 0.500000 0.051369 +v 0.300000 0.100000 0.051369 +v 0.100000 0.100000 0.051369 +v 0.100000 -0.100000 0.151369 +v 0.300000 -0.100000 0.051369 +v 0.100000 -0.100000 0.051369 +v 0.300000 -0.100000 0.451369 +v 0.700000 -0.100000 0.351369 +v 0.100000 0.500000 0.151369 +v 0.100000 0.100000 0.151369 +v -0.300000 0.500000 0.151369 +v -0.300000 0.100000 0.151369 +v 0.700000 -0.500000 0.351369 +v -0.300000 -0.500000 0.351369 +v -0.300000 -0.100000 0.351369 +v -0.700000 0.500000 0.451369 +v -0.700000 -0.100000 0.451369 +v -0.700000 0.100000 0.451369 +v 0.300000 0.500000 0.451369 +v 0.300000 0.100000 0.451369 +v -0.300000 0.500000 0.451369 +v 0.300000 -0.100000 0.351369 +vt 1.000000 0.428571 +vt 1.000000 0.142857 +vt 0.916667 0.142857 +vt 0.916667 0.428571 +vt -0.000000 0.071429 +vt 0.833333 0.071429 +vt 0.833333 -0.000000 +vt 0.000000 0.000000 +vt 0.083333 0.142857 +vt 0.083333 0.428571 +vt 0.000000 0.428571 +vt 0.000000 0.142857 +vt 0.833333 0.142857 +vt 0.666667 0.714286 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.333333 0.714286 +vt 1.000000 0.714286 +vt 0.666667 0.428571 +vt 0.333333 0.571429 +vt 0.333333 0.428571 +vt 0.666667 0.571429 +vt 1.000000 1.000000 +vt -0.000000 0.571429 +vt -0.000000 0.714286 +vt 0.000000 1.000000 +vt 0.000000 0.857143 +vt 0.166667 0.857143 +vt 0.166667 1.000000 +vt 0.166667 0.910714 +vt 0.333333 0.910714 +vt 0.333333 0.535714 +vt 0.666667 0.535714 +vt 0.333333 0.678571 +vt 0.666667 0.678571 +vt 0.333333 0.857143 +vt 0.208333 0.857143 +vt 0.208333 0.714286 +vt 0.000000 0.464286 +vt 0.333333 0.464286 +vt 1.000000 0.000000 +vt 0.833333 0.053571 +vt 1.000000 0.053571 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +g Adaridge_M_T_Cube.001_Face1 +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/5/2 8/6/2 7/7/2 3/8/2 +f 8/9/3 6/10/3 5/11/3 7/12/3 +f 6/13/4 2/12/4 1/5/4 5/6/4 +f 1/10/5 3/4/5 7/3/5 5/9/5 +f 6/3/6 8/4/6 4/10/6 2/9/6 +f 10/14/2 12/15/2 13/16/2 11/17/2 +f 17/1/2 19/18/2 20/14/2 18/19/2 +f 24/20/2 26/21/2 27/19/2 25/22/2 +f 50/15/6 36/14/6 13/18/6 12/23/6 +f 17/18/1 42/14/1 43/15/1 19/23/1 +f 24/20/1 45/24/1 46/25/1 26/17/1 +f 26/15/2 9/14/2 23/18/2 27/23/2 +f 14/17/2 15/14/2 16/15/2 32/16/2 +f 28/24/2 22/11/2 21/21/2 23/20/2 +f 10/20/2 18/21/2 20/19/2 12/22/2 +f 28/22/2 29/14/2 30/17/2 31/20/2 +f 30/26/2 33/27/2 34/28/2 31/29/2 +f 19/20/6 14/21/6 32/19/6 20/22/6 +f 20/29/6 34/30/6 33/31/6 12/16/6 +f 34/21/1 32/32/1 38/33/1 31/19/1 +f 31/20/1 38/34/1 37/35/1 28/22/1 +f 27/36/3 40/37/3 14/38/3 25/17/3 +f 23/24/3 39/39/3 40/40/3 27/20/3 +f 22/14/5 16/22/5 15/20/5 21/17/5 +f 13/18/3 36/14/3 41/19/3 11/1/3 +f 29/18/3 47/14/3 48/19/3 30/1/3 +f 30/20/3 48/24/3 35/11/3 33/21/3 +f 26/1/1 46/19/1 44/14/1 9/18/1 +f 25/18/5 43/1/5 45/19/5 24/14/5 +f 9/16/6 44/17/6 49/14/6 23/15/6 +f 43/13/4 42/7/4 41/41/4 36/2/4 +f 46/42/4 48/43/4 47/2/4 44/13/4 +f 46/42/4 45/7/4 35/41/4 48/43/4 +f 42/10/5 17/9/5 11/3/5 41/4/5 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_oc_b.obj b/mods/mylandscaping/models/mylandscaping_blocka_oc_b.obj new file mode 100644 index 00000000..57759391 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_oc_b.obj @@ -0,0 +1,234 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_OC_B_Cube.005 +v 0.100000 -0.500000 -0.248631 +v -0.300000 -0.500000 -0.248631 +v 0.100000 -0.100000 -0.248631 +v -0.300000 -0.500000 -0.248631 +v -0.300000 -0.100000 -0.248631 +v -0.300000 -0.100000 -0.248631 +v -0.700000 0.300000 -0.148631 +v -0.700000 -0.100000 -0.148631 +v -0.500000 -0.100000 -0.148631 +v -0.500000 0.500000 -0.100435 +v -0.500000 0.100000 -0.100435 +v -0.100000 0.500000 -0.100435 +v -0.100000 0.100000 -0.148631 +v -0.500000 0.100000 -0.148631 +v -0.100000 -0.100000 -0.148631 +v -0.500000 0.500000 -0.148631 +v -0.700000 0.500000 -0.148631 +v -0.500000 0.300000 -0.148631 +v -0.300000 -0.100000 -0.048631 +v -0.500000 -0.100000 -0.048631 +v -0.100000 0.100000 -0.100435 +v -0.100000 -0.100000 -0.048631 +v -0.700000 -0.100000 -0.048631 +v -0.500000 0.300000 -0.048631 +v -0.700000 0.500000 -0.048631 +v -0.300000 -0.500000 -0.048631 +v -0.099597 0.300000 -0.100000 +v -0.700000 0.300000 -0.048631 +v -0.500000 0.500000 0.251369 +v 0.100000 -0.500000 -0.248631 +v 0.100000 -0.100000 -0.248631 +v 0.250000 -0.100000 -0.248631 +v -0.700000 -0.100000 0.251369 +v -0.700000 0.500000 0.251369 +v -0.300000 -0.500000 0.151369 +v -0.300000 -0.100000 0.151369 +v 0.100000 -0.100000 -0.248631 +v 0.100000 -0.100000 -0.048631 +v 0.100000 -0.100000 -0.098631 +v 0.100000 -0.100000 -0.248631 +v 0.250000 -0.100000 -0.248631 +v -0.700000 0.300000 0.251369 +v 0.250000 -0.100000 -0.098631 +v 0.250000 -0.500000 -0.248631 +v 0.248631 -0.300000 0.300000 +v 0.248631 -0.500000 0.700000 +v 0.248631 -0.500000 0.300000 +v 0.248631 -0.100000 0.700000 +v 0.248631 -0.300000 0.700000 +v 0.248631 -0.500000 -0.100000 +v 0.248631 -0.100000 0.300000 +v 0.248631 -0.100000 -0.100000 +v 0.048631 0.300000 -0.100000 +v 0.148631 0.500000 0.300000 +v 0.148631 0.500000 -0.100000 +v 0.148631 0.300000 0.300000 +v 0.148631 0.300000 -0.100000 +v -0.100112 0.500000 -0.100000 +v -0.100000 0.500000 0.299565 +v -0.500000 0.500000 0.299565 +v 0.048631 -0.100000 0.700000 +v 0.048631 -0.100000 0.300000 +v 0.250000 -0.500000 -0.248631 +v 0.048631 -0.100000 -0.100000 +v 0.048631 0.300000 0.300000 +v 0.048631 -0.500000 0.700000 +v 0.048631 -0.300000 0.700000 +v -0.100112 0.500000 0.300000 +v -0.700000 0.500000 0.251369 +v -0.151369 -0.100000 0.700000 +v -0.251369 -0.100000 0.300000 +v 0.250000 -0.500000 -0.098631 +v 0.250000 -0.100000 -0.248631 +v -0.151369 -0.500000 0.700000 +v -0.151369 -0.300000 0.700000 +v -0.101369 0.500000 0.300000 +v -0.251369 0.300000 0.300000 +v 0.250000 -0.100000 -0.098631 +v -0.099597 0.500000 -0.100000 +v 0.048631 -0.100000 0.700000 +v 0.048631 -0.100000 0.300000 +v -0.151369 -0.100000 0.700000 +v -0.151369 -0.100000 0.300000 +v -0.300000 -0.100000 -0.248631 +v -0.300000 -0.100000 -0.048631 +v -0.099990 0.300000 -0.100000 +v -0.099990 -0.100000 -0.100000 +v -0.500000 -0.100000 0.251369 +v -0.100000 -0.100000 0.299565 +v -0.500000 -0.100000 0.299565 +v -0.700000 -0.100000 0.251369 +v -0.500000 0.500000 0.249565 +v -0.500000 -0.100000 0.249565 +v -0.151369 -0.500000 0.700000 +v -0.151369 -0.500000 0.300000 +v -0.151529 -0.500000 0.151369 +v -0.151529 -0.100000 0.151369 +v -0.151529 -0.500000 0.301369 +v -0.151529 -0.100000 0.301369 +v 0.248631 -0.500000 0.151274 +v 0.048631 -0.500000 0.151274 +v -0.151369 -0.500000 0.151274 +v 0.248518 -0.500000 -0.248631 +v 0.248518 -0.500000 -0.048631 +v 0.248518 -0.500000 0.151369 +v -0.101369 0.300000 0.300000 +v -0.500000 -0.100000 -0.148631 +v -0.700000 -0.100000 -0.148631 +v -0.100000 -0.100000 -0.148223 +v -0.500000 -0.100000 -0.148223 +vt -0.000000 0.571429 +vt 0.333333 0.571429 +vt 0.333333 0.500000 +vt -0.000000 0.500000 +vt 0.666667 0.428571 +vt 0.666667 0.571429 +vt 0.604167 0.571429 +vt 0.604167 0.428571 +vt 0.666667 0.714286 +vt 0.583333 0.714286 +vt 0.583333 0.571429 +vt 0.000000 0.714286 +vt 0.333333 0.714286 +vt 1.000000 0.428571 +vt 1.000000 0.714286 +vt 0.750000 0.428571 +vt 0.750000 0.714286 +vt 1.000000 1.000000 +vt 0.666667 1.000000 +vt 0.333333 0.428571 +vt -0.000000 0.428571 +vt 0.333333 1.000000 +vt 0.166667 0.857143 +vt 0.166667 0.714286 +vt 0.333333 0.857143 +vt 0.333333 0.642857 +vt 0.666667 0.642857 +vt 0.333333 0.660714 +vt 0.666667 0.660714 +vt 0.250000 0.857143 +vt 0.250000 1.000000 +vt 0.208333 0.714286 +vt 0.208333 0.571429 +vt 0.333333 0.625000 +vt -0.000000 0.625000 +vt 0.416667 0.571429 +vt 0.416667 0.714286 +vt 0.666667 0.500000 +vt 1.000000 0.571429 +vt 0.229167 1.000000 +vt 0.229167 0.910714 +vt 0.333333 0.910714 +vt 0.166667 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.857143 +vt 1.000000 0.142857 +vt 0.833333 0.142857 +vt 0.833333 -0.000000 +vt 1.000000 0.000000 +vt 0.083333 0.571429 +vt 0.083333 0.428571 +vt 0.750000 1.000000 +vt 0.458333 0.571429 +vt 0.458333 0.428571 +vt 0.937500 0.142857 +vt 0.937500 0.000000 +vt 0.916667 0.000000 +vt 0.916667 0.142857 +vt 1.000000 0.053571 +vt 0.833333 0.053571 +vt 0.833333 0.071429 +vt 1.000000 0.071429 +vn -1.000000 0.000000 0.000000 +vn 1.000000 -0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +g Adaridge_OC_B_Cube.005_Face1 +s off +f 7/1/1 8/2/1 23/3/1 28/4/1 +f 15/5/2 13/6/2 21/7/2 22/8/2 +f 18/6/2 16/9/2 10/10/2 24/11/2 +f 16/12/3 17/1/3 69/2/3 29/13/3 +f 12/14/3 10/15/3 60/9/3 59/5/3 +f 28/15/1 23/14/1 33/16/1 42/17/1 +f 6/18/4 3/19/4 1/9/4 2/15/4 +f 7/20/4 18/2/4 9/1/4 8/21/4 +f 10/19/4 12/22/4 21/13/4 11/9/4 +f 13/13/4 15/2/4 9/6/4 14/9/4 +f 16/23/4 18/24/4 7/13/4 17/25/4 +f 9/9/2 18/13/2 24/26/2 20/27/2 +f 13/9/3 14/13/3 11/28/3 21/29/3 +f 5/20/1 4/21/1 26/1/1 19/2/1 +f 73/6/2 78/29/2 72/28/2 63/2/2 +f 17/22/1 7/25/1 28/30/1 25/31/1 +f 55/2/4 57/13/4 27/32/4 79/33/4 +f 40/34/4 41/13/4 44/12/4 30/35/4 +f 25/9/1 28/6/1 42/36/1 34/37/1 +f 19/9/1 26/6/1 35/2/1 36/13/1 +f 54/5/2 56/6/2 57/2/2 55/20/2 +f 57/2/5 56/6/5 65/38/5 53/3/5 +f 54/15/3 55/9/3 58/6/3 68/39/3 +f 31/40/3 39/41/3 43/42/3 32/22/3 +f 49/1/2 46/21/2 47/20/2 45/2/2 +f 48/12/2 49/1/2 45/2/2 51/13/2 +f 52/18/2 51/19/2 47/9/2 50/15/2 +f 53/15/2 65/9/2 62/5/2 64/14/2 +f 51/2/3 52/1/3 64/21/3 62/20/3 +f 48/6/3 51/2/3 62/20/3 61/5/3 +f 49/13/6 48/25/6 61/23/6 67/24/6 +f 46/23/6 49/43/6 67/44/6 66/45/6 +f 88/46/5 91/47/5 108/48/5 107/49/5 +f 66/20/6 67/2/6 75/50/6 74/51/6 +f 67/6/6 61/9/6 70/37/6 75/36/6 +f 62/15/6 65/18/6 77/52/6 71/17/6 +f 56/5/6 54/6/6 76/53/6 106/54/6 +f 81/13/3 83/2/3 82/6/3 80/9/3 +f 38/13/3 37/2/3 84/6/3 85/9/3 +f 53/20/4 64/5/4 87/38/4 86/3/4 +f 59/55/6 60/47/6 90/48/6 89/56/6 +f 29/46/6 69/55/6 91/56/6 88/49/6 +f 90/48/1 60/47/1 92/47/1 93/48/1 +f 82/46/1 83/47/1 95/48/1 94/49/1 +f 36/47/6 35/48/6 96/57/6 97/58/6 +f 97/58/1 96/57/1 98/49/1 99/46/1 +f 66/59/5 74/46/5 102/47/5 101/60/5 +f 46/49/5 66/59/5 101/60/5 100/48/5 +f 35/47/5 26/61/5 104/62/5 105/46/5 +f 26/61/5 4/48/5 103/49/5 104/62/5 +f 89/46/5 90/47/5 110/48/5 109/49/5 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_oc_t.obj b/mods/mylandscaping/models/mylandscaping_blocka_oc_t.obj new file mode 100644 index 00000000..9e45901f --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_oc_t.obj @@ -0,0 +1,166 @@ +# Blender v2.76 (sub 1) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_OC_T_Cube.014 +v 0.048631 -0.500000 0.300642 +v 0.048631 -0.500000 0.700000 +v 0.048631 -0.100000 0.300642 +v 0.048631 -0.100000 0.700000 +v -0.051369 -0.100000 0.299994 +v -0.051369 0.500000 0.300000 +v -0.051369 0.100000 0.300000 +v 0.048631 -0.500000 0.300642 +v -0.051369 0.500000 0.299994 +v -0.051369 -0.100000 0.300642 +v 0.048631 -0.100000 0.151285 +v -0.451369 -0.100000 0.300642 +v -0.351369 -0.100000 0.700000 +v -0.051369 0.100000 0.299994 +v -0.051369 -0.100000 0.051285 +v -0.351369 -0.500000 0.700000 +v 0.048631 -0.100000 0.300642 +v -0.451369 0.500000 0.300000 +v -0.451369 0.100000 0.300000 +v -0.051369 0.500000 0.051285 +v 0.048631 -0.500000 0.151285 +v -0.351369 -0.100000 0.300642 +v -0.500000 0.500000 0.495153 +v -0.500000 0.600000 0.495153 +v -0.500000 0.500000 0.015393 +v -0.500000 0.600000 0.015393 +v -0.015314 0.500000 0.495153 +v -0.015314 0.600000 0.495153 +v -0.015314 0.500000 0.015393 +v -0.015314 0.600000 0.015393 +v -0.700000 0.500000 0.051369 +v 0.048631 -0.500000 -0.048715 +v -0.051369 -0.100000 0.251285 +v -0.051369 0.100000 0.051285 +v -0.351369 -0.100000 0.151285 +v 0.048631 -0.100000 0.151285 +v -0.300000 0.500000 0.051369 +v -0.700000 -0.100000 0.051369 +v -0.300000 -0.100000 0.051369 +v -0.700000 0.100000 0.051369 +v -0.300000 0.100000 0.051369 +v 0.048631 -0.100000 -0.048715 +v 0.500000 -0.100000 0.451369 +v -0.351369 -0.100000 -0.048715 +v 0.048631 -0.500000 0.151285 +v -0.051369 0.100000 0.251285 +v -0.051369 0.500000 0.251285 +v -0.700000 0.500000 0.451369 +v -0.700000 -0.100000 0.451369 +v -0.700000 0.100000 0.451369 +v -0.300000 0.500000 0.451369 +v 0.500000 -0.100000 0.451369 +v -0.051369 -0.100000 0.300642 +v 0.048631 -0.100000 0.300642 +v -0.351369 -0.500000 -0.048715 +v -0.351369 -0.100000 -0.048715 +v -0.251369 -0.100000 0.051285 +v -0.251369 0.500000 0.051285 +v -0.251369 0.100000 0.051285 +v -0.451369 -0.100000 0.450642 +v -0.451369 0.500000 0.450000 +v -0.451369 0.100000 0.450000 +v -0.700000 -0.100000 0.301369 +v -0.451369 -0.100000 0.300642 +v -0.700000 -0.100000 0.301369 +v -0.300000 -0.100000 0.301369 +vt 0.666667 0.714286 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.333333 0.714286 +vt 1.000000 0.714286 +vt 0.999900 0.999900 +vt 0.395833 0.714286 +vt 0.395833 1.000000 +vt 0.395833 0.571429 +vt 0.333333 0.571429 +vt -0.000000 0.571429 +vt -0.000000 0.482143 +vt 0.333333 0.482143 +vt 0.666667 0.428571 +vt 1.000000 0.428571 +vt 1.000000 0.142857 +vt 0.833333 0.142857 +vt 0.833333 -0.000000 +vt 1.000000 0.000000 +vt 0.916667 0.142857 +vt 0.916667 0.428571 +vt -0.000000 0.071429 +vt 0.833333 0.071429 +vt 0.000000 0.000000 +vt 0.083333 0.142857 +vt 0.083333 0.428571 +vt 0.000000 0.428571 +vt 0.000000 0.142857 +vt 0.520833 0.428571 +vt 0.520833 0.142857 +vt 0.333333 0.428571 +vt 0.666667 0.571429 +vt -0.000000 0.714286 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.857143 +vt 0.166667 0.857143 +vt 0.166667 1.000000 +vt 0.208333 0.571429 +vt 0.541667 0.482143 +vt 0.666667 0.482143 +vt 0.333333 0.857143 +vt 0.166667 0.714286 +vt 0.604167 0.714286 +vt 0.604167 0.571429 +vt 0.937500 1.000000 +vt 0.937500 0.714286 +vn 1.000000 -0.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.003200 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.001700 -0.000000 -1.000000 +vn 0.004200 0.001600 1.000000 +vn 0.005500 0.000000 1.000000 +g Adaridge_OC_T_Cube.014_Face1 +s off +f 1/1/1 3/2/1 4/3/1 2/4/1 +f 22/2/2 13/1/2 4/5/2 3/6/2 +f 46/7/1 47/8/1 9/3/1 14/4/1 +f 33/9/1 46/7/1 14/4/1 5/10/1 +f 11/11/1 17/12/1 8/13/1 21/10/1 +f 4/5/3 13/1/3 16/14/3 2/15/3 +f 6/16/3 18/17/3 19/18/3 7/19/3 +f 7/16/4 19/17/4 12/18/4 10/19/4 +f 24/15/5 26/16/5 25/20/5 23/21/5 +f 26/22/6 30/23/6 29/18/6 25/24/6 +f 30/25/1 28/26/1 27/27/1 29/28/1 +f 28/17/3 24/28/3 23/22/3 27/23/3 +f 23/26/7 25/21/7 29/20/7 27/25/7 +f 28/20/2 30/21/2 26/29/2 24/30/2 +f 38/10/6 40/31/6 41/14/6 39/32/6 +f 20/32/1 47/1/1 46/4/1 34/10/1 +f 38/10/5 49/11/5 50/33/5 40/4/5 +f 40/2/6 31/1/6 37/5/6 41/34/6 +f 42/4/1 36/33/1 45/11/1 32/10/1 +f 42/10/2 44/32/2 35/1/2 36/4/2 +f 40/15/5 50/14/5 48/1/5 31/5/5 +f 46/35/1 33/36/1 15/37/1 34/38/1 +f 31/3/2 48/4/2 51/1/2 37/2/2 +f 36/32/2 35/39/2 53/40/2 54/41/2 +f 42/15/6 32/5/6 55/1/6 56/14/6 +f 34/4/6 15/42/6 57/37/6 59/43/6 +f 20/1/6 34/4/6 59/10/6 58/32/6 +f 39/32/8 41/1/8 59/44/8 57/45/8 +f 41/5/8 37/34/8 58/46/8 59/47/8 +f 12/19/1 19/16/1 62/17/1 60/18/1 +f 19/19/1 18/16/1 61/17/1 62/18/1 +f 50/17/9 49/18/9 60/19/9 62/16/9 +f 50/18/10 62/19/10 61/16/10 48/17/10 +f 60/16/7 49/17/7 63/18/7 64/19/7 +f 38/18/7 39/19/7 66/16/7 65/17/7 +f 13/18/5 56/19/5 55/16/5 16/17/5 +f 16/18/7 55/19/7 32/16/7 2/17/7 +l 52 43 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_r_b.obj b/mods/mylandscaping/models/mylandscaping_blocka_r_b.obj new file mode 100644 index 00000000..d085a199 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_r_b.obj @@ -0,0 +1,181 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_R_B_Cube.007 +v 0.300000 -0.300000 -0.248631 +v 0.700000 -0.500000 -0.248631 +v 0.300000 -0.500000 -0.248631 +v 0.700000 -0.100000 -0.248631 +v 0.700000 -0.300000 -0.248631 +v -0.100000 -0.500000 -0.248631 +v 0.300000 -0.100000 -0.248631 +v -0.300000 -0.500000 -0.248631 +v -0.300000 -0.100000 -0.248631 +v -0.100000 -0.100000 -0.248631 +v -0.100000 0.300000 -0.048631 +v 0.300000 0.500000 -0.148631 +v -0.100000 0.500000 -0.148631 +v 0.300000 0.300000 -0.148631 +v -0.100000 0.300000 -0.148631 +v -0.500000 -0.100000 -0.148631 +v -0.500000 0.500000 -0.048631 +v -0.500000 0.100000 -0.048631 +v -0.100000 0.500000 -0.048631 +v -0.100000 0.100000 -0.148631 +v -0.500000 0.100000 -0.148631 +v -0.100000 -0.100000 -0.148631 +v 0.700000 -0.100000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v -0.300000 -0.100000 -0.048631 +v -0.500000 -0.100000 -0.048631 +v -0.100000 0.100000 -0.048631 +v -0.100000 -0.100000 -0.048631 +v -0.500000 -0.100000 -0.048631 +v 0.300000 0.300000 -0.048631 +v -0.500000 0.500000 -0.048631 +v -0.300000 -0.300000 -0.248631 +v 0.700000 -0.500000 -0.048631 +v 0.700000 -0.300000 -0.048631 +v 0.300000 0.500000 -0.048631 +v -0.500000 0.100000 -0.048631 +v -0.500000 0.500000 0.251369 +v -0.100000 0.500000 0.251369 +v 0.700000 -0.100000 0.151369 +v 0.300000 -0.100000 0.251369 +v -0.500000 -0.100000 0.251369 +v -0.500000 0.500000 0.251369 +v -0.500000 -0.500000 0.151369 +v -0.500000 -0.100000 0.151369 +v 0.700000 -0.500000 0.151369 +v 0.700000 -0.300000 0.151369 +v 0.300000 0.500000 0.251369 +v 0.300000 0.300000 0.251369 +v -0.500000 0.100000 0.251369 +v -0.300000 -0.300000 -0.248631 +v -0.300000 -0.100000 -0.248631 +v -0.300000 -0.500000 -0.248631 +v -0.500000 -0.300000 -0.248631 +v -0.500000 -0.100000 -0.248631 +v -0.500000 -0.300000 -0.248631 +v -0.500000 -0.500000 -0.248631 +v -0.300000 -0.100000 -0.068631 +v -0.500000 -0.100000 -0.068631 +v -0.500000 -0.300000 0.151369 +v -0.500000 -0.100000 0.151369 +v -0.500000 -0.300000 0.151369 +v -0.500000 -0.500000 0.151369 +v 0.700000 -0.100000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v 0.700000 -0.100000 0.151369 +v 0.300000 -0.100000 0.151369 +v 0.300000 -0.100000 0.151369 +v -0.500000 -0.100000 0.151369 +vt 0.666667 0.428571 +vt 0.666667 0.571429 +vt 0.333333 0.571429 +vt 0.333333 0.428571 +vt 0.166667 0.946429 +vt -0.000000 0.946429 +vt -0.000000 0.857143 +vt 0.166667 0.857143 +vt 0.606510 0.428339 +vt 0.606510 0.571661 +vt 0.534849 0.571661 +vt 0.534849 0.428339 +vt 0.250000 0.428571 +vt 0.250000 0.571429 +vt 0.666667 0.500000 +vt 0.333333 0.500000 +vt 0.333333 0.714286 +vt 0.000000 0.714286 +vt -0.000000 0.642857 +vt 0.333333 0.642857 +vt 1.000000 0.714286 +vt 0.666667 0.714286 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.666667 1.000000 +vt 0.666667 0.785714 +vt 1.000000 0.785714 +vt 0.416667 0.428571 +vt 0.416667 0.571429 +vt 0.000000 0.571429 +vt 0.000000 0.428571 +vt 1.000000 0.428571 +vt 0.333333 1.000000 +vt 0.333333 0.857143 +vt 0.166667 0.714286 +vt 0.333333 0.625000 +vt 0.666667 0.625000 +vt 0.500000 0.571429 +vt 0.500000 0.714286 +vt 0.166667 1.000000 +vt -0.000000 1.000000 +vt 0.250000 0.714286 +vt 0.083333 0.571429 +vt 0.083333 0.428571 +vt 0.416667 0.714286 +vt 0.416667 1.000000 +vt 0.750000 1.000000 +vt 0.750000 0.714286 +vt 0.166667 0.428571 +vt 0.166667 0.571429 +vt 0.833333 0.142857 +vt 0.833333 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.071429 +vt 1.000000 0.142857 +vt 1.000000 0.089286 +vt 0.833333 0.053571 +vt 0.916667 0.285714 +vt 0.916667 0.428571 +vt 0.083333 0.142857 +vt 0.916667 0.142857 +vt 0.083333 0.339286 +vt 0.916667 0.339286 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 -0.000000 -0.000000 +vn 1.000000 -0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +g Adaridge_R_B_Cube.007_Face1 +s off +f 12/1/1 14/2/1 15/3/1 13/4/1 +f 26/5/2 18/6/2 21/7/2 16/8/2 +f 22/9/3 20/10/3 27/11/3 28/12/3 +f 13/3/2 15/4/2 11/13/2 19/14/2 +f 15/3/4 14/2/4 30/15/4 11/16/4 +f 12/17/5 13/18/5 19/19/5 35/20/5 +f 19/21/5 17/22/5 37/15/5 38/23/5 +f 35/24/5 19/25/5 38/26/5 47/27/5 +f 36/2/2 29/1/2 41/28/2 49/29/2 +f 5/30/1 2/31/1 3/4/1 1/3/1 +f 4/18/1 5/30/1 1/3/1 7/17/1 +f 10/24/1 7/25/1 3/22/1 6/21/1 +f 9/1/1 10/2/1 6/3/1 8/4/1 +f 11/21/1 30/22/1 24/1/1 28/32/1 +f 17/25/1 19/33/1 27/17/1 18/22/1 +f 20/18/1 22/30/1 16/3/1 21/17/1 +f 10/34/5 9/8/5 25/35/5 28/17/5 +f 7/3/5 10/30/5 28/31/5 24/4/5 +f 4/2/5 7/3/5 24/4/5 23/1/5 +f 20/22/5 21/17/5 18/36/5 27/37/5 +f 50/17/1 52/3/1 56/38/1 55/39/1 +f 5/17/3 4/34/3 23/8/3 34/35/3 +f 2/8/3 5/40/3 34/41/3 33/7/3 +f 14/3/3 12/17/3 35/42/3 30/14/3 +f 33/4/3 34/3/3 46/43/3 45/44/3 +f 34/2/3 23/22/3 39/45/3 46/29/3 +f 31/25/2 36/22/2 49/45/2 42/46/2 +f 24/21/3 30/24/3 48/47/3 40/48/3 +f 51/30/1 32/31/1 53/49/1 54/50/1 +f 30/2/3 35/22/3 47/45/3 48/29/3 +f 44/51/6 43/52/6 45/53/6 46/54/6 39/55/6 +f 41/52/6 40/53/6 48/56/6 49/57/6 +f 48/56/6 47/55/6 42/51/6 49/57/6 +f 51/30/5 54/31/5 58/49/5 57/50/5 +f 55/4/2 56/3/2 62/30/2 61/31/2 +f 54/3/2 53/17/2 59/18/2 60/30/2 +f 64/17/5 66/3/5 65/2/5 63/22/5 +f 33/58/4 45/59/4 62/44/4 56/60/4 2/61/4 +f 40/59/4 41/44/4 68/62/4 67/63/4 diff --git a/mods/mylandscaping/models/mylandscaping_blocka_r_t.obj b/mods/mylandscaping/models/mylandscaping_blocka_r_t.obj new file mode 100644 index 00000000..23897166 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blocka_r_t.obj @@ -0,0 +1,162 @@ +# Blender v2.75 (sub 4) OBJ File: 'Retaining_wall.blend' +# www.blender.org +o Adaridge_R_T_Cube.008 +v -0.500000 0.500000 0.513086 +v -0.500000 0.600000 0.513086 +v -0.500000 0.500000 0.015393 +v -0.500000 0.600000 0.015393 +v 0.493328 0.500000 0.513086 +v 0.493328 0.600000 0.513086 +v 0.493328 0.500000 0.015393 +v 0.493328 0.600000 0.015393 +v -0.500000 0.500000 0.051369 +v 0.300000 -0.500000 -0.048631 +v 0.700000 -0.500000 -0.048631 +v 0.300000 -0.100000 -0.048631 +v 0.700000 -0.100000 -0.048631 +v -0.300000 -0.100000 0.151369 +v -0.300000 0.300000 0.151369 +v 0.100000 0.300000 0.151369 +v -0.300000 -0.500000 -0.048631 +v 0.100000 -0.500000 -0.048631 +v -0.300000 -0.100000 -0.048631 +v 0.100000 -0.100000 -0.048631 +v -0.300000 0.300000 0.051369 +v 0.100000 0.300000 0.051369 +v -0.300000 0.500000 0.051369 +v -0.500000 -0.100000 0.051369 +v -0.300000 -0.100000 0.051369 +v -0.500000 0.100000 0.051369 +v -0.300000 0.100000 0.051369 +v 0.100000 0.500000 0.051369 +v 0.300000 0.500000 0.051369 +v 0.300000 0.100000 0.051369 +v 0.100000 0.100000 0.051369 +v 0.100000 -0.100000 0.151369 +v 0.300000 -0.100000 0.051369 +v 0.100000 -0.100000 0.051369 +v 0.300000 -0.100000 0.451369 +v 0.700000 -0.100000 0.351369 +v 0.100000 0.500000 0.151369 +v 0.100000 0.100000 0.151369 +v -0.300000 0.500000 0.151369 +v -0.300000 0.100000 0.151369 +v 0.700000 -0.500000 0.351369 +v -0.500000 -0.500000 0.351369 +v -0.500000 -0.100000 0.351369 +v -0.500000 0.500000 0.451369 +v -0.500000 -0.100000 0.451369 +v -0.500000 0.100000 0.451369 +v 0.300000 0.500000 0.451369 +v 0.300000 0.100000 0.451369 +v -0.300000 0.500000 0.451369 +v -0.500000 -0.100000 0.051369 +v -0.500000 0.100000 0.051369 +v -0.500000 0.500000 0.051369 +v -0.500000 -0.100000 0.451369 +v -0.500000 0.500000 0.451369 +v -0.300000 -0.500000 -0.048631 +v -0.300000 -0.100000 -0.048631 +v -0.500000 -0.500000 -0.048631 +v -0.500000 -0.100000 -0.048631 +v -0.300000 -0.100000 0.151369 +v -0.500000 -0.100000 0.151369 +v 0.300000 -0.100000 0.351369 +v 0.300000 -0.100000 0.351369 +v -0.500000 -0.100000 0.351369 +vt 1.000000 0.428571 +vt 1.000000 0.142857 +vt 0.916667 0.142857 +vt 0.916667 0.428571 +vt -0.000000 0.071429 +vt 0.833333 0.071429 +vt 0.833333 -0.000000 +vt 0.000000 0.000000 +vt 0.083333 0.142857 +vt 0.083333 0.428571 +vt 0.000000 0.428571 +vt 0.000000 0.142857 +vt 0.833333 0.142857 +vt 0.666667 0.714286 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.333333 0.714286 +vt 1.000000 0.714286 +vt 0.666667 0.428571 +vt 0.166667 0.857143 +vt 0.166667 0.714286 +vt 0.333333 0.857143 +vt 0.999900 0.999900 +vt 1.000000 1.000000 +vt 0.333333 0.571429 +vt -0.000000 0.571429 +vt -0.000000 0.714286 +vt 0.666667 0.571429 +vt 0.333333 0.428571 +vt 0.000000 1.000000 +vt 0.000000 0.857143 +vt 0.166667 1.000000 +vt 0.166667 0.910714 +vt 0.333333 0.910714 +vt 0.333333 0.535714 +vt 0.666667 0.535714 +vt 0.333333 0.678571 +vt 0.666667 0.678571 +vt 0.208333 0.857143 +vt 0.208333 0.714286 +vt 0.000000 0.464286 +vt 0.333333 0.464286 +vt 0.500000 1.000000 +vt 0.500000 0.714286 +vt 1.000000 0.000000 +vt 0.833333 0.053571 +vt 1.000000 0.053571 +vt 0.083333 0.321429 +vt 0.916667 0.321429 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +g Adaridge_R_T_Cube.008_Face1 +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/5/2 8/6/2 7/7/2 3/8/2 +f 8/9/3 6/10/3 5/11/3 7/12/3 +f 6/13/4 2/12/4 1/5/4 5/6/4 +f 1/10/5 3/4/5 7/3/5 5/9/5 +f 6/3/6 8/4/6 4/10/6 2/9/6 +f 10/14/2 12/15/2 13/16/2 11/17/2 +f 17/1/2 19/18/2 20/14/2 18/19/2 +f 50/20/2 51/21/2 27/17/2 25/22/2 +f 61/15/6 36/14/6 13/18/6 12/23/6 +f 43/18/1 58/24/1 57/15/1 42/14/1 +f 24/25/1 45/26/1 46/27/1 26/17/1 +f 51/25/2 52/28/2 23/14/2 27/17/2 +f 14/17/2 15/14/2 16/15/2 32/16/2 +f 28/26/2 22/11/2 21/29/2 23/25/2 +f 10/25/2 18/29/2 20/19/2 12/28/2 +f 28/28/2 29/14/2 30/17/2 31/25/2 +f 30/30/2 33/31/2 34/20/2 31/32/2 +f 19/25/6 14/29/6 32/19/6 20/28/6 +f 20/32/6 34/33/6 33/34/6 12/16/6 +f 34/29/1 32/35/1 38/36/1 31/19/1 +f 31/25/1 38/37/1 37/38/1 28/28/1 +f 27/22/3 40/39/3 14/40/3 25/17/3 +f 23/26/3 39/41/3 40/42/3 27/25/3 +f 22/14/5 16/28/5 15/25/5 21/17/5 +f 13/18/3 36/14/3 41/19/3 11/1/3 +f 29/18/3 47/14/3 48/19/3 30/1/3 +f 30/25/3 48/26/3 35/11/3 33/29/3 +f 26/1/1 46/19/1 44/14/1 9/18/1 +f 56/22/6 58/20/6 60/21/6 59/17/6 +f 52/43/6 54/44/6 49/14/6 23/15/6 +f 43/13/4 42/7/4 41/45/4 36/2/4 +f 46/46/4 48/47/4 47/2/4 44/13/4 +f 46/46/4 45/7/4 35/45/4 48/47/4 +f 55/25/2 57/29/2 58/19/2 56/28/2 +f 42/10/5 57/9/5 11/3/5 41/4/5 +f 35/4/5 45/10/5 63/48/5 62/49/5 +l 53 43 +l 53 50 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_c_b.obj b/mods/mylandscaping/models/mylandscaping_blockf_c_b.obj new file mode 100644 index 00000000..f38d98ef --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_c_b.obj @@ -0,0 +1,187 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_C_B_Cube.007 +v 0.502738 -0.500000 -0.106682 +v 0.502738 -0.500000 0.201409 +v 0.502738 -0.000000 -0.106682 +v 0.502738 -0.000000 0.201409 +v 0.319405 -0.000000 0.201409 +v 0.210744 -0.000000 0.201409 +v 0.210744 -0.500000 0.201409 +v 0.319405 -0.500000 0.201409 +v 0.210744 -0.000000 -0.206682 +v 0.319405 -0.000000 -0.206682 +v 0.319405 -0.500000 -0.206682 +v 0.210744 -0.500000 -0.206682 +v -0.198120 -0.500000 -0.506763 +v 0.109970 -0.500000 -0.506763 +v -0.198120 -0.000000 -0.506763 +v 0.109970 -0.000000 -0.506763 +v -0.198120 -0.000000 0.200586 +v -0.198120 -0.000000 -0.323430 +v -0.198120 -0.500000 -0.323430 +v -0.198120 -0.500000 0.200586 +v 0.209970 -0.000000 -0.323430 +v 0.209970 -0.000000 0.200586 +v 0.209970 -0.500000 0.200586 +v 0.209970 -0.500000 -0.323430 +v 1.002738 0.000000 -0.006682 +v 1.002738 0.000000 0.301409 +v 0.002738 0.000000 0.301409 +v 0.002738 0.000000 -0.006682 +v 1.002738 0.500000 -0.006682 +v 1.002738 0.500000 0.301409 +v 0.002738 0.500000 0.301409 +v 0.002738 0.500000 -0.006682 +v 0.819405 0.500000 0.301409 +v 0.186072 0.500000 0.301409 +v 0.186072 0.000000 0.301409 +v 0.819405 0.000000 0.301409 +v 0.186072 0.500000 -0.106682 +v 0.819405 0.500000 -0.106682 +v 0.819405 0.000000 -0.106682 +v 0.186072 0.000000 -0.106682 +vt 0.565630 0.417706 +vt 0.937279 0.417706 +vt 0.937279 0.961175 +vt 0.565630 0.961175 +vt 0.318889 0.200942 +vt 0.318889 0.601960 +vt 0.128213 0.601960 +vt 0.128213 0.299209 +vt 0.914603 0.964578 +vt 0.697849 0.964578 +vt 0.697849 0.421109 +vt 0.914603 0.421109 +vt 0.569381 0.964578 +vt 0.569380 0.421109 +vt 0.111185 0.563547 +vt 0.111185 0.260796 +vt 0.301861 0.260796 +vt 0.301861 0.661814 +vt 0.414874 0.260796 +vt 0.414874 0.661814 +vt 0.431902 0.200942 +vt 0.431902 0.601960 +vt 0.006740 0.389858 +vt 0.006740 0.205539 +vt 0.538781 0.205539 +vt 0.538781 0.389858 +vt 0.940480 0.972796 +vt 0.577600 0.972796 +vt 0.577600 0.429327 +vt 0.940480 0.429327 +vt 0.023955 0.779030 +vt 0.448390 0.779030 +vt 0.448390 0.959186 +vt 0.127960 0.959186 +vt 0.006740 0.916690 +vt 0.538781 0.916690 +vt 0.023955 0.264096 +vt 0.448390 0.264096 +vt 0.378441 0.749538 +vt 0.058011 0.749538 +vt 0.058011 0.569382 +vt 0.482446 0.569382 +vt 0.058011 0.054448 +vt 0.482446 0.054448 +vt 0.945497 0.954042 +vt 0.573848 0.954042 +vt 0.573848 0.410574 +vt 0.945497 0.410574 +vt 0.546178 0.810196 +vt 0.546178 0.989544 +vt 0.014136 0.989544 +vt 0.014136 0.810196 +vt 0.579976 0.412745 +vt 0.954323 0.412745 +vt 0.954323 0.956213 +vt 0.579976 0.956213 +vt 0.033656 0.799938 +vt 0.469855 0.799938 +vt 0.469855 0.975236 +vt 0.140544 0.975236 +vt 0.489070 0.198919 +vt 0.052872 0.198919 +vt 0.052872 0.023621 +vt 0.382182 0.023621 +vt 0.546178 0.011282 +vt 0.546178 0.190630 +vt 0.014136 0.190630 +vt 0.014136 0.011282 +vt 0.140544 0.019067 +vt 0.469855 0.019067 +vt 0.469855 0.194364 +vt 0.033656 0.194364 +vt 0.382182 0.979790 +vt 0.052872 0.979790 +vt 0.052872 0.804493 +vt 0.489070 0.804493 +vt 0.906881 0.532532 +vt 0.482446 0.532532 +vt 0.906881 0.054448 +vt 0.387741 0.820929 +vt 0.387741 0.603201 +vt 0.910219 0.603201 +vt 0.910219 0.820929 +vt 0.387741 0.943971 +vt 0.910219 0.943971 +vt 0.912944 0.031407 +vt 0.912944 0.224097 +vt 0.386434 0.224097 +vt 0.386434 0.031406 +vt 0.912944 0.741693 +vt 0.386434 0.741693 +vt 0.386434 0.196606 +vt 0.386434 0.011163 +vt 0.912944 0.011162 +vt 0.912944 0.196606 +vt 0.386434 0.975606 +vt 0.386434 0.807420 +vt 0.912944 0.807420 +vt 0.912944 0.975606 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.478900 0.000000 -0.877900 +vn 0.877900 0.000000 -0.478900 +vn -0.478900 0.000000 -0.877900 +g Block1_C_B_Cube.007_Top +s off +f 3/1/1 4/2/1 2/3/1 1/4/1 +f 10/5/2 5/6/2 4/7/2 3/8/2 +f 4/9/3 5/10/3 8/11/3 2/12/3 +f 5/10/3 6/13/3 7/14/3 8/11/3 +f 1/15/4 2/16/4 8/17/4 11/18/4 +f 11/18/4 8/17/4 7/19/4 12/20/4 +f 9/21/2 6/22/2 5/6/2 10/5/2 +f 18/23/5 15/24/5 13/25/5 19/26/5 +f 15/27/6 16/28/6 14/29/6 13/30/6 +f 24/31/4 19/32/4 13/33/4 14/34/4 +f 17/35/5 18/23/5 19/26/5 20/36/5 +f 23/37/4 20/38/4 19/32/4 24/31/4 +f 16/39/2 15/40/2 18/41/2 21/42/2 +f 21/42/2 18/41/2 17/43/2 22/44/2 +f 29/45/1 30/46/1 26/47/1 25/48/1 +f 34/49/3 31/50/3 27/51/3 35/52/3 +f 31/53/5 32/54/5 28/55/5 27/56/5 +f 40/57/4 35/58/4 27/59/4 28/60/4 +f 38/61/2 33/62/2 30/63/2 29/64/2 +f 30/65/3 33/66/3 36/67/3 26/68/3 +f 33/66/3 34/49/3 35/52/3 36/67/3 +f 25/69/4 26/70/4 36/71/4 39/72/4 +f 39/72/4 36/71/4 35/58/4 40/57/4 +f 32/73/2 31/74/2 34/75/2 37/76/2 +f 37/76/2 34/75/2 33/62/2 38/61/2 +f 20/77/3 23/78/3 22/44/3 17/79/3 +g Block1_C_B_Cube.007_Face +f 10/80/7 3/81/7 1/82/7 11/83/7 +f 9/84/6 10/80/6 11/83/6 12/85/6 +f 16/86/8 21/87/8 24/88/8 14/89/8 +f 21/87/1 22/90/1 23/91/1 24/88/1 +f 38/92/7 29/93/7 25/94/7 39/95/7 +f 32/96/9 37/97/9 40/98/9 28/99/9 +f 37/97/6 38/92/6 39/95/6 40/98/6 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_c_t.obj b/mods/mylandscaping/models/mylandscaping_blockf_c_t.obj new file mode 100644 index 00000000..40a8db70 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_c_t.obj @@ -0,0 +1,277 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_C_T_Cube.019 +v 0.493390 0.499740 0.045465 +v 0.493390 0.499740 0.510975 +v -0.037412 0.499740 0.510975 +v -0.037412 0.499740 0.045465 +v 0.493390 0.600283 0.045465 +v 0.493390 0.600283 0.510975 +v -0.037412 0.600283 0.510975 +v -0.037412 0.600283 0.045465 +v -0.502759 0.499740 0.510975 +v -0.502759 0.499740 -0.511371 +v -0.037412 0.499740 -0.511371 +v -0.502759 0.600283 0.510975 +v -0.502759 0.600283 -0.511371 +v -0.037412 0.600283 -0.511371 +v -0.502759 0.600283 0.045465 +v -0.502759 0.499740 0.045465 +v 0.001194 0.002126 -0.004531 +v 0.001194 0.500000 -0.004531 +v 0.001194 0.002126 0.495469 +v 0.001194 0.500000 0.495469 +v -0.498806 0.002126 -0.004531 +v -0.498806 0.500000 -0.004531 +v -0.498806 0.002126 0.495469 +v -0.498806 0.500000 0.495469 +v 0.502738 -0.500000 0.097716 +v 0.502738 -0.500000 0.405806 +v 0.502738 0.000000 0.097716 +v 0.502738 0.000000 0.405806 +v 0.319405 0.000000 0.405806 +v -0.007219 0.000000 0.405806 +v -0.007219 -0.500000 0.405806 +v 0.319405 -0.500000 0.405806 +v -0.007219 0.000000 -0.002284 +v 0.319405 0.000000 -0.002284 +v 0.319405 -0.500000 -0.002284 +v -0.007219 -0.500000 -0.002284 +v -0.408429 -0.500000 -0.506763 +v -0.100339 -0.500000 -0.506763 +v -0.408429 0.000000 -0.506763 +v -0.100339 0.000000 -0.506763 +v -0.408429 0.000000 0.212048 +v -0.408429 0.000000 -0.323430 +v -0.408429 -0.500000 -0.323430 +v -0.408429 -0.500000 0.212048 +v -0.000339 0.000000 -0.323430 +v -0.000339 0.000000 0.212048 +v -0.000339 -0.500000 0.212048 +v -0.000339 -0.500000 -0.323430 +v 1.002738 0.000000 0.193249 +v 1.002738 0.000000 0.501339 +v 0.002738 0.000000 0.501339 +v 0.002738 0.000000 0.193249 +v 1.002738 0.500000 0.193249 +v 1.002738 0.500000 0.501339 +v 0.002738 0.500000 0.501339 +v 0.002738 0.500000 0.193249 +v 0.819405 0.500000 0.501339 +v 0.186072 0.500000 0.501339 +v 0.186072 0.000000 0.501339 +v 0.819405 0.000000 0.501339 +v 0.186072 0.500000 0.093249 +v 0.819405 0.500000 0.093249 +v 0.819405 0.000000 0.093249 +v 0.186072 0.000000 0.093249 +vt 0.972351 0.357491 +vt 0.972351 0.735220 +vt 0.892281 0.735220 +vt 0.892281 0.357491 +vt 0.886500 0.921970 +vt 0.886500 0.478205 +vt 0.966570 0.478205 +vt 0.966570 0.921970 +vt 0.886500 0.089163 +vt 0.966570 0.089163 +vt 0.962110 0.068440 +vt 0.962110 0.511554 +vt 0.882040 0.511554 +vt 0.882040 0.068440 +vt 0.480572 0.846924 +vt 0.020487 0.846924 +vt 0.020487 0.296187 +vt 0.480572 0.296187 +vt 0.457097 0.510730 +vt 0.038303 0.510730 +vt 0.038303 0.009420 +vt 0.457097 0.009420 +vt 0.962367 0.442955 +vt 0.962367 0.895931 +vt 0.882297 0.895931 +vt 0.882297 0.442955 +vt 0.882040 0.900027 +vt 0.962110 0.900027 +vt 0.504788 0.768680 +vt 0.082460 0.768680 +vt 0.082460 0.266386 +vt 0.504788 0.266385 +vt 0.962367 0.064271 +vt 0.882297 0.064271 +vt 0.457097 0.950222 +vt 0.038303 0.950222 +vt 0.958053 0.510730 +vt 0.958053 0.950222 +vt 0.878625 0.761575 +vt 0.878625 0.309742 +vt 0.958695 0.309742 +vt 0.958695 0.761575 +vt 0.123790 0.758174 +vt 0.123790 0.283031 +vt 0.588136 0.283031 +vt 0.588136 0.758174 +vt 0.050668 0.993799 +vt 0.050668 0.504252 +vt 0.515013 0.504252 +vt 0.515013 0.993799 +vt 0.489283 0.083244 +vt 0.489283 0.559589 +vt 0.024938 0.559589 +vt 0.024938 0.083244 +vt 0.114741 0.757652 +vt 0.114741 0.268823 +vt 0.579086 0.268823 +vt 0.579086 0.757652 +vt 0.563811 0.760823 +vt 0.097483 0.760823 +vt 0.097483 0.271276 +vt 0.563811 0.271276 +vt 0.854923 0.818986 +vt 0.959083 0.818986 +vt 0.959083 0.992096 +vt 0.854923 0.992096 +vt 0.426347 0.451697 +vt 0.054619 0.451697 +vt 0.054619 0.276384 +vt 0.335257 0.276384 +vt 0.050247 0.844113 +vt 0.050247 0.668805 +vt 0.505683 0.668805 +vt 0.505683 0.844113 +vt 0.050247 0.356480 +vt 0.505683 0.356480 +vt 0.352547 0.808262 +vt 0.042991 0.808262 +vt 0.042991 0.614884 +vt 0.453023 0.614884 +vt 0.042991 0.270367 +vt 0.453023 0.270367 +vt 0.426347 0.764030 +vt 0.054619 0.764030 +vt 0.083900 0.377108 +vt 0.083900 0.228393 +vt 0.480959 0.228393 +vt 0.480959 0.377108 +vt 0.419144 0.811574 +vt 0.131158 0.811574 +vt 0.131158 0.346356 +vt 0.419144 0.346356 +vt 0.432035 0.343978 +vt 0.063747 0.343978 +vt 0.063747 0.179529 +vt 0.341788 0.179529 +vt 0.083900 0.811475 +vt 0.480959 0.811474 +vt 0.432035 0.824297 +vt 0.063747 0.824297 +vt 0.148755 0.102540 +vt 0.437170 0.102540 +vt 0.437170 0.273124 +vt 0.055141 0.273124 +vt 0.437170 0.771366 +vt 0.055141 0.771366 +vt 0.854923 0.645876 +vt 0.959083 0.645876 +vt 0.030410 0.193648 +vt 0.030410 0.014148 +vt 0.496738 0.014148 +vt 0.496738 0.193648 +vt 0.443273 0.182187 +vt 0.062132 0.182187 +vt 0.062132 0.002436 +vt 0.349876 0.002436 +vt 0.425305 0.265176 +vt 0.058168 0.265176 +vt 0.058168 0.092029 +vt 0.335340 0.092029 +vt 0.030410 0.993241 +vt 0.030410 0.813741 +vt 0.496739 0.813741 +vt 0.496739 0.993241 +vt 0.349876 0.982900 +vt 0.062132 0.982900 +vt 0.062132 0.803148 +vt 0.443273 0.803148 +vt 0.425305 0.863321 +vt 0.058168 0.863321 +vt 0.559394 0.367478 +vt 0.559394 0.549015 +vt 0.100291 0.549015 +vt 0.100291 0.367478 +vt 0.559394 0.053099 +vt 0.100291 0.053099 +vt 0.091825 0.696501 +vt 0.091825 0.518140 +vt 0.550928 0.518140 +vt 0.550928 0.696501 +vt 0.091825 0.017165 +vt 0.550928 0.017165 +vt 0.107045 0.192632 +vt 0.107045 0.011096 +vt 0.566148 0.011096 +vt 0.566148 0.192632 +vt 0.107045 0.973607 +vt 0.107045 0.802222 +vt 0.566148 0.802222 +vt 0.566148 0.973607 +vn 1.000000 0.000000 0.000000 +vn -0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +vn -1.000000 0.000000 -0.000000 +vn 0.478900 0.000000 -0.877900 +vn 0.877900 0.000000 -0.478900 +vn -0.478900 0.000000 -0.877900 +g Block1_C_T_Cube.019_Top +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/6/2 12/9/2 9/10/2 3/7/2 +f 8/11/3 5/12/3 1/13/3 4/14/3 +f 1/15/4 2/16/4 3/17/4 4/18/4 +f 8/19/5 7/20/5 6/21/5 5/22/5 +f 15/23/6 13/24/6 10/25/6 16/26/6 +f 13/27/3 14/13/3 11/12/3 10/28/3 +f 4/29/4 16/30/4 10/31/4 11/32/4 +f 12/33/6 15/23/6 16/26/6 9/34/6 +f 8/19/5 15/35/5 12/36/5 7/20/5 +f 14/37/5 13/38/5 15/35/5 8/19/5 +f 14/39/1 8/40/1 4/41/1 11/42/1 +f 18/43/1 20/44/1 19/45/1 17/46/1 +f 20/47/2 24/48/2 23/49/2 19/50/2 +f 24/51/6 22/52/6 21/53/6 23/54/6 +f 22/55/3 18/56/3 17/57/3 21/58/3 +f 22/59/5 24/60/5 20/61/5 18/62/5 +f 27/63/1 28/64/1 26/65/1 25/66/1 +f 34/67/5 29/68/5 28/69/5 27/70/5 +f 28/71/2 29/72/2 32/73/2 26/74/2 +f 29/72/2 30/75/2 31/76/2 32/73/2 +f 25/77/4 26/78/4 32/79/4 35/80/4 +f 35/80/4 32/79/4 31/81/4 36/82/4 +f 33/83/5 30/84/5 29/68/5 34/67/5 +f 42/85/6 39/86/6 37/87/6 43/88/6 +f 39/89/3 40/90/3 38/91/3 37/92/3 +f 48/93/4 43/94/4 37/95/4 38/96/4 +f 41/97/6 42/85/6 43/88/6 44/98/6 +f 47/99/4 44/100/4 43/94/4 48/93/4 +f 40/101/5 39/102/5 42/103/5 45/104/5 +f 45/104/5 42/103/5 41/105/5 46/106/5 +f 53/107/1 54/108/1 50/64/1 49/63/1 +f 58/109/2 55/110/2 51/111/2 59/112/2 +f 64/113/4 59/114/4 51/115/4 52/116/4 +f 62/117/5 57/118/5 54/119/5 53/120/5 +f 54/121/2 57/122/2 60/123/2 50/124/2 +f 57/122/2 58/109/2 59/112/2 60/123/2 +f 49/125/4 50/126/4 60/127/4 63/128/4 +f 63/128/4 60/127/4 59/114/4 64/113/4 +f 61/129/5 58/130/5 57/118/5 62/117/5 +g Block1_C_T_Cube.019_Face +f 34/131/7 27/132/7 25/133/7 35/134/7 +f 33/135/3 34/131/3 35/134/3 36/136/3 +f 40/137/8 45/138/8 48/139/8 38/140/8 +f 45/138/1 46/141/1 47/142/1 48/139/1 +f 62/143/7 53/144/7 49/145/7 63/146/7 +f 56/147/9 61/148/9 64/149/9 52/150/9 +f 61/148/3 62/143/3 63/146/3 64/149/3 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_f_b.obj b/mods/mylandscaping/models/mylandscaping_blockf_f_b.obj new file mode 100644 index 00000000..51780122 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_f_b.obj @@ -0,0 +1,181 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_F_B_Cube.010 +v -0.501157 -0.000000 -0.113916 +v -0.501157 0.500000 -0.113916 +v -0.501157 -0.000000 0.294174 +v -0.501157 0.500000 0.294174 +v -0.001157 -0.000000 0.294174 +v -0.001157 -0.000000 -0.013916 +v -0.001157 0.500000 0.294174 +v -0.001157 0.500000 -0.013916 +v 0.182176 0.500000 0.294174 +v 0.182176 -0.000000 0.294174 +v 0.182176 0.500000 -0.113916 +v 0.182176 -0.000000 -0.113916 +v 0.498843 -0.500000 -0.111219 +v 0.498843 -0.500000 0.196871 +v -0.501157 -0.500000 0.196871 +v -0.501157 -0.500000 -0.111219 +v 0.498843 -0.000000 -0.111219 +v 0.498843 -0.000000 0.196871 +v -0.501157 -0.000000 0.196871 +v -0.501157 -0.000000 -0.111219 +v 0.315509 -0.000000 0.196871 +v -0.317824 -0.000000 0.196871 +v -0.317824 -0.500000 0.196871 +v 0.315509 -0.500000 0.196871 +v -0.317824 -0.000000 -0.211219 +v 0.315509 -0.000000 -0.211219 +v 0.315509 -0.500000 -0.211219 +v -0.317824 -0.500000 -0.211219 +v -0.001157 -0.000000 -0.013916 +v -0.001157 -0.000000 0.294174 +v -0.001157 0.500000 -0.013916 +v -0.001157 0.500000 0.294174 +v -0.184491 0.500000 0.294174 +v -0.184491 -0.000000 0.294174 +v -0.184491 0.500000 -0.113916 +v -0.184491 -0.000000 -0.113916 +v 0.498843 0.500000 0.294174 +v 0.498843 -0.000000 0.294174 +v 0.498843 0.500000 -0.113916 +v 0.498843 -0.000000 -0.113916 +vt 0.715648 0.812354 +vt 0.354304 0.812354 +vt 0.354304 0.504300 +vt 0.715648 0.504300 +vt 0.015340 0.806864 +vt 0.015340 0.494611 +vt 0.451998 0.494611 +vt 0.451998 0.806864 +vt 0.443319 0.153976 +vt 0.874457 0.153976 +vt 0.874457 0.734326 +vt 0.443319 0.734326 +vt 0.012708 0.191132 +vt 0.012708 0.010353 +vt 0.449367 0.010353 +vt 0.449367 0.191132 +vt 0.716817 0.212561 +vt 0.355472 0.212561 +vt 0.355472 0.034214 +vt 0.628271 0.034214 +vt 0.012708 0.503385 +vt 0.449367 0.503385 +vt 0.716817 0.520616 +vt 0.355472 0.520616 +vt 0.629569 0.969407 +vt 0.356770 0.969407 +vt 0.356770 0.791060 +vt 0.718114 0.791060 +vt 0.560876 0.247289 +vt 0.886366 0.247289 +vt 0.886366 0.827638 +vt 0.560876 0.827638 +vt 0.017600 0.188258 +vt 0.017599 0.007480 +vt 0.454258 0.007480 +vt 0.454258 0.188258 +vt 0.555118 0.246101 +vt 0.880608 0.246101 +vt 0.880608 0.826450 +vt 0.555118 0.826450 +vt 0.325934 0.817179 +vt 0.687278 0.817180 +vt 0.687278 0.995527 +vt 0.414479 0.995527 +vt 0.321692 0.817179 +vt 0.683037 0.817179 +vt 0.683037 0.995527 +vt 0.410238 0.995527 +vt 0.017600 0.993543 +vt 0.017600 0.812765 +vt 0.454258 0.812765 +vt 0.454258 0.993543 +vt 0.414479 0.022724 +vt 0.687278 0.022724 +vt 0.687278 0.201071 +vt 0.325934 0.201071 +vt 0.410238 0.022724 +vt 0.683037 0.022724 +vt 0.683037 0.201071 +vt 0.321692 0.201071 +vt 0.715648 0.196245 +vt 0.354304 0.196245 +vt 0.354304 0.017898 +vt 0.627103 0.017898 +vt 0.015340 0.987643 +vt 0.451998 0.987643 +vt 0.627103 0.990701 +vt 0.354304 0.990701 +vt 0.356770 0.483006 +vt 0.718114 0.483006 +vt 0.291577 0.995103 +vt 0.291577 0.814914 +vt 0.726812 0.814914 +vt 0.726812 0.995103 +vt 0.287630 0.187567 +vt 0.287630 0.007378 +vt 0.722865 0.007378 +vt 0.722866 0.187567 +vt 0.287630 0.990227 +vt 0.287630 0.810038 +vt 0.722866 0.810038 +vt 0.722866 0.990227 +vt 0.290265 0.190431 +vt 0.290265 0.010242 +vt 0.725501 0.010242 +vt 0.725501 0.190431 +vt 0.290265 0.501666 +vt 0.725501 0.501666 +vt 0.291577 0.503678 +vt 0.726812 0.503678 +vt 0.397799 0.103228 +vt 0.914657 0.103228 +vt 0.914657 0.798965 +vt 0.397799 0.798965 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 1.000000 -0.000000 +vn 1.000000 0.000000 -0.000000 +vn -0.478900 0.000000 -0.877900 +vn 0.478900 0.000000 -0.877900 +vn -0.000000 0.000000 -1.000000 +g Block1_F_B_Cube.010_Material.001 +s off +f 36/1/1 34/2/1 3/3/1 1/4/1 +f 33/5/2 4/6/2 3/7/2 34/8/2 +f 1/9/3 3/10/3 4/11/3 2/12/3 +f 9/13/2 7/14/2 5/15/2 10/16/2 +f 12/17/1 10/18/1 5/19/1 6/20/1 +f 37/21/2 9/13/2 10/16/2 38/22/2 +f 40/23/1 38/24/1 10/18/1 12/17/1 +f 8/25/4 7/26/4 9/27/4 11/28/4 +f 17/29/5 18/30/5 14/31/5 13/32/5 +f 22/33/2 19/34/2 15/35/2 23/36/2 +f 19/37/3 20/38/3 16/39/3 15/40/3 +f 28/41/1 23/42/1 15/43/1 16/44/1 +f 26/45/4 21/46/4 18/47/4 17/48/4 +f 18/49/2 21/50/2 24/51/2 14/52/2 +f 21/50/2 22/33/2 23/36/2 24/51/2 +f 13/53/1 14/54/1 24/55/1 27/56/1 +f 27/56/1 24/55/1 23/42/1 28/41/1 +f 20/57/4 19/58/4 22/59/4 25/60/4 +f 25/60/4 22/59/4 21/46/4 26/45/4 +f 35/61/4 33/62/4 32/63/4 31/64/4 +f 32/65/2 33/5/2 34/8/2 30/66/2 +f 29/67/1 30/68/1 34/2/1 36/1/1 +f 2/4/4 4/3/4 33/62/4 35/61/4 +f 11/28/4 9/27/4 37/69/4 39/70/4 +g Block1_F_B_Cube.010_Material.001_mylandscaping_block_face.png +f 8/71/6 11/72/6 12/73/6 6/74/6 +f 26/75/7 17/76/7 13/77/7 27/78/7 +f 20/79/6 25/80/6 28/81/6 16/82/6 +f 25/80/8 26/75/8 27/78/8 28/81/8 +f 35/83/7 31/84/7 29/85/7 36/86/7 +f 2/87/8 35/83/8 36/86/8 1/88/8 +f 11/72/8 39/89/8 40/90/8 12/73/8 +g Block1_F_B_Cube.010_Material.001_mylandscaping_block_top_1.png +f 39/91/5 37/92/5 38/93/5 40/94/5 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_f_t.obj b/mods/mylandscaping/models/mylandscaping_blockf_f_t.obj new file mode 100644 index 00000000..e7b49cde --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_f_t.obj @@ -0,0 +1,203 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_F_T_Cube.009 +v 0.492888 0.500749 0.043985 +v 0.492888 0.500749 0.509342 +v -0.501157 0.500749 0.509342 +v -0.501157 0.500749 0.043986 +v 0.492888 0.600202 0.043985 +v 0.492888 0.600202 0.509342 +v -0.501157 0.600202 0.509342 +v -0.501157 0.600202 0.043986 +v -0.501157 -0.000000 0.086084 +v -0.501157 0.500000 0.086084 +v -0.501157 -0.000000 0.494174 +v -0.501157 0.500000 0.494174 +v -0.001157 -0.000000 0.494174 +v -0.001157 -0.000000 0.186084 +v -0.001157 0.500000 0.494174 +v -0.001157 0.500000 0.186084 +v 0.182176 0.500000 0.494174 +v 0.182176 -0.000000 0.494174 +v 0.182176 0.500000 0.086084 +v 0.182176 -0.000000 0.086084 +v 0.498843 -0.500000 0.088781 +v 0.498843 -0.500000 0.396871 +v -0.501157 -0.500000 0.396871 +v -0.501157 -0.500000 0.088781 +v 0.498843 -0.000000 0.088781 +v 0.498843 -0.000000 0.396871 +v -0.501157 -0.000000 0.396871 +v -0.501157 -0.000000 0.088781 +v 0.315509 -0.000000 0.396871 +v -0.317824 -0.000000 0.396871 +v -0.317824 -0.500000 0.396871 +v 0.315509 -0.500000 0.396871 +v -0.317824 -0.000000 -0.011219 +v 0.315509 -0.000000 -0.011219 +v 0.315509 -0.500000 -0.011219 +v -0.317824 -0.500000 -0.011219 +v -0.001157 -0.000000 0.186084 +v -0.001157 -0.000000 0.494174 +v -0.001157 0.500000 0.186084 +v -0.001157 0.500000 0.494174 +v -0.184491 0.500000 0.494174 +v -0.184491 -0.000000 0.494174 +v -0.184491 0.500000 0.086084 +v -0.184491 -0.000000 0.086084 +v 0.498843 0.500000 0.494174 +v 0.498843 -0.000000 0.494174 +v 0.498843 0.500000 0.086084 +v 0.498843 -0.000000 0.086084 +vt 0.640066 0.556974 +vt 0.640066 0.185360 +vt 0.717926 0.185360 +vt 0.717926 0.556974 +vt 0.641384 0.775150 +vt 0.641383 0.002754 +vt 0.719244 0.002754 +vt 0.719244 0.775150 +vt 0.639198 0.575142 +vt 0.639198 0.203528 +vt 0.717059 0.203528 +vt 0.717059 0.575142 +vt 0.721617 -0.000023 +vt 0.721617 0.772373 +vt 0.643756 0.772373 +vt 0.643756 -0.000023 +vt 0.479781 0.979226 +vt 0.014465 0.979226 +vt 0.014464 0.019315 +vt 0.479781 0.019315 +vt 0.493523 0.979226 +vt 0.028206 0.979226 +vt 0.028206 0.019315 +vt 0.493523 0.019315 +vt 0.552652 0.211458 +vt 0.947632 0.211458 +vt 0.947632 0.507451 +vt 0.552652 0.507451 +vt 0.024349 0.317073 +vt 0.024349 0.011281 +vt 0.510823 0.011281 +vt 0.510824 0.317073 +vt 0.949855 0.488268 +vt 0.554876 0.488268 +vt 0.554876 0.020910 +vt 0.949855 0.020910 +vt 0.510823 0.799904 +vt 0.510823 0.976942 +vt 0.024349 0.976942 +vt 0.024349 0.799904 +vt 0.950170 0.676589 +vt 0.555190 0.676589 +vt 0.555190 0.505225 +vt 0.853382 0.505225 +vt 0.510823 0.494111 +vt 0.024349 0.494111 +vt 0.950170 0.972583 +vt 0.555190 0.972583 +vt 0.683517 0.526827 +vt 0.979001 0.526827 +vt 0.979001 0.989940 +vt 0.683517 0.989940 +vt 0.499118 0.199836 +vt 0.499118 0.028471 +vt 0.970003 0.028471 +vt 0.970004 0.199836 +vt 0.689845 0.526826 +vt 0.985329 0.526826 +vt 0.985329 0.989940 +vt 0.689845 0.989940 +vt 0.546636 0.800105 +vt 0.941616 0.800105 +vt 0.941616 0.971470 +vt 0.643424 0.971470 +vt 0.547905 0.807390 +vt 0.942885 0.807390 +vt 0.942885 0.978755 +vt 0.644693 0.978755 +vt 0.499118 0.963188 +vt 0.499118 0.791823 +vt 0.970004 0.791823 +vt 0.970004 0.963188 +vt 0.643423 0.036753 +vt 0.941616 0.036753 +vt 0.941616 0.208118 +vt 0.546636 0.208118 +vt 0.644692 0.044038 +vt 0.942885 0.044038 +vt 0.942885 0.215403 +vt 0.547905 0.215403 +vt 0.649439 0.040093 +vt 0.947632 0.040093 +vt 0.224882 0.507068 +vt 0.224882 0.326398 +vt 0.721339 0.326398 +vt 0.721339 0.507068 +vt 0.724768 0.815143 +vt 0.724768 0.995814 +vt 0.228311 0.995814 +vt 0.228311 0.815143 +vt 0.724768 0.010338 +vt 0.724768 0.191008 +vt 0.228311 0.191008 +vt 0.228311 0.010338 +vt 0.224882 0.681643 +vt 0.224882 0.500972 +vt 0.721339 0.500972 +vt 0.721339 0.681643 +vt 0.224882 0.993710 +vt 0.721339 0.993710 +vt 0.224882 0.014331 +vt 0.721339 0.014331 +vt 0.257739 0.157252 +vt 0.860063 0.157252 +vt 0.860063 0.869950 +vt 0.257739 0.869950 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn -0.478900 0.000000 -0.877900 +vn 0.478900 0.000000 -0.877900 +g Block1_F_T_Cube.009_Top +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/9/3 8/10/3 4/11/3 3/12/3 +f 8/13/4 5/14/4 1/15/4 4/16/4 +f 1/17/5 2/18/5 3/19/5 4/20/5 +f 8/21/6 7/22/6 6/23/6 5/24/6 +f 44/25/5 42/26/5 11/27/5 9/28/5 +f 41/29/2 12/30/2 11/31/2 42/32/2 +f 9/33/3 11/34/3 12/35/3 10/36/3 +f 17/37/2 15/38/2 13/39/2 18/40/2 +f 20/41/5 18/42/5 13/43/5 14/44/5 +f 45/45/2 17/37/2 18/40/2 46/46/2 +f 48/47/5 46/48/5 18/42/5 20/41/5 +f 25/49/1 26/50/1 22/51/1 21/52/1 +f 30/53/2 27/54/2 23/55/2 31/56/2 +f 27/57/3 28/58/3 24/59/3 23/60/3 +f 36/61/5 31/62/5 23/63/5 24/64/5 +f 34/65/6 29/66/6 26/67/6 25/68/6 +f 26/69/2 29/70/2 32/71/2 22/72/2 +f 29/70/2 30/53/2 31/56/2 32/71/2 +f 21/73/5 22/74/5 32/75/5 35/76/5 +f 35/76/5 32/75/5 31/62/5 36/61/5 +f 28/77/6 27/78/6 30/79/6 33/80/6 +f 33/80/6 30/79/6 29/66/6 34/65/6 +f 40/46/2 41/29/2 42/32/2 38/45/2 +f 37/81/5 38/82/5 42/26/5 44/25/5 +g Block1_F_T_Cube.009_Top_mylandscaping_block_face.png +f 16/83/7 19/84/7 20/85/7 14/86/7 +f 34/87/8 25/88/8 21/89/8 35/90/8 +f 28/91/7 33/92/7 36/93/7 24/94/7 +f 33/92/4 34/87/4 35/90/4 36/93/4 +f 43/95/8 39/96/8 37/97/8 44/98/8 +f 10/99/4 43/95/4 44/98/4 9/100/4 +f 19/84/4 47/101/4 48/102/4 20/85/4 +g Block1_F_T_Cube.009_Top_mylandscaping_block_top_1.png +f 47/103/1 45/104/1 46/105/1 48/106/1 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_l_b.obj b/mods/mylandscaping/models/mylandscaping_blockf_l_b.obj new file mode 100644 index 00000000..b58281b9 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_l_b.obj @@ -0,0 +1,137 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_L_B_Cube.024 +v 0.001194 0.000000 0.298638 +v 0.001194 0.000000 -0.009452 +v 0.001194 0.500000 0.298638 +v 0.001194 0.500000 -0.009452 +v 0.184527 0.500000 0.298638 +v 0.184527 0.000000 0.298638 +v 0.184527 0.500000 -0.109452 +v 0.184527 0.000000 -0.109452 +v 0.501194 -0.500000 -0.106756 +v 0.501194 -0.500000 0.201335 +v -0.498806 -0.500000 0.201335 +v -0.498806 -0.500000 -0.106755 +v 0.501194 0.000000 -0.106756 +v 0.501194 0.000000 0.201335 +v -0.498806 0.000000 0.201335 +v -0.498806 0.000000 -0.106755 +v 0.317861 0.000000 0.201335 +v -0.315473 0.000000 0.201335 +v -0.315473 -0.500000 0.201335 +v 0.317861 -0.500000 0.201335 +v -0.315473 0.000000 -0.206756 +v 0.317861 0.000000 -0.206756 +v 0.317861 -0.500000 -0.206756 +v -0.315473 -0.500000 -0.206756 +v 0.501194 0.000000 -0.109452 +v 0.501194 0.500000 -0.109452 +v 0.501194 0.000000 0.298638 +v 0.501194 0.500000 0.298638 +vt 0.435772 0.193927 +vt 0.435772 0.018069 +vt 0.934259 0.018069 +vt 0.934259 0.193927 +vt 0.489082 0.338969 +vt 0.489082 0.647620 +vt 0.007139 0.647620 +vt 0.007139 0.338969 +vt 0.427113 0.782580 +vt 0.833968 0.782580 +vt 0.833968 0.958438 +vt 0.526810 0.958438 +vt 0.435773 0.497681 +vt 0.934259 0.497680 +vt 0.026084 0.308608 +vt 0.508027 0.308608 +vt 0.508027 0.717441 +vt 0.026084 0.717441 +vt 0.427113 0.478826 +vt 0.833968 0.478827 +vt 0.742930 0.977292 +vt 0.435773 0.977292 +vt 0.435773 0.801434 +vt 0.842627 0.801434 +vt 0.489082 0.336425 +vt 0.489082 0.645076 +vt 0.007139 0.645076 +vt 0.007139 0.336425 +vt 0.015293 0.188879 +vt 0.015293 0.012166 +vt 0.516203 0.012166 +vt 0.516203 0.188879 +vt 0.014729 0.657712 +vt 0.014729 0.349061 +vt 0.496672 0.349061 +vt 0.496672 0.657712 +vt 0.419560 0.786387 +vt 0.826414 0.786387 +vt 0.826414 0.962244 +vt 0.519257 0.962244 +vt 0.420589 0.793940 +vt 0.827443 0.793940 +vt 0.827443 0.969798 +vt 0.520286 0.969798 +vt 0.015293 0.976053 +vt 0.015293 0.799340 +vt 0.516203 0.799340 +vt 0.516203 0.976053 +vt 0.519257 0.003022 +vt 0.826414 0.003022 +vt 0.826414 0.178880 +vt 0.419560 0.178880 +vt 0.520286 0.010575 +vt 0.827443 0.010575 +vt 0.827443 0.186433 +vt 0.420589 0.186433 +vt 0.842627 0.497681 +vt 0.681252 0.254856 +vt 0.681252 0.445481 +vt 0.167015 0.445481 +vt 0.167014 0.254857 +vt 0.167014 0.176812 +vt 0.167014 0.006531 +vt 0.681251 0.006531 +vt 0.681251 0.176812 +vt 0.167015 0.990820 +vt 0.167015 0.800196 +vt 0.681252 0.800196 +vt 0.681252 0.990820 +vt 0.681252 0.757173 +vt 0.167015 0.757173 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.478900 0.000000 -0.877900 +vn 0.478900 0.000000 -0.877900 +vn -0.000000 0.000000 -1.000000 +g Block1_L_B_Cube.024_Top +s off +f 5/1/1 3/2/1 1/3/1 6/4/1 +f 3/5/2 4/6/2 2/7/2 1/8/2 +f 8/9/3 6/10/3 1/11/3 2/12/3 +f 28/13/1 5/1/1 6/4/1 27/14/1 +f 25/15/4 26/16/4 28/17/4 27/18/4 +f 25/19/3 27/20/3 6/10/3 8/9/3 +f 4/21/5 3/22/5 5/23/5 7/24/5 +f 13/25/4 14/26/4 10/27/4 9/28/4 +f 18/29/1 15/30/1 11/31/1 19/32/1 +f 15/33/2 16/34/2 12/35/2 11/36/2 +f 24/37/3 19/38/3 11/39/3 12/40/3 +f 22/41/5 17/42/5 14/43/5 13/44/5 +f 14/45/1 17/46/1 20/47/1 10/48/1 +f 17/46/1 18/29/1 19/32/1 20/47/1 +f 9/49/3 10/50/3 20/51/3 23/52/3 +f 23/52/3 20/51/3 19/38/3 24/37/3 +f 16/53/5 15/54/5 18/55/5 21/56/5 +f 21/56/5 18/55/5 17/42/5 22/41/5 +f 7/24/5 5/23/5 28/13/5 26/57/5 +g Block1_L_B_Cube.024_Face +f 4/58/6 7/59/6 8/60/6 2/61/6 +f 22/62/7 13/63/7 9/64/7 23/65/7 +f 16/66/6 21/67/6 24/68/6 12/69/6 +f 21/67/8 22/62/8 23/65/8 24/68/8 +f 7/59/8 26/70/8 25/71/8 8/60/8 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_l_t.obj b/mods/mylandscaping/models/mylandscaping_blockf_l_t.obj new file mode 100644 index 00000000..02d88301 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_l_t.obj @@ -0,0 +1,168 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_L_T_Cube.023 +v 0.495239 0.499916 0.048449 +v 0.495239 0.499916 0.513806 +v -0.498806 0.499916 0.513806 +v -0.498806 0.499916 0.048449 +v 0.495239 0.601002 0.048449 +v 0.495239 0.601002 0.513806 +v -0.498806 0.601002 0.513806 +v -0.498806 0.601002 0.048449 +v 0.001194 0.000000 0.498638 +v 0.001194 0.000000 0.190548 +v 0.001194 0.500000 0.498638 +v 0.001194 0.500000 0.190548 +v 0.184527 0.500000 0.498638 +v 0.184527 0.000000 0.498638 +v 0.184527 0.500000 0.090548 +v 0.184527 0.000000 0.090548 +v 0.501194 -0.500000 0.093244 +v 0.501194 -0.500000 0.401335 +v -0.498806 -0.500000 0.401335 +v -0.498806 -0.500000 0.093245 +v 0.501194 0.000000 0.093244 +v 0.501194 0.000000 0.401335 +v -0.498806 0.000000 0.401335 +v -0.498806 0.000000 0.093245 +v 0.317861 0.000000 0.401335 +v -0.315473 0.000000 0.401335 +v -0.315473 -0.500000 0.401335 +v 0.317861 -0.500000 0.401335 +v -0.315473 0.000000 -0.006756 +v 0.317861 0.000000 -0.006756 +v 0.317861 -0.500000 -0.006756 +v -0.315473 -0.500000 -0.006756 +v 0.501194 0.000000 0.090548 +v 0.501194 0.500000 0.090548 +v 0.501194 0.000000 0.498638 +v 0.501194 0.500000 0.498638 +vt 0.737841 0.685557 +vt 0.737841 0.252560 +vt 0.818358 0.252560 +vt 0.818358 0.685557 +vt 0.809494 0.036626 +vt 0.809494 0.961548 +vt 0.728976 0.961548 +vt 0.728976 0.036626 +vt 0.686444 0.726327 +vt 0.686444 0.293330 +vt 0.766962 0.293330 +vt 0.766962 0.726327 +vt 0.646455 0.947725 +vt 0.646454 0.026127 +vt 0.726972 0.026127 +vt 0.726972 0.947725 +vt 0.938979 0.968522 +vt 0.568309 0.968522 +vt 0.568309 0.043600 +vt 0.938979 0.043600 +vt 0.931067 0.962697 +vt 0.560397 0.962697 +vt 0.560397 0.037776 +vt 0.931067 0.037776 +vt 0.043289 0.378343 +vt 0.043289 0.199481 +vt 0.460878 0.199481 +vt 0.460878 0.378342 +vt 0.635006 0.100694 +vt 0.880409 0.100694 +vt 0.880409 0.565925 +vt 0.635006 0.565925 +vt 0.926102 0.395456 +vt 0.601046 0.395456 +vt 0.601046 0.224871 +vt 0.846449 0.224871 +vt 0.043289 0.687286 +vt 0.460878 0.687286 +vt 0.587188 0.926035 +vt 0.587188 0.460804 +vt 0.912244 0.460804 +vt 0.912244 0.926035 +vt 0.926102 0.690102 +vt 0.601046 0.690102 +vt 0.623357 0.466912 +vt 0.868760 0.466912 +vt 0.868760 0.932143 +vt 0.623357 0.932143 +vt 0.037182 0.184422 +vt 0.037182 0.005560 +vt 0.454771 0.005560 +vt 0.454771 0.184422 +vt 0.850306 0.753454 +vt 0.604903 0.753454 +vt 0.604904 0.288222 +vt 0.850306 0.288222 +vt 0.915106 0.214237 +vt 0.590050 0.214237 +vt 0.590050 0.043652 +vt 0.835453 0.043652 +vt 0.579958 0.808153 +vt 0.905013 0.808152 +vt 0.905013 0.978737 +vt 0.659611 0.978737 +vt 0.037182 0.981171 +vt 0.037182 0.802309 +vt 0.454771 0.802309 +vt 0.454771 0.981171 +vt 0.835453 0.974115 +vt 0.590050 0.974115 +vt 0.590050 0.803530 +vt 0.915106 0.803530 +vt 0.659611 0.048275 +vt 0.905013 0.048275 +vt 0.905013 0.218860 +vt 0.579957 0.218860 +vt 0.251839 0.891590 +vt 0.251839 0.703647 +vt 0.672700 0.703647 +vt 0.672700 0.891590 +vt 0.672700 0.815338 +vt 0.672700 0.986627 +vt 0.251839 0.986627 +vt 0.251839 0.815338 +vt 0.672700 0.006905 +vt 0.672700 0.194848 +vt 0.251839 0.194848 +vt 0.251839 0.006905 +vt 0.251839 0.393402 +vt 0.672700 0.393402 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 -0.000000 +vn -0.478900 0.000000 -0.877900 +vn 0.478900 0.000000 -0.877900 +g Block1_L_T_Cube.023_Top +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/9/3 8/10/3 4/11/3 3/12/3 +f 8/13/4 5/14/4 1/15/4 4/16/4 +f 1/17/5 2/18/5 3/19/5 4/20/5 +f 8/21/6 7/22/6 6/23/6 5/24/6 +f 13/25/2 11/26/2 9/27/2 14/28/2 +f 11/29/3 12/30/3 10/31/3 9/32/3 +f 16/33/5 14/34/5 9/35/5 10/36/5 +f 36/37/2 13/25/2 14/28/2 35/38/2 +f 33/39/1 34/40/1 36/41/1 35/42/1 +f 33/43/5 35/44/5 14/34/5 16/33/5 +f 21/45/1 22/46/1 18/47/1 17/48/1 +f 26/49/2 23/50/2 19/51/2 27/52/2 +f 23/53/3 24/54/3 20/55/3 19/56/3 +f 32/57/5 27/58/5 19/59/5 20/60/5 +f 30/61/6 25/62/6 22/63/6 21/64/6 +f 22/65/2 25/66/2 28/67/2 18/68/2 +f 25/66/2 26/49/2 27/52/2 28/67/2 +f 17/69/5 18/70/5 28/71/5 31/72/5 +f 31/72/5 28/71/5 27/58/5 32/57/5 +f 24/73/6 23/74/6 26/75/6 29/76/6 +f 29/76/6 26/75/6 25/62/6 30/61/6 +g Block1_L_T_Cube.023_Face +f 12/77/7 15/78/7 16/79/7 10/80/7 +f 30/81/8 21/82/8 17/83/8 31/84/8 +f 24/85/7 29/86/7 32/87/7 20/88/7 +f 29/86/4 30/81/4 31/84/4 32/87/4 +f 15/78/4 34/89/4 33/90/4 16/79/4 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_m_b.obj b/mods/mylandscaping/models/mylandscaping_blockf_m_b.obj new file mode 100644 index 00000000..c0a4d379 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_m_b.obj @@ -0,0 +1,150 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_M_B_Cube.025 +v 1.001194 0.000000 -0.009452 +v 1.001194 0.000000 0.298638 +v 0.001194 0.000000 0.298638 +v 0.001194 0.000000 -0.009452 +v 1.001194 0.500000 -0.009452 +v 1.001194 0.500000 0.298638 +v 0.001194 0.500000 0.298638 +v 0.001194 0.500000 -0.009452 +v 0.817861 0.500000 0.298638 +v 0.184527 0.500000 0.298638 +v 0.184527 0.000000 0.298638 +v 0.817861 0.000000 0.298638 +v 0.184527 0.500000 -0.109452 +v 0.817860 0.500000 -0.109452 +v 0.817860 0.000000 -0.109452 +v 0.184527 0.000000 -0.109452 +v 0.501194 -0.500000 -0.106755 +v 0.501194 -0.500000 0.201335 +v -0.498806 -0.500000 0.201335 +v -0.498806 -0.500000 -0.106755 +v 0.501194 0.000000 -0.106755 +v 0.501194 0.000000 0.201335 +v -0.498806 0.000000 0.201335 +v -0.498806 0.000000 -0.106755 +v 0.317861 0.000000 0.201335 +v -0.315473 0.000000 0.201335 +v -0.315473 -0.500000 0.201335 +v 0.317861 -0.500000 0.201335 +v -0.315473 0.000000 -0.206755 +v 0.317861 0.000000 -0.206755 +v 0.317861 -0.500000 -0.206755 +v -0.315473 -0.500000 -0.206755 +vt 0.243205 0.005854 +vt 0.519640 0.005854 +vt 0.519640 0.493899 +vt 0.243205 0.493899 +vt 0.584034 0.802995 +vt 0.584034 0.981945 +vt 0.147505 0.981945 +vt 0.147505 0.802995 +vt 0.560434 0.005854 +vt 0.836869 0.005854 +vt 0.836869 0.493899 +vt 0.560435 0.493899 +vt 0.816658 0.197005 +vt 0.450498 0.197005 +vt 0.450498 0.018055 +vt 0.726933 0.018055 +vt 0.300696 0.802995 +vt 0.666856 0.802995 +vt 0.666856 0.981945 +vt 0.390421 0.981945 +vt 0.584034 0.005854 +vt 0.584034 0.184804 +vt 0.147505 0.184804 +vt 0.147505 0.005854 +vt 0.726933 0.994146 +vt 0.450498 0.994146 +vt 0.450498 0.815196 +vt 0.816658 0.815196 +vt 0.390421 0.005854 +vt 0.666856 0.005854 +vt 0.666856 0.184804 +vt 0.300696 0.184804 +vt 0.836869 0.981945 +vt 0.560434 0.981945 +vt 0.156994 0.184804 +vt 0.156994 0.005854 +vt 0.593523 0.005854 +vt 0.593523 0.184804 +vt 0.519640 0.981945 +vt 0.243205 0.981945 +vt 0.816658 0.190905 +vt 0.450498 0.190905 +vt 0.450498 0.011955 +vt 0.726933 0.011955 +vt 0.303408 0.809095 +vt 0.669568 0.809095 +vt 0.669568 0.988045 +vt 0.393133 0.988045 +vt 0.156995 0.981945 +vt 0.156994 0.802995 +vt 0.593523 0.802995 +vt 0.593523 0.981945 +vt 0.726933 0.988045 +vt 0.450498 0.988045 +vt 0.450498 0.809095 +vt 0.816658 0.809095 +vt 0.393133 0.011955 +vt 0.669568 0.011955 +vt 0.669568 0.190905 +vt 0.303408 0.190905 +vt 0.982303 0.808078 +vt 0.982303 0.987579 +vt 0.544431 0.987579 +vt 0.544431 0.808078 +vt 0.982303 0.008484 +vt 0.982303 0.187985 +vt 0.544431 0.187985 +vt 0.544431 0.008484 +vt 0.458763 0.808078 +vt 0.458763 0.987579 +vt 0.020892 0.987579 +vt 0.020891 0.808078 +vt 0.458763 0.008484 +vt 0.458763 0.187985 +vt 0.020891 0.187985 +vt 0.020891 0.008484 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.478900 0.000000 -0.877900 +vn -0.478900 0.000000 -0.877900 +vn -0.000000 0.000000 -1.000000 +g Block1_M_B_Cube.025_Top +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 10/5/2 7/6/2 3/7/2 11/8/2 +f 7/9/3 8/10/3 4/11/3 3/12/3 +f 16/13/4 11/14/4 3/15/4 4/16/4 +f 14/17/5 9/18/5 6/19/5 5/20/5 +f 6/21/2 9/22/2 12/23/2 2/24/2 +f 9/22/2 10/5/2 11/8/2 12/23/2 +f 1/25/4 2/26/4 12/27/4 15/28/4 +f 15/28/4 12/27/4 11/14/4 16/13/4 +f 8/29/5 7/30/5 10/31/5 13/32/5 +f 13/32/5 10/31/5 9/18/5 14/17/5 +f 21/12/1 22/11/1 18/33/1 17/34/1 +f 26/35/2 23/36/2 19/37/2 27/38/2 +f 23/39/3 24/40/3 20/4/3 19/3/3 +f 32/41/4 27/42/4 19/43/4 20/44/4 +f 30/45/5 25/46/5 22/47/5 21/48/5 +f 22/49/2 25/50/2 28/51/2 18/52/2 +f 25/50/2 26/35/2 27/38/2 28/51/2 +f 17/53/4 18/54/4 28/55/4 31/56/4 +f 31/56/4 28/55/4 27/42/4 32/41/4 +f 24/57/5 23/58/5 26/59/5 29/60/5 +f 29/60/5 26/59/5 25/46/5 30/45/5 +g Block1_M_B_Cube.025_Face +f 14/61/6 5/62/6 1/63/6 15/64/6 +f 8/65/7 13/66/7 16/67/7 4/68/7 +f 13/66/8 14/61/8 15/64/8 16/67/8 +f 30/69/6 21/70/6 17/71/6 31/72/6 +f 24/73/7 29/74/7 32/75/7 20/76/7 +f 29/74/8 30/69/8 31/72/8 32/75/8 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_m_t.obj b/mods/mylandscaping/models/mylandscaping_blockf_m_t.obj new file mode 100644 index 00000000..61e3d9aa --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_m_t.obj @@ -0,0 +1,190 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_M_T_Cube.021 +v 0.495239 0.499740 0.048449 +v 0.495239 0.499740 0.513806 +v -0.498806 0.499740 0.513806 +v -0.498806 0.499740 0.048449 +v 0.495239 0.600283 0.048449 +v 0.495239 0.600283 0.513806 +v -0.498806 0.600283 0.513806 +v -0.498806 0.600283 0.048449 +v 1.001194 0.000000 0.190548 +v 1.001194 0.000000 0.498638 +v 0.001194 0.000000 0.498638 +v 0.001194 0.000000 0.190548 +v 1.001194 0.500000 0.190548 +v 1.001194 0.500000 0.498638 +v 0.001194 0.500000 0.498638 +v 0.001194 0.500000 0.190548 +v 0.817861 0.500000 0.498638 +v 0.184527 0.500000 0.498638 +v 0.184527 0.000000 0.498638 +v 0.817861 0.000000 0.498638 +v 0.184527 0.500000 0.090548 +v 0.817860 0.500000 0.090548 +v 0.817860 0.000000 0.090548 +v 0.184527 0.000000 0.090548 +v 0.501194 -0.500000 0.093245 +v 0.501194 -0.500000 0.401335 +v -0.498806 -0.500000 0.401335 +v -0.498806 -0.500000 0.093245 +v 0.501194 0.000000 0.093245 +v 0.501194 0.000000 0.401335 +v -0.498806 0.000000 0.401335 +v -0.498806 0.000000 0.093245 +v 0.317861 0.000000 0.401335 +v -0.315473 0.000000 0.401335 +v -0.315473 -0.500000 0.401335 +v 0.317861 -0.500000 0.401335 +v -0.315473 0.000000 -0.006755 +v 0.317861 0.000000 -0.006755 +v 0.317861 -0.500000 -0.006755 +v -0.315473 -0.500000 -0.006755 +vt 0.307895 0.520103 +vt 0.307895 0.062841 +vt 0.404094 0.062841 +vt 0.404094 0.520103 +vt 0.658276 0.025493 +vt 0.658276 0.975907 +vt 0.562077 0.975907 +vt 0.562077 0.025493 +vt 0.431920 0.882196 +vt 0.431920 0.424934 +vt 0.528119 0.424934 +vt 0.528119 0.882196 +vt 0.583580 0.018024 +vt 0.583580 0.968438 +vt 0.487381 0.968438 +vt 0.487381 0.018024 +vt 0.698606 0.968438 +vt 0.241014 0.968438 +vt 0.241014 0.018024 +vt 0.698606 0.018024 +vt 0.248483 0.034739 +vt 0.706076 0.034739 +vt 0.706076 0.985153 +vt 0.248484 0.985153 +vt 0.048495 0.478886 +vt 0.351445 0.478886 +vt 0.351445 0.956940 +vt 0.048495 0.956940 +vt 0.043270 0.207440 +vt 0.043270 0.032153 +vt 0.521668 0.032153 +vt 0.521668 0.207440 +vt 0.481831 0.723785 +vt 0.178881 0.723785 +vt 0.178881 0.245731 +vt 0.481831 0.245731 +vt 0.531430 0.790565 +vt 0.932712 0.790565 +vt 0.932712 0.965852 +vt 0.629762 0.965852 +vt 0.970060 0.207440 +vt 0.568778 0.207440 +vt 0.568778 0.032153 +vt 0.871728 0.032153 +vt 0.043270 0.988261 +vt 0.043270 0.812974 +vt 0.521669 0.812974 +vt 0.521669 0.988261 +vt 0.629762 0.009744 +vt 0.932712 0.009744 +vt 0.932712 0.185031 +vt 0.531430 0.185031 +vt 0.871728 0.988261 +vt 0.568778 0.988261 +vt 0.568778 0.812974 +vt 0.970060 0.812974 +vt 0.686345 0.999282 +vt 0.989294 0.999282 +vt 0.989295 1.477336 +vt 0.686345 1.477336 +vt 0.543732 0.805505 +vt 0.543732 0.980791 +vt 0.065333 0.980791 +vt 0.065333 0.805505 +vt 0.771058 0.821345 +vt 0.468108 0.821345 +vt 0.468108 0.343291 +vt 0.771058 0.343291 +vt 0.960298 0.199970 +vt 0.559017 0.199970 +vt 0.559017 0.024684 +vt 0.861966 0.024684 +vt 0.945014 0.805505 +vt 0.945014 0.980791 +vt 0.642064 0.980791 +vt 0.543732 0.024684 +vt 0.543732 0.199970 +vt 0.065333 0.199970 +vt 0.065333 0.024684 +vt 0.861966 0.980791 +vt 0.559017 0.980791 +vt 0.559017 0.805505 +vt 0.960298 0.805505 +vt 0.642064 0.024684 +vt 0.945013 0.024684 +vt 0.945014 0.199970 +vt 0.984949 0.805553 +vt 0.984949 0.984262 +vt 0.497211 0.984262 +vt 0.497211 0.805553 +vt 0.984949 0.009488 +vt 0.984949 0.188197 +vt 0.497211 0.188197 +vt 0.497211 0.009489 +vt 0.690722 0.805553 +vt 0.690722 0.984261 +vt 0.202984 0.984262 +vt 0.202984 0.805553 +vt 0.690722 0.009488 +vt 0.690722 0.188197 +vt 0.202984 0.188197 +vt 0.202984 0.009489 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.478900 0.000000 -0.877900 +vn -0.478900 0.000000 -0.877900 +g Block1_M_T_Cube.021_Top +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/9/3 8/10/3 4/11/3 3/12/3 +f 8/13/4 5/14/4 1/15/4 4/16/4 +f 1/17/5 2/18/5 3/19/5 4/20/5 +f 8/21/6 7/22/6 6/23/6 5/24/6 +f 13/25/1 14/26/1 10/27/1 9/28/1 +f 18/29/2 15/30/2 11/31/2 19/32/2 +f 15/33/3 16/34/3 12/35/3 11/36/3 +f 24/37/5 19/38/5 11/39/5 12/40/5 +f 22/41/6 17/42/6 14/43/6 13/44/6 +f 14/45/2 17/46/2 20/47/2 10/48/2 +f 17/46/2 18/29/2 19/32/2 20/47/2 +f 9/49/5 10/50/5 20/51/5 23/52/5 +f 23/52/5 20/51/5 19/38/5 24/37/5 +f 16/53/6 15/54/6 18/55/6 21/56/6 +f 21/56/6 18/55/6 17/42/6 22/41/6 +f 29/57/1 30/58/1 26/59/1 25/60/1 +f 34/61/2 31/62/2 27/63/2 35/64/2 +f 31/65/3 32/66/3 28/67/3 27/68/3 +f 40/69/5 35/70/5 27/71/5 28/72/5 +f 38/61/6 33/73/6 30/74/6 29/75/6 +f 30/76/2 33/77/2 36/78/2 26/79/2 +f 33/77/2 34/61/2 35/64/2 36/78/2 +f 25/80/5 26/81/5 36/82/5 39/83/5 +f 39/83/5 36/82/5 35/70/5 40/69/5 +f 32/84/6 31/85/6 34/86/6 37/77/6 +f 37/77/6 34/86/6 33/73/6 38/61/6 +g Block1_M_T_Cube.021_Face +f 22/87/7 13/88/7 9/89/7 23/90/7 +f 16/91/8 21/92/8 24/93/8 12/94/8 +f 21/92/4 22/87/4 23/90/4 24/93/4 +f 38/95/7 29/96/7 25/97/7 39/98/7 +f 32/99/8 37/100/8 40/101/8 28/102/8 +f 37/100/4 38/95/4 39/98/4 40/101/4 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_r_b.obj b/mods/mylandscaping/models/mylandscaping_blockf_r_b.obj new file mode 100644 index 00000000..0894d6db --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_r_b.obj @@ -0,0 +1,198 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block_Left_Bottom_Cube.026 +v -0.501157 -0.000000 -0.109385 +v -0.501157 0.500000 -0.109385 +v -0.501157 -0.000000 0.298705 +v -0.501157 0.500000 0.298705 +v 0.998843 -0.000000 -0.009385 +v 0.998843 -0.000000 0.298705 +v -0.001157 -0.000000 0.298705 +v -0.001157 -0.000000 -0.009385 +v 0.998843 0.500000 -0.009385 +v 0.998843 0.500000 0.298705 +v -0.001157 0.500000 0.298705 +v -0.001157 0.500000 -0.009385 +v 0.815509 0.500000 0.298705 +v 0.182176 0.500000 0.298705 +v 0.182176 -0.000000 0.298705 +v 0.815509 -0.000000 0.298705 +v 0.182176 0.500000 -0.109385 +v 0.815509 0.500000 -0.109385 +v 0.815509 -0.000000 -0.109385 +v 0.182176 -0.000000 -0.109385 +v 0.498843 -0.500000 -0.106688 +v 0.498843 -0.500000 0.201402 +v -0.501157 -0.500000 0.201402 +v -0.501157 -0.500000 -0.106688 +v 0.498843 -0.000000 -0.106688 +v 0.498843 -0.000000 0.201402 +v -0.501157 -0.000000 0.201402 +v -0.501157 -0.000000 -0.106688 +v 0.315509 -0.000000 0.201402 +v -0.317824 -0.000000 0.201402 +v -0.317824 -0.500000 0.201402 +v 0.315509 -0.500000 0.201402 +v -0.317824 -0.000000 -0.206688 +v 0.315509 -0.000000 -0.206688 +v 0.315509 -0.500000 -0.206688 +v -0.317824 -0.500000 -0.206688 +v -0.001157 -0.000000 -0.009385 +v -0.001157 -0.000000 0.298705 +v -0.001157 0.500000 -0.009385 +v -0.001157 0.500000 0.298705 +v -0.184491 0.500000 0.298705 +v -0.184491 -0.000000 0.298705 +v -0.184491 0.500000 -0.109385 +v -0.184491 -0.000000 -0.109385 +vt 0.939303 0.788698 +vt 0.523943 0.788698 +vt 0.523942 0.485192 +vt 0.939303 0.485192 +vt 0.053631 0.479309 +vt 0.053631 0.253263 +vt 0.422437 0.253263 +vt 0.422437 0.479309 +vt 0.078407 0.631634 +vt 0.373206 0.631634 +vt 0.373206 0.971758 +vt 0.078407 0.971758 +vt 0.101068 0.622435 +vt 0.323629 0.622435 +vt 0.323629 0.962558 +vt 0.101068 0.962558 +vt 0.048791 0.145829 +vt 0.048791 0.014960 +vt 0.417596 0.014960 +vt 0.417596 0.145829 +vt 0.918818 0.183701 +vt 0.503457 0.183701 +vt 0.503457 0.007987 +vt 0.817036 0.007987 +vt 0.509956 0.813174 +vt 0.925316 0.813174 +vt 0.925316 0.988888 +vt 0.611737 0.988888 +vt 0.048791 0.728790 +vt 0.048791 0.597921 +vt 0.417596 0.597921 +vt 0.417596 0.728790 +vt 0.817036 0.966425 +vt 0.503457 0.966425 +vt 0.503457 0.790711 +vt 0.918818 0.790711 +vt 0.611737 0.030450 +vt 0.925316 0.030450 +vt 0.925316 0.206164 +vt 0.509956 0.206164 +vt 0.068480 0.643692 +vt 0.291041 0.643692 +vt 0.291041 0.983815 +vt 0.068480 0.983815 +vt 0.423910 0.597921 +vt 0.423910 0.728790 +vt 0.055104 0.728790 +vt 0.055104 0.597921 +vt 0.319719 0.978501 +vt 0.097158 0.978501 +vt 0.097158 0.638378 +vt 0.319719 0.638378 +vt 0.520411 0.813174 +vt 0.935771 0.813174 +vt 0.935771 0.988888 +vt 0.622192 0.988888 +vt 0.508525 0.805627 +vt 0.923885 0.805627 +vt 0.923885 0.981341 +vt 0.610306 0.981341 +vt 0.423910 0.014960 +vt 0.423910 0.145829 +vt 0.055104 0.145829 +vt 0.055104 0.014960 +vt 0.622192 0.030450 +vt 0.935771 0.030450 +vt 0.935771 0.206164 +vt 0.520411 0.206164 +vt 0.610306 0.022903 +vt 0.923885 0.022903 +vt 0.923885 0.198617 +vt 0.508525 0.198617 +vt 0.496959 0.352203 +vt 0.912319 0.352203 +vt 0.912319 0.527917 +vt 0.598740 0.527917 +vt 0.053631 0.610178 +vt 0.422437 0.610178 +vt 0.837521 0.964411 +vt 0.523943 0.964411 +vt 0.496959 0.048698 +vt 0.912319 0.048698 +vt 0.031217 0.192458 +vt 0.031217 0.010254 +vt 0.527348 0.010254 +vt 0.527348 0.192458 +vt 0.031217 0.968414 +vt 0.031217 0.799293 +vt 0.527348 0.799293 +vt 0.527348 0.968414 +vt 0.810561 0.808208 +vt 0.810561 0.990412 +vt 0.314430 0.990412 +vt 0.314430 0.808208 +vt 0.810561 0.032252 +vt 0.810561 0.201374 +vt 0.314430 0.201374 +vt 0.314430 0.032252 +vt 0.467521 0.505299 +vt 0.467521 0.323096 +vt 0.963652 0.323096 +vt 0.963652 0.505299 +vt 0.467521 0.808717 +vt 0.963652 0.808717 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.478900 0.000000 -0.877900 +vn -0.478900 0.000000 -0.877900 +vn -0.000000 0.000000 -1.000000 +g Block_Left_Bottom_Cube.026_Top +s off +f 44/1/1 42/2/1 3/3/1 1/4/1 +f 41/5/2 4/6/2 3/7/2 42/8/2 +f 1/9/3 3/10/3 4/11/3 2/12/3 +f 9/13/4 10/14/4 6/15/4 5/16/4 +f 14/17/2 11/18/2 7/19/2 15/20/2 +f 20/21/1 15/22/1 7/23/1 8/24/1 +f 18/25/5 13/26/5 10/27/5 9/28/5 +f 10/29/2 13/30/2 16/31/2 6/32/2 +f 13/30/2 14/17/2 15/20/2 16/31/2 +f 5/33/1 6/34/1 16/35/1 19/36/1 +f 19/36/1 16/35/1 15/22/1 20/21/1 +f 12/37/5 11/38/5 14/39/5 17/40/5 +f 17/40/5 14/39/5 13/26/5 18/25/5 +f 25/41/4 26/42/4 22/43/4 21/44/4 +f 30/45/2 27/46/2 23/47/2 31/48/2 +f 27/49/3 28/50/3 24/51/3 23/52/3 +f 36/53/1 31/54/1 23/55/1 24/56/1 +f 34/57/5 29/58/5 26/59/5 25/60/5 +f 26/61/2 29/62/2 32/63/2 22/64/2 +f 29/62/2 30/45/2 31/48/2 32/63/2 +f 21/65/1 22/66/1 32/67/1 35/68/1 +f 35/68/1 32/67/1 31/54/1 36/53/1 +f 28/69/5 27/70/5 30/71/5 33/72/5 +f 33/72/5 30/71/5 29/58/5 34/57/5 +f 43/73/5 41/74/5 40/75/5 39/76/5 +f 40/77/2 41/5/2 42/8/2 38/78/2 +f 37/79/1 38/80/1 42/2/1 44/1/1 +f 2/81/5 4/82/5 41/74/5 43/73/5 +g Block_Left_Bottom_Cube.026_Face +f 18/83/6 9/84/6 5/85/6 19/86/6 +f 12/87/7 17/88/7 20/89/7 8/90/7 +f 17/88/8 18/83/8 19/86/8 20/89/8 +f 34/91/6 25/92/6 21/93/6 35/94/6 +f 28/95/7 33/96/7 36/97/7 24/98/7 +f 33/96/8 34/91/8 35/94/8 36/97/8 +f 43/99/6 39/100/6 37/101/6 44/102/6 +f 2/103/8 43/99/8 44/102/8 1/104/8 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_r_t.obj b/mods/mylandscaping/models/mylandscaping_blockf_r_t.obj new file mode 100644 index 00000000..08e4bb77 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_r_t.obj @@ -0,0 +1,212 @@ +# Blender v2.74 (sub 0) OBJ File: 'Walls.blend' +# www.blender.org +o Block1_R_T_Cube.005 +v 0.492888 0.500749 0.048516 +v 0.492888 0.500749 0.513873 +v -0.501157 0.500749 0.513873 +v -0.501157 0.500749 0.048516 +v 0.492888 0.600202 0.048516 +v 0.492888 0.600202 0.513873 +v -0.501157 0.600202 0.513873 +v -0.501157 0.600202 0.048516 +v -0.501157 -0.000000 0.090615 +v -0.501157 0.500000 0.090615 +v -0.501157 -0.000000 0.498705 +v -0.501157 0.500000 0.498705 +v 0.998843 -0.000000 0.190615 +v 0.998843 -0.000000 0.498705 +v -0.001157 -0.000000 0.498705 +v -0.001157 -0.000000 0.190615 +v 0.998843 0.500000 0.190615 +v 0.998843 0.500000 0.498705 +v -0.001157 0.500000 0.498705 +v -0.001157 0.500000 0.190615 +v 0.815509 0.500000 0.498705 +v 0.182176 0.500000 0.498705 +v 0.182176 -0.000000 0.498705 +v 0.815509 -0.000000 0.498705 +v 0.182176 0.500000 0.090615 +v 0.815509 0.500000 0.090615 +v 0.815509 -0.000000 0.090615 +v 0.182176 -0.000000 0.090615 +v 0.498843 -0.500000 0.093312 +v 0.498843 -0.500000 0.401402 +v -0.501157 -0.500000 0.401402 +v -0.501157 -0.500000 0.093312 +v 0.498843 -0.000000 0.093312 +v 0.498843 -0.000000 0.401402 +v -0.501157 -0.000000 0.401402 +v -0.501157 -0.000000 0.093312 +v 0.315509 -0.000000 0.401402 +v -0.317824 -0.000000 0.401402 +v -0.317824 -0.500000 0.401402 +v 0.315509 -0.500000 0.401402 +v -0.317824 -0.000000 -0.006688 +v 0.315509 -0.000000 -0.006688 +v 0.315509 -0.500000 -0.006688 +v -0.317824 -0.500000 -0.006688 +v -0.001157 -0.000000 0.190615 +v -0.001157 -0.000000 0.498705 +v -0.001157 0.500000 0.190615 +v -0.001157 0.500000 0.498705 +v -0.184491 0.500000 0.498705 +v -0.184491 -0.000000 0.498705 +v -0.184491 0.500000 0.090615 +v -0.184491 -0.000000 0.090615 +vt 0.489709 0.492769 +vt 0.489708 0.028053 +vt 0.572698 0.028053 +vt 0.572698 0.492769 +vt 0.403568 0.988730 +vt 0.403568 0.022824 +vt 0.486557 0.022823 +vt 0.486557 0.988730 +vt 0.486557 0.487540 +vt 0.569547 0.022823 +vt 0.569547 0.487540 +vt 0.486557 0.023046 +vt 0.486557 0.987305 +vt 0.403568 0.987305 +vt 0.403568 0.023046 +vt 0.679068 0.794684 +vt 0.514899 0.794684 +vt 0.514899 0.397342 +vt 0.679068 0.397342 +vt 0.277679 0.005177 +vt 0.688099 0.005177 +vt 0.688099 0.990097 +vt 0.277679 0.990097 +vt 0.823034 0.926024 +vt 0.679068 0.926024 +vt 0.679068 0.799445 +vt 0.823034 0.799445 +vt 0.171633 0.872727 +vt 0.171633 0.999306 +vt 0.000000 0.999306 +vt 0.000000 0.872727 +vt 0.658865 0.794684 +vt 0.658865 0.994545 +vt 0.514899 0.994545 +vt 0.823034 0.599584 +vt 0.931722 0.599584 +vt 0.931722 0.799445 +vt 0.000000 0.073283 +vt 0.000000 0.000000 +vt 0.171633 0.000000 +vt 0.171633 0.073282 +vt 0.823034 0.473005 +vt 0.679068 0.473005 +vt 0.679068 0.399722 +vt 0.787756 0.399722 +vt 0.291250 0.740569 +vt 0.651164 0.740569 +vt 0.651164 0.922220 +vt 0.379445 0.922220 +vt 0.000000 0.399723 +vt 0.000000 0.326440 +vt 0.171633 0.326440 +vt 0.171633 0.399723 +vt 0.668662 0.734957 +vt 0.559974 0.734957 +vt 0.559974 0.661674 +vt 0.703940 0.661674 +vt 0.291250 0.113050 +vt 0.651164 0.113050 +vt 0.823034 0.399723 +vt 0.931722 0.399723 +vt 0.343266 0.326440 +vt 0.343266 0.399722 +vt 0.931722 0.999306 +vt 0.823034 0.999306 +vt 0.315599 0.473005 +vt 0.171633 0.473005 +vt 0.280321 0.399722 +vt 0.280194 0.809171 +vt 0.640108 0.809170 +vt 0.640108 0.990821 +vt 0.368389 0.990821 +vt 0.343266 0.000000 +vt 0.343266 0.073282 +vt 0.280321 0.799445 +vt 0.171633 0.799445 +vt 0.171633 0.726162 +vt 0.315599 0.726162 +vt 0.368389 0.000000 +vt 0.640108 0.000000 +vt 0.640108 0.181651 +vt 0.280194 0.181651 +vt 0.000000 0.799445 +vt 0.787756 0.999306 +vt 0.679068 0.999306 +vt 0.563303 0.211927 +vt 0.563303 0.037473 +vt 0.959594 0.037473 +vt 0.959594 0.211927 +vt 0.563303 0.958835 +vt 0.563303 0.795456 +vt 0.959594 0.795456 +vt 0.959594 0.958835 +vt 0.425140 0.797454 +vt 0.425140 0.970773 +vt 0.031427 0.970773 +vt 0.031426 0.797454 +vt 0.425139 0.055404 +vt 0.425139 0.217720 +vt 0.031427 0.217720 +vt 0.031427 0.055404 +vt 0.653960 0.555813 +vt 0.653960 0.733864 +vt 0.249499 0.733864 +vt 0.249499 0.555813 +vt 0.653960 0.258034 +vt 0.249499 0.258034 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.478900 0.000000 -0.877900 +vn -0.478900 0.000000 -0.877900 +g Block1_R_T_Cube.005_Top +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/9/3 8/7/3 4/10/3 3/11/3 +f 8/12/4 5/13/4 1/14/4 4/15/4 +f 1/16/5 2/17/5 3/18/5 4/19/5 +f 8/20/6 7/21/6 6/22/6 5/23/6 +f 52/24/5 50/25/5 11/26/5 9/27/5 +f 49/28/2 12/29/2 11/30/2 50/31/2 +f 9/17/3 11/32/3 12/33/3 10/34/3 +f 17/35/1 18/36/1 14/37/1 13/27/1 +f 22/38/2 19/39/2 15/40/2 23/41/2 +f 28/42/5 23/43/5 15/44/5 16/45/5 +f 26/46/6 21/47/6 18/48/6 17/49/6 +f 18/50/2 21/51/2 24/52/2 14/53/2 +f 21/51/2 22/38/2 23/41/2 24/52/2 +f 13/54/5 14/55/5 24/56/5 27/57/5 +f 27/57/5 24/56/5 23/43/5 28/42/5 +f 25/58/6 22/59/6 21/47/6 26/46/6 +f 33/60/1 34/61/1 30/36/1 29/35/1 +f 38/62/2 35/63/2 31/53/2 39/52/2 +f 35/64/3 36/65/3 32/27/3 31/37/3 +f 44/66/5 39/67/5 31/53/5 32/68/5 +f 42/69/6 37/70/6 34/71/6 33/72/6 +f 34/73/2 37/74/2 40/41/2 30/40/2 +f 37/74/2 38/62/2 39/52/2 40/41/2 +f 29/75/5 30/76/5 40/77/5 43/78/5 +f 43/78/5 40/77/5 39/67/5 44/66/5 +f 36/79/6 35/80/6 38/81/6 41/82/6 +f 41/82/6 38/81/6 37/70/6 42/69/6 +f 48/76/2 49/28/2 50/31/2 46/83/2 +f 45/84/5 46/85/5 50/25/5 52/24/5 +g Block1_R_T_Cube.005_Face +f 26/86/7 17/87/7 13/88/7 27/89/7 +f 20/90/8 25/91/8 28/92/8 16/93/8 +f 25/91/4 26/86/4 27/89/4 28/92/4 +f 42/94/7 33/95/7 29/96/7 43/97/7 +f 36/98/8 41/99/8 44/100/8 32/101/8 +f 41/99/4 42/94/4 43/97/4 44/100/4 +f 51/102/7 47/103/7 45/104/7 52/105/7 +f 10/106/4 51/102/4 52/105/4 9/107/4 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_top_m.obj b/mods/mylandscaping/models/mylandscaping_blockf_top_m.obj new file mode 100644 index 00000000..193deda2 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_top_m.obj @@ -0,0 +1,163 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Block_full_Top_Cube.021 +v 0.494045 0.499740 0.052980 +v 0.494045 0.499740 0.518337 +v -0.500000 0.499740 0.518337 +v -0.500000 0.499740 0.052980 +v 0.494045 0.600283 0.052980 +v 0.494045 0.600283 0.518337 +v -0.500000 0.600283 0.518337 +v -0.500000 0.600283 0.052980 +v 1.000000 0.000000 0.195079 +v 1.000000 0.000000 0.503169 +v -0.000000 0.000000 0.503169 +v -0.000000 0.000000 0.195079 +v 1.000000 0.500000 0.195079 +v 1.000000 0.500000 0.503169 +v -0.000000 0.500000 0.503169 +v -0.000000 0.500000 0.195079 +v 0.816667 0.500000 0.503169 +v 0.183333 0.500000 0.503169 +v 0.183333 0.000000 0.503169 +v 0.816667 0.000000 0.503169 +v 0.183333 0.500000 0.095079 +v 0.816667 0.500000 0.095079 +v 0.816667 0.000000 0.095079 +v 0.183333 0.000000 0.095079 +v 0.500000 -0.500000 0.097776 +v 0.500000 -0.500000 0.405866 +v -0.500000 -0.500000 0.405866 +v -0.500000 -0.500000 0.097776 +v 0.500000 0.000000 0.097776 +v 0.500000 0.000000 0.405866 +v -0.500000 0.000000 0.405866 +v -0.500000 0.000000 0.097776 +v 0.316667 0.000000 0.405866 +v -0.316667 0.000000 0.405866 +v -0.316667 -0.500000 0.405866 +v 0.316667 -0.500000 0.405866 +v -0.316667 0.000000 -0.002225 +v 0.316667 0.000000 -0.002225 +v 0.316667 -0.500000 -0.002225 +v -0.316667 -0.500000 -0.002225 +vt 0.727176 0.986537 +vt 0.727176 0.795236 +vt 0.767422 0.795236 +vt 0.767422 0.986537 +vt 0.959754 0.397618 +vt 0.959754 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.397618 +vt 0.400289 0.991302 +vt 0.400289 0.800000 +vt 0.440535 0.800000 +vt 0.440535 0.991302 +vt 1.000000 0.400000 +vt 1.000000 0.797618 +vt 0.959754 0.797618 +vt 0.959754 0.400000 +vt 0.791873 0.795236 +vt 0.600433 0.795236 +vt 0.600433 0.397618 +vt 0.791873 0.397618 +vt 0.600433 0.000000 +vt 0.791873 0.000000 +vt 0.727176 0.995236 +vt 0.600433 0.995236 +vt 0.200144 0.726667 +vt 0.200144 0.800000 +vt 0.000000 0.800000 +vt 0.000000 0.726667 +vt 0.126743 0.800000 +vt 0.253486 0.800000 +vt 0.253486 1.000000 +vt 0.126743 1.000000 +vt 0.600433 0.326667 +vt 0.600433 0.400000 +vt 0.400289 0.400000 +vt 0.400289 0.326667 +vt 0.959754 0.073333 +vt 0.791873 0.073333 +vt 0.918615 0.000000 +vt 0.959754 0.473333 +vt 0.791873 0.473333 +vt 0.791873 0.400000 +vt 0.918615 0.400000 +vt 0.200144 0.400000 +vt 0.200144 0.473333 +vt 0.000000 0.473333 +vt 0.000000 0.400000 +vt 0.600433 0.073333 +vt 0.400289 0.073333 +vt 0.400289 0.000000 +vt 0.791873 0.326667 +vt 0.959754 0.326667 +vt 0.918615 0.800000 +vt 0.791873 0.800000 +vt 0.791873 0.726667 +vt 0.959754 0.726667 +vt 0.000000 1.000000 +vt 0.200144 0.073333 +vt 0.200144 0.000000 +vt 0.380229 1.000000 +vt 0.380229 0.800000 +vt 0.200144 0.326667 +vt 0.000000 0.326667 +vt 0.568170 0.473333 +vt 0.400289 0.473333 +vt 0.527032 0.400000 +vt 0.368026 0.726667 +vt 0.368026 0.800000 +vt 0.241283 0.800000 +vt 0.000000 0.073333 +vt 0.000000 0.000000 +vt 0.527032 0.800000 +vt 0.400289 0.726667 +vt 0.568170 0.726667 +vt 0.241283 0.400000 +vt 0.368026 0.400000 +vt 0.368026 0.473333 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.478900 0.000000 -0.877900 +vn -0.478900 0.000000 -0.877900 +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/9/3 8/10/3 4/11/3 3/12/3 +f 8/13/4 5/14/4 1/15/4 4/16/4 +f 1/17/5 2/18/5 3/19/5 4/20/5 +f 8/21/6 7/22/6 6/20/6 5/19/6 +f 13/18/1 14/2/1 10/23/1 9/24/1 +f 18/25/2 15/26/2 11/27/2 19/28/2 +f 15/29/3 16/30/3 12/31/3 11/32/3 +f 22/33/7 13/34/7 9/35/7 23/36/7 +f 24/37/5 19/38/5 11/22/5 12/39/5 +f 22/40/6 17/41/6 14/42/6 13/43/6 +f 14/44/2 17/45/2 20/46/2 10/47/2 +f 17/45/2 18/25/2 19/28/2 20/46/2 +f 16/21/8 21/48/8 24/49/8 12/50/8 +f 21/48/4 22/33/4 23/36/4 24/49/4 +f 9/43/5 10/42/5 20/51/5 23/52/5 +f 23/52/5 20/51/5 19/38/5 24/37/5 +f 16/53/6 15/54/6 18/55/6 21/56/6 +f 21/56/6 18/55/6 17/41/6 22/40/6 +f 29/27/1 30/29/1 26/32/1 25/57/1 +f 34/58/2 31/59/2 27/50/2 35/49/2 +f 31/60/3 32/31/3 28/30/3 27/61/3 +f 38/62/7 29/44/7 25/47/7 39/63/7 +f 40/64/5 35/65/5 27/35/5 28/66/5 +f 38/25/6 33/67/6 30/68/6 29/69/6 +f 30/44/2 33/62/2 36/36/2 26/35/2 +f 33/62/2 34/58/2 35/49/2 36/36/2 +f 32/59/8 37/58/8 40/70/8 28/71/8 +f 37/58/4 38/62/4 39/63/4 40/70/4 +f 25/72/5 26/10/5 36/73/5 39/74/5 +f 39/74/5 36/73/5 35/65/5 40/64/5 +f 32/75/6 31/76/6 34/77/6 37/45/6 +f 37/45/6 34/77/6 33/67/6 38/25/6 diff --git a/mods/mylandscaping/models/mylandscaping_blockf_top_r.obj b/mods/mylandscaping/models/mylandscaping_blockf_top_r.obj new file mode 100644 index 00000000..a7063e66 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockf_top_r.obj @@ -0,0 +1,212 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Block_Left_Top.001_Cube.005 +v 0.492888 0.500749 0.048516 +v 0.492888 0.500749 0.513873 +v -0.501157 0.500749 0.513873 +v -0.501157 0.500749 0.048516 +v 0.492888 0.600202 0.048516 +v 0.492888 0.600202 0.513873 +v -0.501157 0.600202 0.513873 +v -0.501157 0.600202 0.048516 +v -0.501157 -0.000000 0.090615 +v -0.501157 0.500000 0.090615 +v -0.501157 -0.000000 0.498705 +v -0.501157 0.500000 0.498705 +v 0.998843 -0.000000 0.190615 +v 0.998843 -0.000000 0.498705 +v -0.001157 -0.000000 0.498705 +v -0.001157 -0.000000 0.190615 +v 0.998843 0.500000 0.190615 +v 0.998843 0.500000 0.498705 +v -0.001157 0.500000 0.498705 +v -0.001157 0.500000 0.190615 +v 0.815509 0.500000 0.498705 +v 0.182176 0.500000 0.498705 +v 0.182176 -0.000000 0.498705 +v 0.815509 -0.000000 0.498705 +v 0.182176 0.500000 0.090615 +v 0.815509 0.500000 0.090615 +v 0.815509 -0.000000 0.090615 +v 0.182176 -0.000000 0.090615 +v 0.498843 -0.500000 0.093312 +v 0.498843 -0.500000 0.401402 +v -0.501157 -0.500000 0.401402 +v -0.501157 -0.500000 0.093312 +v 0.498843 -0.000000 0.093312 +v 0.498843 -0.000000 0.401402 +v -0.501157 -0.000000 0.401402 +v -0.501157 -0.000000 0.093312 +v 0.315509 -0.000000 0.401402 +v -0.317824 -0.000000 0.401402 +v -0.317824 -0.500000 0.401402 +v 0.315509 -0.500000 0.401402 +v -0.317824 -0.000000 -0.006688 +v 0.315509 -0.000000 -0.006688 +v 0.315509 -0.500000 -0.006688 +v -0.317824 -0.500000 -0.006688 +v -0.001157 -0.000000 0.190615 +v -0.001157 -0.000000 0.498705 +v -0.001157 0.500000 0.190615 +v -0.001157 0.500000 0.498705 +v -0.184491 0.500000 0.498705 +v -0.184491 -0.000000 0.498705 +v -0.184491 0.500000 0.090615 +v -0.184491 -0.000000 0.090615 +vt 0.931722 0.990614 +vt 0.931722 0.799445 +vt 0.965861 0.799445 +vt 0.965861 0.990614 +vt 0.931722 0.397342 +vt 0.931722 0.000000 +vt 0.965861 0.000000 +vt 0.965861 0.397342 +vt 0.965861 0.191169 +vt 1.000000 0.000000 +vt 1.000000 0.191169 +vt 0.965861 0.399723 +vt 0.965861 0.796387 +vt 0.931722 0.796387 +vt 0.931722 0.399723 +vt 0.679068 0.794684 +vt 0.514899 0.794684 +vt 0.514899 0.397342 +vt 0.679068 0.397342 +vt 0.514899 0.000000 +vt 0.679068 0.000000 +vt 0.823034 0.926024 +vt 0.679068 0.926024 +vt 0.679068 0.799445 +vt 0.823034 0.799445 +vt 0.171633 0.872727 +vt 0.171633 0.999306 +vt 0.000000 0.999306 +vt 0.000000 0.872727 +vt 0.658865 0.794684 +vt 0.658865 0.994545 +vt 0.514899 0.994545 +vt 0.823034 0.599584 +vt 0.931722 0.599584 +vt 0.000000 0.073283 +vt 0.000000 0.000000 +vt 0.171633 0.000000 +vt 0.171633 0.073282 +vt 0.823034 0.000000 +vt 0.931722 0.199861 +vt 0.823034 0.199861 +vt 0.343266 0.075556 +vt 0.343266 0.000000 +vt 0.514899 0.075556 +vt 0.823034 0.473005 +vt 0.679068 0.473005 +vt 0.679068 0.399722 +vt 0.787756 0.399722 +vt 0.679068 0.326440 +vt 0.823034 0.326440 +vt 0.823034 0.399722 +vt 0.714346 0.399722 +vt 0.000000 0.399723 +vt 0.000000 0.326440 +vt 0.171633 0.326440 +vt 0.171633 0.399723 +vt 0.343266 0.399041 +vt 0.343266 0.328281 +vt 0.514899 0.328281 +vt 0.514899 0.399041 +vt 0.787756 0.799445 +vt 0.679068 0.726162 +vt 0.823034 0.726162 +vt 0.714346 0.000000 +vt 0.823034 0.073282 +vt 0.679068 0.073282 +vt 0.343266 0.326440 +vt 0.343266 0.399722 +vt 0.931722 0.999306 +vt 0.823034 0.999306 +vt 0.514899 0.722526 +vt 0.514899 0.798081 +vt 0.343266 0.798081 +vt 0.343266 0.722526 +vt 0.315599 0.473005 +vt 0.171633 0.473005 +vt 0.280321 0.399722 +vt 0.000000 0.726162 +vt 0.143966 0.726162 +vt 0.143966 0.799445 +vt 0.035278 0.799445 +vt 0.343266 0.073282 +vt 0.514899 0.469800 +vt 0.343266 0.469800 +vt 0.280321 0.799445 +vt 0.171633 0.799445 +vt 0.171633 0.726162 +vt 0.315599 0.726162 +vt 0.035278 0.399722 +vt 0.143966 0.399722 +vt 0.143966 0.473005 +vt 0.000000 0.473005 +vt 0.514899 0.924444 +vt 0.514899 1.000000 +vt 0.343266 1.000000 +vt 0.343266 0.924444 +vt 0.171633 0.926024 +vt 0.315599 0.926024 +vt 0.315599 0.999306 +vt 0.206911 0.999306 +vt 0.000000 0.799445 +vt 0.787756 0.999306 +vt 0.679068 0.999306 +vt 0.315599 0.799445 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.478900 0.000000 -0.877900 +vn -0.478900 0.000000 -0.877900 +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/9/3 8/7/3 4/10/3 3/11/3 +f 8/12/4 5/13/4 1/14/4 4/15/4 +f 1/16/5 2/17/5 3/18/5 4/19/5 +f 8/20/6 7/21/6 6/19/6 5/18/6 +f 52/22/5 50/23/5 11/24/5 9/25/5 +f 49/26/2 12/27/2 11/28/2 50/29/2 +f 9/17/3 11/30/3 12/31/3 10/32/3 +f 17/33/1 18/34/1 14/2/1 13/25/1 +f 22/35/2 19/36/2 15/37/2 23/38/2 +f 19/39/3 20/6/3 16/40/3 15/41/3 +f 26/42/7 17/43/7 13/20/7 27/44/7 +f 28/45/5 23/46/5 15/47/5 16/48/5 +f 26/49/6 21/50/6 18/51/6 17/52/6 +f 18/53/2 21/54/2 24/55/2 14/56/2 +f 21/54/2 22/35/2 23/38/2 24/55/2 +f 20/57/8 25/58/8 28/59/8 16/60/8 +f 25/58/4 26/42/4 27/44/4 28/59/4 +f 13/61/5 14/24/5 24/62/5 27/63/5 +f 27/63/5 24/62/5 23/46/5 28/45/5 +f 20/64/6 19/39/6 22/65/6 25/66/6 +f 25/66/6 22/65/6 21/50/6 26/49/6 +f 33/51/1 34/15/1 30/34/1 29/33/1 +f 38/67/2 35/68/2 31/56/2 39/55/2 +f 35/69/3 36/70/3 32/25/3 31/2/3 +f 42/71/7 33/72/7 29/73/7 43/74/7 +f 44/75/5 39/76/5 31/56/5 32/77/5 +f 42/78/6 37/79/6 34/80/6 33/81/6 +f 34/43/2 37/82/2 40/38/2 30/37/2 +f 37/82/2 38/67/2 39/55/2 40/38/2 +f 36/60/8 41/83/8 44/84/8 32/57/8 +f 41/83/4 42/71/4 43/74/4 44/84/4 +f 29/85/5 30/86/5 40/87/5 43/88/5 +f 43/88/5 40/87/5 39/76/5 44/75/5 +f 36/89/6 35/90/6 38/91/6 41/92/6 +f 41/92/6 38/91/6 37/79/6 42/78/6 +f 47/41/1 48/40/1 46/15/1 45/51/1 +f 51/93/7 47/94/7 45/95/7 52/96/7 +f 51/97/6 49/98/6 48/99/6 47/100/6 +f 48/86/2 49/26/2 50/29/2 46/101/2 +f 10/72/4 51/93/4 52/96/4 9/73/4 +f 45/102/5 46/103/5 50/23/5 52/22/5 +f 10/86/6 12/104/6 49/98/6 51/97/6 diff --git a/mods/mylandscaping/models/mylandscaping_blockm_ic_b.obj b/mods/mylandscaping/models/mylandscaping_blockm_ic_b.obj new file mode 100644 index 00000000..9980b058 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockm_ic_b.obj @@ -0,0 +1,210 @@ +# Blender v2.77 (sub 1) OBJ File: 'Madison_walls.blend' +# www.blender.org +o Madison_IC_B_Cube.032 +v 0.050000 0.500000 -0.050000 +v 0.050000 0.000000 -0.050000 +v -0.150000 0.500000 -0.050000 +v -0.150000 0.000000 -0.050000 +v 0.050000 0.500000 -0.400000 +v 0.050000 0.000000 -0.400000 +v -0.150000 0.500000 -0.400000 +v -0.150000 0.000000 -0.400000 +v -0.510000 -0.500000 -0.500000 +v -0.510000 0.500000 -0.500000 +v 0.150000 -0.500000 -0.500000 +v 0.150000 0.500000 -0.500000 +v -0.510000 -0.500000 -0.400000 +v -0.510000 0.500000 -0.400000 +v 0.150000 -0.500000 -0.400000 +v 0.150000 0.500000 -0.400000 +v -0.100000 -0.500000 -0.400000 +v -0.100000 0.000000 -0.400000 +v 0.100000 -0.500000 -0.400000 +v 0.100000 0.000000 -0.400000 +v -0.100000 -0.500000 -0.100000 +v -0.100000 0.000000 -0.100000 +v 0.100000 -0.500000 -0.100000 +v 0.100000 0.000000 -0.100000 +v 0.400000 -0.500000 0.510000 +v 0.400000 0.500000 0.510000 +v 0.400000 -0.500000 -0.150000 +v 0.400000 0.500000 -0.150000 +v 0.500000 -0.500000 0.510000 +v 0.500000 0.500000 0.510000 +v 0.500000 -0.500000 -0.150000 +v 0.500000 0.500000 -0.150000 +v 0.400000 0.500000 -0.050000 +v 0.400000 0.000000 -0.050000 +v 0.400000 0.500000 0.150000 +v 0.400000 0.000000 0.150000 +v -0.150000 0.500000 0.150000 +v -0.150000 0.000000 0.150000 +v -0.100000 -0.500000 0.100000 +v -0.100000 0.000000 0.100000 +v 0.400000 -0.500000 0.100000 +v 0.400000 0.000000 0.100000 +v 0.400000 -0.500000 -0.100000 +v 0.400000 0.000000 -0.100000 +v 0.050000 0.500000 0.150000 +v 0.050000 0.000000 0.150000 +v 0.100000 -0.500000 0.100000 +v 0.100000 0.000000 0.100000 +vt 0.5167 0.3204 +vt 0.5167 1.0001 +vt 0.0681 1.0001 +vt 0.0681 0.3204 +vt 0.0001 1.0001 +vt 0.0001 0.3204 +vt -0.4484 1.0001 +vt -0.4484 0.3204 +vt 0.9999 0.3403 +vt 0.9999 0.6801 +vt 0.9659 0.6801 +vt 0.9659 0.3403 +vt 0.0001 -0.1282 +vt 0.0681 -0.1282 +vt 0.0681 1.4487 +vt 0.0001 1.4487 +vt 0.5847 0.3204 +vt 0.5847 1.0001 +vt 0.1362 1.0001 +vt 0.1362 0.3204 +vt 0.0682 1.0001 +vt 0.0682 0.3204 +vt -0.3804 1.0001 +vt -0.3804 0.3204 +vt 0.9999 0.0001 +vt 0.9999 0.3400 +vt 0.9659 0.3400 +vt 0.9659 0.0001 +vt 0.0682 -0.1282 +vt 0.1362 -0.1282 +vt 0.1362 1.4487 +vt 0.0682 1.4487 +vt 0.6666 0.4626 +vt 0.8456 0.4626 +vt 0.8456 0.5649 +vt 0.6666 0.5649 +vt 0.0003 0.7177 +vt 0.2561 0.7177 +vt 0.2561 0.8968 +vt 0.0003 0.8968 +vt 0.4613 0.3590 +vt 0.4613 0.6148 +vt 0.2823 0.6148 +vt 0.2823 0.3590 +vt 0.3584 0.7177 +vt 0.3584 0.8968 +vt 0.8968 0.6148 +vt 0.8968 0.8706 +vt 0.7944 0.8706 +vt 0.7944 0.6148 +vt 0.5125 0.6142 +vt 0.5125 0.3584 +vt 0.6659 0.3584 +vt 0.6659 0.6142 +vt 0.4613 0.6154 +vt 0.4613 0.8712 +vt 0.3590 0.8712 +vt 0.3590 0.6154 +vt 0.6659 0.0003 +vt 0.6659 0.2561 +vt 0.5125 0.2561 +vt 0.5125 0.0003 +vt 0.5125 0.8712 +vt 0.6659 0.8712 +vt 0.6659 0.9735 +vt 0.5125 0.9735 +vt 0.7689 0.2567 +vt 0.9479 0.2567 +vt 0.9479 0.3590 +vt 0.7689 0.3590 +vt 0.1026 0.7171 +vt 0.1026 0.4613 +vt 0.2817 0.4613 +vt 0.2817 0.7171 +vt 0.9997 0.6148 +vt 0.9997 0.8706 +vt 0.8974 0.8706 +vt 0.8974 0.6148 +vt 0.6148 0.6148 +vt 0.6148 0.8706 +vt 0.5125 0.8706 +vt 0.5125 0.6148 +vt 0.0003 0.4613 +vt 0.0003 0.3590 +vt 0.1026 0.3590 +vt 0.0003 0.0003 +vt 0.2561 0.0003 +vt 0.2561 0.1026 +vt 0.0003 0.1026 +vt 0.3584 0.3584 +vt 0.3584 0.1026 +vt 0.5119 0.1026 +vt 0.5119 0.3584 +vt 0.7689 0.0003 +vt 0.7689 0.2561 +vt 0.6666 0.2561 +vt 0.6666 0.0003 +vt 0.7689 0.3596 +vt 0.9223 0.3596 +vt 0.9223 0.4619 +vt 0.7689 0.4619 +vt 0.3584 0.0003 +vt 0.2817 0.3590 +vt 0.7938 0.6148 +vt 0.7938 0.8706 +vt 0.6666 0.2567 +vt 0.6666 0.3590 +vt 0.5119 0.0003 +vt 0.6666 0.3596 +vt 0.6666 0.4619 +vt 0.9223 0.0003 +vt 0.9223 0.2561 +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.0000 -1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +g Madison_IC_B_Cube.032_Wood +s off +f 9/1/1 10/2/1 12/3/1 11/4/1 +f 11/4/2 12/3/2 16/5/2 15/6/2 +f 15/6/3 16/5/3 14/7/3 13/8/3 +f 13/9/4 14/10/4 10/11/4 9/12/4 +f 11/4/5 15/6/5 13/13/5 9/14/5 +f 16/5/6 12/3/6 10/15/6 14/16/6 +f 25/17/4 26/18/4 28/19/4 27/20/4 +f 27/20/1 28/19/1 32/21/1 31/22/1 +f 31/22/2 32/21/2 30/23/2 29/24/2 +f 29/25/3 30/26/3 26/27/3 25/28/3 +f 27/20/5 31/22/5 29/29/5 25/30/5 +f 32/21/6 28/19/6 26/31/6 30/32/6 +g Madison_IC_B_Cube.032_Stone +f 6/33/5 2/34/5 4/35/5 8/36/5 +f 6/37/2 5/38/2 1/39/2 2/40/2 +f 4/41/4 3/42/4 7/43/4 8/44/4 +f 1/39/6 5/38/6 7/45/6 3/46/6 +f 2/47/3 1/48/3 3/49/3 4/50/3 +f 19/51/2 20/52/2 24/53/2 23/54/2 +f 23/55/3 24/56/3 22/57/3 21/58/3 +f 21/59/4 22/60/4 18/61/4 17/62/4 +f 19/63/5 23/64/5 21/65/5 17/66/5 +f 24/53/6 20/52/6 18/61/6 22/60/6 +f 2/67/5 34/68/5 36/69/5 46/70/5 +f 2/71/1 1/72/1 33/73/1 34/74/1 +f 38/75/4 37/76/4 3/77/4 4/78/4 +f 46/79/3 45/80/3 37/81/3 38/82/3 +f 1/72/6 3/83/6 37/84/6 45/85/6 +f 39/86/4 40/87/4 22/88/4 21/89/4 +f 23/90/1 24/91/1 44/92/1 43/93/1 +f 47/94/3 48/95/3 40/96/3 39/97/3 +f 23/98/5 43/99/5 41/100/5 47/101/5 +f 24/91/6 22/88/6 40/87/6 48/102/6 +f 33/73/6 1/72/6 45/85/6 35/103/6 +f 36/104/3 35/105/3 45/80/3 46/79/3 +f 4/106/5 2/67/5 46/70/5 38/107/5 +f 44/92/6 24/91/6 48/102/6 42/108/6 +f 21/109/5 23/98/5 47/101/5 39/110/5 +f 41/111/3 42/112/3 48/95/3 47/94/3 diff --git a/mods/mylandscaping/models/mylandscaping_blockm_ic_t.obj b/mods/mylandscaping/models/mylandscaping_blockm_ic_t.obj new file mode 100644 index 00000000..0c4ab6ab --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockm_ic_t.obj @@ -0,0 +1,255 @@ +# Blender v2.77 (sub 1) OBJ File: 'Madison_walls.blend' +# www.blender.org +o Madison_IC_T_Cube.001 +v -0.050000 0.500000 0.050000 +v -0.050000 0.000000 0.050000 +v -0.250000 0.500000 0.050000 +v -0.250000 0.000000 0.050000 +v -0.050000 0.500000 -0.400000 +v -0.050000 0.000000 -0.400000 +v -0.250000 0.500000 -0.400000 +v -0.250000 0.000000 -0.400000 +v -0.510000 -0.500000 -0.500000 +v -0.510000 0.600000 -0.500000 +v 0.150000 -0.500000 -0.500000 +v 0.150000 0.600000 -0.500000 +v -0.510000 -0.500000 -0.400000 +v -0.510000 0.600000 -0.400000 +v 0.150000 -0.500000 -0.400000 +v 0.150000 0.600000 -0.400000 +v -0.200000 -0.500000 -0.400000 +v -0.200000 0.000000 -0.400000 +v 0.000000 -0.500000 -0.400000 +v 0.000000 0.000000 -0.400000 +v -0.200000 -0.500000 0.000000 +v -0.200000 0.000000 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.400000 -0.500000 0.510000 +v 0.400000 0.600000 0.510000 +v 0.400000 -0.500000 -0.150000 +v 0.400000 0.600000 -0.150000 +v 0.500000 -0.500000 0.510000 +v 0.500000 0.600000 0.510000 +v 0.500000 -0.500000 -0.150000 +v 0.500000 0.600000 -0.150000 +v 0.400000 0.500000 0.050000 +v 0.400000 0.000000 0.050000 +v 0.400000 0.500000 0.250000 +v 0.400000 0.000000 0.250000 +v -0.250000 0.500000 0.250000 +v -0.250000 0.000000 0.250000 +v -0.200000 -0.500000 0.200000 +v -0.200000 0.000000 0.200000 +v 0.400000 -0.500000 0.200000 +v 0.400000 0.000000 0.200000 +v 0.400000 -0.500000 -0.000000 +v 0.400000 0.000000 -0.000000 +v -0.050000 0.500000 0.250000 +v -0.050000 0.000000 0.250000 +v 0.000000 -0.500000 0.200000 +v 0.000000 0.000000 0.200000 +v 0.000000 0.600000 0.510000 +v 0.000000 0.600000 0.000000 +v 0.400000 0.600000 0.510000 +v 0.400000 0.600000 0.000000 +v -0.510000 0.600000 0.510000 +v -0.510000 0.600000 0.000000 +v 0.000000 0.600000 -0.400000 +v -0.510000 0.600000 -0.400000 +v 0.000000 0.500000 0.510000 +v 0.000000 0.500000 0.000000 +v 0.400000 0.500000 0.000000 +v 0.400000 0.500000 0.510000 +v -0.510000 0.500000 0.510000 +v -0.510000 0.500000 0.000000 +v 0.000000 0.500000 -0.400000 +v -0.510000 0.500000 -0.400000 +vt 0.5156 0.0002 +vt 0.5156 0.7477 +vt 0.0671 0.7477 +vt 0.0671 0.0002 +vt -0.0009 0.7477 +vt -0.0009 0.0002 +vt -0.4494 0.7477 +vt -0.4494 0.0002 +vt 0.9999 0.3742 +vt 0.9999 0.7480 +vt 0.9659 0.7480 +vt 0.9659 0.3742 +vt -0.0009 -0.4483 +vt 0.0671 -0.4483 +vt 0.0671 1.1963 +vt -0.0009 1.1963 +vt 0.5834 0.0004 +vt 0.5832 0.7479 +vt 0.1346 0.7478 +vt 0.1349 0.0002 +vt 0.0667 0.7477 +vt 0.0669 0.0002 +vt -0.3818 0.7476 +vt -0.3816 0.0001 +vt 0.9999 0.0001 +vt 0.9999 0.3739 +vt 0.9659 0.3739 +vt 0.9659 0.0001 +vt 0.0671 -0.4483 +vt 0.1351 -0.4483 +vt 0.1345 1.1963 +vt 0.0665 1.1963 +vt 0.5314 0.0002 +vt 0.8302 0.0003 +vt 0.8301 0.1331 +vt 0.5314 0.1330 +vt 0.6162 0.3439 +vt 0.6162 0.8908 +vt 0.1336 0.8908 +vt 0.1336 0.3439 +vt 0.8300 0.4650 +vt 0.5312 0.4649 +vt 0.8300 0.5978 +vt 0.5312 0.5977 +vt 0.9631 0.5982 +vt 0.9631 0.9301 +vt 0.8303 0.9301 +vt 0.8303 0.5982 +vt 0.7454 0.0490 +vt 0.7454 0.6913 +vt 0.2315 0.6913 +vt 0.2315 0.0490 +vt 0.8571 0.0002 +vt 0.8571 0.3569 +vt 0.7144 0.3569 +vt 0.7144 0.0002 +vt 0.8567 0.5000 +vt 0.8567 0.8567 +vt 0.5713 0.8567 +vt 0.5713 0.5000 +vt 0.4287 0.8571 +vt 0.7140 0.8571 +vt 0.7140 0.9998 +vt 0.4287 0.9998 +vt 0.7454 0.9483 +vt 0.2315 0.9483 +vt 0.3190 0.2578 +vt 0.6792 0.1909 +vt 0.7029 0.3504 +vt 0.3869 0.4007 +vt 0.7242 0.1430 +vt 0.7242 0.6899 +vt 0.2416 0.6899 +vt 0.2416 0.1430 +vt 0.2937 0.4366 +vt 0.2722 0.6254 +vt 0.1722 0.7124 +vt 0.1722 0.3693 +vt 0.3825 0.6743 +vt 0.3162 0.8079 +vt 0.3336 0.4440 +vt 0.3336 0.8007 +vt 0.1909 0.8007 +vt 0.1909 0.4440 +vt 0.3231 0.9353 +vt 0.3231 0.3085 +vt 0.8245 0.3085 +vt 0.8245 0.9353 +vt 0.4763 0.4440 +vt 0.4763 0.8007 +vt 0.1429 0.8571 +vt 0.4282 0.8571 +vt 0.4282 0.9998 +vt 0.1429 0.9998 +vt 0.0724 0.3085 +vt 0.0724 0.0578 +vt 0.3231 0.0578 +vt 0.6609 0.8914 +vt 0.6980 0.7382 +vt 0.8245 0.0578 +vt 0.0002 0.8571 +vt 0.0002 0.9998 +vt 0.7616 0.4440 +vt 0.7616 0.8007 +vt 0.4361 0.9779 +vt 0.4361 0.5590 +vt 0.9691 0.5590 +vt 0.9691 0.9779 +vt 0.4361 0.0250 +vt 0.9691 0.0250 +vt 0.0181 0.5590 +vt 0.0181 0.0250 +vt 0.6800 0.1926 +vt 0.8628 0.4348 +vt 0.6704 0.5657 +vt 0.4901 0.3360 +vt 0.4784 0.6602 +vt 0.2942 0.5469 +vt 0.1332 0.4146 +vt 0.3160 0.1926 +vt 0.3316 0.9779 +vt 0.3316 0.5590 +vt 0.1005 0.4559 +vt 0.2658 0.5867 +vt 0.4732 0.7086 +vt 0.4361 0.6638 +vt 0.0181 0.6638 +vt 0.6989 0.6167 +vt 0.8962 0.4839 +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.0000 -1.0000 -0.0000 +vn 0.0000 1.0000 -0.0000 +g Madison_IC_T_Cube.001_Wood +s off +f 9/1/1 10/2/1 12/3/1 11/4/1 +f 11/4/2 12/3/2 16/5/2 15/6/2 +f 15/6/3 16/5/3 14/7/3 13/8/3 +f 13/9/4 14/10/4 10/11/4 9/12/4 +f 11/4/5 15/6/5 13/13/5 9/14/5 +f 16/5/6 12/3/6 10/15/6 14/16/6 +f 25/17/4 26/18/4 28/19/4 27/20/4 +f 27/20/1 28/19/1 32/21/1 31/22/1 +f 31/22/2 32/21/2 30/23/2 29/24/2 +f 29/25/3 30/26/3 26/27/3 25/28/3 +f 27/20/5 31/22/5 29/29/5 25/30/5 +f 32/21/6 28/19/6 26/31/6 30/32/6 +g Madison_IC_T_Cube.001_Stone +f 6/33/5 2/34/5 4/35/5 8/36/5 +f 6/37/2 5/38/2 1/39/2 2/40/2 +f 4/35/4 3/41/4 7/42/4 8/36/4 +f 1/43/6 5/44/6 7/42/6 3/41/6 +f 2/45/3 1/46/3 3/47/3 4/48/3 +f 19/49/2 20/50/2 24/51/2 23/52/2 +f 23/53/3 24/54/3 22/55/3 21/56/3 +f 21/57/4 22/58/4 18/59/4 17/60/4 +f 19/61/5 23/62/5 21/63/5 17/64/5 +f 24/51/6 20/50/6 18/65/6 22/66/6 +f 2/67/5 34/68/5 36/69/5 46/70/5 +f 2/71/1 1/72/1 33/73/1 34/74/1 +f 38/75/4 37/76/4 3/77/4 4/78/4 +f 46/70/3 45/79/3 37/76/3 38/75/3 +f 1/80/6 3/77/6 37/76/6 45/79/6 +f 39/81/4 40/82/4 22/83/4 21/84/4 +f 23/85/1 24/86/1 44/87/1 43/88/1 +f 47/89/3 48/90/3 40/82/3 39/81/3 +f 23/91/5 43/92/5 41/93/5 47/94/5 +f 24/86/6 22/95/6 40/96/6 48/97/6 +f 33/98/6 1/80/6 45/79/6 35/99/6 +f 36/69/3 35/99/3 45/79/3 46/70/3 +f 4/78/5 2/67/5 46/70/5 38/75/5 +f 44/87/6 24/86/6 48/97/6 42/100/6 +f 21/101/5 23/91/5 47/94/5 39/102/5 +f 41/103/3 42/104/3 48/90/3 47/89/3 +f 52/105/6 50/106/6 49/107/6 51/108/6 +f 49/107/6 50/106/6 54/109/6 53/110/6 +f 54/109/6 50/106/6 55/111/6 56/112/6 +f 59/113/5 60/114/5 57/115/5 58/116/5 +f 57/115/5 61/117/5 62/118/5 58/116/5 +f 62/118/5 64/119/5 63/120/5 58/116/5 +f 52/105/1 59/121/1 58/122/1 50/106/1 +f 56/123/4 64/119/4 62/118/4 54/124/4 +f 54/124/4 62/118/4 61/117/4 53/125/4 +f 50/106/2 58/126/2 63/127/2 55/111/2 +f 53/125/3 61/117/3 57/115/3 49/128/3 +f 49/128/3 57/115/3 60/114/3 51/129/3 diff --git a/mods/mylandscaping/models/mylandscaping_blockm_m_b.obj b/mods/mylandscaping/models/mylandscaping_blockm_m_b.obj new file mode 100644 index 00000000..e3544a3f --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockm_m_b.obj @@ -0,0 +1,116 @@ +# Blender v2.77 (sub 1) OBJ File: 'Madison_walls.blend' +# www.blender.org +o Madison_C_B.001_Cube.021 +v 0.400000 0.500000 -0.050000 +v 0.400000 0.000000 -0.050000 +v 0.400000 0.500000 0.150000 +v 0.400000 0.000000 0.150000 +v -0.400000 0.500000 -0.050000 +v -0.400000 0.000000 -0.050000 +v -0.400000 0.500000 0.150000 +v -0.400000 0.000000 0.150000 +v -0.500000 -0.500000 0.510000 +v -0.500000 0.500000 0.510000 +v -0.500000 -0.500000 -0.150000 +v -0.500000 0.500000 -0.150000 +v -0.400000 -0.500000 0.510000 +v -0.400000 0.500000 0.510000 +v -0.400000 -0.500000 -0.150000 +v -0.400000 0.500000 -0.150000 +v -0.400000 -0.500000 0.100000 +v -0.400000 0.000000 0.100000 +v -0.400000 -0.500000 -0.100000 +v -0.400000 0.000000 -0.100000 +v 0.400000 -0.500000 0.100000 +v 0.400000 0.000000 0.100000 +v 0.400000 -0.500000 -0.100000 +v 0.400000 0.000000 -0.100000 +v 0.400000 -0.500000 0.510000 +v 0.400000 0.500000 0.510000 +v 0.400000 -0.500000 -0.150000 +v 0.400000 0.500000 -0.150000 +v 0.500000 -0.500000 0.510000 +v 0.500000 0.500000 0.510000 +v 0.500000 -0.500000 -0.150000 +v 0.500000 0.500000 -0.150000 +vt 0.5178 0.3213 +vt 0.5178 1.0010 +vt 0.0692 1.0010 +vt 0.0692 0.3213 +vt 0.0012 1.0010 +vt 0.0012 0.3213 +vt -0.4474 1.0010 +vt -0.4474 0.3213 +vt 0.9999 0.0001 +vt 0.9999 0.3400 +vt 0.9659 0.3400 +vt 0.9659 0.0001 +vt 0.0012 -0.1273 +vt 0.0692 -0.1273 +vt 0.0692 1.4496 +vt 0.0012 1.4496 +vt 0.5853 0.3213 +vt 0.5853 1.0010 +vt 0.1367 1.0010 +vt 0.1367 0.3213 +vt 0.0687 1.0010 +vt 0.0687 0.3213 +vt -0.3799 1.0010 +vt -0.3799 0.3213 +vt 0.9999 0.3403 +vt 0.9999 0.6801 +vt 0.9659 0.6801 +vt 0.9659 0.3403 +vt 0.0687 -0.1273 +vt 0.1367 -0.1273 +vt 0.1367 1.4496 +vt 0.0687 1.4496 +vt 0.0117 0.7820 +vt 0.0117 0.2179 +vt 0.1512 0.2179 +vt 0.1512 0.7820 +vt 0.9885 0.7820 +vt 0.6396 0.7820 +vt 0.6396 0.2179 +vt 0.9885 0.2179 +vt 0.5001 0.2179 +vt 0.5001 0.7820 +vt 0.1236 0.9775 +vt 0.1236 0.6305 +vt 0.6788 0.6305 +vt 0.6788 0.9775 +vt 0.6788 0.1447 +vt 0.6788 0.4917 +vt 0.1236 0.4917 +vt 0.1236 0.1447 +vt 0.1236 0.0059 +vt 0.6788 0.0059 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Madison_C_B.001_Cube.021_Wood +s off +f 9/1/1 10/2/1 12/3/1 11/4/1 +f 11/4/2 12/3/2 16/5/2 15/6/2 +f 15/6/3 16/5/3 14/7/3 13/8/3 +f 13/9/4 14/10/4 10/11/4 9/12/4 +f 11/4/5 15/6/5 13/13/5 9/14/5 +f 16/5/6 12/3/6 10/15/6 14/16/6 +f 25/17/1 26/18/1 28/19/1 27/20/1 +f 27/20/2 28/19/2 32/21/2 31/22/2 +f 31/22/3 32/21/3 30/23/3 29/24/3 +f 29/25/4 30/26/4 26/27/4 25/28/4 +f 27/20/5 31/22/5 29/29/5 25/30/5 +f 32/21/6 28/19/6 26/31/6 30/32/6 +g Madison_C_B.001_Cube.021_Stone +f 6/33/5 2/34/5 4/35/5 8/36/5 +f 6/37/2 5/38/2 1/39/2 2/40/2 +f 4/35/4 3/41/4 7/42/4 8/36/4 +f 1/39/6 5/38/6 7/42/6 3/41/6 +f 19/43/2 20/44/2 24/45/2 23/46/2 +f 21/47/4 22/48/4 18/49/4 17/50/4 +f 19/51/5 23/52/5 21/47/5 17/50/5 +f 24/45/6 20/44/6 18/49/6 22/48/6 diff --git a/mods/mylandscaping/models/mylandscaping_blockm_m_t.obj b/mods/mylandscaping/models/mylandscaping_blockm_m_t.obj new file mode 100644 index 00000000..0f73a165 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockm_m_t.obj @@ -0,0 +1,138 @@ +# Blender v2.77 (sub 1) OBJ File: 'Madison_walls.blend' +# www.blender.org +o Madison_C_T.002_Cube.019 +v 0.400000 0.500000 0.050000 +v 0.400000 -0.000000 0.050000 +v 0.400000 0.500000 0.250000 +v 0.400000 -0.000000 0.250000 +v -0.400000 0.500000 0.050000 +v -0.400000 -0.000000 0.050000 +v -0.400000 0.500000 0.250000 +v -0.400000 -0.000000 0.250000 +v -0.500000 -0.500000 0.510000 +v -0.500000 0.600000 0.510000 +v -0.500000 -0.500000 -0.150000 +v -0.500000 0.600000 -0.150000 +v -0.400000 -0.500000 0.510000 +v -0.400000 0.600000 0.510000 +v -0.400000 -0.500000 -0.150000 +v -0.400000 0.600000 -0.150000 +v -0.400000 -0.500000 0.200000 +v -0.400000 -0.000000 0.200000 +v -0.400000 -0.500000 0.000000 +v -0.400000 -0.000000 0.000000 +v 0.400000 -0.500000 0.200000 +v 0.400000 -0.000000 0.200000 +v 0.400000 -0.500000 0.000000 +v 0.400000 -0.000000 0.000000 +v 0.400000 -0.500000 0.510000 +v 0.400000 0.600000 0.510000 +v 0.400000 -0.500000 -0.150000 +v 0.400000 0.600000 -0.150000 +v 0.500000 -0.500000 0.510000 +v 0.500000 0.600000 0.510000 +v 0.500000 -0.500000 -0.150000 +v 0.500000 0.600000 -0.150000 +v -0.400000 0.600000 0.510000 +v -0.400000 0.600000 0.000000 +v 0.400000 0.600000 0.510000 +v 0.400000 0.600000 0.000000 +v -0.400000 0.500000 0.510000 +v -0.400000 0.500000 0.000000 +v 0.400000 0.500000 0.510000 +v 0.400000 0.500000 0.000000 +vt 0.5150 0.0003 +vt 0.5150 0.7479 +vt 0.0664 0.7479 +vt 0.0664 0.0003 +vt -0.0016 0.7479 +vt -0.0016 0.0003 +vt -0.4502 0.7479 +vt -0.4502 0.0003 +vt 0.9999 0.0001 +vt 0.9999 0.3740 +vt 0.9659 0.3740 +vt 0.9659 0.0001 +vt -0.0016 -0.4483 +vt 0.0664 -0.4483 +vt 0.0664 1.1965 +vt -0.0016 1.1965 +vt 0.5826 0.0003 +vt 0.5826 0.7479 +vt 0.1340 0.7479 +vt 0.1340 0.0003 +vt 0.0660 0.7479 +vt 0.0660 0.0003 +vt -0.3825 0.7479 +vt -0.3825 0.0003 +vt 0.9999 0.3743 +vt 0.9999 0.7481 +vt 0.9659 0.7481 +vt 0.9659 0.3743 +vt 0.0660 -0.4483 +vt 0.1340 -0.4483 +vt 0.1340 1.1965 +vt 0.0660 1.1965 +vt 0.0685 0.0395 +vt 0.5683 0.0395 +vt 0.5683 0.1645 +vt 0.0685 0.1645 +vt 0.0685 0.9141 +vt 0.0685 0.6017 +vt 0.5683 0.6017 +vt 0.5683 0.9141 +vt 0.5683 0.4768 +vt 0.0685 0.4768 +vt 0.3094 0.9265 +vt 0.3094 0.6142 +vt 0.8092 0.6142 +vt 0.8092 0.9265 +vt 0.8092 0.1769 +vt 0.8092 0.4892 +vt 0.3094 0.4892 +vt 0.3094 0.1769 +vt 0.3094 0.0520 +vt 0.8092 0.0520 +vt 0.6557 0.5000 +vt 0.0001 0.5000 +vt 0.0001 0.0820 +vt 0.6557 0.0820 +vt 0.6557 0.5820 +vt 0.6557 0.9999 +vt 0.0001 0.9999 +vt 0.0001 0.5820 +vt 0.0001 0.0001 +vt 0.6557 0.0001 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Madison_C_T.002_Cube.019_Wood +s off +f 9/1/1 10/2/1 12/3/1 11/4/1 +f 11/4/2 12/3/2 16/5/2 15/6/2 +f 15/6/3 16/5/3 14/7/3 13/8/3 +f 13/9/4 14/10/4 10/11/4 9/12/4 +f 11/4/5 15/6/5 13/13/5 9/14/5 +f 16/5/6 12/3/6 10/15/6 14/16/6 +f 25/17/1 26/18/1 28/19/1 27/20/1 +f 27/20/2 28/19/2 32/21/2 31/22/2 +f 31/22/3 32/21/3 30/23/3 29/24/3 +f 29/25/4 30/26/4 26/27/4 25/28/4 +f 27/20/5 31/22/5 29/29/5 25/30/5 +f 32/21/6 28/19/6 26/31/6 30/32/6 +g Madison_C_T.002_Cube.019_Stone +f 6/33/5 2/34/5 4/35/5 8/36/5 +f 6/37/2 5/38/2 1/39/2 2/40/2 +f 4/35/4 3/41/4 7/42/4 8/36/4 +f 1/39/6 5/38/6 7/42/6 3/41/6 +f 19/43/2 20/44/2 24/45/2 23/46/2 +f 21/47/4 22/48/4 18/49/4 17/50/4 +f 19/51/5 23/52/5 21/47/5 17/50/5 +f 24/45/6 20/44/6 18/49/6 22/48/6 +f 36/53/6 34/54/6 33/55/6 35/56/6 +f 40/57/5 39/58/5 37/59/5 38/60/5 +f 33/55/4 37/61/4 39/62/4 35/56/4 +f 36/53/2 40/57/2 38/60/2 34/54/2 diff --git a/mods/mylandscaping/models/mylandscaping_blockm_oc_b.obj b/mods/mylandscaping/models/mylandscaping_blockm_oc_b.obj new file mode 100644 index 00000000..7cf3bb5e --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockm_oc_b.obj @@ -0,0 +1,183 @@ +# Blender v2.77 (sub 1) OBJ File: 'Madison_walls.blend' +# www.blender.org +o Madison_OC_B_Cube.030 +v 0.050000 0.500000 -0.050000 +v 0.050000 0.000000 -0.050000 +v -0.400000 0.500000 -0.050000 +v -0.400000 0.000000 -0.050000 +v -0.400000 0.000000 0.150000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.150000 +v -0.500000 0.500000 -0.150000 +v -0.400000 -0.500000 0.500000 +v -0.400000 0.500000 0.150000 +v -0.400000 -0.500000 -0.150000 +v -0.400000 0.500000 -0.150000 +v -0.400000 -0.500000 0.100000 +v -0.400000 0.000000 0.100000 +v -0.400000 -0.500000 -0.100000 +v -0.400000 0.000000 -0.100000 +v -0.150000 0.500000 0.400000 +v 0.100000 -0.500000 -0.100000 +v 0.100000 0.000000 -0.100000 +v -0.400000 -0.500000 0.400000 +v -0.400000 0.500000 0.500000 +v 0.150000 -0.500000 0.400000 +v 0.150000 0.500000 0.400000 +v -0.400000 -0.500000 0.500000 +v -0.400000 0.500000 0.500000 +v 0.150000 -0.500000 0.500000 +v 0.150000 0.500000 0.500000 +v 0.050000 0.500000 0.400000 +v 0.050000 0.000000 0.400000 +v -0.400000 0.500000 0.400000 +v -0.150000 0.000000 0.400000 +v 0.050000 0.500000 0.150000 +v 0.050000 0.000000 0.150000 +v -0.150000 0.500000 0.150000 +v -0.150000 0.000000 0.150000 +v -0.100000 -0.500000 0.100000 +v -0.100000 0.000000 0.100000 +v 0.100000 -0.500000 0.100000 +v 0.100000 0.000000 0.100000 +v -0.100000 -0.500000 0.400000 +v -0.100000 0.000000 0.400000 +v 0.100000 -0.500000 0.400000 +v 0.100000 0.000000 0.400000 +v -0.100000 0.000000 -0.100000 +v -0.100000 -0.500000 -0.100000 +v -0.150000 0.500000 -0.050000 +v -0.150000 0.000000 -0.050000 +vt 0.5167 0.3202 +vt 0.5167 0.9999 +vt 0.0681 0.9999 +vt 0.0681 0.3202 +vt 0.0001 0.9999 +vt 0.0001 0.3202 +vt -0.4485 0.9999 +vt -0.4485 0.3202 +vt 0.9999 0.0001 +vt 0.9999 0.3400 +vt 0.9659 0.3400 +vt 0.9659 0.0001 +vt 0.0001 -0.1284 +vt 0.0681 -0.1284 +vt 0.0681 1.4485 +vt 0.0001 1.4485 +vt 0.5846 0.3202 +vt 0.5846 0.9999 +vt 0.1360 0.9999 +vt 0.1360 0.3202 +vt 0.0680 0.9999 +vt 0.0680 0.3202 +vt -0.3805 0.9999 +vt -0.3805 0.3202 +vt 0.9999 0.3403 +vt 0.9999 0.6801 +vt 0.9659 0.6801 +vt 0.9659 0.3403 +vt 0.0680 -0.1284 +vt 0.1360 -0.1284 +vt 0.1360 1.4485 +vt 0.0680 1.4485 +vt 0.4264 0.0865 +vt 0.6012 0.0000 +vt 0.7047 0.1578 +vt 0.5059 0.3178 +vt 0.7083 0.1184 +vt 0.7083 0.6554 +vt 0.4935 0.6554 +vt 0.4935 0.1184 +vt 0.4321 0.9116 +vt 0.1477 0.8908 +vt 0.1914 0.3503 +vt 0.9767 0.6554 +vt 0.9767 0.8702 +vt 0.7083 0.8702 +vt 0.2787 0.6554 +vt 0.2787 0.1184 +vt 0.1256 0.3136 +vt 0.6138 0.3136 +vt 0.6138 0.5088 +vt 0.1256 0.5088 +vt 0.6138 0.7041 +vt 0.1256 0.7041 +vt 0.4712 0.8391 +vt 0.4712 0.1049 +vt 0.9117 0.1049 +vt 0.9117 0.8391 +vt 0.5881 0.3128 +vt 0.7610 0.4857 +vt 0.5881 0.6585 +vt 0.4152 0.4857 +vt 0.6138 0.0207 +vt 0.8091 0.0207 +vt 0.8091 0.3136 +vt 0.9035 0.3092 +vt 0.7937 0.4614 +vt 0.0102 0.6554 +vt 0.0102 0.1184 +vt 0.3288 0.0535 +vt 0.1559 0.2264 +vt 0.6647 0.9532 +vt 0.2787 0.8702 +vt 0.0102 0.8702 +vt 0.8091 0.5088 +vt 0.6138 0.9970 +vt 0.1256 0.9970 +vt 0.0306 0.8391 +vt 0.0306 0.1049 +vt 0.3288 0.9178 +vt 0.1559 0.7450 +vt 0.8091 0.7041 +vt 0.8091 0.9970 +vt 0.4935 0.8702 +vt 0.9767 0.1184 +vt 0.1477 0.1384 +vt 0.1256 0.0207 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Madison_OC_B_Cube.030_Wood +s off +f 6/1/1 7/2/1 9/3/1 8/4/1 +f 8/4/2 9/3/2 13/5/2 12/6/2 +f 12/6/3 13/5/3 22/7/3 10/8/3 +f 10/9/4 22/10/4 7/11/4 6/12/4 +f 8/4/5 12/6/5 10/13/5 6/14/5 +f 13/5/6 9/3/6 7/15/6 22/16/6 +f 21/17/2 31/18/2 24/19/2 23/20/2 +f 23/20/3 24/19/3 28/21/3 27/22/3 +f 27/22/4 28/21/4 26/23/4 25/24/4 +f 25/25/1 26/26/1 31/27/1 21/28/1 +f 23/20/5 27/22/5 25/29/5 21/30/5 +f 28/21/6 24/19/6 31/31/6 26/32/6 +g Madison_OC_B_Cube.030_Stone +f 48/33/5 2/34/5 34/35/5 36/36/5 +f 48/37/2 47/38/2 1/39/2 2/40/2 +f 36/36/4 35/41/4 11/42/4 5/43/4 +f 47/38/6 3/44/6 11/45/6 35/46/6 +f 2/40/3 1/39/3 33/47/3 34/48/3 +f 46/49/2 45/50/2 20/51/2 19/52/2 +f 19/52/3 20/51/3 40/53/3 39/54/3 +f 37/55/4 38/56/4 15/57/4 14/58/4 +f 46/59/5 19/60/5 39/61/5 37/62/5 +f 45/50/6 17/63/6 15/64/6 38/65/6 +f 34/35/5 30/66/5 32/67/5 36/36/5 +f 34/48/3 33/47/3 29/68/3 30/69/3 +f 16/70/5 46/59/5 37/62/5 14/71/5 +f 32/67/1 18/72/1 35/41/1 36/36/1 +f 29/68/6 33/47/6 35/73/6 18/74/6 +f 20/51/6 45/50/6 38/65/6 40/75/6 +f 39/54/3 40/53/3 44/76/3 43/77/3 +f 41/78/1 42/79/1 38/56/1 37/55/1 +f 39/61/5 43/80/5 41/81/5 37/62/5 +f 44/76/6 40/53/6 38/82/6 42/83/6 +f 1/39/6 47/38/6 35/46/6 33/84/6 +f 4/85/2 3/44/2 47/38/2 48/37/2 +f 4/86/5 48/33/5 36/36/5 5/43/5 +f 16/87/2 17/63/2 45/50/2 46/49/2 diff --git a/mods/mylandscaping/models/mylandscaping_blockm_oc_t.obj b/mods/mylandscaping/models/mylandscaping_blockm_oc_t.obj new file mode 100644 index 00000000..3d3d933a --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_blockm_oc_t.obj @@ -0,0 +1,179 @@ +# Blender v2.77 (sub 1) OBJ File: 'Madison_walls.blend' +# www.blender.org +o Madison_OC_T_Cube.031 +v -0.050000 0.500000 0.050000 +v -0.050000 0.000000 0.050000 +v -0.400000 0.500000 0.050000 +v -0.400000 0.000000 0.050000 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.600000 0.500000 +v -0.500000 -0.500000 -0.150000 +v -0.500000 0.600000 -0.150000 +v -0.400000 -0.500000 0.500000 +v -0.400000 -0.500000 -0.150000 +v -0.400000 0.600000 -0.150000 +v -0.400000 -0.500000 0.100000 +v -0.400000 0.000000 0.100000 +v -0.400000 -0.500000 0.000000 +v -0.400000 0.000000 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.000000 0.000000 0.000000 +v -0.400000 -0.500000 0.400000 +v -0.400000 0.600000 0.500000 +v 0.150000 -0.500000 0.400000 +v 0.150000 0.600000 0.400000 +v -0.400000 -0.500000 0.500000 +v -0.400000 0.600000 0.500000 +v 0.150000 -0.500000 0.500000 +v 0.150000 0.600000 0.500000 +v -0.050000 0.500000 0.400000 +v -0.050000 0.000000 0.400000 +v -0.400000 0.600000 0.400000 +v -0.100000 -0.500000 0.100000 +v -0.100000 0.000000 0.100000 +v -0.000000 -0.500000 0.100000 +v -0.000000 0.000000 0.100000 +v -0.100000 -0.500000 0.400000 +v -0.100000 0.000000 0.400000 +v -0.000000 -0.500000 0.400000 +v -0.000000 0.000000 0.400000 +v -0.100000 0.000000 0.000000 +v -0.100000 -0.500000 0.000000 +v 0.100000 0.600000 -0.100000 +v 0.100000 0.600000 0.400000 +v -0.400000 0.600000 0.400000 +v -0.400000 0.600000 -0.100000 +v -0.400000 0.500000 -0.100000 +v 0.100000 0.500000 -0.100000 +v -0.400000 0.500000 0.400000 +v 0.100000 0.500000 0.400000 +v -0.400000 0.000000 0.100000 +v -0.400000 -0.500000 0.000000 +v -0.400000 0.000000 0.000000 +v -0.100000 0.000000 0.400000 +v -0.000000 -0.500000 0.400000 +v -0.000000 0.000000 0.400000 +vt 0.5169 0.0002 +vt 0.5169 0.7479 +vt 0.0683 0.7479 +vt 0.0683 0.0002 +vt 0.0003 0.7479 +vt 0.0003 0.0002 +vt -0.4482 0.7479 +vt -0.4482 0.0002 +vt 0.9999 0.3743 +vt 0.9999 0.7481 +vt 0.9659 0.7481 +vt 0.9659 0.3743 +vt 0.0003 -0.4483 +vt 0.0683 -0.4483 +vt 0.0683 1.1964 +vt 0.0003 1.1964 +vt 0.5847 0.0002 +vt 0.5847 0.7479 +vt 0.1362 0.7479 +vt 0.1362 0.0002 +vt 0.0682 0.7479 +vt 0.0682 0.0002 +vt -0.3804 0.7479 +vt -0.3804 0.0002 +vt 0.9999 0.0001 +vt 0.9999 0.3740 +vt 0.9659 0.3740 +vt 0.9659 0.0001 +vt 0.0682 -0.4483 +vt 0.1362 -0.4483 +vt 0.1362 1.1964 +vt 0.0682 1.1964 +vt 0.4029 0.4956 +vt 0.9466 0.4956 +vt 0.9466 0.9913 +vt 0.4029 0.9913 +vt 0.6563 0.6411 +vt 0.1387 0.6411 +vt 0.1387 0.5376 +vt 0.6563 0.5376 +vt 0.1387 0.4341 +vt 0.6563 0.4341 +vt 0.3872 0.0333 +vt 0.3872 0.4497 +vt 0.1374 0.4497 +vt 0.1374 0.0333 +vt 0.6513 0.1562 +vt 0.7603 0.1562 +vt 0.7603 0.2652 +vt 0.6513 0.2652 +vt 0.1387 0.9517 +vt 0.0351 0.9517 +vt 0.0351 0.6411 +vt 0.3244 0.1562 +vt 0.3244 0.2652 +vt 0.0351 0.5376 +vt 0.1387 0.1235 +vt 0.6563 0.1235 +vt 0.6371 0.0333 +vt 0.6371 0.4497 +vt 0.7603 0.5921 +vt 0.6513 0.5921 +vt 0.0351 0.4341 +vt 0.0351 0.1235 +vt 0.6563 0.9517 +vt 0.2065 0.7923 +vt 0.2065 0.0592 +vt 0.9257 0.0592 +vt 0.9257 0.7923 +vt 0.9534 0.1479 +vt 0.9534 0.8657 +vt 0.2355 0.8657 +vt 0.2355 0.1479 +vt 0.9257 0.9389 +vt 0.2065 0.9389 +vt 0.0627 0.7923 +vt 0.0627 0.0592 +vt 0.4029 0.0000 +vt 0.9466 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Madison_OC_T_Cube.031_Wood +s off +f 5/1/1 6/2/1 8/3/1 7/4/1 +f 7/4/2 8/3/2 11/5/2 10/6/2 +f 10/6/3 11/5/3 19/7/3 9/8/3 +f 9/9/4 19/10/4 6/11/4 5/12/4 +f 7/4/5 10/6/5 9/13/5 5/14/5 +f 11/5/6 8/3/6 6/15/6 19/16/6 +f 18/17/2 28/18/2 21/19/2 20/20/2 +f 20/20/3 21/19/3 25/21/3 24/22/3 +f 24/22/4 25/21/4 23/23/4 22/24/4 +f 22/25/1 23/26/1 28/27/1 18/28/1 +f 20/20/5 24/22/5 22/29/5 18/30/5 +f 25/21/6 21/19/6 28/31/6 23/32/6 +g Madison_OC_T_Cube.031_Stone +f 2/33/3 1/34/3 26/35/3 27/36/3 +f 38/37/2 37/38/2 17/39/2 16/40/2 +f 16/40/3 17/39/3 32/41/3 31/42/3 +f 29/43/4 30/44/4 13/45/4 12/46/4 +f 38/47/5 16/48/5 31/49/5 29/50/5 +f 37/38/6 15/51/6 13/52/6 30/53/6 +f 14/54/5 38/47/5 29/50/5 12/55/5 +f 17/39/6 37/38/6 30/53/6 32/56/6 +f 31/42/3 32/41/3 36/57/3 35/58/3 +f 33/59/1 34/60/1 30/44/1 29/43/1 +f 31/49/5 35/61/5 33/62/5 29/50/5 +f 36/57/6 32/41/6 30/63/6 34/64/6 +f 14/65/2 15/51/2 37/38/2 38/37/2 +f 39/66/6 42/67/6 41/68/6 40/69/6 +f 44/70/5 46/71/5 45/72/5 43/73/5 +f 40/69/3 46/74/3 44/75/3 39/66/3 +f 39/66/2 44/76/2 43/77/2 42/67/2 +f 4/78/2 3/79/2 1/34/2 2/33/2 +l 51 35 +l 36 52 +l 47 13 +l 15 49 +l 14 48 +l 34 50 diff --git a/mods/mylandscaping/models/mylandscaping_cement_mixer.obj b/mods/mylandscaping/models/mylandscaping_cement_mixer.obj new file mode 100644 index 00000000..e50a8e20 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_cement_mixer.obj @@ -0,0 +1,1462 @@ +# Blender v2.74 (sub 0) OBJ File: 'Machine.blend' +# www.blender.org +o Cement_Mixer_Cylinder.002 +v -1.011610 -0.200277 0.003856 +v -0.552339 -0.205112 -0.289659 +v -0.647205 -0.207789 -0.408958 +v -1.106475 -0.202954 -0.115443 +v -0.665016 -0.148675 -0.390149 +v -0.993798 -0.259391 -0.014953 +v -0.664719 -0.266175 -0.387749 +v -0.829259 -0.262783 -0.201351 +v -0.994096 -0.141891 -0.017353 +v -0.829556 -0.145283 -0.203751 +v -0.777396 -0.209738 -0.488239 +v -0.941936 -0.206346 -0.301841 +v -0.881419 -0.198328 0.083137 +v -0.716879 -0.201720 -0.103261 +v -1.091590 -0.202103 -0.075614 +v -1.007082 -0.244431 -0.000246 +v -0.922798 -0.198633 0.073322 +v -1.007306 -0.156305 -0.002046 +v -0.556499 -0.261704 -0.292301 +v -0.567225 -0.205963 -0.329488 +v -0.885864 -0.141913 0.078186 +v -0.651509 -0.251761 -0.403056 +v -0.736017 -0.209433 -0.478424 +v -0.651732 -0.163635 -0.404856 +v -1.102030 -0.259370 -0.110493 +v -0.773237 -0.153146 -0.485597 +v -0.885578 -0.254920 0.080495 +v -0.721039 -0.258312 -0.105903 +v -0.556785 -0.148696 -0.294610 +v -0.721325 -0.145304 -0.108212 +v -0.772951 -0.266153 -0.483289 +v -0.937490 -0.262762 -0.296891 +v -1.102316 -0.146362 -0.112801 +v -0.937776 -0.149754 -0.299199 +v -0.714685 -0.265145 -0.331145 +v -0.943832 -0.260421 -0.071557 +v -0.944129 -0.142921 -0.073958 +v -0.714983 -0.147645 -0.333545 +v -0.827362 -0.208708 -0.431635 +v -1.056509 -0.203984 -0.172048 +v -0.831452 -0.199358 0.026533 +v -0.602306 -0.204082 -0.233055 +v -1.066358 -0.169085 -0.060865 +v -1.066193 -0.234363 -0.059531 +v -0.941326 -0.166515 0.049458 +v -0.941161 -0.231793 0.050791 +v -0.717654 -0.176273 -0.455894 +v -0.717488 -0.241551 -0.454560 +v -0.592622 -0.173703 -0.345571 +v -0.592457 -0.238981 -0.344237 +v -0.835612 -0.255950 0.023891 +v -0.606465 -0.260674 -0.235697 +v -0.606751 -0.147666 -0.238005 +v -0.835898 -0.142943 0.021582 +v -0.822917 -0.265123 -0.426685 +v -1.052063 -0.260400 -0.167097 +v -1.052349 -0.147392 -0.169405 +v -0.823203 -0.152116 -0.428993 +v -0.993894 -0.324031 0.018265 +v -0.560587 -0.329693 -0.312365 +v -0.664921 -0.324031 -0.423367 +v -1.098228 -0.318369 -0.092737 +v -0.679088 -0.265310 -0.400637 +v -0.979726 -0.382752 -0.004465 +v -0.682644 -0.382752 -0.403286 +v -0.831185 -0.382752 -0.203875 +v -0.976171 -0.265310 -0.001817 +v -0.827630 -0.265310 -0.201227 +v -0.801145 -0.318369 -0.491558 +v -0.949686 -0.318369 -0.292147 +v -0.857670 -0.329693 0.086455 +v -0.709128 -0.329693 -0.112955 +v -1.080117 -0.319785 -0.054283 +v -0.991241 -0.368072 0.011921 +v -0.899699 -0.328277 0.080111 +v -0.988575 -0.279990 0.013907 +v -0.566896 -0.385952 -0.317064 +v -0.578698 -0.328277 -0.350819 +v -0.860559 -0.273001 0.084303 +v -0.670240 -0.368072 -0.419009 +v -0.759116 -0.319785 -0.485213 +v -0.667574 -0.279990 -0.417023 +v -1.095339 -0.375061 -0.090585 +v -0.794836 -0.262110 -0.486858 +v -0.863978 -0.385952 0.081756 +v -0.715437 -0.385952 -0.117654 +v -0.563476 -0.273001 -0.314517 +v -0.712018 -0.273001 -0.115107 +v -0.798256 -0.375061 -0.489405 +v -0.946797 -0.375061 -0.289995 +v -1.091919 -0.262110 -0.088038 +v -0.943378 -0.262110 -0.287448 +v -0.727752 -0.382752 -0.342730 +v -0.934618 -0.382752 -0.065021 +v -0.931063 -0.265310 -0.062372 +v -0.724196 -0.265310 -0.340082 +v -0.846253 -0.318369 -0.431002 +v -1.053120 -0.318369 -0.153293 +v -0.812562 -0.329693 0.025900 +v -0.605695 -0.329693 -0.251810 +v -1.052641 -0.288263 -0.040289 +v -1.054617 -0.353508 -0.041760 +v -0.918998 -0.294554 0.059263 +v -0.920973 -0.359799 0.057791 +v -0.737841 -0.288263 -0.462894 +v -0.739817 -0.353508 -0.464365 +v -0.604198 -0.294554 -0.363342 +v -0.606173 -0.359799 -0.364814 +v -0.818870 -0.385952 0.021200 +v -0.612004 -0.385952 -0.256509 +v -0.608584 -0.273001 -0.253962 +v -0.815451 -0.273001 0.023748 +v -0.843364 -0.375061 -0.428850 +v -1.050231 -0.375061 -0.151140 +v -1.046811 -0.262110 -0.148593 +v -0.839944 -0.262110 -0.426303 +v -0.954871 -0.496786 0.440862 +v -1.018228 -0.496786 -0.006734 +v -1.463057 -0.496786 0.439488 +v -1.461684 -0.496786 -0.068698 +v -1.208997 -0.481593 0.442520 +v -0.950981 -0.469930 0.186801 +v -1.207558 -0.473997 -0.073499 +v -1.470682 -0.474688 0.185363 +v -1.208277 -0.250916 0.186082 +v -1.063801 -0.474227 0.441581 +v -0.969046 -0.475412 0.035097 +v -1.352754 -0.470544 -0.073891 +v -1.469799 -0.481593 0.330559 +v -1.354193 -0.481593 0.451882 +v -0.969947 -0.474227 0.331997 +v -1.091501 -0.475412 -0.074777 +v -1.470064 -0.470544 0.040166 +v -1.353473 -0.347184 0.185690 +v -1.063081 -0.331038 0.186474 +v -1.208670 -0.370664 0.331278 +v -1.207885 -0.340476 0.040886 +v -1.062689 -0.395428 0.041278 +v -1.063474 -0.397572 0.331670 +v -1.353866 -0.423239 0.330886 +v -1.353081 -0.384393 0.040493 +v -0.944098 -0.499938 0.451693 +v -1.007396 -0.499938 -0.017507 +v -1.473889 -0.499938 0.450261 +v -1.472457 -0.499938 -0.079529 +v -1.209027 -0.499938 0.463591 +v -0.930768 -0.499938 0.186832 +v -1.207527 -0.499938 -0.091427 +v -1.485787 -0.499938 0.185332 +v -1.057659 -0.499938 0.464000 +v -0.947607 -0.499938 0.028955 +v -1.358896 -0.499938 -0.091837 +v -1.486196 -0.499938 0.336701 +v -1.360396 -0.499938 0.463182 +v -0.959078 -0.499938 0.338201 +v -1.085297 -0.499938 -0.091018 +v -1.485378 -0.499938 0.033963 +v -1.012233 -0.437820 0.003777 +v -0.556950 -0.437820 -0.295923 +v -0.653411 -0.437820 -0.413967 +v -1.108695 -0.437820 -0.114266 +v -0.670803 -0.379057 -0.393718 +v -0.994841 -0.496582 -0.016471 +v -0.670803 -0.496582 -0.393718 +v -0.832822 -0.496582 -0.205095 +v -0.994841 -0.379057 -0.016471 +v -0.832822 -0.379057 -0.205095 +v -0.784657 -0.437820 -0.491514 +v -0.946676 -0.437820 -0.302890 +v -0.880987 -0.437820 0.081324 +v -0.718969 -0.437820 -0.107300 +v -1.093276 -0.437820 -0.074632 +v -1.007885 -0.481892 -0.001285 +v -0.922495 -0.437820 0.072061 +v -1.007885 -0.393748 -0.001285 +v -0.561303 -0.494336 -0.299663 +v -0.572369 -0.437820 -0.335558 +v -0.885341 -0.381304 0.077585 +v -0.657759 -0.481892 -0.408905 +v -0.743149 -0.437820 -0.482251 +v -0.657759 -0.393748 -0.408905 +v -1.104342 -0.494335 -0.110527 +v -0.780304 -0.381304 -0.487774 +v -0.885341 -0.494336 0.077585 +v -0.723322 -0.494336 -0.111039 +v -0.561303 -0.381304 -0.299663 +v -0.723322 -0.381304 -0.111039 +v -0.780304 -0.494335 -0.487774 +v -0.942323 -0.494335 -0.299151 +v -1.104342 -0.381304 -0.110527 +v -0.942323 -0.381304 -0.299151 +v -0.720004 -0.496582 -0.336439 +v -0.945640 -0.496582 -0.073751 +v -0.945640 -0.379057 -0.073751 +v -0.720004 -0.379057 -0.336438 +v -0.833858 -0.437820 -0.434234 +v -1.059494 -0.437820 -0.171546 +v -0.831787 -0.437820 0.024044 +v -0.606150 -0.437820 -0.238643 +v -1.067755 -0.405174 -0.059553 +v -1.067755 -0.470466 -0.059553 +v -0.941251 -0.405174 0.049108 +v -0.941251 -0.470466 0.049108 +v -0.724393 -0.405174 -0.459298 +v -0.724393 -0.470466 -0.459298 +v -0.597889 -0.405174 -0.350637 +v -0.597889 -0.470466 -0.350637 +v -0.836140 -0.494336 0.020305 +v -0.610504 -0.494336 -0.242383 +v -0.610503 -0.381304 -0.242383 +v -0.836140 -0.381304 0.020305 +v -0.829504 -0.494335 -0.430494 +v -1.055141 -0.494335 -0.167807 +v -1.055141 -0.381304 -0.167807 +v -0.829504 -0.381304 -0.430494 +v -0.846375 -0.497938 0.168502 +v -0.852050 -0.127725 0.150959 +v -0.747979 -0.497938 0.168629 +v -0.742259 -0.127725 0.151101 +v -0.668449 -0.497938 0.226567 +v -0.653519 -0.127725 0.215749 +v -0.638163 -0.497938 0.320187 +v -0.619726 -0.127725 0.320211 +v -0.668690 -0.497938 0.413728 +v -0.653788 -0.127725 0.424585 +v -0.748369 -0.497938 0.471462 +v -0.742694 -0.127725 0.489004 +v -0.846765 -0.497938 0.471335 +v -0.852486 -0.127725 0.488863 +v -0.926295 -0.497938 0.413396 +v -0.941226 -0.127725 0.424215 +v -0.956581 -0.497938 0.319777 +v -0.975019 -0.127725 0.319753 +v -0.926054 -0.497938 0.226235 +v -0.940957 -0.127725 0.215379 +v -0.852050 -0.216071 0.150959 +v -0.742259 -0.216071 0.151101 +v -0.653519 -0.216071 0.215749 +v -0.619726 -0.216071 0.320211 +v -0.653788 -0.216071 0.424585 +v -0.742694 -0.216071 0.489004 +v -0.852486 -0.216071 0.488863 +v -0.941225 -0.216071 0.424215 +v -0.975019 -0.216071 0.319753 +v -0.940957 -0.216071 0.215379 +v -0.847304 -0.127725 0.165632 +v -0.747043 -0.127725 0.165762 +v -0.666007 -0.127725 0.224798 +v -0.635147 -0.127725 0.320191 +v -0.666252 -0.127725 0.415504 +v -0.747441 -0.127725 0.474331 +v -0.847701 -0.127725 0.474202 +v -0.928738 -0.127725 0.415166 +v -0.959597 -0.127725 0.319773 +v -0.928492 -0.127725 0.224459 +v -0.847304 -0.308611 0.165632 +v -0.747043 -0.308611 0.165762 +v -0.666007 -0.308611 0.224798 +v -0.635147 -0.308611 0.320191 +v -0.666252 -0.308611 0.415504 +v -0.747441 -0.308611 0.474331 +v -0.847701 -0.308611 0.474202 +v -0.928738 -0.308611 0.415166 +v -0.959597 -0.308611 0.319773 +v -0.928492 -0.308611 0.224459 +v 0.162486 -0.339504 0.330381 +v 0.162486 -0.339504 0.411288 +v 0.193390 -0.244392 0.330381 +v 0.193390 -0.244392 0.411288 +v 0.274297 -0.185610 0.330381 +v 0.274297 -0.185610 0.411288 +v 0.374304 -0.185610 0.330381 +v 0.374304 -0.185610 0.411288 +v 0.455211 -0.244392 0.330381 +v 0.455211 -0.244392 0.411288 +v 0.486115 -0.339504 0.330381 +v 0.486115 -0.339504 0.411288 +v 0.455211 -0.434616 0.330381 +v 0.455211 -0.434616 0.411288 +v 0.374304 -0.493399 0.330381 +v 0.374304 -0.493399 0.411288 +v 0.274297 -0.493399 0.330381 +v 0.274297 -0.493399 0.411288 +v 0.193390 -0.434616 0.330381 +v 0.193390 -0.434616 0.411288 +v 0.162486 -0.339504 -0.312056 +v 0.162486 -0.339504 -0.231149 +v 0.193390 -0.244392 -0.312056 +v 0.193390 -0.244392 -0.231149 +v 0.274297 -0.185610 -0.312056 +v 0.274297 -0.185610 -0.231149 +v 0.374304 -0.185610 -0.312056 +v 0.374304 -0.185610 -0.231149 +v 0.455211 -0.244392 -0.312056 +v 0.455211 -0.244392 -0.231149 +v 0.486115 -0.339504 -0.312056 +v 0.486115 -0.339504 -0.231149 +v 0.455211 -0.434616 -0.312056 +v 0.455211 -0.434616 -0.231149 +v 0.374304 -0.493399 -0.312056 +v 0.374304 -0.493399 -0.231149 +v 0.274297 -0.493399 -0.312056 +v 0.274297 -0.493399 -0.231149 +v 0.193390 -0.434616 -0.312056 +v 0.193390 -0.434616 -0.231149 +v 0.377534 -0.305602 0.321107 +v 0.359739 0.447395 0.232132 +v 0.269658 -0.305602 0.321107 +v 0.287453 0.447395 0.232132 +v 0.377534 -0.305602 -0.218273 +v 0.359739 0.447395 -0.129299 +v 0.269658 -0.305602 -0.218273 +v 0.287453 0.447395 -0.129299 +v 0.377534 0.291804 0.321107 +v 0.269658 0.291804 0.321107 +v 0.269658 0.291804 -0.218273 +v 0.377534 0.291804 -0.218273 +v 0.269658 -0.388430 0.321107 +v 0.377534 -0.388430 0.321107 +v 0.269658 -0.388429 -0.218273 +v 0.377534 -0.388429 -0.218273 +v -0.584373 -0.305602 -0.102152 +v -0.584373 -0.305602 0.204985 +v -0.584373 -0.494668 -0.102152 +v -0.584373 -0.494668 0.204985 +v -0.451635 -0.388429 0.135400 +v 0.136920 -0.388430 0.135400 +v 0.136920 -0.305602 0.135400 +v -0.451636 -0.305602 0.135400 +v -0.451635 -0.305602 -0.032567 +v 0.136920 -0.305602 -0.032567 +v 0.136920 -0.388430 -0.032567 +v -0.451636 -0.388429 -0.032567 +v -0.661081 -0.305602 -0.102152 +v -0.661081 -0.305602 0.204985 +v -0.661081 -0.494668 -0.102152 +v -0.661081 -0.494668 0.204985 +v -0.584373 0.434734 -0.102152 +v -0.584373 0.434734 0.204985 +v -0.661081 0.434734 -0.102152 +v -0.661081 0.434734 0.204985 +v -0.584373 0.099159 -0.102152 +v -0.661081 0.099159 -0.102152 +v -0.661081 0.099159 0.204985 +v -0.584373 0.099159 0.204985 +v -0.930772 0.434734 -0.102152 +v -0.930772 0.434734 0.204985 +v -0.930772 0.099159 -0.102152 +v -0.930772 0.099159 0.204985 +v -0.438062 -0.014753 0.333651 +v -0.438062 0.441067 -0.334799 +v -0.383980 -0.152269 0.239878 +v -0.383980 0.303550 -0.428572 +v -0.242393 -0.237259 0.181923 +v -0.242392 0.218560 -0.486527 +v -0.067381 -0.237260 0.181923 +v -0.067381 0.218560 -0.486527 +v 0.074207 -0.152269 0.239878 +v 0.074207 0.303550 -0.428572 +v 0.128288 -0.014753 0.333651 +v 0.128288 0.441066 -0.334799 +v 0.074207 0.122764 0.427425 +v 0.074207 0.578583 -0.241026 +v -0.067381 0.207754 0.485380 +v -0.067381 0.663573 -0.183071 +v -0.242392 0.207754 0.485380 +v -0.242392 0.663573 -0.183071 +v -0.383980 0.122764 0.427425 +v -0.383980 0.578583 -0.241026 +v -0.559422 0.086216 0.185583 +v -0.559422 0.248934 -0.053040 +v -0.482163 0.052481 -0.187002 +v -0.482163 -0.110237 0.051621 +v -0.279895 -0.068933 -0.269795 +v -0.279895 -0.231651 -0.031172 +v -0.029878 -0.068933 -0.269795 +v -0.029878 -0.231651 -0.031172 +v 0.172390 0.052481 -0.187002 +v 0.172390 -0.110237 0.051621 +v 0.249649 0.248934 -0.053040 +v 0.249649 0.086216 0.185583 +v 0.172390 0.445387 0.080922 +v 0.172390 0.282669 0.319544 +v -0.029878 0.566801 0.163715 +v -0.029878 0.404083 0.402337 +v -0.279895 0.566801 0.163715 +v -0.279895 0.404083 0.402337 +v -0.482163 0.445386 0.080922 +v -0.482163 0.282669 0.319544 +v -0.416791 0.441067 -0.334799 +v -0.366771 0.313879 -0.421528 +v -0.235819 0.235273 -0.475130 +v -0.073954 0.235273 -0.475130 +v 0.056998 0.313879 -0.421528 +v 0.107017 0.441066 -0.334799 +v 0.056998 0.568253 -0.248069 +v -0.073954 0.646859 -0.194468 +v -0.235819 0.646859 -0.194468 +v -0.366771 0.568254 -0.248070 +v -0.450304 0.395485 -0.267954 +v -0.393885 0.252022 -0.365782 +v -0.246176 0.163358 -0.426242 +v -0.063597 0.163358 -0.426242 +v 0.084112 0.252022 -0.365782 +v 0.140531 0.395485 -0.267954 +v 0.084111 0.538947 -0.170126 +v -0.063597 0.627611 -0.109666 +v -0.246176 0.627611 -0.109666 +v -0.393885 0.538947 -0.170126 +vt 0.379436 0.564369 +vt 0.379436 0.552382 +vt 0.394254 0.552382 +vt 0.394254 0.564369 +vt 0.409071 0.552382 +vt 0.409071 0.564369 +vt 0.423889 0.552382 +vt 0.423889 0.564369 +vt 0.438707 0.552382 +vt 0.438707 0.564369 +vt 0.290530 0.564369 +vt 0.290529 0.552382 +vt 0.305347 0.552382 +vt 0.305347 0.564369 +vt 0.320165 0.552382 +vt 0.320165 0.564369 +vt 0.334983 0.552382 +vt 0.334983 0.564369 +vt 0.349800 0.552382 +vt 0.349800 0.564369 +vt 0.404419 0.136425 +vt 0.377658 0.125185 +vt 0.362615 0.100361 +vt 0.365036 0.071437 +vt 0.383996 0.049460 +vt 0.412253 0.042824 +vt 0.439014 0.054064 +vt 0.454056 0.078888 +vt 0.451635 0.107812 +vt 0.432676 0.129790 +vt 0.364618 0.564369 +vt 0.364618 0.552382 +vt 0.439860 0.058890 +vt 0.453541 0.084489 +vt 0.449563 0.113240 +vt 0.429445 0.134163 +vt 0.400872 0.139264 +vt 0.374756 0.126596 +vt 0.361075 0.100998 +vt 0.365053 0.072246 +vt 0.385171 0.051323 +vt 0.413744 0.046222 +vt 0.379436 0.552208 +vt 0.379436 0.540220 +vt 0.394254 0.540220 +vt 0.394254 0.552208 +vt 0.409071 0.540220 +vt 0.409071 0.552208 +vt 0.423889 0.540220 +vt 0.423889 0.552208 +vt 0.438707 0.540220 +vt 0.438707 0.552208 +vt 0.290530 0.552208 +vt 0.290529 0.540220 +vt 0.305347 0.540220 +vt 0.305347 0.552208 +vt 0.320165 0.540220 +vt 0.320165 0.552208 +vt 0.334983 0.540220 +vt 0.334983 0.552208 +vt 0.349800 0.540220 +vt 0.349800 0.552208 +vt 0.414386 0.043900 +vt 0.440501 0.056568 +vt 0.454183 0.082167 +vt 0.450205 0.110918 +vt 0.430087 0.131841 +vt 0.401513 0.136942 +vt 0.375398 0.124274 +vt 0.361716 0.098676 +vt 0.365694 0.069924 +vt 0.385812 0.049001 +vt 0.364618 0.552208 +vt 0.364618 0.540220 +vt 0.440415 0.056746 +vt 0.454096 0.082345 +vt 0.450118 0.111097 +vt 0.430000 0.132019 +vt 0.401427 0.137121 +vt 0.375311 0.124453 +vt 0.361630 0.098854 +vt 0.365608 0.070102 +vt 0.385726 0.049180 +vt 0.414299 0.044078 +vt 0.153551 0.309903 +vt 0.116598 0.309903 +vt 0.116598 0.105262 +vt 0.153551 0.105262 +vt 0.307010 0.440979 +vt 0.018020 0.440979 +vt 0.018020 0.120900 +vt 0.307010 0.120900 +vt 0.196769 0.309903 +vt 0.159816 0.309903 +vt 0.159816 0.105262 +vt 0.196769 0.105262 +vt 0.314023 0.439161 +vt 0.025033 0.439066 +vt 0.025138 0.118987 +vt 0.314128 0.119082 +vt 0.025153 0.074610 +vt 0.314143 0.074704 +vt 0.227950 0.485353 +vt 0.227950 0.510114 +vt 0.104142 0.510114 +vt 0.104142 0.485353 +vt 0.266325 0.523051 +vt 0.072677 0.522988 +vt 0.190673 0.371300 +vt 0.165912 0.371300 +vt 0.259339 0.524885 +vt 0.065691 0.524885 +vt 0.147455 0.371300 +vt 0.122693 0.371300 +vt 0.159816 0.076889 +vt 0.196769 0.076889 +vt 0.687951 0.537593 +vt 0.706435 0.507328 +vt 0.754163 0.550622 +vt 0.706210 0.607649 +vt 0.116598 0.076889 +vt 0.153551 0.076889 +vt 0.179015 0.077358 +vt 0.179015 0.142122 +vt 0.152738 0.142122 +vt 0.152738 0.077358 +vt 0.728912 0.431370 +vt 0.734708 0.392314 +vt 0.800973 0.348654 +vt 0.798191 0.430276 +vt 0.318838 0.466122 +vt 0.411334 0.227292 +vt 0.444921 0.326550 +vt 0.419974 0.413258 +vt 0.438584 0.216609 +vt 0.474580 0.296924 +vt 0.334225 0.498913 +vt 0.424594 0.456508 +vt 0.248798 0.223994 +vt 0.084240 0.223994 +vt 0.084240 0.122696 +vt 0.248798 0.122696 +vt 0.152792 0.142965 +vt 0.152792 0.078201 +vt 0.179069 0.078201 +vt 0.179069 0.142965 +vt 0.152792 0.281615 +vt 0.179069 0.281615 +vt 0.179069 0.396566 +vt 0.152792 0.396566 +vt 0.085846 0.474266 +vt 0.250405 0.474266 +vt 0.250405 0.515365 +vt 0.085846 0.515365 +vt 0.152744 0.280748 +vt 0.179021 0.280748 +vt 0.179021 0.395699 +vt 0.152744 0.395699 +vt 0.238955 0.361627 +vt 0.238955 0.526185 +vt 0.094460 0.526185 +vt 0.094460 0.361627 +vt 0.085846 0.294472 +vt 0.250404 0.294472 +vt 0.085846 0.077608 +vt 0.250404 0.077608 +vt 0.248798 0.440857 +vt 0.084240 0.440857 +vt 0.179015 0.280773 +vt 0.152738 0.280773 +vt 0.671673 0.002744 +vt 0.844278 0.002745 +vt 0.844278 0.191331 +vt 0.671673 0.191331 +vt 0.996720 0.002686 +vt 0.996720 0.191273 +vt 0.845160 0.191273 +vt 0.845160 0.002686 +vt 0.520146 0.190919 +vt 0.520146 0.002333 +vt 0.671706 0.002332 +vt 0.671706 0.190919 +vt 0.843681 0.341056 +vt 0.672548 0.341056 +vt 0.672548 0.190787 +vt 0.843681 0.190787 +vt 0.761181 0.757672 +vt 0.745014 0.609207 +vt 0.825617 0.598089 +vt 0.857218 0.749462 +vt 0.903983 0.575714 +vt 0.966806 0.732133 +vt 0.037284 0.753700 +vt 0.083702 0.575714 +vt 0.170248 0.592277 +vt 0.150146 0.757178 +vt 0.255192 0.601900 +vt 0.244924 0.758570 +vt 0.338563 0.608064 +vt 0.332715 0.760010 +vt 0.420812 0.612170 +vt 0.417701 0.761448 +vt 0.502348 0.614676 +vt 0.501804 0.762519 +vt 0.583452 0.615510 +vt 0.586197 0.762734 +vt 0.582143 0.952920 +vt 0.583044 0.860597 +vt 0.669791 0.861975 +vt 0.668065 0.956701 +vt 0.672045 0.761448 +vt 0.664303 0.614117 +vt 0.241073 0.447150 +vt 0.241073 0.491674 +vt 0.214903 0.527695 +vt 0.172558 0.541454 +vt 0.130212 0.527695 +vt 0.104042 0.491674 +vt 0.104042 0.447150 +vt 0.130212 0.411129 +vt 0.172558 0.397370 +vt 0.214903 0.411129 +vt 0.760152 0.863460 +vt 0.755940 0.961929 +vt 0.497710 0.949766 +vt 0.498138 0.859147 +vt 0.414509 0.947207 +vt 0.414073 0.857939 +vt 0.332456 0.945865 +vt 0.329965 0.857760 +vt 0.251592 0.947343 +vt 0.244476 0.860193 +vt 0.172146 0.955239 +vt 0.154753 0.868649 +vt 0.096543 0.977696 +vt 0.052988 0.890421 +vt 0.846395 0.970980 +vt 0.858276 0.866218 +vt 0.977289 0.876251 +vt 0.939520 0.990215 +vt 0.246163 0.468809 +vt 0.232404 0.511154 +vt 0.228026 0.507973 +vt 0.240751 0.468809 +vt 0.196383 0.537324 +vt 0.194711 0.532178 +vt 0.151859 0.537324 +vt 0.153531 0.532178 +vt 0.115838 0.511154 +vt 0.120216 0.507973 +vt 0.102079 0.468809 +vt 0.107491 0.468809 +vt 0.115838 0.426464 +vt 0.120216 0.429644 +vt 0.151859 0.400293 +vt 0.153531 0.405440 +vt 0.196383 0.400293 +vt 0.194711 0.405440 +vt 0.232404 0.426464 +vt 0.228026 0.429644 +vt 0.222304 0.510145 +vt 0.233082 0.472692 +vt 0.257861 0.471280 +vt 0.243143 0.523230 +vt 0.221220 0.434642 +vt 0.240879 0.419400 +vt 0.189996 0.410699 +vt 0.197036 0.386966 +vt 0.151455 0.409727 +vt 0.142800 0.386702 +vt 0.120546 0.432569 +vt 0.099705 0.419421 +vt 0.109363 0.470169 +vt 0.084520 0.471458 +vt 0.121137 0.508213 +vt 0.101435 0.523480 +vt 0.152383 0.532125 +vt 0.145431 0.555957 +vt 0.191203 0.532840 +vt 0.199882 0.555957 +vt 0.435698 0.811852 +vt 0.162152 0.816109 +vt 0.230154 0.732276 +vt 0.434050 0.705986 +vt 0.638666 0.725919 +vt 0.709244 0.807596 +vt 0.641241 0.891429 +vt 0.437345 0.917718 +vt 0.232729 0.897786 +vt 0.929295 0.000129 +vt 0.929295 0.093942 +vt 0.858720 0.093942 +vt 0.858720 0.000129 +vt 0.814506 0.805963 +vt 0.799162 0.950578 +vt 0.638588 0.725925 +vt 0.794670 0.661894 +vt 0.999871 0.000129 +vt 0.999871 0.093941 +vt 0.435620 0.811858 +vt 0.162074 0.816115 +vt 0.230076 0.732282 +vt 0.433972 0.705993 +vt 0.429425 0.617979 +vt 0.429425 0.524167 +vt 0.500000 0.524167 +vt 0.500000 0.617979 +vt 0.056812 0.817748 +vt 0.072155 0.673133 +vt 0.076647 0.961816 +vt 0.358849 0.617979 +vt 0.358849 0.524167 +vt 0.179489 0.000130 +vt 0.358849 0.000129 +vt 0.358849 0.093942 +vt 0.179489 0.093942 +vt 0.000129 0.093942 +vt 0.000129 0.000130 +vt 0.433012 0.644243 +vt 0.072077 0.673139 +vt 0.679360 0.617979 +vt 0.679360 0.524167 +vt 0.858720 0.524167 +vt 0.858720 0.617979 +vt 0.433089 0.644237 +vt 0.438228 0.979473 +vt 0.679360 0.000129 +vt 0.679360 0.093942 +vt 0.500000 0.093942 +vt 0.500000 0.000129 +vt 0.679360 0.309054 +vt 0.500000 0.309054 +vt 0.858720 0.309054 +vt 0.438306 0.979467 +vt 0.179489 0.617979 +vt 0.000129 0.617979 +vt 0.000129 0.524167 +vt 0.179489 0.524167 +vt 0.179489 0.309054 +vt 0.358849 0.309054 +vt 0.000129 0.309054 +vt 0.056734 0.817754 +vt 0.429424 0.000129 +vt 0.429424 0.093942 +vt 0.429424 0.309054 +vt 0.814583 0.805956 +vt 0.929295 0.617979 +vt 0.929295 0.524167 +vt 0.999871 0.524167 +vt 0.999871 0.617979 +vt 0.929295 0.309054 +vt 0.999871 0.309054 +vt 1.023853 1.021029 +vt 1.459221 1.019853 +vt 1.416744 1.411802 +vt 1.025030 1.456397 +vt -0.021030 1.023853 +vt 0.501412 1.022442 +vt 0.502589 1.457809 +vt -0.019853 1.459221 +vt -0.023853 -0.021030 +vt 0.498588 -0.022441 +vt 0.500000 0.500000 +vt -0.022442 0.501412 +vt 1.021030 -0.023853 +vt 1.456398 -0.025030 +vt 1.457809 0.497412 +vt 1.022442 0.498588 +vt 0.497412 -0.457810 +vt 1.019853 -0.459221 +vt 1.411802 -0.416743 +vt -0.459221 -0.019853 +vt -0.457809 0.502588 +vt -0.416743 -0.411802 +vt -0.025030 -0.456398 +vt -0.456398 1.025030 +vt -0.411802 1.416743 +vt -0.041953 1.500000 +vt -0.450565 1.455716 +vt 1.450565 -0.455716 +vt 1.497056 -0.047350 +vt -0.497056 1.047350 +vt -0.498528 0.502699 +vt 1.455716 1.450565 +vt 1.047350 1.497056 +vt -0.500000 -0.041953 +vt -0.047350 -0.497056 +vt 0.497302 -0.498528 +vt 1.041953 -0.500000 +vt 1.498528 0.497302 +vt 1.500000 1.041953 +vt 0.502698 1.498528 +vt -0.455716 -0.450565 +vt 0.112122 0.571409 +vt 0.102745 0.649405 +vt 0.005232 0.636926 +vt 0.015273 0.558460 +vt 0.982694 0.558110 +vt 0.993329 0.637857 +vt 0.894351 0.650659 +vt 0.885042 0.571606 +vt 0.795351 0.661217 +vt 0.788160 0.582325 +vt 0.696222 0.668908 +vt 0.691435 0.590006 +vt 0.596983 0.673501 +vt 0.594704 0.594577 +vt 0.497710 0.674912 +vt 0.497969 0.596017 +vt 0.398508 0.673122 +vt 0.401293 0.594338 +vt 0.299505 0.668162 +vt 0.304752 0.589585 +vt 0.505213 0.112967 +vt 0.501701 0.206285 +vt 0.489387 0.201765 +vt 0.492595 0.116549 +vt 0.208392 0.581865 +vt 0.200857 0.660145 +vt 0.830899 0.107470 +vt 0.830899 0.191162 +vt 0.781706 0.258871 +vt 0.702110 0.284733 +vt 0.622514 0.258870 +vt 0.573321 0.191162 +vt 0.573321 0.107470 +vt 0.622514 0.039762 +vt 0.702110 0.013900 +vt 0.781706 0.039762 +vt 0.321542 0.339090 +vt 0.233346 0.331787 +vt 0.145385 0.321557 +vt 0.409918 0.343490 +vt 0.498401 0.344993 +vt 0.586905 0.343596 +vt 0.675343 0.339288 +vt 0.763623 0.332041 +vt 0.851656 0.321781 +vt 0.938963 0.308306 +vt 0.057701 0.308306 +vt 0.444008 0.279716 +vt 0.436702 0.268822 +vt 0.354171 0.305212 +vt 0.354665 0.292105 +vt 0.266506 0.273035 +vt 0.274610 0.262720 +vt 0.214497 0.195474 +vt 0.227115 0.191893 +vt 0.218010 0.102155 +vt 0.230323 0.106675 +vt 0.275702 0.028724 +vt 0.283008 0.039618 +vt 0.365538 0.003228 +vt 0.365045 0.016336 +vt 0.453204 0.035405 +vt 0.445100 0.045720 +vt 0.884796 0.980888 +vt 0.786849 0.980854 +vt 0.786910 0.804141 +vt 0.884858 0.804175 +vt 0.688901 0.980821 +vt 0.688963 0.804107 +vt 0.590954 0.980787 +vt 0.591015 0.804073 +vt 0.493006 0.980753 +vt 0.493068 0.804040 +vt 0.395059 0.980719 +vt 0.395120 0.804006 +vt 0.297112 0.980685 +vt 0.297172 0.803972 +vt 0.199164 0.980652 +vt 0.199225 0.803938 +vt 0.101217 0.980618 +vt 0.101278 0.803904 +vt 0.003269 0.980584 +vt 0.003330 0.803871 +vt 0.982744 0.980922 +vt 0.982805 0.804209 +vn -0.951100 0.309000 0.000000 +vn -0.587800 0.809000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.587800 0.809000 0.000000 +vn 0.951100 0.309000 0.000000 +vn 0.951100 -0.309000 0.000000 +vn 0.587800 -0.809000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.000000 0.000000 1.000000 +vn -0.951100 -0.309000 0.000000 +vn -0.587800 -0.809000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 -0.000000 +vn 1.000000 -0.000000 -0.000000 +vn 0.993500 0.113600 0.000000 +vn 0.000000 0.496400 -0.868100 +vn -0.993500 0.113600 -0.000000 +vn 0.000000 0.496400 0.868100 +vn 0.464300 -0.000000 0.885700 +vn 0.464300 -0.000000 -0.885700 +vn -0.813500 0.000000 -0.581500 +vn -0.813500 -0.000000 0.581500 +vn -0.900900 -0.061200 -0.429800 +vn -0.556800 -0.452500 -0.696600 +vn -0.000000 -0.602000 -0.798500 +vn 0.556800 -0.452500 -0.696600 +vn 0.900900 -0.061200 -0.429800 +vn 0.900900 0.422400 -0.100000 +vn 0.556800 0.813700 0.166900 +vn 0.000000 0.963200 0.268800 +vn -0.494200 0.256900 0.830500 +vn -0.900900 0.422400 -0.100000 +vn -0.556800 0.813700 0.166900 +vn -0.000000 -0.563400 0.826200 +vn -0.587800 0.668400 0.455800 +vn -0.799600 -0.090400 0.593700 +vn -0.951100 0.255300 0.174100 +vn 0.000000 0.389600 0.921000 +vn 0.000000 0.826200 0.563400 +vn 0.494200 0.256900 0.830500 +vn 0.587800 0.668400 0.455800 +vn 0.799600 -0.090400 0.593700 +vn 0.951100 0.255300 0.174100 +vn 0.799600 -0.519700 0.301000 +vn 0.951100 -0.255300 -0.174100 +vn 0.494200 -0.867000 0.064100 +vn 0.587800 -0.668400 -0.455800 +vn -0.000000 -0.999700 -0.026300 +vn -0.000000 -0.826200 -0.563400 +vn -0.494200 -0.867000 0.064100 +vn -0.587800 -0.668400 -0.455800 +vn -0.799600 -0.519700 0.301000 +vn -0.951100 -0.255300 -0.174100 +vn 0.000000 0.563400 -0.826200 +vn 0.884900 -0.444000 0.140800 +vn 0.546900 -0.828400 -0.121200 +vn 0.000000 -0.975200 -0.221300 +vn -0.546900 -0.828400 -0.121200 +vn -0.884900 -0.444000 0.140800 +vn -0.884900 0.031000 0.464800 +vn -0.546900 0.415400 0.726900 +vn 0.000000 0.562200 0.827000 +vn 0.546900 0.415400 0.726900 +vn 0.884900 0.031000 0.464800 +vn -0.701400 -0.166000 0.693200 +vn -0.596700 -0.163800 0.785600 +vn -0.597600 0.192800 0.778300 +vn -0.702300 0.190600 0.685900 +vn 0.746200 -0.085700 0.660200 +vn 0.842300 -0.177500 -0.509000 +vn 0.841400 0.160800 -0.515900 +vn 0.745700 0.116300 0.656100 +vn 0.702300 -0.190600 -0.685900 +vn 0.597600 -0.192800 -0.778300 +vn 0.596700 0.163800 -0.785600 +vn 0.701400 0.166000 -0.693200 +vn -0.745700 -0.116300 -0.656100 +vn -0.841400 -0.160800 0.515900 +vn -0.842300 0.177500 0.509000 +vn -0.746200 0.085700 -0.660200 +vn -0.014200 0.999400 -0.030700 +vn 0.009100 0.999900 -0.010100 +vn 0.557500 0.610200 -0.562900 +vn 0.475000 0.608500 -0.635700 +vn -0.009100 -0.999900 0.010100 +vn 0.014200 -0.999400 0.030700 +vn -0.475000 -0.608500 0.635700 +vn -0.557500 -0.610200 0.562900 +vn 0.478100 -0.631500 -0.610400 +vn 0.560700 -0.629800 -0.537500 +vn -0.560700 0.629800 0.537500 +vn -0.478100 0.631500 0.610400 +vn 0.404300 -0.186500 -0.895400 +vn 0.403500 0.151800 -0.902300 +vn -0.403500 -0.151800 0.902300 +vn -0.404300 0.186500 0.895400 +vn -0.647700 -0.175600 0.741400 +vn -0.535800 -0.180800 0.824800 +vn -0.525000 0.175600 0.832800 +vn -0.636900 0.180800 0.749500 +vn 0.794200 -0.138500 0.591600 +vn 0.791300 -0.180100 -0.584400 +vn 0.801500 0.158100 -0.576700 +vn 0.800300 0.063400 0.596200 +vn 0.636900 -0.180800 -0.749500 +vn 0.525000 -0.175600 -0.832800 +vn 0.535800 0.180800 -0.824800 +vn 0.647700 0.175600 -0.741400 +vn -0.800300 -0.063400 -0.596200 +vn -0.801500 -0.158000 0.576700 +vn -0.791300 0.180100 0.584400 +vn -0.794200 0.138500 -0.591600 +vn 0.017800 0.999800 0.013200 +vn 0.042700 0.998600 0.031800 +vn 0.530400 0.617600 -0.580700 +vn 0.442100 0.621800 -0.646500 +vn -0.042700 -0.998600 -0.031800 +vn -0.017800 -0.999800 -0.013200 +vn -0.442100 -0.621800 0.646500 +vn -0.530400 -0.617600 0.580700 +vn 0.404600 -0.617600 -0.674400 +vn 0.492900 -0.621800 -0.608700 +vn -0.492900 0.621800 0.608700 +vn -0.404600 0.617600 0.674400 +vn 0.323200 -0.158000 -0.933100 +vn 0.333400 0.180100 -0.925400 +vn -0.333400 -0.180100 0.925400 +vn -0.323200 0.158000 0.933100 +vn -0.692500 -0.178300 0.699000 +vn -0.586600 -0.178300 0.790000 +vn -0.586600 0.178300 0.790000 +vn -0.692500 0.178300 0.699000 +vn 0.754700 -0.101000 0.648200 +vn 0.834900 -0.169200 -0.523800 +vn 0.834900 0.169200 -0.523800 +vn 0.754700 0.101000 0.648200 +vn 0.692500 -0.178300 -0.699000 +vn 0.586600 -0.178300 -0.790000 +vn 0.586600 0.178300 -0.790000 +vn 0.692500 0.178300 -0.699000 +vn -0.754700 -0.101000 -0.648300 +vn -0.834900 -0.169200 0.523800 +vn -0.834900 0.169200 0.523800 +vn -0.754700 0.101000 -0.648300 +vn -0.011800 0.999900 -0.010100 +vn 0.011800 0.999900 0.010100 +vn 0.551700 0.620100 -0.557700 +vn 0.468100 0.620100 -0.629500 +vn -0.011800 -0.999900 -0.010100 +vn 0.011800 -0.999900 0.010100 +vn -0.468100 -0.620100 0.629500 +vn -0.551700 -0.620100 0.557700 +vn 0.468100 -0.620100 -0.629500 +vn 0.551700 -0.620100 -0.557700 +vn -0.551700 0.620100 0.557700 +vn -0.468100 0.620100 0.629500 +vn 0.391800 -0.169200 -0.904400 +vn -0.754700 -0.101000 -0.648200 +vn -0.754700 0.101000 -0.648200 +vn 0.391800 0.169200 -0.904400 +vn -0.391800 -0.169200 0.904400 +vn -0.391800 0.169200 0.904400 +vn -0.411000 0.807700 -0.422700 +vn -0.608600 0.762700 0.218900 +vn 0.294900 0.803900 0.516500 +vn 0.152100 0.715600 -0.681800 +vn 0.381300 0.817200 -0.432200 +vn 0.711100 0.673800 -0.200900 +vn 0.561100 0.542300 -0.625300 +vn 0.052500 0.761500 0.646100 +vn 0.412300 0.839900 0.353100 +vn 0.706800 0.674900 0.211700 +vn -0.312000 0.902300 0.297300 +vn -0.127100 0.801700 0.584000 +vn -0.392500 0.763100 0.513500 +vn -0.671300 0.736100 -0.086200 +vn -0.403600 0.838100 -0.367000 +vn -0.098100 0.717700 -0.689400 +vn -0.575400 0.811200 0.104700 +vn 0.512300 0.740200 -0.435400 +vn 0.022700 0.659300 0.751600 +vn -0.732200 0.664700 -0.148600 +vn -0.016100 0.701300 0.712700 +vn 0.857300 0.494300 0.143800 +vn 0.785400 0.611000 -0.099400 +vn 0.000300 0.560700 -0.828000 +vn 0.008600 0.543300 -0.839500 +vn -0.873900 0.486000 0.003800 +vn 0.115100 0.778400 0.617100 +vn -0.809400 0.587000 0.015000 +vn 0.328900 0.741100 -0.585300 +vn -0.124700 0.757200 0.641200 +vn -0.137500 0.695300 -0.705500 +vn 0.813300 0.579600 -0.051100 +vn 0.001300 0.000000 -1.000000 +vn 0.588800 0.000000 -0.808300 +vn 0.951500 -0.000000 -0.307800 +vn 0.950700 -0.000000 0.310200 +vn 0.586700 -0.000000 0.809800 +vn -0.001300 -0.000000 1.000000 +vn -0.588800 -0.000000 0.808300 +vn -0.951500 -0.000000 0.307800 +vn -0.586700 0.000000 -0.809800 +vn -0.950700 0.000000 -0.310200 +vn -0.948800 -0.062100 -0.309600 +vn -0.585600 -0.062100 -0.808200 +vn -0.949600 -0.062100 0.307200 +vn -0.587700 -0.062100 0.806700 +vn -0.001300 -0.062100 0.998100 +vn 0.585600 -0.062100 0.808200 +vn 0.948800 -0.062100 0.309600 +vn 0.949600 -0.062100 -0.307200 +vn 0.587700 -0.062100 -0.806700 +vn 0.001300 -0.062100 -0.998100 +g Cement_Mixer_Cylinder.002_Mixer +s off +f 266/1/1 267/2/1 269/3/1 268/4/1 +f 268/4/2 269/3/2 271/5/2 270/6/2 +f 270/6/3 271/5/3 273/7/3 272/8/3 +f 272/8/4 273/7/4 275/9/4 274/10/4 +f 274/11/5 275/12/5 277/13/5 276/14/5 +f 276/14/6 277/13/6 279/15/6 278/16/6 +f 278/16/7 279/15/7 281/17/7 280/18/7 +f 280/18/8 281/17/8 283/19/8 282/20/8 +f 269/21/9 267/22/9 285/23/9 283/24/9 281/25/9 279/26/9 277/27/9 275/28/9 273/29/9 271/30/9 +f 284/31/10 285/32/10 267/2/10 266/1/10 +f 282/20/11 283/19/11 285/32/11 284/31/11 +f 266/33/12 268/34/12 270/35/12 272/36/12 274/37/12 276/38/12 278/39/12 280/40/12 282/41/12 284/42/12 +f 286/43/1 287/44/1 289/45/1 288/46/1 +f 288/46/2 289/45/2 291/47/2 290/48/2 +f 290/48/3 291/47/3 293/49/3 292/50/3 +f 292/50/4 293/49/4 295/51/4 294/52/4 +f 294/53/5 295/54/5 297/55/5 296/56/5 +f 296/56/6 297/55/6 299/57/6 298/58/6 +f 298/58/7 299/57/7 301/59/7 300/60/7 +f 300/60/8 301/59/8 303/61/8 302/62/8 +f 289/63/9 287/64/9 305/65/9 303/66/9 301/67/9 299/68/9 297/69/9 295/70/9 293/71/9 291/72/9 +f 304/73/10 305/74/10 287/44/10 286/43/10 +f 302/62/11 303/61/11 305/74/11 304/73/11 +f 286/75/12 288/76/12 290/77/12 292/78/12 294/79/12 296/80/12 298/81/12 300/82/12 302/83/12 304/84/12 +f 314/85/9 315/86/9 308/87/9 306/88/9 +f 315/89/13 316/90/13 312/91/13 308/92/13 +f 316/93/12 317/94/12 310/95/12 312/96/12 +f 317/97/14 314/98/14 306/99/14 310/100/14 +f 310/100/14 306/99/14 319/101/14 321/102/14 +f 311/103/3 313/104/3 309/105/3 307/106/3 +f 311/107/15 307/108/15 314/98/15 317/97/15 +f 313/109/16 311/110/16 317/94/16 316/93/16 +f 309/111/17 313/112/17 316/90/17 315/89/17 +f 307/113/18 309/114/18 315/86/18 314/85/18 +f 312/96/12 310/95/12 321/115/12 320/116/12 +f 326/117/19 329/118/19 323/119/19 325/120/19 +f 306/88/9 308/87/9 318/121/9 319/122/9 +f 325/123/9 323/124/9 335/125/9 337/126/9 +f 330/127/20 333/128/20 324/129/20 322/130/20 +f 329/118/3 330/127/3 322/130/3 323/119/3 +f 308/131/3 312/132/3 331/133/3 328/134/3 +f 328/134/3 331/133/3 330/127/3 329/118/3 +f 312/132/21 320/135/21 332/136/21 331/133/21 +f 331/133/12 332/136/12 333/128/12 330/127/12 +f 318/137/22 308/131/22 328/134/22 327/138/22 +f 327/138/9 328/134/9 329/118/9 326/117/9 +f 335/139/13 334/140/13 336/141/13 337/142/13 +f 322/143/12 324/144/12 336/145/12 334/146/12 +f 342/147/12 343/148/12 340/149/12 338/150/12 +f 339/151/3 338/152/3 340/153/3 341/154/3 +f 344/155/9 345/156/9 339/157/9 341/158/9 +f 343/159/8 344/160/8 349/161/8 348/162/8 +f 345/163/14 342/164/14 338/152/14 339/151/14 +f 323/165/14 322/166/14 342/164/14 345/163/14 +f 334/140/13 335/139/13 344/167/13 343/168/13 +f 335/125/9 323/124/9 345/169/9 344/170/9 +f 322/143/12 334/146/12 343/148/12 342/147/12 +f 348/171/13 349/172/13 347/173/13 346/174/13 +f 344/175/9 341/176/9 347/177/9 349/178/9 +f 340/179/12 343/180/12 348/181/12 346/182/12 +f 341/183/3 340/184/3 346/185/3 347/186/3 +f 371/187/23 351/188/23 353/189/23 372/190/23 +f 372/190/24 353/189/24 355/191/24 374/192/24 +f 374/193/25 355/194/25 357/195/25 376/196/25 +f 376/196/26 357/195/26 359/197/26 378/198/26 +f 378/198/27 359/197/27 361/199/27 380/200/27 +f 380/200/28 361/199/28 363/201/28 382/202/28 +f 382/202/29 363/201/29 365/203/29 384/204/29 +f 384/204/30 365/203/30 367/205/30 386/206/30 +f 366/207/31 387/208/31 389/209/31 368/210/31 +f 388/211/32 369/212/32 351/188/32 371/187/32 +f 386/206/33 367/205/33 369/212/33 388/211/33 +f 350/213/34 352/214/34 354/215/34 356/216/34 358/217/34 360/218/34 362/219/34 364/220/34 366/221/34 368/222/34 +f 387/208/35 386/206/35 388/211/35 389/209/35 +f 368/210/36 389/209/36 370/223/36 350/224/36 +f 389/209/37 388/211/37 371/187/37 370/223/37 +f 364/225/38 385/226/38 387/208/38 366/207/38 +f 385/226/39 384/204/39 386/206/39 387/208/39 +f 362/227/40 383/228/40 385/226/40 364/225/40 +f 383/228/41 382/202/41 384/204/41 385/226/41 +f 360/229/42 381/230/42 383/228/42 362/227/42 +f 381/230/43 380/200/43 382/202/43 383/228/43 +f 358/231/44 379/232/44 381/230/44 360/229/44 +f 379/232/45 378/198/45 380/200/45 381/230/45 +f 356/233/46 377/234/46 379/232/46 358/231/46 +f 377/234/47 376/196/47 378/198/47 379/232/47 +f 354/235/48 375/236/48 377/234/48 356/233/48 +f 375/236/49 374/193/49 376/196/49 377/234/49 +f 352/237/50 373/238/50 375/239/50 354/240/50 +f 373/238/51 372/190/51 374/192/51 375/239/51 +f 350/224/52 370/223/52 373/238/52 352/237/52 +f 370/223/53 371/187/53 372/190/53 373/238/53 +f 351/241/54 369/242/54 399/243/54 390/244/54 +f 369/242/54 367/245/54 398/246/54 399/243/54 +f 367/245/54 365/247/54 397/248/54 398/246/54 +f 365/247/54 363/249/54 396/250/54 397/248/54 +f 363/249/54 361/251/54 395/252/54 396/250/54 +f 361/251/54 359/253/54 394/254/54 395/252/54 +f 359/253/54 357/255/54 393/256/54 394/254/54 +f 357/255/54 355/257/54 392/258/54 393/256/54 +f 355/257/54 353/259/54 391/260/54 392/258/54 +f 353/259/54 351/241/54 390/244/54 391/260/54 +f 390/261/55 399/262/55 409/263/55 400/264/55 +f 399/262/56 398/265/56 408/266/56 409/263/56 +f 398/265/57 397/267/57 407/268/57 408/266/57 +f 397/267/58 396/269/58 406/270/58 407/268/58 +f 396/269/59 395/271/59 405/272/59 406/270/59 +f 395/271/60 394/273/60 404/274/60 405/272/60 +f 394/273/61 393/275/61 403/276/61 404/274/61 +f 393/275/62 392/277/62 402/278/62 403/276/62 +f 392/277/63 391/279/63 401/280/63 402/278/63 +f 391/279/64 390/261/64 400/264/64 401/280/64 +g Cement_Mixer_Cylinder.002_CementBag +f 1/281/65 15/282/65 44/283/65 16/284/65 +f 1/281/66 16/284/66 46/285/66 17/286/66 +f 1/281/67 17/286/67 45/287/67 18/288/67 +f 1/281/68 18/288/68 43/289/68 15/282/68 +f 2/290/69 42/291/69 52/292/69 19/293/69 +f 2/294/70 19/295/70 50/287/70 20/286/70 +f 2/294/71 20/286/71 49/296/71 29/297/71 +f 2/290/72 29/298/72 53/299/72 42/291/72 +f 3/300/73 20/286/73 50/287/73 22/288/73 +f 3/300/74 22/288/74 48/289/74 23/301/74 +f 3/300/75 23/301/75 47/302/75 24/303/75 +f 3/300/76 24/303/76 49/296/76 20/286/76 +f 4/304/77 40/305/77 56/306/77 25/307/77 +f 4/308/78 25/309/78 44/283/78 15/282/78 +f 4/308/79 15/282/79 43/289/79 33/310/79 +f 4/304/80 33/311/80 57/312/80 40/305/80 +f 5/313/81 26/314/81 58/315/81 38/316/81 +f 5/313/82 38/316/82 53/317/82 29/318/82 +f 5/319/83 29/297/83 49/296/83 24/303/83 +f 5/319/84 24/303/84 47/302/84 26/320/84 +f 6/321/85 25/307/85 56/306/85 36/322/85 +f 6/321/86 36/322/86 51/323/86 27/324/86 +f 6/325/87 27/297/87 46/285/87 16/284/87 +f 6/325/88 16/284/88 44/283/88 25/309/88 +f 7/326/89 31/310/89 48/289/89 22/288/89 +f 7/326/90 22/288/90 50/287/90 19/295/90 +f 7/327/86 19/293/86 52/292/86 35/328/86 +f 7/327/85 35/328/85 55/329/85 31/330/85 +f 8/331/85 32/332/85 55/329/85 35/328/85 +f 8/331/86 35/328/86 52/292/86 28/333/86 +f 8/331/86 28/333/86 51/323/86 36/322/86 +f 8/331/85 36/322/85 56/306/85 32/332/85 +f 9/334/91 33/310/91 43/289/91 18/288/91 +f 9/334/92 18/288/92 45/287/92 21/295/92 +f 9/335/82 21/336/82 54/337/82 37/338/82 +f 9/335/81 37/338/81 57/312/81 33/311/81 +f 10/339/81 34/340/81 57/312/81 37/338/81 +f 10/339/82 37/338/82 54/337/82 30/341/82 +f 10/339/82 30/341/82 53/317/82 38/316/82 +f 10/339/81 38/316/81 58/315/81 34/340/81 +f 11/342/93 23/301/93 48/289/93 31/310/93 +f 11/343/77 31/330/77 55/329/77 39/344/77 +f 11/343/80 39/344/80 58/315/80 26/314/80 +f 11/342/94 26/320/94 47/302/94 23/301/94 +f 12/345/77 39/344/77 55/329/77 32/332/77 +f 12/345/77 32/332/77 56/306/77 40/305/77 +f 12/345/80 40/305/80 57/312/80 34/340/80 +f 12/345/80 34/340/80 58/315/80 39/344/80 +f 13/346/95 17/286/95 46/285/95 27/297/95 +f 13/347/69 27/324/69 51/323/69 41/348/69 +f 13/347/72 41/348/72 54/349/72 21/350/72 +f 13/346/96 21/295/96 45/287/96 17/286/96 +f 14/351/69 41/348/69 51/323/69 28/333/69 +f 14/351/69 28/333/69 52/292/69 42/291/69 +f 14/351/72 42/291/72 53/299/72 30/352/72 +f 14/351/72 30/352/72 54/349/72 41/348/72 +f 59/281/97 73/282/97 102/283/97 74/284/97 +f 59/281/98 74/284/98 104/285/98 75/286/98 +f 59/281/99 75/286/99 103/287/99 76/288/99 +f 59/281/100 76/288/100 101/289/100 73/282/100 +f 60/290/101 100/291/101 110/292/101 77/293/101 +f 60/294/102 77/295/102 108/287/102 78/286/102 +f 60/294/103 78/286/103 107/296/103 87/297/103 +f 60/290/104 87/298/104 111/299/104 100/291/104 +f 61/300/105 78/286/105 108/287/105 80/288/105 +f 61/300/106 80/288/106 106/289/106 81/301/106 +f 61/300/107 81/301/107 105/302/107 82/303/107 +f 61/300/108 82/303/108 107/296/108 78/286/108 +f 62/304/109 98/305/109 114/306/109 83/307/109 +f 62/308/110 83/309/110 102/283/110 73/282/110 +f 62/308/111 73/282/111 101/289/111 91/310/111 +f 62/304/112 91/311/112 115/312/112 98/305/112 +f 63/313/113 84/314/113 116/315/113 96/316/113 +f 63/313/114 96/316/114 111/317/114 87/318/114 +f 63/319/115 87/297/115 107/296/115 82/303/115 +f 63/319/116 82/303/116 105/302/116 84/320/116 +f 64/321/117 83/307/117 114/306/117 94/322/117 +f 64/321/118 94/322/118 109/323/118 85/324/118 +f 64/325/119 85/297/119 104/285/119 74/284/119 +f 64/325/120 74/284/120 102/283/120 83/309/120 +f 65/326/121 89/310/121 106/289/121 80/288/121 +f 65/326/122 80/288/122 108/287/122 77/295/122 +f 65/327/118 77/293/118 110/292/118 93/328/118 +f 65/327/117 93/328/117 113/329/117 89/330/117 +f 66/331/117 90/332/117 113/329/117 93/328/117 +f 66/331/118 93/328/118 110/292/118 86/333/118 +f 66/331/118 86/333/118 109/323/118 94/322/118 +f 66/331/117 94/322/117 114/306/117 90/332/117 +f 67/334/123 91/310/123 101/289/123 76/288/123 +f 67/334/124 76/288/124 103/287/124 79/295/124 +f 67/335/114 79/336/114 112/337/114 95/338/114 +f 67/335/113 95/338/113 115/312/113 91/311/113 +f 68/339/113 92/340/113 115/312/113 95/338/113 +f 68/339/114 95/338/114 112/337/114 88/341/114 +f 68/339/114 88/341/114 111/317/114 96/316/114 +f 68/339/113 96/316/113 116/315/113 92/340/113 +f 69/342/125 81/301/125 106/289/125 89/310/125 +f 69/343/109 89/330/109 113/329/109 97/344/109 +f 69/343/112 97/344/112 116/315/112 84/314/112 +f 69/342/126 84/320/126 105/302/126 81/301/126 +f 70/345/109 97/344/109 113/329/109 90/332/109 +f 70/345/109 90/332/109 114/306/109 98/305/109 +f 70/345/112 98/305/112 115/312/112 92/340/112 +f 70/345/112 92/340/112 116/315/112 97/344/112 +f 71/346/127 75/286/127 104/285/127 85/297/127 +f 71/347/101 85/324/101 109/323/101 99/348/101 +f 71/347/104 99/348/104 112/349/104 79/350/104 +f 71/346/128 79/295/128 103/287/128 75/286/128 +f 72/351/101 99/348/101 109/323/101 86/333/101 +f 72/351/101 86/333/101 110/292/101 100/291/101 +f 72/351/104 100/291/104 111/299/104 88/352/104 +f 72/351/104 88/352/104 112/349/104 99/348/104 +f 158/281/129 172/282/129 201/283/129 173/284/129 +f 158/281/130 173/284/130 203/285/130 174/286/130 +f 158/281/131 174/286/131 202/287/131 175/288/131 +f 158/281/132 175/288/132 200/289/132 172/282/132 +f 159/290/133 199/291/133 209/292/133 176/293/133 +f 159/294/134 176/295/134 207/287/134 177/286/134 +f 159/294/135 177/286/135 206/296/135 186/297/135 +f 159/290/136 186/298/136 210/299/136 199/291/136 +f 160/300/137 177/286/137 207/287/137 179/288/137 +f 160/300/138 179/288/138 205/289/138 180/301/138 +f 160/300/139 180/301/139 204/302/139 181/303/139 +f 160/300/140 181/303/140 206/296/140 177/286/140 +f 161/304/141 197/305/141 213/306/141 182/307/141 +f 161/308/142 182/309/142 201/283/142 172/282/142 +f 161/308/143 172/282/143 200/289/143 190/310/143 +f 161/304/144 190/311/144 214/312/144 197/305/144 +f 162/313/145 183/314/145 215/315/145 195/316/145 +f 162/313/146 195/316/146 210/317/146 186/318/146 +f 162/319/147 186/297/147 206/296/147 181/303/147 +f 162/319/148 181/303/148 204/302/148 183/320/148 +f 163/321/149 182/307/149 213/306/149 193/322/149 +f 163/321/150 193/322/150 208/323/150 184/324/150 +f 163/325/151 184/297/151 203/285/151 173/284/151 +f 163/325/152 173/284/152 201/283/152 182/309/152 +f 164/326/153 188/310/153 205/289/153 179/288/153 +f 164/326/154 179/288/154 207/287/154 176/295/154 +f 164/327/150 176/293/150 209/292/150 192/328/150 +f 164/327/149 192/328/149 212/329/149 188/330/149 +f 165/331/149 189/332/149 212/329/149 192/328/149 +f 165/331/150 192/328/150 209/292/150 185/333/150 +f 165/331/150 185/333/150 208/323/150 193/322/150 +f 165/331/149 193/322/149 213/306/149 189/332/149 +f 166/334/155 190/310/155 200/289/155 175/288/155 +f 166/334/156 175/288/156 202/287/156 178/295/156 +f 166/335/146 178/336/146 211/337/146 194/338/146 +f 166/335/145 194/338/145 214/312/145 190/311/145 +f 167/339/145 191/340/145 214/312/145 194/338/145 +f 167/339/146 194/338/146 211/337/146 187/341/146 +f 167/339/146 187/341/146 210/317/146 195/316/146 +f 167/339/145 195/316/145 215/315/145 191/340/145 +f 168/342/157 180/301/157 205/289/157 188/310/157 +f 168/343/158 188/330/158 212/329/158 196/344/158 +f 168/343/159 196/344/159 215/315/159 183/314/159 +f 168/342/160 183/320/160 204/302/160 180/301/160 +f 169/345/158 196/344/158 212/329/158 189/332/158 +f 169/345/158 189/332/158 213/306/158 197/305/158 +f 169/345/159 197/305/159 214/312/159 191/340/159 +f 169/345/159 191/340/159 215/315/159 196/344/159 +f 170/346/161 174/286/161 203/285/161 184/297/161 +f 170/347/133 184/324/133 208/323/133 198/348/133 +f 170/347/136 198/348/136 211/349/136 178/350/136 +f 170/346/162 178/295/162 202/287/162 174/286/162 +f 171/351/133 198/348/133 208/323/133 185/333/133 +f 171/351/133 185/333/133 209/292/133 199/291/133 +f 171/351/136 199/291/136 210/299/136 187/352/136 +f 171/351/136 187/352/136 211/349/136 198/348/136 +g Cement_Mixer_Cylinder.002_Gravel +f 141/353/163 128/354/163 120/355/163 133/356/163 +f 140/357/164 134/358/164 124/359/164 129/360/164 +f 139/361/165 135/362/165 125/363/165 136/364/165 +f 138/365/166 132/366/166 123/367/166 137/368/166 +f 135/362/167 138/365/167 137/368/167 125/363/167 +f 122/369/168 127/370/168 138/365/168 135/362/168 +f 127/370/169 118/371/169 132/366/169 138/365/169 +f 126/372/170 139/361/170 136/364/170 121/373/170 +f 117/374/171 131/375/171 139/361/171 126/372/171 +f 131/375/172 122/369/172 135/362/172 139/361/172 +f 130/376/173 140/357/173 129/360/173 119/377/173 +f 121/373/174 136/364/174 140/357/174 130/376/174 +f 136/364/175 125/363/175 134/358/175 140/357/175 +f 134/358/176 141/353/176 133/356/176 124/359/176 +f 125/363/177 137/368/177 141/353/177 134/358/177 +f 137/368/178 123/367/178 128/354/178 141/353/178 +f 119/377/179 129/360/179 153/378/179 144/379/179 +f 132/366/180 118/371/180 143/380/180 156/381/180 +f 121/373/181 130/376/181 154/382/181 146/383/181 +f 133/356/182 120/355/182 145/384/182 157/385/182 +f 126/372/183 121/373/183 146/383/183 150/386/183 +f 122/369/184 131/375/184 155/387/184 147/388/184 +f 127/370/185 122/369/185 147/388/185 151/389/185 +f 123/367/186 132/366/186 156/381/186 148/390/186 +f 128/354/187 123/367/187 148/390/187 152/391/187 +f 124/359/188 133/356/188 157/385/188 149/392/188 +f 117/374/189 126/372/189 150/386/189 142/393/189 +f 129/360/190 124/359/190 149/392/190 153/378/190 +f 118/371/191 127/370/191 151/389/191 143/380/191 +f 130/376/192 119/377/192 144/379/192 154/382/192 +f 120/355/193 128/354/193 152/391/193 145/384/193 +f 131/375/194 117/374/194 142/393/194 155/387/194 +g Cement_Mixer_Cylinder.002_Pail +f 236/394/195 217/395/195 219/396/195 237/397/195 +f 237/398/196 219/399/196 221/400/196 238/401/196 +f 238/401/197 221/400/197 223/402/197 239/403/197 +f 239/403/198 223/402/198 225/404/198 240/405/198 +f 240/405/199 225/404/199 227/406/199 241/407/199 +f 241/407/200 227/406/200 229/408/200 242/409/200 +f 242/409/201 229/408/201 231/410/201 243/411/201 +f 243/411/202 231/410/202 233/412/202 244/413/202 +f 217/414/3 235/415/3 255/416/3 246/417/3 +f 245/418/203 235/419/203 217/395/203 236/394/203 +f 244/413/204 233/412/204 235/419/204 245/418/204 +f 216/420/8 218/421/8 220/422/8 222/423/8 224/424/8 226/425/8 228/426/8 230/427/8 232/428/8 234/429/8 +f 232/430/205 244/413/205 245/418/205 234/431/205 +f 234/431/206 245/418/206 236/394/206 216/432/206 +f 230/433/207 243/411/207 244/413/207 232/430/207 +f 228/434/208 242/409/208 243/411/208 230/433/208 +f 226/435/209 241/407/209 242/409/209 228/434/209 +f 224/436/210 240/405/210 241/407/210 226/435/210 +f 222/437/211 239/403/211 240/405/211 224/436/211 +f 220/438/212 238/401/212 239/403/212 222/437/212 +f 218/439/213 237/398/213 238/401/213 220/438/213 +f 216/432/214 236/394/214 237/397/214 218/440/214 +f 235/415/3 233/441/3 254/442/3 255/416/3 +f 233/441/3 231/443/3 253/444/3 254/442/3 +f 231/443/3 229/445/3 252/446/3 253/444/3 +f 229/445/3 227/447/3 251/448/3 252/446/3 +f 227/447/3 225/449/3 250/450/3 251/448/3 +f 225/449/3 223/451/3 249/452/3 250/450/3 +f 223/451/3 221/453/3 248/454/3 249/452/3 +f 221/453/3 219/455/3 247/456/3 248/454/3 +f 219/455/3 217/414/3 246/417/3 247/456/3 +f 246/457/199 255/458/199 265/459/199 256/460/199 +f 255/458/198 254/461/198 264/462/198 265/459/198 +f 254/461/197 253/463/197 263/464/197 264/462/197 +f 253/463/196 252/465/196 262/466/196 263/464/196 +f 252/465/195 251/467/195 261/468/195 262/466/195 +f 251/467/203 250/469/203 260/470/203 261/468/203 +f 250/469/204 249/471/204 259/472/204 260/470/204 +f 249/471/202 248/473/202 258/474/202 259/472/202 +f 248/473/201 247/475/201 257/476/201 258/474/201 +f 247/477/200 246/457/200 256/460/200 257/478/200 diff --git a/mods/mylandscaping/models/mylandscaping_column_t_cross.obj b/mods/mylandscaping/models/mylandscaping_column_t_cross.obj new file mode 100644 index 00000000..f35e7878 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_column_t_cross.obj @@ -0,0 +1,77 @@ +# Blender v2.76 (sub 2) OBJ File: 'Column_toppers.blend' +# www.blender.org +o Cross_Cube.002 +v -0.141421 -0.000000 -0.000000 +v -0.141421 0.200000 -0.000000 +v 0.000000 -0.000000 -0.141421 +v 0.000000 0.200000 -0.141421 +v -0.000000 -0.000000 0.141421 +v -0.000000 0.200000 0.141421 +v 0.141421 -0.000000 0.000000 +v 0.141421 0.200000 0.000000 +v 0.000000 -0.400000 -0.141421 +v -0.141421 -0.400000 -0.000000 +v 0.141421 -0.400000 0.000000 +v -0.000000 -0.400000 0.141421 +v 0.141421 0.200000 -0.282843 +v 0.141421 -0.000000 -0.282843 +v 0.282843 0.200000 -0.141421 +v 0.282843 -0.000000 -0.141421 +v -0.282843 -0.000000 0.141421 +v -0.282843 0.200000 0.141421 +v -0.141421 0.200000 0.282843 +v -0.141421 -0.000000 0.282843 +v -0.141421 0.400000 -0.000000 +v 0.000000 0.400000 -0.141421 +v 0.141421 0.400000 0.000000 +v -0.000000 0.400000 0.141421 +vt 0.375763 0.748473 +vt 0.624237 0.748473 +vt 0.624237 0.500000 +vt 0.375763 0.500000 +vt 0.872710 0.500000 +vt 0.872710 0.748473 +vt 0.624237 0.375763 +vt 0.375763 0.375763 +vt 0.375763 0.127290 +vt 0.624237 0.127290 +vt 0.624237 0.003053 +vt 0.375763 0.003053 +vt 0.375763 0.996946 +vt 0.624237 0.996946 +vt 0.375763 0.624237 +vt 0.624237 0.624237 +vt 0.375763 0.872710 +vt 0.624237 0.872710 +vt 0.127290 0.748473 +vt 0.127290 0.500000 +vn -0.707100 0.000000 -0.707100 +vn 0.707100 0.000000 0.707100 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.707100 0.000000 -0.707100 +vn -0.707100 0.000000 0.707100 +g Cross_Cube.002_None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 8/2/2 7/3/2 16/5/2 15/6/2 +f 8/2/2 6/1/2 5/4/2 7/3/2 +f 6/7/3 2/8/3 18/9/3 19/10/3 +f 1/4/1 3/3/1 9/11/1 10/12/1 +f 4/2/1 2/1/1 21/13/1 22/14/1 +f 10/8/4 9/15/4 11/16/4 12/7/4 +f 3/4/5 7/3/5 11/11/5 9/12/5 +f 5/3/6 1/4/6 10/12/6 12/11/6 +f 7/3/2 5/4/2 12/12/2 11/11/2 +f 13/1/5 15/2/5 16/3/5 14/4/5 +f 7/16/4 3/15/4 14/17/4 16/18/4 +f 4/15/3 8/16/3 15/18/3 13/17/3 +f 3/3/1 4/2/1 13/6/1 14/5/1 +f 19/2/6 18/1/6 17/4/6 20/3/6 +f 5/4/2 6/1/2 19/19/2 20/20/2 +f 2/1/1 1/4/1 17/20/1 18/19/1 +f 1/8/4 5/7/4 20/10/4 17/9/4 +f 24/7/3 23/16/3 22/15/3 21/8/3 +f 2/1/6 6/2/6 24/14/6 21/13/6 +f 8/2/5 4/1/5 22/13/5 23/14/5 +f 6/1/2 8/2/2 23/14/2 24/13/2 diff --git a/mods/mylandscaping/models/mylandscaping_column_t_dragon.obj b/mods/mylandscaping/models/mylandscaping_column_t_dragon.obj new file mode 100644 index 00000000..c05e9987 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_column_t_dragon.obj @@ -0,0 +1,1436 @@ +# Blender v2.76 (sub 1) OBJ File: 'Column_toppers.blend' +# www.blender.org +o Dragon_New_Cylinder +v -0.251697 -0.328398 0.256613 +v -0.398478 0.166278 -0.300199 +v -0.248761 -0.377680 0.255941 +v -0.316848 0.124999 -0.298214 +v -0.278352 -0.404571 0.284907 +v -0.276117 0.124999 -0.338945 +v -0.310879 -0.382180 0.314545 +v -0.278102 0.166278 -0.420575 +v -0.313815 -0.332899 0.315217 +v -0.356364 0.209021 -0.425089 +v -0.284224 -0.306008 0.286251 +v -0.402992 0.209021 -0.378461 +v -0.101209 -0.314947 0.351302 +v 0.040319 -0.306954 0.351997 +v 0.162704 -0.281555 0.257542 +v 0.161357 -0.269291 0.229713 +v -0.082838 -0.197565 0.136710 +v -0.239302 -0.149239 0.006744 +v -0.311131 -0.028389 -0.134963 +v -0.229890 0.157176 -0.151304 +v -0.228920 0.331805 -0.164195 +v -0.358049 0.286950 -0.238538 +v -0.282341 0.222282 -0.220973 +v -0.226813 0.286435 -0.205499 +v -0.242902 0.186932 -0.214658 +v -0.336393 -0.085543 -0.261431 +v -0.210519 -0.306860 -0.108937 +v -0.046412 -0.346646 0.038821 +v 0.183240 -0.342748 0.198227 +v 0.177707 -0.350834 0.246960 +v 0.047331 -0.374503 0.348791 +v -0.099512 -0.382087 0.348757 +v -0.198876 0.222282 -0.304438 +v -0.183402 0.286435 -0.248910 +v -0.192561 0.186932 -0.264999 +v -0.237303 -0.081446 -0.361748 +v -0.069013 -0.300290 -0.250122 +v 0.075377 -0.338622 -0.097413 +v 0.262758 -0.358393 0.180959 +v 0.235859 -0.379919 0.277112 +v 0.073959 -0.408447 0.401337 +v -0.122197 -0.418267 0.400656 +v -0.216442 0.286950 -0.380146 +v -0.142099 0.331805 -0.251016 +v -0.129207 0.157176 -0.251987 +v -0.112951 -0.020195 -0.335596 +v 0.047084 -0.136100 -0.272200 +v 0.164001 -0.181516 -0.132807 +v 0.320394 -0.300582 0.195177 +v 0.279008 -0.339724 0.317845 +v 0.093575 -0.374842 0.457088 +v -0.146579 -0.387307 0.455099 +v -0.312768 0.339122 -0.418329 +v -0.144205 0.377176 -0.209713 +v -0.116194 0.127419 -0.188632 +v -0.087689 0.036959 -0.209128 +v 0.016276 0.021520 -0.153009 +v 0.127340 -0.032435 -0.033371 +v 0.298511 -0.227125 0.226663 +v 0.264005 -0.270445 0.328427 +v 0.086564 -0.307293 0.460294 +v -0.148277 -0.320167 0.457644 +v -0.396232 0.339122 -0.334865 +v -0.187616 0.377176 -0.166302 +v -0.166536 0.127419 -0.138291 +v -0.186779 0.032862 -0.108811 +v -0.126918 0.014951 -0.013537 +v 0.003920 -0.040460 0.101388 +v 0.218992 -0.211480 0.243931 +v 0.205854 -0.241360 0.298275 +v 0.059935 -0.273349 0.407748 +v -0.125591 -0.283988 0.405745 +v -0.298703 0.332152 -0.226596 +v -0.253130 0.283592 -0.228125 +v -0.206029 0.283592 -0.275227 +v -0.204499 0.332152 -0.320799 +v -0.250071 0.380711 -0.319270 +v -0.297173 0.380711 -0.272168 +v -0.198501 0.249047 -0.133665 +v -0.214275 0.253570 -0.192905 +v -0.170808 0.253570 -0.236372 +v -0.111568 0.249047 -0.220598 +v -0.095794 0.244524 -0.161358 +v -0.139261 0.244524 -0.117891 +v -0.366976 -0.335047 0.120943 +v -0.364645 -0.380386 0.119839 +v -0.394969 -0.405247 0.142745 +v -0.427625 -0.384768 0.166756 +v -0.429956 -0.339428 0.167861 +v -0.399632 -0.314568 0.144954 +v -0.454517 -0.335541 -0.007832 +v -0.452934 -0.377666 -0.009687 +v -0.484850 -0.400671 0.005568 +v -0.518348 -0.381549 0.022678 +v -0.519931 -0.339424 0.024533 +v -0.488015 -0.316419 0.009278 +v -0.478238 -0.337563 -0.169596 +v -0.476404 -0.375888 -0.168455 +v -0.508159 -0.396790 -0.173764 +v -0.541750 -0.379367 -0.180213 +v -0.543585 -0.341041 -0.181354 +v -0.511829 -0.320139 -0.176045 +v -0.421219 -0.354807 -0.332515 +v -0.421204 -0.379967 -0.329140 +v -0.438830 -0.394302 -0.340462 +v -0.456471 -0.383479 -0.355160 +v -0.456486 -0.358319 -0.358536 +v -0.438860 -0.343984 -0.347213 +v -0.353266 -0.375113 -0.410123 +v -0.353497 -0.387781 -0.408087 +v -0.359940 -0.395452 -0.416106 +v -0.366152 -0.390456 -0.426161 +v -0.365921 -0.377789 -0.428198 +v -0.359478 -0.370117 -0.420179 +v 0.018396 -0.219106 0.152031 +v 0.033978 -0.338372 0.075149 +v 0.119106 -0.331754 -0.024691 +v 0.181574 -0.204116 -0.044471 +v 0.172044 -0.084411 0.025384 +v 0.075631 -0.091907 0.138459 +v 0.131315 -0.322389 0.133839 +v 0.194470 -0.318649 0.064421 +v 0.242735 -0.239555 0.049056 +v 0.227844 -0.164202 0.103107 +v 0.164688 -0.167942 0.172525 +v 0.116424 -0.247036 0.187891 +v -0.281988 -0.102167 -0.064447 +v -0.271447 -0.219088 -0.204185 +v -0.171654 -0.212897 -0.307532 +v -0.040227 -0.087170 -0.314821 +v -0.039922 0.030404 -0.186305 +v -0.160803 0.022905 -0.061118 +v -0.274975 -0.395089 -0.473217 +v -0.271800 -0.398256 -0.466202 +v -0.268760 -0.393179 -0.460345 +v -0.268897 -0.384935 -0.461502 +v -0.275112 -0.386844 -0.474375 +v -0.272072 -0.381767 -0.468517 +v 0.535256 0.359003 -0.196024 +v 0.564004 0.349574 -0.061217 +v -0.181592 0.352434 0.503465 +v -0.008718 0.342471 0.510524 +v 0.480740 0.295001 -0.088946 +v 0.417767 0.220296 -0.102107 +v 0.372199 0.140805 -0.057884 +v 0.259829 0.099554 -0.080463 +v 0.176764 -0.013362 -0.005841 +v 0.025330 0.103340 -0.243307 +v 0.057240 0.183219 -0.346474 +v 0.137358 0.247863 -0.344284 +v 0.250348 0.301435 -0.323883 +v 0.402795 0.340441 -0.271276 +v -0.255348 0.333481 0.370885 +v -0.305938 0.294482 0.218842 +v -0.324411 0.240808 0.106167 +v -0.324859 0.175713 0.026179 +v -0.219232 0.096611 -0.004885 +v 0.031692 -0.018888 0.145610 +v -0.038125 0.091529 0.224680 +v -0.013021 0.132781 0.332451 +v -0.054720 0.212271 0.373420 +v -0.039069 0.287549 0.431760 +v -0.414864 0.131215 -0.486709 +v -0.352067 0.090806 -0.477808 +v -0.464612 0.131215 -0.436961 +v -0.455712 0.090806 -0.374164 +v -0.347506 0.016949 -0.341848 +v -0.400940 0.050662 -0.349695 +v -0.319752 0.016949 -0.369603 +v -0.327599 0.050662 -0.423037 +v -0.450311 0.038309 -0.507219 +v -0.423453 0.013585 -0.508620 +v -0.485122 0.038309 -0.472408 +v -0.486523 0.013585 -0.445550 +v -0.396148 -0.044486 -0.402192 +v -0.430152 -0.035084 -0.411816 +v -0.380095 -0.044486 -0.418245 +v -0.389719 -0.035084 -0.452249 +v -0.365764 0.331381 -0.211187 +v -0.189090 0.331381 -0.387861 +v -0.343536 0.405741 -0.187653 +v -0.165556 0.405741 -0.365633 +v -0.463550 0.087912 -0.476777 +v -0.454680 0.087912 -0.485647 +v -0.466930 0.071987 -0.483897 +v -0.461800 0.071987 -0.489027 +v -0.478438 0.121207 -0.495715 +v -0.473618 0.121207 -0.500535 +v -0.482445 0.114830 -0.501755 +v -0.479658 0.114830 -0.504542 +v -0.424092 -0.045168 -0.430136 +v -0.408039 -0.045168 -0.446188 +v -0.444529 -0.003935 -0.501438 +v -0.479341 -0.003935 -0.466626 +v -0.370709 0.038392 -0.358799 +v -0.336702 0.038392 -0.392805 +v -0.357755 0.187408 -0.318568 +v -0.296471 0.187408 -0.379851 +v -0.440391 0.103154 -0.411077 +v -0.388980 0.103154 -0.462488 +v -0.469492 0.024135 -0.469637 +v -0.447541 0.024135 -0.491589 +v -0.397650 -0.036062 -0.434382 +v -0.412285 -0.036062 -0.419746 +v 0.548436 0.357210 -0.176480 +v 0.053762 0.079145 -0.187945 +v 0.059419 0.165707 -0.255709 +v 0.153019 0.225954 -0.256335 +v 0.253824 0.284817 -0.250152 +v 0.407617 0.331254 -0.224408 +v -0.154447 0.350349 0.512294 +v -0.160544 0.072840 0.023657 +v -0.229173 0.159655 0.028316 +v -0.230826 0.219700 0.120756 +v -0.225687 0.278430 0.220382 +v -0.201326 0.324393 0.372659 +v -0.301142 -0.120999 -0.066024 +v -0.319282 -0.219652 -0.156025 +v -0.120961 -0.212332 -0.358550 +v -0.039685 -0.111349 -0.333023 +v -0.241096 -0.200416 -0.056436 +v -0.246323 -0.254013 -0.121648 +v -0.086330 -0.253839 -0.281832 +v -0.021405 -0.199979 -0.275411 +v -0.287099 -0.209343 -0.022525 +v -0.281854 -0.253804 -0.086078 +v -0.049892 -0.254048 -0.318310 +v 0.005905 -0.209619 -0.315199 +v -0.219588 -0.252283 -0.034812 +v -0.241688 -0.262733 -0.116897 +v -0.081609 -0.262514 -0.276997 +v 0.000216 -0.252203 -0.253676 +v -0.268092 -0.254910 -0.003389 +v -0.275819 -0.262576 -0.082571 +v -0.046570 -0.262671 -0.312231 +v 0.024788 -0.255269 -0.296214 +v -0.224351 -0.295378 -0.058629 +v -0.247819 -0.280233 -0.122892 +v -0.087681 -0.280028 -0.282932 +v -0.023851 -0.295568 -0.258418 +v -0.279883 -0.292631 -0.017898 +v -0.283657 -0.280150 -0.086816 +v -0.050935 -0.280111 -0.319917 +v 0.010045 -0.292969 -0.307968 +v -0.231102 -0.334820 -0.083317 +v -0.262212 -0.313073 -0.137153 +v -0.102059 -0.312877 -0.297177 +v -0.048720 -0.335042 -0.265083 +v -0.291210 -0.330957 -0.037540 +v -0.296214 -0.313008 -0.102905 +v -0.067149 -0.312942 -0.332333 +v -0.009752 -0.331273 -0.319184 +v -0.271841 -0.383919 -0.114519 +v -0.284553 -0.367280 -0.173446 +v -0.138541 -0.367084 -0.319329 +v -0.087036 -0.384153 -0.298676 +v -0.308378 -0.380083 -0.092309 +v -0.325299 -0.367217 -0.132442 +v -0.096887 -0.367147 -0.361241 +v -0.064698 -0.380356 -0.336150 +v -0.279677 -0.397101 -0.122291 +v -0.287073 -0.397646 -0.175902 +v -0.141062 -0.397450 -0.321785 +v -0.094873 -0.397334 -0.306448 +v -0.315759 -0.397131 -0.099626 +v -0.337794 -0.397586 -0.124907 +v -0.089433 -0.397510 -0.373688 +v -0.072079 -0.397404 -0.343467 +v -0.173953 -0.370623 -0.354549 +v -0.132292 -0.370710 -0.396453 +v -0.360699 -0.370743 -0.167650 +v -0.319945 -0.370830 -0.208647 +v -0.173590 -0.396354 -0.354121 +v -0.121955 -0.396439 -0.406017 +v -0.370310 -0.396476 -0.157231 +v -0.319582 -0.396561 -0.208219 +v -0.186508 -0.384218 -0.367035 +v -0.144847 -0.384305 -0.408939 +v -0.373254 -0.384338 -0.180136 +v -0.332500 -0.384425 -0.221133 +v -0.186145 -0.396739 -0.366607 +v -0.134509 -0.396824 -0.418503 +v -0.382865 -0.396860 -0.169717 +v -0.332137 -0.396945 -0.220705 +v -0.014555 -0.228595 0.169293 +v -0.032366 -0.297541 0.139507 +v 0.170390 -0.297457 -0.063249 +v 0.198256 -0.228697 -0.050499 +v -0.082783 -0.163426 0.147585 +v -0.084469 -0.289687 0.098948 +v 0.136197 -0.289778 -0.121649 +v 0.181078 -0.165148 -0.117711 +v -0.130398 -0.163069 0.197276 +v -0.123893 -0.289787 0.138589 +v 0.172596 -0.289492 -0.158386 +v 0.227940 -0.162479 -0.161311 +v -0.126695 -0.127705 0.118755 +v -0.140445 -0.239269 0.099622 +v 0.136800 -0.239355 -0.177542 +v 0.152270 -0.129618 -0.161474 +v -0.177774 -0.127279 0.171829 +v -0.179863 -0.239354 0.139270 +v 0.173181 -0.239093 -0.214298 +v 0.202380 -0.126673 -0.208672 +v -0.163911 -0.130309 0.081603 +v -0.187903 -0.224500 0.052228 +v 0.089331 -0.224594 -0.224947 +v 0.114827 -0.132036 -0.198852 +v -0.199104 -0.130109 0.118857 +v -0.227334 -0.224611 0.091864 +v 0.125747 -0.224290 -0.261668 +v 0.149429 -0.129523 -0.229851 +v 0.194374 -0.348061 -0.190045 +v 0.163276 -0.348319 -0.158580 +v -0.121037 -0.348233 0.125652 +v -0.155171 -0.348314 0.160008 +v 0.161294 -0.356505 -0.233635 +v 0.124878 -0.356809 -0.196914 +v -0.159424 -0.356715 0.087329 +v -0.198855 -0.356826 0.126965 +v 0.187201 -0.403742 -0.198869 +v 0.159942 -0.403891 -0.171275 +v -0.133853 -0.403850 0.122501 +v -0.163409 -0.403885 0.152244 +v 0.146805 -0.403850 -0.255656 +v 0.103157 -0.404150 -0.211539 +v -0.173579 -0.404034 0.065049 +v -0.220879 -0.404127 0.112630 +v 0.102813 -0.374313 -0.291669 +v 0.066432 -0.374575 -0.254913 +v -0.217881 -0.374489 0.029319 +v -0.257300 -0.374574 0.068967 +v 0.101664 -0.404968 -0.307664 +v 0.050780 -0.405245 -0.256155 +v -0.218394 -0.405125 0.012775 +v -0.273566 -0.405191 0.068296 +vt 0.857199 0.399127 +vt 0.878959 0.337809 +vt 0.920450 0.349590 +vt 0.897757 0.397575 +vt 0.945986 0.358080 +vt 0.938602 0.409296 +vt 0.986670 0.371031 +vt 0.972350 0.433670 +vt 0.677448 0.543449 +vt 0.681801 0.455420 +vt 0.737565 0.458618 +vt 0.734998 0.532376 +vt 0.021152 0.801727 +vt 0.021152 0.781974 +vt 0.038258 0.772098 +vt 0.055363 0.781974 +vt 0.055363 0.801726 +vt 0.038258 0.811602 +vt 0.778452 0.531505 +vt 0.780140 0.462101 +vt 0.835625 0.464007 +vt 0.835625 0.547511 +vt 0.529972 0.850266 +vt 0.539117 0.824927 +vt 0.629212 0.848318 +vt 0.625324 0.869843 +vt 0.524181 0.930923 +vt 0.417612 0.936198 +vt 0.414010 0.902030 +vt 0.523876 0.905006 +vt 0.297496 0.933518 +vt 0.300633 0.893319 +vt 0.173762 0.933394 +vt 0.172125 0.886970 +vt 0.112825 0.925828 +vt 0.128768 0.879464 +vt 0.440535 0.152663 +vt 0.450388 0.199594 +vt 0.360522 0.203239 +vt 0.361210 0.158411 +vt 0.467470 0.294156 +vt 0.354820 0.296350 +vt 0.466200 0.335677 +vt 0.461377 0.374531 +vt 0.349493 0.361780 +vt 0.349947 0.326833 +vt 0.424616 0.444498 +vt 0.369096 0.442319 +vt 0.414755 0.513440 +vt 0.420542 0.571671 +vt 0.397270 0.576924 +vt 0.386380 0.517643 +vt 0.733322 0.592812 +vt 0.775158 0.597619 +vt 0.414866 0.860546 +vt 0.525014 0.877861 +vt 0.309801 0.849035 +vt 0.172047 0.825884 +vt 0.148409 0.822240 +vt 0.276497 0.196719 +vt 0.280230 0.143090 +vt 0.256510 0.277059 +vt 0.262382 0.364509 +vt 0.251327 0.318130 +vt 0.322570 0.471867 +vt 0.372622 0.579274 +vt 0.355028 0.530650 +vt 0.819933 0.595851 +vt 0.524534 0.955366 +vt 0.419446 0.970858 +vt 0.296978 0.970167 +vt 0.172532 0.972617 +vt 0.101318 0.966864 +vt 0.517105 0.120320 +vt 0.552018 0.168515 +vt 0.588827 0.281814 +vt 0.578495 0.351895 +vt 0.560454 0.401459 +vt 0.461901 0.471932 +vt 0.444410 0.519531 +vt 0.444502 0.566591 +vt 0.690887 0.589790 +vt 0.441636 0.784060 +vt 0.456747 0.751830 +vt 0.549476 0.802044 +vt 0.330749 0.752297 +vt 0.337964 0.715370 +vt 0.206976 0.716982 +vt 0.218060 0.678020 +vt 0.149473 0.707658 +vt 0.149252 0.664002 +vt 0.136004 0.132003 +vt 0.122720 0.169519 +vt 0.034376 0.146711 +vt 0.063829 0.103646 +vt 0.112185 0.264149 +vt 0.012271 0.253016 +vt 0.475509 0.526408 +vt 0.556046 0.474855 +vt 0.576812 0.529556 +vt 0.533398 0.552623 +vt 0.156007 0.397969 +vt 0.246315 0.525496 +vt 0.205167 0.539153 +vt 0.120616 0.456899 +vt 0.269738 0.577833 +vt 0.281571 0.606928 +vt 0.245391 0.638255 +vt 0.223208 0.588162 +vt 0.924166 0.434346 +vt 0.945812 0.455734 +vt 0.424467 0.819166 +vt 0.320951 0.797175 +vt 0.189404 0.765036 +vt 0.151796 0.760229 +vt 0.211066 0.145768 +vt 0.205948 0.184132 +vt 0.189170 0.265278 +vt 0.186773 0.315565 +vt 0.203617 0.375844 +vt 0.119495 0.331681 +vt 0.287552 0.504808 +vt 0.317309 0.558485 +vt 0.332613 0.585805 +vt 0.896166 0.424259 +vt 0.537166 0.718783 +vt 0.515538 0.730743 +vt 0.504875 0.675087 +vt 0.540633 0.674271 +vt 0.867595 0.430667 +vt 0.363628 0.630709 +vt 0.333346 0.607653 +vt 0.303199 0.624168 +vt 0.303056 0.671548 +vt 0.468002 0.612136 +vt 0.440050 0.642803 +vt 0.399791 0.649322 +vt 0.618298 0.914671 +vt 0.621602 0.892413 +vt 0.704904 0.904863 +vt 0.699648 0.926572 +vt 0.615569 0.937027 +vt 0.633610 0.827243 +vt 0.613557 0.958970 +vt 0.695754 0.947616 +vt 0.792306 0.936530 +vt 0.792131 0.954581 +vt 0.694441 0.968623 +vt 0.710760 0.860254 +vt 0.708869 0.882671 +vt 0.712496 0.839490 +vt 0.793263 0.918021 +vt 0.878512 0.930744 +vt 0.877920 0.941949 +vt 0.808339 0.863422 +vt 0.802206 0.880492 +vt 0.796545 0.898743 +vt 0.792348 0.972614 +vt 0.878098 0.953138 +vt 0.927775 0.944047 +vt 0.927777 0.949766 +vt 0.878997 0.964161 +vt 0.884509 0.908125 +vt 0.880635 0.919214 +vt 0.889460 0.897859 +vt 0.929213 0.932416 +vt 0.930974 0.926955 +vt 0.973367 0.938097 +vt 0.972357 0.941384 +vt 0.933165 0.921803 +vt 0.928153 0.938244 +vt 0.928006 0.955353 +vt 0.774453 0.640807 +vt 0.818446 0.618511 +vt 0.788747 0.684708 +vt 0.762534 0.695116 +vt 0.226525 0.059477 +vt 0.158846 0.049583 +vt 0.913999 0.689850 +vt 0.883583 0.699492 +vt 0.895405 0.655275 +vt 0.906412 0.653474 +vt 0.478225 0.057096 +vt 0.423859 0.081184 +vt 0.365383 0.085953 +vt 0.309365 0.075642 +vt 0.044176 0.887275 +vt 0.077860 0.852540 +vt 0.102012 0.811976 +vt 0.017635 0.930446 +vt 0.079671 0.724093 +vt 0.062401 0.679018 +vt 0.099732 0.765770 +vt 0.014403 0.317286 +vt 0.971472 0.948186 +vt 0.971476 0.951707 +vt 0.974516 0.934765 +vt 0.971709 0.944757 +vt 0.971460 0.955323 +vt 0.728136 0.238477 +vt 0.714623 0.313076 +vt 0.642606 0.326242 +vt 0.646858 0.275907 +vt 0.870571 0.259567 +vt 0.817273 0.314400 +vt 0.829074 0.313139 +vt 0.892923 0.269009 +vt 0.826358 0.014167 +vt 0.804216 0.033890 +vt 0.921974 0.049140 +vt 0.954593 0.055830 +vt 0.912177 0.012030 +vt 0.955304 0.090296 +vt 0.997214 0.105360 +vt 0.939290 0.140859 +vt 0.982407 0.154398 +vt 0.916737 0.193360 +vt 0.950630 0.209346 +vt 0.628184 0.009611 +vt 0.688296 0.023314 +vt 0.655960 0.035713 +vt 0.544953 0.086850 +vt 0.551921 0.059687 +vt 0.706389 0.052412 +vt 0.600278 0.139220 +vt 0.720451 0.102863 +vt 0.596216 0.197960 +vt 0.730105 0.158546 +vt 0.635098 0.229068 +vt 0.740387 0.332175 +vt 0.754044 0.322144 +vt 0.754869 0.345475 +vt 0.705729 0.384111 +vt 0.746426 0.392880 +vt 0.764212 0.362047 +vt 0.762209 0.370429 +vt 0.779814 0.347484 +vt 0.783569 0.323642 +vt 0.796264 0.335982 +vt 0.780774 0.396172 +vt 0.822139 0.393262 +vt 0.941369 0.303291 +vt 0.955327 0.308163 +vt 0.916698 0.292146 +vt 0.981812 0.313312 +vt 0.976214 0.266075 +vt 0.963048 0.273830 +vt 0.969117 0.258301 +vt 0.955066 0.270976 +vt 0.958897 0.255186 +vt 0.948878 0.257328 +vt 0.114820 0.494409 +vt 0.092776 0.562944 +vt 0.064271 0.508174 +vt 0.063710 0.468023 +vt 0.138225 0.540371 +vt 0.156762 0.575990 +vt 0.157624 0.637728 +vt 0.105728 0.587831 +vt 0.290805 0.052387 +vt 0.305863 0.011540 +vt 0.311045 0.033441 +vt 0.311087 0.033430 +vt 0.768393 0.371005 +vt 0.767773 0.362245 +vt 0.331130 0.052387 +vt 0.316388 0.011297 +vt 0.796858 0.758407 +vt 0.802353 0.750924 +vt 0.841204 0.772343 +vt 0.829004 0.788811 +vt 0.890054 0.803140 +vt 0.872111 0.824770 +vt 0.938736 0.834229 +vt 0.918968 0.861749 +vt 0.970721 0.868675 +vt 0.962073 0.880561 +vt 0.984698 0.872458 +vt 0.970554 0.892510 +vt 0.906219 0.876212 +vt 0.956248 0.894725 +vt 0.860240 0.841306 +vt 0.981947 0.858457 +vt 0.948088 0.817813 +vt 0.901735 0.786630 +vt 0.789834 0.754092 +vt 0.796005 0.745549 +vt 0.790098 0.764154 +vt 0.822161 0.801101 +vt 0.850972 0.761978 +vt 0.805748 0.742663 +vt 0.803797 0.208966 +vt 0.790532 0.256583 +vt 0.788013 0.160048 +vt 0.823523 0.110776 +vt 0.760822 0.299088 +vt 0.770364 0.153729 +vt 0.755657 0.235042 +vt 0.766455 0.090616 +vt 0.751692 0.041454 +vt 0.727661 0.307093 +vt 0.241760 0.323803 +vt 0.064745 0.441982 +vt 0.061793 0.424909 +vt 0.083458 0.352453 +vt 0.212335 0.331796 +vt 0.609476 0.512977 +vt 0.611319 0.519207 +vt 0.580566 0.535374 +vt 0.606863 0.672059 +vt 0.581225 0.676099 +vt 0.577522 0.656858 +vt 0.598514 0.644549 +vt 0.638329 0.442417 +vt 0.647688 0.431417 +vt 0.663709 0.486868 +vt 0.642248 0.493915 +vt 0.416349 0.719005 +vt 0.454219 0.674541 +vt 0.595335 0.716669 +vt 0.606863 0.721220 +vt 0.581295 0.472930 +vt 0.505579 0.667999 +vt 0.457422 0.651470 +vt 0.473839 0.639075 +vt 0.509341 0.656013 +vt 0.539444 0.667919 +vt 0.537933 0.656265 +vt 0.567699 0.645214 +vt 0.647925 0.512958 +vt 0.546245 0.570934 +vt 0.668118 0.514153 +vt 0.644038 0.527631 +vt 0.667578 0.536568 +vt 0.662430 0.558569 +vt 0.639889 0.543257 +vt 0.516873 0.636729 +vt 0.534217 0.639046 +vt 0.587848 0.623131 +vt 0.614964 0.530655 +vt 0.589152 0.544033 +vt 0.565759 0.574429 +vt 0.587468 0.582300 +vt 0.604306 0.557622 +vt 0.621025 0.565859 +vt 0.623980 0.584695 +vt 0.619029 0.547825 +vt 0.631655 0.563532 +vt 0.623660 0.562509 +vt 0.556855 0.633170 +vt 0.490456 0.621741 +vt 0.572216 0.604383 +vt 0.622999 0.566362 +vt 0.623153 0.565265 +vt 0.538108 0.601809 +vt 0.539702 0.619212 +vt 0.535398 0.618510 +vt 0.530005 0.603211 +vt 0.528042 0.621459 +vt 0.532600 0.623021 +vt 0.637454 0.578931 +vt 0.523055 0.602406 +vt 0.530007 0.619807 +vt 0.532413 0.620100 +vt 0.630183 0.580870 +vt 0.624204 0.565068 +vt 0.628005 0.566097 +vt 0.530813 0.620728 +vt 0.530855 0.620623 +vt 0.623299 0.565169 +vt 0.623362 0.565247 +vt 0.623314 0.565251 +vt 0.530668 0.620648 +vt 0.530802 0.620638 +vt 0.104429 0.008144 +vt 0.086672 0.112678 +vt 0.053157 0.069294 +vt 0.034624 0.057300 +vt 0.264979 0.134160 +vt 0.254860 0.128074 +vt 0.699646 0.680292 +vt 0.714962 0.692127 +vt 0.710624 0.701135 +vt 0.701412 0.698330 +vt 0.976692 0.664430 +vt 0.951892 0.649945 +vt 0.933344 0.613159 +vt 0.973770 0.613810 +vt 0.951291 0.690695 +vt 0.608838 0.608705 +vt 0.701481 0.634403 +vt 0.630293 0.677140 +vt 0.983893 0.735640 +vt 0.812195 0.710093 +vt 0.837091 0.649128 +vt 0.719976 0.631490 +vt 0.897247 0.649250 +vt 0.863575 0.610911 +vt 0.891411 0.610734 +vt 0.897546 0.640759 +vt 0.903850 0.668445 +vt 0.904287 0.646942 +vt 0.907533 0.611276 +vt 0.739939 0.723780 +vt 0.659234 0.714689 +vt 0.405467 0.006468 +vt 0.396572 0.055468 +vt 0.373982 0.038702 +vt 0.464614 0.039650 +vt 0.771203 0.728017 +vt 0.696101 0.722483 +vt 0.701336 0.706569 +vt 0.707380 0.706294 +vt 0.708654 0.723809 +vt 0.710794 0.773989 +vt 0.689742 0.776603 +vt 0.661701 0.799919 +vt 0.962062 0.505442 +vt 0.937664 0.516136 +vt 0.922268 0.496263 +vt 0.914760 0.484359 +vt 0.915429 0.511724 +vt 0.901794 0.509576 +vt 0.913786 0.478555 +vt 0.913354 0.468203 +vt 0.729186 0.783296 +vt 0.870955 0.498528 +vt 0.747320 0.798827 +vt 0.914506 0.486625 +vt 0.911863 0.490814 +vt 0.714406 0.791698 +vt 0.710981 0.815114 +vt 0.705522 0.785902 +vt 0.707302 0.785694 +vt 0.915713 0.444733 +vt 0.030655 0.537565 +vt 0.037196 0.571683 +vt 0.040904 0.559341 +vt 0.026897 0.458574 +vt 0.706388 0.785074 +vt 0.706605 0.785203 +vt 0.706503 0.785215 +vt 0.706412 0.785183 +vt 0.036866 0.613283 +vt 0.043566 0.598086 +vt 0.012735 0.680466 +vn -0.375100 -0.403000 0.834800 +vn 0.548900 -0.630500 0.548900 +vn 0.834800 -0.403000 -0.375100 +vn 0.271200 0.066900 -0.960200 +vn 0.902200 -0.045300 -0.428900 +vn -0.960200 0.066900 0.271200 +vn -0.682000 0.264000 -0.682000 +vn 0.424700 -0.837200 -0.344700 +vn -0.401900 0.829700 0.387300 +vn -0.052500 0.828200 0.558000 +vn 0.173600 0.860900 0.478200 +vn 0.232600 0.851400 0.470200 +vn 0.398200 0.823200 0.404700 +vn 0.196000 0.950500 0.241100 +vn 0.089200 0.986400 0.137700 +vn 0.707600 0.065800 0.703600 +vn 0.628400 0.458400 0.628400 +vn -0.241600 0.939800 -0.241600 +vn 0.195200 0.882500 -0.427900 +vn -0.044900 0.861100 -0.506500 +vn -0.440600 0.828000 -0.346700 +vn -0.739100 0.636500 0.220400 +vn -0.180300 0.254700 0.950100 +vn -0.488600 0.433800 0.757000 +vn -0.510600 0.571200 0.642700 +vn -0.236700 0.239800 0.941500 +vn -0.232500 0.258600 0.937600 +vn -0.585000 0.582300 0.564500 +vn -0.649800 -0.046800 0.758700 +vn -0.007500 -0.043100 0.999000 +vn 0.596500 0.015100 0.802500 +vn 0.923200 0.132200 0.360800 +vn 0.922400 0.306600 -0.235100 +vn 0.738600 0.491500 -0.461500 +vn 0.575700 0.646400 -0.500700 +vn 0.942900 0.245200 -0.225500 +vn 0.937600 0.258600 -0.232500 +vn 0.564500 0.582300 -0.585000 +vn -0.324200 -0.882600 0.340500 +vn 0.040900 -0.861300 0.506400 +vn 0.424800 -0.831000 0.359300 +vn 0.692500 -0.721200 0.016200 +vn 0.797100 -0.491100 -0.351400 +vn 0.577800 -0.485500 -0.656100 +vn -0.222900 0.248200 0.942700 +vn 0.131200 0.364600 -0.921900 +vn 0.233400 -0.261000 -0.936700 +vn 0.994600 0.036400 -0.097500 +vn 0.274600 -0.836200 -0.474700 +vn 0.043200 -0.828700 -0.558000 +vn -0.198700 -0.867000 -0.457100 +vn -0.277700 -0.927100 -0.251600 +vn 0.099200 -0.994700 0.025200 +vn -0.103200 -0.983300 -0.149700 +vn -0.587300 -0.542200 -0.600900 +vn -0.670900 0.345600 -0.656100 +vn -0.622000 -0.475600 -0.622000 +vn 0.685300 -0.246500 0.685300 +vn 0.528900 0.044500 -0.847500 +vn 0.000200 0.042700 -0.999100 +vn -0.611000 -0.018600 -0.791400 +vn -0.969700 -0.217900 -0.110900 +vn -0.264000 -0.561800 0.784000 +vn -0.634300 -0.528000 0.564600 +vn -0.290700 -0.910700 -0.293300 +vn -0.928500 0.345100 0.137400 +vn -0.936700 -0.261000 0.233400 +vn -0.097500 0.036400 0.994600 +vn -0.540600 -0.560500 0.627400 +vn 0.057900 -0.996600 0.057900 +vn 0.627400 -0.560500 -0.540600 +vn 0.608400 0.563600 -0.558700 +vn -0.558700 0.563600 0.608400 +vn 0.016400 0.999700 0.016400 +vn -0.916300 0.274400 0.291900 +vn -0.623600 0.471500 -0.623600 +vn 0.291900 0.274400 -0.916300 +vn 0.961500 -0.103500 -0.254700 +vn -0.254700 -0.103500 0.961500 +vn 0.679500 -0.276600 0.679500 +vn 0.373900 0.891200 -0.256700 +vn -0.448500 0.836000 0.316100 +vn 0.759700 0.054500 -0.648000 +vn -0.347800 -0.891600 0.289900 +vn 0.323700 0.890900 -0.318600 +vn -0.783000 -0.055200 0.619600 +vn -0.560700 0.826000 0.056800 +vn -0.845500 -0.055800 0.531000 +vn 0.445900 -0.835600 -0.320800 +vn -0.464500 0.836300 0.291400 +vn -0.392300 -0.891300 0.227200 +vn 0.825600 0.055900 -0.561500 +vn 0.459400 0.885500 0.069800 +vn -0.472500 -0.880200 0.043800 +vn 0.988400 0.043300 -0.145600 +vn 0.467200 0.880600 -0.078600 +vn -0.992500 -0.043200 0.114200 +vn 0.555700 -0.826400 -0.090700 +vn -0.263000 0.783000 -0.563700 +vn -0.898100 -0.057200 -0.436200 +vn 0.522600 -0.828100 0.202800 +vn -0.478100 0.819300 -0.316400 +vn -0.415400 -0.890900 -0.183700 +vn 0.944600 0.050600 0.324200 +vn 0.280900 -0.794700 0.538100 +vn -0.297900 -0.908400 -0.293400 +vn 0.760600 0.087700 0.643300 +vn 0.433500 0.888600 0.150100 +vn -0.620100 -0.107600 -0.777100 +vn 0.399700 -0.811600 0.426100 +vn 0.179200 -0.956400 -0.230600 +vn 0.125100 -0.990900 0.048900 +vn 0.434800 0.659500 0.613200 +vn 0.867300 0.339700 -0.363800 +vn -0.217700 0.243900 0.945100 +vn 0.466100 0.759200 0.454300 +vn 0.271100 0.907200 0.321600 +vn -0.543000 0.426100 0.723500 +vn 0.871100 0.388100 -0.300700 +vn 0.653600 -0.510300 -0.558900 +vn -0.195500 -0.962200 -0.189700 +vn -0.739400 -0.463400 0.488400 +vn -0.893300 -0.368000 0.258000 +vn -0.418500 -0.786500 -0.454100 +vn 0.257400 -0.312400 -0.914400 +vn 0.550100 0.591500 -0.589400 +vn -0.592200 0.514500 0.620200 +vn 0.072700 0.989500 0.125100 +vn -0.214600 0.787900 -0.577200 +vn -0.213500 -0.921900 -0.323400 +vn 0.526600 0.126000 0.840700 +vn 0.279800 0.916900 0.284600 +vn -0.459800 -0.132000 -0.878100 +vn 0.204500 0.892200 -0.402700 +vn -0.254400 0.940700 0.224500 +vn -0.476000 0.606800 0.636600 +vn -0.806100 0.502700 0.312300 +vn -0.569300 0.789000 0.230900 +vn -0.474700 0.841900 0.256800 +vn -0.313800 0.923800 0.219300 +vn 0.620600 0.587700 -0.519100 +vn 0.633400 0.633400 -0.444600 +vn 0.647500 0.646700 -0.403100 +vn 0.653500 0.617700 -0.437400 +vn 0.528900 0.688200 -0.496600 +vn -0.197200 -0.159400 -0.967300 +vn 0.315500 0.396000 -0.862300 +vn -0.385600 0.339200 -0.858000 +vn -0.967300 -0.159400 -0.197200 +vn -0.477600 0.737400 -0.477600 +vn -0.862300 0.396000 0.315500 +vn -0.694200 -0.190000 -0.694200 +vn 0.635900 -0.437200 0.635900 +vn -0.254400 -0.339400 0.905600 +vn 0.905600 -0.339400 -0.254400 +vn 0.363600 -0.866300 -0.342400 +vn 0.012200 -0.999900 0.012200 +vn 0.799100 -0.460400 -0.386700 +vn -0.386700 -0.460400 0.799100 +vn -0.965600 0.165200 0.200800 +vn -0.342400 -0.866300 0.363600 +vn 0.200800 0.165200 -0.965600 +vn 0.440800 -0.781900 0.440800 +vn -0.889400 0.406500 -0.209000 +vn -0.209000 0.406500 -0.889400 +vn 0.561700 -0.058100 -0.825300 +vn -0.858000 0.339200 -0.385600 +vn -0.597500 0.534700 -0.597500 +vn -0.700200 0.139400 -0.700200 +vn -0.472300 0.744200 -0.472300 +vn 0.574300 0.583400 0.574300 +vn -0.825300 -0.058100 0.561700 +vn -0.619400 -0.482500 -0.619400 +vn -0.506600 0.697600 -0.506600 +vn -0.685600 0.244700 -0.685600 +vn 0.397700 -0.826800 0.397700 +vn 0.556400 -0.617200 0.556400 +vn 0.696800 -0.169700 0.696800 +vn 0.241900 -0.516200 0.821600 +vn 0.187800 -0.750500 0.633600 +vn 0.821600 -0.516200 0.241900 +vn 0.633600 -0.750500 0.187800 +vn 0.487200 -0.242100 0.839100 +vn 0.839100 -0.242100 0.487200 +vn -0.354800 0.865000 -0.354800 +vn -0.767900 0.633100 -0.097600 +vn -0.097600 0.633100 -0.767900 +vn -0.520200 0.833700 -0.185200 +vn -0.185300 0.833700 -0.520200 +vn -0.376600 0.317100 -0.870400 +vn -0.870400 0.317100 -0.376600 +vn -0.465800 0.635800 0.615500 +vn -0.391200 0.604700 0.693800 +vn -0.380800 0.625600 0.680900 +vn -0.403100 0.643700 0.650600 +vn -0.410000 0.862700 0.296000 +vn 0.182500 0.934400 -0.305800 +vn 0.225900 0.850300 -0.475300 +vn 0.206300 0.792600 -0.573800 +vn 0.288700 0.481400 -0.827600 +vn 0.162100 0.959600 -0.230200 +vn -0.522600 0.472100 0.709900 +vn 0.619900 0.480800 -0.620100 +vn 0.159300 0.110600 -0.981000 +vn -0.593200 -0.541800 -0.595400 +vn -0.983200 0.021900 0.181300 +vn -0.592500 -0.543200 -0.594900 +vn -0.561500 -0.612300 -0.556600 +vn 0.451300 0.497600 0.740800 +vn 0.909300 0.341800 0.237400 +vn 0.925100 0.303300 -0.228400 +vn -0.953900 -0.175300 0.243500 +vn 0.300500 0.335000 0.893000 +vn -0.328300 -0.884900 -0.330500 +vn 0.323300 -0.119900 -0.938700 +vn 0.954300 -0.025000 -0.297900 +vn -0.947700 0.308100 0.083600 +vn 0.264800 -0.312900 -0.912100 +vn -0.302600 0.268200 0.914600 +vn -0.564000 -0.607900 -0.558900 +vn 0.770000 0.489100 0.409800 +vn -0.920200 -0.362300 0.148300 +vn 0.918500 0.270900 -0.288200 +vn 0.714300 -0.518300 0.470300 +vn -0.603400 0.524900 -0.600400 +vn 0.508100 -0.451800 0.733300 +vn -0.637000 0.437500 -0.634700 +vn 0.209900 0.259600 -0.942600 +vn -0.312400 -0.012000 0.949900 +vn -0.636600 0.438700 -0.634200 +vn 0.750100 -0.456500 0.478600 +vn -0.481600 -0.119800 0.868200 +vn 0.411400 0.066400 -0.909000 +vn -0.957800 0.260300 0.121600 +vn 0.903200 -0.033600 -0.427900 +vn 0.494700 -0.514300 0.700500 +vn -0.603400 0.524800 -0.600400 +vn 0.251000 0.188400 -0.949500 +vn -0.440300 -0.020600 0.897600 +vn -0.705100 0.001500 0.709100 +vn 0.412300 -0.564500 0.715100 +vn -0.563100 0.607400 -0.560400 +vn 0.591000 -0.733800 0.335000 +vn -0.942700 0.211700 0.257800 +vn 0.869300 -0.253700 -0.424200 +vn 0.356400 -0.725500 0.588800 +vn -0.562900 0.607700 -0.560200 +vn 0.007900 -0.999900 0.009700 +vn 0.001500 -1.000000 0.002700 +vn 0.749400 0.255700 -0.610700 +vn -0.362600 -0.130500 0.922800 +vn -0.637300 0.451100 0.624800 +vn 0.718100 -0.564600 0.406800 +vn -0.782100 0.330300 0.528400 +vn 0.963000 -0.182500 -0.198200 +vn 0.395300 0.572800 -0.718100 +vn 0.705800 -0.002400 -0.708400 +vn -0.049400 0.997500 -0.050900 +vn -0.017400 -0.999700 -0.015900 +vn 0.705100 -0.001500 -0.709100 +vn -0.049200 0.997500 -0.050800 +vn 0.621700 0.449000 -0.641800 +vn -0.017700 -0.999700 -0.016200 +vn -0.708300 -0.045700 -0.704400 +vn -0.708400 -0.043500 -0.704500 +vn 0.014600 -0.999800 0.016100 +vn -0.431100 0.793200 -0.430200 +vn -0.715100 0.575500 0.396800 +vn -0.705800 0.002400 0.708400 +vn 0.014600 -0.999800 0.016200 +vn 0.841300 -0.438800 -0.315700 +vn 0.762200 0.585200 -0.276700 +vn 0.419100 -0.879600 -0.225100 +vn -0.110900 -0.497600 0.860300 +vn 0.041500 0.840100 0.540900 +vn -0.119800 -0.889500 0.440900 +vn 0.358100 0.826900 0.433600 +vn -0.559300 -0.613400 -0.557600 +vn -0.026100 -0.410600 0.911400 +vn -0.913400 0.394900 0.098700 +vn -0.244400 -0.961200 0.127900 +vn 0.139800 0.457000 -0.878400 +vn 0.592100 0.655600 0.468600 +vn 0.920300 -0.391200 0.001600 +vn 0.708700 0.036100 -0.704600 +vn -0.826400 -0.040600 0.561600 +vn 0.844200 -0.293000 -0.448800 +vn -0.887800 0.193000 0.417700 +vn 0.412800 0.823000 0.390200 +vn -0.559300 -0.612700 -0.558400 +vn -0.466900 -0.323200 0.823100 +vn 0.436000 0.220300 -0.872600 +vn -0.664500 0.376700 -0.645400 +vn -0.647500 0.375100 -0.663400 +vn -0.670900 -0.322000 -0.668000 +vn -0.060700 0.998100 0.003900 +vn 0.564300 0.005200 -0.825500 +vn -0.706900 -0.004300 0.707300 +vn -0.033200 0.998700 -0.038600 +vn -0.707500 -0.044500 0.705300 +vn 0.695300 -0.199400 0.690500 +vn -0.150700 0.977500 -0.147500 +vn 0.680000 0.282800 0.676500 +vn -0.660400 0.028200 0.750400 +vn -0.670800 -0.321900 -0.668200 +vn 0.749500 0.033000 -0.661100 +vn 0.704600 -0.039700 -0.708500 +vn 0.680800 0.282900 0.675600 +vn 0.003000 -1.000000 0.001300 +vn 0.005000 -1.000000 -0.001300 +vn 0.806600 0.007400 -0.591100 +vn -0.583200 -0.002900 0.812300 +vn -0.681800 0.199500 0.703800 +vn 0.697800 -0.199000 0.688100 +vn -0.633100 -0.050900 0.772400 +vn 0.776200 -0.048000 -0.628700 +vn -0.660500 0.365300 -0.655900 +vn -0.663100 0.365300 -0.653300 +vn -0.684500 0.184400 0.705300 +vn 0.011900 -0.999900 0.010300 +vn 0.695100 0.211400 -0.687100 +vn -0.153700 0.977500 -0.144800 +vn 0.696700 0.196600 -0.689900 +vn 0.014500 -0.999900 0.008300 +g Dragon_New_Cylinder_Material +s off +f 22/1/1 2/2/1 4/3/1 23/4/1 +f 23/4/2 4/3/2 6/5/2 33/6/2 +f 33/6/3 6/5/3 8/7/3 43/8/3 +f 43/9/4 8/10/4 10/11/4 53/12/4 +f 136/13/5 135/14/5 134/15/5 133/16/5 137/17/5 138/18/5 +f 63/19/6 12/20/6 2/21/6 22/22/6 +f 53/12/7 10/11/7 12/20/7 63/19/7 +f 3/23/8 5/24/8 87/25/8 86/26/8 +f 9/27/9 62/28/9 72/29/9 11/30/9 +f 62/28/10 61/31/10 71/32/10 72/29/10 +f 61/31/11 60/33/11 70/34/11 71/32/11 +f 60/33/12 59/35/12 69/36/12 70/34/12 +f 119/37/13 58/38/13 68/39/13 120/40/13 +f 58/38/14 57/41/14 67/42/14 68/39/14 +f 131/43/15 56/44/15 66/45/15 132/46/15 +f 56/44/16 55/47/16 65/48/16 66/45/16 +f 83/49/17 54/50/17 64/51/17 84/52/17 +f 77/53/18 53/12/18 63/19/18 78/54/18 +f 11/30/19 72/29/19 13/55/19 1/56/19 +f 72/29/20 71/32/20 14/57/20 13/55/20 +f 71/32/21 70/34/21 15/58/21 14/57/21 +f 70/34/22 69/36/22 16/59/22 15/58/22 +f 120/40/23 68/39/23 17/60/23 115/61/23 +f 68/39/24 67/42/24 18/62/24 17/60/24 +f 132/46/25 66/45/25 19/63/25 127/64/25 +f 66/45/26 65/48/26 20/65/26 19/63/26 +f 84/52/27 64/51/27 21/66/27 79/67/27 +f 78/54/28 63/19/28 22/22/28 73/68/28 +f 7/69/29 52/70/29 62/28/29 9/27/29 +f 52/70/30 51/71/30 61/31/30 62/28/30 +f 51/71/31 50/72/31 60/33/31 61/31/31 +f 50/72/32 49/73/32 59/35/32 60/33/32 +f 118/74/33 48/75/33 58/38/33 119/37/33 +f 48/75/34 47/76/34 57/41/34 58/38/34 +f 130/77/35 46/78/35 56/44/35 131/43/35 +f 46/78/36 45/79/36 55/47/36 56/44/36 +f 82/80/37 44/81/37 54/50/37 83/49/37 +f 76/82/38 43/9/38 53/12/38 77/53/38 +f 5/24/39 42/83/39 52/84/39 7/85/39 +f 42/83/40 41/86/40 51/87/40 52/84/40 +f 41/86/41 40/88/41 50/89/41 51/87/41 +f 40/88/42 39/90/42 49/91/42 50/89/42 +f 117/92/43 38/93/43 48/94/43 118/95/43 +f 38/93/44 37/96/44 47/97/44 48/94/44 +f 130/98/45 129/99/45 223/100/45 224/101/45 +f 36/102/46 35/103/46 45/104/46 46/105/46 +f 81/106/47 34/107/47 44/108/47 82/109/47 +f 75/110/48 33/6/48 43/8/48 76/111/48 +f 3/23/49 32/112/49 42/83/49 5/24/49 +f 32/112/50 31/113/50 41/86/50 42/83/50 +f 31/113/51 30/114/51 40/88/51 41/86/51 +f 30/114/52 29/115/52 39/90/52 40/88/52 +f 116/116/53 28/117/53 38/93/53 117/92/53 +f 28/117/54 27/118/54 37/96/54 38/93/54 +f 128/119/55 26/120/55 36/102/55 129/121/55 +f 26/120/56 25/122/56 35/103/56 36/102/56 +f 80/123/57 24/124/57 34/107/57 81/106/57 +f 74/125/58 23/4/58 33/6/58 75/110/58 +f 1/56/59 13/55/59 32/112/59 3/23/59 +f 13/55/60 14/57/60 31/113/60 32/112/60 +f 14/57/61 15/58/61 30/114/61 31/113/61 +f 15/58/62 16/59/62 29/115/62 30/114/62 +f 115/61/63 17/60/63 28/117/63 116/116/63 +f 17/60/64 18/62/64 27/118/64 28/117/64 +f 218/126/65 128/127/65 222/128/65 226/129/65 +f 19/63/66 20/65/66 25/122/66 26/120/66 +f 79/67/67 21/66/67 24/124/67 80/123/67 +f 73/130/68 22/1/68 23/4/68 74/125/68 +f 21/66/69 73/131/69 74/132/69 24/124/69 +f 24/124/70 74/132/70 75/133/70 34/107/70 +f 34/107/71 75/133/71 76/134/71 44/108/71 +f 44/81/72 76/135/72 77/136/72 54/50/72 +f 64/51/73 78/137/73 73/131/73 21/66/73 +f 54/50/74 77/136/74 78/137/74 64/51/74 +f 20/65/75 79/67/75 80/123/75 25/122/75 +f 25/122/76 80/123/76 81/106/76 35/103/76 +f 35/103/77 81/106/77 82/109/77 45/104/77 +f 45/79/78 82/80/78 83/49/78 55/47/78 +f 65/48/79 84/52/79 79/67/79 20/65/79 +f 55/47/80 83/49/80 84/52/80 65/48/80 +f 90/138/81 85/139/81 91/140/81 96/141/81 +f 9/27/82 11/30/82 90/138/82 89/142/82 +f 1/56/83 3/23/83 86/26/83 85/139/83 +f 5/24/84 7/85/84 88/143/84 87/25/84 +f 11/30/85 1/56/85 85/139/85 90/138/85 +f 7/69/86 9/27/86 89/142/86 88/144/86 +f 95/145/87 96/141/87 102/146/87 101/147/87 +f 88/144/88 89/142/88 95/145/88 94/148/88 +f 86/26/89 87/25/89 93/149/89 92/150/89 +f 89/142/90 90/138/90 96/141/90 95/145/90 +f 87/25/91 88/143/91 94/151/91 93/149/91 +f 85/139/92 86/26/92 92/150/92 91/140/92 +f 102/146/93 97/152/93 103/153/93 108/154/93 +f 93/149/94 94/151/94 100/155/94 99/156/94 +f 91/140/95 92/150/95 98/157/95 97/152/95 +f 96/141/96 91/140/96 97/152/96 102/146/96 +f 94/148/97 95/145/97 101/147/97 100/158/97 +f 92/150/98 93/149/98 99/156/98 98/157/98 +f 107/159/99 108/154/99 114/160/99 113/161/99 +f 100/158/100 101/147/100 107/159/100 106/162/100 +f 98/157/101 99/156/101 105/163/101 104/164/101 +f 101/147/102 102/146/102 108/154/102 107/159/102 +f 99/156/103 100/155/103 106/165/103 105/163/103 +f 97/152/104 98/157/104 104/164/104 103/153/104 +f 110/166/105 111/167/105 134/168/105 135/169/105 +f 105/163/106 106/165/106 112/170/106 111/167/106 +f 103/153/107 104/164/107 110/166/107 109/171/107 +f 108/154/108 103/153/108 109/171/108 114/160/108 +f 106/162/109 107/159/109 113/161/109 112/172/109 +f 104/164/110 105/163/110 111/167/110 110/166/110 +f 287/173/111 117/174/111 291/175/111 295/176/111 +f 121/177/112 116/116/112 117/92/112 122/178/112 +f 285/179/113 115/180/113 289/181/113 293/182/113 +f 123/183/114 118/74/114 119/37/114 124/184/114 +f 125/185/115 120/40/115 115/61/115 126/186/115 +f 124/184/116 119/37/116 120/40/116 125/185/116 +f 59/35/117 124/187/117 125/188/117 69/36/117 +f 69/36/118 125/188/118 126/189/118 16/59/118 +f 49/73/119 123/190/119 124/187/119 59/35/119 +f 39/90/120 122/191/120 123/192/120 49/91/120 +f 29/115/121 121/193/121 122/191/121 39/90/121 +f 16/59/122 126/189/122 121/193/122 29/115/122 +f 18/62/123 127/64/123 128/119/123 27/118/123 +f 27/118/124 128/119/124 129/121/124 37/96/124 +f 37/96/125 129/121/125 130/194/125 47/97/125 +f 47/76/126 130/77/126 131/43/126 57/41/126 +f 67/42/127 132/46/127 127/64/127 18/62/127 +f 57/41/128 131/43/128 132/46/128 67/42/128 +f 113/161/129 114/160/129 138/195/129 137/196/129 +f 111/167/130 112/170/130 133/197/130 134/168/130 +f 109/171/131 110/166/131 135/169/131 136/198/131 +f 114/160/132 109/171/132 136/198/132 138/195/132 +f 112/172/133 113/161/133 137/196/133 133/199/133 +f 216/200/134 211/201/134 142/202/134 162/203/134 +f 210/204/135 205/205/135 139/206/135 152/207/135 +f 58/208/136 147/209/136 206/210/136 148/211/136 57/212/136 +f 206/210/137 207/213/137 149/214/137 148/211/137 +f 207/213/138 208/215/138 150/216/138 149/214/138 +f 208/215/139 209/217/139 151/218/139 150/216/139 +f 209/217/140 210/204/140 152/207/140 151/218/140 +f 67/219/141 157/220/141 212/221/141 158/222/141 68/223/141 +f 212/221/142 213/224/142 159/225/142 158/222/142 +f 213/224/143 214/226/143 160/227/143 159/225/143 +f 214/226/144 215/228/144 161/229/144 160/227/144 +f 215/228/145 216/200/145 162/203/145 161/229/145 +f 172/230/146 193/231/146 171/232/146 +f 10/11/147 8/10/147 164/233/147 163/234/147 +f 163/234/148 171/232/148 186/235/148 184/236/148 +f 173/237/149 194/238/149 174/239/149 +f 12/20/150 10/11/150 163/234/150 165/240/150 +f 2/21/151 12/20/151 165/240/151 166/241/151 +f 173/237/152 171/232/152 193/231/152 194/238/152 +f 6/5/153 4/3/153 167/242/153 169/243/153 +f 4/3/154 2/2/154 168/244/154 167/242/154 +f 8/7/155 6/5/155 169/243/155 170/245/155 +f 178/246/156 177/247/156 192/248/156 +f 177/247/157 175/249/157 191/250/157 192/248/157 +f 170/245/158 169/243/158 177/247/158 178/246/158 +f 167/242/159 168/244/159 176/251/159 175/249/159 +f 166/241/160 165/240/160 173/237/160 174/239/160 +f 191/250/161 175/249/161 176/251/161 +f 163/234/162 164/233/162 172/230/162 171/232/162 +f 169/243/163 167/242/163 175/249/163 177/247/163 +f 76/252/164 182/253/164 180/254/164 43/255/164 +f 22/256/165 179/257/165 181/258/165 73/259/165 +f 184/260/166 186/261/166 190/262/166 188/263/166 +f 173/237/167 165/240/167 183/264/167 185/265/167 +f 165/240/168 163/234/168 184/236/168 183/264/168 +f 171/232/169 173/237/169 185/265/169 186/235/169 +f 187/263/170 188/263/170 190/262/170 189/263/170 +f 183/266/171 184/260/171 188/263/171 187/263/171 +f 185/267/172 183/266/172 187/263/172 189/263/172 +f 186/261/173 185/267/173 189/263/173 190/262/173 +f 203/268/174 204/269/174 195/270/174 196/271/174 +f 196/271/175 195/270/175 197/272/175 198/273/175 +f 198/273/176 197/272/176 199/274/176 200/275/176 +f 200/275/177 199/274/177 201/276/177 202/277/177 +f 194/278/178 193/279/178 202/277/178 201/276/178 +f 164/280/179 200/275/179 202/277/179 172/281/179 +f 8/282/180 198/273/180 200/275/180 164/280/180 +f 174/283/181 201/276/181 199/274/181 166/284/181 +f 166/284/182 199/274/182 197/272/182 2/285/182 +f 193/279/183 172/281/183 202/277/183 +f 194/278/184 201/276/184 174/283/184 +f 192/286/185 191/287/185 204/269/185 203/268/185 +f 178/288/186 203/268/186 196/271/186 170/289/186 +f 168/290/187 195/270/187 204/269/187 176/291/187 +f 192/286/188 203/268/188 178/288/188 +f 176/291/189 204/269/189 191/287/189 +f 2/285/190 197/272/190 195/270/190 168/290/190 +f 170/289/191 196/271/191 198/273/191 8/282/191 +f 144/292/192 143/293/192 210/204/192 209/217/192 +f 145/294/193 144/292/193 209/217/193 208/215/193 +f 146/295/194 145/294/194 208/215/194 207/213/194 +f 147/209/195 146/295/195 207/213/195 206/210/195 +f 143/293/196 140/296/196 205/205/196 210/204/196 +f 154/297/197 153/298/197 216/200/197 215/228/197 +f 155/299/198 154/297/198 215/228/198 214/226/198 +f 156/300/199 155/299/199 214/226/199 213/224/199 +f 157/220/200 156/300/200 213/224/200 212/221/200 +f 153/298/201 141/301/201 211/201/201 216/200/201 +f 19/63/202 217/302/202 127/64/202 +f 130/303/203 220/304/203 46/105/203 +f 46/105/204 220/304/204 219/305/204 36/102/204 +f 129/121/205 36/102/205 219/305/205 +f 26/120/206 218/306/206 217/302/206 19/63/206 +f 128/119/207 218/306/207 26/120/207 +f 223/100/208 227/307/208 235/308/208 231/309/208 +f 221/310/209 225/311/209 233/312/209 229/313/209 +f 220/314/210 130/315/210 224/316/210 228/317/210 +f 128/127/211 127/318/211 221/319/211 222/128/211 +f 217/320/212 218/126/212 226/129/212 225/311/212 +f 127/321/213 217/320/213 225/311/213 221/310/213 +f 129/99/214 219/322/214 227/307/214 223/100/214 +f 219/322/215 220/314/215 228/317/215 227/307/215 +f 230/323/216 229/324/216 237/325/216 238/326/216 +f 233/312/217 234/327/217 242/328/217 241/329/217 +f 227/307/218 228/317/218 236/330/218 235/308/218 +f 224/101/219 223/100/219 231/309/219 232/331/219 +f 226/129/220 222/128/220 230/323/220 234/327/220 +f 228/317/221 224/316/221 232/332/221 236/330/221 +f 225/311/222 226/129/222 234/327/222 233/312/222 +f 222/128/223 221/319/223 229/324/223 230/323/223 +f 244/333/224 240/334/224 248/335/224 252/336/224 +f 242/328/225 238/326/225 246/337/225 250/338/225 +f 229/313/226 233/312/226 241/329/226 237/339/226 +f 231/309/227 235/308/227 243/340/227 239/341/227 +f 235/308/228 236/330/228 244/333/228 243/340/228 +f 232/331/229 231/309/229 239/341/229 240/342/229 +f 234/327/230 230/323/230 238/326/230 242/328/230 +f 236/330/231 232/332/231 240/334/231 244/333/231 +f 248/343/232 247/344/232 255/345/232 256/346/232 +f 251/347/233 252/336/233 260/348/233 259/349/233 +f 241/329/234 242/328/234 250/338/234 249/350/234 +f 238/326/235 237/325/235 245/351/235 246/337/235 +f 237/339/236 241/329/236 249/350/236 245/352/236 +f 239/341/237 243/340/237 251/347/237 247/344/237 +f 243/340/238 244/333/238 252/336/238 251/347/238 +f 240/342/239 239/341/239 247/344/239 248/343/239 +f 263/353/240 255/345/240 269/354/240 273/354/240 +f 253/355/241 257/356/241 265/357/241 261/358/241 +f 250/338/242 246/337/242 254/359/242 258/360/242 +f 252/336/243 248/335/243 256/361/243 260/348/243 +f 249/350/244 250/338/244 258/360/244 257/356/244 +f 246/337/245 245/351/245 253/362/245 254/359/245 +f 245/352/246 249/350/246 257/356/246 253/355/246 +f 247/344/247 251/347/247 259/349/247 255/345/247 +f 262/363/248 261/358/248 265/357/248 266/364/248 +f 264/365/249 263/353/249 267/366/249 268/367/249 +f 259/349/250 260/348/250 268/367/250 267/366/250 +f 256/346/251 255/345/251 263/353/251 264/365/251 +f 266/364/252 258/360/252 271/368/252 275/369/252 +f 260/348/253 256/361/253 264/365/253 268/367/253 +f 257/356/254 258/360/254 266/364/254 265/357/254 +f 254/359/255 253/362/255 261/358/255 262/363/255 +f 270/370/256 274/371/256 282/372/256 278/370/256 +f 272/373/257 276/373/257 284/373/257 280/373/257 +f 255/345/258 259/349/258 270/370/258 269/354/258 +f 267/366/259 263/353/259 273/354/259 274/371/259 +f 254/359/260 262/363/260 276/373/260 272/373/260 +f 258/360/261 254/359/261 272/373/261 271/368/261 +f 259/349/262 267/366/262 274/371/262 270/370/262 +f 262/363/263 266/364/263 275/369/263 276/373/263 +f 277/354/264 278/370/264 282/372/264 281/354/264 +f 279/368/265 280/373/265 284/373/265 283/374/265 +f 274/371/266 273/354/266 281/354/266 282/372/266 +f 269/354/267 270/370/267 278/370/267 277/354/267 +f 275/369/268 271/368/268 279/368/268 283/374/268 +f 273/354/269 269/354/269 277/354/269 281/354/269 +f 276/373/270 275/369/270 283/374/270 284/373/270 +f 271/368/267 272/373/267 280/373/267 279/368/267 +f 123/375/271 122/178/271 287/376/271 288/377/271 +f 123/375/272 288/377/272 118/378/272 +f 117/92/273 287/376/273 122/178/273 +f 121/177/274 126/186/274 285/379/274 286/380/274 +f 115/61/275 285/379/275 126/186/275 +f 121/177/276 286/380/276 116/116/276 +f 292/381/277 296/382/277 304/383/277 300/384/277 +f 290/385/278 294/386/278 302/387/278 298/388/278 +f 286/389/279 285/179/279 293/182/279 294/386/279 +f 117/390/280 118/391/280 292/381/280 291/392/280 +f 116/393/281 286/389/281 294/386/281 290/385/281 +f 115/180/282 116/394/282 290/395/282 289/181/282 +f 118/391/283 288/396/283 296/382/283 292/381/283 +f 288/396/284 287/173/284 295/176/284 296/382/284 +f 297/397/285 298/398/285 306/399/285 305/400/285 +f 302/387/286 301/401/286 309/402/286 310/403/286 +f 296/382/287 295/176/287 303/404/287 304/383/287 +f 291/392/288 292/381/288 300/384/288 299/405/288 +f 293/406/289 289/407/289 297/408/289 301/409/289 +f 295/176/290 291/175/290 299/410/290 303/404/290 +f 294/386/291 293/182/291 301/401/291 302/387/291 +f 289/181/292 290/395/292 298/398/292 297/397/292 +f 305/400/293 306/399/293 310/403/293 309/402/293 +f 307/411/294 308/412/294 312/413/294 311/414/294 +f 307/411/295 311/414/295 317/415/295 318/416/295 +f 300/384/296 304/383/296 312/413/296 308/412/296 +f 304/383/297 303/404/297 311/414/297 312/413/297 +f 299/405/298 300/384/298 308/412/298 307/411/298 +f 301/401/299 297/397/299 305/400/299 309/402/299 +f 299/405/300 307/411/300 318/416/300 314/417/300 +f 315/418/301 316/419/301 324/420/301 323/421/301 +f 320/422/302 319/423/302 331/424/302 332/425/302 +f 298/388/303 302/387/303 316/419/303 315/418/303 +f 302/387/304 310/403/304 320/422/304 316/419/304 +f 310/403/305 306/399/305 319/423/305 320/422/305 +f 311/414/306 303/404/306 313/426/306 317/415/306 +f 306/399/307 298/398/307 315/427/307 319/423/307 +f 303/404/308 299/410/308 314/428/308 313/426/308 +f 323/421/309 324/420/309 328/429/309 327/430/309 +f 321/431/310 322/432/310 326/433/310 325/434/310 +f 317/415/311 313/426/311 321/431/311 325/434/311 +f 316/419/312 320/422/312 328/429/312 324/420/312 +f 328/429/313 320/422/313 332/425/313 336/435/313 +f 313/426/314 314/428/314 322/432/314 321/431/314 +f 314/417/315 318/416/315 326/433/315 322/432/315 +f 319/423/316 315/427/316 323/421/316 327/430/316 +f 332/436/317 331/437/317 335/438/317 336/439/317 +f 330/440/318 329/441/318 333/442/318 334/443/318 +f 326/433/319 318/416/319 330/440/319 334/443/319 +f 327/444/320 328/445/320 336/439/320 335/438/320 +f 319/446/321 327/444/321 335/438/321 331/437/321 +f 318/416/322 317/415/322 329/441/322 330/440/322 +f 317/415/323 325/434/323 333/442/323 329/441/323 +f 325/434/324 326/433/324 334/443/324 333/442/324 diff --git a/mods/mylandscaping/models/mylandscaping_column_t_sphere.obj b/mods/mylandscaping/models/mylandscaping_column_t_sphere.obj new file mode 100644 index 00000000..a75e4be8 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_column_t_sphere.obj @@ -0,0 +1,271 @@ +# Blender v2.76 (sub 1) OBJ File: 'Column_toppers.blend' +# www.blender.org +o Icosphere +v 0.000000 -0.426241 0.100833 +v 0.281909 -0.165211 0.242932 +v -0.107678 -0.132448 0.365205 +v -0.348458 -0.218220 0.045094 +v -0.107678 -0.303995 -0.275016 +v 0.281909 -0.271232 -0.152743 +v 0.107678 0.204141 0.275016 +v -0.281909 0.171378 0.152743 +v -0.281909 0.065357 -0.242932 +v 0.107678 0.032595 -0.365205 +v 0.348458 0.118366 -0.045094 +v -0.000000 0.326387 -0.100833 +v -0.063291 -0.319624 0.273929 +v 0.165701 -0.338881 0.202059 +v 0.102411 -0.166194 0.357454 +v 0.331403 -0.247769 0.053012 +v 0.165701 -0.401198 -0.030511 +v -0.204818 -0.370039 0.085774 +v -0.268111 -0.197352 0.241167 +v -0.063291 -0.420456 -0.102381 +v -0.268111 -0.298185 -0.135144 +v 0.102411 -0.329344 -0.251430 +v 0.370521 -0.018768 0.116286 +v 0.370521 -0.081086 -0.116286 +v -0.000000 0.050906 0.376314 +v 0.228995 0.031649 0.304444 +v -0.370521 -0.018768 0.116286 +v -0.228995 0.031649 0.304444 +v -0.228995 -0.131502 -0.304444 +v -0.370521 -0.081086 -0.116286 +v 0.228995 -0.131502 -0.304444 +v 0.000000 -0.150760 -0.376314 +v 0.268111 0.198331 0.135144 +v -0.102411 0.229490 0.251430 +v -0.331403 0.147915 -0.053012 +v -0.102411 0.066340 -0.357454 +v 0.268111 0.097499 -0.241167 +v 0.063291 0.320602 0.102381 +v 0.204818 0.270185 -0.085774 +v -0.165701 0.301344 0.030511 +v -0.165701 0.239027 -0.202059 +v 0.063291 0.219770 -0.273929 +vt 0.500000 0.562412 +vt 1.137984 0.098895 +vt 0.256317 -0.187581 +vt -0.288588 -0.258198 +vt 0.036483 -0.863350 +vt 0.500000 -0.375973 +vt -0.288595 0.562412 +vt 0.256317 1.312405 +vt 1.137984 1.025929 +vt 0.036481 0.412631 +vt 0.085418 -0.258199 +vt 0.894303 -0.375975 +vt 0.500000 0.412631 +vt 0.500000 -0.258192 +vt -0.249995 -0.375973 +vt -0.532284 -0.375973 +vt -0.381678 0.412631 +vt 1.585411 -0.258198 +vt 1.381679 0.412631 +vt -0.713525 0.412631 +vt 0.963519 0.412631 +vt 1.288588 -0.258198 +vt 1.713525 0.412631 +vt 0.914582 -0.713562 +vt 1.532284 -0.187584 +vt 0.743683 -0.187581 +vt -0.585411 -0.226176 +vt 0.105697 -0.651106 +vt -0.137984 0.098895 +vt 1.288588 1.083460 +vt 0.500000 1.201235 +vt 0.963517 1.688612 +vt 0.914582 1.083461 +vt 0.105697 1.201238 +vt 0.743683 1.688613 +vt 0.500000 1.083455 +vt 1.249995 1.201235 +vt 0.500000 1.688608 +vt 1.288594 0.562412 +vt 0.743683 1.312405 +vt 1.532284 1.312407 +vt 0.914582 1.838386 +vt -0.137984 1.025929 +vt 0.105697 1.775929 +vt -0.585411 1.351000 +vt -0.775972 0.562412 +vt -0.288588 1.083460 +vt 0.036483 1.688612 +vt -0.249995 1.201235 +vt 1.532284 1.201235 +vt -0.585411 1.083460 +vt 1.249995 -0.375973 +vt 0.894303 1.775929 +vt 1.585411 1.351000 +vt 0.256317 -0.863351 +vt -0.532284 1.312407 +vt 0.085418 1.838386 +vt 0.500000 -0.863346 +vt -0.532284 -0.187584 +vt 0.085418 -0.713562 +vt 0.963517 -0.863350 +vt 1.775972 0.562412 +vt 0.894303 -0.651106 +vt 1.585411 -0.226176 +vn 0.102400 -0.829800 0.548600 +vn 0.700200 -0.569800 0.430200 +vn -0.268000 -0.861000 0.432300 +vn -0.268000 -0.961800 0.056100 +vn 0.102400 -0.992900 -0.060200 +vn 0.905000 -0.249800 0.344400 +vn 0.024700 -0.074900 0.996900 +vn -0.889700 -0.237600 0.389900 +vn -0.574600 -0.512900 -0.637800 +vn 0.534600 -0.520500 -0.665800 +vn 0.802600 0.029600 0.595800 +vn -0.306600 0.122900 0.943900 +vn -0.992100 -0.121300 0.032500 +vn -0.306600 -0.365500 -0.878900 +vn 0.802600 -0.272300 -0.530700 +vn 0.408900 0.801800 0.435800 +vn -0.471300 0.790100 0.392000 +vn -0.700200 0.569800 -0.430200 +vn 0.038500 0.445400 -0.894500 +vn 0.724000 0.588700 -0.359400 +vn 0.268000 0.861000 -0.432300 +vn 0.491100 0.675200 -0.550300 +vn 0.408900 0.476500 -0.778300 +vn -0.102400 0.829800 -0.548600 +vn -0.187600 0.618200 -0.763300 +vn -0.471300 0.488200 -0.734500 +vn -0.331300 0.911400 -0.244200 +vn -0.607100 0.767600 -0.205700 +vn -0.700200 0.708500 0.087600 +vn -0.102400 0.992900 0.060200 +vn -0.187600 0.917000 0.352000 +vn 0.038500 0.833000 0.552000 +vn 0.268000 0.961800 -0.056100 +vn 0.491100 0.859900 0.139000 +vn 0.724000 0.689600 0.016800 +vn 0.889700 0.237600 -0.389900 +vn 0.794700 0.031800 -0.606200 +vn 0.574600 0.125300 -0.808800 +vn -0.024700 0.074900 -0.996900 +vn -0.303500 -0.060600 -0.950900 +vn -0.534600 0.117800 -0.836900 +vn -0.905000 0.249800 -0.344400 +vn -0.982200 0.181200 -0.048600 +vn -0.905000 0.388500 0.173400 +vn -0.534600 0.520500 0.665800 +vn -0.303500 0.423000 0.853800 +vn -0.024700 0.563300 0.825900 +vn 0.574600 0.512900 0.637800 +vn 0.794700 0.330600 0.509100 +vn 0.889700 0.400700 0.218800 +vn 0.306600 -0.122900 -0.943900 +vn 0.303500 -0.423000 -0.853800 +vn 0.024700 -0.563300 -0.825900 +vn -0.802600 -0.029600 -0.595800 +vn -0.794700 -0.330600 -0.509100 +vn -0.889700 -0.400700 -0.218800 +vn -0.802600 0.272300 0.530700 +vn -0.794700 -0.031800 0.606200 +vn -0.574600 -0.125300 0.808800 +vn 0.306600 0.365500 0.878900 +vn 0.303500 0.060600 0.950900 +vn 0.534600 -0.117800 0.836900 +vn 0.992100 0.121300 -0.032500 +vn 0.982200 -0.181200 0.048600 +vn 0.905000 -0.388500 -0.173400 +vn 0.471300 -0.790100 -0.392000 +vn 0.187600 -0.917000 -0.352000 +vn -0.038500 -0.833000 -0.552000 +vn -0.408900 -0.801800 -0.435800 +vn -0.491100 -0.859900 -0.139000 +vn -0.724000 -0.689600 -0.016800 +vn -0.724000 -0.588700 0.359400 +vn -0.491100 -0.675200 0.550300 +vn -0.408900 -0.476500 0.778300 +vn 0.700200 -0.708500 -0.087600 +vn 0.607100 -0.767600 0.205700 +vn 0.331300 -0.911400 0.244200 +vn -0.038500 -0.445400 0.894500 +vn 0.187600 -0.618200 0.763300 +vn 0.471300 -0.488200 0.734500 +g Icosphere_Icosphere_None +s off +f 1/1/1 14/2/1 13/3/1 +f 2/4/2 14/5/2 16/6/2 +f 1/1/3 13/3/3 18/7/3 +f 1/1/4 18/7/4 20/8/4 +f 1/1/5 20/8/5 17/9/5 +f 2/4/6 16/6/6 23/10/6 +f 3/11/7 15/12/7 25/13/7 +f 4/14/8 19/15/8 27/10/8 +f 5/11/9 21/16/9 29/17/9 +f 6/18/10 22/12/10 31/19/10 +f 2/4/11 23/10/11 26/20/11 +f 3/11/12 25/13/12 28/17/12 +f 4/14/13 27/10/13 30/21/13 +f 5/11/14 29/17/14 32/13/14 +f 6/22/15 31/23/15 24/21/15 +f 7/24/16 33/25/16 38/26/16 +f 8/27/17 34/28/17 40/29/17 +f 9/30/18 35/31/18 41/32/18 +f 10/33/19 36/34/19 42/35/19 +f 11/36/20 37/37/20 39/38/20 +f 39/39/21 42/40/21 12/1/21 +f 39/39/22 37/41/22 42/40/22 +f 37/41/23 10/42/23 42/40/23 +f 42/40/24 41/43/24 12/1/24 +f 42/40/25 36/44/25 41/43/25 +f 36/44/26 9/45/26 41/43/26 +f 41/43/27 40/29/27 12/1/27 +f 41/43/28 35/46/28 40/29/28 +f 35/31/29 8/47/29 40/48/29 +f 40/29/30 38/26/30 12/1/30 +f 40/29/31 34/28/31 38/26/31 +f 34/34/32 7/33/32 38/35/32 +f 38/26/33 39/39/33 12/1/33 +f 38/26/34 33/25/34 39/39/34 +f 33/49/35 11/36/35 39/38/35 +f 24/21/36 37/37/36 11/36/36 +f 24/21/37 31/23/37 37/37/37 +f 31/19/38 10/33/38 37/50/38 +f 32/13/39 36/34/39 10/33/39 +f 32/13/40 29/17/40 36/34/40 +f 29/17/41 9/51/41 36/34/41 +f 30/21/42 35/31/42 9/30/42 +f 30/21/43 27/10/43 35/31/43 +f 27/10/44 8/47/44 35/31/44 +f 28/17/45 34/34/45 8/51/45 +f 28/17/46 25/13/46 34/34/46 +f 25/13/47 7/33/47 34/34/47 +f 26/19/48 33/50/48 7/33/48 +f 26/20/49 23/10/49 33/49/49 +f 23/10/50 11/36/50 33/49/50 +f 31/19/51 32/13/51 10/33/51 +f 31/19/52 22/12/52 32/13/52 +f 22/12/53 5/11/53 32/13/53 +f 29/23/54 30/21/54 9/30/54 +f 29/23/55 21/52/55 30/21/55 +f 21/52/56 4/14/56 30/21/56 +f 27/10/57 28/20/57 8/47/57 +f 27/10/58 19/15/58 28/20/58 +f 19/16/59 3/11/59 28/17/59 +f 25/13/60 26/19/60 7/33/60 +f 25/13/61 15/12/61 26/19/61 +f 15/12/62 2/18/62 26/19/62 +f 23/10/63 24/21/63 11/36/63 +f 23/10/64 16/6/64 24/21/64 +f 16/6/65 6/22/65 24/21/65 +f 17/9/66 22/53/66 6/54/66 +f 17/9/67 20/8/67 22/53/67 +f 20/55/68 5/11/68 22/12/68 +f 20/8/69 21/56/69 5/57/69 +f 20/8/70 18/7/70 21/56/70 +f 18/58/71 4/14/71 21/52/71 +f 18/58/72 19/15/72 4/14/72 +f 18/7/73 13/3/73 19/59/73 +f 13/3/74 3/60/74 19/59/74 +f 16/6/75 17/61/75 6/22/75 +f 16/62/76 14/2/76 17/9/76 +f 14/2/77 1/1/77 17/9/77 +f 13/55/78 15/12/78 3/11/78 +f 13/3/79 14/2/79 15/63/79 +f 14/2/80 2/64/80 15/63/80 diff --git a/mods/mylandscaping/models/mylandscaping_column_t_suzanne.obj b/mods/mylandscaping/models/mylandscaping_column_t_suzanne.obj new file mode 100644 index 00000000..47bace02 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_column_t_suzanne.obj @@ -0,0 +1,2374 @@ +# Blender v2.76 (sub 1) OBJ File: 'Column_toppers.blend' +# www.blender.org +o Suzanne +v -0.176347 0.029570 0.068441 +v 0.068441 0.029570 -0.176347 +v -0.187248 -0.010958 0.092509 +v 0.092509 -0.010958 -0.187248 +v -0.181600 -0.048473 0.124385 +v 0.124385 -0.048473 -0.181600 +v -0.148463 -0.064888 0.048242 +v 0.048242 -0.064888 -0.148463 +v -0.162924 -0.024091 0.033780 +v 0.033781 -0.024091 -0.162924 +v -0.160906 0.023004 0.035798 +v 0.035798 0.023004 -0.160906 +v -0.137604 0.036675 0.015388 +v 0.015388 0.036675 -0.137604 +v -0.116716 0.001475 -0.003065 +v -0.003065 0.001475 -0.116716 +v -0.088418 -0.032487 -0.000994 +v -0.000993 -0.032487 -0.088418 +v -0.038208 0.030000 0.005504 +v 0.005504 0.030000 -0.038208 +v -0.075368 0.049537 0.003314 +v 0.003314 0.049537 -0.075368 +v -0.116302 0.061971 0.019205 +v 0.019206 0.061971 -0.116302 +v -0.111229 0.089796 0.041763 +v 0.041763 0.089796 -0.111229 +v -0.068990 0.097600 0.044661 +v 0.044661 0.097600 -0.068990 +v -0.026876 0.091464 0.060548 +v 0.060548 0.091464 -0.026876 +v -0.061802 0.109655 0.134902 +v 0.134902 0.109655 -0.061802 +v -0.095103 0.112509 0.101602 +v 0.101602 0.112509 -0.095103 +v -0.124484 0.096363 0.072221 +v 0.072221 0.096363 -0.124484 +v -0.149972 0.082692 0.094816 +v 0.094816 0.082692 -0.149972 +v -0.139522 0.085167 0.140235 +v 0.140235 0.085167 -0.139522 +v -0.120058 0.075478 0.185927 +v 0.185927 0.075478 -0.120058 +v -0.169736 0.008685 0.179961 +v 0.179961 0.008685 -0.169736 +v -0.177293 0.033552 0.137435 +v 0.137435 0.033552 -0.177293 +v -0.170741 0.053090 0.091532 +v 0.091532 0.053090 -0.170741 +v -0.176504 0.056642 0.090140 +v 0.090140 0.056642 -0.176504 +v -0.154479 0.088774 0.094680 +v 0.094680 0.088774 -0.154479 +v -0.127338 0.106750 0.069366 +v 0.069366 0.106750 -0.127338 +v -0.113154 0.097655 0.035468 +v 0.035468 0.097655 -0.113154 +v -0.117297 0.067299 0.009468 +v 0.009468 0.067299 -0.117297 +v -0.142040 0.039474 0.006581 +v 0.006581 0.039474 -0.142040 +v -0.154055 0.069075 0.042649 +v 0.042649 0.069075 -0.154055 +v -0.168784 0.023273 0.027920 +v 0.027920 0.023273 -0.168784 +v -0.183366 0.030593 0.065793 +v 0.065793 0.030593 -0.183366 +v -0.005885 0.110248 -0.005885 +v -0.036331 0.102714 -0.036331 +v -0.182440 -0.250733 -0.182440 +v -0.135399 -0.123714 -0.135399 +v -0.117625 -0.077158 -0.117625 +v -0.193934 -0.284641 -0.193934 +v 0.022544 0.070688 0.022544 +v 0.056074 0.116705 0.056074 +v 0.364609 -0.031044 0.364609 +v 0.380363 -0.209089 0.380363 +v 0.295872 -0.363126 0.295872 +v 0.113916 -0.401496 0.113916 +v -0.120790 -0.130443 -0.007139 +v -0.007138 -0.130443 -0.120790 +v -0.193368 -0.209615 -0.018519 +v -0.018519 -0.209615 -0.193367 +v -0.245742 -0.293092 -0.049037 +v -0.049037 -0.293092 -0.245742 +v -0.272568 -0.365213 -0.067121 +v -0.067121 -0.365213 -0.272568 +v -0.268643 -0.384697 -0.085052 +v -0.085052 -0.384697 -0.268643 +v -0.238039 -0.385181 -0.137501 +v -0.137501 -0.385181 -0.238039 +v -0.195648 -0.384911 -0.195648 +v -0.171668 -0.122370 0.073120 +v 0.073120 -0.122370 -0.171668 +v -0.211769 -0.087709 0.142299 +v 0.142299 -0.087709 -0.211769 +v -0.214802 -0.048313 0.248546 +v 0.248546 -0.048313 -0.214802 +v -0.212316 0.076501 0.268517 +v 0.268518 0.076501 -0.212316 +v -0.169153 0.101313 0.228628 +v 0.228628 0.101313 -0.169153 +v -0.103426 0.153466 0.171960 +v 0.171960 0.153466 -0.103426 +v -0.040956 0.214716 0.138264 +v 0.138264 0.214716 -0.040956 +v -0.006704 0.207396 0.080720 +v 0.080720 0.207396 -0.006704 +v -0.015111 0.132261 0.019859 +v 0.019859 0.132261 -0.015111 +v -0.061449 0.112294 0.030346 +v 0.030346 0.112294 -0.061449 +v -0.066316 0.075103 0.003624 +v 0.003624 0.075103 -0.066316 +v -0.116716 0.001475 -0.003065 +v -0.003065 0.001475 -0.116716 +v -0.168415 -0.032702 0.041403 +v 0.041403 -0.032702 -0.168415 +v -0.186509 -0.024629 0.088877 +v 0.088877 -0.024629 -0.186509 +v -0.198203 0.010516 0.151494 +v 0.151494 0.010516 -0.198203 +v -0.184991 0.045931 0.173448 +v 0.173449 0.045931 -0.184991 +v -0.165081 0.074779 0.171502 +v 0.171503 0.074779 -0.165081 +v -0.119471 0.107449 0.120946 +v 0.120946 0.107449 -0.119471 +v -0.073122 0.126449 0.066757 +v 0.066757 0.126449 -0.073122 +v -0.196256 -0.278559 -0.196256 +v -0.219319 -0.263381 -0.158122 +v -0.158122 -0.263381 -0.219319 +v -0.234977 -0.306654 -0.169409 +v -0.169409 -0.306654 -0.234977 +v -0.223636 -0.325384 -0.188667 +v -0.188667 -0.325384 -0.223636 +v -0.205619 -0.329690 -0.205619 +v -0.108149 -0.090345 -0.108149 +v -0.097569 -0.074414 -0.097569 +v -0.127238 -0.076943 -0.070412 +v -0.070412 -0.076943 -0.127238 +v -0.148143 -0.100463 -0.078203 +v -0.078203 -0.100463 -0.148143 +v -0.145473 -0.122476 -0.097390 +v -0.097390 -0.122476 -0.145473 +v -0.177865 -0.060044 0.045067 +v 0.045067 -0.060044 -0.177865 +v -0.212002 -0.037816 0.133323 +v 0.133323 -0.037816 -0.212002 +v -0.213372 0.004918 0.193151 +v 0.193151 0.004918 -0.213372 +v -0.202633 0.073003 0.212632 +v 0.212632 0.073003 -0.202633 +v -0.197152 0.101637 0.187514 +v 0.187514 0.101637 -0.197152 +v -0.121960 0.160626 0.122828 +v 0.122828 0.160626 -0.121960 +v -0.080863 0.199862 0.093986 +v 0.093986 0.199862 -0.080863 +v -0.057610 0.195825 0.056042 +v 0.056042 0.195825 -0.057610 +v -0.057551 0.133339 -0.000725 +v -0.000725 0.133339 -0.057551 +v -0.142357 -0.045780 -0.072418 +v -0.072418 -0.045780 -0.142357 +v -0.198407 -0.180173 -0.080385 +v -0.080384 -0.180173 -0.198407 +v -0.245415 -0.268979 -0.105537 +v -0.105537 -0.268979 -0.245415 +v -0.263260 -0.312252 -0.114639 +v -0.114638 -0.312252 -0.263260 +v -0.262434 -0.349712 -0.131298 +v -0.131298 -0.349712 -0.262434 +v -0.245275 -0.354771 -0.153480 +v -0.153480 -0.354771 -0.245275 +v -0.203678 -0.358054 -0.203678 +v -0.063849 -0.017255 -0.063849 +v -0.046417 0.044748 -0.046417 +v -0.090144 0.125426 0.093447 +v 0.093447 0.125426 -0.090144 +v -0.100041 0.018429 -0.008246 +v -0.008246 0.018429 -0.100041 +v -0.081784 0.042971 -0.007473 +v -0.007473 0.042971 -0.081784 +v -0.216480 -0.253263 -0.150912 +v -0.150912 -0.253263 -0.216481 +v -0.170195 -0.171292 -0.126483 +v -0.126483 -0.171292 -0.170196 +v -0.148339 -0.171292 -0.148339 +v -0.127711 -0.135124 -0.127712 +v -0.154091 -0.108536 -0.101636 +v -0.101636 -0.108536 -0.154091 +v -0.161060 -0.089806 -0.086750 +v -0.086750 -0.089806 -0.161060 +v -0.135855 -0.063003 -0.074658 +v -0.074658 -0.063003 -0.135855 +v -0.114928 -0.060473 -0.093072 +v -0.093072 -0.060473 -0.114928 +v -0.127292 -0.075112 -0.127292 +v -0.128037 -0.060958 -0.101810 +v -0.101809 -0.060958 -0.128037 +v -0.142406 -0.063487 -0.089952 +v -0.089952 -0.063487 -0.142406 +v -0.161658 -0.082701 -0.100462 +v -0.100462 -0.082701 -0.161659 +v -0.151318 -0.095619 -0.107606 +v -0.107606 -0.095619 -0.151318 +v -0.135741 -0.108267 -0.135741 +v -0.154396 -0.172693 -0.010146 +v -0.010146 -0.172693 -0.154396 +v -0.152639 -0.114403 -0.060844 +v -0.060844 -0.114403 -0.152639 +v -0.168314 -0.137170 -0.067776 +v -0.067776 -0.137170 -0.168314 +v -0.137791 -0.152456 -0.006655 +v -0.006655 -0.152456 -0.137791 +v -0.203107 -0.324630 -0.203107 +v -0.214965 -0.322101 -0.188737 +v -0.188737 -0.322101 -0.214965 +v -0.225909 -0.301594 -0.173454 +v -0.173454 -0.301594 -0.225909 +v -0.216927 -0.272746 -0.164472 +v -0.164472 -0.272746 -0.216927 +v -0.180881 -0.301380 -0.180881 +v -0.203873 -0.289485 -0.151418 +v -0.151418 -0.289485 -0.203873 +v -0.208554 -0.315051 -0.156100 +v -0.156100 -0.315051 -0.208554 +v -0.199932 -0.329475 -0.173705 +v -0.173704 -0.329475 -0.199932 +v -0.188074 -0.332004 -0.188074 +v -0.096822 0.050830 -0.000655 +v -0.000655 0.050830 -0.096822 +v -0.109452 0.028816 -0.004543 +v -0.004543 0.028816 -0.109452 +v -0.103443 0.113801 0.084519 +v 0.084519 0.113801 -0.103443 +v -0.090792 0.114823 0.062201 +v 0.062201 0.114823 -0.090792 +v -0.136086 0.107234 0.099960 +v 0.099960 0.107234 -0.136086 +v -0.165076 0.074295 0.149652 +v 0.149652 0.074295 -0.165075 +v -0.179891 0.052282 0.147950 +v 0.147950 0.052282 -0.179891 +v -0.190988 0.020150 0.132481 +v 0.132482 0.020150 -0.190988 +v -0.186590 -0.001324 0.080054 +v 0.080054 -0.001324 -0.186590 +v -0.169823 -0.008644 0.039995 +v 0.039995 -0.008644 -0.169823 +v -0.129705 0.015415 -0.002939 +v -0.002939 0.015415 -0.129705 +v -0.086448 0.076126 0.014090 +v 0.014090 0.076126 -0.086448 +v -0.082631 0.101422 0.035392 +v 0.035392 0.101422 -0.082631 +v -0.086334 0.091034 0.044803 +v 0.044803 0.091034 -0.086334 +v -0.085453 0.070797 0.023827 +v 0.023827 0.070797 -0.085453 +v -0.126198 0.015146 0.009310 +v 0.009310 0.015146 -0.126198 +v -0.162478 -0.004607 0.047340 +v 0.047340 -0.004607 -0.162478 +v -0.176130 0.000183 0.081772 +v 0.081772 0.000183 -0.176130 +v -0.177945 0.023433 0.128040 +v 0.128040 0.023433 -0.177945 +v -0.168827 0.046200 0.141529 +v 0.141529 0.046200 -0.168827 +v -0.155268 0.065683 0.141975 +v 0.141975 0.065683 -0.155268 +v -0.129790 0.099376 0.101884 +v 0.101884 0.099376 -0.129790 +v -0.094956 0.105458 0.062407 +v 0.062407 0.105458 -0.094956 +v -0.105422 0.104436 0.082540 +v 0.082540 0.104436 -0.105422 +v -0.105945 0.028547 0.007706 +v 0.007706 0.028547 -0.105945 +v -0.094968 0.046254 0.014312 +v 0.014312 0.046254 -0.094968 +v -0.001051 0.090172 0.060146 +v 0.060146 0.090172 -0.001051 +v 0.005773 0.157718 0.115053 +v 0.115053 0.157718 0.005773 +v -0.024434 0.159978 0.163528 +v 0.163528 0.159978 -0.024434 +v -0.078368 0.108094 0.192647 +v 0.192647 0.108094 -0.078368 +v -0.135026 0.060999 0.245270 +v 0.245270 0.060999 -0.135026 +v -0.168191 0.038717 0.277673 +v 0.277673 0.038717 -0.168191 +v -0.180893 -0.059239 0.251857 +v 0.251857 -0.059239 -0.180893 +v -0.168128 -0.103480 0.168456 +v 0.168456 -0.103480 -0.168128 +v -0.149822 -0.121402 0.094966 +v 0.094966 -0.121402 -0.149822 +v 0.173217 0.159007 0.173217 +v 0.271102 0.103352 0.271102 +v 0.217395 -0.413609 0.217395 +v -0.022064 -0.304236 -0.022064 +v -0.167562 -0.409025 -0.167562 +v -0.113100 -0.380016 -0.113100 +v -0.070056 -0.309456 -0.070056 +v -0.047297 -0.290511 -0.047297 +v -0.118108 -0.109296 0.358354 +v 0.358354 -0.109296 -0.118108 +v -0.083225 -0.104560 0.397608 +v 0.397608 -0.104560 -0.083225 +v 0.021460 -0.211077 0.454210 +v 0.454210 -0.211077 0.021460 +v 0.197331 -0.215815 0.455233 +v 0.455233 -0.215815 0.197331 +v -0.134116 -0.196809 0.276778 +v 0.276778 -0.196809 -0.134116 +v -0.053673 -0.275391 0.278539 +v 0.278539 -0.275391 -0.053673 +v 0.012868 -0.297837 0.371308 +v 0.371308 -0.297837 0.012869 +v 0.161816 -0.330885 0.349778 +v 0.349778 -0.330885 0.161816 +v -0.120133 -0.219089 0.011003 +v 0.011003 -0.219089 -0.120133 +v -0.080896 -0.273073 0.019642 +v 0.019642 -0.273073 -0.080896 +v -0.187840 -0.340779 -0.026105 +v -0.026105 -0.340779 -0.187840 +v -0.144790 -0.270704 -0.004911 +v -0.004911 -0.270704 -0.144790 +v -0.235000 -0.402997 -0.051409 +v -0.051409 -0.402997 -0.235000 +v -0.150272 -0.359509 -0.071590 +v -0.071590 -0.359509 -0.150272 +v -0.108945 -0.290456 -0.039006 +v -0.039006 -0.290456 -0.108945 +v -0.203070 -0.404235 -0.111274 +v -0.111274 -0.404235 -0.203070 +v -0.109825 -0.190994 0.012569 +v 0.012569 -0.190994 -0.109825 +v -0.107791 -0.164405 0.010232 +v 0.010232 -0.164405 -0.107791 +v -0.103968 -0.139593 0.009683 +v 0.009683 -0.139593 -0.103968 +v -0.064406 -0.286798 0.053617 +v 0.053617 -0.286798 -0.064406 +v 0.022490 -0.359192 0.188597 +v 0.188597 -0.359192 0.022490 +v 0.098356 -0.368236 0.290690 +v 0.290690 -0.368236 0.098356 +v 0.195257 -0.003863 0.448787 +v 0.448787 -0.003863 0.195257 +v 0.133756 0.087421 0.387287 +v 0.387287 0.087421 0.133756 +v 0.051437 0.131396 0.304968 +v 0.304968 0.131396 0.051437 +v -0.048216 0.069556 0.209686 +v 0.209686 0.069556 -0.048216 +v -0.119901 0.010298 0.286622 +v 0.286622 0.010298 -0.119901 +v -0.073617 0.013043 0.280451 +v 0.280451 0.013043 -0.073617 +v 0.016260 0.042481 0.374699 +v 0.374699 0.042481 0.016260 +v -0.066158 0.012934 0.379706 +v 0.379706 0.012934 -0.066158 +v -0.001916 -0.024421 0.443948 +v 0.443948 -0.024421 -0.001916 +v 0.081034 0.000821 0.439474 +v 0.439474 0.000821 0.081034 +v 0.126969 -0.078783 0.485409 +v 0.485409 -0.078783 0.126969 +v 0.040974 -0.104778 0.486838 +v 0.486838 -0.104778 0.040974 +v 0.109205 -0.224587 0.454531 +v 0.454531 -0.224587 0.109205 +v 0.088435 -0.314361 0.359450 +v 0.359450 -0.314361 0.088435 +v -0.035267 -0.137554 0.423710 +v 0.423710 -0.137554 -0.035267 +v -0.080302 -0.219521 0.147001 +v 0.147001 -0.219521 -0.080302 +v -0.008347 -0.308814 0.232070 +v 0.232070 -0.308814 -0.008347 +v -0.035223 -0.119363 0.463095 +v 0.463095 -0.119363 -0.035223 +v -0.115397 -0.271569 0.317353 +v 0.317353 -0.271569 -0.115397 +v -0.136922 -0.305102 0.444449 +v 0.444449 -0.305102 -0.136922 +v -0.156304 -0.277600 0.560575 +v 0.560575 -0.277600 -0.156304 +v -0.135061 -0.189817 0.621159 +v 0.621159 -0.189817 -0.135060 +v -0.072134 -0.129106 0.618518 +v 0.618518 -0.129106 -0.072134 +v -0.043188 -0.114358 0.529441 +v 0.529441 -0.114358 -0.043188 +v -0.056416 -0.129267 0.511842 +v 0.511842 -0.129267 -0.056416 +v -0.077479 -0.144768 0.586946 +v 0.586946 -0.144768 -0.077478 +v -0.119620 -0.196383 0.588516 +v 0.588516 -0.196383 -0.119620 +v -0.138231 -0.264683 0.539307 +v 0.539307 -0.264683 -0.138231 +v -0.130055 -0.279536 0.446945 +v 0.446945 -0.279536 -0.130055 +v -0.117604 -0.250579 0.345744 +v 0.345744 -0.250579 -0.117604 +v -0.055079 -0.130988 0.460724 +v 0.460724 -0.130988 -0.055079 +v -0.054329 -0.164681 0.474588 +v 0.474588 -0.164681 -0.054329 +v -0.107481 -0.253163 0.386466 +v 0.386466 -0.253163 -0.107481 +v -0.111651 -0.281098 0.469720 +v 0.469720 -0.281098 -0.111651 +v -0.120219 -0.268504 0.544205 +v 0.544205 -0.268504 -0.120219 +v -0.108214 -0.217912 0.582438 +v 0.582438 -0.217912 -0.108214 +v -0.074935 -0.180721 0.580747 +v 0.580747 -0.180721 -0.074934 +v -0.053807 -0.168019 0.518822 +v 0.518822 -0.168019 -0.053807 +v -0.046315 -0.151979 0.425776 +v 0.425776 -0.151979 -0.046315 +v -0.048659 -0.204132 0.419061 +v 0.419061 -0.204132 -0.048659 +v -0.039362 -0.229428 0.384645 +v 0.384645 -0.229428 -0.039362 +v -0.058103 -0.231958 0.400874 +v 0.400874 -0.231958 -0.058103 +v -0.075964 -0.254724 0.396127 +v 0.396128 -0.254724 -0.075963 +v -0.072245 -0.264843 0.382361 +v 0.382361 -0.264843 -0.072245 +v -0.092198 -0.213603 0.314325 +v 0.314325 -0.213603 -0.092198 +v -0.070527 -0.244282 0.331625 +v 0.331625 -0.244282 -0.070527 +v -0.056902 -0.227598 0.345250 +v 0.345250 -0.227598 -0.056902 +v -0.047017 -0.179804 0.398847 +v 0.398847 -0.179804 -0.047017 +v -0.054443 -0.179589 0.443875 +v 0.443875 -0.179589 -0.054443 +v -0.043178 -0.194552 0.455140 +v 0.455140 -0.194552 -0.043178 +v -0.061513 -0.275500 0.393093 +v 0.393094 -0.275500 -0.061513 +v -0.067417 -0.265381 0.409045 +v 0.409045 -0.265381 -0.067417 +v -0.050813 -0.245145 0.412536 +v 0.412536 -0.245145 -0.050812 +v -0.030816 -0.240085 0.397563 +v 0.397563 -0.240085 -0.030816 +v -0.040112 -0.214789 0.431979 +v 0.431979 -0.214789 -0.040112 +v -0.048169 -0.185511 0.533202 +v 0.533202 -0.185511 -0.048169 +v -0.071085 -0.196437 0.593339 +v 0.593339 -0.196437 -0.071085 +v -0.105294 -0.231099 0.598471 +v 0.598471 -0.231099 -0.105294 +v -0.119088 -0.279915 0.558450 +v 0.558450 -0.279915 -0.119088 +v -0.101316 -0.293531 0.484427 +v 0.484427 -0.293531 -0.101316 +v -0.093704 -0.263067 0.400243 +v 0.400243 -0.263067 -0.093704 +v -0.046506 -0.182174 0.486782 +v 0.486783 -0.182174 -0.046505 +v -0.061485 -0.236802 0.436833 +v 0.436833 -0.236802 -0.061485 +v -0.080346 -0.253756 0.444200 +v 0.444200 -0.253756 -0.080345 +v -0.080628 -0.240624 0.478887 +v 0.478887 -0.240624 -0.080628 +v -0.065742 -0.221894 0.471918 +v 0.471918 -0.221894 -0.065742 +v -0.065627 -0.206986 0.502631 +v 0.502631 -0.206986 -0.065627 +v -0.082302 -0.223939 0.507812 +v 0.507812 -0.223939 -0.082302 +v -0.092045 -0.218127 0.528667 +v 0.528667 -0.218127 -0.092045 +v -0.075441 -0.197890 0.532158 +v 0.532158 -0.197890 -0.075440 +v -0.010116 -0.166082 0.562513 +v 0.562513 -0.166082 -0.010116 +v -0.054165 -0.170173 0.645229 +v 0.645229 -0.170173 -0.054165 +v -0.125313 -0.215168 0.639650 +v 0.639650 -0.215168 -0.125313 +v -0.141793 -0.300690 0.592571 +v 0.592571 -0.300690 -0.141793 +v -0.096847 -0.337342 0.484524 +v 0.484524 -0.337342 -0.096847 +v -0.070750 -0.312691 0.370742 +v 0.370742 -0.312691 -0.070750 +v 0.003737 -0.160699 0.484570 +v 0.484570 -0.160699 0.003737 +vt 1.192246 0.988964 +vt 1.151852 0.912121 +vt 1.232641 0.779707 +vt 1.313429 0.925130 +vt -0.059977 0.779707 +vt 0.020812 0.912121 +vt -0.019582 0.988964 +vt -0.140765 0.925130 +vt -0.437360 0.925130 +vt -0.564148 0.779707 +vt -0.477458 0.657141 +vt -0.321654 0.843887 +vt 1.040768 0.736802 +vt 1.040768 0.603509 +vt 1.293232 0.657141 +vt 0.131896 0.603509 +vt 0.131896 0.736802 +vt -0.120568 0.657141 +vt 1.040768 0.890668 +vt 0.131896 0.890668 +vt 0.939782 0.935333 +vt 0.848895 0.820329 +vt 0.323769 0.820329 +vt 0.232882 0.935333 +vt 0.788303 0.709368 +vt 0.384361 0.709368 +vt -0.622001 0.820329 +vt -0.511742 0.977358 +vt -0.420830 0.913524 +vt -0.551840 0.709368 +vt 0.899388 1.017980 +vt 0.768106 0.977358 +vt 0.404558 0.977358 +vt 0.273276 1.017980 +vt 0.899388 -0.064950 +vt 0.939782 -0.001116 +vt 0.848895 0.103162 +vt 0.768106 -0.007097 +vt 0.323769 0.103162 +vt 0.232882 -0.001116 +vt 0.273276 -0.064950 +vt 0.404558 -0.007097 +vt -0.401483 1.134388 +vt -0.267488 1.114339 +vt 1.040768 0.174380 +vt 1.040768 0.328246 +vt 0.788303 0.237157 +vt 0.131896 0.328246 +vt 0.131896 0.174380 +vt 0.384361 0.237157 +vt 1.040768 0.038626 +vt 0.131896 0.038626 +vt 1.151852 0.031943 +vt 1.232641 0.161014 +vt -0.059977 0.161014 +vt 0.020812 0.031943 +vt 1.293232 0.311539 +vt -0.120568 0.311539 +vt -0.343631 1.093766 +vt -0.193106 1.062111 +vt -0.472702 1.085679 +vt -0.528271 0.988964 +vt -0.483429 1.105550 +vt -0.544801 1.000571 +vt 1.151852 1.085679 +vt 1.040768 1.130344 +vt 1.040768 1.164283 +vt 1.161951 1.105550 +vt 0.131896 1.164283 +vt 0.131896 1.130344 +vt 0.020812 1.085679 +vt 0.010714 1.105550 +vt 0.939782 1.108892 +vt 0.929684 1.134566 +vt 0.242981 1.134566 +vt 0.232882 1.108892 +vt -0.505761 1.108892 +vt -0.569595 1.017980 +vt -0.594389 1.035389 +vt -0.524752 1.134566 +vt -0.627626 0.935333 +vt -0.658223 0.944477 +vt 0.939782 -0.122981 +vt 1.040768 -0.129664 +vt 1.040768 -0.166064 +vt 0.929684 -0.153578 +vt 0.131896 -0.166064 +vt 0.131896 -0.129664 +vt 0.232882 -0.122981 +vt 0.242981 -0.153578 +vt 1.151852 -0.089922 +vt 1.161951 -0.112255 +vt 0.010714 -0.112255 +vt 0.020812 -0.089922 +vt -0.594567 0.912121 +vt -0.616900 0.915462 +vt 1.040768 1.041192 +vt 1.161951 0.915462 +vt 1.202345 1.000571 +vt -0.029681 1.000571 +vt 0.010714 0.915462 +vt 0.131896 1.041192 +vt 1.040768 0.891548 +vt 0.131896 0.891548 +vt 0.929684 0.944477 +vt 0.242981 0.944477 +vt 0.879191 1.035389 +vt 0.293473 1.035389 +vt 1.040768 -0.098009 +vt 1.040768 0.025438 +vt 0.929684 -0.020107 +vt 0.242981 -0.020107 +vt 0.131896 0.025438 +vt 0.131896 -0.098009 +vt 1.161951 0.021217 +vt 0.010714 0.021217 +vt 0.818599 -0.442945 +vt 0.798402 -0.343590 +vt 0.586332 -0.354316 +vt 0.586332 -0.442064 +vt 0.374262 -0.343590 +vt 0.354065 -0.442945 +vt 1.010472 -0.441363 +vt 0.889289 -0.327061 +vt 0.283375 -0.327061 +vt 0.162192 -0.441363 +vt 1.060965 -0.377707 +vt 0.929684 -0.204672 +vt 0.242981 -0.204672 +vt 0.111699 -0.377707 +vt -1.026290 -0.142074 +vt -1.156064 -0.063292 +vt -1.218316 -0.204672 +vt -1.130044 -0.377707 +vt -0.834788 0.130661 +vt -0.989355 0.226852 +vt 0.848895 0.389329 +vt 1.151852 0.415704 +vt 1.101359 0.619336 +vt 0.747909 0.665939 +vt 0.071305 0.619336 +vt 0.020812 0.415704 +vt 0.323769 0.389329 +vt 0.424755 0.665939 +vt 1.404317 0.528949 +vt 1.384119 0.691959 +vt -0.211455 0.691959 +vt -0.231652 0.528949 +vt 1.656781 0.657664 +vt 1.525499 0.831579 +vt -0.352835 0.831579 +vt -0.484116 0.657664 +vt 1.697175 1.065452 +vt 1.545696 1.054024 +vt -0.373032 1.054024 +vt -0.524511 1.065452 +vt 1.697175 0.289207 +vt 1.505302 0.296769 +vt 1.475007 0.137100 +vt 1.545696 0.182467 +vt -0.302342 0.137100 +vt -0.332638 0.296769 +vt -0.524511 0.289207 +vt -0.373032 0.182467 +vt 1.222542 0.317698 +vt 1.151852 0.161371 +vt 0.020812 0.161371 +vt -0.049878 0.317698 +vt 1.000374 0.384172 +vt 0.990275 0.189684 +vt 0.182389 0.189684 +vt 0.172291 0.384172 +vt 0.788303 0.330362 +vt 0.848895 0.155746 +vt 0.323769 0.155746 +vt 0.384361 0.330362 +vt -0.174283 1.493111 +vt -0.334308 1.247632 +vt -0.479909 1.251151 +vt -0.348900 1.455307 +vt 0.667121 0.170337 +vt 0.586332 0.132177 +vt 0.586332 -0.008501 +vt 0.717614 0.024736 +vt 0.505544 0.170337 +vt 0.455051 0.024736 +vt 0.798402 1.182394 +vt 0.909486 1.228641 +vt 0.848895 1.455307 +vt 0.717614 1.251151 +vt 0.323769 1.455307 +vt 0.263178 1.228641 +vt 0.374262 1.182394 +vt 0.455051 1.251151 +vt 1.010472 1.225299 +vt 0.990275 1.468495 +vt 0.182389 1.468495 +vt 0.162192 1.225299 +vt 1.141753 1.166566 +vt 1.151852 1.340303 +vt 0.020812 1.340303 +vt 0.030911 1.166566 +vt 1.363922 1.059827 +vt 1.475007 1.147576 +vt -0.302342 1.147576 +vt -0.191258 1.059827 +vt 1.414415 0.965574 +vt -0.241751 0.965574 +vt 1.394218 0.849868 +vt -0.221554 0.849868 +vt 1.222542 0.735042 +vt -0.049878 0.735042 +vt 1.071064 0.708667 +vt 0.101601 0.708667 +vt 0.848895 -0.117356 +vt 0.798402 -0.090802 +vt 0.586332 -0.135645 +vt 0.747909 -0.336816 +vt 0.374262 -0.090802 +vt 0.323769 -0.117356 +vt 0.424755 -0.336816 +vt 0.586332 1.151095 +vt 0.747909 1.060885 +vt 0.424755 1.060885 +vt 0.586332 0.961709 +vt 0.758008 0.955906 +vt 0.414656 0.955906 +vt 0.586332 0.759135 +vt 0.798402 0.875720 +vt 0.374262 0.875720 +vt 0.667121 -0.247577 +vt 0.586332 -0.261645 +vt 0.505544 -0.247577 +vt 0.737811 -0.186383 +vt 0.434853 -0.186383 +vt 0.727712 -0.045003 +vt 0.444952 -0.045003 +vt 0.858994 0.226852 +vt 0.687318 0.255868 +vt 0.737811 -0.011944 +vt 0.909486 -0.063292 +vt 0.434853 -0.011944 +vt 0.485346 0.255868 +vt 0.313670 0.226852 +vt 0.263178 -0.063292 +vt 0.697416 0.415359 +vt 0.586332 0.374035 +vt 0.586332 0.255868 +vt 0.475248 0.415359 +vt 0.586332 -0.003680 +vt 0.586332 -0.094591 +vt -0.868192 0.487279 +vt -0.917780 0.522098 +vt -0.936070 0.460904 +vt -0.906353 0.415359 +vt -0.801897 0.564123 +vt -0.831614 0.609668 +vt 0.586332 0.572388 +vt 0.636825 0.617933 +vt 0.727712 0.609668 +vt 0.717614 0.564123 +vt 0.444952 0.609668 +vt 0.535839 0.617933 +vt 0.455051 0.564123 +vt -0.844980 0.520338 +vt -0.888765 0.563421 +vt -0.825811 0.617933 +vt -0.796094 0.572388 +vt 0.707515 0.460904 +vt 0.586332 0.411315 +vt 0.465149 0.460904 +vt 0.687318 0.503107 +vt 0.586332 0.461783 +vt 0.485346 0.503107 +vt 0.586332 -0.384120 +vt 0.586332 -0.428785 +vt 0.646923 -0.371634 +vt 0.636825 -0.321166 +vt 0.525741 -0.371634 +vt 0.535839 -0.321166 +vt 0.707515 -0.377437 +vt 0.727712 -0.326969 +vt 0.465149 -0.377437 +vt 0.444952 -0.326969 +vt -0.882082 0.608086 +vt -0.950840 0.545310 +vt 0.758008 0.522098 +vt 0.727712 0.545310 +vt 0.444952 0.545310 +vt 0.414656 0.522098 +vt 0.727712 -0.446195 +vt 0.444952 -0.446195 +vt 0.586332 0.570104 +vt 0.747909 0.487279 +vt 0.798402 0.441734 +vt 0.374262 0.441734 +vt 0.424755 0.487279 +vt 0.818599 0.367352 +vt 0.354065 0.367352 +vt -0.725409 0.251290 +vt -0.890703 0.367352 +vt -0.678984 0.317408 +vt -0.838475 0.441734 +vt -0.640824 0.389329 +vt -0.841460 0.665939 +vt 0.586332 -0.114462 +vt 0.707515 -0.075600 +vt 0.465149 -0.075600 +vt 0.707515 -0.169853 +vt 0.465149 -0.169853 +vt 0.646923 -0.236851 +vt 0.525741 -0.236851 +vt 0.586332 -0.790693 +vt 0.667121 -0.793154 +vt 0.646923 -0.773284 +vt 0.586332 -0.779087 +vt 0.525741 -0.773284 +vt 0.505544 -0.793154 +vt 0.646923 -0.703824 +vt 0.586332 -0.709627 +vt 0.525741 -0.703824 +vt -1.277929 -0.236851 +vt -1.267904 -0.169853 +vt -1.187719 -0.213817 +vt -1.208470 -0.260943 +vt -1.226403 -0.075600 +vt -1.166088 -0.130289 +vt 0.707515 -0.721757 +vt 0.586332 -0.736705 +vt 0.586332 -0.676390 +vt 0.707515 -0.661443 +vt 0.465149 -0.721757 +vt 0.465149 -0.661443 +vt 0.586332 -0.169151 +vt 0.586332 -0.269208 +vt 0.646923 -0.260943 +vt 0.707515 -0.130289 +vt 0.525741 -0.260943 +vt 0.465149 -0.130289 +vt 0.707515 -0.213817 +vt 0.465149 -0.213817 +vt 0.828698 0.909659 +vt 0.808501 0.981580 +vt 0.343966 0.909659 +vt 0.364164 0.981580 +vt 0.818599 1.064227 +vt 0.354065 1.064227 +vt 0.858994 1.146874 +vt 0.313670 1.146874 +vt 0.879191 0.865874 +vt 0.293473 0.865874 +vt 1.071064 0.787270 +vt 0.101601 0.787270 +vt 1.202345 0.811184 +vt -0.029681 0.811184 +vt 1.333627 0.881345 +vt -0.160962 0.881345 +vt 1.343725 0.986325 +vt -0.171061 0.986325 +vt 1.313429 1.058246 +vt -0.140765 1.058246 +vt 1.363922 0.174202 +vt 1.141753 0.162774 +vt 1.131655 0.075906 +vt 1.313429 0.123734 +vt 0.041009 0.075906 +vt 0.030911 0.162774 +vt -0.191258 0.174202 +vt -0.140765 0.123734 +vt 1.010472 0.166996 +vt 1.020571 0.115648 +vt 0.152093 0.115648 +vt 0.162192 0.166996 +vt 0.909486 0.144663 +vt 0.939782 0.093315 +vt 0.232882 0.093315 +vt 0.263178 0.144663 +vt 0.798402 0.087512 +vt 0.858994 0.050232 +vt 0.313670 0.050232 +vt 0.374262 0.087512 +vt 0.939782 1.190659 +vt 0.889289 1.112935 +vt 0.949881 1.160062 +vt 0.283375 1.112935 +vt 0.232882 1.190659 +vt 0.222783 1.160062 +vt 1.020571 1.187317 +vt 1.020571 1.156720 +vt 0.152093 1.187317 +vt 0.152093 1.156720 +vt 1.131655 1.165865 +vt 1.121557 1.140191 +vt 0.041009 1.165865 +vt 0.051108 1.140191 +vt 1.273035 1.030110 +vt -0.100371 1.030110 +vt 1.303331 0.966454 +vt -0.130667 0.966454 +vt 1.293232 0.892072 +vt -0.120568 0.892072 +vt 1.202345 -0.086759 +vt 1.333627 0.024202 +vt 1.293232 0.044073 +vt 1.182148 -0.058623 +vt -0.120568 0.044073 +vt -0.160962 0.024202 +vt -0.029681 -0.086759 +vt -0.009484 -0.058623 +vt 1.071064 -0.140568 +vt 1.071064 -0.106630 +vt 0.101601 -0.140568 +vt 0.101601 -0.106630 +vt 0.879191 -0.147073 +vt 0.899388 -0.110673 +vt 0.293473 -0.147073 +vt 0.273276 -0.110673 +vt 0.828698 -0.103990 +vt 0.848895 -0.067590 +vt 0.343966 -0.103990 +vt 0.323769 -0.067590 +vt 0.838796 1.046818 +vt 0.333868 1.046818 +vt -0.512444 1.064227 +vt -0.570475 0.981580 +vt -0.531613 0.966632 +vt -0.487650 1.046818 +vt -0.608635 0.909659 +vt -0.572235 0.908779 +vt 0.586332 1.175711 +vt 0.667121 1.247632 +vt 0.727712 1.110117 +vt 0.586332 1.046461 +vt 0.444952 1.110117 +vt 0.505544 1.247632 +vt -0.066140 1.330803 +vt -0.208756 1.110117 +vt 0.788303 1.493111 +vt 1.000374 1.517025 +vt 1.020571 1.338187 +vt 0.838796 1.330803 +vt 0.152093 1.338187 +vt 0.172291 1.517025 +vt 0.384361 1.493111 +vt 0.333868 1.330803 +vt 1.222542 1.316913 +vt 1.212444 1.168672 +vt -0.039779 1.168672 +vt -0.049878 1.316913 +vt 1.505302 1.146518 +vt 1.464908 1.014806 +vt -0.292244 1.014806 +vt -0.332638 1.146518 +vt 1.616386 0.942005 +vt -0.443722 0.942005 +vt -0.215439 1.065452 +vt -0.267321 0.657664 +vt -0.181332 0.621966 +vt -0.092348 0.942005 +vt 1.656781 0.237324 +vt 1.404317 -0.001126 +vt 1.363922 0.160124 +vt 1.586091 0.323313 +vt -0.191258 0.160124 +vt -0.231652 -0.001126 +vt -0.484116 0.237324 +vt -0.413427 0.323313 +vt 1.151852 -0.068302 +vt 1.151852 0.032634 +vt 0.020812 0.032634 +vt 0.020812 -0.068302 +vt 0.586332 -0.164325 +vt 0.586332 -0.059168 +vt 0.818599 0.017854 +vt 0.747909 -0.182436 +vt 0.354065 0.017854 +vt 0.424755 -0.182436 +vt 0.586332 -0.426070 +vt 0.586332 -0.195538 +vt 0.747909 -0.133463 +vt 0.768106 -0.359072 +vt 0.424755 -0.133463 +vt 0.404558 -0.359072 +vt 0.586332 -0.614851 +vt 0.586332 -0.363212 +vt 0.768106 -0.353187 +vt 0.798402 -0.566844 +vt 0.404558 -0.353187 +vt 0.374262 -0.566844 +vt 0.818599 -0.708224 +vt 0.586332 -0.744624 +vt 0.354065 -0.708224 +vt 1.010472 -0.657756 +vt 1.010472 -0.502308 +vt 0.162192 -0.657756 +vt 0.162192 -0.502308 +vt -1.162401 -0.441363 +vt -1.006953 -0.501153 +vt -0.839543 -0.297877 +vt -0.691124 -0.068927 +vt 0.959979 -0.297877 +vt 0.909486 -0.068927 +vt 0.212685 -0.297877 +vt 0.263178 -0.068927 +vt 0.959979 -0.334898 +vt 0.212685 -0.334898 +vt -0.597395 0.099708 +vt -0.687081 -0.133463 +vt -0.486791 -0.076668 +vt -0.569961 0.191500 +vt -0.570663 0.278368 +vt -0.563100 0.359433 +vt 0.848895 -0.136179 +vt 0.848895 -0.058455 +vt 0.323769 -0.058455 +vt 0.323769 -0.136179 +vt 0.586332 1.526439 +vt 1.020571 1.341275 +vt 1.030669 1.058159 +vt 0.586332 1.163841 +vt 0.141995 1.058159 +vt 0.152093 1.341275 +vt 0.970078 0.647030 +vt 0.586332 0.685713 +vt 0.202586 0.647030 +vt 0.858994 0.134440 +vt 0.586332 0.057418 +vt 0.313670 0.134440 +vt -0.370205 -0.121512 +vt -0.344521 0.477423 +vt -0.015692 0.172498 +vt 0.209748 0.458421 +vt 0.586332 0.132380 +vt 1.182148 0.110404 +vt 1.020571 -0.265552 +vt 0.586332 -0.370887 +vt 0.152093 -0.265552 +vt -0.009484 0.110404 +vt 0.586332 0.959716 +vt 1.172049 0.982750 +vt 1.172049 1.363104 +vt 0.586332 1.411990 +vt 0.000615 1.363104 +vt 0.000615 0.982750 +vt 0.586332 1.153180 +vt 1.172049 1.101130 +vt 1.172049 0.802889 +vt 0.586332 0.714083 +vt 0.000615 0.802889 +vt 0.000615 1.101130 +vt 1.464908 0.414057 +vt 1.616386 0.412297 +vt 1.525499 0.544532 +vt 1.404317 0.637204 +vt -0.352835 0.544532 +vt -0.443722 0.412297 +vt -0.292244 0.414057 +vt -0.231652 0.637204 +vt 1.616386 0.883741 +vt 1.414415 1.062579 +vt -0.443722 0.883741 +vt -0.241751 1.062579 +vt 1.616386 1.180568 +vt 1.414415 1.361868 +vt -0.443722 1.180568 +vt -0.241751 1.361868 +vt 0.857223 0.818193 +vt 0.675923 0.735724 +vt 0.874098 0.473181 +vt 1.069465 0.558111 +vt 1.586091 0.125885 +vt 1.384119 0.081744 +vt 1.414415 0.558111 +vt 1.616386 0.473181 +vt -0.241751 0.558111 +vt -0.211455 0.081744 +vt -0.413427 0.125885 +vt -0.443722 0.473181 +vt 1.142622 0.802889 +vt 0.858459 1.101130 +vt 0.478105 1.244804 +vt 0.557934 0.954304 +vt 0.027757 1.042764 +vt 0.132559 0.858123 +vt 1.212444 0.423379 +vt 1.182148 0.532402 +vt -0.039779 0.423379 +vt -0.009484 0.532402 +vt 0.586332 0.418456 +vt 0.727712 0.295889 +vt 0.444952 0.295889 +vt 0.586332 0.263532 +vt 0.039887 0.849156 +vt 0.381024 0.473893 +vt 0.379096 0.857767 +vt 0.552121 0.366096 +vt 0.753637 0.125885 +vt 0.142384 -0.358034 +vt 0.171578 -0.193442 +vt -0.191189 0.098294 +vt 1.535598 0.488953 +vt 1.111458 0.313456 +vt 1.141753 0.676223 +vt 1.353824 0.678863 +vt 0.030911 0.676223 +vt 0.061206 0.313456 +vt -0.362934 0.488953 +vt -0.181160 0.678863 +vt 1.363922 0.477423 +vt 1.151852 0.418868 +vt 1.111458 0.098294 +vt 1.535598 0.172498 +vt 0.061206 0.098294 +vt 0.020812 0.418868 +vt -0.191258 0.477423 +vt -0.362934 0.172498 +vt 0.858994 0.278368 +vt 0.869092 0.191500 +vt 0.303572 0.191500 +vt 0.313670 0.278368 +vt 0.848895 0.359433 +vt 0.323769 0.359433 +vt 1.586091 1.258282 +vt 1.414415 1.046909 +vt 1.212444 1.194092 +vt 1.384119 1.461736 +vt -0.039779 1.194092 +vt -0.241751 1.046909 +vt -0.413427 1.258282 +vt -0.211455 1.461736 +vt 1.182148 1.666950 +vt -0.009484 1.666950 +vt 0.553514 -0.387584 +vt 0.689447 -0.211564 +vt 1.909245 1.282730 +vt 1.737569 1.147855 +vt 1.777964 1.096508 +vt 1.899146 1.211511 +vt -0.605299 1.096508 +vt -0.564905 1.147855 +vt -0.736581 1.282730 +vt -0.726482 1.211511 +vt 2.121315 1.336362 +vt 2.181906 1.421649 +vt -0.948651 1.336362 +vt -1.009242 1.421649 +vt 2.181906 0.393697 +vt 2.121315 0.342527 +vt 2.222301 0.173892 +vt 2.333385 0.195344 +vt -1.049637 0.173892 +vt -0.948651 0.342527 +vt -1.009242 0.393697 +vt -1.160721 0.195344 +vt 2.151611 -0.049255 +vt 2.242498 -0.091459 +vt -0.978947 -0.049255 +vt -1.069834 -0.091459 +vt 1.919344 -0.097785 +vt 1.929442 -0.181312 +vt -0.746679 -0.097785 +vt -0.756778 -0.181312 +vt 1.656781 -0.003176 +vt 1.586091 -0.071755 +vt -0.484116 -0.003176 +vt -0.413427 -0.071755 +vt 1.919344 0.891461 +vt 1.929442 0.986594 +vt 1.727471 0.803891 +vt 1.656781 0.686426 +vt -0.554807 0.803891 +vt -0.756778 0.986594 +vt -0.746679 0.891461 +vt -0.484116 0.686426 +vt 2.151611 1.085949 +vt 2.121315 1.138879 +vt -0.948651 1.138879 +vt -0.978947 1.085949 +vt 0.737987 0.173892 +vt 0.750295 0.103553 +vt 0.634233 -0.061741 +vt 0.581304 -0.049255 +vt 2.101118 0.225062 +vt 2.181906 0.103553 +vt -1.009242 0.103553 +vt -0.928454 0.225062 +vt 1.899146 0.393173 +vt 1.909245 0.266563 +vt -0.736581 0.266563 +vt -0.726482 0.393173 +vt 1.777964 0.387548 +vt 1.808259 0.277467 +vt -0.635595 0.277467 +vt -0.605299 0.387548 +vt 0.174218 -0.084242 +vt 0.257923 0.017397 +vt 0.167891 0.117631 +vt 1.586091 0.625933 +vt 1.515401 0.762568 +vt -0.413427 0.625933 +vt -0.342737 0.762568 +vt 1.646682 0.366096 +vt 1.676978 0.318969 +vt 1.737569 0.425530 +vt -0.504314 0.318969 +vt -0.474018 0.366096 +vt -0.564905 0.425530 +vt 1.636584 0.875812 +vt -0.463919 0.875812 +vt 1.676978 -0.016720 +vt 1.515401 0.071908 +vt 1.515401 0.017397 +vt 1.636584 -0.049779 +vt -0.342737 0.017397 +vt -0.342737 0.071908 +vt -0.504314 -0.016720 +vt -0.463919 -0.049779 +vt 1.565894 0.957055 +vt 1.515401 0.825522 +vt 1.676978 0.899024 +vt 1.646682 0.951252 +vt -0.504314 0.899024 +vt -0.342737 0.825522 +vt -0.393229 0.957055 +vt -0.474018 0.951252 +vt 0.510441 0.148574 +vt 0.467536 0.228057 +vt 0.320877 0.071908 +vt 0.452410 0.065927 +vt 1.616386 0.228057 +vt 1.666879 0.148574 +vt 1.737569 0.228759 +vt -0.494215 0.148574 +vt -0.443722 0.228057 +vt -0.564905 0.228759 +vt 0.531370 0.318969 +vt 0.625623 0.277467 +vt 0.554404 0.228759 +vt 0.606454 0.179873 +vt 0.671870 0.220317 +vt 0.560029 0.113755 +vt 0.501998 0.031108 +vt 1.656781 0.995037 +vt 1.575992 1.006644 +vt -0.484116 0.995037 +vt -0.403328 1.006644 +vt 0.446607 0.057662 +vt 0.394379 -0.016720 +vt 0.443967 -0.051539 +vt 0.490392 0.014579 +vt 0.371167 -0.049779 +vt 0.420755 -0.084598 +vt 1.727471 0.867547 +vt 1.636584 0.925400 +vt -0.554807 0.867547 +vt -0.463919 0.925400 +vt 1.818358 0.220317 +vt 1.929442 0.209412 +vt -0.645694 0.220317 +vt -0.756778 0.209412 +vt 2.121315 0.173714 +vt -0.948651 0.173714 +vt 0.823274 0.225062 +vt 0.861256 0.173714 +vt 0.794080 0.060470 +vt 0.669754 -0.099021 +vt 1.929442 -0.102887 +vt 2.121315 -0.061741 +vt 2.151611 -0.099021 +vt 1.939541 -0.143508 +vt -0.978947 -0.099021 +vt -0.948651 -0.061741 +vt -0.756778 -0.102887 +vt -0.766877 -0.143508 +vt 1.939541 1.044447 +vt -0.766877 1.044447 +vt 1.656781 0.014579 +vt 1.687077 -0.051539 +vt 1.798161 -0.013557 +vt 1.737569 0.041835 +vt -0.625497 -0.013557 +vt -0.514412 -0.051539 +vt -0.484116 0.014579 +vt -0.564905 0.041835 +vt 1.878949 0.029349 +vt 1.828457 0.090543 +vt -0.706285 0.029349 +vt -0.655792 0.090543 +vt 1.949639 0.083860 +vt 1.899146 0.139251 +vt -0.776975 0.083860 +vt -0.726482 0.139251 +vt 2.020329 0.102851 +vt 1.990034 0.168968 +vt -0.847665 0.102851 +vt -0.817370 0.168968 +vt 1.929442 1.279913 +vt 1.818358 1.176515 +vt 1.899146 1.168952 +vt 1.990034 1.214497 +vt -0.726482 1.168952 +vt -0.645694 1.176515 +vt -0.756778 1.279913 +vt -0.817370 1.214497 +vt 1.737569 0.179873 +vt -0.564905 0.179873 +vt 1.676978 0.113755 +vt -0.504314 0.113755 +vt 1.575992 0.031108 +vt -0.403328 0.031108 +vt 1.798161 0.999960 +vt 1.687077 0.948612 +vt -0.625497 0.999960 +vt -0.514412 0.948612 +vt 0.539802 -0.143508 +vt 0.574799 0.029349 +vt 0.495315 -0.013557 +vt 0.362902 -0.043976 +vt 2.212202 0.060470 +vt -1.039538 0.060470 +vt 2.121315 1.365901 +vt 2.020329 1.168072 +vt 2.212202 1.298725 +vt -0.847665 1.168072 +vt -0.948651 1.365901 +vt -1.039538 1.298725 +vt 1.929442 0.869831 +vt 1.606288 0.852421 +vt 1.929442 1.054996 +vt -0.433624 0.852421 +vt -0.756778 0.869831 +vt -0.756778 1.054996 +vt 2.242498 1.093333 +vt 2.282892 1.200775 +vt -1.069834 1.093333 +vt -1.110228 1.200775 +vt 0.777729 0.195344 +vt 0.588688 -0.091459 +vt 0.696130 -0.166899 +vt 0.842966 0.112519 +vt 0.917003 0.393697 +vt 1.020223 0.259524 +vt 1.909245 0.441882 +vt 2.202104 0.259524 +vt 1.909245 0.272890 +vt -1.029440 0.259524 +vt -0.736581 0.441882 +vt -0.736581 0.272890 +vt 1.909245 1.435538 +vt 1.697175 1.287475 +vt -0.736581 1.435538 +vt -0.524511 1.287475 +vt 1.929442 -0.286648 +vt 1.606288 -0.206107 +vt 1.697175 0.290477 +vt -0.433624 -0.206107 +vt -0.756778 -0.286648 +vt -0.524511 0.290477 +vt 2.282892 -0.166899 +vt -1.110228 -0.166899 +vt 2.353582 0.112519 +vt -1.180918 0.112519 +vt 0.643210 0.425530 +vt 0.782830 0.290477 +vn -0.968100 0.249100 -0.027600 +vn -0.027600 0.249100 -0.968100 +vn -0.981200 0.021000 0.191800 +vn 0.191800 0.021000 -0.981200 +vn -0.873700 -0.393600 -0.286000 +vn -0.286000 -0.393600 -0.873700 +vn -0.913800 0.032900 -0.404800 +vn -0.404800 0.032900 -0.913800 +vn -0.648700 0.040300 -0.760000 +vn -0.760000 0.040300 -0.648700 +vn -0.422300 -0.419300 -0.803600 +vn -0.803600 -0.419300 -0.422300 +vn 0.095100 0.037100 -0.994800 +vn -0.994800 0.037100 0.095100 +vn -0.245900 0.336300 -0.909100 +vn -0.909100 0.336300 -0.245900 +vn -0.082000 0.649200 -0.756200 +vn -0.756200 0.649200 -0.082000 +vn 0.355600 0.584400 -0.729400 +vn -0.729400 0.584400 0.355600 +vn 0.210400 0.966700 -0.145900 +vn -0.145900 0.966700 0.210400 +vn -0.173900 0.935300 -0.308100 +vn -0.308100 0.935300 -0.173900 +vn -0.480700 0.876000 0.037900 +vn 0.037900 0.876000 -0.480700 +vn -0.264500 0.909400 0.321100 +vn 0.321100 0.909400 -0.264500 +vn -0.741500 0.515800 0.429200 +vn 0.429200 0.515800 -0.741500 +vn -0.808100 0.571900 0.141300 +vn 0.141300 0.571900 -0.808100 +vn -0.160100 -0.014100 0.987000 +vn 0.987000 -0.014100 -0.160100 +vn 0.497100 0.365100 0.787200 +vn 0.787200 0.365100 0.497100 +vn 0.882400 0.374100 0.285200 +vn 0.285200 0.374100 0.882400 +vn 0.983300 -0.003800 -0.182100 +vn -0.182100 -0.003800 0.983300 +vn 0.702800 -0.552600 -0.448000 +vn -0.448000 -0.552600 0.702800 +vn 0.248000 -0.903600 -0.349200 +vn -0.349200 -0.903600 0.248000 +vn -0.169800 -0.978100 0.120300 +vn 0.120300 -0.978100 -0.169800 +vn -0.425800 -0.567400 0.704800 +vn 0.704800 -0.567400 -0.425800 +vn -0.837300 0.474400 -0.271600 +vn -0.271600 0.474400 -0.837300 +vn -0.829600 0.394000 -0.395600 +vn -0.395600 0.394000 -0.829600 +vn -0.707600 0.412100 -0.574000 +vn -0.574000 0.412100 -0.707600 +vn -0.544800 0.550100 -0.632900 +vn -0.632900 0.550100 -0.544800 +vn -0.522700 0.594600 -0.610900 +vn -0.610900 0.594600 -0.522700 +vn -0.567200 0.704600 -0.426400 +vn -0.426400 0.704600 -0.567200 +vn -0.690400 0.674700 -0.261100 +vn -0.261100 0.674700 -0.690400 +vn -0.789000 0.572400 -0.223100 +vn -0.223100 0.572400 -0.789000 +vn -0.722100 -0.422200 -0.548000 +vn -0.548000 -0.422200 -0.722100 +vn -0.767800 -0.447900 -0.458100 +vn -0.458100 -0.447900 -0.767800 +vn -0.988100 0.010800 -0.153400 +vn -0.153400 0.010800 -0.988100 +vn -0.933100 0.324900 0.154300 +vn 0.154300 0.324900 -0.933100 +vn -0.873400 0.429700 0.229200 +vn 0.229200 0.429700 -0.873400 +vn -0.836100 -0.397800 -0.377700 +vn -0.377700 -0.397800 -0.836100 +vn -0.913500 -0.173800 -0.368000 +vn -0.368000 -0.173800 -0.913500 +vn -0.999700 -0.003800 -0.024600 +vn -0.024600 -0.003800 -0.999700 +vn -0.994700 0.081100 -0.063100 +vn -0.063100 0.081100 -0.994700 +vn -0.670400 0.734900 0.102500 +vn 0.102500 0.734900 -0.670400 +vn -0.425700 0.857000 0.290500 +vn 0.290500 0.857000 -0.425700 +vn -0.569000 0.768500 0.292600 +vn 0.292600 0.768500 -0.569000 +vn -0.133800 0.971400 -0.196100 +vn -0.196100 0.971400 -0.133800 +vn 0.288300 0.612000 -0.736500 +vn -0.736500 0.612000 0.288300 +vn 0.301200 0.792400 -0.530400 +vn -0.530400 0.792400 0.301200 +vn -0.970900 0.110100 -0.212800 +vn -0.212800 0.110100 -0.970900 +vn -0.841500 0.107600 -0.529400 +vn -0.529400 0.107600 -0.841500 +vn -0.647900 0.048900 -0.760200 +vn -0.760200 0.048900 -0.647900 +vn -0.642300 -0.107700 -0.758900 +vn -0.758900 -0.107700 -0.642300 +vn -0.738700 0.008900 -0.674000 +vn -0.674000 0.008900 -0.738700 +vn -0.825400 0.363800 -0.431700 +vn -0.431700 0.363800 -0.825400 +vn -0.868200 0.371500 -0.328900 +vn -0.328900 0.371500 -0.868200 +vn -0.873400 0.279900 -0.398600 +vn -0.398600 0.279900 -0.873400 +vn -0.776600 0.580600 -0.244500 +vn -0.244500 0.580600 -0.776600 +vn -0.347500 0.767500 -0.538700 +vn -0.538700 0.767500 -0.347500 +vn -0.924500 0.111900 -0.364400 +vn -0.364400 0.111900 -0.924500 +vn -0.782100 0.344000 -0.519700 +vn -0.519700 0.344000 -0.782100 +vn -0.653800 0.404100 -0.639700 +vn -0.639700 0.404100 -0.653800 +vn -0.747100 -0.160000 -0.645200 +vn -0.645200 -0.160000 -0.747100 +vn -0.826400 -0.009500 -0.562900 +vn -0.562900 -0.009500 -0.826400 +vn -0.859500 0.300900 -0.413100 +vn -0.413100 0.300900 -0.859500 +vn -0.778000 0.525100 -0.344800 +vn -0.344800 0.525100 -0.778000 +vn -0.825700 0.431000 -0.363900 +vn -0.363900 0.431000 -0.825700 +vn -0.544700 0.620600 -0.564000 +vn -0.564000 0.620600 -0.544700 +vn -0.602300 0.519700 -0.606000 +vn -0.606000 0.519700 -0.602300 +vn -0.578700 0.574600 -0.578700 +vn -0.785800 -0.495500 0.370200 +vn 0.370200 -0.495500 -0.785800 +vn -0.453900 0.064800 0.888700 +vn 0.888700 0.064800 -0.453900 +vn 0.549000 0.505500 0.665600 +vn 0.665600 0.505500 0.549000 +vn 0.592900 0.466000 -0.656700 +vn -0.656700 0.466000 0.592900 +vn -0.783300 -0.592400 -0.188300 +vn -0.188300 -0.592400 -0.783300 +vn -0.880100 -0.030000 -0.473800 +vn -0.473800 -0.030000 -0.880100 +vn 0.442200 0.755700 -0.483100 +vn -0.483100 0.755700 0.442200 +vn -0.103900 0.993600 0.044900 +vn 0.044900 0.993600 -0.103900 +vn -0.755100 0.573800 0.317100 +vn 0.317100 0.573800 -0.755100 +vn -0.902300 -0.248300 -0.352300 +vn -0.352300 -0.248300 -0.902300 +vn -0.501100 0.747800 -0.435600 +vn -0.435600 0.747800 -0.501100 +vn -0.716500 0.197100 -0.669200 +vn -0.669200 0.197100 -0.716500 +vn -0.260400 0.374400 -0.890000 +vn -0.890000 0.374400 -0.260400 +vn -0.528200 0.144400 -0.836800 +vn -0.836800 0.144400 -0.528200 +vn -0.875300 0.406700 -0.261500 +vn -0.261500 0.406700 -0.875300 +vn -0.743400 0.588300 -0.318100 +vn -0.318100 0.588300 -0.743400 +vn -0.741100 0.533400 0.407600 +vn 0.407600 0.533400 -0.741100 +vn -0.751200 0.445900 0.486700 +vn 0.486700 0.445900 -0.751200 +vn -0.775600 0.306900 0.551600 +vn 0.551600 0.306900 -0.775600 +vn -0.842100 -0.119800 -0.525800 +vn -0.525800 -0.119800 -0.842100 +vn -0.532600 0.392700 -0.749800 +vn -0.749800 0.392700 -0.532600 +vn -0.401900 0.465800 -0.788400 +vn -0.788400 0.465800 -0.401900 +vn -0.416400 0.720500 -0.554500 +vn -0.554500 0.720500 -0.416400 +vn 0.340700 0.932900 0.116900 +vn 0.116900 0.932900 0.340700 +vn 0.701200 0.655900 -0.279400 +vn -0.279400 0.655900 0.701200 +vn 0.707100 -0.000000 -0.707100 +vn -0.707100 0.000000 0.707100 +vn -0.668100 -0.705500 -0.236600 +vn -0.236600 -0.705500 -0.668100 +vn -0.694300 0.304200 -0.652200 +vn -0.652200 0.304200 -0.694300 +vn -0.773900 0.248400 -0.582600 +vn -0.582600 0.248400 -0.773900 +vn -0.224400 0.243300 -0.943600 +vn -0.943600 0.243400 -0.224400 +vn -0.279000 0.495700 -0.822500 +vn -0.822500 0.495700 -0.279000 +vn -0.403100 0.592200 -0.697700 +vn -0.697700 0.592200 -0.403100 +vn -0.175400 -0.006600 -0.984500 +vn -0.984500 -0.006600 -0.175400 +vn -0.581600 -0.246500 -0.775200 +vn -0.775200 -0.246500 -0.581600 +vn -0.930100 -0.105300 -0.351900 +vn -0.351900 -0.105300 -0.930100 +vn -0.982900 0.068300 -0.171100 +vn -0.171100 0.068300 -0.982900 +vn -0.913500 0.391000 -0.112300 +vn -0.112300 0.391000 -0.913500 +vn -0.825800 0.563700 -0.019200 +vn -0.019200 0.563700 -0.825800 +vn -0.501400 0.846100 0.180600 +vn 0.180600 0.846100 -0.501400 +vn -0.368100 0.929800 0.000100 +vn 0.000100 0.929800 -0.368100 +vn -0.500700 0.822800 -0.268800 +vn -0.268800 0.822800 -0.500700 +vn -0.446300 0.760600 -0.471500 +vn -0.471500 0.760600 -0.446300 +vn -0.891500 0.146400 -0.428600 +vn -0.428600 0.146400 -0.891500 +vn -0.839200 0.317100 -0.441700 +vn -0.441700 0.317100 -0.839200 +vn -0.498700 -0.122300 -0.858100 +vn -0.858100 -0.122300 -0.498700 +vn -0.633800 -0.385500 -0.670600 +vn -0.670600 -0.385500 -0.633800 +vn -0.377400 0.303400 -0.874900 +vn -0.874900 0.303400 -0.377400 +vn -0.296900 0.528800 -0.795200 +vn -0.795200 0.528800 -0.296900 +vn -0.227600 0.881500 -0.413800 +vn -0.413800 0.881500 -0.227600 +vn -0.181000 0.956400 -0.229400 +vn -0.229400 0.956400 -0.181000 +vn -0.438700 0.895800 0.070800 +vn 0.070800 0.895800 -0.438700 +vn -0.534200 0.827800 0.171100 +vn 0.171100 0.827800 -0.534200 +vn -0.992600 0.110300 -0.049800 +vn -0.049800 0.110300 -0.992600 +vn -0.938500 0.269300 0.216200 +vn 0.216200 0.269300 -0.938500 +vn -0.860100 0.445500 0.248700 +vn 0.248700 0.445500 -0.860100 +vn 0.847200 0.522300 0.096800 +vn 0.096800 0.522300 0.847200 +vn 0.967800 0.088100 -0.235900 +vn -0.235900 0.088100 0.967800 +vn 0.776100 0.461100 0.430200 +vn 0.430200 0.461100 0.776100 +vn 0.059800 0.436800 0.897600 +vn 0.897600 0.436800 0.059800 +vn 0.275700 0.537600 0.796900 +vn 0.796900 0.537600 0.275700 +vn 0.339000 0.583500 0.738000 +vn 0.738000 0.583500 0.339000 +vn -0.262100 -0.177100 0.948600 +vn 0.948600 -0.177100 -0.262100 +vn -0.418400 -0.843400 0.337100 +vn 0.337100 -0.843400 -0.418400 +vn -0.349800 -0.916400 0.194600 +vn 0.194600 -0.916400 -0.349800 +vn 0.050400 -0.923400 0.380600 +vn 0.380600 -0.923400 0.050400 +vn 0.363200 -0.603900 0.709500 +vn 0.709500 -0.603900 0.363200 +vn 0.244900 -0.878900 0.409300 +vn 0.409300 -0.878900 0.244900 +vn -0.400800 -0.884800 -0.237900 +vn -0.237900 -0.884800 -0.400800 +vn -0.345800 -0.921200 -0.178400 +vn -0.178400 -0.921200 -0.345800 +vn -0.519600 -0.168300 0.837700 +vn 0.837700 -0.168300 -0.519600 +vn -0.405100 -0.053000 0.912700 +vn 0.912700 -0.053000 -0.405100 +vn 0.464300 -0.549900 0.694300 +vn 0.694300 -0.549900 0.464300 +vn 0.489500 -0.738900 0.463000 +vn 0.463000 -0.738900 0.489500 +vn -0.311400 -0.577600 0.754600 +vn 0.754600 -0.577600 -0.311400 +vn -0.381300 -0.098500 0.919200 +vn 0.919200 -0.098500 -0.381300 +vn -0.417900 0.144200 0.897000 +vn 0.897000 0.144200 -0.417900 +vn -0.372900 0.142500 0.916800 +vn 0.916800 0.142500 -0.372900 +vn -0.494400 0.238300 0.835900 +vn 0.835900 0.238300 -0.494400 +vn -0.227500 -0.973500 0.021500 +vn 0.021500 -0.973500 -0.227500 +vn 0.007900 -0.846500 0.532300 +vn 0.532300 -0.846500 0.007900 +vn -0.286600 -0.945800 0.152700 +vn 0.152700 -0.945800 -0.286600 +vn -0.509700 -0.852700 -0.114600 +vn -0.114600 -0.852700 -0.509700 +vn -0.496100 -0.866700 -0.052200 +vn -0.052200 -0.866700 -0.496100 +vn -0.739700 -0.205500 0.640800 +vn 0.640800 -0.205500 -0.739700 +vn -0.932100 -0.274000 0.237100 +vn 0.237100 -0.274000 -0.932100 +vn 0.248100 -0.630000 0.735800 +vn 0.735800 -0.630000 0.248100 +vn 0.170600 0.924600 0.340600 +vn 0.340600 0.924600 0.170600 +vn 0.412900 0.691100 0.593200 +vn 0.593200 0.691100 0.412900 +vn 0.413800 0.070600 0.907600 +vn 0.907600 0.070600 0.413800 +vn 0.155100 0.651800 0.742400 +vn 0.742400 0.651800 0.155100 +vn -0.241700 0.970100 0.019200 +vn 0.019200 0.970100 -0.241700 +vn -0.204600 0.730300 0.651800 +vn 0.651800 0.730300 -0.204600 +vn -0.102000 0.439100 0.892700 +vn 0.892700 0.439100 -0.102000 +vn 0.024000 -0.247500 0.968600 +vn 0.968600 -0.247500 0.024000 +vn 0.262200 -0.077200 0.961900 +vn 0.961900 -0.077200 0.262200 +vn -0.049200 0.509300 0.859200 +vn 0.859200 0.509300 -0.049200 +vn -0.320600 0.643400 0.695200 +vn 0.695200 0.643400 -0.320600 +vn -0.676000 0.637900 0.368800 +vn 0.368800 0.637900 -0.676000 +vn 0.225300 0.667200 0.710000 +vn 0.710000 0.667200 0.225300 +vn -0.382500 0.921900 -0.061500 +vn -0.061500 0.921900 -0.382500 +vn 0.731100 -0.477200 0.487600 +vn 0.487600 -0.477200 0.731100 +vn 0.109500 0.979400 0.169600 +vn 0.169600 0.979400 0.109500 +vn -0.371700 0.708200 -0.600200 +vn -0.600200 0.708200 -0.371700 +vn -0.640200 0.189300 0.744600 +vn 0.744600 0.189300 -0.640200 +vn -0.810500 0.252100 0.528700 +vn 0.528700 0.252100 -0.810500 +vn -0.576900 0.117900 0.808300 +vn 0.808300 0.117900 -0.576900 +vn -0.628100 -0.035900 0.777300 +vn 0.777300 -0.035900 -0.628100 +vn -0.816900 -0.544800 0.189400 +vn 0.189400 -0.544800 -0.816900 +vn -0.687700 -0.707800 -0.161400 +vn -0.161400 -0.707800 -0.687700 +vn -0.800700 -0.574700 -0.169200 +vn -0.169200 -0.574700 -0.800700 +vn -0.876000 -0.482000 -0.018200 +vn -0.018200 -0.482000 -0.876000 +vn -0.916000 -0.382900 0.119900 +vn 0.119900 -0.382900 -0.916000 +vn -0.863100 0.122100 -0.490100 +vn -0.490100 0.122100 -0.863100 +vn -0.078900 -0.701200 0.708500 +vn 0.708500 -0.701200 -0.078900 +vn 0.006000 -0.700400 0.713700 +vn 0.713700 -0.700400 0.006000 +vn -0.327300 -0.936800 0.123700 +vn 0.123700 -0.936800 -0.327300 +vn -0.605600 -0.680600 0.412300 +vn 0.412300 -0.680600 -0.605600 +vn -0.098200 -0.790200 0.605000 +vn 0.605000 -0.790200 -0.098200 +vn -0.588400 0.803300 -0.092600 +vn -0.092600 0.803300 -0.588400 +vn -0.758400 0.642000 -0.112700 +vn -0.112700 0.642000 -0.758400 +vn -0.695500 0.638200 -0.330200 +vn -0.330200 0.638200 -0.695500 +vn -0.765300 0.489500 -0.418000 +vn -0.418000 0.489500 -0.765300 +vn -0.864000 0.458800 -0.207400 +vn -0.207400 0.458800 -0.864000 +vn -0.981100 0.165100 -0.100800 +vn -0.100800 0.165100 -0.981100 +vn -0.399200 0.885600 0.237200 +vn 0.237200 0.885600 -0.399200 +vn 0.243500 0.960600 -0.133600 +vn -0.133600 0.960600 0.243500 +vn 0.383100 0.481200 -0.788500 +vn -0.788500 0.481200 0.383100 +vn -0.220800 0.152200 -0.963400 +vn -0.963400 0.152200 -0.220800 +vn -0.949400 -0.068700 -0.306500 +vn -0.306500 -0.068700 -0.949400 +vn -0.998800 -0.049000 -0.009400 +vn -0.009400 -0.049000 -0.998800 +vn -0.722700 -0.623400 0.298300 +vn 0.298300 -0.623400 -0.722700 +vn -0.291400 0.773500 -0.562800 +vn -0.562800 0.773500 -0.291400 +vn -0.673000 -0.423200 0.606600 +vn 0.606600 -0.423200 -0.673000 +vn -0.578600 0.691500 -0.432400 +vn -0.432400 0.691500 -0.578600 +vn 0.114900 0.965500 0.233800 +vn 0.233800 0.965500 0.114900 +vn -0.931100 0.364100 -0.019500 +vn -0.019500 0.364100 -0.931100 +vn -0.556500 0.829200 0.053000 +vn 0.053000 0.829200 -0.556500 +vn -0.965300 -0.197700 0.170700 +vn 0.170700 -0.197700 -0.965300 +vn -0.984500 0.065200 -0.162700 +vn -0.162700 0.065200 -0.984500 +vn -0.987600 0.039700 -0.151800 +vn -0.151800 0.039700 -0.987600 +vn -0.733300 -0.181600 0.655200 +vn 0.655200 -0.181600 -0.733300 +vn -0.736900 -0.392000 0.550700 +vn 0.550700 -0.392000 -0.736900 +vn -0.670500 -0.056500 0.739700 +vn 0.739700 -0.056500 -0.670500 +vn -0.894400 -0.424900 0.139900 +vn 0.139900 -0.424900 -0.894400 +vn -0.865400 -0.435900 0.247200 +vn 0.247200 -0.435900 -0.865400 +vn -0.849600 -0.507500 0.143500 +vn 0.143500 -0.507500 -0.849600 +vn 0.298300 0.774000 0.558600 +vn 0.558600 0.774000 0.298300 +vn -0.601400 0.343900 0.721100 +vn 0.721100 0.343900 -0.601400 +vn -0.804300 -0.579000 0.133800 +vn 0.133800 -0.579000 -0.804300 +vn 0.366800 0.860000 0.354700 +vn 0.354700 0.860000 0.366800 +vn -0.922000 -0.385100 -0.040000 +vn -0.040000 -0.385100 -0.922000 +vn -0.763500 -0.524300 -0.377000 +vn -0.377000 -0.524300 -0.763500 +vn 0.509700 -0.542200 -0.668000 +vn -0.668000 -0.542200 0.509700 +vn 0.974500 -0.091700 -0.204800 +vn -0.204800 -0.091700 0.974500 +vn 0.865600 0.496300 0.065900 +vn 0.065900 0.496300 0.865600 +vn 0.405500 0.853900 0.326300 +vn 0.326300 0.853900 0.405500 +vn -0.665600 0.586700 -0.461300 +vn -0.461300 0.586700 -0.665600 +vn -0.750900 0.594500 -0.287800 +vn -0.287800 0.594500 -0.750900 +vn -0.761200 0.564600 -0.319000 +vn -0.319000 0.564600 -0.761200 +vn -0.679700 0.588400 -0.437900 +vn -0.437900 0.588400 -0.679700 +vn -0.647500 0.746300 -0.154400 +vn -0.154400 0.746300 -0.647500 +vn -0.827100 0.498100 -0.260600 +vn -0.260600 0.498100 -0.827100 +vn -0.764500 0.504900 -0.400800 +vn -0.400800 0.504900 -0.764500 +vn -0.626800 0.564800 -0.536800 +vn -0.536800 0.564800 -0.626800 +vn 0.190200 0.926700 -0.324200 +vn -0.324200 0.926700 0.190200 +vn -0.880000 0.474900 0.010800 +vn 0.010800 0.474900 -0.880000 +vn -0.902100 0.337100 -0.269600 +vn -0.269600 0.337100 -0.902100 +vn -0.928700 0.304500 -0.211500 +vn -0.211500 0.304500 -0.928700 +vn -0.733700 0.679400 0.009900 +vn 0.009900 0.679400 -0.733700 +vn -0.413600 0.910400 0.007800 +vn 0.007800 0.910400 -0.413600 +vn -0.422500 -0.858400 -0.290900 +vn -0.290900 -0.858400 -0.422500 +vn -0.710300 -0.703900 -0.002400 +vn -0.002400 -0.703900 -0.710300 +vn -0.917000 -0.046400 0.396100 +vn 0.396100 -0.046400 -0.917000 +vn -0.351200 0.422200 0.835700 +vn 0.835700 0.422200 -0.351200 +vn 0.697000 0.617900 0.363900 +vn 0.363900 0.617900 0.697000 +vn 0.751600 0.649400 0.115400 +vn 0.115400 0.649400 0.751600 +vn 0.864400 -0.492200 0.103000 +vn 0.103000 -0.492200 0.864400 +vn 0.693200 -0.583600 0.423000 +vn 0.423000 -0.583600 0.693200 +vn 0.253700 -0.503500 0.825900 +vn 0.825900 -0.503500 0.253700 +vn 0.794700 0.521300 -0.311100 +vn -0.311100 0.521300 0.794700 +vn 0.003500 -0.636700 0.771100 +vn 0.771100 -0.636700 0.003500 +vn -0.029700 -0.924700 -0.379600 +vn -0.379600 -0.924700 -0.029700 +s off +f 47/1/1 1/2/1 3/3/1 45/4/1 +f 4/5/2 2/6/2 48/7/2 46/8/2 +f 45/9/3 3/10/3 5/11/3 43/12/3 +f 6/11/4 4/10/4 46/9/4 44/12/4 +f 3/3/5 9/13/5 7/14/5 5/15/5 +f 8/16/6 10/17/6 4/5/6 6/18/6 +f 1/2/7 11/19/7 9/13/7 3/3/7 +f 10/17/8 12/20/8 2/6/8 4/5/8 +f 11/19/9 13/21/9 15/22/9 9/13/9 +f 16/23/10 14/24/10 12/20/10 10/17/10 +f 9/13/11 15/22/11 17/25/11 7/14/11 +f 18/26/12 16/23/12 10/17/12 8/16/12 +f 15/27/13 21/28/13 19/29/13 17/30/13 +f 20/29/14 22/28/14 16/27/14 18/30/14 +f 13/21/15 23/31/15 21/32/15 15/22/15 +f 22/33/16 24/34/16 14/24/16 16/23/16 +f 23/35/17 25/36/17 27/37/17 21/38/17 +f 28/39/18 26/40/18 24/41/18 22/42/18 +f 21/28/19 27/43/19 29/44/19 19/29/19 +f 30/44/20 28/43/20 22/28/20 20/29/20 +f 27/37/21 33/45/21 31/46/21 29/47/21 +f 32/48/22 34/49/22 28/39/22 30/50/22 +f 25/36/23 35/51/23 33/45/23 27/37/23 +f 34/49/24 36/52/24 26/40/24 28/39/24 +f 35/51/25 37/53/25 39/54/25 33/45/25 +f 40/55/26 38/56/26 36/52/26 34/49/26 +f 33/45/27 39/54/27 41/57/27 31/46/27 +f 42/58/28 40/55/28 34/49/28 32/48/28 +f 39/59/29 45/9/29 43/12/29 41/60/29 +f 44/12/30 46/9/30 40/59/30 42/60/30 +f 37/61/31 47/62/31 45/9/31 39/59/31 +f 46/9/32 48/62/32 38/61/32 40/59/32 +f 47/62/33 37/61/33 51/63/33 49/64/33 +f 52/63/34 38/61/34 48/62/34 50/64/34 +f 37/65/35 35/66/35 53/67/35 51/68/35 +f 54/69/36 36/70/36 38/71/36 52/72/36 +f 35/66/37 25/73/37 55/74/37 53/67/37 +f 56/75/38 26/76/38 36/70/38 54/69/38 +f 25/77/39 23/78/39 57/79/39 55/80/39 +f 58/79/40 24/78/40 26/77/40 56/80/40 +f 23/78/41 13/81/41 59/82/41 57/79/41 +f 60/82/42 14/81/42 24/78/42 58/79/42 +f 13/83/43 11/84/43 63/85/43 59/86/43 +f 64/87/44 12/88/44 14/89/44 60/90/44 +f 11/84/45 1/91/45 65/92/45 63/85/45 +f 66/93/46 2/94/46 12/88/46 64/87/46 +f 1/95/47 47/62/47 49/64/47 65/96/47 +f 50/64/48 48/62/48 2/95/48 66/96/48 +f 61/97/49 65/98/49 49/99/49 +f 50/100/50 66/101/50 62/102/50 +f 63/103/51 65/98/51 61/97/51 +f 62/102/52 66/101/52 64/104/52 +f 61/97/53 59/105/53 63/103/53 +f 64/104/54 60/106/54 62/102/54 +f 61/97/55 57/107/55 59/105/55 +f 60/106/56 58/108/56 62/102/56 +f 61/97/57 55/74/57 57/107/57 +f 58/108/58 56/75/58 62/102/58 +f 61/109/59 53/110/59 55/111/59 +f 56/112/60 54/113/60 62/114/60 +f 61/109/61 51/115/61 53/110/61 +f 54/113/62 52/116/62 62/114/62 +f 61/97/63 49/99/63 51/68/63 +f 52/72/64 50/100/64 62/102/64 +f 89/117/65 174/118/65 176/119/65 91/120/65 +f 176/119/66 175/121/66 90/122/66 91/120/66 +f 87/123/67 172/124/67 174/118/67 89/117/67 +f 175/121/68 173/125/68 88/126/68 90/122/68 +f 85/127/69 170/128/69 172/124/69 87/123/69 +f 173/125/70 171/129/70 86/130/70 88/126/70 +f 83/131/71 168/132/71 170/133/71 85/134/71 +f 171/133/72 169/132/72 84/131/72 86/134/72 +f 81/135/73 166/136/73 168/132/73 83/131/73 +f 169/132/74 167/136/74 82/135/74 84/131/74 +f 79/137/75 92/138/75 146/139/75 164/140/75 +f 147/141/76 93/142/76 80/143/76 165/144/76 +f 92/138/77 94/145/77 148/146/77 146/139/77 +f 149/147/78 95/148/78 93/142/78 147/141/78 +f 94/145/79 96/149/79 150/150/79 148/146/79 +f 151/151/80 97/152/80 95/148/80 149/147/80 +f 96/149/81 98/153/81 152/154/81 150/150/81 +f 153/155/82 99/156/82 97/152/82 151/151/82 +f 98/157/83 100/158/83 154/159/83 152/160/83 +f 155/161/84 101/162/84 99/163/84 153/164/84 +f 100/158/85 102/165/85 156/166/85 154/159/85 +f 157/167/86 103/168/86 101/162/86 155/161/86 +f 102/165/87 104/169/87 158/170/87 156/166/87 +f 159/171/88 105/172/88 103/168/88 157/167/88 +f 104/169/89 106/173/89 160/174/89 158/170/89 +f 161/175/90 107/176/90 105/172/90 159/171/90 +f 106/177/91 108/178/91 162/179/91 160/180/91 +f 163/179/92 109/178/92 107/177/92 161/180/92 +f 108/181/93 67/182/93 68/183/93 162/184/93 +f 68/183/94 67/182/94 109/185/94 163/186/94 +f 110/187/95 128/188/95 160/189/95 162/190/95 +f 161/191/96 129/192/96 111/193/96 163/194/96 +f 128/188/97 179/195/97 158/196/97 160/189/97 +f 159/197/98 180/198/98 129/192/98 161/191/98 +f 126/199/99 156/200/99 158/196/99 179/195/99 +f 159/197/100 157/201/100 127/202/100 180/198/100 +f 124/203/101 154/204/101 156/200/101 126/199/101 +f 157/201/102 155/205/102 125/206/102 127/202/102 +f 122/207/103 152/154/103 154/204/103 124/203/103 +f 155/205/104 153/155/104 123/208/104 125/206/104 +f 120/209/105 150/150/105 152/154/105 122/207/105 +f 153/155/106 151/151/106 121/210/106 123/208/106 +f 118/211/107 148/146/107 150/150/107 120/209/107 +f 151/151/108 149/147/108 119/212/108 121/210/108 +f 116/213/109 146/139/109 148/146/109 118/211/109 +f 149/147/110 147/141/110 117/214/110 119/212/110 +f 114/22/111 164/140/111 146/139/111 116/213/111 +f 147/141/112 165/144/112 115/23/112 117/214/112 +f 114/215/113 181/216/113 177/217/113 164/218/113 +f 177/217/114 182/219/114 115/220/114 165/221/114 +f 110/187/115 162/190/115 68/222/115 112/223/115 +f 68/222/116 163/194/116 111/193/116 113/224/116 +f 112/223/117 68/222/117 178/225/117 183/226/117 +f 178/225/118 68/222/118 113/224/118 184/227/118 +f 177/228/119 181/229/119 183/226/119 178/225/119 +f 184/227/120 182/230/120 177/228/120 178/225/120 +f 135/231/121 137/232/121 176/119/121 174/118/121 +f 176/119/122 137/232/122 136/233/122 175/121/122 +f 133/234/123 135/231/123 174/118/123 172/124/123 +f 175/121/124 136/233/124 134/235/124 173/125/124 +f 131/236/125 133/234/125 172/124/125 170/128/125 +f 173/125/126 134/235/126 132/237/126 171/129/126 +f 166/238/127 187/239/127 185/240/127 168/241/127 +f 186/242/128 188/243/128 167/244/128 169/245/128 +f 131/236/129 170/128/129 168/241/129 185/240/129 +f 169/245/130 171/129/130 132/237/130 186/242/130 +f 144/246/131 190/247/131 189/248/131 187/239/131 +f 189/248/132 190/247/132 145/249/132 188/243/132 +f 185/240/133 187/239/133 189/248/133 69/250/133 +f 189/248/134 188/243/134 186/242/134 69/250/134 +f 130/251/135 131/236/135 185/240/135 69/250/135 +f 186/242/135 132/237/135 130/251/135 69/250/135 +f 142/252/136 193/253/136 191/254/136 144/255/136 +f 192/254/137 194/253/137 143/252/137 145/255/137 +f 140/256/138 195/257/138 193/253/138 142/252/138 +f 194/253/139 196/257/139 141/256/139 143/252/139 +f 139/258/140 197/259/140 195/260/140 140/261/140 +f 196/262/141 198/263/141 139/258/141 141/264/141 +f 138/265/142 71/266/142 197/267/142 139/268/142 +f 198/267/143 71/266/143 138/265/143 139/268/143 +f 190/247/144 144/246/144 191/269/144 70/270/144 +f 192/271/145 145/249/145 190/247/145 70/270/145 +f 70/270/146 191/269/146 206/272/146 208/273/146 +f 207/274/147 192/271/147 70/270/147 208/273/147 +f 71/275/148 199/276/148 200/277/148 197/278/148 +f 201/279/149 199/276/149 71/275/149 198/280/149 +f 197/278/150 200/277/150 202/281/150 195/282/150 +f 203/283/151 201/279/151 198/280/151 196/284/151 +f 195/257/152 202/285/152 204/286/152 193/253/152 +f 205/286/153 203/285/153 196/257/153 194/253/153 +f 193/287/154 204/288/154 206/272/154 191/269/154 +f 207/274/155 205/289/155 194/290/155 192/271/155 +f 199/276/156 204/291/156 202/281/156 200/277/156 +f 203/283/157 205/292/157 199/276/157 201/279/157 +f 199/293/158 208/273/158 206/272/158 204/288/158 +f 207/274/159 208/273/159 199/293/159 205/289/159 +f 139/258/160 140/261/160 164/140/160 177/228/160 +f 165/144/161 141/264/161 139/258/161 177/228/161 +f 140/261/162 142/294/162 211/295/162 164/140/162 +f 212/296/163 143/297/163 141/264/163 165/144/163 +f 142/294/164 144/246/164 213/298/164 211/295/164 +f 214/299/165 145/249/165 143/297/165 212/296/165 +f 144/246/166 187/239/166 166/238/166 213/298/166 +f 167/244/167 188/243/167 145/249/167 214/299/167 +f 81/135/168 209/300/168 213/301/168 166/136/168 +f 214/301/169 210/300/169 82/135/169 167/136/169 +f 209/300/170 215/302/170 211/303/170 213/301/170 +f 212/303/171 216/302/171 210/300/171 214/301/171 +f 79/304/172 164/305/172 211/303/172 215/302/172 +f 212/303/173 165/305/173 80/304/173 216/302/173 +f 131/236/174 130/251/174 72/306/174 222/307/174 +f 72/306/175 130/251/175 132/237/175 223/308/175 +f 133/234/176 131/236/176 222/307/176 220/309/176 +f 223/308/177 132/237/177 134/235/177 221/310/177 +f 135/231/178 133/234/178 220/309/178 218/311/178 +f 221/310/179 134/235/179 136/233/179 219/312/179 +f 137/313/180 135/314/180 218/315/180 217/316/180 +f 219/317/181 136/318/181 137/313/181 217/316/181 +f 217/316/182 218/315/182 229/319/182 231/320/182 +f 230/321/183 219/317/183 217/316/183 231/320/183 +f 218/322/184 220/323/184 227/324/184 229/325/184 +f 228/324/185 221/323/185 219/322/185 230/325/185 +f 220/323/186 222/326/186 225/327/186 227/324/186 +f 226/327/187 223/326/187 221/323/187 228/324/187 +f 222/328/188 72/329/188 224/330/188 225/331/188 +f 224/330/189 72/329/189 223/332/189 226/333/189 +f 224/334/190 231/335/190 229/336/190 225/337/190 +f 230/338/191 231/335/191 224/334/191 226/339/191 +f 225/337/192 229/336/192 227/340/192 +f 228/341/193 230/338/193 226/339/193 +f 183/226/194 181/229/194 234/342/194 232/343/194 +f 235/344/195 182/230/195 184/227/195 233/345/195 +f 112/223/196 183/226/196 232/343/196 254/346/196 +f 233/345/197 184/227/197 113/224/197 255/347/197 +f 110/187/198 112/223/198 254/346/198 256/348/198 +f 255/347/199 113/224/199 111/193/199 257/349/199 +f 181/229/200 114/22/200 252/350/200 234/342/200 +f 253/351/201 115/23/201 182/230/201 235/344/201 +f 114/22/202 116/213/202 250/352/202 252/350/202 +f 251/353/203 117/214/203 115/23/203 253/351/203 +f 116/213/204 118/211/204 248/354/204 250/352/204 +f 249/355/205 119/212/205 117/214/205 251/353/205 +f 118/211/206 120/209/206 246/356/206 248/354/206 +f 247/357/207 121/210/207 119/212/207 249/355/207 +f 120/209/208 122/207/208 244/358/208 246/356/208 +f 245/359/209 123/208/209 121/210/209 247/357/209 +f 122/207/210 124/203/210 242/360/210 244/358/210 +f 243/361/211 125/206/211 123/208/211 245/359/211 +f 124/362/212 126/363/212 240/364/212 242/365/212 +f 241/366/213 127/367/213 125/368/213 243/369/213 +f 126/363/214 179/370/214 236/371/214 240/364/214 +f 237/372/215 180/373/215 127/367/215 241/366/215 +f 179/370/216 128/374/216 238/375/216 236/371/216 +f 239/376/217 129/377/217 180/373/217 237/372/217 +f 128/374/218 110/378/218 256/379/218 238/375/218 +f 257/380/219 111/381/219 129/377/219 239/376/219 +f 238/382/220 256/348/220 258/383/220 276/384/220 +f 259/385/221 257/349/221 239/386/221 277/387/221 +f 236/388/222 238/382/222 276/384/222 278/389/222 +f 277/387/223 239/386/223 237/390/223 279/391/223 +f 240/392/224 236/388/224 278/389/224 274/393/224 +f 279/391/225 237/390/225 241/394/225 275/395/225 +f 242/360/226 240/392/226 274/393/226 272/396/226 +f 275/395/227 241/394/227 243/361/227 273/397/227 +f 244/358/228 242/360/228 272/396/228 270/398/228 +f 273/397/229 243/361/229 245/359/229 271/399/229 +f 246/356/230 244/358/230 270/398/230 268/400/230 +f 271/399/231 245/359/231 247/357/231 269/401/231 +f 248/402/232 246/403/232 268/404/232 266/405/232 +f 269/406/233 247/407/233 249/408/233 267/409/233 +f 250/410/234 248/402/234 266/405/234 264/411/234 +f 267/409/235 249/408/235 251/412/235 265/413/235 +f 252/414/236 250/410/236 264/411/236 262/415/236 +f 265/413/237 251/412/237 253/416/237 263/417/237 +f 234/418/238 252/414/238 262/415/238 280/419/238 +f 263/417/239 253/416/239 235/420/239 281/421/239 +f 256/348/240 254/346/240 260/422/240 258/383/240 +f 261/423/241 255/347/241 257/349/241 259/385/241 +f 254/424/242 232/425/242 282/426/242 260/427/242 +f 283/426/243 233/425/243 255/424/243 261/427/243 +f 232/425/244 234/428/244 280/429/244 282/426/244 +f 281/429/245 235/428/245 233/425/245 283/426/245 +f 67/430/246 108/431/246 284/432/246 73/433/246 +f 285/434/247 109/435/247 67/430/247 73/433/247 +f 108/178/248 106/177/248 286/436/248 284/437/248 +f 287/436/249 107/177/249 109/178/249 285/437/249 +f 106/438/250 104/439/250 288/440/250 286/441/250 +f 289/442/251 105/443/251 107/444/251 287/445/251 +f 104/439/252 102/446/252 290/447/252 288/440/252 +f 291/448/253 103/449/253 105/443/253 289/442/253 +f 102/446/254 100/450/254 292/451/254 290/447/254 +f 293/452/255 101/453/255 103/449/255 291/448/255 +f 100/450/256 98/153/256 294/454/256 292/451/256 +f 295/455/257 99/156/257 101/453/257 293/452/257 +f 98/456/258 96/457/258 296/458/258 294/459/258 +f 297/458/259 97/457/259 99/456/259 295/459/259 +f 96/460/260 94/461/260 298/462/260 296/463/260 +f 299/464/261 95/465/261 97/466/261 297/467/261 +f 94/461/262 92/468/262 300/469/262 298/462/262 +f 301/470/263 93/471/263 95/465/263 299/464/263 +f 308/472/264 309/473/264 328/474/264 338/475/264 +f 329/476/265 309/473/265 308/472/265 339/477/265 +f 307/478/266 308/479/266 338/480/266 336/481/266 +f 339/482/267 308/479/267 307/478/267 337/483/267 +f 306/484/268 307/485/268 336/486/268 340/487/268 +f 337/488/269 307/485/269 306/484/269 341/489/269 +f 89/490/270 91/491/270 306/484/270 340/487/270 +f 306/484/271 91/491/271 90/492/271 341/489/271 +f 87/493/272 89/490/272 340/487/272 334/494/272 +f 341/489/273 90/492/273 88/495/273 335/496/273 +f 85/134/274 87/497/274 334/498/274 330/499/274 +f 335/498/275 88/497/275 86/134/275 331/499/275 +f 83/131/276 85/134/276 330/499/276 332/500/276 +f 331/499/277 86/134/277 84/131/277 333/500/277 +f 330/501/278 336/481/278 338/480/278 332/502/278 +f 339/482/279 337/483/279 331/503/279 333/504/279 +f 330/505/280 334/494/280 340/487/280 336/486/280 +f 341/489/281 335/496/281 331/506/281 337/488/281 +f 326/507/282 332/500/282 338/508/282 328/509/282 +f 339/508/283 333/500/283 327/507/283 329/509/283 +f 81/135/284 83/131/284 332/500/284 326/507/284 +f 333/500/285 84/131/285 82/135/285 327/507/285 +f 209/300/286 342/510/286 344/511/286 215/302/286 +f 345/511/287 343/510/287 210/300/287 216/302/287 +f 81/135/288 326/507/288 342/510/288 209/300/288 +f 343/510/289 327/507/289 82/135/289 210/300/289 +f 79/304/290 215/302/290 344/511/290 346/512/290 +f 345/511/291 216/302/291 80/304/291 347/512/291 +f 79/513/292 346/514/292 300/469/292 92/468/292 +f 301/470/293 347/515/293 80/516/293 93/471/293 +f 77/517/294 324/518/294 352/519/294 304/520/294 +f 353/521/295 325/522/295 77/517/295 304/520/295 +f 304/520/296 352/519/296 350/523/296 78/524/296 +f 351/525/297 353/521/297 304/520/297 78/524/297 +f 78/524/298 350/523/298 348/526/298 305/527/298 +f 349/528/299 351/525/299 78/524/299 305/527/299 +f 305/527/300 348/526/300 328/474/300 309/473/300 +f 329/476/301 349/528/301 305/527/301 309/473/301 +f 326/507/302 328/509/302 348/529/302 342/510/302 +f 349/529/303 329/509/303 327/507/303 343/510/303 +f 296/458/304 298/530/304 318/531/304 310/532/304 +f 319/531/305 299/530/305 297/458/305 311/532/305 +f 76/533/306 316/534/306 324/535/306 77/536/306 +f 325/537/307 317/538/307 76/533/307 77/536/307 +f 302/539/308 358/540/308 356/541/308 303/542/308 +f 357/543/309 359/544/309 302/539/309 303/542/309 +f 303/545/310 356/546/310 354/547/310 75/548/310 +f 355/549/311 357/550/311 303/545/311 75/548/311 +f 75/548/312 354/547/312 316/534/312 76/533/312 +f 317/538/313 355/549/313 75/548/313 76/533/313 +f 292/551/314 294/552/314 362/553/314 364/554/314 +f 363/555/315 295/556/315 293/557/315 365/558/315 +f 364/554/316 362/553/316 368/559/316 366/560/316 +f 369/561/317 363/555/317 365/558/317 367/562/317 +f 366/560/318 368/559/318 370/563/318 372/564/318 +f 371/565/319 369/561/319 367/562/319 373/566/319 +f 372/567/320 370/568/320 376/569/320 374/570/320 +f 377/569/321 371/568/321 373/567/321 375/570/321 +f 314/571/322 378/572/322 374/573/322 376/574/322 +f 375/575/323 379/576/323 315/577/323 377/578/323 +f 316/534/324 354/547/324 374/573/324 378/572/324 +f 375/575/325 355/549/325 317/538/325 379/576/325 +f 354/579/326 356/580/326 372/567/326 374/570/326 +f 373/567/327 357/580/327 355/579/327 375/570/327 +f 356/580/328 358/581/328 366/582/328 372/567/328 +f 367/582/329 359/581/329 357/580/329 373/567/329 +f 358/581/330 360/583/330 364/584/330 366/582/330 +f 365/584/331 361/583/331 359/581/331 367/582/331 +f 290/585/332 292/551/332 364/554/332 360/586/332 +f 365/558/333 293/557/333 291/587/333 361/588/333 +f 74/589/334 360/586/334 358/540/334 302/539/334 +f 359/544/335 361/588/335 74/589/335 302/539/335 +f 284/432/336 286/441/336 288/440/336 290/447/336 +f 289/442/337 287/445/337 285/434/337 291/448/337 +f 284/590/338 290/585/338 360/586/338 74/589/338 +f 361/588/339 291/587/339 285/591/339 74/589/339 +f 73/592/340 284/590/340 74/589/340 +f 74/589/341 285/591/341 73/592/341 +f 294/459/342 296/458/342 310/532/342 362/593/342 +f 311/532/343 297/458/343 295/459/343 363/593/343 +f 310/532/344 312/594/344 368/595/344 362/593/344 +f 369/595/345 313/594/345 311/532/345 363/593/345 +f 312/594/346 382/596/346 370/568/346 368/595/346 +f 371/568/347 383/596/347 313/594/347 369/595/347 +f 314/597/348 376/569/348 370/568/348 382/596/348 +f 371/568/349 377/569/349 315/597/349 383/596/349 +f 348/529/350 350/598/350 386/599/350 384/600/350 +f 387/599/351 351/598/351 349/529/351 385/600/351 +f 318/601/352 384/602/352 386/603/352 320/604/352 +f 387/605/353 385/606/353 319/607/353 321/608/353 +f 298/609/354 300/610/354 384/611/354 318/612/354 +f 385/613/355 301/614/355 299/615/355 319/616/355 +f 300/610/356 344/617/356 342/618/356 384/611/356 +f 343/619/357 345/620/357 301/614/357 385/613/357 +f 342/510/358 348/529/358 384/600/358 +f 385/600/359 349/529/359 343/510/359 +f 300/610/360 346/621/360 344/617/360 +f 345/620/361 347/622/361 301/614/361 +f 314/623/362 322/624/362 380/625/362 378/626/362 +f 381/627/363 323/628/363 315/629/363 379/630/363 +f 316/631/364 378/626/364 380/625/364 324/518/364 +f 381/627/365 379/630/365 317/632/365 325/522/365 +f 320/604/366 386/603/366 380/625/366 322/624/366 +f 381/627/367 387/605/367 321/608/367 323/628/367 +f 350/598/368 352/633/368 380/634/368 386/599/368 +f 381/634/369 353/633/369 351/598/369 387/599/369 +f 324/518/370 380/625/370 352/519/370 +f 353/521/371 381/627/371 325/522/371 +f 400/635/372 388/636/372 414/637/372 402/638/372 +f 415/639/373 389/640/373 401/641/373 403/642/373 +f 400/635/374 402/638/374 404/643/374 398/644/374 +f 405/645/375 403/642/375 401/641/375 399/646/375 +f 398/647/376 404/648/376 406/649/376 396/650/376 +f 407/651/377 405/652/377 399/653/377 397/654/377 +f 396/650/378 406/649/378 408/655/378 394/656/378 +f 409/657/379 407/651/379 397/654/379 395/658/379 +f 394/656/380 408/655/380 410/659/380 392/660/380 +f 411/661/381 409/657/381 395/658/381 393/662/381 +f 392/660/382 410/659/382 412/663/382 390/664/382 +f 413/665/383 411/661/383 393/662/383 391/666/383 +f 410/667/384 420/668/384 418/669/384 412/670/384 +f 419/671/385 421/672/385 411/673/385 413/674/385 +f 408/675/386 422/676/386 420/668/386 410/667/386 +f 421/672/387 423/677/387 409/678/387 411/673/387 +f 406/679/388 424/680/388 422/681/388 408/682/388 +f 423/681/389 425/680/389 407/679/389 409/682/389 +f 404/648/390 426/683/390 424/684/390 406/649/390 +f 425/685/391 427/686/391 405/652/391 407/651/391 +f 402/687/392 428/688/392 426/683/392 404/648/392 +f 427/686/393 429/689/393 403/690/393 405/652/393 +f 402/687/394 414/691/394 416/692/394 428/688/394 +f 417/693/395 415/694/395 403/690/395 429/689/395 +f 318/531/396 320/695/396 444/696/396 442/697/396 +f 445/696/397 321/695/397 319/531/397 443/697/397 +f 320/604/398 390/698/398 412/670/398 444/699/398 +f 413/674/399 391/700/399 321/608/399 445/701/399 +f 310/532/400 318/531/400 442/697/400 312/594/400 +f 443/697/401 319/531/401 311/532/401 313/594/401 +f 382/702/402 430/703/402 414/691/402 388/704/402 +f 415/694/403 431/705/403 383/706/403 389/707/403 +f 412/670/404 418/669/404 440/708/404 444/699/404 +f 441/709/405 419/671/405 413/674/405 445/701/405 +f 438/710/406 446/711/406 444/712/406 440/713/406 +f 445/714/407 447/715/407 439/716/407 441/717/407 +f 434/718/408 446/719/408 438/720/408 436/721/408 +f 439/722/409 447/723/409 435/724/409 437/725/409 +f 432/726/410 448/727/410 446/728/410 434/729/410 +f 447/728/411 449/727/411 433/726/411 435/729/411 +f 430/703/412 448/730/412 432/731/412 450/732/412 +f 433/733/413 449/734/413 431/705/413 451/735/413 +f 414/691/414 430/703/414 450/732/414 416/692/414 +f 451/735/415 431/705/415 415/694/415 417/693/415 +f 312/594/416 448/727/416 430/736/416 382/596/416 +f 431/736/417 449/727/417 313/594/417 383/596/417 +f 312/594/418 442/697/418 446/728/418 448/727/418 +f 447/728/419 443/697/419 313/594/419 449/727/419 +f 442/697/420 444/696/420 446/728/420 +f 447/728/421 445/696/421 443/697/421 +f 416/737/422 450/738/422 452/739/422 476/740/422 +f 453/739/423 451/738/423 417/737/423 477/740/423 +f 450/738/424 432/726/424 462/741/424 452/739/424 +f 463/741/425 433/726/425 451/738/425 453/739/425 +f 432/726/426 434/729/426 460/742/426 462/741/426 +f 461/742/427 435/729/427 433/726/427 463/741/427 +f 434/718/428 436/721/428 458/743/428 460/744/428 +f 459/745/429 437/725/429 435/724/429 461/746/429 +f 436/747/430 438/748/430 456/749/430 458/750/430 +f 457/749/431 439/748/431 437/747/431 459/750/431 +f 438/748/432 440/751/432 454/752/432 456/749/432 +f 455/752/433 441/751/433 439/748/433 457/749/433 +f 440/708/434 418/669/434 474/753/434 454/754/434 +f 475/755/435 419/671/435 441/709/435 455/756/435 +f 428/688/436 416/692/436 476/757/436 464/758/436 +f 477/759/437 417/693/437 429/689/437 465/760/437 +f 426/683/438 428/688/438 464/758/438 466/761/438 +f 465/760/439 429/689/439 427/686/439 467/762/439 +f 424/680/440 426/763/440 466/764/440 468/765/440 +f 467/764/441 427/763/441 425/680/441 469/765/441 +f 422/681/442 424/680/442 468/765/442 470/766/442 +f 469/765/443 425/680/443 423/681/443 471/766/443 +f 420/767/444 422/768/444 470/769/444 472/770/444 +f 471/771/445 423/772/445 421/773/445 473/774/445 +f 418/669/446 420/668/446 472/775/446 474/753/446 +f 473/776/447 421/672/447 419/671/447 475/755/447 +f 458/777/448 456/778/448 480/779/448 478/780/448 +f 481/781/449 457/782/449 459/783/449 479/784/449 +f 478/780/450 480/779/450 482/785/450 484/786/450 +f 483/787/451 481/781/451 479/784/451 485/788/451 +f 484/786/452 482/785/452 488/789/452 486/790/452 +f 489/791/453 483/787/453 485/788/453 487/792/453 +f 486/790/454 488/789/454 490/793/454 492/794/454 +f 491/795/455 489/791/455 487/792/455 493/796/455 +f 464/797/456 476/798/456 486/799/456 492/800/456 +f 487/801/457 477/802/457 465/803/457 493/804/457 +f 452/805/458 484/786/458 486/790/458 476/757/458 +f 487/792/459 485/788/459 453/806/459 477/759/459 +f 452/805/460 462/807/460 478/780/460 484/786/460 +f 479/784/461 463/808/461 453/806/461 485/788/461 +f 458/777/462 478/780/462 462/807/462 460/809/462 +f 463/808/463 479/784/463 459/783/463 461/810/463 +f 454/754/464 474/753/464 480/811/464 456/812/464 +f 481/813/465 475/755/465 455/756/465 457/814/465 +f 472/815/466 482/816/466 480/817/466 474/818/466 +f 481/817/467 483/816/467 473/815/467 475/818/467 +f 470/769/468 488/789/468 482/785/468 472/770/468 +f 483/787/469 489/791/469 471/771/469 473/774/469 +f 468/819/470 490/793/470 488/789/470 470/769/470 +f 489/791/471 491/795/471 469/820/471 471/771/471 +f 466/821/472 492/800/472 490/822/472 468/823/472 +f 491/824/473 493/804/473 467/825/473 469/826/473 +f 464/797/474 492/800/474 466/821/474 +f 467/825/475 493/804/475 465/803/475 +f 392/827/476 390/698/476 504/828/476 502/829/476 +f 505/830/477 391/700/477 393/831/477 503/832/477 +f 394/833/478 392/827/478 502/829/478 500/834/478 +f 503/832/479 393/831/479 395/835/479 501/836/479 +f 396/837/480 394/838/480 500/839/480 498/840/480 +f 501/839/481 395/838/481 397/837/481 499/840/481 +f 398/841/482 396/837/482 498/840/482 496/842/482 +f 499/840/483 397/837/483 399/841/483 497/842/483 +f 400/843/484 398/647/484 496/844/484 494/845/484 +f 497/846/485 399/653/485 401/847/485 495/848/485 +f 388/636/486 400/635/486 494/849/486 506/850/486 +f 495/851/487 401/641/487 389/640/487 507/852/487 +f 494/845/488 502/853/488 504/854/488 506/855/488 +f 505/856/489 503/857/489 495/848/489 507/858/489 +f 494/845/490 496/844/490 500/859/490 502/853/490 +f 501/860/491 497/846/491 495/848/491 503/857/491 +f 496/844/492 498/861/492 500/859/492 +f 501/860/493 499/862/493 497/846/493 +f 314/597/494 382/596/494 388/863/494 506/864/494 +f 389/863/495 383/596/495 315/597/495 507/864/495 +f 314/623/496 506/850/496 504/828/496 322/624/496 +f 505/830/497 507/852/497 315/629/497 323/628/497 +f 320/604/498 322/624/498 504/828/498 390/698/498 +f 505/830/499 323/628/499 321/608/499 391/700/499 diff --git a/mods/mylandscaping/models/mylandscaping_columna_ic_b.obj b/mods/mylandscaping/models/mylandscaping_columna_ic_b.obj new file mode 100644 index 00000000..23aa21d6 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columna_ic_b.obj @@ -0,0 +1,239 @@ +# Blender v2.76 (sub 2) OBJ File: 'Adaridge_walls.blend' +# www.blender.org +o Adaridge_C_IC_B_Plane.006 +v -0.500000 -0.500000 0.500000 +v -0.100000 -0.500000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.100000 -0.300000 0.500000 +v -0.100000 -0.500000 0.500000 +v 0.300000 -0.300000 0.500000 +v 0.300000 -0.500000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.300000 0.100000 0.500000 +v 0.500000 0.100000 0.500000 +v 0.100000 0.100000 0.500000 +v 0.500000 0.100000 0.500000 +v 0.100000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.100000 0.100000 0.500000 +v -0.100000 0.100000 0.500000 +v 0.100000 -0.300000 0.500000 +v -0.100000 -0.300000 0.500000 +v -0.500000 0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.100000 0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.300000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.300000 0.100000 0.500000 +v -0.500000 0.100000 0.500000 +v -0.300000 0.100000 0.500000 +v 0.100000 0.100000 0.500000 +v -0.300000 0.500000 0.500000 +v 0.100000 0.500000 0.500000 +v 0.300000 0.100000 0.500000 +v 0.100000 0.100000 0.500000 +v 0.300000 -0.300000 0.500000 +v 0.100000 -0.300000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.300000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 -0.100000 -0.500000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 -0.100000 0.100000 +v -0.500000 0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 -0.300000 0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.100000 0.500000 +v -0.500000 0.500000 0.100000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.100000 -0.100000 +v -0.500000 -0.300000 0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 0.100000 -0.500000 +v -0.500000 -0.100000 -0.500000 +v -0.500000 0.100000 -0.100000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 0.500000 -0.300000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.100000 -0.300000 +v -0.500000 0.100000 -0.500000 +v -0.500000 0.100000 -0.300000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.500000 -0.300000 +v -0.500000 0.500000 0.100000 +v -0.500000 -0.100000 0.300000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.500000 0.300000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.100000 0.300000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.300000 +v 0.500000 -0.300000 -0.500000 +v 0.100000 -0.300000 -0.500000 +v 0.500000 0.100000 -0.500000 +v 0.100000 0.100000 -0.500000 +v -0.100000 0.100000 -0.500000 +v -0.100000 -0.100000 -0.500000 +v -0.500000 0.100000 -0.500000 +v -0.500000 -0.100000 -0.500000 +v 0.100000 -0.500000 -0.500000 +v -0.100000 -0.500000 -0.500000 +v 0.100000 -0.300000 -0.500000 +v -0.100000 -0.300000 -0.500000 +v -0.100000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.100000 -0.100000 -0.500000 +v -0.500000 -0.100000 -0.500000 +v -0.100000 0.100000 -0.500000 +v 0.100000 0.100000 -0.500000 +v -0.100000 -0.300000 -0.500000 +v 0.100000 -0.300000 -0.500000 +v 0.500000 -0.300000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.100000 -0.300000 -0.500000 +v 0.100000 -0.500000 -0.500000 +v 0.300000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.300000 0.100000 -0.500000 +v 0.500000 0.100000 -0.500000 +v 0.300000 0.100000 -0.500000 +v -0.100000 0.100000 -0.500000 +v 0.300000 0.500000 -0.500000 +v -0.100000 0.500000 -0.500000 +v -0.300000 0.500000 -0.500000 +v -0.100000 0.500000 -0.500000 +v -0.300000 0.100000 -0.500000 +v -0.100000 0.100000 -0.500000 +v -0.500000 0.500000 -0.500000 +v -0.300000 0.500000 -0.500000 +v -0.500000 0.100000 -0.500000 +v -0.300000 0.100000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.100000 +v 0.500000 -0.100000 0.500000 +v 0.500000 -0.100000 0.100000 +v 0.500000 -0.300000 0.100000 +v 0.500000 -0.500000 0.100000 +v 0.500000 -0.300000 -0.300000 +v 0.500000 -0.500000 -0.300000 +v 0.500000 -0.500000 -0.300000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.300000 -0.300000 +v 0.500000 -0.300000 -0.500000 +v 0.500000 -0.300000 -0.100000 +v 0.500000 -0.300000 -0.500000 +v 0.500000 0.100000 -0.100000 +v 0.500000 0.100000 -0.500000 +v 0.500000 0.100000 -0.100000 +v 0.500000 0.100000 0.100000 +v 0.500000 -0.300000 -0.100000 +v 0.500000 -0.300000 0.100000 +v 0.500000 0.100000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.500000 0.100000 0.100000 +v 0.500000 -0.100000 0.100000 +v 0.500000 0.500000 0.300000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.100000 0.300000 +v 0.500000 0.100000 0.500000 +v 0.500000 0.100000 0.300000 +v 0.500000 0.100000 -0.100000 +v 0.500000 0.500000 0.300000 +v 0.500000 0.500000 -0.100000 +v 0.500000 0.500000 -0.300000 +v 0.500000 0.500000 -0.100000 +v 0.500000 0.100000 -0.300000 +v 0.500000 0.100000 -0.100000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.300000 +v 0.500000 0.100000 -0.500000 +v 0.500000 0.100000 -0.300000 +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 +vt 0.333333 0.714286 +vt 0.666667 0.714286 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 0.333333 0.571429 +vt 0.333333 0.428571 +vt 0.666667 0.428571 +vt 0.666667 0.571429 +vt -0.000000 0.857143 +vt -0.000000 0.714286 +vt 0.166667 0.714286 +vt 0.166667 0.857143 +vt 1.000000 0.714286 +vt 1.000000 1.000000 +vt 0.000000 0.571429 +vt 0.000000 0.428571 +vt 1.000000 0.428571 +vt 0.333333 0.857143 +vt -0.000000 1.000000 +vt 0.166667 1.000000 +vt 0.833333 -0.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.142857 +vt 0.833333 0.142857 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 -1.000000 0.000000 +g Adaridge_C_IC_B_Plane.006_None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 5/5/1 6/6/1 8/7/1 7/8/1 +f 9/9/1 10/10/1 12/11/1 11/12/1 +f 13/2/1 14/13/1 16/14/1 15/3/1 +f 17/15/1 18/16/1 20/6/1 19/5/1 +f 21/1/1 22/5/1 24/8/1 23/2/1 +f 25/5/1 26/6/1 28/7/1 27/8/1 +f 29/7/1 30/17/1 32/13/1 31/2/1 +f 33/10/1 34/15/1 36/5/1 35/1/1 +f 37/1/1 38/5/1 40/8/1 39/2/1 +f 41/7/2 42/17/2 44/13/2 43/2/2 +f 45/1/2 46/5/2 48/8/2 47/2/2 +f 49/12/2 50/11/2 52/1/2 51/18/2 +f 53/1/2 54/2/2 56/3/2 55/4/2 +f 57/1/2 58/5/2 60/8/2 59/2/2 +f 61/5/2 62/6/2 64/7/2 63/8/2 +f 65/1/2 66/5/2 68/8/2 67/2/2 +f 69/2/2 70/13/2 72/14/2 71/3/2 +f 73/15/2 74/16/2 76/6/2 75/5/2 +f 77/1/2 78/5/2 80/8/2 79/2/2 +f 81/1/3 82/2/3 84/3/3 83/4/3 +f 85/5/3 86/1/3 88/10/3 87/15/3 +f 89/19/3 90/9/3 92/12/3 91/20/3 +f 93/2/3 94/13/3 96/14/3 95/3/3 +f 97/7/3 98/8/3 100/5/3 99/6/3 +f 101/15/3 102/16/3 104/6/3 103/5/3 +f 105/10/3 106/15/3 108/5/3 107/1/3 +f 109/7/3 110/17/3 112/13/3 111/2/3 +f 113/5/3 114/6/3 116/7/3 115/8/3 +f 117/1/3 118/5/3 120/8/3 119/2/3 +f 121/1/4 122/2/4 124/3/4 123/4/4 +f 125/1/4 126/5/4 128/8/4 127/2/4 +f 129/20/4 130/12/4 132/18/4 131/4/4 +f 133/7/4 134/17/4 136/13/4 135/2/4 +f 137/5/4 138/6/4 140/7/4 139/8/4 +f 141/10/4 142/15/4 144/5/4 143/1/4 +f 145/8/4 146/2/4 148/1/4 147/5/4 +f 149/2/4 150/13/4 152/14/4 151/3/4 +f 153/15/4 154/16/4 156/6/4 155/5/4 +f 157/5/4 158/6/4 160/7/4 159/8/4 +f 161/21/5 162/22/5 164/23/5 163/24/5 diff --git a/mods/mylandscaping/models/mylandscaping_columna_ic_t.obj b/mods/mylandscaping/models/mylandscaping_columna_ic_t.obj new file mode 100644 index 00000000..4d6ac084 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columna_ic_t.obj @@ -0,0 +1,255 @@ +# Blender v2.76 (sub 1) OBJ File: 'Adaridge_walls.blend' +# www.blender.org +o Adaridge_C_IC_T_Plane.008 +v -0.500000 0.600000 0.500000 +v 0.500000 0.600000 0.500000 +v -0.500000 0.600000 -0.500000 +v 0.500000 0.600000 -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.100000 0.500000 -0.500000 +v 0.500000 0.100000 -0.500000 +v 0.100000 0.100000 -0.500000 +v 0.100000 0.300000 -0.500000 +v 0.100000 0.500000 -0.500000 +v -0.300000 0.300000 -0.500000 +v -0.300000 0.500000 -0.500000 +v -0.300000 0.100000 -0.500000 +v -0.500000 0.100000 -0.500000 +v -0.300000 -0.100000 -0.500000 +v -0.500000 -0.100000 -0.500000 +v -0.100000 -0.100000 -0.500000 +v -0.500000 -0.100000 -0.500000 +v -0.100000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.100000 -0.100000 -0.500000 +v 0.100000 -0.100000 -0.500000 +v -0.100000 0.300000 -0.500000 +v 0.100000 0.300000 -0.500000 +v 0.500000 -0.100000 -0.500000 +v 0.500000 0.100000 -0.500000 +v 0.100000 -0.100000 -0.500000 +v 0.100000 0.100000 -0.500000 +v 0.300000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.300000 -0.100000 -0.500000 +v 0.500000 -0.100000 -0.500000 +v 0.300000 -0.100000 -0.500000 +v -0.100000 -0.100000 -0.500000 +v 0.300000 -0.500000 -0.500000 +v -0.100000 -0.500000 -0.500000 +v -0.300000 -0.100000 -0.500000 +v -0.100000 -0.100000 -0.500000 +v -0.300000 0.300000 -0.500000 +v -0.100000 0.300000 -0.500000 +v -0.500000 0.100000 -0.500000 +v -0.300000 0.100000 -0.500000 +v -0.500000 0.500000 -0.500000 +v -0.300000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.100000 +v 0.500000 0.100000 0.500000 +v 0.500000 0.100000 0.100000 +v 0.500000 -0.100000 -0.100000 +v 0.500000 0.100000 -0.100000 +v 0.500000 -0.100000 -0.500000 +v 0.500000 0.100000 -0.500000 +v 0.500000 0.500000 0.100000 +v 0.500000 0.500000 -0.100000 +v 0.500000 0.300000 0.100000 +v 0.500000 0.300000 -0.100000 +v 0.500000 -0.100000 -0.100000 +v 0.500000 -0.100000 -0.500000 +v 0.500000 -0.500000 -0.100000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.100000 -0.100000 +v 0.500000 -0.100000 0.100000 +v 0.500000 0.300000 -0.100000 +v 0.500000 0.300000 0.100000 +v 0.500000 -0.100000 0.500000 +v 0.500000 0.100000 0.500000 +v 0.500000 -0.100000 0.100000 +v 0.500000 0.100000 0.100000 +v 0.500000 -0.500000 0.300000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.100000 0.300000 +v 0.500000 -0.100000 0.500000 +v 0.500000 -0.100000 0.300000 +v 0.500000 -0.100000 -0.100000 +v 0.500000 -0.500000 0.300000 +v 0.500000 -0.500000 -0.100000 +v 0.500000 0.100000 -0.300000 +v 0.500000 0.100000 -0.100000 +v 0.500000 0.500000 -0.300000 +v 0.500000 0.500000 -0.100000 +v 0.500000 0.100000 -0.500000 +v 0.500000 0.100000 -0.300000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.300000 +v -0.500000 0.300000 0.500000 +v -0.100000 0.300000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v 0.100000 -0.100000 0.500000 +v 0.100000 0.100000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.500000 0.100000 0.500000 +v -0.100000 0.500000 0.500000 +v 0.100000 0.500000 0.500000 +v -0.100000 0.300000 0.500000 +v 0.100000 0.300000 0.500000 +v 0.100000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.100000 0.100000 0.500000 +v 0.500000 0.100000 0.500000 +v 0.100000 -0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v 0.100000 0.300000 0.500000 +v -0.100000 0.300000 0.500000 +v -0.500000 0.300000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.100000 0.300000 0.500000 +v -0.100000 0.500000 0.500000 +v -0.300000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.300000 -0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.300000 -0.100000 0.500000 +v 0.100000 -0.100000 0.500000 +v -0.300000 -0.500000 0.500000 +v 0.100000 -0.500000 0.500000 +v 0.300000 -0.500000 0.500000 +v 0.100000 -0.500000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.100000 -0.100000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.300000 -0.500000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.100000 +v -0.500000 0.100000 -0.500000 +v -0.500000 0.100000 -0.100000 +v -0.500000 0.300000 -0.100000 +v -0.500000 0.500000 -0.100000 +v -0.500000 0.300000 0.300000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.300000 0.300000 +v -0.500000 0.300000 0.500000 +v -0.500000 0.300000 0.100000 +v -0.500000 0.300000 0.500000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 0.300000 0.100000 +v -0.500000 0.300000 -0.100000 +v -0.500000 -0.100000 -0.500000 +v -0.500000 0.100000 -0.500000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 0.100000 -0.100000 +v -0.500000 -0.500000 -0.300000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 -0.100000 -0.500000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.500000 -0.300000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.500000 0.300000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.100000 0.300000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.300000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.100000 0.300000 +vt 0.083333 0.428571 +vt 0.916667 0.428571 +vt 0.916667 0.142857 +vt 0.083333 0.142857 +vt 0.833333 0.071429 +vt 0.833333 0.142857 +vt -0.000000 0.142857 +vt -0.000000 0.071429 +vt 0.833333 0.000000 +vt 0.000000 0.000000 +vt 0.333333 0.714286 +vt 0.333333 1.000000 +vt 0.666667 1.000000 +vt 0.666667 0.714286 +vt 0.333333 0.571429 +vt 0.666667 0.571429 +vt 0.666667 0.428571 +vt 0.333333 0.428571 +vt -0.000000 0.857143 +vt 0.166667 0.857143 +vt 0.166667 0.714286 +vt -0.000000 0.714286 +vt 1.000000 1.000000 +vt 1.000000 0.714286 +vt 0.000000 0.571429 +vt 0.000000 0.428571 +vt 1.000000 0.428571 +vt 0.333333 0.857143 +vt -0.000000 1.000000 +vt 0.166667 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +g Adaridge_C_IC_T_Plane.008_None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 4/5/2 8/6/2 5/7/2 3/8/2 +f 1/8/2 2/5/2 7/9/2 6/10/2 +f 2/8/3 7/10/3 8/9/3 4/5/3 +f 3/5/3 1/8/3 6/7/3 5/6/3 +f 9/11/2 11/12/2 12/13/2 10/14/2 +f 13/15/2 15/16/2 16/17/2 14/18/2 +f 17/19/2 19/20/2 20/21/2 18/22/2 +f 21/14/2 23/13/2 24/23/2 22/24/2 +f 25/25/2 27/15/2 28/18/2 26/26/2 +f 29/11/2 31/14/2 32/16/2 30/15/2 +f 33/15/2 35/16/2 36/17/2 34/18/2 +f 37/17/2 39/14/2 40/24/2 38/27/2 +f 41/22/2 43/11/2 44/15/2 42/25/2 +f 45/11/2 47/14/2 48/16/2 46/15/2 +f 49/17/3 51/14/3 52/24/3 50/27/3 +f 53/11/3 55/14/3 56/16/3 54/15/3 +f 57/20/3 59/28/3 60/11/3 58/21/3 +f 61/11/3 63/12/3 64/13/3 62/14/3 +f 65/11/3 67/14/3 68/16/3 66/15/3 +f 69/15/3 71/16/3 72/17/3 70/18/3 +f 73/11/3 75/14/3 76/16/3 74/15/3 +f 77/14/3 79/13/3 80/23/3 78/24/3 +f 81/25/3 83/15/3 84/18/3 82/26/3 +f 85/11/3 87/14/3 88/16/3 86/15/3 +f 89/11/4 91/12/4 92/13/4 90/14/4 +f 93/15/4 95/25/4 96/22/4 94/11/4 +f 97/29/4 99/30/4 100/20/4 98/19/4 +f 101/14/4 103/13/4 104/23/4 102/24/4 +f 105/17/4 107/18/4 108/15/4 106/16/4 +f 109/25/4 111/15/4 112/18/4 110/26/4 +f 113/22/4 115/11/4 116/15/4 114/25/4 +f 117/17/4 119/14/4 120/24/4 118/27/4 +f 121/15/4 123/16/4 124/17/4 122/18/4 +f 125/11/4 127/14/4 128/16/4 126/15/4 +f 129/11/5 131/12/5 132/13/5 130/14/5 +f 133/11/5 135/14/5 136/16/5 134/15/5 +f 137/30/5 139/12/5 140/28/5 138/20/5 +f 141/17/5 143/14/5 144/24/5 142/27/5 +f 145/15/5 147/16/5 148/17/5 146/18/5 +f 149/22/5 151/11/5 152/15/5 150/25/5 +f 153/16/5 155/15/5 156/11/5 154/14/5 +f 157/14/5 159/13/5 160/23/5 158/24/5 +f 161/25/5 163/15/5 164/18/5 162/26/5 +f 165/15/5 167/16/5 168/17/5 166/18/5 +g Adaridge_C_IC_T_Plane.008_None_NONE +f 6/10/1 7/10/1 8/10/1 5/10/1 diff --git a/mods/mylandscaping/models/mylandscaping_columna_m_b.obj b/mods/mylandscaping/models/mylandscaping_columna_m_b.obj new file mode 100644 index 00000000..1aa1640c --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columna_m_b.obj @@ -0,0 +1,280 @@ +# Blender v2.76 (sub 2) OBJ File: 'Adaridge_walls.blend' +# www.blender.org +o Adaridge_C_M_B_Plane.001 +v -0.500000 -0.500000 -0.300000 +v -0.100000 -0.500000 -0.300000 +v -0.500000 -0.100000 -0.300000 +v -0.100000 -0.100000 -0.300000 +v -0.100000 -0.300000 -0.300000 +v 0.100000 -0.300000 -0.300000 +v -0.100000 0.100000 -0.300000 +v 0.100000 0.100000 -0.300000 +v 0.100000 -0.500000 -0.300000 +v 0.500000 -0.500000 -0.300000 +v 0.100000 -0.100000 -0.300000 +v 0.500000 -0.100000 -0.300000 +v -0.100000 -0.500000 -0.300000 +v 0.100000 -0.500000 -0.300000 +v -0.100000 -0.300000 -0.300000 +v 0.100000 -0.300000 -0.300000 +v -0.300000 -0.100000 -0.200000 +v -0.100000 -0.100000 -0.200000 +v -0.300000 0.300000 -0.200000 +v -0.100000 0.300000 -0.200000 +v 0.100000 -0.100000 -0.200000 +v 0.300000 -0.100000 -0.200000 +v 0.100000 0.300000 -0.200000 +v 0.300000 0.300000 -0.200000 +v -0.500000 -0.100000 -0.300000 +v -0.300000 -0.100000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.300000 0.100000 -0.300000 +v 0.300000 -0.100000 -0.300000 +v 0.500000 -0.100000 -0.300000 +v 0.300000 0.100000 -0.300000 +v 0.500000 0.100000 -0.300000 +v 0.300000 0.100000 -0.300000 +v 0.500000 0.100000 -0.300000 +v 0.300000 0.500000 -0.300000 +v 0.500000 0.500000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.300000 0.100000 -0.300000 +v -0.500000 0.500000 -0.300000 +v -0.300000 0.500000 -0.300000 +v -0.100000 0.100000 -0.300000 +v 0.100000 0.100000 -0.300000 +v -0.100000 0.500000 -0.300000 +v 0.100000 0.500000 -0.300000 +v -0.300000 0.300000 -0.300000 +v -0.100000 0.300000 -0.300000 +v -0.300000 0.500000 -0.300000 +v -0.100000 0.500000 -0.300000 +v 0.100000 0.300000 -0.300000 +v 0.300000 0.300000 -0.300000 +v 0.100000 0.500000 -0.300000 +v 0.300000 0.500000 -0.300000 +v -0.500000 -0.500000 -0.100000 +v 0.500000 -0.100000 -0.200000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 -0.100000 -0.200000 +v 0.500000 -0.500000 -0.100000 +v 0.500000 -0.100000 -0.100000 +v 0.100000 -0.100000 -0.200000 +v -0.100000 -0.100000 -0.200000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 0.100000 -0.100000 +v 0.500000 -0.100000 -0.100000 +v 0.500000 0.100000 -0.100000 +v 0.500000 0.100000 0.100000 +v 0.500000 0.500000 0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.500000 0.100000 +v -0.100000 -0.300000 -0.200000 +v 0.100000 -0.300000 -0.200000 +v -0.100000 0.100000 -0.200000 +v 0.100000 0.100000 -0.200000 +v -0.300000 -0.100000 -0.200000 +v -0.300000 0.100000 -0.200000 +v 0.300000 -0.100000 -0.200000 +v 0.300000 0.100000 -0.200000 +v 0.300000 0.100000 -0.200000 +v 0.300000 0.500000 -0.200000 +v -0.300000 0.100000 -0.200000 +v -0.300000 0.500000 -0.200000 +v -0.100000 0.100000 -0.200000 +v 0.100000 0.100000 -0.200000 +v -0.100000 0.500000 -0.200000 +v 0.100000 0.500000 -0.200000 +v -0.300000 0.300000 -0.200000 +v -0.100000 0.300000 -0.200000 +v 0.100000 0.300000 -0.200000 +v 0.300000 0.300000 -0.200000 +v 0.500000 -0.300000 -0.100000 +v 0.500000 0.100000 -0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 0.100000 -0.100000 +v 0.500000 -0.300000 0.300000 +v 0.500000 0.100000 0.300000 +v -0.500000 -0.300000 0.300000 +v -0.500000 0.100000 0.300000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 -0.300000 0.300000 +v 0.500000 -0.300000 -0.100000 +v 0.500000 -0.300000 0.300000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 -0.500000 0.300000 +v 0.500000 -0.500000 -0.100000 +v 0.500000 -0.500000 0.300000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.100000 0.300000 +v 0.500000 0.500000 0.300000 +v 0.500000 0.100000 0.300000 +v -0.500000 0.500000 0.100000 +v -0.500000 0.100000 0.100000 +v 0.500000 0.500000 0.100000 +v 0.500000 0.100000 0.100000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.100000 0.300000 +v -0.500000 -0.500000 0.300000 +v 0.500000 -0.100000 0.300000 +v 0.500000 -0.500000 0.300000 +v -0.500000 0.300000 0.500000 +v -0.500000 -0.100000 0.500000 +v 0.500000 0.300000 0.500000 +v 0.500000 -0.100000 0.500000 +v -0.500000 0.300000 0.300000 +v -0.500000 -0.100000 0.300000 +v 0.500000 0.300000 0.300000 +v 0.500000 -0.100000 0.300000 +v -0.500000 0.300000 0.300000 +v -0.500000 0.500000 0.300000 +v 0.500000 0.300000 0.300000 +v 0.500000 0.500000 0.300000 +v -0.500000 0.300000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.300000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.100000 -0.500000 0.500000 +v 0.300000 -0.500000 0.500000 +v -0.100000 -0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.300000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.300000 0.300000 0.500000 +v 0.500000 0.300000 0.500000 +v 0.300000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.100000 -0.500000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.100000 0.500000 0.500000 +v -0.100000 0.300000 0.500000 +v 0.300000 0.500000 0.500000 +v 0.300000 0.300000 0.500000 +v 0.100000 -0.100000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.100000 0.300000 0.500000 +v 0.500000 0.300000 0.500000 +v -0.300000 -0.100000 0.500000 +v 0.100000 -0.100000 0.500000 +v -0.300000 0.300000 0.500000 +v 0.100000 0.300000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.300000 -0.100000 0.500000 +v -0.500000 0.300000 0.500000 +v -0.300000 0.300000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.300000 0.500000 +v -0.100000 0.500000 0.500000 +v -0.100000 0.300000 0.500000 +v -0.500000 -0.500000 -0.300000 +v 0.500000 -0.500000 -0.300000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 0.333333 0.714286 +vt 0.333333 1.000000 +vt 0.666667 1.000000 +vt 0.666667 0.714286 +vt -0.000000 0.571429 +vt 0.333333 0.571429 +vt 0.333333 0.428571 +vt 0.000000 0.428571 +vt 1.000000 1.000000 +vt 1.000000 0.714286 +vt 0.166667 0.714286 +vt 0.166667 0.857143 +vt 0.333333 0.857143 +vt 0.666667 0.571429 +vt 0.000000 0.714286 +vt -0.000000 0.857143 +vt -0.000000 1.000000 +vt 0.166667 1.000000 +vt 0.666667 0.428571 +vt 0.250000 0.857143 +vt 0.250000 0.714286 +vt 1.000000 0.428571 +vt 0.666667 0.500000 +vt 0.833333 0.500000 +vt 0.833333 0.428571 +vt 1.000000 0.500000 +vt 0.333333 0.785714 +vt 0.666667 0.785714 +vt 1.000000 0.785714 +vt 0.333333 0.642857 +vt 0.666667 0.642857 +vt -0.000000 0.785714 +vt 0.166667 0.785714 +vt 0.666667 0.446429 +vt 0.666667 0.732143 +vt 1.000000 0.732143 +vt 1.000000 0.446429 +vt 0.833333 -0.000000 +vt 0.999911 0.000089 +vt 1.000000 0.142857 +vt 0.833333 0.142857 +vn 0.000000 -0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +g Adaridge_C_M_B_Plane.001_None +s off +f 1/1/1 3/2/1 4/3/1 2/4/1 +f 5/5/1 7/6/1 8/7/1 6/8/1 +f 9/4/1 11/3/1 12/9/1 10/10/1 +f 13/11/1 15/12/1 16/13/1 14/1/1 +f 17/14/1 19/6/1 20/1/1 18/4/1 +f 21/5/1 23/6/1 24/7/1 22/8/1 +f 25/15/1 27/16/1 28/12/1 26/11/1 +f 29/17/1 31/18/1 32/12/1 30/16/1 +f 33/15/1 35/1/1 36/6/1 34/5/1 +f 37/6/1 39/5/1 40/15/1 38/1/1 +f 41/6/1 43/14/1 44/19/1 42/7/1 +f 45/12/1 47/18/1 48/2/1 46/13/1 +f 49/11/1 51/12/1 52/13/1 50/1/1 +f 28/12/2 74/20/2 73/21/2 26/11/2 +f 37/22/2 39/10/2 68/4/2 67/19/2 +f 11/19/3 59/23/3 54/24/3 12/25/3 +f 3/25/3 56/24/3 60/26/3 4/22/3 +f 32/12/2 64/11/2 63/15/2 30/16/2 +f 12/1/2 58/6/2 57/5/2 10/15/2 +f 1/7/2 3/19/2 55/14/2 53/6/2 +f 36/10/2 66/22/2 65/19/2 34/4/2 +f 25/11/2 27/12/2 62/16/2 61/15/2 +f 41/1/4 81/27/4 83/28/4 43/4/4 +f 8/4/2 72/28/2 70/29/2 6/10/2 +f 40/6/2 80/30/2 79/31/2 38/14/2 +f 5/6/4 69/30/4 71/31/4 7/14/4 +f 46/12/3 45/16/3 85/32/3 86/33/3 +f 29/11/4 75/33/4 76/27/4 31/1/4 +f 44/19/2 84/23/2 82/26/2 42/22/2 +f 50/13/3 49/12/3 87/33/3 88/27/3 +f 33/6/4 77/30/4 78/31/4 35/14/4 +f 91/1/2 92/4/2 96/3/2 95/2/2 +f 90/3/2 94/4/2 93/1/2 89/2/2 +f 100/4/2 104/14/2 103/6/2 99/1/2 +f 97/5/2 98/6/2 102/1/2 101/15/2 +f 108/6/2 112/1/2 111/4/2 107/14/2 +f 105/6/2 106/14/2 110/4/2 109/1/2 +f 116/6/2 120/7/2 119/8/2 115/5/2 +f 113/19/2 114/7/2 118/6/2 117/14/2 +f 124/14/2 128/19/2 127/7/2 123/6/2 +f 121/14/2 122/6/2 126/7/2 125/19/2 +f 132/13/2 136/1/2 135/11/2 131/12/2 +f 129/1/2 130/13/2 134/12/2 133/11/2 +f 137/1/1 139/2/1 140/3/1 138/4/1 +f 141/5/1 143/6/1 144/7/1 142/8/1 +f 145/12/1 147/18/1 148/2/1 146/13/1 +f 149/3/1 151/9/1 152/10/1 150/4/1 +f 153/1/1 155/4/1 156/14/1 154/6/1 +f 157/4/1 159/3/1 160/9/1 158/10/1 +f 161/34/1 163/35/1 164/36/1 162/37/1 +f 165/15/1 167/1/1 168/6/1 166/5/1 +f 169/6/1 171/14/1 172/19/1 170/7/1 +f 173/38/5 174/39/5 176/40/5 175/41/5 diff --git a/mods/mylandscaping/models/mylandscaping_columna_m_t.obj b/mods/mylandscaping/models/mylandscaping_columna_m_t.obj new file mode 100644 index 00000000..37b77f98 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columna_m_t.obj @@ -0,0 +1,289 @@ +# Blender v2.76 (sub 1) OBJ File: 'Adaridge_walls.blend' +# www.blender.org +o Adaridge_C_M_T_Plane.002 +v -0.500000 -0.500000 -0.300000 +v -0.100000 0.100000 -0.200000 +v -0.500000 -0.100000 -0.300000 +v -0.300000 0.100000 -0.200000 +v -0.300000 -0.100000 -0.300000 +v -0.500000 -0.100000 -0.300000 +v -0.300000 -0.500000 -0.300000 +v -0.500000 -0.500000 -0.300000 +v -0.100000 -0.300000 -0.200000 +v 0.500000 -0.500000 -0.300000 +v -0.300000 -0.300000 -0.200000 +v 0.500000 -0.100000 -0.300000 +v 0.500000 -0.100000 -0.300000 +v 0.300000 -0.100000 -0.300000 +v 0.500000 -0.500000 -0.300000 +v 0.300000 -0.500000 -0.300000 +v -0.100000 -0.300000 -0.200000 +v 0.300000 -0.300000 -0.200000 +v -0.100000 0.100000 -0.200000 +v 0.300000 0.100000 -0.200000 +v 0.100000 0.100000 -0.300000 +v 0.300000 0.100000 -0.300000 +v 0.100000 0.500000 -0.300000 +v 0.300000 0.500000 -0.300000 +v -0.500000 -0.100000 -0.300000 +v -0.300000 -0.100000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.300000 0.100000 -0.300000 +v 0.300000 -0.100000 -0.300000 +v 0.500000 -0.100000 -0.300000 +v 0.300000 0.100000 -0.300000 +v 0.500000 0.100000 -0.300000 +v 0.300000 0.100000 -0.300000 +v 0.500000 0.100000 -0.300000 +v 0.300000 0.500000 -0.300000 +v 0.500000 0.500000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.300000 0.100000 -0.300000 +v -0.500000 0.500000 -0.300000 +v -0.300000 0.500000 -0.300000 +v 0.300000 -0.300000 -0.300000 +v 0.100000 -0.300000 -0.300000 +v 0.300000 -0.500000 -0.300000 +v 0.100000 -0.500000 -0.300000 +v -0.300000 0.100000 -0.200000 +v -0.300000 -0.100000 -0.200000 +v 0.300000 0.100000 -0.200000 +v 0.100000 0.100000 -0.200000 +v 0.300000 -0.500000 -0.200000 +v 0.300000 -0.100000 -0.200000 +v -0.300000 -0.500000 -0.200000 +v -0.300000 -0.100000 -0.200000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 -0.100000 -0.100000 +v 0.500000 -0.500000 -0.100000 +v 0.500000 -0.100000 -0.100000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 0.100000 -0.100000 +v 0.500000 -0.100000 -0.100000 +v 0.500000 0.100000 -0.100000 +v 0.500000 0.100000 0.100000 +v 0.500000 0.500000 0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.500000 0.100000 +v -0.300000 0.100000 -0.200000 +v 0.100000 0.100000 -0.200000 +v -0.300000 -0.300000 -0.200000 +v 0.100000 -0.300000 -0.200000 +v 0.100000 -0.300000 -0.200000 +v 0.300000 -0.300000 -0.200000 +v 0.300000 0.100000 -0.200000 +v 0.300000 -0.100000 -0.200000 +v 0.500000 -0.300000 -0.100000 +v 0.500000 0.100000 -0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 0.100000 -0.100000 +v 0.500000 -0.300000 0.300000 +v 0.500000 0.100000 0.300000 +v -0.500000 -0.300000 0.300000 +v -0.500000 0.100000 0.300000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 -0.300000 0.300000 +v 0.500000 -0.300000 -0.100000 +v 0.500000 -0.300000 0.300000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 -0.500000 0.300000 +v 0.500000 -0.500000 -0.100000 +v 0.500000 -0.500000 0.300000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.100000 0.300000 +v 0.500000 0.500000 0.300000 +v 0.500000 0.100000 0.300000 +v -0.500000 0.500000 0.100000 +v -0.500000 0.100000 0.100000 +v 0.500000 0.500000 0.100000 +v 0.500000 0.100000 0.100000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.100000 0.300000 +v -0.500000 -0.500000 0.300000 +v 0.500000 -0.100000 0.300000 +v 0.500000 -0.500000 0.300000 +v -0.500000 0.300000 0.500000 +v -0.500000 -0.100000 0.500000 +v 0.500000 0.300000 0.500000 +v 0.500000 -0.100000 0.500000 +v -0.500000 0.300000 0.300000 +v -0.500000 -0.100000 0.300000 +v 0.500000 0.300000 0.300000 +v 0.500000 -0.100000 0.300000 +v -0.500000 0.300000 0.300000 +v -0.500000 0.500000 0.300000 +v 0.500000 0.300000 0.300000 +v 0.500000 0.500000 0.300000 +v -0.500000 0.300000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.300000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.100000 -0.500000 0.500000 +v 0.300000 -0.500000 0.500000 +v -0.100000 -0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.300000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.300000 0.300000 0.500000 +v 0.500000 0.300000 0.500000 +v 0.300000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.100000 -0.500000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.100000 0.500000 0.500000 +v -0.100000 0.300000 0.500000 +v 0.300000 0.500000 0.500000 +v 0.300000 0.300000 0.500000 +v 0.100000 -0.100000 0.500000 +v 0.500000 -0.100000 0.500000 +v 0.100000 0.300000 0.500000 +v 0.500000 0.300000 0.500000 +v -0.300000 -0.100000 0.500000 +v 0.100000 -0.100000 0.500000 +v -0.300000 0.300000 0.500000 +v 0.100000 0.300000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.300000 -0.100000 0.500000 +v -0.500000 0.300000 0.500000 +v -0.300000 0.300000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.300000 0.500000 +v -0.100000 0.500000 0.500000 +v -0.100000 0.300000 0.500000 +v 0.100000 -0.500000 -0.300000 +v 0.100000 -0.300000 -0.300000 +v -0.300000 -0.500000 -0.300000 +v -0.300000 -0.300000 -0.300000 +v 0.100000 0.500000 -0.300000 +v -0.300000 0.500000 -0.300000 +v 0.100000 0.100000 -0.300000 +v -0.300000 0.100000 -0.300000 +v -0.502252 0.500000 0.513315 +v -0.502252 0.600000 0.513315 +v -0.502252 0.500000 -0.370548 +v -0.502252 0.600000 -0.370548 +v 0.500000 0.500000 0.513315 +v 0.500000 0.600000 0.513315 +v 0.500000 0.500000 -0.370548 +v 0.500000 0.600000 -0.370548 +v -0.502252 0.500000 0.513315 +v -0.502252 0.500000 -0.370548 +v 0.500000 0.500000 0.513315 +v 0.500000 0.500000 -0.370548 +vt 0.333333 0.857143 +vt 0.166667 0.857143 +vt 0.166667 0.785714 +vt 0.333333 0.785714 +vt 0.333333 0.571429 +vt -0.000000 0.571429 +vt -0.000000 0.714286 +vt 0.333333 0.714286 +vt 0.333333 0.428571 +vt -0.000000 0.428571 +vt 0.666667 0.446429 +vt 0.666667 0.732143 +vt 1.000000 0.732143 +vt 1.000000 0.446429 +vt -0.000000 0.857143 +vt 0.166667 0.714286 +vt -0.000000 1.000000 +vt 0.166667 1.000000 +vt 0.666667 0.714286 +vt 0.666667 0.571429 +vt 0.666667 0.428571 +vt 0.666667 0.500000 +vt 0.333333 0.500000 +vt 0.333333 0.642857 +vt 0.666667 0.642857 +vt 1.000000 0.428571 +vt 1.000000 0.714286 +vt 0.083333 0.857143 +vt 0.083333 0.714286 +vt 0.666456 0.714015 +vt 0.666456 0.143308 +vt 0.832913 0.143308 +vt 0.832912 0.714015 +vt 0.166667 0.875000 +vt 0.250000 0.714286 +vt 0.250000 0.875000 +vt 0.666667 1.000000 +vt 0.333333 1.000000 +vt 1.000000 1.000000 +vt 0.833333 0.071429 +vt 0.000000 0.071429 +vt -0.000000 0.000000 +vt 0.833333 0.000000 +vt 0.833333 0.142857 +vt 0.000000 0.142857 +vt 0.916667 0.142857 +vt 0.916667 0.428571 +vt 0.083333 0.428571 +vt 0.083333 0.142857 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 0.000000 1.000000 +g Adaridge_C_M_T_Plane.002_None +s off +f 41/1/1 42/2/1 69/3/1 70/4/1 +f 8/5/2 6/6/2 5/7/2 7/8/2 +f 11/9/2 4/10/2 2/6/2 9/5/2 +f 16/5/2 14/6/2 13/7/2 15/8/2 +f 17/11/2 19/12/2 20/13/2 18/14/2 +f 21/6/2 23/5/2 24/9/2 22/10/2 +f 25/7/2 27/15/2 28/2/2 26/16/2 +f 29/17/2 31/18/2 32/2/2 30/15/2 +f 33/8/2 35/19/2 36/20/2 34/5/2 +f 37/5/2 39/6/2 40/7/2 38/8/2 +f 44/16/2 42/2/2 41/1/2 43/8/2 +f 7/9/3 5/21/3 52/22/3 51/23/3 +f 158/19/1 160/8/1 67/24/1 68/25/1 +f 37/26/3 39/27/3 64/19/3 63/21/3 +f 32/2/3 60/16/3 59/7/3 30/15/3 +f 12/8/3 56/5/3 55/6/3 10/7/3 +f 1/9/3 3/21/3 54/20/3 53/5/3 +f 36/27/3 62/26/3 61/21/3 34/19/3 +f 25/16/3 27/2/3 58/15/3 57/7/3 +f 26/16/3 28/2/3 45/28/3 46/29/3 +f 14/30/4 16/31/4 49/32/4 50/33/4 +f 31/34/4 29/16/4 72/35/4 71/36/4 +f 164/9/5 163/21/5 66/22/5 65/23/5 +f 21/16/5 22/8/5 47/4/5 48/3/5 +f 75/8/3 76/19/3 80/37/3 79/38/3 +f 74/37/3 78/19/3 77/8/3 73/38/3 +f 84/19/3 88/20/3 87/5/3 83/8/3 +f 81/6/3 82/5/3 86/8/3 85/7/3 +f 92/5/3 96/8/3 95/19/3 91/20/3 +f 89/5/3 90/20/3 94/19/3 93/8/3 +f 100/5/3 104/9/3 103/10/3 99/6/3 +f 97/21/3 98/9/3 102/5/3 101/20/3 +f 108/20/3 112/21/3 111/9/3 107/5/3 +f 105/20/3 106/5/3 110/9/3 109/21/3 +f 116/1/3 120/8/3 119/16/3 115/2/3 +f 113/8/3 114/1/3 118/2/3 117/16/3 +f 121/8/2 123/38/2 124/37/2 122/19/2 +f 125/6/2 127/5/2 128/9/2 126/10/2 +f 129/2/2 131/18/2 132/38/2 130/1/2 +f 133/37/2 135/39/2 136/27/2 134/19/2 +f 137/8/2 139/19/2 140/20/2 138/5/2 +f 141/19/2 143/37/2 144/39/2 142/27/2 +f 145/11/2 147/12/2 148/13/2 146/14/2 +f 149/7/2 151/8/2 152/5/2 150/6/2 +f 153/5/2 155/20/2 156/21/2 154/9/2 +f 160/8/2 158/19/2 157/20/2 159/5/2 +f 164/26/2 162/21/2 161/19/2 163/27/2 +f 166/40/4 168/41/4 167/42/4 165/43/4 +f 168/42/2 172/43/2 171/40/2 167/41/2 +f 172/41/3 170/40/3 169/44/3 171/45/3 +f 170/44/6 166/45/6 165/41/6 169/40/6 +f 170/46/1 172/47/1 168/48/1 166/49/1 +f 175/46/1 176/47/1 174/48/1 173/49/1 diff --git a/mods/mylandscaping/models/mylandscaping_columna_oc_b.obj b/mods/mylandscaping/models/mylandscaping_columna_oc_b.obj new file mode 100644 index 00000000..b15ad016 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columna_oc_b.obj @@ -0,0 +1,226 @@ +# Blender v2.76 (sub 2) OBJ File: 'Adaridge_walls.blend' +# www.blender.org +o Adaridge_C_OC_B_Plane.004 +v -0.500000 -0.100000 -0.300000 +v -0.100000 -0.100000 -0.300000 +v -0.500000 -0.500000 -0.300000 +v -0.100000 -0.500000 -0.300000 +v 0.100000 -0.100000 -0.300000 +v 0.300000 -0.100000 -0.300000 +v 0.100000 -0.500000 -0.300000 +v 0.300000 -0.500000 -0.300000 +v -0.100000 -0.300000 -0.300000 +v 0.100000 -0.300000 -0.300000 +v -0.100000 -0.500000 -0.300000 +v 0.100000 -0.500000 -0.300000 +v -0.100000 0.100000 -0.300000 +v 0.100000 0.100000 -0.300000 +v -0.100000 -0.300000 -0.300000 +v 0.100000 -0.300000 -0.300000 +v 0.100000 0.100000 -0.300000 +v 0.300000 0.100000 -0.300000 +v 0.100000 -0.100000 -0.300000 +v 0.300000 -0.100000 -0.300000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.100000 -0.100000 -0.300000 +v -0.100000 0.100000 -0.300000 +v -0.100000 0.500000 -0.300000 +v 0.300000 0.500000 -0.300000 +v -0.100000 0.100000 -0.300000 +v 0.300000 0.100000 -0.300000 +v -0.300000 0.500000 -0.300000 +v -0.100000 0.500000 -0.300000 +v -0.300000 0.100000 -0.300000 +v -0.100000 0.100000 -0.300000 +v -0.500000 0.500000 -0.300000 +v -0.300000 0.500000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.300000 0.100000 -0.300000 +v 0.300000 0.100000 0.500000 +v 0.300000 0.100000 0.100000 +v 0.300000 0.500000 0.500000 +v 0.300000 0.500000 0.100000 +v 0.300000 0.100000 -0.100000 +v 0.300000 0.100000 -0.300000 +v 0.300000 0.500000 -0.100000 +v 0.300000 0.500000 -0.300000 +v 0.300000 0.300000 0.100000 +v 0.300000 0.300000 -0.100000 +v 0.300000 0.500000 0.100000 +v 0.300000 0.500000 -0.100000 +v 0.300000 -0.100000 0.100000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 0.300000 0.100000 +v 0.300000 0.300000 -0.100000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 -0.100000 -0.300000 +v 0.300000 0.100000 -0.100000 +v 0.300000 0.100000 -0.300000 +v 0.300000 0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.300000 0.100000 0.100000 +v 0.300000 -0.100000 0.100000 +v 0.300000 -0.500000 0.300000 +v 0.300000 -0.500000 -0.100000 +v 0.300000 -0.100000 0.300000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 -0.500000 -0.100000 +v 0.300000 -0.500000 -0.300000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 -0.100000 -0.300000 +v 0.300000 -0.500000 0.500000 +v 0.300000 -0.500000 0.300000 +v 0.300000 -0.100000 0.500000 +v 0.300000 -0.100000 0.300000 +v 0.300000 -0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v 0.300000 -0.500000 0.500000 +v -0.100000 -0.500000 0.500000 +v -0.300000 -0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.300000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.100000 -0.300000 0.500000 +v -0.300000 -0.300000 0.500000 +v -0.100000 -0.500000 0.500000 +v -0.300000 -0.500000 0.500000 +v -0.100000 0.100000 0.500000 +v -0.300000 0.100000 0.500000 +v -0.100000 -0.300000 0.500000 +v -0.300000 -0.300000 0.500000 +v -0.300000 0.100000 0.500000 +v -0.500000 0.100000 0.500000 +v -0.300000 -0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.300000 0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.100000 0.100000 0.500000 +v -0.100000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.100000 0.100000 0.500000 +v -0.500000 0.100000 0.500000 +v 0.100000 0.500000 0.500000 +v -0.100000 0.500000 0.500000 +v 0.100000 0.100000 0.500000 +v -0.100000 0.100000 0.500000 +v 0.300000 0.500000 0.500000 +v 0.100000 0.500000 0.500000 +v 0.300000 0.100000 0.500000 +v 0.100000 0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 -0.500000 -0.300000 +v -0.500000 -0.300000 0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.100000 -0.100000 +v -0.500000 -0.300000 0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 0.100000 -0.100000 +v -0.500000 0.100000 -0.300000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 -0.100000 0.500000 +v -0.500000 0.100000 0.500000 +v -0.500000 -0.100000 0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.500000 0.100000 +v -0.500000 0.500000 -0.300000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.100000 -0.300000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.500000 0.100000 +v -0.500000 0.100000 0.300000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.100000 0.500000 +v -0.500000 0.100000 0.300000 +v -0.500000 -0.500000 -0.300000 +v 0.300000 -0.500000 -0.300000 +v -0.500000 -0.500000 0.500000 +v 0.300000 -0.500000 0.500000 +vt 0.666667 0.714286 +vt 1.000000 0.714286 +vt 1.000000 1.000000 +vt 0.666667 1.000000 +vt 0.333333 0.714286 +vt 0.333333 0.571429 +vt 0.666667 0.571429 +vt -0.000000 1.000000 +vt -0.000000 0.857143 +vt 0.166667 0.857143 +vt 0.166667 1.000000 +vt 0.000000 0.571429 +vt 0.000000 0.428571 +vt 0.333333 0.428571 +vt 0.333333 0.857143 +vt 0.333333 1.000000 +vt 0.666667 0.428571 +vt 1.000000 0.428571 +vt 0.000000 0.714286 +vt 0.000000 0.696429 +vt 0.000000 0.553571 +vt 0.333333 0.553571 +vt 0.333333 0.696429 +vt 0.354167 0.714286 +vt 0.687500 0.714286 +vt 0.687500 1.000000 +vt 0.354167 1.000000 +vt 0.833333 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.142857 +vt 0.833333 0.142857 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 -0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +g Adaridge_C_OC_B_Plane.004_None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 5/5/1 6/6/1 8/7/1 7/1/1 +f 9/8/1 10/9/1 12/10/1 11/11/1 +f 13/12/1 14/13/1 16/14/1 15/6/1 +f 17/11/1 18/10/1 20/15/1 19/16/1 +f 21/5/1 22/6/1 24/7/1 23/1/1 +f 25/17/1 26/18/1 28/2/1 27/1/1 +f 29/17/1 30/7/1 32/6/1 31/14/1 +f 33/19/1 34/12/1 36/6/1 35/5/1 +f 37/1/2 38/2/2 40/3/2 39/4/2 +f 41/5/2 42/6/2 44/7/2 43/1/2 +f 45/11/2 46/10/2 48/15/2 47/16/2 +f 49/5/2 50/6/2 52/7/2 51/1/2 +f 53/8/2 54/9/2 56/10/2 55/11/2 +f 57/12/2 58/13/2 60/14/2 59/6/2 +f 61/2/2 62/1/2 64/17/2 63/18/2 +f 65/20/2 66/21/2 68/22/2 67/23/2 +f 69/6/2 70/14/2 72/17/2 71/7/2 +f 73/17/3 74/18/3 76/2/3 75/1/3 +f 77/5/3 78/6/3 80/7/3 79/1/3 +f 81/11/3 82/10/3 84/15/3 83/16/3 +f 85/5/3 86/6/3 88/7/3 87/1/3 +f 89/8/3 90/9/3 92/10/3 91/11/3 +f 93/12/3 94/13/3 96/14/3 95/6/3 +f 97/24/3 98/25/3 100/26/3 99/27/3 +f 101/12/3 102/13/3 104/14/3 103/6/3 +f 105/5/3 106/6/3 108/7/3 107/1/3 +f 109/17/4 110/18/4 112/2/4 111/1/4 +f 113/7/4 114/1/4 116/5/4 115/6/4 +f 117/8/4 118/9/4 120/10/4 119/11/4 +f 121/14/4 122/6/4 124/12/4 123/13/4 +f 125/11/4 126/10/4 128/15/4 127/16/4 +f 129/19/4 130/12/4 132/6/4 131/5/4 +f 133/1/4 134/2/4 136/3/4 135/4/4 +f 137/5/4 138/6/4 140/7/4 139/1/4 +f 141/6/4 142/14/4 144/17/4 143/7/4 +f 145/28/5 146/29/5 148/30/5 147/31/5 diff --git a/mods/mylandscaping/models/mylandscaping_columna_oc_t.obj b/mods/mylandscaping/models/mylandscaping_columna_oc_t.obj new file mode 100644 index 00000000..ded74baf --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columna_oc_t.obj @@ -0,0 +1,225 @@ +# Blender v2.76 (sub 1) OBJ File: 'Adaridge_walls.blend' +# www.blender.org +o Adaridge_C_OC_T_Plane.005 +v -0.500000 -0.100000 -0.300000 +v -0.100000 -0.100000 -0.300000 +v -0.500000 -0.500000 -0.300000 +v -0.100000 -0.500000 -0.300000 +v 0.100000 -0.100000 -0.300000 +v 0.300000 -0.100000 -0.300000 +v 0.100000 -0.500000 -0.300000 +v 0.300000 -0.500000 -0.300000 +v -0.100000 -0.100000 -0.300000 +v 0.100000 -0.100000 -0.300000 +v -0.100000 -0.500000 -0.300000 +v 0.100000 -0.500000 -0.300000 +v 0.300000 0.500000 -0.300000 +v 0.300000 0.300000 -0.300000 +v -0.100000 0.500000 -0.300000 +v -0.100000 0.300000 -0.300000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.100000 -0.100000 -0.300000 +v -0.100000 0.100000 -0.300000 +v -0.100000 0.300000 -0.300000 +v 0.300000 0.300000 -0.300000 +v -0.100000 -0.100000 -0.300000 +v 0.300000 -0.100000 -0.300000 +v -0.300000 0.500000 -0.300000 +v -0.100000 0.500000 -0.300000 +v -0.300000 0.100000 -0.300000 +v -0.100000 0.100000 -0.300000 +v -0.500000 0.500000 -0.300000 +v -0.300000 0.500000 -0.300000 +v -0.500000 0.100000 -0.300000 +v -0.300000 0.100000 -0.300000 +v 0.300000 0.100000 0.500000 +v 0.300000 0.100000 0.100000 +v 0.300000 0.500000 0.500000 +v 0.300000 0.500000 0.100000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 -0.100000 -0.300000 +v 0.300000 0.300000 -0.100000 +v 0.300000 0.300000 -0.300000 +v 0.300000 0.300000 -0.100000 +v 0.300000 0.300000 -0.300000 +v 0.300000 0.500000 -0.100000 +v 0.300000 0.500000 -0.300000 +v 0.300000 0.100000 0.100000 +v 0.300000 0.100000 -0.100000 +v 0.300000 0.500000 0.100000 +v 0.300000 0.500000 -0.100000 +v 0.300000 -0.100000 0.100000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 0.100000 0.100000 +v 0.300000 0.100000 -0.100000 +v 0.300000 0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.300000 0.100000 0.100000 +v 0.300000 -0.100000 0.100000 +v 0.300000 -0.500000 0.300000 +v 0.300000 -0.500000 -0.100000 +v 0.300000 -0.100000 0.300000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 -0.500000 -0.100000 +v 0.300000 -0.500000 -0.300000 +v 0.300000 -0.100000 -0.100000 +v 0.300000 -0.100000 -0.300000 +v 0.300000 -0.500000 0.500000 +v 0.300000 -0.500000 0.300000 +v 0.300000 -0.100000 0.500000 +v 0.300000 -0.100000 0.300000 +v 0.300000 -0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v 0.300000 -0.500000 0.500000 +v -0.100000 -0.500000 0.500000 +v -0.300000 -0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.300000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.100000 -0.300000 0.500000 +v -0.300000 -0.300000 0.500000 +v -0.100000 -0.500000 0.500000 +v -0.300000 -0.500000 0.500000 +v -0.100000 0.100000 0.500000 +v -0.300000 0.100000 0.500000 +v -0.100000 -0.300000 0.500000 +v -0.300000 -0.300000 0.500000 +v -0.300000 0.100000 0.500000 +v -0.500000 0.100000 0.500000 +v -0.300000 -0.100000 0.500000 +v -0.500000 -0.100000 0.500000 +v 0.300000 -0.100000 0.500000 +v 0.300000 0.100000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.100000 0.100000 0.500000 +v -0.100000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.100000 0.100000 0.500000 +v -0.500000 0.100000 0.500000 +v -0.100000 0.100000 0.500000 +v 0.300000 0.100000 0.500000 +v -0.100000 0.500000 0.500000 +v 0.300000 0.500000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 -0.500000 -0.300000 +v -0.500000 -0.300000 0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.500000 -0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.100000 -0.100000 +v -0.500000 -0.300000 0.100000 +v -0.500000 -0.300000 -0.100000 +v -0.500000 0.100000 -0.100000 +v -0.500000 0.100000 -0.300000 +v -0.500000 -0.100000 -0.100000 +v -0.500000 -0.100000 -0.300000 +v -0.500000 -0.100000 0.500000 +v -0.500000 0.100000 0.500000 +v -0.500000 -0.100000 0.100000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.500000 0.100000 +v -0.500000 0.500000 -0.300000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.100000 -0.300000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.500000 0.100000 +v -0.500000 0.100000 0.300000 +v -0.500000 0.100000 0.100000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.300000 +v -0.500000 0.100000 0.500000 +v -0.500000 0.100000 0.300000 +v -0.500000 0.600000 0.500000 +v 0.310000 0.600000 0.500000 +v -0.500000 0.600000 -0.310000 +v 0.310000 0.600000 -0.310000 +v -0.500000 0.500000 -0.310000 +v -0.500000 0.500000 0.500000 +v 0.310000 0.500000 0.500000 +v 0.310000 0.500000 -0.310000 +vt 0.666667 1.000000 +vt 0.666667 0.714286 +vt 1.000000 0.714286 +vt 1.000000 1.000000 +vt -0.000000 0.571429 +vt -0.000000 0.428571 +vt 0.333333 0.428571 +vt 0.333333 0.571429 +vt 0.666667 0.571429 +vt 0.333333 0.714286 +vt -0.000000 0.714286 +vt 0.333333 1.000000 +vt 0.666667 0.428571 +vt -0.000000 1.000000 +vt -0.000000 0.857143 +vt 0.166667 0.857143 +vt 0.166667 1.000000 +vt 1.000000 0.428571 +vt 0.333333 0.857143 +vt 0.166667 0.714286 +vt 0.083333 0.428571 +vt 0.916667 0.428571 +vt 0.916667 0.142857 +vt 0.083333 0.142857 +vt 0.833333 0.071429 +vt 0.833333 0.142857 +vt -0.000000 0.142857 +vt -0.000000 0.071429 +vt 0.833333 0.000000 +vt 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 -0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +g Adaridge_C_OC_T_Plane.005_None +s off +f 1/1/1 2/2/1 4/3/1 3/4/1 +f 5/5/1 6/6/1 8/7/1 7/8/1 +f 9/9/1 10/2/1 12/10/1 11/8/1 +f 16/11/1 15/5/1 13/8/1 14/10/1 +f 17/10/1 18/8/1 20/9/1 19/2/1 +f 21/10/1 22/2/1 24/1/1 23/12/1 +f 25/8/1 26/7/1 28/13/1 27/9/1 +f 29/10/1 30/8/1 32/9/1 31/2/1 +f 33/10/2 34/2/2 36/1/2 35/12/2 +f 37/10/2 38/8/2 40/9/2 39/2/2 +f 41/14/2 42/15/2 44/16/2 43/17/2 +f 45/10/2 46/8/2 48/9/2 47/2/2 +f 49/14/2 50/15/2 52/16/2 51/17/2 +f 53/10/2 54/8/2 56/9/2 55/2/2 +f 57/1/2 58/2/2 60/3/2 59/4/2 +f 61/8/2 62/7/2 64/13/2 63/9/2 +f 65/5/2 66/6/2 68/7/2 67/8/2 +f 69/13/3 70/18/3 72/3/3 71/2/3 +f 73/5/3 74/6/3 76/7/3 75/8/3 +f 77/17/3 78/16/3 80/19/3 79/12/3 +f 81/8/3 82/7/3 84/13/3 83/9/3 +f 85/15/3 86/11/3 88/20/3 87/16/3 +f 89/11/3 90/5/3 92/8/3 91/10/3 +f 93/10/3 94/2/3 96/1/3 95/12/3 +f 100/1/3 99/2/3 97/3/3 98/4/3 +f 101/10/4 102/2/4 104/1/4 103/12/4 +f 105/5/4 106/6/4 108/7/4 107/8/4 +f 109/16/4 110/20/4 112/10/4 111/19/4 +f 113/5/4 114/6/4 116/7/4 115/8/4 +f 117/17/4 118/14/4 120/15/4 119/16/4 +f 121/8/4 122/7/4 124/13/4 123/9/4 +f 125/1/4 126/2/4 128/3/4 127/4/4 +f 129/10/4 130/8/4 132/9/4 131/2/4 +f 133/13/4 134/9/4 136/8/4 135/7/4 +f 137/21/5 138/22/5 140/23/5 139/24/5 +f 140/25/1 144/26/1 141/27/1 139/28/1 +f 137/28/1 138/25/1 143/29/1 142/30/1 +f 138/28/2 143/30/2 144/29/2 140/25/2 +f 139/25/2 137/28/2 142/27/2 141/26/2 +g Adaridge_C_OC_T_Plane.005_None_NONE +f 142/30/5 143/30/5 144/30/5 141/30/5 diff --git a/mods/mylandscaping/models/mylandscaping_columnf_ic_b.obj b/mods/mylandscaping/models/mylandscaping_columnf_ic_b.obj new file mode 100644 index 00000000..88fe15ec --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columnf_ic_b.obj @@ -0,0 +1,46 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Column_IC_B_Cube.001 +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 +vt 0.012283 0.988418 +vt 0.012282 0.027084 +vt 0.973618 0.027084 +vt 0.973618 0.988418 +vt 0.024299 0.988418 +vt 0.024299 0.027083 +vt 0.985634 0.027083 +vt 0.985634 0.988418 +vt 0.024299 -0.934252 +vt 0.985634 -0.934252 +vt 0.012282 0.012063 +vt 0.973618 0.012063 +vt 0.973618 0.973397 +vt 0.012283 0.973397 +vt 0.979626 0.012063 +vt 0.979626 0.973397 +vt 0.018291 0.973397 +vt 0.018291 0.012063 +vt 0.024299 0.015067 +vt 0.985634 0.015067 +vt 0.985634 0.976402 +vt 0.024299 0.976402 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/5/2 8/6/2 7/7/2 3/8/2 +f 8/6/3 6/9/3 5/10/3 7/7/3 +f 6/11/4 2/12/4 1/13/4 5/14/4 +f 1/15/5 3/16/5 7/17/5 5/18/5 +f 6/19/6 8/20/6 4/21/6 2/22/6 diff --git a/mods/mylandscaping/models/mylandscaping_columnf_ic_t.obj b/mods/mylandscaping/models/mylandscaping_columnf_ic_t.obj new file mode 100644 index 00000000..6a912d01 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columnf_ic_t.obj @@ -0,0 +1,152 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Column_IC_T_Cube.008 +v 0.492196 0.499740 0.049996 +v 0.492196 0.499740 0.515505 +v -0.038606 0.499740 0.515505 +v 0.492196 0.600283 0.049996 +v 0.492196 0.600283 0.515505 +v -0.038606 0.600283 0.515505 +v -0.038606 0.709599 0.049996 +v -0.503953 0.499740 0.515505 +v -0.503953 0.499740 -0.497344 +v -0.038606 0.499740 -0.497344 +v -0.503953 0.600283 0.515505 +v -0.503953 0.600283 -0.497344 +v -0.038606 0.600283 -0.497344 +v -0.503953 0.600283 0.049996 +v -0.503953 0.499740 0.049996 +v -0.501194 -0.500000 0.504531 +v -0.501194 0.500000 0.504531 +v -0.501194 -0.500000 -0.495469 +v -0.501194 0.500000 -0.495469 +v 0.498806 -0.500000 0.504531 +v 0.498806 0.500000 0.504531 +v 0.498806 -0.500000 -0.495469 +v 0.498806 0.500000 -0.495469 +v 0.561394 0.499740 -0.497344 +v 0.561394 0.600283 -0.497344 +v 0.561394 0.499740 0.050237 +v 0.561394 0.600283 0.050237 +v 0.561394 0.600283 -0.572807 +v 0.561394 0.499740 -0.572807 +v -0.038606 0.600283 -0.572807 +v -0.038606 0.499740 -0.572807 +v 0.492716 0.499740 -0.497344 +v 0.492716 0.600283 -0.497344 +v 0.492716 0.499740 -0.572807 +v 0.492716 0.600283 -0.572807 +vt 0.437856 0.501101 +vt 0.437856 0.070510 +vt 0.529867 0.070510 +vt 0.529867 0.501101 +vt 0.245831 0.981630 +vt 0.245831 0.477037 +vt 0.337842 0.477037 +vt 0.337843 0.981630 +vt 0.245831 0.034667 +vt 0.337842 0.034667 +vt 0.361064 0.403055 +vt 0.361064 0.184189 +vt 0.523589 0.184189 +vt 0.523589 0.403055 +vt 0.569697 0.450981 +vt 0.991223 0.450593 +vt 0.991224 0.949301 +vt 0.570185 0.949293 +vt 0.337843 0.540949 +vt 0.429854 0.034667 +vt 0.429854 0.540949 +vt 0.613877 0.477037 +vt 0.613877 0.034667 +vt 0.705888 0.034667 +vt 0.705888 0.477037 +vt 0.816414 0.225054 +vt 0.881006 0.225054 +vt 0.881006 0.731560 +vt 0.815925 0.731337 +vt 0.337843 0.971541 +vt 0.429854 0.971541 +vt 0.570185 0.013373 +vt 0.991223 0.013381 +vt 0.075135 0.450575 +vt 0.075135 0.013363 +vt 0.429854 0.104470 +vt 0.521865 0.104470 +vt 0.521865 0.610976 +vt 0.429854 0.610976 +vt 0.011417 1.008593 +vt 0.011417 0.012590 +vt 0.996820 0.012589 +vt 0.996820 1.008593 +vt 0.001907 1.014624 +vt 0.001906 -0.008983 +vt 0.987309 -0.008984 +vt 0.987310 1.014624 +vt 0.993176 1.015550 +vt 0.007774 1.015550 +vt 0.007774 0.019547 +vt 0.993176 0.019547 +vt 0.013640 1.011466 +vt 0.013640 -0.012141 +vt 0.999043 -0.012141 +vt 0.999043 1.011466 +vt 0.987310 2.038232 +vt 0.001907 2.038232 +vt 0.514225 0.621922 +vt 0.361064 0.621922 +vt 0.514225 0.403055 +vt 0.613877 0.099953 +vt 0.521865 0.099953 +vt 0.521865 0.034667 +vt 0.316702 0.225054 +vt 0.316702 0.155251 +vt 0.816414 0.155251 +vt 0.075135 0.949772 +vt 0.075135 1.014297 +vt 0.006880 1.014296 +vt 0.006880 0.949771 +vt 0.006880 0.450573 +vt 0.881006 0.155251 +vt 0.613877 0.605042 +vt 0.521865 0.605042 +vt 0.570404 1.014307 +vn 1.000000 0.000000 0.000000 +vn -0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.101700 0.988000 0.116000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.115900 0.986500 0.115800 +vn -0.116100 0.988300 -0.098700 +vn -0.003500 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.101900 0.989900 -0.098800 +s off +f 4/1/1 5/2/1 2/3/1 1/4/1 +f 5/5/2 6/6/2 3/7/2 2/8/2 +f 6/6/2 11/9/2 8/10/2 3/7/2 +f 10/11/3 13/12/3 30/13/3 31/14/3 +f 7/15/4 6/16/4 5/17/4 4/18/4 +f 14/19/3 12/10/3 9/20/3 15/21/3 +f 12/22/5 13/23/5 10/24/5 9/25/5 +f 32/26/6 24/27/6 26/28/6 1/29/6 +f 11/30/3 14/19/3 15/21/3 8/31/3 +f 7/15/7 14/32/7 11/33/7 6/16/7 +f 13/34/8 12/35/8 14/32/8 7/15/8 +f 24/36/1 25/37/1 27/38/1 26/39/1 +f 17/40/3 19/41/3 18/42/3 16/43/3 +f 19/44/5 23/45/5 22/46/5 18/47/5 +f 23/48/1 21/49/1 20/50/1 22/51/1 +f 21/52/2 17/53/2 16/54/2 20/55/2 +f 16/44/6 18/47/6 22/56/6 20/57/6 +f 1/58/9 26/59/9 27/11/9 4/60/9 +f 34/61/5 35/62/5 28/63/5 29/23/5 +f 32/26/6 10/64/6 31/65/6 34/66/6 +f 25/37/1 24/36/1 29/20/1 28/63/1 +f 33/67/10 25/68/10 28/69/10 35/70/10 +f 13/34/10 33/67/10 35/70/10 30/71/10 +f 24/27/6 32/26/6 34/66/6 29/72/6 +f 31/73/5 30/74/5 35/62/5 34/61/5 +f 4/18/11 33/67/11 13/34/11 7/15/11 +f 25/68/10 33/67/10 4/18/10 27/75/10 diff --git a/mods/mylandscaping/models/mylandscaping_columnf_m_b.obj b/mods/mylandscaping/models/mylandscaping_columnf_m_b.obj new file mode 100644 index 00000000..1af40c28 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columnf_m_b.obj @@ -0,0 +1,80 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Column_M_B_Cube.003 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.300000 +v -0.500000 0.500000 -0.300000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.300000 +v 0.500000 0.500000 -0.300000 +v -0.350000 0.350000 -0.300000 +v -0.350000 -0.350000 -0.300000 +v 0.350000 0.350000 -0.300000 +v 0.350000 -0.350000 -0.300000 +v -0.350000 0.350000 -0.200000 +v -0.350000 -0.350000 -0.200000 +v 0.350000 0.350000 -0.200000 +v 0.350000 -0.350000 -0.200000 +vt -0.563666 0.020730 +vt 0.212685 0.020730 +vt 0.212685 0.991169 +vt -0.563666 0.991169 +vt 0.083087 0.088047 +vt 0.902402 0.088047 +vt 0.779504 0.210944 +vt 0.205984 0.210944 +vt -0.557838 0.024446 +vt 0.215249 0.024446 +vt 0.215250 0.990805 +vt -0.557838 0.990806 +vt -1.534105 0.020730 +vt -1.534104 0.991169 +vt 0.989037 0.991168 +vt 0.989036 0.020730 +vt 0.988337 0.024446 +vt 0.988337 0.990805 +vt 0.792055 0.053089 +vt 0.792055 0.946333 +vt 0.664449 0.946333 +vt 0.664448 0.053089 +vt 0.902402 0.907362 +vt 0.779504 0.784465 +vt 0.083087 0.907362 +vt 0.205984 0.784465 +vt 0.224079 0.766000 +vt 0.224079 0.230647 +vt 0.759432 0.230647 +vt 0.759432 0.766000 +vt 0.630386 0.058627 +vt 0.630386 0.951871 +vt 0.502779 0.951871 +vt 0.502779 0.058627 +vt 0.247567 0.951871 +vt 0.247567 0.058627 +vt 0.375173 0.058627 +vt 0.375173 0.951871 +vt 0.119960 0.951871 +vt 0.119960 0.058627 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 8/5/2 7/6/2 12/7/2 11/8/2 +f 8/9/3 6/10/3 5/11/3 7/12/3 +f 6/13/4 2/1/4 1/4/4 5/14/4 +f 1/15/5 3/3/5 7/2/5 5/16/5 +f 6/10/6 8/17/6 4/18/6 2/11/6 +f 11/19/1 12/20/1 16/21/1 15/22/1 +f 7/6/2 3/23/2 10/24/2 12/7/2 +f 4/25/2 8/5/2 11/8/2 9/26/2 +f 3/23/2 4/25/2 9/26/2 10/24/2 +f 13/27/2 15/28/2 16/29/2 14/30/2 +f 10/31/3 9/32/3 13/33/3 14/34/3 +f 12/35/6 10/36/6 14/37/6 16/38/6 +f 9/39/5 11/40/5 15/36/5 13/35/5 diff --git a/mods/mylandscaping/models/mylandscaping_columnf_m_t.obj b/mods/mylandscaping/models/mylandscaping_columnf_m_t.obj new file mode 100644 index 00000000..41f1fb7c --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columnf_m_t.obj @@ -0,0 +1,187 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Column_M_T_Cube.004 +v 0.495239 0.499740 -0.351551 +v 0.495239 0.499740 0.513806 +v -0.498806 0.499740 0.513806 +v -0.498806 0.499740 -0.351551 +v 0.495239 0.600283 -0.351551 +v 0.495239 0.600283 0.513806 +v -0.498806 0.600283 0.513806 +v -0.498806 0.600283 -0.351551 +v 0.495239 0.600283 0.033948 +v 0.495239 0.499740 0.033948 +v -0.498806 0.600283 0.033948 +v -0.498806 0.499740 0.033948 +v 0.544185 0.499740 -0.351551 +v 0.544185 0.600283 -0.351551 +v 0.544185 0.499740 0.033948 +v 0.544185 0.600283 0.033948 +v -0.547752 0.600283 0.033948 +v -0.547752 0.600283 -0.351551 +v -0.547752 0.499740 -0.351551 +v -0.547752 0.499740 0.033948 +v -0.001783 0.600283 0.513806 +v -0.001783 0.499740 0.513806 +v -0.001784 0.600283 -0.351551 +v -0.001783 0.499740 -0.351551 +v -0.001783 0.713743 0.136952 +v -0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.300000 +v -0.500000 0.500000 -0.300000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.300000 +v 0.500000 0.500000 -0.300000 +v -0.210000 0.350000 -0.300000 +v -0.210000 -0.350000 -0.300000 +v 0.210000 0.350000 -0.300000 +v 0.210000 -0.350000 -0.300000 +v -0.210000 0.350000 -0.200000 +v -0.210000 -0.350000 -0.200000 +v 0.210000 0.350000 -0.200000 +v 0.210000 -0.350000 -0.200000 +vt 0.579596 0.219018 +vt 0.579596 0.645392 +vt 0.492388 0.645392 +vt 0.492388 0.219018 +vt 0.473238 0.502290 +vt 0.473238 0.060664 +vt 0.560446 0.060664 +vt 0.560447 0.502290 +vt 0.464154 0.934162 +vt 0.551362 0.934162 +vt 0.551362 0.977652 +vt 0.464154 0.977652 +vt 0.464154 0.492537 +vt 0.464153 0.050911 +vt 0.551362 0.050911 +vt 0.551362 0.492537 +vt 0.450984 0.489927 +vt 0.132310 0.489927 +vt 0.132310 0.059441 +vt 0.538026 0.059441 +vt 0.863963 0.489927 +vt 0.863963 0.059441 +vt 0.225251 0.592912 +vt 0.225250 0.166539 +vt 0.312459 0.166539 +vt 0.312459 0.592912 +vt 0.464153 0.007421 +vt 0.551362 0.007421 +vt 0.610904 0.289019 +vt 0.610904 0.631551 +vt 0.523696 0.631551 +vt 0.523696 0.289019 +vt 0.943367 0.248228 +vt 0.943367 0.337564 +vt 0.900914 0.337564 +vt 0.900914 0.248228 +vt 0.554852 0.166539 +vt 0.554852 0.509071 +vt 0.512398 0.509071 +vt 0.512398 0.166539 +vt 0.538026 0.017047 +vt 0.863963 0.017047 +vt 0.641589 0.590760 +vt 0.641589 0.248228 +vt 0.728797 0.248228 +vt 0.728797 0.590760 +vt 0.858459 0.337564 +vt 0.858459 0.248228 +vt 0.478637 0.703216 +vt 0.478637 0.360684 +vt 0.521091 0.360684 +vt 0.521091 0.703216 +vt 0.538026 0.920413 +vt 0.863963 0.920413 +vt 0.863963 0.962806 +vt 0.538026 0.962806 +vt 0.132310 0.920413 +vt 0.473238 0.943915 +vt 0.560446 0.943915 +vt 0.098343 0.047414 +vt 0.797971 0.047414 +vt 0.797971 0.943294 +vt 0.098344 0.943294 +vt 0.037502 0.030911 +vt 0.939162 0.030911 +vt 0.803913 0.298774 +vt 0.172751 0.298774 +vt 0.892183 0.964246 +vt 0.159831 0.964246 +vt 0.159831 0.026462 +vt 0.892183 0.026462 +vt 0.019074 0.005154 +vt 0.977432 0.005154 +vt 0.977432 0.986902 +vt 0.019074 0.986902 +vt 0.817422 0.930372 +vt 0.126152 0.930372 +vt 0.126152 0.045195 +vt 0.817422 0.045195 +vt 0.138513 0.166539 +vt 0.138513 0.788518 +vt 0.051776 0.788518 +vt 0.051776 0.166539 +vt 0.939162 0.954577 +vt 0.803913 0.686714 +vt 0.037502 0.954578 +vt 0.172751 0.686715 +vt 0.796426 0.320381 +vt 0.796426 0.676266 +vt 0.188809 0.676266 +vt 0.188809 0.320381 +vt 0.225250 0.788518 +vt 0.641589 0.621416 +vt 0.554852 0.621416 +vt 0.554852 0.248228 +vt 0.399667 0.539726 +vt 0.399667 0.166539 +vt 0.486404 0.166539 +vt 0.486404 0.539726 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.125800 0.983500 0.130200 +vn 0.099400 0.986800 -0.128100 +vn -1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +vn -0.099400 0.986800 -0.128100 +vn -0.125800 0.983500 0.130200 +s off +f 9/1/1 6/2/1 2/3/1 10/4/1 +f 21/5/2 7/6/2 3/7/2 22/8/2 +f 8/9/3 4/10/3 19/11/3 18/12/3 +f 23/13/3 5/14/3 1/15/3 24/16/3 +f 25/17/4 21/18/4 6/19/4 9/20/4 +f 23/21/5 25/17/5 9/20/5 5/22/5 +f 7/23/6 11/24/6 12/25/6 3/26/6 +f 1/15/3 5/14/3 14/27/3 13/28/3 +f 14/29/1 16/30/1 15/31/1 13/32/1 +f 9/33/2 10/34/2 15/35/2 16/36/2 +f 10/37/7 1/38/7 13/39/7 15/40/7 +f 5/22/8 9/20/8 16/41/8 14/42/8 +f 17/43/6 18/44/6 19/45/6 20/46/6 +f 12/47/2 11/48/2 17/36/2 20/35/2 +f 4/49/7 12/50/7 20/51/7 19/52/7 +f 11/53/8 8/54/8 18/55/8 17/56/8 +f 8/54/9 11/53/9 25/17/9 23/21/9 +f 11/53/10 7/57/10 21/18/10 25/17/10 +f 8/9/3 23/13/3 24/16/3 4/10/3 +f 6/58/2 21/5/2 22/8/2 2/59/2 +f 27/60/6 29/61/6 28/62/6 26/63/6 +f 33/64/3 32/65/3 37/66/3 36/67/3 +f 33/68/1 31/69/1 30/70/1 32/71/1 +f 31/72/2 27/73/2 26/74/2 30/75/2 +f 26/76/7 28/77/7 32/78/7 30/79/7 +f 36/80/6 37/81/6 41/82/6 40/83/6 +f 32/65/3 28/84/3 35/85/3 37/66/3 +f 29/86/3 33/64/3 36/67/3 34/87/3 +f 28/84/3 29/86/3 34/87/3 35/85/3 +f 38/88/3 40/89/3 41/90/3 39/91/3 +f 35/81/1 34/80/1 38/24/1 39/92/1 +f 37/44/8 35/93/8 39/94/8 41/95/8 +f 34/96/7 36/97/7 40/98/7 38/99/7 diff --git a/mods/mylandscaping/models/mylandscaping_columnf_oc_b.obj b/mods/mylandscaping/models/mylandscaping_columnf_oc_b.obj new file mode 100644 index 00000000..785231da --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columnf_oc_b.obj @@ -0,0 +1,240 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Column_OC_B_Cube.037 +v 0.201784 -0.500000 0.499420 +v -0.498216 -0.500000 0.499420 +v -0.498216 -0.500000 -0.200580 +v 0.201784 -0.500000 -0.200580 +v 0.201784 0.500000 0.499420 +v -0.498216 0.500000 0.499420 +v -0.498216 0.500000 -0.200580 +v 0.201784 0.500000 -0.200580 +v -0.498216 0.500000 0.382753 +v -0.498216 0.500000 -0.083914 +v -0.498216 -0.500000 -0.083914 +v -0.498216 -0.500000 0.382753 +v 0.201784 0.500000 -0.083914 +v 0.201784 0.500000 0.382753 +v 0.201784 -0.500000 0.382753 +v 0.201784 -0.500000 -0.083914 +v 0.085117 0.500000 0.499420 +v -0.381549 0.500000 0.499420 +v -0.381549 -0.500000 0.499420 +v 0.085117 -0.500000 0.499420 +v -0.381549 0.500000 -0.200580 +v 0.085117 0.500000 -0.200580 +v 0.085117 -0.500000 -0.200580 +v -0.381549 -0.500000 -0.200580 +v -0.381549 -0.500000 0.382753 +v 0.085117 -0.500000 0.382753 +v -0.381549 -0.500000 -0.083914 +v 0.085117 -0.500000 -0.083914 +v -0.381549 0.500000 -0.083914 +v 0.085117 0.500000 -0.083914 +v -0.381549 0.500000 0.382753 +v 0.085117 0.500000 0.382753 +v 0.201784 -0.256932 0.499420 +v 0.201784 0.374971 0.499420 +v -0.498216 0.374971 0.499420 +v -0.498216 -0.256932 0.499420 +v -0.498216 0.374971 -0.200580 +v -0.498216 -0.256932 -0.200580 +v 0.201784 0.374971 -0.200580 +v 0.201784 -0.256932 -0.200580 +v -0.498216 0.374971 0.382753 +v -0.498216 -0.256932 0.382753 +v -0.498216 0.374971 -0.083914 +v -0.498216 -0.256932 -0.083914 +v 0.201784 0.374971 -0.083914 +v 0.201784 -0.256932 -0.083914 +v 0.201784 0.374971 0.382753 +v 0.201784 -0.256932 0.382753 +v 0.085117 0.374971 0.499420 +v 0.085117 -0.256932 0.499420 +v -0.381549 0.374971 0.499420 +v -0.381549 -0.256932 0.499420 +v -0.381549 0.374971 -0.200580 +v -0.381549 -0.256932 -0.200580 +v 0.085117 0.374971 -0.200580 +v 0.085117 -0.256932 -0.200580 +v -0.381549 0.374971 -0.100580 +v -0.381549 -0.256932 -0.100580 +v 0.085117 0.374971 -0.100580 +v 0.085117 -0.256932 -0.100580 +v 0.101784 0.374971 -0.083914 +v 0.101784 -0.256932 -0.083914 +v 0.101784 0.374971 0.382753 +v 0.101784 -0.256932 0.382753 +vt 0.239726 0.324399 +vt 0.287671 0.324399 +vt 0.287671 0.428571 +vt 0.239726 0.428571 +vt 0.239726 0.752971 +vt 0.287671 0.752971 +vt 0.287671 0.857143 +vt 0.239726 0.857143 +vt 0.335616 0.532744 +vt 0.287671 0.532744 +vt 0.335616 0.428571 +vt 0.527397 0.324399 +vt 0.575342 0.324399 +vt 0.575342 0.428571 +vt 0.527397 0.428571 +vt 0.623288 0.050000 +vt 0.575342 0.050000 +vt 0.575342 0.000000 +vt 0.623288 0.000000 +vt 0.815068 0.550000 +vt 0.863014 0.550000 +vt 0.863014 0.600000 +vt 0.815068 0.600000 +vt 0.000000 0.752971 +vt 0.047945 0.752971 +vt 0.047945 0.857143 +vt 0.000000 0.857143 +vt 0.335616 0.324399 +vt 0.623288 0.300000 +vt 0.575343 0.300000 +vt 0.575343 0.250000 +vt 0.623288 0.250000 +vt 0.815068 0.300000 +vt 0.863014 0.300000 +vt 0.863014 0.350000 +vt 0.815068 0.350000 +vt 0.000000 0.324399 +vt 0.047945 0.324399 +vt 0.047945 0.428571 +vt 0.000000 0.428571 +vt 0.575342 0.532744 +vt 0.527397 0.532744 +vt 0.863014 0.050000 +vt 0.815068 0.050000 +vt 0.815068 0.000000 +vt 0.863014 0.000000 +vt 0.575343 0.550000 +vt 0.623288 0.550000 +vt 0.623288 0.600000 +vt 0.575343 0.600000 +vt 0.815068 0.250000 +vt 0.863014 0.250000 +vt 0.623288 0.350000 +vt 0.575342 0.350000 +vt 0.239726 0.000000 +vt 0.287671 0.000000 +vt 0.287671 0.053584 +vt 0.239726 0.053584 +vt 0.287671 0.482155 +vt 0.239726 0.482155 +vt 0.335616 0.857143 +vt 0.287671 0.803559 +vt 0.335616 0.803559 +vt 0.527397 0.000000 +vt 0.575342 0.053584 +vt 0.527397 0.053584 +vt 0.047945 0.482155 +vt 0.000000 0.482155 +vt 0.335616 0.000000 +vt 0.335616 0.053584 +vt 0.945205 0.470815 +vt 0.945205 0.270815 +vt 0.986301 0.270815 +vt 0.986301 0.470815 +vt 0.000000 0.000000 +vt 0.047945 0.000000 +vt 0.047945 0.053584 +vt 0.000000 0.053584 +vt 0.575342 0.857143 +vt 0.527397 0.857143 +vt 0.527397 0.803559 +vt 0.575342 0.803559 +vt 1.000000 0.600000 +vt 1.000000 0.800000 +vt 0.958904 0.800000 +vt 0.958904 0.600000 +vt 0.958904 0.870816 +vt 0.767123 0.870816 +vt 0.767123 0.600000 +vt 1.000000 1.000000 +vt 0.958904 1.000000 +vt 0.863014 0.570816 +vt 0.904110 0.300000 +vt 0.904110 0.570816 +vt 0.904110 0.270815 +vt 0.904110 0.000000 +vt 0.945206 0.000000 +vt 0.575342 0.870816 +vt 0.986301 0.000000 +vt 0.986301 0.200000 +vt 0.945206 0.200000 +vt 0.904110 0.541631 +vt 0.945206 0.541631 +vt 0.863014 0.270815 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +s off +f 52/1/1 36/2/1 2/3/1 19/4/1 +f 44/5/2 38/6/2 3/7/2 11/8/2 +f 56/9/3 40/10/3 4/3/3 23/11/3 +f 48/12/4 33/13/4 1/14/4 15/15/4 +f 27/16/5 11/17/5 3/18/5 24/19/5 +f 31/20/6 9/21/6 6/22/6 18/23/6 +f 36/24/2 42/25/2 12/26/2 2/27/2 +f 42/25/2 44/5/2 11/8/2 12/26/2 +f 40/2/4 46/28/4 16/11/4 4/3/4 +f 46/28/4 48/12/4 15/15/4 16/11/4 +f 19/29/5 2/30/5 12/31/5 25/32/5 +f 25/32/5 12/31/5 11/17/5 27/16/5 +f 21/33/6 7/34/6 10/35/6 29/36/6 +f 29/36/6 10/35/6 9/21/6 31/20/6 +f 33/37/1 50/38/1 20/39/1 1/40/1 +f 50/38/1 52/1/1 19/4/1 20/39/1 +f 38/41/3 54/42/3 24/15/3 3/14/3 +f 54/42/3 56/9/3 23/11/3 24/15/3 +f 16/43/5 28/44/5 23/45/5 4/46/5 +f 28/44/5 27/16/5 24/19/5 23/45/5 +f 14/47/6 32/48/6 17/49/6 5/50/6 +f 32/48/6 31/20/6 18/23/6 17/49/6 +f 1/34/5 20/33/5 26/51/5 15/52/5 +f 20/33/5 19/29/5 25/32/5 26/51/5 +f 15/52/5 26/51/5 28/44/5 16/43/5 +f 26/51/5 25/32/5 27/16/5 28/44/5 +f 8/30/6 22/29/6 30/53/6 13/54/6 +f 22/29/6 21/33/6 29/36/6 30/53/6 +f 13/54/6 30/53/6 32/48/6 14/47/6 +f 30/53/6 29/36/6 31/20/6 32/48/6 +f 18/55/1 6/56/1 35/57/1 51/58/1 +f 51/58/1 35/57/1 36/2/1 52/1/1 +f 10/4/2 7/3/2 37/59/2 43/60/2 +f 43/60/2 37/59/2 38/6/2 44/5/2 +f 22/61/3 8/7/3 39/62/3 55/63/3 +f 55/63/3 39/62/3 40/10/3 56/9/3 +f 14/64/4 5/18/4 34/65/4 47/66/4 +f 47/66/4 34/65/4 33/13/4 48/12/4 +f 6/40/2 9/39/2 41/67/2 35/68/2 +f 35/68/2 41/67/2 42/25/2 36/24/2 +f 9/39/2 10/4/2 43/60/2 41/67/2 +f 41/67/2 43/60/2 44/5/2 42/25/2 +f 8/56/4 13/69/4 45/70/4 39/57/4 +f 39/57/4 45/70/4 46/28/4 40/2/4 +f 13/69/4 14/64/4 47/66/4 45/70/4 +f 48/71/6 46/72/6 62/73/6 64/74/6 +f 5/75/1 17/76/1 49/77/1 34/78/1 +f 34/78/1 49/77/1 50/38/1 33/37/1 +f 17/76/1 18/55/1 51/58/1 49/77/1 +f 49/77/1 51/58/1 52/1/1 50/38/1 +f 7/79/3 21/80/3 53/81/3 37/82/3 +f 37/82/3 53/81/3 54/42/3 38/41/3 +f 21/80/3 22/61/3 55/63/3 53/81/3 +f 56/83/6 54/84/6 58/85/6 60/86/6 +f 57/87/3 59/88/3 60/89/3 58/86/3 +f 53/84/5 55/90/5 59/91/5 57/85/5 +f 55/92/2 56/34/2 60/93/2 59/94/2 +f 54/95/4 53/96/4 57/97/4 58/72/4 +f 61/50/4 63/89/4 64/88/4 62/98/4 +f 45/99/5 47/100/5 63/101/5 61/97/5 +f 47/102/3 48/95/3 64/72/3 63/103/3 +f 46/104/1 45/46/1 61/96/1 62/95/1 diff --git a/mods/mylandscaping/models/mylandscaping_columnf_oc_t.obj b/mods/mylandscaping/models/mylandscaping_columnf_oc_t.obj new file mode 100644 index 00000000..df952a82 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_columnf_oc_t.obj @@ -0,0 +1,306 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Column_OC_T_Cube.040 +v 0.300000 0.500019 0.500000 +v -0.500000 0.500019 0.500000 +v -0.500000 0.500019 -0.300000 +v 0.300000 0.500019 -0.300000 +v 0.300000 0.600020 0.500000 +v -0.500000 0.600020 0.500000 +v -0.500000 0.600020 -0.300000 +v 0.300000 0.600020 -0.300000 +v -0.100000 0.708522 0.100000 +v 0.200000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.200000 +v 0.200000 -0.500000 -0.200000 +v 0.200000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.200000 +v 0.200000 0.500000 -0.200000 +v -0.500000 0.500000 0.290000 +v -0.500000 0.500000 0.010000 +v -0.500000 -0.500000 0.010000 +v -0.500000 -0.500000 0.290000 +v 0.200000 0.500000 0.010000 +v 0.200000 0.500000 0.290000 +v 0.200000 -0.500000 0.290000 +v 0.200000 -0.500000 0.010000 +v -0.010000 0.500000 0.500000 +v -0.290000 0.500000 0.500000 +v -0.290000 -0.500000 0.500000 +v -0.010000 -0.500000 0.500000 +v -0.290000 0.500000 -0.200000 +v -0.010000 0.500000 -0.200000 +v -0.010000 -0.500000 -0.200000 +v -0.290000 -0.500000 -0.200000 +v -0.290000 -0.500000 0.290000 +v -0.010000 -0.500000 0.290000 +v -0.290000 -0.500000 0.010000 +v -0.010000 -0.500000 0.010000 +v -0.290000 0.500000 0.010000 +v -0.010000 0.500000 0.010000 +v -0.290000 0.500000 0.290000 +v -0.010000 0.500000 0.290000 +v 0.200000 -0.374161 0.500000 +v 0.200000 0.374971 0.500000 +v -0.500000 0.374971 0.500000 +v -0.500000 -0.374161 0.500000 +v -0.500000 0.374971 -0.200000 +v -0.500000 -0.374161 -0.200000 +v 0.200000 0.374971 -0.200000 +v 0.200000 -0.374161 -0.200000 +v -0.500000 0.374971 0.290000 +v -0.500000 -0.374161 0.290000 +v -0.500000 0.374971 0.010000 +v -0.500000 -0.374161 0.010000 +v 0.200000 0.374971 0.010000 +v 0.200000 -0.374161 0.010000 +v 0.200000 0.374971 0.290000 +v 0.200000 -0.374161 0.290000 +v -0.010000 0.374971 0.500000 +v -0.010000 -0.374161 0.500000 +v -0.290000 0.374971 0.500000 +v -0.290000 -0.374161 0.500000 +v -0.290000 0.374971 -0.200000 +v -0.290000 -0.374161 -0.200000 +v -0.010000 0.374971 -0.200000 +v -0.010000 -0.374161 -0.200000 +v -0.290000 0.374971 0.010000 +v -0.290000 -0.374161 0.010000 +v -0.010000 0.374971 0.010000 +v -0.010000 -0.374161 0.010000 +v -0.010000 0.374971 0.010000 +v -0.010000 -0.374161 0.010000 +v -0.010000 0.374971 0.290000 +v -0.010000 -0.374161 0.290000 +vt 0.531410 0.981977 +vt 0.531410 0.039874 +vt 0.645374 0.039874 +vt 0.645374 0.981977 +vt 0.798689 0.048442 +vt 0.798689 0.989154 +vt 0.684893 0.989154 +vt 0.684893 0.048442 +vt 0.912485 0.048442 +vt 0.912485 0.989154 +vt 0.209659 0.020144 +vt 0.209660 0.985961 +vt 0.092827 0.985961 +vt 0.092827 0.020144 +vt 0.959081 0.966258 +vt 0.052954 0.966258 +vt 0.052954 0.029926 +vt 0.959081 0.029926 +vt 0.974502 0.005098 +vt 0.496976 0.498543 +vt 0.019449 0.005098 +vt 0.974502 0.991987 +vt 0.019449 0.991987 +vt 0.627208 0.833815 +vt 0.809065 0.833815 +vt 0.809065 0.946422 +vt 0.627208 0.946422 +vt 0.360912 0.746403 +vt 0.497942 0.746403 +vt 0.497942 0.831253 +vt 0.360912 0.831253 +vt 0.817679 0.746403 +vt 0.954709 0.746403 +vt 0.954709 0.831253 +vt 0.817679 0.831253 +vt 0.776389 0.498507 +vt 0.889345 0.498507 +vt 0.889345 0.568451 +vt 0.776389 0.568451 +vt 0.249259 0.685172 +vt 0.136302 0.685172 +vt 0.136302 0.568451 +vt 0.249259 0.568451 +vt 0.379105 0.650776 +vt 0.379105 0.905288 +vt 0.132803 0.905288 +vt 0.132803 0.650776 +vt 0.041175 0.746403 +vt 0.178205 0.746403 +vt 0.178205 0.831253 +vt 0.041175 0.831253 +vt 0.512824 0.498507 +vt 0.625780 0.498507 +vt 0.625780 0.568451 +vt 0.512824 0.568451 +vt 0.249259 0.957523 +vt 0.136302 0.957523 +vt 0.136302 0.840801 +vt 0.249259 0.840801 +vt 0.953809 0.650776 +vt 0.953809 0.905288 +vt 0.707507 0.905288 +vt 0.707507 0.650776 +vt 0.202875 0.833815 +vt 0.384732 0.833815 +vt 0.384732 0.946422 +vt 0.202875 0.946422 +vt 0.634972 0.746403 +vt 0.634972 0.831253 +vt 0.512824 0.685172 +vt 0.399867 0.685172 +vt 0.399867 0.568451 +vt 0.379105 0.056914 +vt 0.379105 0.311427 +vt 0.132803 0.311427 +vt 0.132803 0.056914 +vt 0.512824 0.957523 +vt 0.399867 0.957523 +vt 0.399867 0.840801 +vt 0.512824 0.840801 +vt 0.953809 0.056914 +vt 0.953809 0.311426 +vt 0.707507 0.311426 +vt 0.707507 0.056914 +vt 0.627208 0.051570 +vt 0.809065 0.051570 +vt 0.809065 0.163452 +vt 0.627208 0.163452 +vt 0.360911 0.156978 +vt 0.497942 0.156978 +vt 0.497942 0.241282 +vt 0.360912 0.241282 +vt 0.817679 0.156978 +vt 0.954709 0.156978 +vt 0.954709 0.241282 +vt 0.817679 0.241282 +vt 0.776389 0.012633 +vt 0.889345 0.012633 +vt 0.889345 0.082127 +vt 0.776389 0.082127 +vt 0.041175 0.156978 +vt 0.178205 0.156978 +vt 0.178205 0.241282 +vt 0.041175 0.241282 +vt 0.512824 0.012633 +vt 0.625780 0.012633 +vt 0.625780 0.082127 +vt 0.512824 0.082127 +vt 0.424936 0.544372 +vt 0.424936 0.881465 +vt 0.180271 0.881465 +vt 0.180271 0.544372 +vt 0.202875 0.051570 +vt 0.384732 0.051570 +vt 0.384732 0.163452 +vt 0.202875 0.163453 +vt 0.634972 0.156978 +vt 0.634972 0.241282 +vt 0.424936 0.207279 +vt 0.669600 0.207279 +vt 0.669600 0.544372 +vt 0.157443 0.034212 +vt 0.493630 0.034212 +vt 0.493630 0.963650 +vt 0.157443 0.963650 +vt 0.180271 0.207280 +vt 0.925642 0.011806 +vt 0.925642 0.958019 +vt 0.668952 0.958019 +vt 0.668952 0.011806 +vt 0.652137 0.975352 +vt 0.652137 0.048177 +vt 0.903663 0.048177 +vt 0.903663 0.975352 +vt 0.303356 0.050212 +vt 0.635769 0.050212 +vt 0.635769 0.969219 +vt 0.303356 0.969219 +vt 0.914264 0.207279 +vt 0.914264 0.544372 +vt 0.271758 0.038545 +vt 0.271758 0.919632 +vt 0.032736 0.919632 +vt 0.032736 0.038545 +vt 0.440763 0.933480 +vt 0.440763 0.080128 +vt 0.672261 0.080128 +vt 0.672261 0.933480 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.261800 0.965100 0.000000 +vn 0.000000 0.965100 -0.261800 +vn -0.261800 0.965100 0.000000 +vn 0.000000 0.965100 0.261800 +vn 0.000000 1.000000 0.000000 +s off +f 5/1/1 6/2/1 2/3/1 1/4/1 +f 6/5/2 7/6/2 3/7/2 2/8/2 +f 7/6/3 8/5/3 4/9/3 3/10/3 +f 8/11/4 5/12/4 1/13/4 4/14/4 +f 1/15/5 2/16/5 3/17/5 4/18/5 +f 8/19/6 9/20/6 5/21/6 +f 8/19/7 7/22/7 9/20/7 +f 7/22/8 6/23/8 9/20/8 +f 6/23/9 5/21/9 9/20/9 +f 61/24/1 45/25/1 11/26/1 28/27/1 +f 53/28/2 47/29/2 12/30/2 20/31/2 +f 65/32/3 49/33/3 13/34/3 32/35/3 +f 57/36/4 42/37/4 10/38/4 24/39/4 +f 36/40/5 20/41/5 12/42/5 33/43/5 +f 40/44/10 18/45/10 15/46/10 27/47/10 +f 45/48/2 51/49/2 21/50/2 11/51/2 +f 51/49/2 53/28/2 20/31/2 21/50/2 +f 49/52/4 55/53/4 25/54/4 13/55/4 +f 55/53/4 57/36/4 24/39/4 25/54/4 +f 28/56/5 11/57/5 21/58/5 34/59/5 +f 34/59/5 21/58/5 20/41/5 36/40/5 +f 30/60/10 16/61/10 19/62/10 38/63/10 +f 38/63/10 19/62/10 18/45/10 40/44/10 +f 42/64/1 59/65/1 29/66/1 10/67/1 +f 59/65/1 61/24/1 28/27/1 29/66/1 +f 47/29/3 63/68/3 33/69/3 12/30/3 +f 63/68/3 65/32/3 32/35/3 33/69/3 +f 25/70/5 37/71/5 32/72/5 13/55/5 +f 37/71/5 36/40/5 33/43/5 32/72/5 +f 23/73/10 41/74/10 26/75/10 14/76/10 +f 41/74/10 40/44/10 27/47/10 26/75/10 +f 10/77/5 29/78/5 35/79/5 24/80/5 +f 29/78/5 28/56/5 34/59/5 35/79/5 +f 24/80/5 35/79/5 37/71/5 25/70/5 +f 35/79/5 34/59/5 36/40/5 37/71/5 +f 17/81/10 31/82/10 39/83/10 22/84/10 +f 31/82/10 30/60/10 38/63/10 39/83/10 +f 22/84/10 39/83/10 41/74/10 23/73/10 +f 39/83/10 38/63/10 40/44/10 41/74/10 +f 27/85/1 15/86/1 44/87/1 60/88/1 +f 60/88/1 44/87/1 45/25/1 61/24/1 +f 19/89/2 16/90/2 46/91/2 52/92/2 +f 52/92/2 46/91/2 47/29/2 53/28/2 +f 31/93/3 17/94/3 48/95/3 64/96/3 +f 64/96/3 48/95/3 49/33/3 65/32/3 +f 23/97/4 14/98/4 43/99/4 56/100/4 +f 56/100/4 43/99/4 42/37/4 57/36/4 +f 15/101/2 18/102/2 50/103/2 44/104/2 +f 44/104/2 50/103/2 51/49/2 45/48/2 +f 18/102/2 19/89/2 52/92/2 50/103/2 +f 50/103/2 52/92/2 53/28/2 51/49/2 +f 17/105/4 22/106/4 54/107/4 48/108/4 +f 48/108/4 54/107/4 55/53/4 49/52/4 +f 22/106/4 23/97/4 56/100/4 54/107/4 +f 57/109/10 55/110/10 71/111/10 73/112/10 +f 14/113/1 26/114/1 58/115/1 43/116/1 +f 43/116/1 58/115/1 59/65/1 42/64/1 +f 26/114/1 27/85/1 60/88/1 58/115/1 +f 58/115/1 60/88/1 61/24/1 59/65/1 +f 16/90/3 30/117/3 62/118/3 46/91/3 +f 46/91/3 62/118/3 63/68/3 47/29/3 +f 30/117/3 31/93/3 64/96/3 62/118/3 +f 65/109/10 63/119/10 67/120/10 69/121/10 +f 66/122/3 68/123/3 69/124/3 67/125/3 +f 62/119/5 64/109/5 68/112/5 66/126/5 +f 64/127/2 65/128/2 69/129/2 68/130/2 +f 63/131/4 62/132/4 66/133/4 67/134/4 +f 70/135/4 72/136/4 73/137/4 71/138/4 +f 54/121/5 56/120/5 72/139/5 70/140/5 +f 56/141/3 57/142/3 73/143/3 72/144/3 +f 55/145/1 54/146/1 70/147/1 71/148/1 diff --git a/mods/mylandscaping/models/mylandscaping_crusher.obj b/mods/mylandscaping/models/mylandscaping_crusher.obj new file mode 100644 index 00000000..ae775d62 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_crusher.obj @@ -0,0 +1,1539 @@ +# Blender v2.74 (sub 5) OBJ File: 'Machine.blend' +# www.blender.org +o Cube.006 +v -1.369511 -0.441827 -0.406448 +v -1.369511 0.743077 -0.406448 +v -1.369550 -0.441827 -0.457570 +v -1.369550 0.743077 -0.457570 +v -1.318389 -0.441827 -0.406487 +v -1.318389 0.743077 -0.406487 +v -1.318427 -0.441827 -0.457609 +v -1.318427 0.743077 -0.457609 +v -1.407824 -0.471827 -0.368077 +v -1.407920 -0.471827 -0.495883 +v -1.280018 -0.471827 -0.368174 +v -1.280115 -0.471827 -0.495979 +v -1.407824 -0.501827 -0.368077 +v -1.407920 -0.501827 -0.495883 +v -1.280018 -0.501827 -0.368174 +v -1.280115 -0.501827 -0.495979 +v -0.780115 -0.501827 -0.495979 +v -0.780018 -0.501827 -0.368174 +v -0.907920 -0.501827 -0.495883 +v -0.907824 -0.501827 -0.368077 +v -0.780115 -0.471827 -0.495979 +v -0.780018 -0.471827 -0.368174 +v -0.907920 -0.471827 -0.495883 +v -0.907824 -0.471827 -0.368077 +v -0.818427 0.560493 -0.457609 +v -0.818427 -0.441827 -0.457609 +v -0.818389 0.560493 -0.406487 +v -0.818389 -0.441827 -0.406487 +v -0.869550 0.560493 -0.457570 +v -0.869550 -0.441827 -0.457570 +v -0.869511 0.560493 -0.406448 +v -0.869511 -0.441827 -0.406448 +v -0.869511 -0.441827 0.450299 +v -0.869511 0.560493 0.450299 +v -0.869550 -0.441827 0.399177 +v -0.869550 0.560493 0.399177 +v -0.818389 -0.441827 0.450260 +v -0.818389 0.560493 0.450260 +v -0.818427 -0.441827 0.399138 +v -0.818427 0.560493 0.399138 +v -0.907824 -0.471827 0.488669 +v -0.907920 -0.471827 0.360864 +v -0.780018 -0.471827 0.488573 +v -0.780115 -0.471827 0.360768 +v -0.907824 -0.501827 0.488669 +v -0.907920 -0.501827 0.360864 +v -0.780018 -0.501827 0.488573 +v -0.780115 -0.501827 0.360768 +v -1.280115 -0.501827 0.360768 +v -1.280018 -0.501827 0.488573 +v -1.407920 -0.501827 0.360864 +v -1.407824 -0.501827 0.488669 +v -1.280115 -0.471827 0.360768 +v -1.280018 -0.471827 0.488573 +v -1.407920 -0.471827 0.360864 +v -1.407824 -0.471827 0.488669 +v -1.318427 0.743077 0.399138 +v -1.318427 -0.441827 0.399138 +v -1.318389 0.743077 0.450260 +v -1.318389 -0.441827 0.450260 +v -1.369550 0.743077 0.399177 +v -1.369550 -0.441827 0.399177 +v -1.369511 0.743077 0.450299 +v -1.369511 -0.441827 0.450299 +v 0.316931 0.177855 0.366846 +v 0.316931 1.362759 0.366846 +v 0.353727 0.177855 0.331356 +v 0.353727 1.362759 0.331356 +v 0.352421 0.177855 0.403642 +v 0.352421 1.362759 0.403642 +v 0.389217 0.177855 0.368152 +v 0.389217 1.362759 0.368152 +v 0.262717 0.147855 0.365866 +v 0.354707 0.147855 0.277142 +v 0.351441 0.147855 0.457857 +v 0.443431 0.147855 0.369132 +v 0.262717 0.117855 0.365866 +v 0.354707 0.117855 0.277142 +v 0.351441 0.117855 0.457857 +v 0.443431 0.117855 0.369132 +v -0.388839 0.177855 0.367964 +v -0.388839 1.362759 0.367964 +v -0.352439 0.177855 0.332068 +v -0.352439 1.362759 0.332068 +v -0.352943 0.177855 0.404364 +v -0.352943 1.362759 0.404364 +v -0.316543 0.177855 0.368468 +v -0.316543 1.362759 0.368468 +v -0.443061 0.147855 0.367586 +v -0.352061 0.147855 0.277846 +v -0.353321 0.147855 0.458586 +v -0.262321 0.147855 0.368846 +v -0.443061 0.117855 0.367586 +v -0.352061 0.117855 0.277846 +v -0.353321 0.117855 0.458586 +v -0.262321 0.117855 0.368846 +v 0.500271 0.117855 -0.310458 +v 0.409271 0.117855 -0.220718 +v 0.410531 0.117855 -0.401458 +v 0.319531 0.117855 -0.311718 +v 0.500271 0.147855 -0.310458 +v 0.409271 0.147855 -0.220718 +v 0.410531 0.147855 -0.401458 +v 0.319531 0.147855 -0.311718 +v 0.446049 1.362759 -0.310836 +v 0.446049 0.177855 -0.310836 +v 0.409649 1.362759 -0.274940 +v 0.409649 0.177855 -0.274940 +v 0.410153 1.362759 -0.347236 +v 0.410153 0.177855 -0.347236 +v 0.373753 1.362759 -0.311340 +v 0.373753 0.177855 -0.311340 +v -1.077457 -0.212707 0.025909 +v -0.645645 -0.120023 0.151513 +v -0.623900 -0.115318 0.025039 +v -1.055713 -0.208002 -0.100565 +v -0.656276 -0.071641 0.025095 +v -1.045081 -0.256384 0.025853 +v -0.635492 -0.168436 0.025067 +v -0.840287 -0.212410 0.025460 +v -1.065865 -0.159589 0.025881 +v -0.861071 -0.115615 0.025488 +v -0.646124 -0.120053 -0.101351 +v -0.850918 -0.164027 -0.100958 +v -1.055234 -0.207972 0.152299 +v -0.850440 -0.163997 0.151906 +v -1.072141 -0.211538 -0.068926 +v -1.064167 -0.247825 0.025888 +v -1.071782 -0.211516 0.120723 +v -1.079755 -0.175229 0.025909 +v -0.635660 -0.166571 0.146666 +v -0.629217 -0.116487 0.119874 +v -1.065238 -0.161425 0.147478 +v -0.621602 -0.152796 0.025039 +v -0.629576 -0.116509 -0.069774 +v -0.637190 -0.080200 0.025060 +v -1.045709 -0.254548 -0.095744 +v -0.656109 -0.073506 -0.096503 +v -1.045249 -0.254519 0.147451 +v -0.840454 -0.210545 0.147059 +v -0.655649 -0.073477 0.146693 +v -0.860443 -0.117451 0.147085 +v -0.636120 -0.166600 -0.096530 +v -0.840914 -0.210574 -0.096137 +v -1.065698 -0.161454 -0.095718 +v -0.860904 -0.117480 -0.096110 +v -0.697683 -0.181790 0.025187 +v -0.982891 -0.243030 0.025734 +v -1.003675 -0.146235 0.025762 +v -0.718467 -0.084994 0.025214 +v -0.708314 -0.133407 -0.101232 +v -0.993522 -0.194648 -0.100684 +v -0.993043 -0.194618 0.152180 +v -0.707836 -0.133377 0.151633 +v -1.073593 -0.183730 -0.044342 +v -1.062046 -0.237505 -0.044357 +v -1.073327 -0.183713 0.096138 +v -1.061780 -0.237488 0.096123 +v -0.639577 -0.090537 -0.045175 +v -0.628031 -0.144312 -0.045190 +v -0.639311 -0.090520 0.095306 +v -0.627765 -0.144295 0.095290 +v -0.983058 -0.241165 0.147332 +v -0.697850 -0.179925 0.146785 +v -0.717840 -0.086830 0.146812 +v -1.003047 -0.148071 0.147359 +v -0.698310 -0.179954 -0.096411 +v -0.983518 -0.241194 -0.095864 +v -1.003508 -0.148100 -0.095837 +v -0.718300 -0.086859 -0.096384 +v -1.489947 -0.442000 0.051036 +v -1.048300 -0.442130 0.176640 +v -1.026052 -0.442099 0.050166 +v -1.467699 -0.441969 -0.075438 +v -1.048527 -0.392593 0.050222 +v -1.467473 -0.491506 0.050980 +v -1.048548 -0.491595 0.050195 +v -1.258010 -0.491550 0.050587 +v -1.467452 -0.392504 0.051008 +v -1.257989 -0.392549 0.050615 +v -1.048774 -0.442059 -0.076224 +v -1.258237 -0.442014 -0.075831 +v -1.467225 -0.442040 0.177426 +v -1.257763 -0.442085 0.177033 +v -1.484504 -0.441975 -0.043798 +v -1.484334 -0.479127 0.051015 +v -1.484148 -0.442028 0.145850 +v -1.484318 -0.404876 0.051036 +v -1.048319 -0.489736 0.171793 +v -1.031496 -0.442124 0.145001 +v -1.467224 -0.394431 0.172605 +v -1.031682 -0.479223 0.050166 +v -1.031851 -0.442071 -0.044647 +v -1.031666 -0.404972 0.050187 +v -1.467700 -0.489579 -0.070617 +v -1.048755 -0.394452 -0.071376 +v -1.467244 -0.489647 0.172579 +v -1.257782 -0.489692 0.172186 +v -1.048299 -0.394520 0.171820 +v -1.257762 -0.394476 0.172213 +v -1.048776 -0.489668 -0.071403 +v -1.258238 -0.489623 -0.071010 +v -1.467680 -0.394363 -0.070590 +v -1.258218 -0.394407 -0.070983 +v -1.112156 -0.491581 0.050314 +v -1.403865 -0.491519 0.050861 +v -1.403843 -0.392518 0.050889 +v -1.112135 -0.392580 0.050342 +v -1.112383 -0.442045 -0.076104 +v -1.404091 -0.441983 -0.075557 +v -1.403617 -0.442054 0.177307 +v -1.111908 -0.442116 0.176760 +v -1.480080 -0.414482 -0.019215 +v -1.480091 -0.469483 -0.019230 +v -1.479816 -0.414522 0.121265 +v -1.479828 -0.469522 0.121250 +v -1.036171 -0.414577 -0.020047 +v -1.036183 -0.469577 -0.020063 +v -1.035908 -0.414616 0.120433 +v -1.035920 -0.469617 0.120417 +v -1.403636 -0.489661 0.172459 +v -1.111928 -0.489723 0.171912 +v -1.111907 -0.394507 0.171939 +v -1.403616 -0.394445 0.172486 +v -1.112384 -0.489654 -0.071284 +v -1.404092 -0.489592 -0.070736 +v -1.404072 -0.394376 -0.070710 +v -1.112363 -0.394438 -0.071257 +v -0.744527 -0.500000 0.500000 +v -0.744527 0.120424 0.500000 +v -0.744527 -0.500000 -0.400000 +v -0.744527 0.120424 -0.400000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.120424 0.500000 +v 0.500000 -0.500000 -0.400000 +v 0.500000 0.120424 -0.400000 +v -0.504025 0.120424 -0.400000 +v -0.057555 0.120424 -0.400000 +v -0.057555 -0.500000 -0.400000 +v -0.504025 -0.500000 -0.400000 +v -0.057555 0.120424 0.500000 +v -0.504025 0.120424 0.500000 +v -0.504025 -0.500000 0.500000 +v -0.057555 -0.500000 0.500000 +v -0.744527 0.120424 -0.162966 +v -0.744527 -0.500000 -0.162966 +v 0.500000 0.120424 -0.066067 +v 0.500000 -0.500000 -0.066067 +v -0.057555 0.120424 -0.066067 +v -0.504025 0.120424 -0.066067 +v -0.483092 -0.290974 -0.167691 +v 0.295559 -0.290974 -0.167691 +v -0.595648 0.220424 -0.450000 +v -0.057555 0.220424 -0.450000 +v -0.057555 0.220424 0.000000 +v -0.595648 0.220424 0.000000 +v -0.744527 -0.204228 0.500000 +v -0.744527 -0.204228 -0.400000 +v 0.500000 -0.204228 -0.400000 +v 0.500000 -0.204228 0.500000 +v -0.057555 -0.204228 0.500000 +v -0.504025 -0.204228 0.500000 +v -0.504025 -0.204228 -0.400000 +v -0.057555 -0.204228 -0.400000 +v 0.500000 -0.204228 -0.066067 +v -0.744527 -0.204228 -0.162966 +v -0.744527 -0.500000 0.216966 +v 0.500000 0.120424 0.216966 +v -0.057555 0.120424 0.216966 +v -0.504025 0.120424 0.216966 +v -0.483092 -0.290974 0.325924 +v 0.295559 -0.290974 0.325924 +v -0.744527 0.120424 0.216966 +v 0.500000 -0.500000 0.216966 +v -0.744527 -0.204228 0.216966 +v 0.500000 -0.204228 0.216966 +v -0.744527 0.021858 0.500000 +v -0.744527 0.021858 -0.400000 +v 0.500000 0.021858 -0.400000 +v 0.500000 0.021858 0.500000 +v -0.057555 0.021858 0.500000 +v -0.504025 0.021858 0.500000 +v -0.504025 0.021858 -0.400000 +v -0.057555 0.021858 -0.400000 +v 0.500000 0.021858 -0.066067 +v -0.744527 0.021858 -0.162966 +v 0.500000 0.021858 0.216966 +v -0.744527 0.021858 0.216966 +v -0.944528 -0.252981 -0.162966 +v -0.944528 -0.252981 0.216966 +v -0.944528 -0.103162 -0.221487 +v -0.944528 -0.103162 0.275487 +v -1.141117 0.987753 0.412305 +v -1.136048 0.883812 0.412305 +v -1.033099 0.868612 0.412305 +v -1.111204 0.799843 0.412305 +v -1.348104 0.691554 0.412305 +v -1.307572 0.787402 0.412305 +v -1.393731 0.845764 0.412305 +v -1.293523 0.873835 0.412305 +v -1.301613 0.977585 0.412305 +v -1.217188 0.916741 0.412305 +v -1.141117 0.987753 -0.412305 +v -1.136048 0.883812 -0.412305 +v -1.033099 0.868612 -0.412305 +v -1.111204 0.799843 -0.412305 +v -1.348104 0.691554 -0.412305 +v -1.307572 0.787402 -0.412305 +v -1.393731 0.845764 -0.412305 +v -1.293523 0.873835 -0.412305 +v -1.301613 0.977585 -0.412305 +v -1.217188 0.916741 -0.412305 +v -0.810808 1.101356 0.440000 +v -0.767024 1.006950 0.440000 +v -0.665916 1.031580 0.440000 +v -0.712427 0.938487 0.440000 +v -0.630130 0.874794 0.440000 +v -0.889703 0.853115 0.440000 +v -0.991485 0.874794 0.440000 +v -0.909189 0.938487 0.440000 +v -0.955700 1.031580 0.440000 +v -0.854591 1.006950 0.440000 +v -0.810808 1.101356 -0.440000 +v -0.767024 1.006950 -0.440000 +v -0.665916 1.031580 -0.440000 +v -0.712427 0.938487 -0.440000 +v -0.630130 0.874794 -0.440000 +v -0.889703 0.853115 -0.440000 +v -0.991485 0.874794 -0.440000 +v -0.909189 0.938487 -0.440000 +v -0.955700 1.031580 -0.440000 +v -0.854591 1.006950 -0.440000 +v -1.500000 0.546612 0.400000 +v -1.500000 1.246612 0.500000 +v -1.500000 0.546612 -0.400000 +v -1.500000 1.246612 -0.500000 +v -0.583510 0.246612 0.400000 +v -0.583510 1.246612 0.500000 +v -0.583510 0.246612 -0.400000 +v -0.583510 1.246612 -0.500000 +v -1.500000 1.246612 -0.133333 +v -1.500000 1.246612 -0.466667 +v -1.500000 0.546612 -0.373333 +v -1.500000 0.546612 -0.106667 +v -0.583510 1.246612 -0.466667 +v -0.583510 1.246612 -0.133333 +v -0.583510 0.246612 -0.106667 +v -0.583510 0.246612 -0.373333 +v -1.500000 0.721342 0.424961 +v -1.500000 0.721342 -0.424961 +v -0.583510 0.496226 -0.424961 +v -0.583510 0.496226 0.424961 +v -0.583510 0.496226 -0.396631 +v -0.583510 0.496226 -0.113323 +v -1.500000 0.721342 -0.113323 +v -1.500000 0.721342 -0.396631 +v -0.383510 0.146612 -0.106667 +v -0.383510 0.146612 -0.373333 +v -0.383510 0.396226 -0.396631 +v -0.383510 0.396226 -0.113323 +v 0.000000 1.000000 -0.500000 +v 0.000000 1.500000 -0.500000 +v 0.250000 1.000000 -0.433013 +v 0.250000 1.500000 -0.433013 +v 0.433013 1.000000 -0.250000 +v 0.433013 1.500000 -0.250000 +v 0.500000 1.000000 0.000000 +v 0.500000 1.500000 0.000000 +v 0.433013 1.000000 0.250000 +v 0.433013 1.500000 0.250000 +v 0.250000 1.000000 0.433013 +v 0.250000 1.500000 0.433013 +v 0.000000 1.000000 0.500000 +v 0.000000 1.500000 0.500000 +v -0.250000 1.000000 0.433013 +v -0.250000 1.500000 0.433013 +v -0.433012 1.000000 0.250000 +v -0.433012 1.500000 0.250000 +v -0.500000 1.000000 0.000000 +v -0.500000 1.500000 0.000000 +v -0.433013 1.000000 -0.250000 +v -0.433013 1.500000 -0.250000 +v -0.250000 1.000000 -0.433012 +v -0.250000 1.500000 -0.433012 +v -0.073219 0.600000 -0.406257 +v -0.033450 0.600000 -0.395601 +v -0.004337 0.600000 -0.366488 +v 0.006320 0.600000 -0.326719 +v -0.004337 0.600000 -0.286949 +v -0.033450 0.600000 -0.257836 +v -0.073219 0.600000 -0.247180 +v -0.112988 0.600000 -0.257836 +v -0.142101 0.600000 -0.286949 +v -0.152758 0.600000 -0.326719 +v -0.142101 0.600000 -0.366488 +v -0.112988 0.600000 -0.395601 +v -0.096100 0.438985 -0.406257 +v -0.056875 0.432423 -0.395601 +v -0.028161 0.427620 -0.366488 +v -0.017651 0.425862 -0.326719 +v -0.028161 0.427620 -0.286949 +v -0.056875 0.432423 -0.257836 +v -0.096100 0.438985 -0.247180 +v -0.135324 0.445546 -0.257836 +v -0.164038 0.450349 -0.286949 +v -0.174548 0.452108 -0.326719 +v -0.164038 0.450349 -0.366488 +v -0.135324 0.445546 -0.395601 +v -0.159373 0.279934 -0.404635 +v -0.124387 0.260289 -0.395404 +v -0.098770 0.244344 -0.367392 +v -0.089386 0.236374 -0.328104 +v -0.098749 0.238513 -0.288067 +v -0.124350 0.250188 -0.258011 +v -0.159329 0.268271 -0.245987 +v -0.194315 0.287917 -0.255218 +v -0.219932 0.303861 -0.283230 +v -0.229316 0.311832 -0.322518 +v -0.219953 0.309693 -0.362555 +v -0.194352 0.298018 -0.392612 +v 0.149375 1.639105 -0.258726 +v 0.000000 1.639105 -0.298751 +v 0.258726 1.639105 -0.149375 +v 0.298751 1.639105 0.000000 +v 0.258726 1.639105 0.149375 +v 0.149375 1.639105 0.258726 +v 0.000000 1.639105 0.298751 +v -0.149375 1.639105 0.258726 +v -0.258726 1.639105 0.149375 +v -0.298751 1.639105 0.000000 +v -0.258726 1.639105 -0.149375 +v -0.149375 1.639105 -0.258725 +vt 0.435698 0.811852 +vt 0.162152 0.816109 +vt 0.230154 0.732276 +vt 0.434050 0.705986 +vt 0.638666 0.725919 +vt 0.709244 0.807596 +vt 0.641241 0.891429 +vt 0.437345 0.917718 +vt 0.232729 0.897786 +vt 0.929295 0.000129 +vt 0.929295 0.093942 +vt 0.858720 0.093942 +vt 0.858720 0.000129 +vt 0.814506 0.805963 +vt 0.799162 0.950578 +vt 0.638588 0.725925 +vt 0.794670 0.661894 +vt 0.999871 0.000129 +vt 0.999871 0.093941 +vt 0.435620 0.811858 +vt 0.162074 0.816115 +vt 0.230076 0.732282 +vt 0.433972 0.705993 +vt 0.429425 0.617979 +vt 0.429425 0.524167 +vt 0.500000 0.524167 +vt 0.500000 0.617979 +vt 0.056812 0.817748 +vt 0.072155 0.673133 +vt 0.076647 0.961816 +vt 0.358849 0.617979 +vt 0.358849 0.524167 +vt 0.179489 0.000130 +vt 0.358849 0.000129 +vt 0.358849 0.093942 +vt 0.179489 0.093942 +vt 0.000129 0.093942 +vt 0.000129 0.000130 +vt 0.433012 0.644243 +vt 0.072077 0.673139 +vt 0.679360 0.617979 +vt 0.679360 0.524167 +vt 0.858720 0.524167 +vt 0.858720 0.617979 +vt 0.433089 0.644237 +vt 0.438228 0.979473 +vt 0.679360 0.000129 +vt 0.679360 0.093942 +vt 0.500000 0.093942 +vt 0.500000 0.000129 +vt 0.679360 0.309054 +vt 0.500000 0.309054 +vt 0.858720 0.309054 +vt 0.438306 0.979467 +vt 0.179489 0.617979 +vt 0.000129 0.617979 +vt 0.000129 0.524167 +vt 0.179489 0.524167 +vt 0.179489 0.309054 +vt 0.358849 0.309054 +vt 0.000129 0.309054 +vt 0.056734 0.817754 +vt 0.429424 0.000129 +vt 0.429424 0.093942 +vt 0.429424 0.309054 +vt 0.814583 0.805956 +vt 0.929295 0.617979 +vt 0.929295 0.524167 +vt 0.999871 0.524167 +vt 0.999871 0.617979 +vt 0.929295 0.309054 +vt 0.999871 0.309054 +vt 0.302370 0.589541 +vt 0.290924 0.624718 +vt 0.253157 0.623761 +vt 0.279029 0.563145 +vt 0.360644 0.532235 +vt 0.262152 0.547850 +vt 0.350470 0.507355 +vt 0.795921 0.977776 +vt 0.772674 0.977776 +vt 0.772674 0.438969 +vt 0.795920 0.438969 +vt 0.749428 0.977776 +vt 0.749427 0.438969 +vt 0.279680 0.686275 +vt 0.361602 0.722739 +vt 0.351848 0.742823 +vt 0.266286 0.701272 +vt 0.702934 1.001023 +vt 0.702934 0.977776 +vt 0.726181 0.977776 +vt 0.726181 1.001023 +vt 0.232133 0.625977 +vt 0.726181 0.438969 +vt 0.308861 0.658196 +vt 0.348575 0.669508 +vt 0.702934 0.438969 +vt 0.340304 0.584572 +vt 0.301312 0.591414 +vt 0.277971 0.565018 +vt 0.359586 0.534108 +vt 0.252098 0.625634 +vt 0.278622 0.688148 +vt 0.265227 0.703145 +vt 0.231075 0.627851 +vt 0.629117 0.919284 +vt 0.605871 0.919284 +vt 0.605871 0.463504 +vt 0.629118 0.463504 +vt 0.582624 0.942530 +vt 0.582624 0.919284 +vt 0.605871 0.942530 +vt 0.289865 0.626592 +vt 0.307803 0.660069 +vt 0.582624 0.463504 +vt 0.347516 0.671381 +vt 0.360543 0.724612 +vt 0.675610 0.919284 +vt 0.652364 0.919284 +vt 0.652364 0.463504 +vt 0.675611 0.463504 +vt 0.350790 0.744696 +vt 0.261094 0.549723 +vt 0.341363 0.582699 +vt 0.349411 0.509228 +vt 0.304515 0.591398 +vt 0.293068 0.626575 +vt 0.255302 0.625618 +vt 0.281174 0.565002 +vt 0.362789 0.534092 +vt 0.264298 0.549707 +vt 0.352615 0.509212 +vt 0.581988 0.919284 +vt 0.558742 0.919284 +vt 0.558742 0.463504 +vt 0.581988 0.463504 +vt 0.535495 0.919284 +vt 0.535495 0.463504 +vt 0.281825 0.688132 +vt 0.363747 0.724596 +vt 0.353993 0.744680 +vt 0.268431 0.703128 +vt 0.489002 0.942530 +vt 0.489002 0.919284 +vt 0.512248 0.919284 +vt 0.512248 0.942530 +vt 0.234279 0.627834 +vt 0.512248 0.463504 +vt 0.311007 0.660053 +vt 0.350720 0.671365 +vt 0.489001 0.463504 +vt 0.342449 0.586429 +vt 0.303457 0.593271 +vt 0.280116 0.566875 +vt 0.361731 0.535965 +vt 0.343508 0.584556 +vt 0.292010 0.628448 +vt 0.309948 0.661926 +vt 0.280767 0.690005 +vt 0.254243 0.627491 +vt 0.233220 0.629707 +vt 0.263239 0.551580 +vt 0.267373 0.705002 +vt 0.747276 0.977776 +vt 0.724029 0.977776 +vt 0.724029 0.438968 +vt 0.747276 0.438968 +vt 0.793769 0.977775 +vt 0.770523 0.977775 +vt 0.770522 0.438968 +vt 0.793769 0.438968 +vt 0.349661 0.673238 +vt 0.362688 0.726469 +vt 0.351556 0.511086 +vt 0.700783 1.001022 +vt 0.700783 0.977776 +vt 0.724029 1.001022 +vt 0.352935 0.746553 +vt 0.700783 0.438968 +vt 0.841676 0.978165 +vt 0.818429 0.978165 +vt 0.818428 0.439362 +vt 0.841675 0.439362 +vt 0.795183 0.978165 +vt 0.795181 0.439362 +vt 0.888169 0.978165 +vt 0.864922 0.978165 +vt 0.864922 0.439362 +vt 0.888169 0.439362 +vt 0.303181 0.589949 +vt 0.291370 0.625521 +vt 0.253028 0.624298 +vt 0.279287 0.562801 +vt 0.795183 1.001412 +vt 0.818429 1.001412 +vt 0.231776 0.626452 +vt 0.262419 0.547816 +vt 0.341052 0.577962 +vt 0.358039 0.532908 +vt 0.309323 0.659579 +vt 0.349499 0.671319 +vt 0.362334 0.725362 +vt 0.279546 0.687843 +vt 0.348328 0.508782 +vt 0.352311 0.745651 +vt 0.265876 0.702949 +vt 0.817652 0.977771 +vt 0.794405 0.977771 +vt 0.794405 0.438968 +vt 0.817652 0.438968 +vt 0.304652 0.592029 +vt 0.292051 0.627329 +vt 0.253745 0.625251 +vt 0.281369 0.564355 +vt 0.309239 0.661779 +vt 0.349143 0.674412 +vt 0.360769 0.728728 +vt 0.278839 0.689372 +vt 0.864145 0.977771 +vt 0.840898 0.977771 +vt 0.840899 0.438968 +vt 0.864146 0.438968 +vt 0.360769 0.536226 +vt 0.264841 0.548997 +vt 0.351599 0.511889 +vt 0.232451 0.626930 +vt 0.794405 1.001018 +vt 0.817652 1.001018 +vt 0.887391 0.977771 +vt 0.887393 0.438968 +vt 0.350296 0.748788 +vt 0.264835 0.704169 +vt 0.342781 0.580890 +vt 0.278187 0.689777 +vt 0.360117 0.729134 +vt 0.349643 0.749194 +vt 0.264183 0.704574 +vt 0.342129 0.581296 +vt 0.304000 0.592435 +vt 0.280717 0.564760 +vt 0.360117 0.536632 +vt 0.701559 1.001412 +vt 0.701559 0.978165 +vt 0.724806 0.978165 +vt 0.724806 1.001412 +vt 0.253094 0.625656 +vt 0.231799 0.627336 +vt 0.291399 0.627735 +vt 0.308587 0.662184 +vt 0.348491 0.674818 +vt 0.794545 0.978165 +vt 0.771299 0.978165 +vt 0.771298 0.439362 +vt 0.794545 0.439362 +vt 0.264189 0.549403 +vt 0.350947 0.512295 +vt 0.748052 0.978165 +vt 0.724804 0.439362 +vt 0.748051 0.439362 +vt 0.701557 0.439362 +vt 0.514874 0.284099 +vt 0.514874 0.236778 +vt 0.889845 0.236780 +vt 0.889845 0.284101 +vt 0.514874 0.189457 +vt 0.889846 0.189459 +vt 0.514875 0.142136 +vt 0.889846 0.142138 +vt 0.514875 0.094814 +vt 0.889846 0.094816 +vt 0.514875 0.047493 +vt 0.889846 0.047495 +vt 0.514875 0.000172 +vt 0.889847 0.000174 +vt 0.514873 0.426062 +vt 0.514873 0.378741 +vt 0.889845 0.378743 +vt 0.889844 0.426064 +vt 0.514873 0.331420 +vt 0.889845 0.331422 +vt 0.114078 0.236781 +vt 0.114078 0.189460 +vt 0.514236 0.189457 +vt 0.514236 0.236779 +vt 0.114077 0.142139 +vt 0.514236 0.142136 +vt 0.114077 0.094817 +vt 0.514235 0.094815 +vt 0.114077 0.047496 +vt 0.514235 0.047493 +vt 0.114076 0.000175 +vt 0.514235 0.000172 +vt 0.114079 0.426065 +vt 0.114079 0.378744 +vt 0.514237 0.378743 +vt 0.514237 0.426064 +vt 0.114078 0.331423 +vt 0.514237 0.331421 +vt 0.114078 0.284102 +vt 0.514237 0.284100 +vt 0.097361 0.421943 +vt 0.097361 0.499845 +vt 0.000155 0.499845 +vt 0.000155 0.421943 +vt 0.429833 0.606542 +vt 0.613074 0.606542 +vt 0.613074 0.703748 +vt 0.429833 0.703748 +vt 0.719771 0.297078 +vt 0.719771 0.204058 +vt 0.816977 0.204058 +vt 0.816977 0.297078 +vt 0.283100 0.097361 +vt 0.204058 0.097361 +vt 0.204058 0.000155 +vt 0.283100 0.000155 +vt 0.225930 0.813806 +vt 0.225930 0.704058 +vt 0.409171 0.704058 +vt 0.409171 0.813806 +vt 0.283100 0.390097 +vt 0.283100 0.499845 +vt 0.204058 0.499845 +vt 0.204058 0.421943 +vt 0.613074 0.390097 +vt 0.613074 0.499845 +vt 0.429833 0.499845 +vt 0.429833 0.390097 +vt 0.482388 0.816277 +vt 0.625315 0.849476 +vt 0.616403 0.887845 +vt 0.444144 0.847832 +vt 0.000155 0.781960 +vt 0.000155 0.704059 +vt 0.079197 0.704058 +vt 0.079197 0.813806 +vt 0.613074 0.097361 +vt 0.429833 0.097361 +vt 0.429833 0.000155 +vt 0.613074 0.000155 +vt 0.204058 0.606542 +vt 0.283100 0.606542 +vt 0.283100 0.703748 +vt 0.204058 0.703748 +vt 0.079197 0.906825 +vt 0.225930 0.906825 +vt 0.000155 0.906825 +vt 0.429833 0.297078 +vt 0.283100 0.297078 +vt 0.613074 0.297078 +vt 0.204058 0.297078 +vt 0.409171 0.906825 +vt 0.719771 0.499845 +vt 0.719771 0.390097 +vt 0.816977 0.390097 +vt 0.816977 0.499845 +vt 0.097361 0.297078 +vt 0.000155 0.297078 +vt 0.456666 0.709586 +vt 0.409482 0.704059 +vt 0.728197 0.811267 +vt 0.755043 0.836355 +vt 0.828381 0.704058 +vt 0.875787 0.707145 +vt 0.645468 0.499845 +vt 0.645468 0.390097 +vt 0.283100 0.532238 +vt 0.429833 0.532238 +vt 0.204058 0.532238 +vt 0.429833 0.171665 +vt 0.283100 0.171665 +vt 0.613074 0.171665 +vt 0.204058 0.171665 +vt 0.645468 0.297078 +vt 0.645468 0.204058 +vt 0.613074 0.532238 +vt 0.171665 0.421943 +vt 0.171665 0.499845 +vt 0.171665 0.204058 +vt 0.171665 0.297078 +vt 0.097361 0.204058 +vt 0.000155 0.204058 +vt 0.225930 0.999845 +vt 0.409171 0.999845 +vt 0.283100 0.204058 +vt 0.204058 0.204058 +vt 0.613074 0.204058 +vt 0.429833 0.204058 +vt 0.000155 0.999845 +vt 0.079197 0.999845 +vt 0.480627 0.955811 +vt 0.409482 0.977244 +vt 0.429068 0.899817 +vt 0.480627 0.888156 +vt 0.605492 0.955811 +vt 0.605492 0.888156 +vt 0.676638 0.977244 +vt 0.657051 0.899817 +vt 0.749939 0.731268 +vt 0.749939 0.892216 +vt 0.666626 0.892217 +vt 0.666626 0.731268 +vt 0.583313 0.892217 +vt 0.583313 0.731268 +vt 0.500000 0.892217 +vt 0.500000 0.731268 +vt 0.416687 0.892217 +vt 0.416687 0.731268 +vt 0.333374 0.892217 +vt 0.333374 0.731268 +vt 0.250060 0.892217 +vt 0.250061 0.731268 +vt 0.166747 0.892216 +vt 0.166747 0.731268 +vt 0.083434 0.892216 +vt 0.083434 0.731268 +vt 0.000121 0.892216 +vt 0.000121 0.731268 +vt 0.999879 0.731268 +vt 0.999879 0.892216 +vt 0.916566 0.892216 +vt 0.916566 0.731268 +vt 0.702954 0.331547 +vt 0.661183 0.409980 +vt 0.601760 0.356091 +vt 0.625535 0.314225 +vt 0.833253 0.731268 +vt 0.833253 0.892216 +vt 0.266971 0.276261 +vt 0.293528 0.347760 +vt 0.132968 0.366869 +vt 0.130534 0.351727 +vt 0.242871 0.203304 +vt 0.127943 0.337200 +vt 0.200999 0.125121 +vt 0.123970 0.323985 +vt 0.162283 0.731025 +vt 0.088887 0.706258 +vt 0.062365 0.480152 +vt 0.076027 0.476727 +vt 0.229294 0.731025 +vt 0.090238 0.469848 +vt 0.286491 0.709654 +vt 0.103565 0.459645 +vt 0.332177 0.669602 +vt 0.115543 0.447580 +vt 0.359312 0.617072 +vt 0.124981 0.432884 +vt 0.367376 0.554690 +vt 0.130977 0.416497 +vt 0.355163 0.485621 +vt 0.133731 0.399751 +vt 0.325949 0.414860 +vt 0.133878 0.383151 +vt 0.078255 0.360181 +vt 0.079350 0.348164 +vt 0.080300 0.336237 +vt 0.081373 0.324481 +vt 0.034617 0.453711 +vt 0.041142 0.444550 +vt 0.048011 0.435246 +vt 0.054770 0.425731 +vt 0.061033 0.415881 +vt 0.066509 0.405622 +vt 0.071025 0.394912 +vt 0.074315 0.383662 +vt 0.076667 0.372064 +vt 0.032733 0.345686 +vt 0.036713 0.335467 +vt 0.039781 0.324937 +vt 0.041975 0.314014 +vt 0.000121 0.436790 +vt 0.003408 0.426920 +vt 0.006132 0.416775 +vt 0.008736 0.406539 +vt 0.011534 0.396205 +vt 0.014850 0.385870 +vt 0.018831 0.375645 +vt 0.023394 0.365579 +vt 0.028144 0.355665 +vt 0.625099 0.266521 +vt 0.559572 0.381234 +vt 0.508797 0.383287 +vt 0.466695 0.355336 +vt 0.443680 0.312332 +vt 0.444747 0.264443 +vt 0.469495 0.223800 +vt 0.511482 0.201170 +vt 0.559252 0.201629 +vt 0.600581 0.225522 +vt 0.586196 0.458392 +vt 0.497089 0.466176 +vt 0.477223 0.457200 +vt 0.407933 0.407914 +vt 0.367618 0.331453 +vt 0.369037 0.244123 +vt 0.413754 0.168468 +vt 0.490431 0.125121 +vt 0.578150 0.125121 +vt 0.654655 0.168085 +vt 0.700400 0.243153 +vt 0.642357 0.210140 +vt 0.652429 0.210140 +vt 0.643555 0.272260 +vt 0.634075 0.272260 +vt 0.703251 0.252920 +vt 0.728364 0.587496 +vt 0.643559 0.615104 +vt 0.541638 0.703851 +vt 0.350262 0.703852 +vt 0.359137 0.615107 +vt 0.539271 0.615106 +vt 0.274331 0.587499 +vt 0.299440 0.252921 +vt 0.359137 0.272261 +vt 0.634078 0.615104 +vt 0.539269 0.272261 +vt 0.652435 0.703849 +vt 0.642363 0.703849 +vt 0.733595 0.887508 +vt 0.773283 0.808098 +vt 0.852780 0.808098 +vt 0.813093 0.887508 +vt 0.350263 0.210140 +vt 0.541635 0.210140 +vt 0.548749 0.023395 +vt 0.667256 0.023395 +vt 0.323585 0.023395 +vt 0.667266 0.970639 +vt 0.548754 0.970639 +vt 0.679117 0.970639 +vt 0.019375 0.504549 +vt 0.120024 0.194650 +vt 0.323583 0.970639 +vt 0.882666 0.194648 +vt 0.983317 0.504544 +vt 0.679107 0.023395 +vt 0.773283 0.713291 +vt 0.733595 0.633485 +vt 0.813093 0.633485 +vt 0.852780 0.713291 +vn -0.922300 -0.380400 -0.068000 +vn -0.922000 -0.380400 0.071600 +vn -0.996900 -0.031700 0.071700 +vn -0.997200 -0.031700 -0.067900 +vn 0.023100 -0.098700 0.994900 +vn 0.956400 0.032200 0.290200 +vn 0.885400 0.363100 0.290300 +vn -0.019300 0.098900 0.994900 +vn 0.997200 0.031700 0.067900 +vn 0.996900 0.031700 -0.071700 +vn 0.922000 0.380400 -0.071600 +vn 0.922300 0.380400 0.068000 +vn 0.019300 -0.098900 -0.994900 +vn -0.885400 -0.363100 -0.290300 +vn -0.956400 -0.032200 -0.290200 +vn -0.023100 0.098700 -0.994900 +vn -0.209900 0.977600 -0.015300 +vn -0.209900 0.977600 0.015800 +vn 0.635000 0.770600 0.053800 +vn 0.634800 0.770600 -0.056400 +vn 0.209900 -0.977600 -0.015800 +vn 0.209900 -0.977600 0.015300 +vn -0.634800 -0.770600 0.056400 +vn -0.635000 -0.770600 -0.053800 +vn 0.895200 -0.442000 -0.056700 +vn 0.895400 -0.442000 0.053400 +vn -0.895400 0.442000 -0.053400 +vn -0.895200 0.442100 0.056700 +vn 0.955300 0.032200 -0.293900 +vn 0.884300 0.363000 -0.293800 +vn -0.884300 -0.363000 0.293800 +vn -0.955300 -0.032200 0.293900 +vn -0.981700 -0.178100 -0.068000 +vn -0.981400 -0.178100 0.071600 +vn -0.981300 0.178500 0.071700 +vn -0.981600 0.178600 -0.067900 +vn 0.001800 -0.101300 0.994900 +vn 0.941800 -0.169500 0.290200 +vn 0.941900 0.168900 0.290300 +vn 0.001900 0.100700 0.994900 +vn 0.981600 -0.178600 0.067900 +vn 0.981300 -0.178500 -0.071700 +vn 0.981400 0.178100 -0.071600 +vn 0.981700 0.178100 0.068000 +vn -0.001900 -0.100700 -0.994900 +vn -0.941900 -0.168900 -0.290300 +vn -0.941800 0.169500 -0.290200 +vn -0.001800 0.101300 -0.994900 +vn 0.000200 0.999900 -0.015300 +vn 0.000200 0.999900 0.015800 +vn 0.782800 0.620000 0.053800 +vn 0.782600 0.620000 -0.056400 +vn -0.000200 -0.999900 -0.015800 +vn -0.000200 -0.999900 0.015300 +vn -0.782600 -0.620000 0.056400 +vn -0.782800 -0.620000 -0.053800 +vn 0.782300 -0.620300 -0.056700 +vn 0.782500 -0.620300 0.053400 +vn -0.782500 0.620300 -0.053400 +vn -0.782300 0.620300 0.056700 +vn 0.940700 -0.169300 -0.293900 +vn 0.940800 0.169100 -0.293800 +vn -0.940800 -0.169100 0.293800 +vn -0.940700 0.169300 0.293900 +vn 0.000500 0.787600 0.616200 +vn 1.000000 0.000000 -0.000800 +vn 0.000800 0.000000 1.000000 +vn -0.000800 0.000000 -1.000000 +vn 0.000000 1.000000 -0.000000 +vn -1.000000 0.000000 0.000800 +vn -0.000500 0.787600 -0.616200 +vn 0.616200 0.787600 -0.000500 +vn -0.616200 0.787600 0.000500 +vn -0.694200 0.000000 -0.719800 +vn 0.719800 0.000000 -0.694200 +vn 0.694200 0.000000 0.719800 +vn -0.719800 0.000000 0.694200 +vn -0.443500 0.787600 0.427800 +vn 0.427800 0.787600 0.443500 +vn 0.443500 0.787600 -0.427800 +vn -0.427800 0.787600 -0.443500 +vn 0.712000 0.000000 -0.702200 +vn -0.438800 0.787600 0.432700 +vn 0.438800 0.787600 -0.432700 +vn -0.712000 0.000000 0.702200 +vn 0.702200 0.000000 0.712000 +vn -0.432700 0.787600 -0.438800 +vn -0.702200 0.000000 -0.712000 +vn 0.432700 0.787600 0.438800 +vn 0.682400 -0.731000 0.000000 +vn -0.584700 -0.811300 0.000000 +vn 0.997000 0.077700 -0.000000 +vn 0.269700 -0.962900 0.000000 +vn 0.560800 0.827900 -0.000000 +vn 0.921000 -0.389500 0.000000 +vn -0.660800 0.750500 -0.000000 +vn -0.146100 -0.989300 0.000000 +vn -0.998800 -0.048700 0.000000 +vn 0.907200 -0.420700 0.000000 +vn -0.236700 -0.971600 0.000000 +vn 0.894600 0.446900 -0.000000 +vn 0.612100 -0.790800 0.000000 +vn 0.208300 0.978100 -0.000000 +vn -0.612100 -0.790800 0.000000 +vn -0.894600 0.446900 0.000000 +vn 0.236700 -0.971600 0.000000 +vn -0.907200 -0.420700 0.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -0.290900 -0.824300 0.485700 +vn 0.000000 -0.551200 0.834400 +vn 0.360700 -0.857900 0.366000 +vn 0.000000 -0.743400 0.668900 +vn 0.000000 -1.000000 0.000000 +vn 0.624500 -0.781000 0.000000 +vn -0.714900 -0.699200 0.000000 +vn -0.737300 -0.675500 -0.000000 +vn 0.000000 -0.447200 -0.894400 +vn -0.291900 -0.764300 -0.575000 +vn 0.424200 -0.830700 -0.360500 +vn 0.000000 -0.639900 -0.768400 +vn 0.206800 -0.150500 0.966700 +vn 0.236800 -0.971600 0.000000 +vn 0.206800 -0.150500 -0.966700 +vn 0.258800 0.000000 -0.965900 +vn 0.707100 0.000000 -0.707100 +vn 0.965900 0.000000 -0.258800 +vn 0.965900 0.000000 0.258800 +vn 0.707100 0.000000 0.707100 +vn 0.258800 0.000000 0.965900 +vn -0.258800 0.000000 0.965900 +vn -0.707100 0.000000 0.707100 +vn -0.965900 0.000000 0.258800 +vn -0.965900 0.000000 -0.258800 +vn -0.150600 0.813200 -0.562100 +vn -0.258800 0.000000 -0.965900 +vn -0.707100 0.000000 -0.707100 +vn -0.254800 -0.176200 -0.950800 +vn -0.675700 -0.294700 -0.675700 +vn -0.818300 -0.531300 -0.219300 +vn -0.666200 -0.724100 0.178500 +vn -0.398900 -0.825700 0.398900 +vn -0.128000 -0.869100 0.477800 +vn 0.123000 -0.879900 0.459000 +vn 0.355000 -0.864800 0.355000 +vn 0.560500 -0.814400 0.150200 +vn 0.689600 -0.700200 -0.184800 +vn 0.615100 -0.493400 -0.615100 +vn 0.249600 -0.264000 -0.931600 +vn -0.257400 0.036900 -0.965600 +vn -0.701600 0.102100 -0.705200 +vn -0.956000 0.140500 -0.257500 +vn -0.956000 0.140500 0.257500 +vn -0.701600 0.102100 0.705200 +vn -0.257400 0.036900 0.965600 +vn 0.257500 -0.036300 0.965600 +vn 0.702100 -0.097600 0.705300 +vn 0.957200 -0.132000 0.257600 +vn 0.957200 -0.132000 -0.257600 +vn 0.702100 -0.097600 -0.705300 +vn 0.257500 -0.036300 -0.965600 +vn -0.263400 0.090600 -0.960400 +vn -0.676500 0.253200 -0.691500 +vn -0.905000 0.349500 -0.242400 +vn -0.896100 0.353200 0.269000 +vn -0.650500 0.260600 0.713400 +vn -0.226100 0.095400 0.969400 +vn 0.262200 -0.094300 0.960400 +vn 0.676300 -0.253800 0.691500 +vn 0.907500 -0.342800 0.242700 +vn 0.900400 -0.342200 -0.268700 +vn 0.653600 -0.252600 -0.713400 +vn 0.226300 -0.094700 -0.969400 +vn -0.411500 0.813200 -0.411500 +vn -0.562100 0.813200 -0.150600 +vn -0.562100 0.813200 0.150600 +vn -0.411500 0.813200 0.411500 +vn -0.150600 0.813200 0.562100 +vn 0.150600 0.813200 0.562100 +vn 0.411500 0.813200 0.411500 +vn 0.562100 0.813200 0.150600 +vn 0.562100 0.813200 -0.150600 +vn 0.411500 0.813200 -0.411500 +vn 0.150600 0.813200 -0.562100 +vn -0.033500 -0.116800 -0.992600 +vn -0.033500 -0.116800 0.992600 +vn -0.311100 -0.950400 0.000000 +vn 0.013300 0.026700 0.999600 +vn -0.014300 -0.116800 0.993000 +vn -0.014300 -0.116800 -0.993000 +vn -0.046400 -0.092800 -0.994600 +vn -0.447200 -0.894400 0.000000 +g Cube.006_Cube.006_CementBag +s off +f 113/1/1 127/2/1 156/3/1 128/4/1 +f 113/1/2 128/4/2 158/5/2 129/6/2 +f 113/1/3 129/6/3 157/7/3 130/8/3 +f 113/1/4 130/8/4 155/9/4 127/2/4 +f 114/10/5 154/11/5 164/12/5 131/13/5 +f 114/14/6 131/15/6 162/7/6 132/6/6 +f 114/14/7 132/6/7 161/16/7 141/17/7 +f 114/10/8 141/18/8 165/19/8 154/11/8 +f 115/20/9 132/6/9 162/7/9 134/8/9 +f 115/20/10 134/8/10 160/9/10 135/21/10 +f 115/20/11 135/21/11 159/22/11 136/23/11 +f 115/20/12 136/23/12 161/16/12 132/6/12 +f 116/24/13 152/25/13 168/26/13 137/27/13 +f 116/28/14 137/29/14 156/3/14 127/2/14 +f 116/28/15 127/2/15 155/9/15 145/30/15 +f 116/24/16 145/31/16 169/32/16 152/25/16 +f 117/33/17 138/34/17 170/35/17 150/36/17 +f 117/33/18 150/36/18 165/37/18 141/38/18 +f 117/39/19 141/17/19 161/16/19 136/23/19 +f 117/39/20 136/23/20 159/22/20 138/40/20 +f 118/41/21 137/27/21 168/26/21 148/42/21 +f 118/41/22 148/42/22 163/43/22 139/44/22 +f 118/45/23 139/17/23 158/5/23 128/4/23 +f 118/45/24 128/4/24 156/3/24 137/29/24 +f 119/46/25 143/30/25 160/9/25 134/8/25 +f 119/46/26 134/8/26 162/7/26 131/15/26 +f 119/47/22 131/13/22 164/12/22 147/48/22 +f 119/47/21 147/48/21 167/49/21 143/50/21 +f 120/51/21 144/52/21 167/49/21 147/48/21 +f 120/51/22 147/48/22 164/12/22 140/53/22 +f 120/51/22 140/53/22 163/43/22 148/42/22 +f 120/51/21 148/42/21 168/26/21 144/52/21 +f 121/54/27 145/30/27 155/9/27 130/8/27 +f 121/54/28 130/8/28 157/7/28 133/15/28 +f 121/55/18 133/56/18 166/57/18 149/58/18 +f 121/55/17 149/58/17 169/32/17 145/31/17 +f 122/59/17 146/60/17 169/32/17 149/58/17 +f 122/59/18 149/58/18 166/57/18 142/61/18 +f 122/59/18 142/61/18 165/37/18 150/36/18 +f 122/59/17 150/36/17 170/35/17 146/60/17 +f 123/62/29 135/21/29 160/9/29 143/30/29 +f 123/63/13 143/50/13 167/49/13 151/64/13 +f 123/63/16 151/64/16 170/35/16 138/34/16 +f 123/62/30 138/40/30 159/22/30 135/21/30 +f 124/65/13 151/64/13 167/49/13 144/52/13 +f 124/65/13 144/52/13 168/26/13 152/25/13 +f 124/65/16 152/25/16 169/32/16 146/60/16 +f 124/65/16 146/60/16 170/35/16 151/64/16 +f 125/66/31 129/6/31 158/5/31 139/17/31 +f 125/67/5 139/44/5 163/43/5 153/68/5 +f 125/67/8 153/68/8 166/69/8 133/70/8 +f 125/66/32 133/15/32 157/7/32 129/6/32 +f 126/71/5 153/68/5 163/43/5 140/53/5 +f 126/71/5 140/53/5 164/12/5 154/11/5 +f 126/71/8 154/11/8 165/19/8 142/72/8 +f 126/71/8 142/72/8 166/69/8 153/68/8 +f 171/1/33 185/2/33 214/3/33 186/4/33 +f 171/1/34 186/4/34 216/5/34 187/6/34 +f 171/1/35 187/6/35 215/7/35 188/8/35 +f 171/1/36 188/8/36 213/9/36 185/2/36 +f 172/10/37 212/11/37 222/12/37 189/13/37 +f 172/14/38 189/15/38 220/7/38 190/6/38 +f 172/14/39 190/6/39 219/16/39 199/17/39 +f 172/10/40 199/18/40 223/19/40 212/11/40 +f 173/20/41 190/6/41 220/7/41 192/8/41 +f 173/20/42 192/8/42 218/9/42 193/21/42 +f 173/20/43 193/21/43 217/22/43 194/23/43 +f 173/20/44 194/23/44 219/16/44 190/6/44 +f 174/24/45 210/25/45 226/26/45 195/27/45 +f 174/28/46 195/29/46 214/3/46 185/2/46 +f 174/28/47 185/2/47 213/9/47 203/30/47 +f 174/24/48 203/31/48 227/32/48 210/25/48 +f 175/33/49 196/34/49 228/35/49 208/36/49 +f 175/33/50 208/36/50 223/37/50 199/38/50 +f 175/39/51 199/17/51 219/16/51 194/23/51 +f 175/39/52 194/23/52 217/22/52 196/40/52 +f 176/41/53 195/27/53 226/26/53 206/42/53 +f 176/41/54 206/42/54 221/43/54 197/44/54 +f 176/45/55 197/17/55 216/5/55 186/4/55 +f 176/45/56 186/4/56 214/3/56 195/29/56 +f 177/46/57 201/30/57 218/9/57 192/8/57 +f 177/46/58 192/8/58 220/7/58 189/15/58 +f 177/47/54 189/13/54 222/12/54 205/48/54 +f 177/47/53 205/48/53 225/49/53 201/50/53 +f 178/51/53 202/52/53 225/49/53 205/48/53 +f 178/51/54 205/48/54 222/12/54 198/53/54 +f 178/51/54 198/53/54 221/43/54 206/42/54 +f 178/51/53 206/42/53 226/26/53 202/52/53 +f 179/54/59 203/30/59 213/9/59 188/8/59 +f 179/54/60 188/8/60 215/7/60 191/15/60 +f 179/55/50 191/56/50 224/57/50 207/58/50 +f 179/55/49 207/58/49 227/32/49 203/31/49 +f 180/59/49 204/60/49 227/32/49 207/58/49 +f 180/59/50 207/58/50 224/57/50 200/61/50 +f 180/59/50 200/61/50 223/37/50 208/36/50 +f 180/59/49 208/36/49 228/35/49 204/60/49 +f 181/62/61 193/21/61 218/9/61 201/30/61 +f 181/63/45 201/50/45 225/49/45 209/64/45 +f 181/63/48 209/64/48 228/35/48 196/34/48 +f 181/62/62 196/40/62 217/22/62 193/21/62 +f 182/65/45 209/64/45 225/49/45 202/52/45 +f 182/65/45 202/52/45 226/26/45 210/25/45 +f 182/65/48 210/25/48 227/32/48 204/60/48 +f 182/65/48 204/60/48 228/35/48 209/64/48 +f 183/66/63 187/6/63 216/5/63 197/17/63 +f 183/67/37 197/44/37 221/43/37 211/68/37 +f 183/67/40 211/68/40 224/69/40 191/70/40 +f 183/66/64 191/15/64 215/7/64 187/6/64 +f 184/71/37 211/68/37 221/43/37 198/53/37 +f 184/71/37 198/53/37 222/12/37 212/11/37 +f 184/71/40 212/11/40 223/19/40 200/72/40 +f 184/71/40 200/72/40 224/69/40 211/68/40 +g Cube.006_Cube.006_Supports +f 5/73/65 1/74/65 9/75/65 11/76/65 +f 12/77/66 11/76/66 15/78/66 16/79/66 +f 8/80/66 6/81/66 5/82/66 7/83/66 +f 6/81/67 2/84/67 1/85/67 5/82/67 +f 10/86/68 12/87/68 16/88/68 14/89/68 +f 6/90/69 8/91/69 4/92/69 2/93/69 +f 11/76/67 9/75/67 13/94/67 15/78/67 +f 2/84/70 4/92/70 3/95/70 1/85/70 +f 3/96/71 7/97/71 12/87/71 10/86/71 +f 4/92/68 8/91/68 7/98/68 3/95/68 +f 26/99/72 28/100/72 22/101/72 21/102/72 +f 24/103/70 23/104/70 19/105/70 20/106/70 +f 1/74/73 3/96/73 10/86/73 9/75/73 +f 9/75/70 10/86/70 14/89/70 13/94/70 +f 31/107/70 29/108/70 30/109/70 32/110/70 +f 27/111/69 25/112/69 29/108/69 31/113/69 +f 32/114/73 30/115/73 23/104/73 24/103/73 +f 29/108/68 25/112/68 26/116/68 30/109/68 +f 30/115/71 26/117/71 21/118/71 23/104/71 +f 25/119/66 27/120/66 28/121/66 26/122/66 +f 23/104/68 21/118/68 17/123/68 19/105/68 +f 22/101/67 24/103/67 20/106/67 18/124/67 +f 7/125/72 5/73/72 11/76/72 12/77/72 +f 28/100/65 32/114/65 24/103/65 22/101/65 +f 21/102/66 22/101/66 18/124/66 17/126/66 +f 27/120/67 31/107/67 32/110/67 28/121/67 +f 37/127/65 33/128/65 41/129/65 43/130/65 +f 44/131/66 43/130/66 47/132/66 48/133/66 +f 40/134/66 38/135/66 37/136/66 39/137/66 +f 38/135/67 34/138/67 33/139/67 37/136/67 +f 42/140/68 44/141/68 48/142/68 46/143/68 +f 38/144/69 40/145/69 36/146/69 34/147/69 +f 43/130/67 41/129/67 45/148/67 47/132/67 +f 34/138/70 36/146/70 35/149/70 33/139/70 +f 35/150/71 39/151/71 44/141/71 42/140/71 +f 36/146/68 40/145/68 39/152/68 35/149/68 +f 58/153/72 60/154/72 54/155/72 53/156/72 +f 39/157/72 37/127/72 43/130/72 44/131/72 +f 33/128/73 35/150/73 42/140/73 41/129/73 +f 41/129/70 42/140/70 46/143/70 45/148/70 +f 64/158/73 62/159/73 55/160/73 56/161/73 +f 54/155/67 56/161/67 52/162/67 50/163/67 +f 56/161/70 55/160/70 51/164/70 52/162/70 +f 63/165/70 61/166/70 62/167/70 64/168/70 +f 57/169/66 59/170/66 60/171/66 58/172/66 +f 62/159/71 58/173/71 53/174/71 55/160/71 +f 53/156/66 54/155/66 50/163/66 49/175/66 +f 59/176/69 57/177/69 61/166/69 63/178/69 +f 55/160/68 53/174/68 49/179/68 51/164/68 +f 61/166/68 57/177/68 58/180/68 62/167/68 +f 60/154/65 64/158/65 56/161/65 54/155/65 +f 59/170/67 63/165/67 64/168/67 60/171/67 +f 66/181/74 68/182/74 67/183/74 65/184/74 +f 68/182/75 72/185/75 71/186/75 67/183/75 +f 72/187/76 70/188/76 69/189/76 71/190/76 +f 70/188/77 66/181/77 65/184/77 69/189/77 +f 69/191/78 65/192/78 73/193/78 75/194/78 +f 70/195/69 72/185/69 68/182/69 66/196/69 +f 75/194/77 73/193/77 77/197/77 79/198/77 +f 71/199/79 69/191/79 75/194/79 76/200/79 +f 67/201/80 71/202/80 76/203/80 74/204/80 +f 65/192/81 67/201/81 74/204/81 73/193/81 +f 76/200/76 75/194/76 79/198/76 80/205/76 +f 74/204/75 76/203/75 80/206/75 78/207/75 +f 73/193/74 74/204/74 78/207/74 77/197/74 +f 84/208/82 88/209/82 87/210/82 83/211/82 +f 85/212/83 81/213/83 89/214/83 91/215/83 +f 83/216/84 87/217/84 92/218/84 90/219/84 +f 86/220/85 82/221/85 81/222/85 85/223/85 +f 92/224/86 91/215/86 95/225/86 96/226/86 +f 91/215/85 89/214/85 93/227/85 95/225/85 +f 86/228/69 88/209/69 84/208/69 82/229/69 +f 81/213/87 83/216/87 90/219/87 89/214/87 +f 88/230/86 86/220/86 85/223/86 87/231/86 +f 82/221/88 84/208/88 83/211/88 81/222/88 +f 90/219/82 92/218/82 96/232/82 94/233/82 +f 87/234/89 85/212/89 91/215/89 92/224/89 +f 89/214/88 90/219/88 94/233/88 93/227/88 +f 103/235/82 101/236/82 97/237/82 99/238/82 +f 106/239/89 108/240/89 102/241/89 101/242/89 +f 107/243/69 105/244/69 109/245/69 111/246/69 +f 104/247/88 103/235/88 99/238/88 100/248/88 +f 112/249/87 110/250/87 103/235/87 104/247/87 +f 110/250/84 106/251/84 101/236/84 103/235/84 +f 105/252/86 107/253/86 108/254/86 106/255/86 +f 108/240/83 112/249/83 104/247/83 102/241/83 +f 102/241/85 104/247/85 100/248/85 98/256/85 +f 101/242/86 102/241/86 98/256/86 97/257/86 +f 111/258/88 109/245/88 110/259/88 112/260/88 +f 109/245/82 105/244/82 106/261/82 110/259/82 +f 107/253/85 111/258/85 112/260/85 108/254/85 +f 293/262/90 302/263/90 312/264/90 303/265/90 +f 302/263/91 301/266/91 311/267/91 312/264/91 +f 301/266/92 300/268/92 310/269/92 311/267/92 +f 300/268/93 299/270/93 309/271/93 310/269/93 +f 299/270/94 298/272/94 308/273/94 309/271/94 +f 298/272/95 297/274/95 307/275/95 308/273/95 +f 296/276/96 295/277/96 305/278/96 306/279/96 +f 295/277/97 294/280/97 304/281/97 305/278/97 +f 294/280/98 293/262/98 303/265/98 304/281/98 +f 313/282/99 322/283/99 332/284/99 323/285/99 +f 322/283/100 321/286/100 331/287/100 332/284/100 +f 321/286/101 320/288/101 330/289/101 331/287/101 +f 320/288/102 319/290/102 329/291/102 330/289/102 +f 319/290/103 318/292/103 328/293/103 329/291/103 +f 317/294/104 316/295/104 326/296/104 327/297/104 +f 316/295/105 315/298/105 325/299/105 326/296/105 +f 315/298/106 314/300/106 324/301/106 325/299/106 +f 314/300/107 313/282/107 323/285/107 324/301/107 +g Cube.006_Cube.006_Base +f 266/302/108 258/303/108 231/304/108 246/305/108 +f 264/306/109 259/307/109 235/308/109 239/309/109 +f 276/310/110 260/311/110 233/312/110 274/313/110 +f 262/314/111 257/315/111 229/316/111 243/317/111 +f 252/318/112 239/319/112 235/320/112 248/321/112 +f 250/322/69 237/323/69 232/324/69 245/325/69 +f 247/326/69 236/327/69 238/328/69 249/329/69 +f 250/330/113 249/331/113 255/332/113 256/333/113 +f 246/334/114 231/335/114 240/336/114 251/337/114 +f 251/337/115 240/336/115 239/319/115 252/318/115 +f 260/338/111 261/339/111 244/340/111 233/341/111 +f 261/339/111 262/314/111 243/317/111 244/340/111 +f 258/342/109 263/343/109 240/344/109 231/345/109 +f 263/343/109 264/306/109 239/309/109 240/344/109 +f 271/346/116 251/337/116 252/318/116 272/347/116 +f 267/348/117 246/334/117 251/337/117 271/346/117 +f 269/349/69 249/329/69 250/322/69 270/350/69 +f 268/351/69 247/326/69 249/329/69 269/349/69 +f 270/350/69 250/322/69 245/325/69 273/352/69 +f 272/347/118 252/318/118 248/321/118 274/353/118 +f 259/354/110 265/355/110 248/356/110 235/357/110 +f 275/358/108 266/302/108 246/305/108 267/359/108 +f 237/360/119 250/330/119 256/333/119 253/361/119 +f 249/331/110 238/362/110 254/363/110 255/332/110 +f 238/362/120 237/364/120 253/365/120 254/363/120 +f 279/366/110 285/367/110 265/355/110 259/354/110 +f 283/368/109 284/369/109 264/306/109 263/343/109 +f 278/370/109 283/368/109 263/343/109 258/342/109 +f 281/371/111 282/372/111 262/314/111 261/339/111 +f 280/373/111 281/371/111 261/339/111 260/338/111 +f 282/372/111 277/374/111 257/315/111 262/314/111 +f 287/375/110 280/376/110 260/311/110 276/310/110 +f 284/369/109 279/377/109 259/307/109 264/306/109 +f 286/378/108 278/379/108 258/303/108 266/302/108 +f 285/367/110 287/375/110 276/310/110 265/355/110 +f 277/380/108 288/381/108 275/358/108 257/382/108 +f 257/382/108 275/358/108 267/359/108 229/383/108 +f 244/384/121 272/347/121 274/353/121 233/385/121 +f 242/386/69 270/350/69 273/352/69 230/387/69 +f 234/388/69 268/351/69 269/349/69 241/389/69 +f 241/389/69 269/349/69 270/350/69 242/386/69 +f 229/390/122 267/348/122 271/346/122 243/391/122 +f 243/391/123 271/346/123 272/347/123 244/384/123 +f 265/355/110 276/310/110 274/313/110 248/356/110 +f 230/387/108 273/352/108 288/381/108 277/380/108 +f 247/326/110 268/351/110 287/375/110 285/367/110 +f 245/325/108 232/324/108 278/379/108 286/378/108 +f 238/328/109 236/327/109 279/377/109 284/369/109 +f 268/351/110 234/388/110 280/376/110 287/375/110 +f 242/386/111 230/387/111 277/374/111 282/372/111 +f 234/388/111 241/389/111 281/371/111 280/373/111 +f 241/389/111 242/386/111 282/372/111 281/371/111 +f 232/324/109 237/323/109 283/368/109 278/370/109 +f 237/323/109 238/328/109 284/369/109 283/368/109 +f 236/327/110 247/326/110 285/367/110 279/366/110 +f 273/352/108 245/325/108 286/378/108 288/381/108 +f 275/392/124 288/393/124 292/394/124 290/395/124 +f 266/396/125 275/392/125 290/395/125 289/397/125 +f 286/398/126 266/396/126 289/397/126 291/399/126 +g Cube.006_Cube.006_Hopper +f 361/400/127 362/401/127 364/402/127 363/403/127 +f 363/403/128 364/402/128 366/404/128 365/405/128 +f 365/405/129 366/404/129 368/406/129 367/407/129 +f 367/407/130 368/406/130 370/408/130 369/409/130 +f 369/409/131 370/408/131 372/410/131 371/411/131 +f 371/411/132 372/410/132 374/412/132 373/413/132 +f 373/413/133 374/412/133 376/414/133 375/415/133 +f 375/415/134 376/414/134 378/416/134 377/417/134 +f 377/417/135 378/416/135 380/418/135 379/419/135 +f 379/420/136 380/421/136 382/422/136 381/423/136 +f 362/424/137 384/425/137 432/426/137 422/427/137 +f 383/428/138 384/429/138 362/401/138 361/400/138 +f 381/423/139 382/422/139 384/429/139 383/428/139 +f 383/430/140 361/431/140 385/432/140 396/433/140 +f 381/434/141 383/430/141 396/433/141 395/435/141 +f 379/436/142 381/434/142 395/435/142 394/437/142 +f 377/438/143 379/439/143 394/440/143 393/441/143 +f 375/442/144 377/438/144 393/441/144 392/443/144 +f 373/444/145 375/442/145 392/443/145 391/445/145 +f 371/446/146 373/444/146 391/445/146 390/447/146 +f 369/448/147 371/446/147 390/447/147 389/449/147 +f 367/450/148 369/448/148 389/449/148 388/451/148 +f 365/452/149 367/450/149 388/451/149 387/453/149 +f 363/454/150 365/452/150 387/453/150 386/455/150 +f 361/431/151 363/454/151 386/455/151 385/432/151 +f 396/433/152 385/432/152 397/456/152 408/457/152 +f 395/435/153 396/433/153 408/457/153 407/458/153 +f 394/437/154 395/435/154 407/458/154 406/459/154 +f 393/441/155 394/440/155 406/460/155 405/461/155 +f 392/443/156 393/441/156 405/461/156 404/462/156 +f 391/445/157 392/443/157 404/462/157 403/463/157 +f 390/447/158 391/445/158 403/463/158 402/464/158 +f 389/449/159 390/447/159 402/464/159 401/465/159 +f 388/451/160 389/449/160 401/465/160 400/466/160 +f 387/453/161 388/451/161 400/466/161 399/467/161 +f 386/455/162 387/453/162 399/467/162 398/468/162 +f 385/432/163 386/455/163 398/468/163 397/456/163 +f 408/457/164 397/456/164 409/469/164 420/470/164 +f 407/458/165 408/457/165 420/470/165 419/471/165 +f 406/459/166 407/458/166 419/471/166 418/472/166 +f 405/461/167 406/460/167 418/473/167 417/474/167 +f 404/462/168 405/461/168 417/474/168 416/475/168 +f 403/463/169 404/462/169 416/475/169 415/476/169 +f 402/464/170 403/463/170 415/476/170 414/477/170 +f 401/465/171 402/464/171 414/477/171 413/478/171 +f 400/466/172 401/465/172 413/478/172 412/479/172 +f 399/467/173 400/466/173 412/479/173 411/480/173 +f 398/468/174 399/467/174 411/480/174 410/481/174 +f 397/456/175 398/468/175 410/481/175 409/469/175 +f 421/482/69 422/427/69 432/426/69 431/483/69 430/484/69 429/485/69 428/486/69 427/487/69 426/488/69 425/489/69 424/490/69 423/491/69 +f 384/425/176 382/492/176 431/483/176 432/426/176 +f 382/492/177 380/493/177 430/484/177 431/483/177 +f 380/494/178 378/495/178 429/485/178 430/484/178 +f 378/495/179 376/496/179 428/486/179 429/485/179 +f 376/496/180 374/497/180 427/487/180 428/486/180 +f 374/497/181 372/498/181 426/488/181 427/487/181 +f 372/498/182 370/499/182 425/489/182 426/488/182 +f 370/499/183 368/500/183 424/490/183 425/489/183 +f 368/500/184 366/501/184 423/491/184 424/490/184 +f 366/501/185 364/502/185 421/482/185 423/491/185 +f 364/502/186 362/424/186 422/427/186 421/482/186 +g Cube.006_Cube.006_Crusher +f 356/503/108 350/504/108 335/505/108 343/506/108 +f 350/507/187 351/508/187 339/509/187 335/505/187 +f 354/510/110 352/511/110 337/512/110 347/513/110 +f 352/514/188 349/515/188 333/516/188 337/512/188 +f 343/506/189 335/505/189 339/509/189 348/517/189 +f 333/516/189 344/518/189 347/513/189 337/512/189 +f 344/518/189 343/506/189 348/517/189 347/513/189 +f 351/519/110 353/520/110 348/517/110 339/509/110 +f 354/521/190 347/522/190 357/523/190 360/524/190 +f 349/525/108 355/526/108 344/518/108 333/516/108 +f 355/526/108 356/503/108 343/506/108 344/518/108 +f 341/527/108 342/528/108 356/503/108 355/526/108 +f 334/529/108 341/527/108 355/526/108 349/525/108 +f 345/530/110 346/531/110 354/510/110 353/520/110 +f 340/532/110 345/530/110 353/520/110 351/519/110 +f 338/533/191 334/534/191 349/515/191 352/514/191 +f 346/531/110 338/535/110 352/511/110 354/510/110 +f 336/536/192 340/537/192 351/508/192 350/507/192 +f 342/528/108 336/538/108 350/504/108 356/503/108 +f 348/539/193 353/540/193 359/541/193 358/542/193 +f 347/522/194 348/539/194 358/542/194 357/523/194 diff --git a/mods/mylandscaping/models/mylandscaping_deco_column.obj b/mods/mylandscaping/models/mylandscaping_deco_column.obj new file mode 100644 index 00000000..9e7019a6 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_deco_column.obj @@ -0,0 +1,78 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Deco_column_Cube.027 +v -0.100000 -0.500000 0.100000 +v -0.100000 -0.100000 0.100000 +v -0.100000 -0.500000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.180000 -0.050000 0.180000 +v -0.180000 -0.050000 0.420000 +v -0.420000 -0.050000 0.420000 +v -0.420000 -0.050000 0.180000 +v -0.180000 -0.000000 0.180000 +v -0.180000 -0.000000 0.420000 +v -0.420000 -0.000000 0.420000 +v -0.420000 -0.000000 0.180000 +vt 0.850960 0.849202 +vt 0.146966 0.849202 +vt 0.303069 0.691939 +vt 0.692022 0.691939 +vt 0.848123 0.145482 +vt 0.692022 0.302744 +vt 0.144133 0.145482 +vt 0.303069 0.302744 +vt 0.691970 0.304614 +vt 0.691970 0.692257 +vt 0.304327 0.692257 +vt 0.304327 0.304614 +vt 0.490835 0.490836 +vt 0.000000 0.490836 +vt 0.000000 0.000000 +vt 0.490835 0.000000 +vt 1.000000 1.000000 +vt 0.507353 1.000000 +vt 0.507353 0.507353 +vt 1.000000 0.507353 +vt 0.014706 1.000000 +vt 0.014706 0.507353 +vt 0.981671 0.490836 +vt 0.981671 0.000000 +vt 0.255281 0.505435 +vt 0.010520 0.505435 +vt 0.010520 0.454443 +vt 0.255281 0.454443 +vt 0.744803 0.505435 +vt 0.500042 0.505435 +vt 0.500042 0.454443 +vt 0.744803 0.454443 +vt 0.989564 0.505435 +vt 0.989564 0.454443 +vn 0.000000 0.848000 0.530000 +vn -0.530000 0.848000 0.000000 +vn 0.530000 0.848000 0.000000 +vn 0.000000 0.848000 -0.530000 +vn 0.000000 1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +g Deco_column_Cube.027_Split +s off +f 8/1/1 4/2/1 10/3/1 11/4/1 +f 6/5/2 8/1/2 11/4/2 12/6/2 +f 4/2/3 2/7/3 9/8/3 10/3/3 +f 2/7/4 6/5/4 12/6/4 9/8/4 +f 16/9/5 15/10/5 14/11/5 13/12/5 +g Deco_column_Cube.027_Smooth +f 2/13/6 4/14/6 3/15/6 1/16/6 +f 4/17/7 8/18/7 7/19/7 3/20/7 +f 8/18/8 6/21/8 5/22/8 7/19/8 +f 6/23/9 2/13/9 1/16/9 5/24/9 +f 9/25/9 12/26/9 16/27/9 13/28/9 +f 11/29/7 10/30/7 14/31/7 15/32/7 +f 12/33/8 11/29/8 15/32/8 16/34/8 +f 10/30/6 9/25/6 13/28/6 14/31/6 diff --git a/mods/mylandscaping/models/mylandscaping_deco_column_l.obj b/mods/mylandscaping/models/mylandscaping_deco_column_l.obj new file mode 100644 index 00000000..6e6dba99 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_deco_column_l.obj @@ -0,0 +1,257 @@ +# Blender v2.74 (sub 5) OBJ File: 'Walls.blend' +# www.blender.org +o Deco_column.001_Cube.036 +v -0.100000 -0.500000 0.100000 +v -0.100000 -0.100000 0.100000 +v -0.100000 -0.500000 0.500000 +v -0.100000 -0.100000 0.500000 +v -0.500000 -0.500000 0.100000 +v -0.500000 -0.100000 0.100000 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.100000 0.500000 +v -0.180000 -0.050000 0.180000 +v -0.180000 -0.050000 0.420000 +v -0.420000 -0.050000 0.420000 +v -0.420000 -0.050000 0.180000 +v -0.180000 0.142211 0.180000 +v -0.180000 0.142211 0.420000 +v -0.420000 0.142211 0.420000 +v -0.420000 0.142211 0.180000 +v -0.300000 0.177296 0.300000 +v -0.396000 -0.023301 0.180000 +v -0.204000 -0.023301 0.180000 +v -0.396000 0.115512 0.180000 +v -0.204000 0.115512 0.180000 +v -0.180000 -0.023301 0.204000 +v -0.180000 -0.023301 0.396000 +v -0.180000 0.115512 0.204000 +v -0.180000 0.115512 0.396000 +v -0.420000 -0.023301 0.396000 +v -0.420000 -0.023301 0.204000 +v -0.420000 0.115512 0.396000 +v -0.420000 0.115512 0.204000 +v -0.204000 -0.023301 0.420000 +v -0.396000 -0.023301 0.420000 +v -0.204000 0.115512 0.420000 +v -0.396000 0.115512 0.420000 +v -0.202000 -0.023301 0.398000 +v -0.398000 -0.023301 0.398000 +v -0.202000 0.115512 0.398000 +v -0.398000 0.115512 0.398000 +v -0.202000 -0.023301 0.202000 +v -0.202000 0.115512 0.202000 +v -0.398000 -0.023301 0.202000 +v -0.398000 0.115512 0.202000 +v -0.350000 -0.022745 0.300000 +v -0.343741 0.067255 0.300000 +v -0.325000 -0.022745 0.256699 +v -0.321870 0.067255 0.262119 +v -0.275000 -0.022745 0.256699 +v -0.278130 0.067255 0.262119 +v -0.250000 -0.022745 0.300000 +v -0.256259 0.067255 0.300000 +v -0.275000 -0.022745 0.343301 +v -0.278130 0.067255 0.337880 +v -0.325000 -0.022745 0.343301 +v -0.321870 0.067255 0.337881 +v -0.300000 0.078956 0.300000 +v -0.275000 0.041784 0.343301 +v -0.250000 0.041784 0.300000 +v -0.275000 0.041784 0.256699 +v -0.325000 0.041784 0.256699 +v -0.350000 0.041784 0.300000 +v -0.325000 0.041784 0.343301 +vt 0.850960 0.849202 +vt 0.146966 0.849202 +vt 0.303069 0.691939 +vt 0.692022 0.691939 +vt 0.848123 0.145482 +vt 0.692022 0.302744 +vt 0.144133 0.145482 +vt 0.303069 0.302744 +vt 0.490835 0.490836 +vt 0.000000 0.490836 +vt 0.000000 0.000000 +vt 0.490835 0.000000 +vt 1.000000 1.000000 +vt 0.507353 1.000000 +vt 0.507353 0.507353 +vt 1.000000 0.507353 +vt 0.014706 1.000000 +vt 0.014706 0.507353 +vt 0.981671 0.490836 +vt 0.981671 0.000000 +vt 0.984819 0.985446 +vt 0.418207 0.985446 +vt 0.418207 0.418835 +vt 0.984819 0.418835 +vt 0.543161 0.438946 +vt 0.518385 0.468486 +vt 0.476558 0.466859 +vt 0.463363 0.430633 +vt 0.454236 0.502269 +vt 0.416265 0.495583 +vt 0.473741 0.539306 +vt 0.448965 0.568846 +vt 0.515568 0.540933 +vt 0.528762 0.577159 +vt 0.838917 0.134661 +vt 0.347723 0.022358 +vt 0.575860 0.512209 +vt 0.537890 0.505523 +vt 0.004869 0.391593 +vt 0.153209 0.873131 +vt 0.644402 0.985434 +vt 0.987256 0.616200 +vt 0.496063 0.503896 +vt 0.233973 0.522750 +vt 0.372193 0.687492 +vt 0.368946 0.693948 +vt 0.214528 0.522493 +vt 0.184253 0.999891 +vt 0.000449 0.676383 +vt 0.008346 0.682882 +vt 0.173144 0.958829 +vt 0.144940 0.516369 +vt 0.141443 0.482052 +vt 0.161372 0.483610 +vt 0.164586 0.519119 +vt 0.187873 0.000109 +vt 0.372191 0.320478 +vt 0.364662 0.314199 +vt 0.199128 0.041206 +vt 0.099516 0.912710 +vt 0.099516 0.033705 +vt 0.539018 0.473207 +vt 0.978521 0.033705 +vt 0.978521 0.912710 +vt 0.206569 0.482505 +vt 0.210661 0.519521 +vt 0.192553 0.520015 +vt 0.187802 0.482682 +vt 0.229360 0.482820 +vt 0.210258 0.479387 +vt 0.372808 0.317940 +vt 0.187838 0.965335 +vt 0.364126 0.690922 +vt 0.000109 0.679533 +vt 0.000859 0.308908 +vt 0.003823 0.300070 +vt 0.009045 0.305194 +vt 0.184448 0.034605 +vt 0.193403 0.048074 +vt 0.009536 0.286270 +vt 0.005176 0.697428 +vt 0.178944 0.951880 +vt 0.364087 0.709723 +vt 0.368036 0.299942 +vt 0.168376 0.515660 +vt 0.165203 0.487020 +vt 0.182564 0.488155 +vt 0.187599 0.514423 +vn 0.000000 0.848000 0.530000 +vn -0.530000 0.848000 0.000000 +vn 0.530000 0.848000 0.000000 +vn 0.000000 0.848000 -0.530000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 1.000000 0.000000 +vn -0.847100 0.208200 -0.489000 +vn 0.000000 0.208200 -0.978100 +vn 0.847100 0.208200 -0.489000 +vn 0.847100 0.208200 0.489000 +vn -0.866000 0.000000 -0.500000 +vn -0.847100 0.208200 0.489000 +vn 0.000000 0.208200 0.978100 +vn 0.866000 0.000000 -0.500000 +vn 0.866000 0.000000 0.500000 +vn -0.866000 0.000000 0.500000 +vn 0.000000 0.955500 -0.295100 +vn 0.000000 0.955500 0.295100 +vn -0.255600 0.955500 -0.147600 +vn 0.255600 0.955500 -0.147600 +vn -0.255600 0.955500 0.147600 +vn 0.255600 0.955500 0.147600 +vn 0.280600 0.959800 0.000000 +vn 0.000000 0.959800 -0.280600 +vn 0.000000 0.959800 0.280600 +vn -0.280600 0.959800 0.000000 +vn 0.995900 0.000000 0.090500 +vn 0.995900 0.000000 -0.090500 +vn 0.000000 -1.000000 -0.000000 +vn -0.995900 0.000000 -0.090500 +vn -0.090500 0.000000 0.995900 +vn -0.090500 0.000000 -0.995900 +vn 0.090500 0.000000 0.995900 +vn -0.995900 0.000000 0.090500 +vn 0.090500 0.000000 -0.995900 +g Deco_column.001_Cube.036_Split +s off +f 8/1/1 4/2/1 10/3/1 11/4/1 +f 6/5/2 8/1/2 11/4/2 12/6/2 +f 4/2/3 2/7/3 9/8/3 10/3/3 +f 2/7/4 6/5/4 12/6/4 9/8/4 +g Deco_column.001_Cube.036_Smooth +f 2/9/5 4/10/5 3/11/5 1/12/5 +f 4/13/6 8/14/6 7/15/6 3/16/6 +f 8/14/7 6/17/7 5/18/7 7/15/7 +f 6/19/8 2/9/8 1/12/8 5/20/8 +f 34/21/9 38/22/9 40/23/9 35/24/9 +g Deco_column.001_Cube.036_Light +f 59/25/10 43/26/10 45/27/10 58/28/10 +f 58/28/11 45/27/11 47/29/11 57/30/11 +f 57/30/12 47/29/12 49/31/12 56/32/12 +f 56/32/13 49/31/13 51/33/13 55/34/13 +f 42/35/14 59/25/14 58/28/14 44/36/14 +f 60/37/15 53/38/15 43/26/15 59/25/15 +f 55/34/16 51/33/16 53/38/16 60/37/16 +f 44/36/8 58/28/8 57/30/8 46/39/8 +f 46/39/17 57/30/17 56/32/17 48/40/17 +f 48/40/18 56/32/18 55/34/18 50/41/18 +f 52/42/19 60/37/19 59/25/19 42/35/19 +f 50/41/6 55/34/6 60/37/6 52/42/6 +f 47/29/20 45/27/20 54/43/20 +f 53/38/21 51/33/21 54/43/21 +f 45/27/22 43/26/22 54/43/22 +f 49/31/23 47/29/23 54/43/23 +f 43/26/24 53/38/24 54/43/24 +f 51/33/25 49/31/25 54/43/25 +g Deco_column.001_Cube.036_Metal +f 16/44/8 13/45/8 21/46/8 20/47/8 +f 14/48/6 15/49/6 33/50/6 32/51/6 +f 16/52/7 12/53/7 27/54/7 29/55/7 +f 10/56/5 9/57/5 22/58/5 23/59/5 +f 14/60/26 13/61/26 17/62/26 +f 13/61/27 16/63/27 17/62/27 +f 15/64/28 14/60/28 17/62/28 +f 16/63/29 15/64/29 17/62/29 +f 18/65/30 20/66/30 41/67/30 40/68/30 +f 9/57/8 12/69/8 18/70/8 19/71/8 +f 12/69/8 16/44/8 20/47/8 18/70/8 +f 13/45/8 9/57/8 19/71/8 21/46/8 +f 14/48/5 10/56/5 23/59/5 25/72/5 +f 13/45/5 14/48/5 25/72/5 24/73/5 +f 9/57/5 13/45/5 24/73/5 22/58/5 +f 15/49/7 16/52/7 29/55/7 28/74/7 +f 11/75/7 15/49/7 28/74/7 26/76/7 +f 12/53/7 11/75/7 26/76/7 27/54/7 +f 31/77/9 30/78/9 34/79/9 35/80/9 +f 10/56/6 14/48/6 32/51/6 30/78/6 +f 11/75/6 10/56/6 30/78/6 31/77/6 +f 15/49/6 11/75/6 31/77/6 33/50/6 +f 33/50/31 31/77/31 35/80/31 37/81/31 +f 32/51/32 33/50/32 37/81/32 36/82/32 +f 30/78/33 32/51/33 36/82/33 34/79/33 +f 22/58/34 24/73/34 39/83/34 38/84/34 +f 25/72/35 23/59/35 34/79/35 36/82/35 +f 29/85/36 27/86/36 40/87/36 41/88/36 +f 24/73/32 25/72/32 36/82/32 39/83/32 +f 23/59/9 22/58/9 38/84/9 34/79/9 +f 19/71/9 18/65/9 40/68/9 38/84/9 +f 21/46/37 19/71/37 38/84/37 39/83/37 +f 20/66/32 21/46/32 39/83/32 41/67/32 +f 27/86/9 26/76/9 35/80/9 40/87/9 +f 26/76/38 28/74/38 37/81/38 35/80/38 +f 28/74/32 29/85/32 41/88/32 37/81/32 diff --git a/mods/mylandscaping/models/mylandscaping_deco_wall_f.obj b/mods/mylandscaping/models/mylandscaping_deco_wall_f.obj new file mode 100644 index 00000000..8bdc620f --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_deco_wall_f.obj @@ -0,0 +1,46 @@ +# Blender v2.76 (sub 2) OBJ File: 'Deco_wall.blend' +# www.blender.org +o Deco_flat_Cube.001_Cube.038_Smooth.002 +v 0.500000 -0.100000 0.200000 +v 0.500000 -0.100000 0.400000 +v 0.500000 -0.500000 0.400000 +v 0.500000 -0.500000 0.200000 +v -0.500000 -0.100000 0.400000 +v -0.500000 -0.500000 0.400000 +v -0.500000 -0.100000 0.200000 +v -0.500000 -0.500000 0.200000 +vt 0.393551 0.439484 +vt 0.195779 0.439484 +vt 0.195779 0.043941 +vt 0.393551 0.043941 +vt 0.004166 0.493551 +vt 0.995780 0.493551 +vt 0.995780 0.890196 +vt 0.004166 0.890196 +vt 0.898239 0.666729 +vt 0.700467 0.666729 +vt 0.700467 0.271185 +vt 0.898238 0.271185 +vt 0.995779 0.493099 +vt 0.004166 0.493099 +vt 0.004166 0.096453 +vt 0.995779 0.096453 +vt 0.000045 0.200027 +vt 0.000045 0.000045 +vt 0.999955 0.000045 +vt 0.999955 0.200027 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +g Deco_flat_Cube.001_Cube.038_Smooth.002_None +s off +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 2/5/2 5/6/2 6/7/2 3/8/2 +f 5/9/3 7/10/3 8/11/3 6/12/3 +f 7/13/4 1/14/4 4/15/4 8/16/4 +g Deco_flat_Cube.001_Cube.038_Smooth.002_None_mylandscaping_block_split.png +f 6/17/5 8/18/5 4/19/5 3/20/5 +f 7/17/6 5/18/6 2/19/6 1/20/6 diff --git a/mods/mylandscaping/models/mylandscaping_deco_wall_p.obj b/mods/mylandscaping/models/mylandscaping_deco_wall_p.obj new file mode 100644 index 00000000..3d5cf0e8 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_deco_wall_p.obj @@ -0,0 +1,107 @@ +# Blender v2.76 (sub 2) OBJ File: 'Deco_wall.blend' +# www.blender.org +o Deco_peaked_Cube.001_Cube.038_Smooth.001 +v 0.500000 -0.100000 0.200000 +v 0.500000 -0.100000 0.400000 +v 0.500000 -0.500000 0.400000 +v 0.500000 -0.500000 0.200000 +v -0.500000 -0.100000 0.400000 +v -0.500000 -0.500000 0.400000 +v -0.500000 -0.100000 0.200000 +v -0.500000 -0.500000 0.200000 +v 0.333333 -0.500000 0.400000 +v 0.166667 -0.500000 0.400000 +v -0.000000 -0.500000 0.400000 +v -0.166667 -0.500000 0.400000 +v -0.333333 -0.500000 0.400000 +v 0.333333 -0.500000 0.200000 +v 0.166667 -0.500000 0.200000 +v -0.000000 -0.500000 0.200000 +v -0.166667 -0.500000 0.200000 +v -0.333333 -0.500000 0.200000 +v 0.333333 -0.000000 0.200000 +v 0.166667 -0.100000 0.200000 +v -0.000000 -0.000000 0.200000 +v -0.166667 -0.100000 0.200000 +v -0.333333 -0.000000 0.200000 +v 0.333333 -0.000000 0.400000 +v 0.166667 -0.100000 0.400000 +v -0.000000 -0.000000 0.400000 +v -0.166667 -0.100000 0.400000 +v -0.333333 -0.000000 0.400000 +vt 0.000045 0.700027 +vt 0.000045 0.500045 +vt 0.166696 0.500045 +vt 0.333348 0.500045 +vt 0.500000 0.500045 +vt 0.666652 0.500045 +vt 0.833304 0.500045 +vt 0.999955 0.500045 +vt 0.999955 0.700027 +vt 0.833304 0.700027 +vt 0.666652 0.700027 +vt 0.500000 0.700027 +vt 0.333348 0.700027 +vt 0.166697 0.700027 +vt 0.824659 0.695838 +vt 0.824659 0.892508 +vt 0.988551 0.892508 +vt 0.988551 0.695838 +vt 0.005199 0.695838 +vt 0.005199 0.892508 +vt 0.169091 0.892508 +vt 0.169091 0.695838 +vt 0.332983 0.892508 +vt 0.332983 0.695838 +vt 0.496875 0.892508 +vt 0.496875 0.695838 +vt 0.660767 0.892508 +vt 0.660767 0.695838 +vt 0.398540 0.695838 +vt 0.398540 0.892508 +vt 0.169091 0.499168 +vt 0.005199 0.400832 +vt 0.005199 0.007492 +vt 0.169091 0.007492 +vt 0.824659 0.499168 +vt 0.988551 0.400832 +vt 0.988551 0.007492 +vt 0.824659 0.007492 +vt 0.332983 0.400832 +vt 0.332983 0.007492 +vt 0.496875 0.499168 +vt 0.496875 0.007492 +vt 0.660767 0.400832 +vt 0.660767 0.007492 +vn 0.000000 -1.000000 -0.000000 +vn 0.514500 0.857500 0.000000 +vn -0.514500 0.857500 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +g Deco_peaked_Cube.001_Cube.038_Smooth.001_Top +s off +f 6/1/1 8/2/1 18/3/1 17/4/1 16/5/1 15/6/1 14/7/1 4/8/1 3/9/1 9/10/1 10/11/1 11/12/1 12/13/1 13/14/1 +g Deco_peaked_Cube.001_Cube.038_Smooth.001_Top_mylandscaping_block_smooth.png +f 19/15/2 24/16/2 2/17/2 1/18/2 +f 7/19/3 5/20/3 28/21/3 23/22/3 +f 23/22/2 28/21/2 27/23/2 22/24/2 +f 22/24/3 27/23/3 26/25/3 21/26/3 +f 21/26/2 26/25/2 25/27/2 20/28/2 +f 20/28/3 25/27/3 24/16/3 19/15/3 +g Deco_peaked_Cube.001_Cube.038_Smooth.001_Face +f 1/29/4 2/30/4 3/20/4 4/19/4 +f 28/31/5 5/32/5 6/33/5 13/34/5 +f 5/30/6 7/29/6 8/19/6 6/20/6 +f 19/35/7 1/36/7 4/37/7 14/38/7 +f 7/32/7 23/31/7 18/34/7 8/33/7 +f 23/31/7 22/39/7 17/40/7 18/34/7 +f 22/39/7 21/41/7 16/42/7 17/40/7 +f 21/41/7 20/43/7 15/44/7 16/42/7 +f 20/43/7 19/35/7 14/38/7 15/44/7 +f 2/36/5 24/35/5 9/38/5 3/37/5 +f 24/35/5 25/43/5 10/44/5 9/38/5 +f 25/43/5 26/41/5 11/42/5 10/44/5 +f 26/41/5 27/39/5 12/40/5 11/42/5 +f 27/39/5 28/31/5 13/34/5 12/40/5 diff --git a/mods/mylandscaping/models/mylandscaping_deco_wall_r.obj b/mods/mylandscaping/models/mylandscaping_deco_wall_r.obj new file mode 100644 index 00000000..05836f33 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_deco_wall_r.obj @@ -0,0 +1,147 @@ +# Blender v2.76 (sub 2) OBJ File: 'Deco_wall.blend' +# www.blender.org +o Deco_random_Cube.001_Cube.038_Smooth +v 0.500000 -0.200000 0.200000 +v 0.500000 -0.200000 0.400000 +v 0.500000 -0.500000 0.400000 +v 0.500000 -0.500000 0.200000 +v -0.500000 -0.200000 0.400000 +v -0.500000 -0.500000 0.400000 +v -0.500000 -0.200000 0.200000 +v -0.500000 -0.500000 0.200000 +v 0.333333 -0.500000 0.400000 +v 0.166667 -0.500000 0.400000 +v -0.000000 -0.500000 0.400000 +v -0.166667 -0.500000 0.400000 +v -0.333333 -0.500000 0.400000 +v 0.333333 -0.500000 0.200000 +v 0.166667 -0.500000 0.200000 +v -0.000000 -0.500000 0.200000 +v -0.166667 -0.500000 0.200000 +v -0.333333 -0.500000 0.200000 +v 0.333333 -0.200000 0.200000 +v 0.166667 -0.200000 0.200000 +v -0.000000 -0.200000 0.200000 +v -0.166667 -0.200000 0.200000 +v -0.333333 -0.200000 0.200000 +v 0.333333 -0.200000 0.400000 +v 0.166667 -0.200000 0.400000 +v -0.000000 -0.200000 0.400000 +v -0.166667 -0.200000 0.400000 +v -0.333333 -0.200000 0.400000 +v -0.166667 -0.000000 0.200000 +v -0.333333 -0.000000 0.200000 +v -0.166667 -0.000000 0.400000 +v -0.333333 -0.000000 0.400000 +v -0.000000 -0.100000 0.200000 +v -0.166667 -0.100000 0.200000 +v -0.000000 -0.100000 0.400000 +v -0.166667 -0.100000 0.400000 +v 0.333333 0.100000 0.200000 +v 0.166667 0.100000 0.200000 +v 0.333333 0.100000 0.400000 +v 0.166667 0.100000 0.400000 +v 0.500000 -0.100000 0.200000 +v 0.500000 -0.100000 0.400000 +v 0.333333 -0.100000 0.200000 +v 0.333333 -0.100000 0.400000 +vt 0.000364 0.702162 +vt 0.000364 0.901392 +vt 0.166388 0.901392 +vt 0.166388 0.702162 +vt 0.498437 0.702162 +vt 0.498437 0.901392 +vt 0.664462 0.901392 +vt 0.664462 0.702162 +vt 0.332413 0.901392 +vt 0.332413 0.702162 +vt 0.830487 0.901392 +vt 0.830487 0.702162 +vt 0.996511 0.901392 +vt 0.996511 0.702162 +vt 0.000045 0.200027 +vt 0.000045 0.000045 +vt 0.166696 0.000045 +vt 0.333348 0.000045 +vt 0.500000 0.000045 +vt 0.666652 0.000045 +vt 0.833304 0.000045 +vt 0.999955 0.000045 +vt 0.999955 0.200027 +vt 0.833304 0.200027 +vt 0.666652 0.200027 +vt 0.500000 0.200027 +vt 0.333348 0.200027 +vt 0.166697 0.200027 +vt 0.299208 0.702162 +vt 0.299208 0.901392 +vt 0.166388 0.303703 +vt 0.000364 0.303703 +vt 0.000364 0.004858 +vt 0.166388 0.004858 +vt 0.830487 0.303703 +vt 0.996511 0.303703 +vt 0.996511 0.004858 +vt 0.830487 0.004858 +vt 0.398823 0.702162 +vt 0.398823 0.901392 +vt 0.498437 0.303703 +vt 0.332413 0.303703 +vt 0.332413 0.403318 +vt 0.498437 0.403318 +vt 0.598052 0.702162 +vt 0.598052 0.901392 +vt 0.332413 0.004858 +vt 0.498437 0.004858 +vt 0.664462 0.303703 +vt 0.664462 0.004858 +vt 0.166388 0.502932 +vt 0.332413 0.502932 +vt 0.664462 0.602547 +vt 0.830487 0.602547 +vt 0.996511 0.403318 +vt 0.830487 0.403318 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +g Deco_random_Cube.001_Cube.038_Smooth_Top +s off +f 7/1/1 5/2/1 28/3/1 23/4/1 +f 21/5/1 26/6/1 25/7/1 20/8/1 +f 30/4/1 32/3/1 31/9/1 29/10/1 +f 34/10/1 36/9/1 35/6/1 33/5/1 +f 38/8/1 40/7/1 39/11/1 37/12/1 +f 43/12/1 44/11/1 42/13/1 41/14/1 +f 6/15/2 8/16/2 18/17/2 17/18/2 16/19/2 15/20/2 14/21/2 4/22/2 3/23/2 9/24/2 10/25/2 11/26/2 12/27/2 13/28/2 +g Deco_random_Cube.001_Cube.038_Smooth_Face +f 1/29/3 2/30/3 3/2/3 4/1/3 +f 28/31/4 5/32/4 6/33/4 13/34/4 +f 5/30/5 7/29/5 8/1/5 6/2/5 +f 19/35/6 1/36/6 4/37/6 14/38/6 +f 2/30/3 1/29/3 41/39/3 42/40/3 +f 23/29/5 28/30/5 32/6/5 30/5/5 +f 21/41/6 22/42/6 34/43/6 33/44/6 +f 24/30/3 19/29/3 37/45/3 39/46/3 +f 7/32/6 23/31/6 18/34/6 8/33/6 +f 23/31/6 22/42/6 17/47/6 18/34/6 +f 22/42/6 21/41/6 16/48/6 17/47/6 +f 21/41/6 20/49/6 15/50/6 16/48/6 +f 20/49/6 19/35/6 14/38/6 15/50/6 +f 2/36/4 24/35/4 9/38/4 3/37/4 +f 24/35/4 25/49/4 10/50/4 9/38/4 +f 25/49/4 26/41/4 11/48/4 10/50/4 +f 26/41/4 27/42/4 12/47/4 11/48/4 +f 27/42/4 28/31/4 13/34/4 12/47/4 +f 22/42/6 23/31/6 30/51/6 29/52/6 +f 27/30/3 22/29/3 29/5/3 31/6/3 +f 28/31/4 27/42/4 31/52/4 32/51/4 +f 26/30/3 21/29/3 33/39/3 35/40/3 +f 27/42/4 26/41/4 35/44/4 36/43/4 +f 19/35/6 20/49/6 38/53/6 37/54/6 +f 25/49/4 24/35/4 39/54/4 40/53/4 +f 20/29/5 25/30/5 40/46/5 38/45/5 +f 24/35/4 2/36/4 42/55/4 44/56/4 +f 1/36/6 19/35/6 43/56/6 41/55/6 diff --git a/mods/mylandscaping/models/mylandscaping_deco_wall_s.obj b/mods/mylandscaping/models/mylandscaping_deco_wall_s.obj new file mode 100644 index 00000000..13b10e02 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_deco_wall_s.obj @@ -0,0 +1,220 @@ +# Blender v2.76 (sub 2) OBJ File: 'Deco_wall.blend' +# www.blender.org +o Deco_scalloped_Cube.001_Cube.038_Smooth.003 +v 0.500000 -0.100000 0.200000 +v 0.500000 -0.100000 0.400000 +v 0.500000 -0.500000 0.400000 +v 0.500000 -0.500000 0.200000 +v -0.500000 -0.100000 0.400000 +v -0.500000 -0.500000 0.400000 +v -0.500000 -0.100000 0.200000 +v -0.500000 -0.500000 0.200000 +v 0.333333 -0.500000 0.400000 +v 0.166667 -0.500000 0.400000 +v -0.000000 -0.500000 0.400000 +v -0.166667 -0.500000 0.400000 +v -0.333333 -0.500000 0.400000 +v 0.333333 -0.500000 0.200000 +v 0.166667 -0.500000 0.200000 +v -0.000000 -0.500000 0.200000 +v -0.166667 -0.500000 0.200000 +v -0.333333 -0.500000 0.200000 +v 0.333333 -0.020975 0.200000 +v 0.166667 -0.100000 0.200000 +v -0.000000 -0.020975 0.200000 +v -0.166667 -0.100000 0.200000 +v -0.333333 -0.020975 0.200000 +v 0.333333 -0.020975 0.400000 +v 0.166667 -0.100000 0.400000 +v -0.000000 -0.020975 0.400000 +v -0.166667 -0.100000 0.400000 +v -0.333333 -0.020975 0.400000 +v 0.250000 -0.500000 0.400000 +v 0.250000 -0.500000 0.200000 +v 0.250000 -0.039513 0.200000 +v 0.250000 -0.039513 0.400000 +v 0.416667 -0.500000 0.400000 +v 0.416667 -0.500000 0.200000 +v 0.416667 -0.039513 0.200000 +v 0.416667 -0.039513 0.400000 +v 0.083333 -0.500000 0.400000 +v 0.083333 -0.500000 0.200000 +v 0.083333 -0.039513 0.200000 +v 0.083333 -0.039513 0.400000 +v -0.083333 -0.500000 0.400000 +v -0.083333 -0.500000 0.200000 +v -0.083333 -0.039513 0.200000 +v -0.083333 -0.039513 0.400000 +v -0.250000 -0.500000 0.400000 +v -0.250000 -0.500000 0.200000 +v -0.250000 -0.039513 0.200000 +v -0.250000 -0.039513 0.400000 +v -0.416667 -0.500000 0.400000 +v -0.416667 -0.500000 0.200000 +v -0.416667 -0.039513 0.200000 +v -0.416667 -0.039513 0.400000 +vt 0.906605 0.695838 +vt 0.899302 0.514410 +vt 0.992711 0.510650 +vt 1.000015 0.692078 +vt 0.087145 0.695838 +vt 0.094448 0.514410 +vt 0.171891 0.517527 +vt 0.169523 0.697945 +vt 0.251037 0.695838 +vt 0.247680 0.520307 +vt 0.335268 0.522047 +vt 0.333462 0.692773 +vt 0.414929 0.695838 +vt 0.422327 0.523193 +vt 0.496875 0.523348 +vt 0.496875 0.698842 +vt 0.578821 0.695838 +vt 0.571423 0.523193 +vt 0.658482 0.522047 +vt 0.660288 0.692773 +vt 0.742713 0.695838 +vt 0.746070 0.520307 +vt 0.821859 0.517527 +vt 0.824227 0.697945 +vt 0.916629 0.700027 +vt 0.916629 0.500045 +vt 0.999955 0.500045 +vt 0.999955 0.700027 +vt 0.583326 0.700027 +vt 0.583326 0.500045 +vt 0.666652 0.500045 +vt 0.749978 0.500045 +vt 0.749978 0.700027 +vt 0.666652 0.700027 +vt 0.833304 0.500045 +vt 0.833304 0.700027 +vt 0.416674 0.700027 +vt 0.416674 0.500045 +vt 0.500000 0.500045 +vt 0.500000 0.700027 +vt 0.250022 0.700027 +vt 0.250022 0.500045 +vt 0.333348 0.500045 +vt 0.333348 0.700027 +vt 0.083371 0.700027 +vt 0.083371 0.500045 +vt 0.166696 0.500045 +vt 0.166696 0.700027 +vt 0.000045 0.700027 +vt 0.000045 0.500045 +vt -0.006265 0.692078 +vt 0.001039 0.510650 +vt 0.398540 0.695838 +vt 0.398540 0.892508 +vt 0.005199 0.892508 +vt 0.005199 0.695838 +vt 0.087145 0.460312 +vt 0.005199 0.400832 +vt 0.005199 0.007492 +vt 0.087145 0.007492 +vt 0.906605 0.450000 +vt 0.988551 0.509480 +vt 0.988551 0.902821 +vt 0.906605 0.902821 +vt 0.087145 0.450000 +vt 0.169091 0.431771 +vt 0.169091 0.902821 +vt 0.087145 0.902821 +vt 0.251037 0.450000 +vt 0.332983 0.509480 +vt 0.332983 0.902821 +vt 0.251037 0.902821 +vt 0.414929 0.450000 +vt 0.496875 0.431771 +vt 0.496875 0.902821 +vt 0.414929 0.902821 +vt 0.578821 0.450000 +vt 0.660767 0.509480 +vt 0.660767 0.902821 +vt 0.578821 0.902821 +vt 0.742713 0.450000 +vt 0.824659 0.431771 +vt 0.824659 0.902821 +vt 0.742713 0.902821 +vt 0.906605 0.460312 +vt 0.824659 0.478541 +vt 0.824659 0.007492 +vt 0.906605 0.007492 +vt 0.742713 0.460312 +vt 0.660767 0.400832 +vt 0.660767 0.007492 +vt 0.742713 0.007492 +vt 0.578821 0.460312 +vt 0.496875 0.478541 +vt 0.496875 0.007492 +vt 0.578821 0.007492 +vt 0.414929 0.460312 +vt 0.332983 0.400832 +vt 0.332983 0.007492 +vt 0.414929 0.007492 +vt 0.251037 0.460312 +vt 0.169091 0.478541 +vt 0.169091 0.007492 +vt 0.251037 0.007492 +vt 0.988551 0.400832 +vt 0.988551 0.007492 +vt 0.005199 0.509480 +vt 0.005199 0.902821 +vn 0.587400 0.809300 0.000000 +vn -0.217100 0.976100 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.587400 0.809300 0.000000 +vn 0.217100 0.976100 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +g Deco_scalloped_Cube.001_Cube.038_Smooth.003_Top +s off +f 35/1/1 36/2/1 2/3/1 1/4/1 +f 51/5/2 52/6/2 28/7/2 23/8/2 +f 47/9/1 48/10/1 27/11/1 22/12/1 +f 43/13/2 44/14/2 26/15/2 21/16/2 +f 39/17/1 40/18/1 25/19/1 20/20/1 +f 31/21/2 32/22/2 24/23/2 19/24/2 +f 33/25/3 34/26/3 4/27/3 3/28/3 +f 37/29/3 38/30/3 15/31/3 30/32/3 29/33/3 10/34/3 +f 20/20/4 25/19/4 32/22/4 31/21/4 +f 29/33/3 30/32/3 14/35/3 34/26/3 33/25/3 9/36/3 +f 19/24/5 24/23/5 36/2/5 35/1/5 +f 41/37/3 42/38/3 16/39/3 38/30/3 37/29/3 11/40/3 +f 21/16/5 26/15/5 40/18/5 39/17/5 +f 45/41/3 46/42/3 17/43/3 42/38/3 41/37/3 12/44/3 +f 22/12/4 27/11/4 44/14/4 43/13/4 +f 49/45/3 50/46/3 18/47/3 46/42/3 45/41/3 13/48/3 +f 23/8/5 28/7/5 48/10/5 47/9/5 +f 6/49/3 8/50/3 50/46/3 49/45/3 +f 7/51/4 5/52/4 52/6/4 51/5/4 +g Deco_scalloped_Cube.001_Cube.038_Smooth.003_Face +f 1/53/6 2/54/6 3/55/6 4/56/6 +f 52/57/7 5/58/7 6/59/7 49/60/7 +f 5/54/8 7/53/8 8/56/8 6/55/8 +f 35/61/9 1/62/9 4/63/9 34/64/9 +f 51/65/9 23/66/9 18/67/9 50/68/9 +f 47/69/9 22/70/9 17/71/9 46/72/9 +f 43/73/9 21/74/9 16/75/9 42/76/9 +f 39/77/9 20/78/9 15/79/9 38/80/9 +f 31/81/9 19/82/9 14/83/9 30/84/9 +f 36/85/7 24/86/7 9/87/7 33/88/7 +f 32/89/7 25/90/7 10/91/7 29/92/7 +f 40/93/7 26/94/7 11/95/7 37/96/7 +f 44/97/7 27/98/7 12/99/7 41/100/7 +f 48/101/7 28/102/7 13/103/7 45/104/7 +f 24/86/7 32/89/7 29/92/7 9/87/7 +f 20/78/9 31/81/9 30/84/9 15/79/9 +f 2/105/7 36/85/7 33/88/7 3/106/7 +f 19/82/9 35/61/9 34/64/9 14/83/9 +f 25/90/7 40/93/7 37/96/7 10/91/7 +f 21/74/9 39/77/9 38/80/9 16/75/9 +f 26/94/7 44/97/7 41/100/7 11/95/7 +f 22/70/9 43/73/9 42/76/9 17/71/9 +f 27/98/7 48/101/7 45/104/7 12/99/7 +f 23/66/9 47/69/9 46/72/9 18/67/9 +f 7/107/9 51/65/9 50/68/9 8/108/9 +f 28/102/7 52/57/7 49/60/7 13/103/7 diff --git a/mods/mylandscaping/models/mylandscaping_machine.obj b/mods/mylandscaping/models/mylandscaping_machine.obj new file mode 100644 index 00000000..e50a8e20 --- /dev/null +++ b/mods/mylandscaping/models/mylandscaping_machine.obj @@ -0,0 +1,1462 @@ +# Blender v2.74 (sub 0) OBJ File: 'Machine.blend' +# www.blender.org +o Cement_Mixer_Cylinder.002 +v -1.011610 -0.200277 0.003856 +v -0.552339 -0.205112 -0.289659 +v -0.647205 -0.207789 -0.408958 +v -1.106475 -0.202954 -0.115443 +v -0.665016 -0.148675 -0.390149 +v -0.993798 -0.259391 -0.014953 +v -0.664719 -0.266175 -0.387749 +v -0.829259 -0.262783 -0.201351 +v -0.994096 -0.141891 -0.017353 +v -0.829556 -0.145283 -0.203751 +v -0.777396 -0.209738 -0.488239 +v -0.941936 -0.206346 -0.301841 +v -0.881419 -0.198328 0.083137 +v -0.716879 -0.201720 -0.103261 +v -1.091590 -0.202103 -0.075614 +v -1.007082 -0.244431 -0.000246 +v -0.922798 -0.198633 0.073322 +v -1.007306 -0.156305 -0.002046 +v -0.556499 -0.261704 -0.292301 +v -0.567225 -0.205963 -0.329488 +v -0.885864 -0.141913 0.078186 +v -0.651509 -0.251761 -0.403056 +v -0.736017 -0.209433 -0.478424 +v -0.651732 -0.163635 -0.404856 +v -1.102030 -0.259370 -0.110493 +v -0.773237 -0.153146 -0.485597 +v -0.885578 -0.254920 0.080495 +v -0.721039 -0.258312 -0.105903 +v -0.556785 -0.148696 -0.294610 +v -0.721325 -0.145304 -0.108212 +v -0.772951 -0.266153 -0.483289 +v -0.937490 -0.262762 -0.296891 +v -1.102316 -0.146362 -0.112801 +v -0.937776 -0.149754 -0.299199 +v -0.714685 -0.265145 -0.331145 +v -0.943832 -0.260421 -0.071557 +v -0.944129 -0.142921 -0.073958 +v -0.714983 -0.147645 -0.333545 +v -0.827362 -0.208708 -0.431635 +v -1.056509 -0.203984 -0.172048 +v -0.831452 -0.199358 0.026533 +v -0.602306 -0.204082 -0.233055 +v -1.066358 -0.169085 -0.060865 +v -1.066193 -0.234363 -0.059531 +v -0.941326 -0.166515 0.049458 +v -0.941161 -0.231793 0.050791 +v -0.717654 -0.176273 -0.455894 +v -0.717488 -0.241551 -0.454560 +v -0.592622 -0.173703 -0.345571 +v -0.592457 -0.238981 -0.344237 +v -0.835612 -0.255950 0.023891 +v -0.606465 -0.260674 -0.235697 +v -0.606751 -0.147666 -0.238005 +v -0.835898 -0.142943 0.021582 +v -0.822917 -0.265123 -0.426685 +v -1.052063 -0.260400 -0.167097 +v -1.052349 -0.147392 -0.169405 +v -0.823203 -0.152116 -0.428993 +v -0.993894 -0.324031 0.018265 +v -0.560587 -0.329693 -0.312365 +v -0.664921 -0.324031 -0.423367 +v -1.098228 -0.318369 -0.092737 +v -0.679088 -0.265310 -0.400637 +v -0.979726 -0.382752 -0.004465 +v -0.682644 -0.382752 -0.403286 +v -0.831185 -0.382752 -0.203875 +v -0.976171 -0.265310 -0.001817 +v -0.827630 -0.265310 -0.201227 +v -0.801145 -0.318369 -0.491558 +v -0.949686 -0.318369 -0.292147 +v -0.857670 -0.329693 0.086455 +v -0.709128 -0.329693 -0.112955 +v -1.080117 -0.319785 -0.054283 +v -0.991241 -0.368072 0.011921 +v -0.899699 -0.328277 0.080111 +v -0.988575 -0.279990 0.013907 +v -0.566896 -0.385952 -0.317064 +v -0.578698 -0.328277 -0.350819 +v -0.860559 -0.273001 0.084303 +v -0.670240 -0.368072 -0.419009 +v -0.759116 -0.319785 -0.485213 +v -0.667574 -0.279990 -0.417023 +v -1.095339 -0.375061 -0.090585 +v -0.794836 -0.262110 -0.486858 +v -0.863978 -0.385952 0.081756 +v -0.715437 -0.385952 -0.117654 +v -0.563476 -0.273001 -0.314517 +v -0.712018 -0.273001 -0.115107 +v -0.798256 -0.375061 -0.489405 +v -0.946797 -0.375061 -0.289995 +v -1.091919 -0.262110 -0.088038 +v -0.943378 -0.262110 -0.287448 +v -0.727752 -0.382752 -0.342730 +v -0.934618 -0.382752 -0.065021 +v -0.931063 -0.265310 -0.062372 +v -0.724196 -0.265310 -0.340082 +v -0.846253 -0.318369 -0.431002 +v -1.053120 -0.318369 -0.153293 +v -0.812562 -0.329693 0.025900 +v -0.605695 -0.329693 -0.251810 +v -1.052641 -0.288263 -0.040289 +v -1.054617 -0.353508 -0.041760 +v -0.918998 -0.294554 0.059263 +v -0.920973 -0.359799 0.057791 +v -0.737841 -0.288263 -0.462894 +v -0.739817 -0.353508 -0.464365 +v -0.604198 -0.294554 -0.363342 +v -0.606173 -0.359799 -0.364814 +v -0.818870 -0.385952 0.021200 +v -0.612004 -0.385952 -0.256509 +v -0.608584 -0.273001 -0.253962 +v -0.815451 -0.273001 0.023748 +v -0.843364 -0.375061 -0.428850 +v -1.050231 -0.375061 -0.151140 +v -1.046811 -0.262110 -0.148593 +v -0.839944 -0.262110 -0.426303 +v -0.954871 -0.496786 0.440862 +v -1.018228 -0.496786 -0.006734 +v -1.463057 -0.496786 0.439488 +v -1.461684 -0.496786 -0.068698 +v -1.208997 -0.481593 0.442520 +v -0.950981 -0.469930 0.186801 +v -1.207558 -0.473997 -0.073499 +v -1.470682 -0.474688 0.185363 +v -1.208277 -0.250916 0.186082 +v -1.063801 -0.474227 0.441581 +v -0.969046 -0.475412 0.035097 +v -1.352754 -0.470544 -0.073891 +v -1.469799 -0.481593 0.330559 +v -1.354193 -0.481593 0.451882 +v -0.969947 -0.474227 0.331997 +v -1.091501 -0.475412 -0.074777 +v -1.470064 -0.470544 0.040166 +v -1.353473 -0.347184 0.185690 +v -1.063081 -0.331038 0.186474 +v -1.208670 -0.370664 0.331278 +v -1.207885 -0.340476 0.040886 +v -1.062689 -0.395428 0.041278 +v -1.063474 -0.397572 0.331670 +v -1.353866 -0.423239 0.330886 +v -1.353081 -0.384393 0.040493 +v -0.944098 -0.499938 0.451693 +v -1.007396 -0.499938 -0.017507 +v -1.473889 -0.499938 0.450261 +v -1.472457 -0.499938 -0.079529 +v -1.209027 -0.499938 0.463591 +v -0.930768 -0.499938 0.186832 +v -1.207527 -0.499938 -0.091427 +v -1.485787 -0.499938 0.185332 +v -1.057659 -0.499938 0.464000 +v -0.947607 -0.499938 0.028955 +v -1.358896 -0.499938 -0.091837 +v -1.486196 -0.499938 0.336701 +v -1.360396 -0.499938 0.463182 +v -0.959078 -0.499938 0.338201 +v -1.085297 -0.499938 -0.091018 +v -1.485378 -0.499938 0.033963 +v -1.012233 -0.437820 0.003777 +v -0.556950 -0.437820 -0.295923 +v -0.653411 -0.437820 -0.413967 +v -1.108695 -0.437820 -0.114266 +v -0.670803 -0.379057 -0.393718 +v -0.994841 -0.496582 -0.016471 +v -0.670803 -0.496582 -0.393718 +v -0.832822 -0.496582 -0.205095 +v -0.994841 -0.379057 -0.016471 +v -0.832822 -0.379057 -0.205095 +v -0.784657 -0.437820 -0.491514 +v -0.946676 -0.437820 -0.302890 +v -0.880987 -0.437820 0.081324 +v -0.718969 -0.437820 -0.107300 +v -1.093276 -0.437820 -0.074632 +v -1.007885 -0.481892 -0.001285 +v -0.922495 -0.437820 0.072061 +v -1.007885 -0.393748 -0.001285 +v -0.561303 -0.494336 -0.299663 +v -0.572369 -0.437820 -0.335558 +v -0.885341 -0.381304 0.077585 +v -0.657759 -0.481892 -0.408905 +v -0.743149 -0.437820 -0.482251 +v -0.657759 -0.393748 -0.408905 +v -1.104342 -0.494335 -0.110527 +v -0.780304 -0.381304 -0.487774 +v -0.885341 -0.494336 0.077585 +v -0.723322 -0.494336 -0.111039 +v -0.561303 -0.381304 -0.299663 +v -0.723322 -0.381304 -0.111039 +v -0.780304 -0.494335 -0.487774 +v -0.942323 -0.494335 -0.299151 +v -1.104342 -0.381304 -0.110527 +v -0.942323 -0.381304 -0.299151 +v -0.720004 -0.496582 -0.336439 +v -0.945640 -0.496582 -0.073751 +v -0.945640 -0.379057 -0.073751 +v -0.720004 -0.379057 -0.336438 +v -0.833858 -0.437820 -0.434234 +v -1.059494 -0.437820 -0.171546 +v -0.831787 -0.437820 0.024044 +v -0.606150 -0.437820 -0.238643 +v -1.067755 -0.405174 -0.059553 +v -1.067755 -0.470466 -0.059553 +v -0.941251 -0.405174 0.049108 +v -0.941251 -0.470466 0.049108 +v -0.724393 -0.405174 -0.459298 +v -0.724393 -0.470466 -0.459298 +v -0.597889 -0.405174 -0.350637 +v -0.597889 -0.470466 -0.350637 +v -0.836140 -0.494336 0.020305 +v -0.610504 -0.494336 -0.242383 +v -0.610503 -0.381304 -0.242383 +v -0.836140 -0.381304 0.020305 +v -0.829504 -0.494335 -0.430494 +v -1.055141 -0.494335 -0.167807 +v -1.055141 -0.381304 -0.167807 +v -0.829504 -0.381304 -0.430494 +v -0.846375 -0.497938 0.168502 +v -0.852050 -0.127725 0.150959 +v -0.747979 -0.497938 0.168629 +v -0.742259 -0.127725 0.151101 +v -0.668449 -0.497938 0.226567 +v -0.653519 -0.127725 0.215749 +v -0.638163 -0.497938 0.320187 +v -0.619726 -0.127725 0.320211 +v -0.668690 -0.497938 0.413728 +v -0.653788 -0.127725 0.424585 +v -0.748369 -0.497938 0.471462 +v -0.742694 -0.127725 0.489004 +v -0.846765 -0.497938 0.471335 +v -0.852486 -0.127725 0.488863 +v -0.926295 -0.497938 0.413396 +v -0.941226 -0.127725 0.424215 +v -0.956581 -0.497938 0.319777 +v -0.975019 -0.127725 0.319753 +v -0.926054 -0.497938 0.226235 +v -0.940957 -0.127725 0.215379 +v -0.852050 -0.216071 0.150959 +v -0.742259 -0.216071 0.151101 +v -0.653519 -0.216071 0.215749 +v -0.619726 -0.216071 0.320211 +v -0.653788 -0.216071 0.424585 +v -0.742694 -0.216071 0.489004 +v -0.852486 -0.216071 0.488863 +v -0.941225 -0.216071 0.424215 +v -0.975019 -0.216071 0.319753 +v -0.940957 -0.216071 0.215379 +v -0.847304 -0.127725 0.165632 +v -0.747043 -0.127725 0.165762 +v -0.666007 -0.127725 0.224798 +v -0.635147 -0.127725 0.320191 +v -0.666252 -0.127725 0.415504 +v -0.747441 -0.127725 0.474331 +v -0.847701 -0.127725 0.474202 +v -0.928738 -0.127725 0.415166 +v -0.959597 -0.127725 0.319773 +v -0.928492 -0.127725 0.224459 +v -0.847304 -0.308611 0.165632 +v -0.747043 -0.308611 0.165762 +v -0.666007 -0.308611 0.224798 +v -0.635147 -0.308611 0.320191 +v -0.666252 -0.308611 0.415504 +v -0.747441 -0.308611 0.474331 +v -0.847701 -0.308611 0.474202 +v -0.928738 -0.308611 0.415166 +v -0.959597 -0.308611 0.319773 +v -0.928492 -0.308611 0.224459 +v 0.162486 -0.339504 0.330381 +v 0.162486 -0.339504 0.411288 +v 0.193390 -0.244392 0.330381 +v 0.193390 -0.244392 0.411288 +v 0.274297 -0.185610 0.330381 +v 0.274297 -0.185610 0.411288 +v 0.374304 -0.185610 0.330381 +v 0.374304 -0.185610 0.411288 +v 0.455211 -0.244392 0.330381 +v 0.455211 -0.244392 0.411288 +v 0.486115 -0.339504 0.330381 +v 0.486115 -0.339504 0.411288 +v 0.455211 -0.434616 0.330381 +v 0.455211 -0.434616 0.411288 +v 0.374304 -0.493399 0.330381 +v 0.374304 -0.493399 0.411288 +v 0.274297 -0.493399 0.330381 +v 0.274297 -0.493399 0.411288 +v 0.193390 -0.434616 0.330381 +v 0.193390 -0.434616 0.411288 +v 0.162486 -0.339504 -0.312056 +v 0.162486 -0.339504 -0.231149 +v 0.193390 -0.244392 -0.312056 +v 0.193390 -0.244392 -0.231149 +v 0.274297 -0.185610 -0.312056 +v 0.274297 -0.185610 -0.231149 +v 0.374304 -0.185610 -0.312056 +v 0.374304 -0.185610 -0.231149 +v 0.455211 -0.244392 -0.312056 +v 0.455211 -0.244392 -0.231149 +v 0.486115 -0.339504 -0.312056 +v 0.486115 -0.339504 -0.231149 +v 0.455211 -0.434616 -0.312056 +v 0.455211 -0.434616 -0.231149 +v 0.374304 -0.493399 -0.312056 +v 0.374304 -0.493399 -0.231149 +v 0.274297 -0.493399 -0.312056 +v 0.274297 -0.493399 -0.231149 +v 0.193390 -0.434616 -0.312056 +v 0.193390 -0.434616 -0.231149 +v 0.377534 -0.305602 0.321107 +v 0.359739 0.447395 0.232132 +v 0.269658 -0.305602 0.321107 +v 0.287453 0.447395 0.232132 +v 0.377534 -0.305602 -0.218273 +v 0.359739 0.447395 -0.129299 +v 0.269658 -0.305602 -0.218273 +v 0.287453 0.447395 -0.129299 +v 0.377534 0.291804 0.321107 +v 0.269658 0.291804 0.321107 +v 0.269658 0.291804 -0.218273 +v 0.377534 0.291804 -0.218273 +v 0.269658 -0.388430 0.321107 +v 0.377534 -0.388430 0.321107 +v 0.269658 -0.388429 -0.218273 +v 0.377534 -0.388429 -0.218273 +v -0.584373 -0.305602 -0.102152 +v -0.584373 -0.305602 0.204985 +v -0.584373 -0.494668 -0.102152 +v -0.584373 -0.494668 0.204985 +v -0.451635 -0.388429 0.135400 +v 0.136920 -0.388430 0.135400 +v 0.136920 -0.305602 0.135400 +v -0.451636 -0.305602 0.135400 +v -0.451635 -0.305602 -0.032567 +v 0.136920 -0.305602 -0.032567 +v 0.136920 -0.388430 -0.032567 +v -0.451636 -0.388429 -0.032567 +v -0.661081 -0.305602 -0.102152 +v -0.661081 -0.305602 0.204985 +v -0.661081 -0.494668 -0.102152 +v -0.661081 -0.494668 0.204985 +v -0.584373 0.434734 -0.102152 +v -0.584373 0.434734 0.204985 +v -0.661081 0.434734 -0.102152 +v -0.661081 0.434734 0.204985 +v -0.584373 0.099159 -0.102152 +v -0.661081 0.099159 -0.102152 +v -0.661081 0.099159 0.204985 +v -0.584373 0.099159 0.204985 +v -0.930772 0.434734 -0.102152 +v -0.930772 0.434734 0.204985 +v -0.930772 0.099159 -0.102152 +v -0.930772 0.099159 0.204985 +v -0.438062 -0.014753 0.333651 +v -0.438062 0.441067 -0.334799 +v -0.383980 -0.152269 0.239878 +v -0.383980 0.303550 -0.428572 +v -0.242393 -0.237259 0.181923 +v -0.242392 0.218560 -0.486527 +v -0.067381 -0.237260 0.181923 +v -0.067381 0.218560 -0.486527 +v 0.074207 -0.152269 0.239878 +v 0.074207 0.303550 -0.428572 +v 0.128288 -0.014753 0.333651 +v 0.128288 0.441066 -0.334799 +v 0.074207 0.122764 0.427425 +v 0.074207 0.578583 -0.241026 +v -0.067381 0.207754 0.485380 +v -0.067381 0.663573 -0.183071 +v -0.242392 0.207754 0.485380 +v -0.242392 0.663573 -0.183071 +v -0.383980 0.122764 0.427425 +v -0.383980 0.578583 -0.241026 +v -0.559422 0.086216 0.185583 +v -0.559422 0.248934 -0.053040 +v -0.482163 0.052481 -0.187002 +v -0.482163 -0.110237 0.051621 +v -0.279895 -0.068933 -0.269795 +v -0.279895 -0.231651 -0.031172 +v -0.029878 -0.068933 -0.269795 +v -0.029878 -0.231651 -0.031172 +v 0.172390 0.052481 -0.187002 +v 0.172390 -0.110237 0.051621 +v 0.249649 0.248934 -0.053040 +v 0.249649 0.086216 0.185583 +v 0.172390 0.445387 0.080922 +v 0.172390 0.282669 0.319544 +v -0.029878 0.566801 0.163715 +v -0.029878 0.404083 0.402337 +v -0.279895 0.566801 0.163715 +v -0.279895 0.404083 0.402337 +v -0.482163 0.445386 0.080922 +v -0.482163 0.282669 0.319544 +v -0.416791 0.441067 -0.334799 +v -0.366771 0.313879 -0.421528 +v -0.235819 0.235273 -0.475130 +v -0.073954 0.235273 -0.475130 +v 0.056998 0.313879 -0.421528 +v 0.107017 0.441066 -0.334799 +v 0.056998 0.568253 -0.248069 +v -0.073954 0.646859 -0.194468 +v -0.235819 0.646859 -0.194468 +v -0.366771 0.568254 -0.248070 +v -0.450304 0.395485 -0.267954 +v -0.393885 0.252022 -0.365782 +v -0.246176 0.163358 -0.426242 +v -0.063597 0.163358 -0.426242 +v 0.084112 0.252022 -0.365782 +v 0.140531 0.395485 -0.267954 +v 0.084111 0.538947 -0.170126 +v -0.063597 0.627611 -0.109666 +v -0.246176 0.627611 -0.109666 +v -0.393885 0.538947 -0.170126 +vt 0.379436 0.564369 +vt 0.379436 0.552382 +vt 0.394254 0.552382 +vt 0.394254 0.564369 +vt 0.409071 0.552382 +vt 0.409071 0.564369 +vt 0.423889 0.552382 +vt 0.423889 0.564369 +vt 0.438707 0.552382 +vt 0.438707 0.564369 +vt 0.290530 0.564369 +vt 0.290529 0.552382 +vt 0.305347 0.552382 +vt 0.305347 0.564369 +vt 0.320165 0.552382 +vt 0.320165 0.564369 +vt 0.334983 0.552382 +vt 0.334983 0.564369 +vt 0.349800 0.552382 +vt 0.349800 0.564369 +vt 0.404419 0.136425 +vt 0.377658 0.125185 +vt 0.362615 0.100361 +vt 0.365036 0.071437 +vt 0.383996 0.049460 +vt 0.412253 0.042824 +vt 0.439014 0.054064 +vt 0.454056 0.078888 +vt 0.451635 0.107812 +vt 0.432676 0.129790 +vt 0.364618 0.564369 +vt 0.364618 0.552382 +vt 0.439860 0.058890 +vt 0.453541 0.084489 +vt 0.449563 0.113240 +vt 0.429445 0.134163 +vt 0.400872 0.139264 +vt 0.374756 0.126596 +vt 0.361075 0.100998 +vt 0.365053 0.072246 +vt 0.385171 0.051323 +vt 0.413744 0.046222 +vt 0.379436 0.552208 +vt 0.379436 0.540220 +vt 0.394254 0.540220 +vt 0.394254 0.552208 +vt 0.409071 0.540220 +vt 0.409071 0.552208 +vt 0.423889 0.540220 +vt 0.423889 0.552208 +vt 0.438707 0.540220 +vt 0.438707 0.552208 +vt 0.290530 0.552208 +vt 0.290529 0.540220 +vt 0.305347 0.540220 +vt 0.305347 0.552208 +vt 0.320165 0.540220 +vt 0.320165 0.552208 +vt 0.334983 0.540220 +vt 0.334983 0.552208 +vt 0.349800 0.540220 +vt 0.349800 0.552208 +vt 0.414386 0.043900 +vt 0.440501 0.056568 +vt 0.454183 0.082167 +vt 0.450205 0.110918 +vt 0.430087 0.131841 +vt 0.401513 0.136942 +vt 0.375398 0.124274 +vt 0.361716 0.098676 +vt 0.365694 0.069924 +vt 0.385812 0.049001 +vt 0.364618 0.552208 +vt 0.364618 0.540220 +vt 0.440415 0.056746 +vt 0.454096 0.082345 +vt 0.450118 0.111097 +vt 0.430000 0.132019 +vt 0.401427 0.137121 +vt 0.375311 0.124453 +vt 0.361630 0.098854 +vt 0.365608 0.070102 +vt 0.385726 0.049180 +vt 0.414299 0.044078 +vt 0.153551 0.309903 +vt 0.116598 0.309903 +vt 0.116598 0.105262 +vt 0.153551 0.105262 +vt 0.307010 0.440979 +vt 0.018020 0.440979 +vt 0.018020 0.120900 +vt 0.307010 0.120900 +vt 0.196769 0.309903 +vt 0.159816 0.309903 +vt 0.159816 0.105262 +vt 0.196769 0.105262 +vt 0.314023 0.439161 +vt 0.025033 0.439066 +vt 0.025138 0.118987 +vt 0.314128 0.119082 +vt 0.025153 0.074610 +vt 0.314143 0.074704 +vt 0.227950 0.485353 +vt 0.227950 0.510114 +vt 0.104142 0.510114 +vt 0.104142 0.485353 +vt 0.266325 0.523051 +vt 0.072677 0.522988 +vt 0.190673 0.371300 +vt 0.165912 0.371300 +vt 0.259339 0.524885 +vt 0.065691 0.524885 +vt 0.147455 0.371300 +vt 0.122693 0.371300 +vt 0.159816 0.076889 +vt 0.196769 0.076889 +vt 0.687951 0.537593 +vt 0.706435 0.507328 +vt 0.754163 0.550622 +vt 0.706210 0.607649 +vt 0.116598 0.076889 +vt 0.153551 0.076889 +vt 0.179015 0.077358 +vt 0.179015 0.142122 +vt 0.152738 0.142122 +vt 0.152738 0.077358 +vt 0.728912 0.431370 +vt 0.734708 0.392314 +vt 0.800973 0.348654 +vt 0.798191 0.430276 +vt 0.318838 0.466122 +vt 0.411334 0.227292 +vt 0.444921 0.326550 +vt 0.419974 0.413258 +vt 0.438584 0.216609 +vt 0.474580 0.296924 +vt 0.334225 0.498913 +vt 0.424594 0.456508 +vt 0.248798 0.223994 +vt 0.084240 0.223994 +vt 0.084240 0.122696 +vt 0.248798 0.122696 +vt 0.152792 0.142965 +vt 0.152792 0.078201 +vt 0.179069 0.078201 +vt 0.179069 0.142965 +vt 0.152792 0.281615 +vt 0.179069 0.281615 +vt 0.179069 0.396566 +vt 0.152792 0.396566 +vt 0.085846 0.474266 +vt 0.250405 0.474266 +vt 0.250405 0.515365 +vt 0.085846 0.515365 +vt 0.152744 0.280748 +vt 0.179021 0.280748 +vt 0.179021 0.395699 +vt 0.152744 0.395699 +vt 0.238955 0.361627 +vt 0.238955 0.526185 +vt 0.094460 0.526185 +vt 0.094460 0.361627 +vt 0.085846 0.294472 +vt 0.250404 0.294472 +vt 0.085846 0.077608 +vt 0.250404 0.077608 +vt 0.248798 0.440857 +vt 0.084240 0.440857 +vt 0.179015 0.280773 +vt 0.152738 0.280773 +vt 0.671673 0.002744 +vt 0.844278 0.002745 +vt 0.844278 0.191331 +vt 0.671673 0.191331 +vt 0.996720 0.002686 +vt 0.996720 0.191273 +vt 0.845160 0.191273 +vt 0.845160 0.002686 +vt 0.520146 0.190919 +vt 0.520146 0.002333 +vt 0.671706 0.002332 +vt 0.671706 0.190919 +vt 0.843681 0.341056 +vt 0.672548 0.341056 +vt 0.672548 0.190787 +vt 0.843681 0.190787 +vt 0.761181 0.757672 +vt 0.745014 0.609207 +vt 0.825617 0.598089 +vt 0.857218 0.749462 +vt 0.903983 0.575714 +vt 0.966806 0.732133 +vt 0.037284 0.753700 +vt 0.083702 0.575714 +vt 0.170248 0.592277 +vt 0.150146 0.757178 +vt 0.255192 0.601900 +vt 0.244924 0.758570 +vt 0.338563 0.608064 +vt 0.332715 0.760010 +vt 0.420812 0.612170 +vt 0.417701 0.761448 +vt 0.502348 0.614676 +vt 0.501804 0.762519 +vt 0.583452 0.615510 +vt 0.586197 0.762734 +vt 0.582143 0.952920 +vt 0.583044 0.860597 +vt 0.669791 0.861975 +vt 0.668065 0.956701 +vt 0.672045 0.761448 +vt 0.664303 0.614117 +vt 0.241073 0.447150 +vt 0.241073 0.491674 +vt 0.214903 0.527695 +vt 0.172558 0.541454 +vt 0.130212 0.527695 +vt 0.104042 0.491674 +vt 0.104042 0.447150 +vt 0.130212 0.411129 +vt 0.172558 0.397370 +vt 0.214903 0.411129 +vt 0.760152 0.863460 +vt 0.755940 0.961929 +vt 0.497710 0.949766 +vt 0.498138 0.859147 +vt 0.414509 0.947207 +vt 0.414073 0.857939 +vt 0.332456 0.945865 +vt 0.329965 0.857760 +vt 0.251592 0.947343 +vt 0.244476 0.860193 +vt 0.172146 0.955239 +vt 0.154753 0.868649 +vt 0.096543 0.977696 +vt 0.052988 0.890421 +vt 0.846395 0.970980 +vt 0.858276 0.866218 +vt 0.977289 0.876251 +vt 0.939520 0.990215 +vt 0.246163 0.468809 +vt 0.232404 0.511154 +vt 0.228026 0.507973 +vt 0.240751 0.468809 +vt 0.196383 0.537324 +vt 0.194711 0.532178 +vt 0.151859 0.537324 +vt 0.153531 0.532178 +vt 0.115838 0.511154 +vt 0.120216 0.507973 +vt 0.102079 0.468809 +vt 0.107491 0.468809 +vt 0.115838 0.426464 +vt 0.120216 0.429644 +vt 0.151859 0.400293 +vt 0.153531 0.405440 +vt 0.196383 0.400293 +vt 0.194711 0.405440 +vt 0.232404 0.426464 +vt 0.228026 0.429644 +vt 0.222304 0.510145 +vt 0.233082 0.472692 +vt 0.257861 0.471280 +vt 0.243143 0.523230 +vt 0.221220 0.434642 +vt 0.240879 0.419400 +vt 0.189996 0.410699 +vt 0.197036 0.386966 +vt 0.151455 0.409727 +vt 0.142800 0.386702 +vt 0.120546 0.432569 +vt 0.099705 0.419421 +vt 0.109363 0.470169 +vt 0.084520 0.471458 +vt 0.121137 0.508213 +vt 0.101435 0.523480 +vt 0.152383 0.532125 +vt 0.145431 0.555957 +vt 0.191203 0.532840 +vt 0.199882 0.555957 +vt 0.435698 0.811852 +vt 0.162152 0.816109 +vt 0.230154 0.732276 +vt 0.434050 0.705986 +vt 0.638666 0.725919 +vt 0.709244 0.807596 +vt 0.641241 0.891429 +vt 0.437345 0.917718 +vt 0.232729 0.897786 +vt 0.929295 0.000129 +vt 0.929295 0.093942 +vt 0.858720 0.093942 +vt 0.858720 0.000129 +vt 0.814506 0.805963 +vt 0.799162 0.950578 +vt 0.638588 0.725925 +vt 0.794670 0.661894 +vt 0.999871 0.000129 +vt 0.999871 0.093941 +vt 0.435620 0.811858 +vt 0.162074 0.816115 +vt 0.230076 0.732282 +vt 0.433972 0.705993 +vt 0.429425 0.617979 +vt 0.429425 0.524167 +vt 0.500000 0.524167 +vt 0.500000 0.617979 +vt 0.056812 0.817748 +vt 0.072155 0.673133 +vt 0.076647 0.961816 +vt 0.358849 0.617979 +vt 0.358849 0.524167 +vt 0.179489 0.000130 +vt 0.358849 0.000129 +vt 0.358849 0.093942 +vt 0.179489 0.093942 +vt 0.000129 0.093942 +vt 0.000129 0.000130 +vt 0.433012 0.644243 +vt 0.072077 0.673139 +vt 0.679360 0.617979 +vt 0.679360 0.524167 +vt 0.858720 0.524167 +vt 0.858720 0.617979 +vt 0.433089 0.644237 +vt 0.438228 0.979473 +vt 0.679360 0.000129 +vt 0.679360 0.093942 +vt 0.500000 0.093942 +vt 0.500000 0.000129 +vt 0.679360 0.309054 +vt 0.500000 0.309054 +vt 0.858720 0.309054 +vt 0.438306 0.979467 +vt 0.179489 0.617979 +vt 0.000129 0.617979 +vt 0.000129 0.524167 +vt 0.179489 0.524167 +vt 0.179489 0.309054 +vt 0.358849 0.309054 +vt 0.000129 0.309054 +vt 0.056734 0.817754 +vt 0.429424 0.000129 +vt 0.429424 0.093942 +vt 0.429424 0.309054 +vt 0.814583 0.805956 +vt 0.929295 0.617979 +vt 0.929295 0.524167 +vt 0.999871 0.524167 +vt 0.999871 0.617979 +vt 0.929295 0.309054 +vt 0.999871 0.309054 +vt 1.023853 1.021029 +vt 1.459221 1.019853 +vt 1.416744 1.411802 +vt 1.025030 1.456397 +vt -0.021030 1.023853 +vt 0.501412 1.022442 +vt 0.502589 1.457809 +vt -0.019853 1.459221 +vt -0.023853 -0.021030 +vt 0.498588 -0.022441 +vt 0.500000 0.500000 +vt -0.022442 0.501412 +vt 1.021030 -0.023853 +vt 1.456398 -0.025030 +vt 1.457809 0.497412 +vt 1.022442 0.498588 +vt 0.497412 -0.457810 +vt 1.019853 -0.459221 +vt 1.411802 -0.416743 +vt -0.459221 -0.019853 +vt -0.457809 0.502588 +vt -0.416743 -0.411802 +vt -0.025030 -0.456398 +vt -0.456398 1.025030 +vt -0.411802 1.416743 +vt -0.041953 1.500000 +vt -0.450565 1.455716 +vt 1.450565 -0.455716 +vt 1.497056 -0.047350 +vt -0.497056 1.047350 +vt -0.498528 0.502699 +vt 1.455716 1.450565 +vt 1.047350 1.497056 +vt -0.500000 -0.041953 +vt -0.047350 -0.497056 +vt 0.497302 -0.498528 +vt 1.041953 -0.500000 +vt 1.498528 0.497302 +vt 1.500000 1.041953 +vt 0.502698 1.498528 +vt -0.455716 -0.450565 +vt 0.112122 0.571409 +vt 0.102745 0.649405 +vt 0.005232 0.636926 +vt 0.015273 0.558460 +vt 0.982694 0.558110 +vt 0.993329 0.637857 +vt 0.894351 0.650659 +vt 0.885042 0.571606 +vt 0.795351 0.661217 +vt 0.788160 0.582325 +vt 0.696222 0.668908 +vt 0.691435 0.590006 +vt 0.596983 0.673501 +vt 0.594704 0.594577 +vt 0.497710 0.674912 +vt 0.497969 0.596017 +vt 0.398508 0.673122 +vt 0.401293 0.594338 +vt 0.299505 0.668162 +vt 0.304752 0.589585 +vt 0.505213 0.112967 +vt 0.501701 0.206285 +vt 0.489387 0.201765 +vt 0.492595 0.116549 +vt 0.208392 0.581865 +vt 0.200857 0.660145 +vt 0.830899 0.107470 +vt 0.830899 0.191162 +vt 0.781706 0.258871 +vt 0.702110 0.284733 +vt 0.622514 0.258870 +vt 0.573321 0.191162 +vt 0.573321 0.107470 +vt 0.622514 0.039762 +vt 0.702110 0.013900 +vt 0.781706 0.039762 +vt 0.321542 0.339090 +vt 0.233346 0.331787 +vt 0.145385 0.321557 +vt 0.409918 0.343490 +vt 0.498401 0.344993 +vt 0.586905 0.343596 +vt 0.675343 0.339288 +vt 0.763623 0.332041 +vt 0.851656 0.321781 +vt 0.938963 0.308306 +vt 0.057701 0.308306 +vt 0.444008 0.279716 +vt 0.436702 0.268822 +vt 0.354171 0.305212 +vt 0.354665 0.292105 +vt 0.266506 0.273035 +vt 0.274610 0.262720 +vt 0.214497 0.195474 +vt 0.227115 0.191893 +vt 0.218010 0.102155 +vt 0.230323 0.106675 +vt 0.275702 0.028724 +vt 0.283008 0.039618 +vt 0.365538 0.003228 +vt 0.365045 0.016336 +vt 0.453204 0.035405 +vt 0.445100 0.045720 +vt 0.884796 0.980888 +vt 0.786849 0.980854 +vt 0.786910 0.804141 +vt 0.884858 0.804175 +vt 0.688901 0.980821 +vt 0.688963 0.804107 +vt 0.590954 0.980787 +vt 0.591015 0.804073 +vt 0.493006 0.980753 +vt 0.493068 0.804040 +vt 0.395059 0.980719 +vt 0.395120 0.804006 +vt 0.297112 0.980685 +vt 0.297172 0.803972 +vt 0.199164 0.980652 +vt 0.199225 0.803938 +vt 0.101217 0.980618 +vt 0.101278 0.803904 +vt 0.003269 0.980584 +vt 0.003330 0.803871 +vt 0.982744 0.980922 +vt 0.982805 0.804209 +vn -0.951100 0.309000 0.000000 +vn -0.587800 0.809000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.587800 0.809000 0.000000 +vn 0.951100 0.309000 0.000000 +vn 0.951100 -0.309000 0.000000 +vn 0.587800 -0.809000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.000000 0.000000 1.000000 +vn -0.951100 -0.309000 0.000000 +vn -0.587800 -0.809000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 -0.000000 +vn 1.000000 -0.000000 -0.000000 +vn 0.993500 0.113600 0.000000 +vn 0.000000 0.496400 -0.868100 +vn -0.993500 0.113600 -0.000000 +vn 0.000000 0.496400 0.868100 +vn 0.464300 -0.000000 0.885700 +vn 0.464300 -0.000000 -0.885700 +vn -0.813500 0.000000 -0.581500 +vn -0.813500 -0.000000 0.581500 +vn -0.900900 -0.061200 -0.429800 +vn -0.556800 -0.452500 -0.696600 +vn -0.000000 -0.602000 -0.798500 +vn 0.556800 -0.452500 -0.696600 +vn 0.900900 -0.061200 -0.429800 +vn 0.900900 0.422400 -0.100000 +vn 0.556800 0.813700 0.166900 +vn 0.000000 0.963200 0.268800 +vn -0.494200 0.256900 0.830500 +vn -0.900900 0.422400 -0.100000 +vn -0.556800 0.813700 0.166900 +vn -0.000000 -0.563400 0.826200 +vn -0.587800 0.668400 0.455800 +vn -0.799600 -0.090400 0.593700 +vn -0.951100 0.255300 0.174100 +vn 0.000000 0.389600 0.921000 +vn 0.000000 0.826200 0.563400 +vn 0.494200 0.256900 0.830500 +vn 0.587800 0.668400 0.455800 +vn 0.799600 -0.090400 0.593700 +vn 0.951100 0.255300 0.174100 +vn 0.799600 -0.519700 0.301000 +vn 0.951100 -0.255300 -0.174100 +vn 0.494200 -0.867000 0.064100 +vn 0.587800 -0.668400 -0.455800 +vn -0.000000 -0.999700 -0.026300 +vn -0.000000 -0.826200 -0.563400 +vn -0.494200 -0.867000 0.064100 +vn -0.587800 -0.668400 -0.455800 +vn -0.799600 -0.519700 0.301000 +vn -0.951100 -0.255300 -0.174100 +vn 0.000000 0.563400 -0.826200 +vn 0.884900 -0.444000 0.140800 +vn 0.546900 -0.828400 -0.121200 +vn 0.000000 -0.975200 -0.221300 +vn -0.546900 -0.828400 -0.121200 +vn -0.884900 -0.444000 0.140800 +vn -0.884900 0.031000 0.464800 +vn -0.546900 0.415400 0.726900 +vn 0.000000 0.562200 0.827000 +vn 0.546900 0.415400 0.726900 +vn 0.884900 0.031000 0.464800 +vn -0.701400 -0.166000 0.693200 +vn -0.596700 -0.163800 0.785600 +vn -0.597600 0.192800 0.778300 +vn -0.702300 0.190600 0.685900 +vn 0.746200 -0.085700 0.660200 +vn 0.842300 -0.177500 -0.509000 +vn 0.841400 0.160800 -0.515900 +vn 0.745700 0.116300 0.656100 +vn 0.702300 -0.190600 -0.685900 +vn 0.597600 -0.192800 -0.778300 +vn 0.596700 0.163800 -0.785600 +vn 0.701400 0.166000 -0.693200 +vn -0.745700 -0.116300 -0.656100 +vn -0.841400 -0.160800 0.515900 +vn -0.842300 0.177500 0.509000 +vn -0.746200 0.085700 -0.660200 +vn -0.014200 0.999400 -0.030700 +vn 0.009100 0.999900 -0.010100 +vn 0.557500 0.610200 -0.562900 +vn 0.475000 0.608500 -0.635700 +vn -0.009100 -0.999900 0.010100 +vn 0.014200 -0.999400 0.030700 +vn -0.475000 -0.608500 0.635700 +vn -0.557500 -0.610200 0.562900 +vn 0.478100 -0.631500 -0.610400 +vn 0.560700 -0.629800 -0.537500 +vn -0.560700 0.629800 0.537500 +vn -0.478100 0.631500 0.610400 +vn 0.404300 -0.186500 -0.895400 +vn 0.403500 0.151800 -0.902300 +vn -0.403500 -0.151800 0.902300 +vn -0.404300 0.186500 0.895400 +vn -0.647700 -0.175600 0.741400 +vn -0.535800 -0.180800 0.824800 +vn -0.525000 0.175600 0.832800 +vn -0.636900 0.180800 0.749500 +vn 0.794200 -0.138500 0.591600 +vn 0.791300 -0.180100 -0.584400 +vn 0.801500 0.158100 -0.576700 +vn 0.800300 0.063400 0.596200 +vn 0.636900 -0.180800 -0.749500 +vn 0.525000 -0.175600 -0.832800 +vn 0.535800 0.180800 -0.824800 +vn 0.647700 0.175600 -0.741400 +vn -0.800300 -0.063400 -0.596200 +vn -0.801500 -0.158000 0.576700 +vn -0.791300 0.180100 0.584400 +vn -0.794200 0.138500 -0.591600 +vn 0.017800 0.999800 0.013200 +vn 0.042700 0.998600 0.031800 +vn 0.530400 0.617600 -0.580700 +vn 0.442100 0.621800 -0.646500 +vn -0.042700 -0.998600 -0.031800 +vn -0.017800 -0.999800 -0.013200 +vn -0.442100 -0.621800 0.646500 +vn -0.530400 -0.617600 0.580700 +vn 0.404600 -0.617600 -0.674400 +vn 0.492900 -0.621800 -0.608700 +vn -0.492900 0.621800 0.608700 +vn -0.404600 0.617600 0.674400 +vn 0.323200 -0.158000 -0.933100 +vn 0.333400 0.180100 -0.925400 +vn -0.333400 -0.180100 0.925400 +vn -0.323200 0.158000 0.933100 +vn -0.692500 -0.178300 0.699000 +vn -0.586600 -0.178300 0.790000 +vn -0.586600 0.178300 0.790000 +vn -0.692500 0.178300 0.699000 +vn 0.754700 -0.101000 0.648200 +vn 0.834900 -0.169200 -0.523800 +vn 0.834900 0.169200 -0.523800 +vn 0.754700 0.101000 0.648200 +vn 0.692500 -0.178300 -0.699000 +vn 0.586600 -0.178300 -0.790000 +vn 0.586600 0.178300 -0.790000 +vn 0.692500 0.178300 -0.699000 +vn -0.754700 -0.101000 -0.648300 +vn -0.834900 -0.169200 0.523800 +vn -0.834900 0.169200 0.523800 +vn -0.754700 0.101000 -0.648300 +vn -0.011800 0.999900 -0.010100 +vn 0.011800 0.999900 0.010100 +vn 0.551700 0.620100 -0.557700 +vn 0.468100 0.620100 -0.629500 +vn -0.011800 -0.999900 -0.010100 +vn 0.011800 -0.999900 0.010100 +vn -0.468100 -0.620100 0.629500 +vn -0.551700 -0.620100 0.557700 +vn 0.468100 -0.620100 -0.629500 +vn 0.551700 -0.620100 -0.557700 +vn -0.551700 0.620100 0.557700 +vn -0.468100 0.620100 0.629500 +vn 0.391800 -0.169200 -0.904400 +vn -0.754700 -0.101000 -0.648200 +vn -0.754700 0.101000 -0.648200 +vn 0.391800 0.169200 -0.904400 +vn -0.391800 -0.169200 0.904400 +vn -0.391800 0.169200 0.904400 +vn -0.411000 0.807700 -0.422700 +vn -0.608600 0.762700 0.218900 +vn 0.294900 0.803900 0.516500 +vn 0.152100 0.715600 -0.681800 +vn 0.381300 0.817200 -0.432200 +vn 0.711100 0.673800 -0.200900 +vn 0.561100 0.542300 -0.625300 +vn 0.052500 0.761500 0.646100 +vn 0.412300 0.839900 0.353100 +vn 0.706800 0.674900 0.211700 +vn -0.312000 0.902300 0.297300 +vn -0.127100 0.801700 0.584000 +vn -0.392500 0.763100 0.513500 +vn -0.671300 0.736100 -0.086200 +vn -0.403600 0.838100 -0.367000 +vn -0.098100 0.717700 -0.689400 +vn -0.575400 0.811200 0.104700 +vn 0.512300 0.740200 -0.435400 +vn 0.022700 0.659300 0.751600 +vn -0.732200 0.664700 -0.148600 +vn -0.016100 0.701300 0.712700 +vn 0.857300 0.494300 0.143800 +vn 0.785400 0.611000 -0.099400 +vn 0.000300 0.560700 -0.828000 +vn 0.008600 0.543300 -0.839500 +vn -0.873900 0.486000 0.003800 +vn 0.115100 0.778400 0.617100 +vn -0.809400 0.587000 0.015000 +vn 0.328900 0.741100 -0.585300 +vn -0.124700 0.757200 0.641200 +vn -0.137500 0.695300 -0.705500 +vn 0.813300 0.579600 -0.051100 +vn 0.001300 0.000000 -1.000000 +vn 0.588800 0.000000 -0.808300 +vn 0.951500 -0.000000 -0.307800 +vn 0.950700 -0.000000 0.310200 +vn 0.586700 -0.000000 0.809800 +vn -0.001300 -0.000000 1.000000 +vn -0.588800 -0.000000 0.808300 +vn -0.951500 -0.000000 0.307800 +vn -0.586700 0.000000 -0.809800 +vn -0.950700 0.000000 -0.310200 +vn -0.948800 -0.062100 -0.309600 +vn -0.585600 -0.062100 -0.808200 +vn -0.949600 -0.062100 0.307200 +vn -0.587700 -0.062100 0.806700 +vn -0.001300 -0.062100 0.998100 +vn 0.585600 -0.062100 0.808200 +vn 0.948800 -0.062100 0.309600 +vn 0.949600 -0.062100 -0.307200 +vn 0.587700 -0.062100 -0.806700 +vn 0.001300 -0.062100 -0.998100 +g Cement_Mixer_Cylinder.002_Mixer +s off +f 266/1/1 267/2/1 269/3/1 268/4/1 +f 268/4/2 269/3/2 271/5/2 270/6/2 +f 270/6/3 271/5/3 273/7/3 272/8/3 +f 272/8/4 273/7/4 275/9/4 274/10/4 +f 274/11/5 275/12/5 277/13/5 276/14/5 +f 276/14/6 277/13/6 279/15/6 278/16/6 +f 278/16/7 279/15/7 281/17/7 280/18/7 +f 280/18/8 281/17/8 283/19/8 282/20/8 +f 269/21/9 267/22/9 285/23/9 283/24/9 281/25/9 279/26/9 277/27/9 275/28/9 273/29/9 271/30/9 +f 284/31/10 285/32/10 267/2/10 266/1/10 +f 282/20/11 283/19/11 285/32/11 284/31/11 +f 266/33/12 268/34/12 270/35/12 272/36/12 274/37/12 276/38/12 278/39/12 280/40/12 282/41/12 284/42/12 +f 286/43/1 287/44/1 289/45/1 288/46/1 +f 288/46/2 289/45/2 291/47/2 290/48/2 +f 290/48/3 291/47/3 293/49/3 292/50/3 +f 292/50/4 293/49/4 295/51/4 294/52/4 +f 294/53/5 295/54/5 297/55/5 296/56/5 +f 296/56/6 297/55/6 299/57/6 298/58/6 +f 298/58/7 299/57/7 301/59/7 300/60/7 +f 300/60/8 301/59/8 303/61/8 302/62/8 +f 289/63/9 287/64/9 305/65/9 303/66/9 301/67/9 299/68/9 297/69/9 295/70/9 293/71/9 291/72/9 +f 304/73/10 305/74/10 287/44/10 286/43/10 +f 302/62/11 303/61/11 305/74/11 304/73/11 +f 286/75/12 288/76/12 290/77/12 292/78/12 294/79/12 296/80/12 298/81/12 300/82/12 302/83/12 304/84/12 +f 314/85/9 315/86/9 308/87/9 306/88/9 +f 315/89/13 316/90/13 312/91/13 308/92/13 +f 316/93/12 317/94/12 310/95/12 312/96/12 +f 317/97/14 314/98/14 306/99/14 310/100/14 +f 310/100/14 306/99/14 319/101/14 321/102/14 +f 311/103/3 313/104/3 309/105/3 307/106/3 +f 311/107/15 307/108/15 314/98/15 317/97/15 +f 313/109/16 311/110/16 317/94/16 316/93/16 +f 309/111/17 313/112/17 316/90/17 315/89/17 +f 307/113/18 309/114/18 315/86/18 314/85/18 +f 312/96/12 310/95/12 321/115/12 320/116/12 +f 326/117/19 329/118/19 323/119/19 325/120/19 +f 306/88/9 308/87/9 318/121/9 319/122/9 +f 325/123/9 323/124/9 335/125/9 337/126/9 +f 330/127/20 333/128/20 324/129/20 322/130/20 +f 329/118/3 330/127/3 322/130/3 323/119/3 +f 308/131/3 312/132/3 331/133/3 328/134/3 +f 328/134/3 331/133/3 330/127/3 329/118/3 +f 312/132/21 320/135/21 332/136/21 331/133/21 +f 331/133/12 332/136/12 333/128/12 330/127/12 +f 318/137/22 308/131/22 328/134/22 327/138/22 +f 327/138/9 328/134/9 329/118/9 326/117/9 +f 335/139/13 334/140/13 336/141/13 337/142/13 +f 322/143/12 324/144/12 336/145/12 334/146/12 +f 342/147/12 343/148/12 340/149/12 338/150/12 +f 339/151/3 338/152/3 340/153/3 341/154/3 +f 344/155/9 345/156/9 339/157/9 341/158/9 +f 343/159/8 344/160/8 349/161/8 348/162/8 +f 345/163/14 342/164/14 338/152/14 339/151/14 +f 323/165/14 322/166/14 342/164/14 345/163/14 +f 334/140/13 335/139/13 344/167/13 343/168/13 +f 335/125/9 323/124/9 345/169/9 344/170/9 +f 322/143/12 334/146/12 343/148/12 342/147/12 +f 348/171/13 349/172/13 347/173/13 346/174/13 +f 344/175/9 341/176/9 347/177/9 349/178/9 +f 340/179/12 343/180/12 348/181/12 346/182/12 +f 341/183/3 340/184/3 346/185/3 347/186/3 +f 371/187/23 351/188/23 353/189/23 372/190/23 +f 372/190/24 353/189/24 355/191/24 374/192/24 +f 374/193/25 355/194/25 357/195/25 376/196/25 +f 376/196/26 357/195/26 359/197/26 378/198/26 +f 378/198/27 359/197/27 361/199/27 380/200/27 +f 380/200/28 361/199/28 363/201/28 382/202/28 +f 382/202/29 363/201/29 365/203/29 384/204/29 +f 384/204/30 365/203/30 367/205/30 386/206/30 +f 366/207/31 387/208/31 389/209/31 368/210/31 +f 388/211/32 369/212/32 351/188/32 371/187/32 +f 386/206/33 367/205/33 369/212/33 388/211/33 +f 350/213/34 352/214/34 354/215/34 356/216/34 358/217/34 360/218/34 362/219/34 364/220/34 366/221/34 368/222/34 +f 387/208/35 386/206/35 388/211/35 389/209/35 +f 368/210/36 389/209/36 370/223/36 350/224/36 +f 389/209/37 388/211/37 371/187/37 370/223/37 +f 364/225/38 385/226/38 387/208/38 366/207/38 +f 385/226/39 384/204/39 386/206/39 387/208/39 +f 362/227/40 383/228/40 385/226/40 364/225/40 +f 383/228/41 382/202/41 384/204/41 385/226/41 +f 360/229/42 381/230/42 383/228/42 362/227/42 +f 381/230/43 380/200/43 382/202/43 383/228/43 +f 358/231/44 379/232/44 381/230/44 360/229/44 +f 379/232/45 378/198/45 380/200/45 381/230/45 +f 356/233/46 377/234/46 379/232/46 358/231/46 +f 377/234/47 376/196/47 378/198/47 379/232/47 +f 354/235/48 375/236/48 377/234/48 356/233/48 +f 375/236/49 374/193/49 376/196/49 377/234/49 +f 352/237/50 373/238/50 375/239/50 354/240/50 +f 373/238/51 372/190/51 374/192/51 375/239/51 +f 350/224/52 370/223/52 373/238/52 352/237/52 +f 370/223/53 371/187/53 372/190/53 373/238/53 +f 351/241/54 369/242/54 399/243/54 390/244/54 +f 369/242/54 367/245/54 398/246/54 399/243/54 +f 367/245/54 365/247/54 397/248/54 398/246/54 +f 365/247/54 363/249/54 396/250/54 397/248/54 +f 363/249/54 361/251/54 395/252/54 396/250/54 +f 361/251/54 359/253/54 394/254/54 395/252/54 +f 359/253/54 357/255/54 393/256/54 394/254/54 +f 357/255/54 355/257/54 392/258/54 393/256/54 +f 355/257/54 353/259/54 391/260/54 392/258/54 +f 353/259/54 351/241/54 390/244/54 391/260/54 +f 390/261/55 399/262/55 409/263/55 400/264/55 +f 399/262/56 398/265/56 408/266/56 409/263/56 +f 398/265/57 397/267/57 407/268/57 408/266/57 +f 397/267/58 396/269/58 406/270/58 407/268/58 +f 396/269/59 395/271/59 405/272/59 406/270/59 +f 395/271/60 394/273/60 404/274/60 405/272/60 +f 394/273/61 393/275/61 403/276/61 404/274/61 +f 393/275/62 392/277/62 402/278/62 403/276/62 +f 392/277/63 391/279/63 401/280/63 402/278/63 +f 391/279/64 390/261/64 400/264/64 401/280/64 +g Cement_Mixer_Cylinder.002_CementBag +f 1/281/65 15/282/65 44/283/65 16/284/65 +f 1/281/66 16/284/66 46/285/66 17/286/66 +f 1/281/67 17/286/67 45/287/67 18/288/67 +f 1/281/68 18/288/68 43/289/68 15/282/68 +f 2/290/69 42/291/69 52/292/69 19/293/69 +f 2/294/70 19/295/70 50/287/70 20/286/70 +f 2/294/71 20/286/71 49/296/71 29/297/71 +f 2/290/72 29/298/72 53/299/72 42/291/72 +f 3/300/73 20/286/73 50/287/73 22/288/73 +f 3/300/74 22/288/74 48/289/74 23/301/74 +f 3/300/75 23/301/75 47/302/75 24/303/75 +f 3/300/76 24/303/76 49/296/76 20/286/76 +f 4/304/77 40/305/77 56/306/77 25/307/77 +f 4/308/78 25/309/78 44/283/78 15/282/78 +f 4/308/79 15/282/79 43/289/79 33/310/79 +f 4/304/80 33/311/80 57/312/80 40/305/80 +f 5/313/81 26/314/81 58/315/81 38/316/81 +f 5/313/82 38/316/82 53/317/82 29/318/82 +f 5/319/83 29/297/83 49/296/83 24/303/83 +f 5/319/84 24/303/84 47/302/84 26/320/84 +f 6/321/85 25/307/85 56/306/85 36/322/85 +f 6/321/86 36/322/86 51/323/86 27/324/86 +f 6/325/87 27/297/87 46/285/87 16/284/87 +f 6/325/88 16/284/88 44/283/88 25/309/88 +f 7/326/89 31/310/89 48/289/89 22/288/89 +f 7/326/90 22/288/90 50/287/90 19/295/90 +f 7/327/86 19/293/86 52/292/86 35/328/86 +f 7/327/85 35/328/85 55/329/85 31/330/85 +f 8/331/85 32/332/85 55/329/85 35/328/85 +f 8/331/86 35/328/86 52/292/86 28/333/86 +f 8/331/86 28/333/86 51/323/86 36/322/86 +f 8/331/85 36/322/85 56/306/85 32/332/85 +f 9/334/91 33/310/91 43/289/91 18/288/91 +f 9/334/92 18/288/92 45/287/92 21/295/92 +f 9/335/82 21/336/82 54/337/82 37/338/82 +f 9/335/81 37/338/81 57/312/81 33/311/81 +f 10/339/81 34/340/81 57/312/81 37/338/81 +f 10/339/82 37/338/82 54/337/82 30/341/82 +f 10/339/82 30/341/82 53/317/82 38/316/82 +f 10/339/81 38/316/81 58/315/81 34/340/81 +f 11/342/93 23/301/93 48/289/93 31/310/93 +f 11/343/77 31/330/77 55/329/77 39/344/77 +f 11/343/80 39/344/80 58/315/80 26/314/80 +f 11/342/94 26/320/94 47/302/94 23/301/94 +f 12/345/77 39/344/77 55/329/77 32/332/77 +f 12/345/77 32/332/77 56/306/77 40/305/77 +f 12/345/80 40/305/80 57/312/80 34/340/80 +f 12/345/80 34/340/80 58/315/80 39/344/80 +f 13/346/95 17/286/95 46/285/95 27/297/95 +f 13/347/69 27/324/69 51/323/69 41/348/69 +f 13/347/72 41/348/72 54/349/72 21/350/72 +f 13/346/96 21/295/96 45/287/96 17/286/96 +f 14/351/69 41/348/69 51/323/69 28/333/69 +f 14/351/69 28/333/69 52/292/69 42/291/69 +f 14/351/72 42/291/72 53/299/72 30/352/72 +f 14/351/72 30/352/72 54/349/72 41/348/72 +f 59/281/97 73/282/97 102/283/97 74/284/97 +f 59/281/98 74/284/98 104/285/98 75/286/98 +f 59/281/99 75/286/99 103/287/99 76/288/99 +f 59/281/100 76/288/100 101/289/100 73/282/100 +f 60/290/101 100/291/101 110/292/101 77/293/101 +f 60/294/102 77/295/102 108/287/102 78/286/102 +f 60/294/103 78/286/103 107/296/103 87/297/103 +f 60/290/104 87/298/104 111/299/104 100/291/104 +f 61/300/105 78/286/105 108/287/105 80/288/105 +f 61/300/106 80/288/106 106/289/106 81/301/106 +f 61/300/107 81/301/107 105/302/107 82/303/107 +f 61/300/108 82/303/108 107/296/108 78/286/108 +f 62/304/109 98/305/109 114/306/109 83/307/109 +f 62/308/110 83/309/110 102/283/110 73/282/110 +f 62/308/111 73/282/111 101/289/111 91/310/111 +f 62/304/112 91/311/112 115/312/112 98/305/112 +f 63/313/113 84/314/113 116/315/113 96/316/113 +f 63/313/114 96/316/114 111/317/114 87/318/114 +f 63/319/115 87/297/115 107/296/115 82/303/115 +f 63/319/116 82/303/116 105/302/116 84/320/116 +f 64/321/117 83/307/117 114/306/117 94/322/117 +f 64/321/118 94/322/118 109/323/118 85/324/118 +f 64/325/119 85/297/119 104/285/119 74/284/119 +f 64/325/120 74/284/120 102/283/120 83/309/120 +f 65/326/121 89/310/121 106/289/121 80/288/121 +f 65/326/122 80/288/122 108/287/122 77/295/122 +f 65/327/118 77/293/118 110/292/118 93/328/118 +f 65/327/117 93/328/117 113/329/117 89/330/117 +f 66/331/117 90/332/117 113/329/117 93/328/117 +f 66/331/118 93/328/118 110/292/118 86/333/118 +f 66/331/118 86/333/118 109/323/118 94/322/118 +f 66/331/117 94/322/117 114/306/117 90/332/117 +f 67/334/123 91/310/123 101/289/123 76/288/123 +f 67/334/124 76/288/124 103/287/124 79/295/124 +f 67/335/114 79/336/114 112/337/114 95/338/114 +f 67/335/113 95/338/113 115/312/113 91/311/113 +f 68/339/113 92/340/113 115/312/113 95/338/113 +f 68/339/114 95/338/114 112/337/114 88/341/114 +f 68/339/114 88/341/114 111/317/114 96/316/114 +f 68/339/113 96/316/113 116/315/113 92/340/113 +f 69/342/125 81/301/125 106/289/125 89/310/125 +f 69/343/109 89/330/109 113/329/109 97/344/109 +f 69/343/112 97/344/112 116/315/112 84/314/112 +f 69/342/126 84/320/126 105/302/126 81/301/126 +f 70/345/109 97/344/109 113/329/109 90/332/109 +f 70/345/109 90/332/109 114/306/109 98/305/109 +f 70/345/112 98/305/112 115/312/112 92/340/112 +f 70/345/112 92/340/112 116/315/112 97/344/112 +f 71/346/127 75/286/127 104/285/127 85/297/127 +f 71/347/101 85/324/101 109/323/101 99/348/101 +f 71/347/104 99/348/104 112/349/104 79/350/104 +f 71/346/128 79/295/128 103/287/128 75/286/128 +f 72/351/101 99/348/101 109/323/101 86/333/101 +f 72/351/101 86/333/101 110/292/101 100/291/101 +f 72/351/104 100/291/104 111/299/104 88/352/104 +f 72/351/104 88/352/104 112/349/104 99/348/104 +f 158/281/129 172/282/129 201/283/129 173/284/129 +f 158/281/130 173/284/130 203/285/130 174/286/130 +f 158/281/131 174/286/131 202/287/131 175/288/131 +f 158/281/132 175/288/132 200/289/132 172/282/132 +f 159/290/133 199/291/133 209/292/133 176/293/133 +f 159/294/134 176/295/134 207/287/134 177/286/134 +f 159/294/135 177/286/135 206/296/135 186/297/135 +f 159/290/136 186/298/136 210/299/136 199/291/136 +f 160/300/137 177/286/137 207/287/137 179/288/137 +f 160/300/138 179/288/138 205/289/138 180/301/138 +f 160/300/139 180/301/139 204/302/139 181/303/139 +f 160/300/140 181/303/140 206/296/140 177/286/140 +f 161/304/141 197/305/141 213/306/141 182/307/141 +f 161/308/142 182/309/142 201/283/142 172/282/142 +f 161/308/143 172/282/143 200/289/143 190/310/143 +f 161/304/144 190/311/144 214/312/144 197/305/144 +f 162/313/145 183/314/145 215/315/145 195/316/145 +f 162/313/146 195/316/146 210/317/146 186/318/146 +f 162/319/147 186/297/147 206/296/147 181/303/147 +f 162/319/148 181/303/148 204/302/148 183/320/148 +f 163/321/149 182/307/149 213/306/149 193/322/149 +f 163/321/150 193/322/150 208/323/150 184/324/150 +f 163/325/151 184/297/151 203/285/151 173/284/151 +f 163/325/152 173/284/152 201/283/152 182/309/152 +f 164/326/153 188/310/153 205/289/153 179/288/153 +f 164/326/154 179/288/154 207/287/154 176/295/154 +f 164/327/150 176/293/150 209/292/150 192/328/150 +f 164/327/149 192/328/149 212/329/149 188/330/149 +f 165/331/149 189/332/149 212/329/149 192/328/149 +f 165/331/150 192/328/150 209/292/150 185/333/150 +f 165/331/150 185/333/150 208/323/150 193/322/150 +f 165/331/149 193/322/149 213/306/149 189/332/149 +f 166/334/155 190/310/155 200/289/155 175/288/155 +f 166/334/156 175/288/156 202/287/156 178/295/156 +f 166/335/146 178/336/146 211/337/146 194/338/146 +f 166/335/145 194/338/145 214/312/145 190/311/145 +f 167/339/145 191/340/145 214/312/145 194/338/145 +f 167/339/146 194/338/146 211/337/146 187/341/146 +f 167/339/146 187/341/146 210/317/146 195/316/146 +f 167/339/145 195/316/145 215/315/145 191/340/145 +f 168/342/157 180/301/157 205/289/157 188/310/157 +f 168/343/158 188/330/158 212/329/158 196/344/158 +f 168/343/159 196/344/159 215/315/159 183/314/159 +f 168/342/160 183/320/160 204/302/160 180/301/160 +f 169/345/158 196/344/158 212/329/158 189/332/158 +f 169/345/158 189/332/158 213/306/158 197/305/158 +f 169/345/159 197/305/159 214/312/159 191/340/159 +f 169/345/159 191/340/159 215/315/159 196/344/159 +f 170/346/161 174/286/161 203/285/161 184/297/161 +f 170/347/133 184/324/133 208/323/133 198/348/133 +f 170/347/136 198/348/136 211/349/136 178/350/136 +f 170/346/162 178/295/162 202/287/162 174/286/162 +f 171/351/133 198/348/133 208/323/133 185/333/133 +f 171/351/133 185/333/133 209/292/133 199/291/133 +f 171/351/136 199/291/136 210/299/136 187/352/136 +f 171/351/136 187/352/136 211/349/136 198/348/136 +g Cement_Mixer_Cylinder.002_Gravel +f 141/353/163 128/354/163 120/355/163 133/356/163 +f 140/357/164 134/358/164 124/359/164 129/360/164 +f 139/361/165 135/362/165 125/363/165 136/364/165 +f 138/365/166 132/366/166 123/367/166 137/368/166 +f 135/362/167 138/365/167 137/368/167 125/363/167 +f 122/369/168 127/370/168 138/365/168 135/362/168 +f 127/370/169 118/371/169 132/366/169 138/365/169 +f 126/372/170 139/361/170 136/364/170 121/373/170 +f 117/374/171 131/375/171 139/361/171 126/372/171 +f 131/375/172 122/369/172 135/362/172 139/361/172 +f 130/376/173 140/357/173 129/360/173 119/377/173 +f 121/373/174 136/364/174 140/357/174 130/376/174 +f 136/364/175 125/363/175 134/358/175 140/357/175 +f 134/358/176 141/353/176 133/356/176 124/359/176 +f 125/363/177 137/368/177 141/353/177 134/358/177 +f 137/368/178 123/367/178 128/354/178 141/353/178 +f 119/377/179 129/360/179 153/378/179 144/379/179 +f 132/366/180 118/371/180 143/380/180 156/381/180 +f 121/373/181 130/376/181 154/382/181 146/383/181 +f 133/356/182 120/355/182 145/384/182 157/385/182 +f 126/372/183 121/373/183 146/383/183 150/386/183 +f 122/369/184 131/375/184 155/387/184 147/388/184 +f 127/370/185 122/369/185 147/388/185 151/389/185 +f 123/367/186 132/366/186 156/381/186 148/390/186 +f 128/354/187 123/367/187 148/390/187 152/391/187 +f 124/359/188 133/356/188 157/385/188 149/392/188 +f 117/374/189 126/372/189 150/386/189 142/393/189 +f 129/360/190 124/359/190 149/392/190 153/378/190 +f 118/371/191 127/370/191 151/389/191 143/380/191 +f 130/376/192 119/377/192 144/379/192 154/382/192 +f 120/355/193 128/354/193 152/391/193 145/384/193 +f 131/375/194 117/374/194 142/393/194 155/387/194 +g Cement_Mixer_Cylinder.002_Pail +f 236/394/195 217/395/195 219/396/195 237/397/195 +f 237/398/196 219/399/196 221/400/196 238/401/196 +f 238/401/197 221/400/197 223/402/197 239/403/197 +f 239/403/198 223/402/198 225/404/198 240/405/198 +f 240/405/199 225/404/199 227/406/199 241/407/199 +f 241/407/200 227/406/200 229/408/200 242/409/200 +f 242/409/201 229/408/201 231/410/201 243/411/201 +f 243/411/202 231/410/202 233/412/202 244/413/202 +f 217/414/3 235/415/3 255/416/3 246/417/3 +f 245/418/203 235/419/203 217/395/203 236/394/203 +f 244/413/204 233/412/204 235/419/204 245/418/204 +f 216/420/8 218/421/8 220/422/8 222/423/8 224/424/8 226/425/8 228/426/8 230/427/8 232/428/8 234/429/8 +f 232/430/205 244/413/205 245/418/205 234/431/205 +f 234/431/206 245/418/206 236/394/206 216/432/206 +f 230/433/207 243/411/207 244/413/207 232/430/207 +f 228/434/208 242/409/208 243/411/208 230/433/208 +f 226/435/209 241/407/209 242/409/209 228/434/209 +f 224/436/210 240/405/210 241/407/210 226/435/210 +f 222/437/211 239/403/211 240/405/211 224/436/211 +f 220/438/212 238/401/212 239/403/212 222/437/212 +f 218/439/213 237/398/213 238/401/213 220/438/213 +f 216/432/214 236/394/214 237/397/214 218/440/214 +f 235/415/3 233/441/3 254/442/3 255/416/3 +f 233/441/3 231/443/3 253/444/3 254/442/3 +f 231/443/3 229/445/3 252/446/3 253/444/3 +f 229/445/3 227/447/3 251/448/3 252/446/3 +f 227/447/3 225/449/3 250/450/3 251/448/3 +f 225/449/3 223/451/3 249/452/3 250/450/3 +f 223/451/3 221/453/3 248/454/3 249/452/3 +f 221/453/3 219/455/3 247/456/3 248/454/3 +f 219/455/3 217/414/3 246/417/3 247/456/3 +f 246/457/199 255/458/199 265/459/199 256/460/199 +f 255/458/198 254/461/198 264/462/198 265/459/198 +f 254/461/197 253/463/197 263/464/197 264/462/197 +f 253/463/196 252/465/196 262/466/196 263/464/196 +f 252/465/195 251/467/195 261/468/195 262/466/195 +f 251/467/203 250/469/203 260/470/203 261/468/203 +f 250/469/204 249/471/204 259/472/204 260/470/204 +f 249/471/202 248/473/202 258/474/202 259/472/202 +f 248/473/201 247/475/201 257/476/201 258/474/201 +f 247/477/200 246/457/200 256/460/200 257/478/200 diff --git a/mods/mylandscaping/models/name_scheme.txt b/mods/mylandscaping/models/name_scheme.txt new file mode 100644 index 00000000..840f133a --- /dev/null +++ b/mods/mylandscaping/models/name_scheme.txt @@ -0,0 +1,19 @@ +I got sick of overwriting the wrong files, here's the breakdown of the file names. + +mylandscaping = name of mod, duh +*_block1 = block style +*_*_L = L, R, M, C, F [Left, Right, Middle, OCorner, ICorner, Full] +*_*_*_T = T, B [Top, Bottom] + +Left block is leftmost in a wall +Right block is rightmost in a wall +Middle block is two full blocks, offset on top +OCorner block is outside corner +ICorner block is inside corner +Full block is full on bottom, and two halves on top, only takes up one node. [not used much] + +Columns don't follow same scheme, rather they use this. +mylandscaping = name of mod +*_column = can be extended in future to colum style +*_*_IC = IC, OC, M [Inside Corner, Outside Corner, Middle] +*_*_*_T = T, B [Top, Bottom] diff --git a/mods/mylandscaping/readme.md b/mods/mylandscaping/readme.md new file mode 100644 index 00000000..1cdb7620 --- /dev/null +++ b/mods/mylandscaping/readme.md @@ -0,0 +1,18 @@ +# Mod Contributors +Nathan -- models, textures and bug fixing +Don -- code, graphics and bug fixing + +# mylandscaping +This is a Minetest mod that adds retaining walls and column nodes. + +## Forum Topic +- https://forum.minetest.net/viewtopic.php?f=11&t=12094 + +## Licensing +- Code: MIT +- Graphics/Models: CC-by-SA 4.0 Nathan Salapat + +## Dependencies +- default +- bucket +- myconcrete? diff --git a/mods/mylandscaping/recipes.lua b/mods/mylandscaping/recipes.lua new file mode 100644 index 00000000..5306ed33 --- /dev/null +++ b/mods/mylandscaping/recipes.lua @@ -0,0 +1,31 @@ +minetest.register_craft({ + output = 'mylandscaping:machine', + recipe = { + {'default:shovel_steel', 'bucket:bucket_water', ''}, + {'default:steel_ingot', 'mylandscaping:concrete_bag', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'mylandscaping:mixer', + recipe = { + {'default:pick_steel', 'default:paper', 'default:chest'}, + {'group:stick', 'default:paper', 'group:stick'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'mylandscaping:concrete', + recipe = { + {'', '', ''}, + {'', '', ''}, + {'', '', ''}, + } +}) + +minetest.register_craftitem('mylandscaping:concrete_bag', { + description = 'Bag of Concrete Mix', + inventory_image = 'mylandscaping_cement_bag.png', +}) diff --git a/mods/mylandscaping/screenshot.png b/mods/mylandscaping/screenshot.png new file mode 100644 index 00000000..4f52abc9 Binary files /dev/null and b/mods/mylandscaping/screenshot.png differ diff --git a/mods/mylandscaping/settingtypes.txt b/mods/mylandscaping/settingtypes.txt new file mode 100644 index 00000000..27896cd1 --- /dev/null +++ b/mods/mylandscaping/settingtypes.txt @@ -0,0 +1 @@ +mylandscaping.creative (Display retaining wall blocks in creative inventory?) bool false diff --git a/mods/mylandscaping/stones.lua b/mods/mylandscaping/stones.lua new file mode 100644 index 00000000..a7dd60d2 --- /dev/null +++ b/mods/mylandscaping/stones.lua @@ -0,0 +1,303 @@ +local stone_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + } + } +local sstone_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + } + } + +local sq_cbox = { + type = 'fixed', + fixed = { + {-0.4375, -0.5, -0.4375, 0.4375, -0.3125, 0.4375}, + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + } + } +local s_sq_cbox = { + type = 'fixed', + fixed = { + {-0.4375, -0.5, -0.4375, 0.4375, 0.5, 0.4375}, + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + } + } +local smsq_cbox = { + type = 'fixed', + fixed = { + {-0.4375, -0.5, -0.4375, -0.0625, -0.3125, -0.0625}, + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.4375, -0.5, 0.0625, -0.0625, -0.3125, 0.4375}, + {0.0625, -0.5, -0.4375, 0.4375, -0.3125, -0.0625}, + {0.0625, -0.5, 0.0625, 0.4375, -0.3125, 0.4375}, + } + } +local s_smsq_cbox = { + type = 'fixed', + fixed = { + {-0.4375, -0.5, -0.4375, -0.0625, 0.5, -0.0625}, + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + {-0.4375, -0.5, 0.0625, -0.0625, 0.5, 0.4375}, + {0.0625, -0.5, -0.4375, 0.4375, 0.5, -0.0625}, + {0.0625, -0.5, 0.0625, 0.4375, 0.5, 0.4375}, + } + } +local xsmsq_cbox = { + type = 'fixed', + fixed = { + {-0.4375, -0.5, -0.4375, -0.1875, -0.3125, -0.1875}, + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.4375, -0.5, 0.1875, -0.1875, -0.3125, 0.4375}, + {0.1875, -0.5, -0.4375, 0.4375, -0.3125, -0.1875}, + {0.1875, -0.5, 0.1875, 0.4375, -0.3125, 0.4375}, + {-0.4375, -0.5, -0.125, -0.1875, -0.3125, 0.125}, + {-0.125, -0.5, 0.1875, 0.125, -0.3125, 0.4375}, + {-0.125, -0.5, -0.125, 0.125, -0.3125, 0.125}, + {0.1875, -0.5, -0.125, 0.4375, -0.3125, 0.125}, + {-0.125, -0.5, -0.4375, 0.125, -0.3125, -0.1875}, + } + } +local s_xsmsq_cbox = { + type = 'fixed', + fixed = { + {-0.4375, -0.5, -0.4375, -0.1875, 0.5, -0.1875}, + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + {-0.4375, -0.5, 0.1875, -0.1875, 0.5, 0.4375}, + {0.1875, -0.5, -0.4375, 0.4375, 0.5, -0.1875}, + {0.1875, -0.5, 0.1875, 0.4375, 0.5, 0.4375}, + {-0.4375, -0.5, -0.125, -0.1875, 0.5, 0.125}, + {-0.125, -0.5, 0.1875, 0.125, 0.5, 0.4375}, + {-0.125, -0.5, -0.125, 0.125, 0.5, 0.125}, + {0.1875, -0.5, -0.125, 0.4375, 0.5, 0.125}, + {-0.125, -0.5, -0.4375, 0.125, 0.5, -0.1875}, + } + } +local paver_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, 0.3125, -0.3125, -0.3125, 0.5}, + {-0.25, -0.5, 0.3125, -0.0625, -0.3125, 0.5}, + {-0.5, -0.5, 0.0625, -0.0625, -0.3125, 0.25}, + {0, -0.5, 0.0625, 0.1875, -0.3125, 0.5}, + {-0.5, -0.5, -0.4375, -0.3125, -0.3125, 0}, + {-0.25, -0.5, -0.1875, 0.1875, -0.3125, 0}, + {0.25, -0.5, 0.3125, 0.5, -0.3125, 0.5}, + {0.25, -0.5, -0.1875, 0.4375, -0.3125, 0.25}, + {-0.25, -0.5, -0.5, -0.0625, -0.3125, -0.25}, + {0, -0.5, -0.4375, 0.4375, -0.3125, -0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + } + } +local spaver_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, 0.3125, -0.3125, 0.5, 0.5}, + {-0.25, -0.5, 0.3125, -0.0625, 0.5, 0.5}, + {-0.5, -0.5, 0.0625, -0.0625, 0.5, 0.25}, + {0, -0.5, 0.0625, 0.1875, 0.5, 0.5}, + {-0.5, -0.5, -0.4375, -0.3125, 0.5, 0}, + {-0.25, -0.5, -0.1875, 0.1875, 0.5, 0}, + {0.25, -0.5, 0.3125, 0.5, 0.5, 0.5}, + {0.25, -0.5, -0.1875, 0.4375, 0.5, 0.25}, + {-0.25, -0.5, -0.5, -0.0625, 0.5, -0.25}, + {0, -0.5, -0.4375, 0.4375, 0.5, -0.25}, + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + } + } +local ashlar_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, 0.375, -0.375, -0.3125, 0.5}, + {-0.5, -0.5, 0.1875, -0.375, -0.3125, 0.3125}, + {-0.3125, -0.5, 0.1875, -0.0625, -0.3125, 0.5}, + {0, -0.5, 0.375, 0.25, -0.3125, 0.5}, + {0.3125, -0.5, 0.375, 0.5, -0.3125, 0.5}, + {-0.5, -0.5, -0.1875, -0.1875, -0.3125, 0.125}, + {-0.5, -0.5, -0.5, -0.375, -0.3125, -0.25}, + {-0.3125, -0.5, -0.375, -0.1875, -0.3125, -0.25}, + {-0.125, -0.5, -0.0625, -0.0625, -0.3125, 0.125}, + {-0.125, -0.5, -0.375, 0.0625, -0.3125, -0.125}, + {0, -0.5, -0.0625, 0.0625, -0.3125, 0}, + {0, -0.5, 0.0625, 0.3125, -0.3125, 0.3125}, + {0.375, -0.5, 0.1875, 0.5, -0.3125, 0.3125}, + {0.375, -0.5, -0.1875, 0.5, -0.3125, 0.125}, + {0.125, -0.5, -0.1875, 0.3125, -0.3125, 0}, + {0.125, -0.5, -0.375, 0.25, -0.3125, -0.25}, + {-0.3125, -0.5, -0.5, -0.0625, -0.3125, -0.4375}, + {0, -0.5, -0.5, 0.25, -0.3125, -0.4375}, + {0.3125, -0.5, -0.5, 0.5, -0.3125, -0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + } + } +local sashlar_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, 0.375, -0.375, 0.5, 0.5}, + {-0.5, -0.5, 0.1875, -0.375, 0.5, 0.3125}, + {-0.3125, -0.5, 0.1875, -0.0625, 0.5, 0.5}, + {0, -0.5, 0.375, 0.25, 0.5, 0.5}, + {0.3125, -0.5, 0.375, 0.5, 0.5, 0.5}, + {-0.5, -0.5, -0.1875, -0.1875, 0.5, 0.125}, + {-0.5, -0.5, -0.5, -0.375, 0.5, -0.25}, + {-0.3125, -0.5, -0.375, -0.1875, 0.5, -0.25}, + {-0.125, -0.5, -0.0625, -0.0625, 0.5, 0.125}, + {-0.125, -0.5, -0.375, 0.0625, 0.5, -0.125}, + {0, -0.5, -0.0625, 0.0625, 0.5, 0}, + {0, -0.5, 0.0625, 0.3125, 0.5, 0.3125}, + {0.375, -0.5, 0.1875, 0.5, 0.5, 0.3125}, + {0.375, -0.5, -0.1875, 0.5, 0.5, 0.125}, + {0.125, -0.5, -0.1875, 0.3125, 0.5, 0}, + {0.125, -0.5, -0.375, 0.25, 0.5, -0.25}, + {-0.3125, -0.5, -0.5, -0.0625, 0.5, -0.4375}, + {0, -0.5, -0.5, 0.25, 0.5, -0.4375}, + {0.3125, -0.5, -0.5, 0.5, 0.5, -0.25}, + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + } + } +local flag_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, 0.0625, -0.0625, -0.3125, 0.5}, + {-0.5, -0.5, -0.1875, -0.25, -0.3125, 0}, + {-0.5, -0.5, -0.4375, -0.25, -0.3125, -0.25}, + {0, -0.5, 0.3125, 0.4375, -0.3125, 0.5}, + {0, -0.5, 0.0625, 0.1875, -0.3125, 0.25}, + {-0.1875, -0.5, -0.4375, 0.1875, -0.3125, 0}, + {0.25, -0.5, -0.1875, 0.4375, -0.3125, 0.25}, + {0.25, -0.5, -0.4375, 0.5, -0.3125, -0.25}, + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + } + } +local sflag_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, 0.0625, -0.0625, 0.5, 0.5}, + {-0.5, -0.5, -0.1875, -0.25, 0.5, 0}, + {-0.5, -0.5, -0.4375, -0.25, 0.5, -0.25}, + {0, -0.5, 0.3125, 0.4375, 0.5, 0.5}, + {0, -0.5, 0.0625, 0.1875, 0.5, 0.25}, + {-0.1875, -0.5, -0.4375, 0.1875, 0.5, 0}, + {0.25, -0.5, -0.1875, 0.4375, 0.5, 0.25}, + {0.25, -0.5, -0.4375, 0.5, 0.5, -0.25}, + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + } + } +local pin_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.125, -0.25, -0.3125, 0.5}, + {-0.5, -0.5, -0.4375, 0.125, -0.3125, -0.1875}, + {0.1875, -0.5, -0.4375, 0.4375, -0.3125, 0.1875}, + {-0.1875, -0.5, 0.25, 0.4375, -0.3125, 0.5}, + {-0.1875, -0.5, -0.125, 0.125, -0.3125, 0.1875}, + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + } + } +local spin_cbox = { + type = 'fixed', + fixed = { + {-0.5, -0.5, -0.125, -0.25, 0.5, 0.5}, + {-0.5, -0.5, -0.4375, 0.125, 0.5, -0.1875}, + {0.1875, -0.5, -0.4375, 0.4375, 0.5, 0.1875}, + {-0.1875, -0.5, 0.25, 0.4375, 0.5, 0.5}, + {-0.1875, -0.5, -0.125, 0.125, 0.5, 0.1875}, + {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, + } + } + +local stone_types = { --style, desc, img1, img2 + {'square', 'Square', 'concrete', 'square',sq_cbox,s_sq_cbox}, + {'square_sm', 'Small Square', 'concrete', 'square_sm',smsq_cbox,s_smsq_cbox}, + {'square_xsm', 'Extra Small Square', 'concrete', 'square_xsm',xsmsq_cbox,s_xsmsq_cbox}, + {'pavers', 'Paver', 'concrete', 'pavers',paver_cbox,spaver_cbox}, + {'ashlar', 'Ashlar', 'concrete', 'ashlar',ashlar_cbox,sashlar_cbox}, + {'flagstone', 'Flagstone', 'concrete', 'flagstone',flag_cbox,sflag_cbox}, + {'pinwheel', 'Pinwheel', 'concrete', 'pinwheel',pin_cbox,spin_cbox}, +} +for i in ipairs (stone_types) do + local style = stone_types[i][1] + local desc = stone_types[i][2] + local img1 = stone_types[i][3] + local img2 = stone_types[i][4] + local cbox = stone_types[i][5] + local scbox = stone_types[i][6] + local color_tab = { + {'black', 'Black', '^[multiply:#2c2c2c'}, + {'blue', 'Blue', '^[multiply:#0041f4'}, + {'brown', 'Brown', '^[multiply:#6c3800'}, + {'cyan', 'Cyan', '^[multiply:cyan'}, + {'dark_green', 'Dark Green', '^[multiply:#2b7b00'}, + {'dark_grey', 'Dark Grey', '^[multiply:#464646'}, + {'green', 'Green', '^[multiply:#67eb1c'}, + {'grey', 'Grey', '^[multiply:#818181'}, + {'magenta', 'Magenta', '^[multiply:#d80481'}, + {'orange', 'Orange', '^[multiply:#e0601a'}, + {'pink', 'Pink', '^[multiply:#ffa5a5'}, + {'red', 'Red', '^[multiply:#c91818'}, + {'violet', 'Violet', '^[multiply:#480680'}, + {'white', 'White', '^[multiply:white'}, + {'yellow', 'Yellow', '^[multiply:#fcf611'}, + {'cement', 'Concrete', ''}, + } + + for i in ipairs (color_tab) do + local col = color_tab[i][1] + local coldesc = color_tab[i][2] + local alpha = color_tab[i][3] + + minetest.register_alias('mylandscaping:stone_'..style,'mylandscaping:stone_'..style..'cement') + + minetest.register_node('mylandscaping:stone_'..style..col,{ + description = desc..' Patio Stone '..coldesc, + drawtype = 'nodebox', + tiles = { + 'mylandscaping_'..img1..'.png^mylandscaping_'..img2..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + }, + paramtype = 'light', + groups = {cracky = 2, not_in_creative_inventory=ml_visible, ml=1,}, + node_box = cbox, + selection_box = stone_cbox, + collision_box = stone_cbox, + sounds = default.node_sound_stone_defaults(), + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local nodeu = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + if minetest.get_item_group(nodeu, 'sand') > 0 then + minetest.set_node({x=pos.x, y=pos.y-1, z=pos.z},{name = 'mylandscaping:stone_'..style..'_sand'..col}) + minetest.set_node(pos,{name = 'air'}) + end + end, + + }) + minetest.register_node('mylandscaping:stone_'..style..'_sand'..col,{ + description = desc..' Patio Stone in Sand '..coldesc, + drawtype = 'nodebox', + tiles = { + 'mylandscaping_'..img1..'.png^mylandscaping_'..img2..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + 'mylandscaping_'..img1..'.png'..alpha, + }, + drop = 'mylandscaping:stone_'..style, + paramtype = 'light', + groups = {cracky = 2, not_in_creative_inventory = 1}, + node_box = scbox, + selection_box = sstone_cbox, + collision_box = sstone_cbox, + sounds = default.node_sound_stone_defaults(), + after_dig_node = function(pos, oldnode, oldmetadata, digger) + minetest.set_node(pos,{name = 'default:silver_sand'}) + end, + }) + end +end diff --git a/mods/mylandscaping/textures/Dragon_AO.png b/mods/mylandscaping/textures/Dragon_AO.png new file mode 100644 index 00000000..417ea505 Binary files /dev/null and b/mods/mylandscaping/textures/Dragon_AO.png differ diff --git a/mods/mylandscaping/textures/Dragon_UV.png b/mods/mylandscaping/textures/Dragon_UV.png new file mode 100644 index 00000000..157ad963 Binary files /dev/null and b/mods/mylandscaping/textures/Dragon_UV.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_adaridge_tex.png b/mods/mylandscaping/textures/mylandscaping_adaridge_tex.png new file mode 100644 index 00000000..56cb875a Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_adaridge_tex.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_adaridge_tex.xcf b/mods/mylandscaping/textures/mylandscaping_adaridge_tex.xcf new file mode 100644 index 00000000..71917033 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_adaridge_tex.xcf differ diff --git a/mods/mylandscaping/textures/mylandscaping_adaridge_tex_normal.png b/mods/mylandscaping/textures/mylandscaping_adaridge_tex_normal.png new file mode 100644 index 00000000..8333b213 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_adaridge_tex_normal.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_ashlar.png b/mods/mylandscaping/textures/mylandscaping_ashlar.png new file mode 100644 index 00000000..e247d30f Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_ashlar.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_background.png b/mods/mylandscaping/textures/mylandscaping_background.png new file mode 100644 index 00000000..c0490344 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_background.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_background2.png b/mods/mylandscaping/textures/mylandscaping_background2.png new file mode 100644 index 00000000..f8e8c508 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_background2.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_base.png b/mods/mylandscaping/textures/mylandscaping_base.png new file mode 100644 index 00000000..3c49627d Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_base.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_block_smooth.png b/mods/mylandscaping/textures/mylandscaping_block_smooth.png new file mode 100644 index 00000000..91049bcc Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_block_smooth.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_block_smooth_normal.png b/mods/mylandscaping/textures/mylandscaping_block_smooth_normal.png new file mode 100644 index 00000000..a6e741cf Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_block_smooth_normal.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_block_split.png b/mods/mylandscaping/textures/mylandscaping_block_split.png new file mode 100644 index 00000000..54574a2d Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_block_split.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_block_split_normal.png b/mods/mylandscaping/textures/mylandscaping_block_split_normal.png new file mode 100644 index 00000000..55fec9b5 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_block_split_normal.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_cement.png b/mods/mylandscaping/textures/mylandscaping_cement.png new file mode 100644 index 00000000..6d7b4395 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_cement.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_cement_bag.png b/mods/mylandscaping/textures/mylandscaping_cement_bag.png new file mode 100644 index 00000000..d735a9fb Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_cement_bag.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_cement_normal.png b/mods/mylandscaping/textures/mylandscaping_cement_normal.png new file mode 100644 index 00000000..643a8975 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_cement_normal.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_concrete.png b/mods/mylandscaping/textures/mylandscaping_concrete.png new file mode 100644 index 00000000..4242f8ac Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_concrete.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_crusher.png b/mods/mylandscaping/textures/mylandscaping_crusher.png new file mode 100644 index 00000000..802c346a Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_crusher.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_deco_column.png b/mods/mylandscaping/textures/mylandscaping_deco_column.png new file mode 100644 index 00000000..168218d4 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_deco_column.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_deco_flat.png b/mods/mylandscaping/textures/mylandscaping_deco_flat.png new file mode 100644 index 00000000..985ef23e Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_deco_flat.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_deco_peak.png b/mods/mylandscaping/textures/mylandscaping_deco_peak.png new file mode 100644 index 00000000..10460740 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_deco_peak.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_deco_random.png b/mods/mylandscaping/textures/mylandscaping_deco_random.png new file mode 100644 index 00000000..8c5128a6 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_deco_random.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_deco_scallop.png b/mods/mylandscaping/textures/mylandscaping_deco_scallop.png new file mode 100644 index 00000000..a2576c0f Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_deco_scallop.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_dragon.png b/mods/mylandscaping/textures/mylandscaping_dragon.png new file mode 100644 index 00000000..c280f44d Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_dragon.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_flagstone.png b/mods/mylandscaping/textures/mylandscaping_flagstone.png new file mode 100644 index 00000000..7ba0a9c0 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_flagstone.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_hopper.png b/mods/mylandscaping/textures/mylandscaping_hopper.png new file mode 100644 index 00000000..0b3bf80e Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_hopper.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_madison_stone.png b/mods/mylandscaping/textures/mylandscaping_madison_stone.png new file mode 100644 index 00000000..017b9d68 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_madison_stone.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_madison_wood.png b/mods/mylandscaping/textures/mylandscaping_madison_wood.png new file mode 100644 index 00000000..6a7f8787 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_madison_wood.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_pavers.png b/mods/mylandscaping/textures/mylandscaping_pavers.png new file mode 100644 index 00000000..1f828b8b Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_pavers.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_pinwheel.png b/mods/mylandscaping/textures/mylandscaping_pinwheel.png new file mode 100644 index 00000000..afb3c6b8 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_pinwheel.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_square.png b/mods/mylandscaping/textures/mylandscaping_square.png new file mode 100644 index 00000000..ea9eb68a Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_square.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_square_sm.png b/mods/mylandscaping/textures/mylandscaping_square_sm.png new file mode 100644 index 00000000..5c3cbe38 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_square_sm.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_square_xsm.png b/mods/mylandscaping/textures/mylandscaping_square_xsm.png new file mode 100644 index 00000000..13b6e567 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_square_xsm.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_supports.png b/mods/mylandscaping/textures/mylandscaping_supports.png new file mode 100644 index 00000000..6bb8cade Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_supports.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_tex1.png b/mods/mylandscaping/textures/mylandscaping_tex1.png new file mode 100644 index 00000000..adae380c Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_tex1.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_tex2.png b/mods/mylandscaping/textures/mylandscaping_tex2.png new file mode 100644 index 00000000..7921fdfc Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_tex2.png differ diff --git a/mods/mylandscaping/textures/mylandscaping_tex3.png b/mods/mylandscaping/textures/mylandscaping_tex3.png new file mode 100644 index 00000000..818a0b57 Binary files /dev/null and b/mods/mylandscaping/textures/mylandscaping_tex3.png differ diff --git a/mods/mylandscaping/toppers.lua b/mods/mylandscaping/toppers.lua new file mode 100644 index 00000000..98f4fb88 --- /dev/null +++ b/mods/mylandscaping/toppers.lua @@ -0,0 +1,47 @@ +local block_type1 = { -- desc2, obj, texture +{'Sphere', 'sphere', 'concrete'}, +{'Suzanne', 'suzanne', 'concrete'}, +{'Dragon', 'dragon', 'dragon'}, +{'Cross', 'cross', 'concrete'}, +} + +for i in ipairs (block_type1) do + local desc2 = block_type1[i][1] + local obj = block_type1[i][2] + local tex = block_type1[i][3] + local color_tab = { + {'black', 'Black', '^[multiply:#2c2c2c'}, + {'blue', 'Blue', '^[multiply:#0041f4'}, + {'brown', 'Brown', '^[multiply:#6c3800'}, + {'cyan', 'Cyan', '^[multiply:cyan'}, + {'dark_green', 'Dark Green', '^[multiply:#2b7b00'}, + {'dark_grey', 'Dark Grey', '^[multiply:#464646'}, + {'green', 'Green', '^[multiply:#67eb1c'}, + {'grey', 'Grey', '^[multiply:#818181'}, + {'magenta', 'Magenta', '^[multiply:#d80481'}, + {'orange', 'Orange', '^[multiply:#e0601a'}, + {'pink', 'Pink', '^[multiply:#ffa5a5'}, + {'red', 'Red', '^[multiply:#c91818'}, + {'violet', 'Violet', '^[multiply:#480680'}, + {'white', 'White', '^[multiply:white'}, + {'yellow', 'Yellow', '^[multiply:#fcf611'}, + {'cement', 'Concrete', ''}, + } + + for i in ipairs (color_tab) do + local col = color_tab[i][1] + local coldesc = color_tab[i][2] + local alpha = color_tab[i][3] + + minetest.register_node('mylandscaping:column_t_'..obj..'_'..col, { + description = desc2..' topper', + drawtype = 'mesh', + mesh = 'mylandscaping_column_t_'..obj..'.obj', + tiles = {name='mylandscaping_'..tex..'.png'..alpha}, + groups = {cracky=2, not_in_creative_inventory=ml_visible, ml=1}, + paramtype = 'light', + paramtype2 = 'facedir', + sounds = default.node_sound_stone_defaults(), + }) + end +end diff --git a/mods/mylandscaping/walls_adaridge.lua b/mods/mylandscaping/walls_adaridge.lua new file mode 100644 index 00000000..71171982 --- /dev/null +++ b/mods/mylandscaping/walls_adaridge.lua @@ -0,0 +1,114 @@ +local colbox_type1 = { --top blocks + type = 'fixed', + fixed = {{-.49, -.5, 0.05, .5, .5, .52}} +} +local colbox_type2 = { --outside corner columns + type = 'fixed', + fixed = {{-.2, -.5, -.2, .5, .5, .5}} +} +local colbox_type3 = { --bottom blocks + type = 'fixed', + fixed = {{-.5, -.5, -.16, .5, .5, .25}} +} +local colbox_type4 = { --inside corner + type = 'fixed', + fixed = {{-.5, -.5, 0, .5, .5, .5}, + {0, -.5, -.5, .5, .5, .5}} +} +local colbox_type5 = { --inside corner column + type = 'fixed', + fixed = {{-.5, -.5, -.5, .5, .5, .5},} +} +local colbox_type6 = { --middle column + type = 'fixed', + fixed = {{-.5, -.5, -.3, .5, .5, .5},} +} + +local colbox_type7 = { --outside corner + type = 'fixed', + fixed = {{-.5, -.5, -.3, .5, .5, .5},} +} + +local block_type1 = { -- desc2, typ, obj, colbox, drops, grup +{'Adaridge Left', 'left', 'blocka_l_t', colbox_type1, 'left', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Adaridge Middle', 'middle', 'blocka_m_t', colbox_type1, 'middle', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Adaridge Right', 'right', 'blocka_r_t', colbox_type1, 'right', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Adaridge Inside Corner', 'icorner', 'blocka_ic_t', colbox_type4, 'icorner', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Adaridge Outside Corner', 'ocorner', 'blocka_oc_t', colbox_type2, 'ocorner', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Hax0r', 'bleft', 'blocka_l_b', colbox_type3, 'left', {not_in_creative_inventory=1}}, +{'Hax0r', 'bmiddle', 'blocka_m_b', colbox_type3, 'middle', {not_in_creative_inventory=1}}, +{'Hax0r', 'bright', 'blocka_r_b', colbox_type3, 'right', {not_in_creative_inventory=1}}, +{'Hax0r', 'bicorner', 'blocka_ic_b', colbox_type4, 'icorner', {not_in_creative_inventory=1}}, +{'Hax0r', 'bocorner', 'blocka_oc_b', colbox_type2, 'ocorner', {not_in_creative_inventory=1}}, +{'Adaridge Column (IC)', 'column_ic_t', 'columna_ic_t', colbox_type5, 'column_ic_t', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Adaridge Column (OC)', 'column_oc_t', 'columna_oc_t', colbox_type2, 'column_oc_t', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Adaridge Column (M)', 'column_m_t', 'columna_m_t', colbox_type6, 'column_m_t', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Hax0r', 'bcolumn_ic_t', 'columna_ic_b', colbox_type5, 'column_ic_b', {not_in_creative_inventory=1}}, +{'Hax0r', 'bcolumn_oc_t', 'columna_oc_b', colbox_type2, 'column_oc_b', {not_in_creative_inventory=1}}, +{'Hax0r', 'bcolumn_m_t', 'columna_m_b', colbox_type6, 'column_m_b', {not_in_creative_inventory=1}}, +} +for i in ipairs (block_type1) do + local desc2 = block_type1[i][1] + local typ = block_type1[i][2] + local obj = block_type1[i][3] + local colbox = block_type1[i][4] + local drops = block_type1[i][5] + local grup = block_type1[i][6] + local color_tab = { + {'black', 'Black', '^[multiply:#2c2c2c'}, + {'blue', 'Blue', '^[multiply:#0041f4'}, + {'brown', 'Brown', '^[multiply:#6c3800'}, + {'cyan', 'Cyan', '^[multiply:cyan'}, + {'dark_green', 'Dark Green', '^[multiply:#2b7b00'}, + {'dark_grey', 'Dark Grey', '^[multiply:#464646'}, + {'green', 'Green', '^[multiply:#67eb1c'}, + {'grey', 'Grey', '^[multiply:#818181'}, + {'magenta', 'Magenta', '^[multiply:#d80481'}, + {'orange', 'Orange', '^[multiply:#e0601a'}, + {'pink', 'Pink', '^[multiply:#ffa5a5'}, + {'red', 'Red', '^[multiply:#c91818'}, + {'violet', 'Violet', '^[multiply:#480680'}, + {'white', 'White', '^[multiply:white'}, + {'yellow', 'Yellow', '^[multiply:#fcf611'}, + {'cement', 'Concrete', ''}, + } + for i in ipairs (color_tab) do + local col = color_tab[i][1] + local coldesc = color_tab[i][2] + local alpha = color_tab[i][3] + + minetest.register_node('mylandscaping:awall_'..typ..'_'..col, { + description = desc2..' '..coldesc, + drawtype = 'mesh', + mesh = 'mylandscaping_'..obj..'.obj', + tiles = {name='mylandscaping_adaridge_tex.png'..alpha}, + groups = grup, + paramtype = 'light', + paramtype2 = 'facedir', + drop = 'mylandscaping:awall_'..drops..'_'..col, + selection_box = colbox, + collision_box = colbox, + sounds = default.node_sound_stone_defaults(), + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + local nodea = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + local node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + if nodeu.name == 'mylandscaping:awall_'..typ..'_'..col then + minetest.swap_node(pos,{name='mylandscaping:awall_'..typ..'_'..col,param2=nodeu.param2}) + minetest.swap_node({x=pos.x,y=pos.y-1,z=pos.z},{name='mylandscaping:awall_b'..typ..'_'..col,param2=nodeu.param2}) + end + if nodea.name == 'mylandscaping:awall_'..typ..'_'..col then + minetest.swap_node(pos,{name='mylandscaping:awall_b'..typ..'_'..col,param2=nodea.param2}) + end + end, + + after_destruct = function(pos, oldnode) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if nodeu.name == 'mylandscaping:awall_b'..typ..'_'..col then + minetest.swap_node({x=pos.x,y=pos.y-1,z=pos.z},{name='mylandscaping:awall_'..typ..'_'..col,param2=nodeu.param2}) + end + end, + }) + end +end diff --git a/mods/mylandscaping/walls_deco.lua b/mods/mylandscaping/walls_deco.lua new file mode 100644 index 00000000..94428bb3 --- /dev/null +++ b/mods/mylandscaping/walls_deco.lua @@ -0,0 +1,83 @@ +local colbox_type1 = { --column + type = "fixed", + fixed = {{.1, -.5, .1, .5, 0, .5},} -- Right, Bottom, Back, Left, Top, Front +} +local colbox_type2 = { --wall + type = "fixed", + fixed = {{-.5, -.5, .4, .5, 0, .2},} +} + +local block_type1 = { -- desc2, obj, colbox, grup, +{"Deco Wall Scalloped", "wall_s", colbox_type2, {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{"Deco Wall Flat Top", "wall_f", colbox_type2, {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Deco Wall Peaked Top', 'wall_p', colbox_type2, {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Deco Wall Random Top', 'wall_r', colbox_type2, {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{"Deco Wall Column", "column", colbox_type1, {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +} +for i in ipairs (block_type1) do + local desc2 = block_type1[i][1] + local obj = block_type1[i][2] + local colbox = block_type1[i][3] + local grup = block_type1[i][4] + local color_tab = { + {'black', 'Black', '^[multiply:#2c2c2c'}, + {'blue', 'Blue', '^[multiply:#0041f4'}, + {'brown', 'Brown', '^[multiply:#6c3800'}, + {'cyan', 'Cyan', '^[multiply:cyan'}, + {'dark_green', 'Dark Green', '^[multiply:#2b7b00'}, + {'dark_grey', 'Dark Grey', '^[multiply:#464646'}, + {'green', 'Green', '^[multiply:#67eb1c'}, + {'grey', 'Grey', '^[multiply:#818181'}, + {'magenta', 'Magenta', '^[multiply:#d80481'}, + {'orange', 'Orange', '^[multiply:#e0601a'}, + {'pink', 'Pink', '^[multiply:#ffa5a5'}, + {'red', 'Red', '^[multiply:#c91818'}, + {'violet', 'Violet', '^[multiply:#480680'}, + {'white', 'White', '^[multiply:white'}, + {'yellow', 'Yellow', '^[multiply:#fcf611'}, + {'cement', 'Concrete', ''}, + } + for i in ipairs (color_tab) do + local col = color_tab[i][1] + local coldesc = color_tab[i][2] + local alpha = color_tab[i][3] + + minetest.register_node('mylandscaping:deco_'..obj..'_'..col, { + description = desc2.." "..coldesc, + drawtype = 'mesh', + mesh = 'mylandscaping_deco_'..obj..'.obj', + tiles = {{name='mylandscaping_block_split.png'..alpha}, {name='mylandscaping_block_smooth.png'..alpha}}, + groups = grup, + paramtype = 'light', + paramtype2 = 'facedir', + selection_box = colbox, + collision_box = colbox, + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_node('mylandscaping:deco_column_light_'..col, { + description = coldesc..'lighted column', + drawtype = 'mesh', + mesh = 'mylandscaping_deco_column_l.obj', + tiles = { + {name='mylandscaping_block_split.png'..alpha}, + {name='mylandscaping_block_smooth.png'..alpha}, + {name='mylandscaping_block_smooth.png^[colorize:yellow:255'}, + {name='mylandscaping_block_smooth.png^[colorize:#190B07:200'}}, + groups = grup, + paramtype = 'light', + paramtype2 = 'facedir', + light_source = LIGHT_MAX, + selection_box = colbox_type1, + collision_box = colbox_type1, + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_craft({ + type = 'shapeless', + output = 'mylandscaping:deco_column_light_'..col, + recipe = {'default:torch', 'mylandscaping:deco_column_'..col} + }) + + end +end diff --git a/mods/mylandscaping/walls_freeport.lua b/mods/mylandscaping/walls_freeport.lua new file mode 100644 index 00000000..f5de56b3 --- /dev/null +++ b/mods/mylandscaping/walls_freeport.lua @@ -0,0 +1,107 @@ +local colbox_type1 = { --top blocks + type = 'fixed', + fixed = {{-.49, -.5, 0.05, .5, .5, .52}} +} +local colbox_type2 = { --columns + type = 'fixed', + fixed = {{-.2, -.5, -.2, .5, .5, .5}} +} +local colbox_type3 = { --bottom blocks + type = 'fixed', + fixed = {{-.5, -.5, -.16, .5, .5, .25}} +} +local colbox_type4 = { --corner + type = 'fixed', + fixed = {{-.5, -.5, 0, .5, .5, .5}, + {0, -.5, -.5, .5, .5, .5}} +} +local colbox_type5 = { --corner + type = 'fixed', + fixed = {{-.5, -.5, -.5, .5, .5, .5},} +} +local colbox_type6 = { --corner + type = 'fixed', + fixed = {{-.5, -.5, -.3, .5, .5, .5},} +} + +local block_type1 = { -- desc2, typ, obj, colbox, drops, grup +{'Freeport Left', 'left', 'blockf_l_t', colbox_type1, 'left', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Freeport Middle', 'middle', 'blockf_m_t', colbox_type1, 'middle', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Freeport Right', 'right', 'blockf_r_t', colbox_type1, 'right', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Freeport Inside Corner', 'corner', 'blockf_c_t', colbox_type4, 'corner', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Hax0r', 'bleft', 'blockf_l_b', colbox_type3, 'left', {not_in_creative_inventory=1}}, +{'Hax0r', 'bmiddle', 'blockf_m_b', colbox_type3, 'middle', {not_in_creative_inventory=1}}, +{'Hax0r', 'bright', 'blockf_r_b', colbox_type3, 'right', {not_in_creative_inventory=1}}, +{'Hax0r', 'bcorner', 'blockf_c_b', colbox_type4, 'corner', {not_in_creative_inventory=1}}, +{'Freeport Column (IC)', 'column_ic_t', 'columnf_ic_t', colbox_type5, 'column_ic_t', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Freeport Column (OC)', 'column_oc_t', 'columnf_oc_t', colbox_type2, 'column_oc_t', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Freeport Column (M)', 'column_m_t', 'columnf_m_t', colbox_type6, 'column_m_t', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Hax0r', 'bcolumn_ic_t', 'columnf_ic_b', colbox_type5, 'column_ic_b', {not_in_creative_inventory=1}}, +{'Hax0r', 'bcolumn_oc_t', 'columnf_oc_b', colbox_type2, 'column_oc_b', {not_in_creative_inventory=1}}, +{'Hax0r', 'bcolumn_m_t', 'columnf_m_b', colbox_type6, 'column_m_b', {not_in_creative_inventory=1}}, +} +for i in ipairs (block_type1) do + local desc2 = block_type1[i][1] + local typ = block_type1[i][2] + local obj = block_type1[i][3] + local colbox = block_type1[i][4] + local drops = block_type1[i][5] + local grup = block_type1[i][6] + local color_tab = { + {'black', 'Black', '^[multiply:#2c2c2c'}, + {'blue', 'Blue', '^[multiply:#0041f4'}, + {'brown', 'Brown', '^[multiply:#6c3800'}, + {'cyan', 'Cyan', '^[multiply:cyan'}, + {'dark_green', 'Dark Green', '^[multiply:#2b7b00'}, + {'dark_grey', 'Dark Grey', '^[multiply:#464646'}, + {'green', 'Green', '^[multiply:#67eb1c'}, + {'grey', 'Grey', '^[multiply:#818181'}, + {'magenta', 'Magenta', '^[multiply:#d80481'}, + {'orange', 'Orange', '^[multiply:#e0601a'}, + {'pink', 'Pink', '^[multiply:#ffa5a5'}, + {'red', 'Red', '^[multiply:#c91818'}, + {'violet', 'Violet', '^[multiply:#480680'}, + {'white', 'White', '^[multiply:white'}, + {'yellow', 'Yellow', '^[multiply:#fcf611'}, + {'cement', 'Concrete', ''}, + } + for i in ipairs (color_tab) do + local col = color_tab[i][1] + local coldesc = color_tab[i][2] + local alpha = color_tab[i][3] + + minetest.register_node('mylandscaping:fwall_'..typ..'_'..col, { + description = desc2..' '..coldesc, + drawtype = 'mesh', + mesh = 'mylandscaping_'..obj..'.obj', + tiles = {{name='mylandscaping_block_smooth.png'..alpha}, {name='mylandscaping_block_split.png'..alpha}}, + groups = grup, + paramtype = 'light', + paramtype2 = 'facedir', + drop = 'mylandscaping:fwall_'..drops..'_'..col, + selection_box = colbox, + collision_box = colbox, + sounds = default.node_sound_stone_defaults(), + + after_place_node = function(pos, placer, itemstack) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + local nodea = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if nodeu.name == 'mylandscaping:fwall_'..typ..'_'..col then + minetest.swap_node(pos,{name='mylandscaping:fwall_'..typ..'_'..col,param2=nodeu.param2}) + minetest.swap_node({x=pos.x,y=pos.y-1,z=pos.z},{name='mylandscaping:fwall_b'..typ..'_'..col,param2=nodeu.param2}) + end + if nodea.name == 'mylandscaping:fwall_'..typ..'_'..col then + minetest.swap_node(pos,{name='mylandscaping:fwall_b'..typ..'_'..col,param2=nodea.param2}) + end + end, + + after_destruct = function(pos, oldnode) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if nodeu.name == 'mylandscaping:fwall_b'..typ..'_'..col then + minetest.swap_node({x=pos.x,y=pos.y-1,z=pos.z},{name='mylandscaping:fwall_'..typ..'_'..col,param2=nodeu.param2}) + end + end, + + }) + end +end diff --git a/mods/mylandscaping/walls_madison.lua b/mods/mylandscaping/walls_madison.lua new file mode 100644 index 00000000..14d7df45 --- /dev/null +++ b/mods/mylandscaping/walls_madison.lua @@ -0,0 +1,100 @@ +local colbox_type1 = { --top blocks + type = 'fixed', + fixed = {-.5, -.5, -.2, .5, .5, .5} +} +local colbox_type2 = { --bottom blocks + type = 'fixed', + fixed = {-.5, -.5, -.2, .5, .5, .5} +} +local colbox_type3 = { --top inside corner + type = 'fixed', + fixed = {{-.2, -.5, -.5, .5, .5, .5}, + {-.5, -.5, -.2, .5, .5, .5}} +} +local colbox_type4 = { --bottom inside corner + type = 'fixed', + fixed = {{-.2, -.5, -.5, .5, .5, .5}, + {-.5, -.5, -.2, .5, .5, .5}} +} +local colbox_type5 = { --top outside corner + type = 'fixed', + fixed = {-.2, -.5, -.2, .5, .5, .5} +} +local colbox_type6 = { --bottom outside corner + type = 'fixed', + fixed = {-.2, -.5, -.2, .5, .5, .5} +} + +local block_type1 = { -- desc2, typ, obj, colbox, drops, grup +{'Madison Middle', 'middle', 'blockm_m_t', colbox_type1, 'middle', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Hax0r', 'bmiddle', 'blockm_m_b', colbox_type2, 'middle', {not_in_creative_inventory=1}}, +{'Madison Inside Corner', 'icorner', 'blockm_ic_t', colbox_type3, 'icorner', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Hax0r', 'bicorner', 'blockm_ic_b', colbox_type4, 'icorner', {not_in_creative_inventory=1}}, +{'Madison Outside Corner', 'ocorner', 'blockm_oc_t', colbox_type5, 'ocorner', {ml=1,cracky=2,not_in_creative_inventory=ml_visible}}, +{'Hax0r', 'bocorner', 'blockm_oc_b', colbox_type6, 'ocorner', {not_in_creative_inventory=1}}, +} + +for i in ipairs (block_type1) do + local desc2 = block_type1[i][1] + local typ = block_type1[i][2] + local obj = block_type1[i][3] + local colbox = block_type1[i][4] + local drops = block_type1[i][5] + local grup = block_type1[i][6] + local color_tab = { + {'black', 'Black', '^[multiply:#2c2c2c'}, + {'blue', 'Blue', '^[multiply:#0041f4'}, + {'brown', 'Brown', '^[multiply:#6c3800'}, + {'cyan', 'Cyan', '^[multiply:cyan'}, + {'dark_green', 'Dark Green', '^[multiply:#2b7b00'}, + {'dark_grey', 'Dark Grey', '^[multiply:#464646'}, + {'green', 'Green', '^[multiply:#67eb1c'}, + {'grey', 'Grey', '^[multiply:#818181'}, + {'magenta', 'Magenta', '^[multiply:#d80481'}, + {'orange', 'Orange', '^[multiply:#e0601a'}, + {'pink', 'Pink', '^[multiply:#ffa5a5'}, + {'red', 'Red', '^[multiply:#c91818'}, + {'violet', 'Violet', '^[multiply:#480680'}, + {'white', 'White', '^[multiply:white'}, + {'yellow', 'Yellow', '^[multiply:#fcf611'}, + {'cement', 'Concrete', ''}, + } + for i in ipairs (color_tab) do + local col = color_tab[i][1] + local coldesc = color_tab[i][2] + local alpha = color_tab[i][3] + + minetest.register_node('mylandscaping:mwall_'..typ..'_'..col, { + description = desc2..' '..coldesc, + drawtype = 'mesh', + mesh = 'mylandscaping_'..obj..'.obj', + tiles = {{name='mylandscaping_madison_wood.png'}, {name='mylandscaping_madison_stone.png'..alpha}}, + groups = grup, + paramtype = 'light', + paramtype2 = 'facedir', + drop = 'mylandscaping:mwall_'..drops..'_'..col, + selection_box = colbox, + collision_box = colbox, + sounds = default.node_sound_stone_defaults(), + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + local nodea = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}) + if nodeu.name == 'mylandscaping:mwall_'..typ..'_'..col then + minetest.swap_node(pos,{name='mylandscaping:mwall_'..typ..'_'..col,param2=nodeu.param2}) + minetest.swap_node({x=pos.x,y=pos.y-1,z=pos.z},{name='mylandscaping:mwall_b'..typ..'_'..col,param2=nodeu.param2}) + end + if nodea.name == 'mylandscaping:mwall_'..typ..'_'..col then + minetest.swap_node(pos,{name='mylandscaping:mwall_b'..typ..'_'..col,param2=nodea.param2}) + end + end, + + after_destruct = function(pos, oldnode) + local nodeu = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if nodeu.name == 'mylandscaping:mwall_b'..typ..'_'..col then + minetest.swap_node({x=pos.x,y=pos.y-1,z=pos.z},{name='mylandscaping:mwall_'..typ..'_'..col,param2=nodeu.param2}) + end + end, + }) + end +end diff --git a/mods/prefab_redo/LICENSE b/mods/prefab_redo/LICENSE new file mode 100644 index 00000000..68a49daa --- /dev/null +++ b/mods/prefab_redo/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/mods/prefab_redo/README b/mods/prefab_redo/README new file mode 100644 index 00000000..18ea219c --- /dev/null +++ b/mods/prefab_redo/README @@ -0,0 +1,8 @@ +prefab_redo +=========== + +This is a rewrite of Dan Duncombe's prefab mod for Minetest. It includes many of the same nodes (and aliases for compatibility), but not the electric fence. All items have been retextured using technic concrete as a base. + +Dependencies: default, doors, concrete (from technic), moreblocks + +License: Unlicense, see LICENSE file for full text diff --git a/mods/prefab_redo/depends.txt b/mods/prefab_redo/depends.txt new file mode 100644 index 00000000..7af3d830 --- /dev/null +++ b/mods/prefab_redo/depends.txt @@ -0,0 +1,3 @@ +default +doors +basic_materials diff --git a/mods/prefab_redo/description.txt b/mods/prefab_redo/description.txt new file mode 100644 index 00000000..e0f913e5 --- /dev/null +++ b/mods/prefab_redo/description.txt @@ -0,0 +1 @@ +A rewrite of Dan Duncombe's prefab mod. diff --git a/mods/prefab_redo/init.lua b/mods/prefab_redo/init.lua new file mode 100644 index 00000000..7b28b844 --- /dev/null +++ b/mods/prefab_redo/init.lua @@ -0,0 +1,245 @@ +--Prefab Redo Mod +--Written by cheapie +--See LICENSE file for license information + +minetest.register_alias("prefab:concrete","technic:concrete") +minetest.register_alias("prefab:concrete_wall","prefab_redo:concrete_wall") +minetest.register_alias("prefab:concrete_with_grass","prefab_redo:concrete_with_grass") +minetest.register_alias("prefab:concrete_ladder","prefab_redo:concrete_ladder") +minetest.register_alias("prefab:concrete_door_a","doors:door_concrete_a") +minetest.register_alias("prefab:concrete_door_b","doors:door_concrete_b") +minetest.register_alias("prefab:concrete_fence","prefab_redo:concrete_wall") +minetest.register_alias("prefab:concrete_bollard","prefab_redo:concrete_wall") +minetest.register_alias("prefab:concrete_railing","prefab_redo:concrete_railing") +minetest.register_alias("prefab:concrete_railing_corner","prefab_redo:concrete_railing") +minetest.register_alias("prefab:concrete_catwalk","prefab_redo:concrete_catwalk") +minetest.register_alias("prefab:concrete_bench","prefab_redo:concrete_bench") + +minetest.register_node("prefab_redo:concrete_with_grass", { + description = "Concrete with Grass", + sounds = default.node_sound_glass_defaults(), + paramtype = "light", + tiles = { + "default_grass.png", + "basic_materials_concrete_block.png", + "basic_materials_concrete_block.png^default_grass_side.png" + }, + groups = {cracky = 1}, +}) + +minetest.register_node("prefab_redo:concrete_wall", { + description = "Concrete Wall", + sounds = default.node_sound_stone_defaults(), + paramtype = "light", + drawtype = "nodebox", + tiles = {"basic_materials_concrete_block.png"}, + sunlight_propagates = true, + groups = {cracky = 1}, + node_box = { + type = "connected", + fixed = {{-0.3, -0.5, -0.3, 0.3, -0.4, 0.3}, {-0.1, -0.5, -0.1, 0.1, 0.5, 0.1}}, + connect_front = {{-0.3, -0.5, -0.5, 0.3, -0.4, 0.3}, {-0.1, -0.5, -0.5, 0.1, 0.5, 0.1}}, + connect_back = {{-0.3, -0.5, -0.3, 0.3, -0.4, 0.5}, {-0.1, -0.5, -0.1, 0.1, 0.5, 0.5}}, + connect_left = {{-0.5, -0.5, -0.3, 0.3, -0.4, 0.3}, {-0.5, -0.5, -0.1, 0.1, 0.5, 0.1}}, + connect_right = {{-0.3, -0.5, -0.3, 0.5, -0.4, 0.3}, {-0.1, -0.5, -0.1, 0.5, 0.5, 0.1}}, + }, + connects_to = {"prefab_redo:concrete_wall","prefab_redo:concrete_wall_upper"}, + on_construct = function(pos) + local node = minetest.get_node(pos) + local pos_above = {x = pos.x,y = pos.y + 1,z = pos.z} + local node_above = minetest.get_node(pos_above) + local pos_below = {x = pos.x,y = pos.y - 1,z = pos.z} + local node_below = minetest.get_node(pos_below) + if node_above.name == "prefab_redo:concrete_wall" then + node_above.name = "prefab_redo:concrete_wall_upper" + minetest.swap_node(pos_above,node_above) + end + if node_below.name == "prefab_redo:concrete_wall" or node_below.name == "prefab_redo:concrete_wall_upper" then + node.name = "prefab_redo:concrete_wall_upper" + minetest.swap_node(pos,node) + end + end, + on_destruct = function(pos) + local node = minetest.get_node(pos) + local pos_above = {x = pos.x,y = pos.y + 1,z = pos.z} + local node_above = minetest.get_node(pos_above) + if node_above.name == "prefab_redo:concrete_wall_upper" then + node_above.name = "prefab_redo:concrete_wall" + minetest.swap_node(pos_above,node_above) + end + end, +}) + +minetest.register_node("prefab_redo:concrete_wall_upper", { + sounds = default.node_sound_stone_defaults(), + paramtype = "light", + drawtype = "nodebox", + tiles = {"basic_materials_concrete_block.png"}, + sunlight_propagates = true, + groups = {cracky = 1,not_in_creative_inventory = 1}, + drop = "prefab_redo:concrete_wall", + node_box = { + type = "connected", + fixed = {{-0.1, -0.5, -0.1, 0.1, 0.5, 0.1}}, + connect_front = {{-0.1, -0.5, -0.5, 0.1, 0.5, 0.1}}, + connect_back = {{-0.1, -0.5, -0.1, 0.1, 0.5, 0.5}}, + connect_left = {{-0.5, -0.5, -0.1, 0.1, 0.5, 0.1}}, + connect_right = {{-0.1, -0.5, -0.1, 0.5, 0.5, 0.1}}, + }, + connects_to = {"prefab_redo:concrete_wall","prefab_redo:concrete_wall_upper"}, + on_destruct = function(pos) + local node = minetest.get_node(pos) + local pos_above = {x = pos.x,y = pos.y + 1,z = pos.z} + local node_above = minetest.get_node(pos_above) + if node_above.name == "prefab_redo:concrete_wall_upper" then + node_above.name = "prefab_redo:concrete_wall" + minetest.swap_node(pos_above,node_above) + end + end, +}) + +minetest.register_node("prefab_redo:concrete_ladder", { + description = "Concrete Ladder", + drawtype = "signlike", + tiles = {"basic_materials_concrete_block.png^[mask:prefab_redo_ladder_mask.png^prefab_redo_ladder_overlay.png"}, + inventory_image = "basic_materials_concrete_block.png^[mask:prefab_redo_ladder_mask.png^prefab_redo_ladder_overlay.png", + wield_image = "basic_materials_concrete_block.png^[mask:prefab_redo_ladder_mask.png^prefab_redo_ladder_overlay.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + selection_box = { + type = "wallmounted", + }, + groups = {cracky = 2}, + sounds = default.node_sound_stone_defaults(), +}) + +doors.register("door_concrete", { + tiles = { "basic_materials_concrete_block.png^prefab_redo_door_resize.png^[mask:prefab_redo_door_mask.png^prefab_redo_door_overlay.png" }, + description = "Concrete Door", + inventory_image = "basic_materials_concrete_block.png^prefab_redo_door_overlay_half.png^[mask:prefab_redo_door_mask_half.png", + groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, + sounds = default.node_sound_stone_defaults(), + recipe = { + {"technic:concrete", "technic:concrete"}, + {"technic:concrete", "default:steel_ingot"}, + {"technic:concrete", "technic:concrete"}, + }, +}) + +minetest.register_node("prefab_redo:concrete_railing", { + description = "Concrete Railing", + sounds = default.node_sound_stone_defaults(), + paramtype = "light", + drawtype = "nodebox", + tiles = {"basic_materials_concrete_block.png"}, + sunlight_propagates = true, + groups = {cracky = 1}, + node_box = { + type = "connected", + fixed = {{0.0625,-0.5,0.0625,-0.0625,0.1875,-0.0625}}, + connect_front = {{-0.0625,0.1875,-0.5,0.0625,0.3125,0.0625}}, + connect_back = {{-0.0625,0.1875,-0.0625,0.0625,0.3125,0.5}}, + connect_left = {{-0.5,0.1875,-0.0625,0.0625,0.3125,0.0625}}, + connect_right = {{-0.0625,0.1875,-0.0625,0.5,0.3125,0.0625}} + }, + selection_box = { + type = "fixed", + fixed = {{-0.5,-0.5,-0.5,0.5,0.3125,0.5}} + }, + connects_to = {"prefab_redo:concrete_railing","prefab_redo:concrete_catwalk"} +}) + +minetest.register_node("prefab_redo:concrete_catwalk",{ + description= "Concrete Catwalk", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"basic_materials_concrete_block.png"}, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,-0.5,0.5,-0.375,0.5}, + {-0.5,-0.5,-0.0625,-0.4375,0.5,0.0625}, + {0.4433,-0.5,-0.0625,0.5,0.5,0.0625}, + {0.4433,0.4485,-0.5,0.5,0.5,0.5}, + {-0.5,0.4485,-0.5,-0.4375,0.5,0.5}, + }, + }, + groups = {cracky = 2}, +}) + +minetest.register_node("prefab_redo:concrete_bench", { + description = "Concrete Bench", + tiles = {"basic_materials_concrete_block.png"}, + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.125,-0.5,-0.125,0.125,0.0625,0.125}, + {-0.5,0.0625,-0.3125,0.5,0.1875,0.3125}, + }, + }, + groups = {cracky = 2}, +}) + +minetest.register_craft({ + output = "prefab_redo:concrete_railing 6", + recipe = { + {"","",""}, + {"technic:concrete","technic:concrete","technic:concrete"}, + {"","technic:concrete",""} + } +}) + +minetest.register_craft({ + output = "prefab_redo:concrete_catwalk 3", + recipe = { + {"","",""}, + {"prefab_redo:concrete_railing","","prefab_redo:concrete_railing"}, + {"technic:concrete","technic:concrete","technic:concrete"} + } +}) + +minetest.register_craft({ + output = "prefab_redo:concrete_bench 2", + recipe = { + {"","",""}, + {"","technic:concrete",""}, + {"","prefab_redo:concrete_railing",""} + } +}) + +minetest.register_craft({ + output = "prefab_redo:concrete_with_grass", + type = "shapeless", + recipe = {"technic:concrete","default:junglegrass"} +}) + +minetest.register_craft({ + output = "prefab_redo:concrete_with_grass", + type = "shapeless", + recipe = {"technic:concrete","default:grass_1"} +}) + +minetest.register_craft({ + output = "prefab_redo:concrete_wall 3", + recipe = { + {"","technic:concrete",""}, + {"","technic:concrete",""}, + {"","technic:concrete",""} + } +}) + +minetest.register_craft({ + output = "prefab_redo:concrete_ladder 14", + recipe = { + {"technic:concrete","","technic:concrete"}, + {"technic:concrete","technic:concrete","technic:concrete"}, + {"technic:concrete","","technic:concrete"} + } +}) diff --git a/mods/prefab_redo/mod.conf b/mods/prefab_redo/mod.conf new file mode 100644 index 00000000..a489dd0d --- /dev/null +++ b/mods/prefab_redo/mod.conf @@ -0,0 +1 @@ +name = prefab_redo diff --git a/mods/prefab_redo/screenshot.png b/mods/prefab_redo/screenshot.png new file mode 100644 index 00000000..13f19458 Binary files /dev/null and b/mods/prefab_redo/screenshot.png differ diff --git a/mods/prefab_redo/textures/prefab_redo_door_mask.png b/mods/prefab_redo/textures/prefab_redo_door_mask.png new file mode 100644 index 00000000..67419a57 Binary files /dev/null and b/mods/prefab_redo/textures/prefab_redo_door_mask.png differ diff --git a/mods/prefab_redo/textures/prefab_redo_door_mask_half.png b/mods/prefab_redo/textures/prefab_redo_door_mask_half.png new file mode 100644 index 00000000..fbb67b72 Binary files /dev/null and b/mods/prefab_redo/textures/prefab_redo_door_mask_half.png differ diff --git a/mods/prefab_redo/textures/prefab_redo_door_overlay.png b/mods/prefab_redo/textures/prefab_redo_door_overlay.png new file mode 100644 index 00000000..8df3dc95 Binary files /dev/null and b/mods/prefab_redo/textures/prefab_redo_door_overlay.png differ diff --git a/mods/prefab_redo/textures/prefab_redo_door_overlay_half.png b/mods/prefab_redo/textures/prefab_redo_door_overlay_half.png new file mode 100644 index 00000000..fa79a90b Binary files /dev/null and b/mods/prefab_redo/textures/prefab_redo_door_overlay_half.png differ diff --git a/mods/prefab_redo/textures/prefab_redo_door_resize.png b/mods/prefab_redo/textures/prefab_redo_door_resize.png new file mode 100644 index 00000000..7833da92 Binary files /dev/null and b/mods/prefab_redo/textures/prefab_redo_door_resize.png differ diff --git a/mods/prefab_redo/textures/prefab_redo_ladder_mask.png b/mods/prefab_redo/textures/prefab_redo_ladder_mask.png new file mode 100644 index 00000000..27486a30 Binary files /dev/null and b/mods/prefab_redo/textures/prefab_redo_ladder_mask.png differ diff --git a/mods/prefab_redo/textures/prefab_redo_ladder_overlay.png b/mods/prefab_redo/textures/prefab_redo_ladder_overlay.png new file mode 100644 index 00000000..b0073086 Binary files /dev/null and b/mods/prefab_redo/textures/prefab_redo_ladder_overlay.png differ diff --git a/mods/simplyslopes/README.txt b/mods/simplyslopes/README.txt new file mode 100644 index 00000000..63025fb6 --- /dev/null +++ b/mods/simplyslopes/README.txt @@ -0,0 +1,44 @@ +Simply Slopes 0.3 +by Delaroyas + +This mod has been created by Delaroyas to include slopes, corner slopes etc... + +Description: +Adds 5 new craftable block types to minetest. Slopes and slope corners. Supports +multiple types of blocks from different mods. + +The goal of this mod was to make my first mod, to get familiar with minetest programming. +There were similar (identical) blocks in moreblocks, but if you are looking for a light mod that just adds a few slopes, This is the mod for you. + +Mod dependencies: default +Compatible mods: lapis, bakedclay, wool, mobs, castle, homedecor, moretrees, ethereal, xanadu. +Minetest version tested: 0.4.14 and 0.4.14-dev + +Source code : +https://github.com/Delaroyas/simplyslopes/tree/master + + +License of source code: +----------------------- +Based on Minetest 0.4 mod: stairs redo by tenplus1 +Copyright (C) 2011-2012 Kahrl +Copyright (C) 2011-2012 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +http://www.gnu.org/licenses/lgpl-2.1.html + +License of media (models, textures or sounds) +-------------------------------------- +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +Authors of media files +----------------------- +Everything not listed in here: +Copyright (C) 2010-2012 celeron55, Perttu Ahola + + diff --git a/mods/simplyslopes/bakedclay_mod.lua b/mods/simplyslopes/bakedclay_mod.lua new file mode 100644 index 00000000..3274bca0 --- /dev/null +++ b/mods/simplyslopes/bakedclay_mod.lua @@ -0,0 +1,23 @@ + +-- Add slopes for blocks in the +-- Baked clay mod + + +simplyslopes.register_all2("bakedclay:white") +simplyslopes.register_all2("bakedclay:grey") +simplyslopes.register_all2("bakedclay:black") +simplyslopes.register_all2("bakedclay:red") +simplyslopes.register_all2("bakedclay:yellow") +simplyslopes.register_all2("bakedclay:green") +simplyslopes.register_all2("bakedclay:cyan") +simplyslopes.register_all2("bakedclay:magenta") +simplyslopes.register_all2("bakedclay:orange") +simplyslopes.register_all2("bakedclay:blue") +simplyslopes.register_all2("bakedclay:violet") +simplyslopes.register_all2("bakedclay:brown") +simplyslopes.register_all2("bakedclay:pink") +simplyslopes.register_all2("bakedclay:dark_grey") +simplyslopes.register_all2("bakedclay:dark_green") + + + diff --git a/mods/simplyslopes/candy_mod.lua b/mods/simplyslopes/candy_mod.lua new file mode 100644 index 00000000..a7d8756e --- /dev/null +++ b/mods/simplyslopes/candy_mod.lua @@ -0,0 +1,7 @@ +-- Add slopes for blocks in the +--= Candy Mod + +simplyslopes.register_all2("candy:candycane") +simplyslopes.register_all2("candy:gingerbread") + + diff --git a/mods/simplyslopes/castle_mod.lua b/mods/simplyslopes/castle_mod.lua new file mode 100644 index 00000000..42a71d5d --- /dev/null +++ b/mods/simplyslopes/castle_mod.lua @@ -0,0 +1,7 @@ +-- Add slopes for blocks in the +--= Castle Mod + +simplyslopes.register_all2("castle:pavement") +simplyslopes.register_all2("castle:dungeon_stone") +simplyslopes.register_all2("castle:stonewall") + diff --git a/mods/simplyslopes/default_mod.lua b/mods/simplyslopes/default_mod.lua new file mode 100644 index 00000000..699240b6 --- /dev/null +++ b/mods/simplyslopes/default_mod.lua @@ -0,0 +1,38 @@ +-- Add slopes for blocks in the +-- Default minetest mod + + +simplyslopes.register_all2("default:dirt_with_grass") + +simplyslopes.register_all2("default:wood") +simplyslopes.register_all2("default:junglewood") +simplyslopes.register_all2("default:pinewood") +simplyslopes.register_all2("default:acacia_wood") + +simplyslopes.register_all2("default:cobble") +simplyslopes.register_all2("default:desert_cobble") +simplyslopes.register_all2("default:cloud") +simplyslopes.register_all2("default:coalblock") +simplyslopes.register_all2("default:steelblock") +simplyslopes.register_all2("default:copperblock") +simplyslopes.register_all2("default:bronzeblock") +simplyslopes.register_all2("default:mese") +simplyslopes.register_all2("default:goldblock") +simplyslopes.register_all2("default:diamondblock") +simplyslopes.register_all2("default:stone") +simplyslopes.register_all2("default:desert_stone") +simplyslopes.register_all2("default:mossycobble") +simplyslopes.register_all2("default:brick") +simplyslopes.register_all2("default:sandstone") +simplyslopes.register_all2("default:glass") +simplyslopes.register_all2("default:obsidian_glass") +simplyslopes.register_all2("default:sandstonebrick") +simplyslopes.register_all2("default:obsidian") +simplyslopes.register_all2("default:stonebrick") +simplyslopes.register_all2("default:desert_stonebrick") +simplyslopes.register_all2("default:obsidianbrick") + +simplyslopes.register_all2("default:snowblock") +simplyslopes.register_all2("default:nyancat_rainbow") + + diff --git a/mods/simplyslopes/depends.txt b/mods/simplyslopes/depends.txt new file mode 100644 index 00000000..4b54c82c --- /dev/null +++ b/mods/simplyslopes/depends.txt @@ -0,0 +1,13 @@ +default +candy? +intllib? +lapis? +bakedclay? +wool? +mobs? +castle? +homedecor? +moretrees? +ethereal? +xanadu? + diff --git a/mods/simplyslopes/ethereal_mod.lua b/mods/simplyslopes/ethereal_mod.lua new file mode 100644 index 00000000..1cb4848c --- /dev/null +++ b/mods/simplyslopes/ethereal_mod.lua @@ -0,0 +1,19 @@ + +-- Add slopes for blocks in the +--= Ethereal Mod + +simplyslopes.register_all2("ethereal:bamboo_floor") +simplyslopes.register_all2("ethereal:crystal_block") +simplyslopes.register_all2("ethereal:icebrick") +simplyslopes.register_all2("ethereal:snowbrick") +simplyslopes.register_all2("ethereal:mushroom_trunk") +simplyslopes.register_all2("ethereal:mushroom") +simplyslopes.register_all2("ethereal:frost_wood") +simplyslopes.register_all2("ethereal:yellow_wood") +simplyslopes.register_all2("ethereal:palm_wood") +simplyslopes.register_all2("ethereal:banana_wood") +simplyslopes.register_all2("ethereal:willow_wood") +simplyslopes.register_all2("ethereal:redwood_wood") +--simplyslopes.register_all2("ethereal:acacia_wood") Alredy in default now, causes conflict + + diff --git a/mods/simplyslopes/functions.lua b/mods/simplyslopes/functions.lua new file mode 100644 index 00000000..eefb51af --- /dev/null +++ b/mods/simplyslopes/functions.lua @@ -0,0 +1,325 @@ + + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if (minetest.get_modpath("intllib")) then + dofile(minetest.get_modpath("intllib").."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function ( s ) return s end +end + +-- Nodes will be called simplyslopes:{'',outer_,outer2_,inner_,inner2_} +function simplyslopes.register_all2(recipeitem) + + -- Todo + + local thisnode=minetest.registered_nodes[recipeitem] + if thisnode == nil + then -- thisnode is empty, get out of here! + return + end + + --create the new node "subname" + local tmp = simplyslopes.splitstring(recipeitem) + local modname=tmp[1] + local subname=tmp[2] + + -- Bakedclay and wool mod name their blocks like "bakedclay:white" + if modname == 'bakedclay' or modname == 'wool' + -- We must add modname to subname + then subname= modname .. '_' .. subname + end + + local desc = thisnode.description + -- remove "Block" and "Planks" form description; + desc=string.gsub(desc,'Block', '') + desc=string.gsub(desc,'Plank', ' ') + --desc=string.gsub(desc,' ', ' ') + desc=string.gsub(desc,'%s+', ' ') + +if (subname == nil) +then error(recipeitem .. ", " .. modname..", "..subname) +end + simplyslopes.register_slope(subname, recipeitem, thisnode.groups, thisnode.tiles, desc, thisnode.sounds) + simplyslopes.register_slopecorner(subname, recipeitem, thisnode.groups, thisnode.tiles, desc, thisnode.sounds) + simplyslopes.register_slopecorner2(subname, recipeitem, thisnode.groups, thisnode.tiles, desc, thisnode.sounds) + simplyslopes.register_slopeinner(subname, recipeitem, thisnode.groups, thisnode.tiles, desc, thisnode.sounds) + simplyslopes.register_slopeinner2(subname, recipeitem, thisnode.groups, thisnode.tiles, desc, thisnode.sounds) + +end + + + +-- Node will be called simplyslopes: +function simplyslopes.register_slope(subname, recipeitem, groups, images, description, snds) + local newitem="simplyslopes:" .. subname, + minetest.register_node(":simplyslopes:" .. subname, { + description = S(description.." Slope"), + drawtype = "mesh", + mesh = "simplyslopes_slope.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = snds, + + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.1875, 0.5}, -- NodeBox1 + {-0.5, -0.1875, -0.1875, 0.5, 0.1875, 0.5}, -- NodeBox3 + {-0.5, 0.1875, 0.1875, 0.5, 0.5, 0.5}, -- NodeBox2 + }, + }, + + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.1875, 0.5}, -- NodeBox1 + {-0.5, -0.1875, -0.1875, 0.5, 0.1875, 0.5}, -- NodeBox3 + {-0.5, 0.1875, 0.1875, 0.5, 0.5, 0.5}, -- NodeBox2 + }, + }, + on_place = minetest.rotate_node + }) + + minetest.register_craft({ + output = newitem .. ' 6', + recipe = { + {recipeitem, "", ""}, + { "",recipeitem, ""}, + {"","",recipeitem}, + }, + }) + minetest.register_craft({ + type = "shapeless" , + output = recipeitem ..' 1', + recipe = {newitem, newitem}, + }) + minetest.register_alias("simplyslopes:slope_" .. subname, "simplyslopes:" .. subname) +end + +-- Node will be called simplyslopes:inner_ +function simplyslopes.register_slopeinner(subname, recipeitem, groups, images, description, snds) + local newitem="simplyslopes:inner_" .. subname, + minetest.register_node(":simplyslopes:inner_" .. subname, { + description = description.." Inner Slope Corner", + drawtype = "mesh", + mesh = "simplyslopes_slopeinsidecorner.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = snds, + + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, 0, -0.5, 0, 0.5, 0}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, 0, -0.5, 0, 0.5, 0}, + }, + }, + on_place = minetest.rotate_node + }) + + + minetest.register_craft({ + output = "simplyslopes:inner_" .. subname ..' 5', + recipe = { + {recipeitem, recipeitem, ""}, + {"", "", recipeitem}, + {"","", recipeitem}, + }, + }) + + minetest.register_craft({ + type = "shapeless" , + output = recipeitem ..' 4', + recipe = {newitem, newitem, newitem, newitem, newitem}, + }) + + + minetest.register_alias("simplyslopes:slopeinner_" .. subname, "simplyslopes:inner_" .. subname) +end + +-- Node will be called simplyslopes:inner2_ +function simplyslopes.register_slopeinner2(subname, recipeitem, groups, images, description, snds) + local newitem="simplyslopes:inner2_" .. subname, + minetest.register_node(":simplyslopes:inner2_" .. subname, { + description = description.." Inner Slope Corner", +-- drawtype = "nodebox", + drawtype = "mesh", + mesh = "simplyslopes_slopeinsidecorner2.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = snds, + + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, 0, -0.5, 0, 0.5, 0}, + }, + }, + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, 0, -0.5, 0, 0.5, 0}, + }, + }, + on_place = minetest.rotate_node + }) + + minetest.register_craft({ + output = newitem .. ' 6', + recipe = { + {recipeitem, recipeitem, ""}, + {"", "", recipeitem}, + {recipeitem,"", recipeitem}, + }, + }) + minetest.register_craft({ + type = "shapeless" , + output = recipeitem ..' 5', + recipe = {newitem, newitem, newitem, newitem, newitem, newitem}, + }) + + minetest.register_alias("simplyslopes:slopeinsidecorner2_" .. subname, "simplyslopes:inner2_" .. subname) +end + + +-- Node will be called simplyslopes:outer_ +function simplyslopes.register_slopecorner(subname, recipeitem, groups, images, description, snds) + local newitem="simplyslopes:outer_" .. subname, + minetest.register_node(":simplyslopes:outer_" .. subname, { + description = description.." Outer Slope Corner", +-- drawtype = "nodebox", + drawtype = "mesh", + mesh = "simplyslopes_slopecorner.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = snds, + + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.1875, 0.5}, -- NodeBox1 + {-0.5, -0.1875, -0.1875, 0.1875, 0.1875, 0.5}, -- NodeBox3 + {-0.5, 0.1875, 0.1875, -0.1875, 0.5, 0.5}, -- NodeBox2 + }, + }, + + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.1875, 0.5}, -- NodeBox1 + {-0.5, -0.1875, -0.1875, 0.5, 0.1875, 0.5}, -- NodeBox3 + {-0.5, 0.1875, 0.1875, 0.5, 0.5, 0.5}, -- NodeBox2 + }, + }, + on_place = minetest.rotate_node + }) + + minetest.register_craft({ + output = newitem .. ' 15', + recipe = { + { "",recipeitem, ""}, + {recipeitem,"",recipeitem}, + }, + minetest.register_craft({ + type = "shapeless" , + output = recipeitem ..' 1', + recipe = {newitem, newitem, newitem, newitem, newitem}, + }) + }) + + + minetest.register_alias("simplyslopes:slopecorner_" .. subname, "simplyslopes:outer_" .. subname) +end + +-- Node will be called simplyslopes:outer2_ +function simplyslopes.register_slopecorner2(subname, recipeitem, groups, images, description, snds) + local newitem="simplyslopes:outer2_" .. subname, + minetest.register_node(":simplyslopes:outer2_" .. subname, { + description = description.." Outer Slope Corner", +-- drawtype = "nodebox", + drawtype = "mesh", + mesh = "simplyslopes_slopecorner2.obj", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + sunlight_propagates = true, + groups = groups, + sounds = snds, + + selection_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.1875, 0.5}, -- NodeBox1 + {-0.5, -0.1875, -0.1875, 0.1875, 0.1875, 0.5}, -- NodeBox3 + {-0.5, 0.1875, 0.1875, -0.1875, 0.5, 0.5}, -- NodeBox2 + }, + }, + + collision_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.1875, 0.5}, -- NodeBox1 + {-0.5, -0.1875, -0.1875, 0.5, 0.1875, 0.5}, -- NodeBox3 + {-0.5, 0.1875, 0.1875, 0.5, 0.5, 0.5}, -- NodeBox2 + }, + }, + on_place = minetest.rotate_node + }) + + minetest.register_craft({ + output = newitem .. ' 18', + recipe = { + { "",recipeitem, ""}, + {"",recipeitem,recipeitem}, + }, + }) + minetest.register_craft({ + type = "shapeless" , + output = recipeitem ..' 1', + recipe = {newitem, newitem, newitem, newitem, newitem, newitem}, + }) + minetest.register_alias("simplyslopes:slopecorner2_" .. subname, "simplyslopes:outer2_" .. subname) +end + + +-- Split string with the format mod:item to mod and item seperately +function simplyslopes.splitstring(inputstr) + local sep = ':' + local t={} + local i=1 + for str in string.gmatch(inputstr, "([^"..sep.."]+)") do + t[i] = str + i = i + 1 + end + return t +end + +-- Helper diff --git a/mods/simplyslopes/homedecor_mod.lua b/mods/simplyslopes/homedecor_mod.lua new file mode 100644 index 00000000..ca271457 --- /dev/null +++ b/mods/simplyslopes/homedecor_mod.lua @@ -0,0 +1,9 @@ + +-- Add slopes for blocks in the +--= homedecor Mod + +simplyslopes.register_all2("homedecor:shingles_asphalt") +simplyslopes.register_all2("homedecor:roof_tile_terracotta") +simplyslopes.register_all2("homedecor:shingles_wood") + + diff --git a/mods/simplyslopes/init.lua b/mods/simplyslopes/init.lua new file mode 100644 index 00000000..0ff8a9de --- /dev/null +++ b/mods/simplyslopes/init.lua @@ -0,0 +1,77 @@ +print ("[MOD] SimplySlopes loading") + +simplyslopes = {} +simplyslopes.mod = "original" + + +--= Load functions that creates the differents nodes. +dofile(minetest.get_modpath("simplyslopes").."/functions.lua") + +--= Default Minetest +dofile(minetest.get_modpath("simplyslopes").."/default_mod.lua") + +--= Lapis Mod +if minetest.get_modpath("candy") then + dofile(minetest.get_modpath("simplyslopes").."/candy_mod.lua") +end + + +--= Lapis Mod +if minetest.get_modpath("lapis") then + dofile(minetest.get_modpath("simplyslopes").."/lapis_mod.lua") +end + +--= Baked Clay mod +if minetest.get_modpath("bakedclay") then + dofile(minetest.get_modpath("simplyslopes").."/bakedclay_mod.lua") +end + +--= Wool mod +if minetest.get_modpath("wool") then + dofile(minetest.get_modpath("simplyslopes").."/wool_mod.lua") +end + +--= Farming Mod +if minetest.get_modpath("farming") then + simplyslopes.register_all2("farming:straw") +end + +--= Mobs Mod +if minetest.get_modpath("mobs") and mobs and mobs.mod and mobs.mod == "redo" then + simplyslopes.register_all2("mobs:cheeseblock") + simplyslopes.register_all2("mobs:honey_block") +end + +--= Castle Mod +if minetest.get_modpath("castle") then + dofile(minetest.get_modpath("simplyslopes").."/castle_mod.lua") +end + + +--= Homedecor Mod +if minetest.get_modpath("homedecor") then + dofile(minetest.get_modpath("simplyslopes").."/homedecor_mod.lua") +end + +--= MoreTrees Mod +if minetest.get_modpath("moretrees") then + dofile(minetest.get_modpath("simplyslopes").."/moretrees_mod.lua") +end + + +--= Xanadu Mod +--= Never found and tested this mod. +if minetest.get_modpath("xanadu") then + dofile(minetest.get_modpath("simplyslopes").."/xanadu_mod.lua") +end + + +--= Ethereal Mod +-- Never managed to make any blocks with this mod. +if minetest.get_modpath("ethereal") then + dofile(minetest.get_modpath("simplyslopes").."/ethereal_mod.lua") +end + + + +print ("[MOD] SimplySlopes loaded") diff --git a/mods/simplyslopes/lapis_mod.lua b/mods/simplyslopes/lapis_mod.lua new file mode 100644 index 00000000..9e566528 --- /dev/null +++ b/mods/simplyslopes/lapis_mod.lua @@ -0,0 +1,11 @@ +-- Add slopes for blocks in the +-- Lapis mod + + + +simplyslopes.register_all2("lapis:lapisblock") +simplyslopes.register_all2("lapis:lapis_brick") +simplyslopes.register_all2("lapis:lapis_cobble") +simplyslopes.register_all2("lapis:lazurite") +simplyslopes.register_all2("lapis:lazurite_brick") + diff --git a/mods/simplyslopes/locale/description_dump.txt b/mods/simplyslopes/locale/description_dump.txt new file mode 100644 index 00000000..a971392b --- /dev/null +++ b/mods/simplyslopes/locale/description_dump.txt @@ -0,0 +1,135 @@ +Acacia Wood s Inner Slope Corner = +Acacia Wood s Outer Slope Corner = +Acacia Wood s Slope = +Black Baked Clay Inner Slope Corner = +Black Baked Clay Outer Slope Corner = +Black Baked Clay Slope = +Black Wool Inner Slope Corner = +Black Wool Outer Slope Corner = +Black Wool Slope = +Blue Baked Clay Inner Slope Corner = +Blue Baked Clay Outer Slope Corner = +Blue Baked Clay Slope = +Blue Wool Inner Slope Corner = +Blue Wool Outer Slope Corner = +Blue Wool Slope = +Brick Inner Slope Corner = +Brick Outer Slope Corner = +Brick Slope = +Bronze Inner Slope Corner = +Bronze Outer Slope Corner = +Bronze Slope = +Brown Baked Clay Inner Slope Corner = +Brown Baked Clay Outer Slope Corner = +Brown Baked Clay Slope = +Brown Wool Inner Slope Corner = +Brown Wool Outer Slope Corner = +Brown Wool Slope = +Cheese Inner Slope Corner = +Cheese Outer Slope Corner = +Cheese Slope = +Cloud Inner Slope Corner = +Cloud Outer Slope Corner = +Cloud Slope = +Coal Inner Slope Corner = +Coal Outer Slope Corner = +Coal Slope = +Cobblestone Inner Slope Corner = +Cobblestone Outer Slope Corner = +Cobblestone Slope = +Copper Inner Slope Corner = +Copper Outer Slope Corner = +Copper Slope = +Cyan Baked Clay Inner Slope Corner = +Cyan Baked Clay Outer Slope Corner = +Cyan Baked Clay Slope = +Cyan Wool Inner Slope Corner = +Cyan Wool Outer Slope Corner = +Cyan Wool Slope = +Dark Green Baked Clay Inner Slope Corner = +Dark Green Baked Clay Outer Slope Corner = +Dark Green Baked Clay Slope = +Dark Green Wool Inner Slope Corner = +Dark Green Wool Outer Slope Corner = +Dark Green Wool Slope = +Dark Grey Baked Clay Inner Slope Corner = +Dark Grey Baked Clay Outer Slope Corner = +Dark Grey Baked Clay Slope = +Dark Grey Wool Inner Slope Corner = +Dark Grey Wool Outer Slope Corner = +Dark Grey Wool Slope = +Desert Cobblestone Inner Slope Corner = +Desert Cobblestone Outer Slope Corner = +Desert Cobblestone Slope = +Desert Stone Brick Inner Slope Corner = +Desert Stone Brick Outer Slope Corner = +Desert Stone Brick Slope = +Desert Stone Inner Slope Corner = +Desert Stone Outer Slope Corner = +Desert Stone Slope = +Diamond Inner Slope Corner = +Diamond Outer Slope Corner = +Diamond Slope = +Dirt with Grass Inner Slope Corner = +Dirt with Grass Outer Slope Corner = +Dirt with Grass Slope = +Glass Inner Slope Corner = +Glass Outer Slope Corner = +Glass Slope = +Gold Inner Slope Corner = +Gold Outer Slope Corner = +Gold Slope = +Green Baked Clay Inner Slope Corner = +Green Baked Clay Outer Slope Corner = +Green Baked Clay Slope = +Green Wool Inner Slope Corner = +Green Wool Outer Slope Corner = +Green Wool Slope = +Grey Baked Clay Inner Slope Corner = +Grey Baked Clay Outer Slope Corner = +Grey Baked Clay Slope = +Grey Wool Inner Slope Corner = +Grey Wool Outer Slope Corner = +Grey Wool Slope = +Honey Inner Slope Corner = +Honey Outer Slope Corner = +Honey Slope = +Junglewood s Inner Slope Corner = +Junglewood s Outer Slope Corner = +Junglewood s Slope = +Magenta Baked Clay Inner Slope Corner = +Magenta Baked Clay Outer Slope Corner = +Magenta Baked Clay Slope = +Magenta Wool Inner Slope Corner = +Magenta Wool Outer Slope Corner = +Magenta Wool Slope = +Mese Inner Slope Corner = +Mese Outer Slope Corner = +Mese Slope = +Mossy Cobblestone Inner Slope Corner = +Mossy Cobblestone Outer Slope Corner = +Mossy Cobblestone Slope = +Nyan Cat Rainbow Inner Slope Corner = +Nyan Cat Rainbow Outer Slope Corner = +Nyan Cat Rainbow Slope = +Obsidian Brick Inner Slope Corner = +Obsidian Brick Outer Slope Corner = +Obsidian Brick Slope = +Obsidian Glass Inner Slope Corner = +Obsidian Glass Outer Slope Corner = +Obsidian Glass Slope = +Obsidian Inner Slope Corner = +Obsidian Outer Slope Corner = +Obsidian Slope = +Orange Baked Clay Inner Slope Corner = +Orange Baked Clay Outer Slope Corner = +Orange Baked Clay Slope = +Orange Wool Inner Slope Corner = +Orange Wool Outer Slope Corner = +Orange Wool Slope = +Pente de pierre = +Pine Wood s Inner Slope Corner = +Pine Wood s Outer Slope Corner = +Pine Wood s Slope = +Pink Baked Clay Inner Slope Corner = +Pink B \ No newline at end of file diff --git a/mods/simplyslopes/locale/fr.txt b/mods/simplyslopes/locale/fr.txt new file mode 100644 index 00000000..08aa6275 --- /dev/null +++ b/mods/simplyslopes/locale/fr.txt @@ -0,0 +1,11 @@ +# Lines beginning with a pound sign are comments and are effectively ignored +# by the reader. Note that comments only span until the end of the line; +# there's no support for multiline comments. +Blank lines not containing an equals sign are also ignored. +Hello, World! = Bonjour, Monde! +String with\nnewlines and \ttabs = Des chaines de caractères avec\ndes sauts de lignes \tdes tabulations +String with an \= equals sign = Des chaines de caractères un \= signe égual +Slope = Pente +Stone Slope = Pente de pierre +Stone Inner Slope Corner = Pente de pierre interieure +Stone Outer Slope Corner = Pente de pierre exterieure diff --git a/mods/simplyslopes/locale/template.txt b/mods/simplyslopes/locale/template.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/simplyslopes/models/simplyslopes_slope.obj b/mods/simplyslopes/models/simplyslopes_slope.obj new file mode 100644 index 00000000..85e3ef81 --- /dev/null +++ b/mods/simplyslopes/models/simplyslopes_slope.obj @@ -0,0 +1,71 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib simplyslope_slope.mtl +o stairs_top +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +o stairs_right +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.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn -1.000000 0.000000 0.000000 +usemtl None +s 1 +f 3/1/1 4/2/1 5/3/1 +o front +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 +vt 1.000000 0.000000 +vt 1.000000 0.999938 +vt 0.000000 0.999938 +vt 0.000000 0.000000 +vn 0.000000 0.707100 -0.707100 +usemtl None +s 1 +f 7/4/2 8/5/2 9/6/2 10/7/2 +o left +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.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +usemtl None +s 1 +f 11/8/3 12/9/3 13/10/3 +l 14 11 +l 14 12 +o bottom +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 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +usemtl None +s 1 +f 15/11/4 16/12/4 17/13/4 18/14/4 +o back +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 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 -0.000000 1.000000 +usemtl None +s 1 +f 19/15/5 20/16/5 21/17/5 22/18/5 diff --git a/mods/simplyslopes/models/simplyslopes_slopecorner.obj b/mods/simplyslopes/models/simplyslopes_slopecorner.obj new file mode 100644 index 00000000..2fa8016d --- /dev/null +++ b/mods/simplyslopes/models/simplyslopes_slopecorner.obj @@ -0,0 +1,77 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib stairs_slopecorner.mtl +o stairs_right.000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn -1.000000 -0.000000 -0.000000 +usemtl None.000 +s 1 +f 1/1/1 2/2/1 3/3/1 +o stairs_back.000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt -0.000002 0.000009 +vt 0.999993 1.000005 +vt 0.999985 0.000005 +vn 0.000000 0.000000 -1.000000 +usemtl None.000 +s off +f 4/4/2 5/5/2 6/6/2 +o stairs_bottom.000 +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 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +usemtl None.000 +s 1 +f 7/7/3 8/8/3 9/9/3 10/10/3 +o stairs_left.000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.000000 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.707100 0.707100 -0.000000 +vn 0.707100 0.707100 -0.000200 +usemtl None.000 +s 1 +f 11/11/4 12/12/5 13/13/4 +l 14 11 +l 14 12 +o stairs_front.000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.000015 0.000003 +vt 0.999997 0.000000 +vt 0.000023 0.999982 +vn 0.000000 0.707100 -0.707100 +usemtl None.000 +s off +f 15/14/6 17/15/6 16/16/6 +o stairs_bottom.001 +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 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 -1.000000 -0.000000 +usemtl None.001 +s 1 +f 18/17/7 19/18/7 20/19/7 21/20/7 diff --git a/mods/simplyslopes/models/simplyslopes_slopecorner2.obj b/mods/simplyslopes/models/simplyslopes_slopecorner2.obj new file mode 100644 index 00000000..2833d735 --- /dev/null +++ b/mods/simplyslopes/models/simplyslopes_slopecorner2.obj @@ -0,0 +1,49 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib slopes_slopecorner2.mtl +o left_Plane.000 +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.493924 +vt -0.000000 1.000000 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 0.006076 1.000000 +vn 1.000000 0.000000 0.000000 +usemtl None.001 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +o back_Plane.000 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 -0.000000 +vn 0.000000 -0.000000 1.000000 +usemtl Material.002 +s 1 +f 7/5/2 5/6/2 6/7/2 +o Front_Plane.000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.496321 -0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.001839 -0.001839 +vt 0.998161 -0.001839 +vn -0.578800 0.576600 -0.576600 +usemtl None.001 +s 1 +f 8/8/3 9/9/3 10/10/3 +o Bottom_Plane.001 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vn 0.000000 -1.000000 0.000000 +usemtl None.001 +s 1 +f 13/11/4 11/12/4 12/13/4 diff --git a/mods/simplyslopes/models/simplyslopes_slopeinsidecorner.obj b/mods/simplyslopes/models/simplyslopes_slopeinsidecorner.obj new file mode 100644 index 00000000..5b81dac3 --- /dev/null +++ b/mods/simplyslopes/models/simplyslopes_slopeinsidecorner.obj @@ -0,0 +1,79 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib simplyslopes_slopeinsidecorner.mtl +o back_Plane.005 +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +usemtl Material.001 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +o Bottom_Plane +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 -1.000000 -0.000000 +usemtl None_Untitled +s 1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +o Top_Plane.001 +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 +vt 0.000029 0.999953 +vt 0.000027 0.000008 +vt 0.999994 1.000020 +vt 0.000084 1.000055 +vn -0.707100 0.707100 0.000000 +vn 0.000000 0.707100 -0.707100 +usemtl None +s 1 +f 9/9/3 10/10/3 11/11/3 +f 10/10/4 12/12/4 11/11/4 +o left_Plane.002 +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 1.000000 -0.000000 0.000000 +usemtl None_Untitled +s 1 +f 13/13/5 14/14/5 15/15/5 16/16/5 +o Front_Plane.004 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 1.000000 0.000000 +vt -0.000163 1.000101 +vt 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +usemtl None +s 1 +f 17/17/6 19/18/6 18/19/6 +o right_Plane.003 +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +vt 0.999612 -0.000163 +vt 1.000070 1.000194 +vt 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +usemtl None +s 1 +f 20/20/7 22/21/7 21/22/7 diff --git a/mods/simplyslopes/models/simplyslopes_slopeinsidecorner2 (copy).obj b/mods/simplyslopes/models/simplyslopes_slopeinsidecorner2 (copy).obj new file mode 100644 index 00000000..ae3bfe75 --- /dev/null +++ b/mods/simplyslopes/models/simplyslopes_slopeinsidecorner2 (copy).obj @@ -0,0 +1,87 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib slopes_slopeinsidecorner2.mtl +o right_Plane.003 +v -0.500000 0.500000 0.500000 +v 0.000000 0.500000 0.000000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vn -0.577400 0.577400 -0.577400 +vn -1.000000 0.000000 0.000000 +usemtl None +s off +f 1/1/1 2/2/1 3/3/1 +f 4/4/2 1/1/2 3/3/2 +o left_Plane.002 +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 1.000000 -0.000000 0.000000 +usemtl None +s 1 +f 5/5/3 6/6/3 7/7/3 8/8/3 +o Top_Plane.001 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 9/9/4 11/10/4 10/11/4 +o back_Plane.005 +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +usemtl Material.001 +s 1 +f 12/12/5 13/13/5 14/14/5 15/15/5 +o Front_Plane.004 +v 0.000000 0.500000 0.000000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.493942 -0.500000 +v -0.496217 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.000000 0.000000 +vt 0.996217 0.000000 +vt 0.000000 0.993942 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 0.000000 -1.000000 +vn -0.573600 0.573600 -0.584800 +usemtl None +s off +f 18/16/6 20/17/6 19/18/6 +f 20/17/7 17/19/7 16/20/7 21/21/7 19/18/7 +o Bottom_Plane +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 -1.000000 -0.000000 +usemtl None +s 1 +f 22/22/8 23/23/8 24/24/8 25/25/8 diff --git a/mods/simplyslopes/models/simplyslopes_slopeinsidecorner2.obj b/mods/simplyslopes/models/simplyslopes_slopeinsidecorner2.obj new file mode 100644 index 00000000..4f70d9a3 --- /dev/null +++ b/mods/simplyslopes/models/simplyslopes_slopeinsidecorner2.obj @@ -0,0 +1,90 @@ +# Blender v2.76 (sub 0) OBJ File: '' +# www.blender.org +mtllib simplyslopes_slopeinsidecorner2.mtl +o diagonal_Plane +v -0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.500000 0.000000 +vn -0.577400 0.577400 -0.577400 +usemtl Material.003 +s off +f 2/1/1 3/2/1 1/3/1 +o Front_Plane.001 +v 0.500000 -0.500000 -0.500000 +v -0.496217 -0.500000 -0.500000 +v 0.500000 0.493942 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +vt 0.000000 0.000000 +vt 0.996217 0.000000 +vt 0.000000 0.993942 +vn 0.000000 0.000000 -1.000000 +usemtl None.002 +s off +f 4/4/2 5/5/2 6/6/2 +l 6 8 +l 5 7 +o left_Plane.001 +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 1.000000 -0.000000 0.000000 +usemtl None.002 +s 1 +f 9/7/3 10/8/3 11/9/3 12/10/3 +o Top_Plane.002 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +usemtl None.002 +s off +f 13/11/4 14/12/4 15/13/4 +o Bottom_Plane.002 +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 -1.000000 -0.000000 +usemtl None.002 +s 1 +f 16/14/5 17/15/5 18/16/5 19/17/5 +o back_Plane.001 +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 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.000000 -0.000000 1.000000 +usemtl Material.003 +s 1 +f 20/18/6 21/19/6 22/20/6 23/21/6 +o right_Plane.001 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 +usemtl None.002 +s off +f 26/22/7 24/23/7 25/24/7 diff --git a/mods/simplyslopes/moretrees_mod.lua b/mods/simplyslopes/moretrees_mod.lua new file mode 100644 index 00000000..95fd6302 --- /dev/null +++ b/mods/simplyslopes/moretrees_mod.lua @@ -0,0 +1,12 @@ +--= MoreTrees Mod +simplyslopes.register_all2("moretrees:apple_tree_planks") +simplyslopes.register_all2("moretrees:beech_planks") +simplyslopes.register_all2("moretrees:birch_planks") +simplyslopes.register_all2("moretrees:fir_planks") +simplyslopes.register_all2("moretrees:oak_planks") +simplyslopes.register_all2("moretrees:palm_planks") +simplyslopes.register_all2("moretrees:spruce_planks") +simplyslopes.register_all2("moretrees:sequoia_planks") +simplyslopes.register_all2("moretrees:willow_planks") + +--Thanks to 0-afflatus diff --git a/mods/simplyslopes/wool_mod.lua b/mods/simplyslopes/wool_mod.lua new file mode 100644 index 00000000..ae419f53 --- /dev/null +++ b/mods/simplyslopes/wool_mod.lua @@ -0,0 +1,20 @@ +-- Add slopes for blocks in the +-- Wool mod + +simplyslopes.register_all2("wool:white") +simplyslopes.register_all2("wool:grey") +simplyslopes.register_all2("wool:black") +simplyslopes.register_all2("wool:red") +simplyslopes.register_all2("wool:yellow") +simplyslopes.register_all2("wool:green") +simplyslopes.register_all2("wool:cyan") +simplyslopes.register_all2("wool:magenta") +simplyslopes.register_all2("wool:orange") +simplyslopes.register_all2("wool:blue") +simplyslopes.register_all2("wool:violet") +simplyslopes.register_all2("wool:brown") +simplyslopes.register_all2("wool:pink") +simplyslopes.register_all2("wool:dark_grey") +simplyslopes.register_all2("wool:dark_green") + + diff --git a/mods/simplyslopes/xanadu_mod.lua b/mods/simplyslopes/xanadu_mod.lua new file mode 100644 index 00000000..943c5fd8 --- /dev/null +++ b/mods/simplyslopes/xanadu_mod.lua @@ -0,0 +1,31 @@ +-- Add slopes for blocks in the +--= Xanadu Mod +--------------------------------------------- +-- Untested +-- inspired by tenplus one stairs mod, but +-- I never found any xanadu mod anyware. +---------------------------------------------- + +simplyslopes.register_all2("xanadu:stained_wood_white") +simplyslopes.register_all2("xanadu:stained_wood_red") + +-- These objects are not in the backedclay mod, +-- They were placed in the xanadu mod section of tenplus1 code. +simplyslopes.register_all2("bakedclay:stone1") +simplyslopes.register_all2("bakedclay:stone2") +simplyslopes.register_all2("bakedclay:stone3") +simplyslopes.register_all2("bakedclay:stone4") +simplyslopes.register_all2("bakedclay:stone5") +simplyslopes.register_all2("bakedclay:stone6") +simplyslopes.register_all2("bakedclay:sandstonebrick4") +simplyslopes.register_all2("bakedclay:desert_cobble1") +simplyslopes.register_all2("bakedclay:desert_cobble5") +simplyslopes.register_all2("bakedclay:desert_stone1") +simplyslopes.register_all2("bakedclay:desert_stone3") +simplyslopes.register_all2("bakedclay:desert_stone4") +simplyslopes.register_all2("bakedclay:desert_stone5") +simplyslopes.register_all2("bakedclay:red1") +simplyslopes.register_all2("bakedclay:red2") + + + diff --git a/mods/smartshop/README.md b/mods/smartshop/README.md new file mode 100644 index 00000000..3a768640 --- /dev/null +++ b/mods/smartshop/README.md @@ -0,0 +1,19 @@ +# smartshop +mod for minetest + +Licenses: code: LGPL-2.1, media: CC BY-SA-4.0 + +Version: 7.11 + +Like the title says, this is a smart and easy shop, that will also fit everywhere. + +it is a mix of a vending machine, a shop, item frames and light. + +You can toogle it unlimited or limited if you have give or creative +(unlimited will not take or add stuff to its inventory) + +The "All" button will limit your stock to the inventory or and the giveline, its on as default. + +wifi storage, send to and refill from wifi storages + +It also works with pipeworks, mesecon and aliveai diff --git a/mods/smartshop/depends.txt b/mods/smartshop/depends.txt new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/mods/smartshop/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/smartshop/description.txt b/mods/smartshop/description.txt new file mode 100644 index 00000000..a120377b --- /dev/null +++ b/mods/smartshop/description.txt @@ -0,0 +1 @@ +Smart and easy shop \ No newline at end of file diff --git a/mods/smartshop/init.lua b/mods/smartshop/init.lua new file mode 100644 index 00000000..031bd433 --- /dev/null +++ b/mods/smartshop/init.lua @@ -0,0 +1,696 @@ +smartshop={user={},tmp={},add_storage={},max_wifi_distance=30, +mesecon=minetest.get_modpath("mesecons")~=nil, +dir={{x=0,y=0,z=-1},{x=-1,y=0,z=0},{x=0,y=0,z=1},{x=1,y=0,z=0}}, +dpos={ +{{x=0.2,y=0.2,z=0},{x=-0.2,y=0.2,z=0},{x=0.2,y=-0.2,z=0},{x=-0.2,y=-0.2,z=0}}, +{{x=0,y=0.2,z=0.2},{x=0,y=0.2,z=-0.2},{x=0,y=-0.2,z=0.2},{x=0,y=-0.2,z=-0.2}}, +{{x=-0.2,y=0.2,z=0},{x=0.2,y=0.2,z=0},{x=-0.2,y=-0.2,z=0},{x=0.2,y=-0.2,z=0}}, +{{x=0,y=0.2,z=-0.2},{x=0,y=0.2,z=0.2},{x=0,y=-0.2,z=-0.2},{x=0,y=-0.2,z=0.2}}} +} + +minetest.register_craft({ + output = "smartshop:shop", + recipe = { + {"default:chest_locked", "default:chest_locked", "default:chest_locked"}, + {"default:sign_wall_wood", "default:chest_locked", "default:sign_wall_wood"}, + {"default:sign_wall_wood", "default:torch", "default:sign_wall_wood"}, + } +}) + +minetest.register_craft({ + output = "smartshop:wifistorage", + recipe = { + {"default:mese_crystal_fragment", "default:chest_locked", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:chest_locked", "default:mese_crystal_fragment"}, + {"default:steel_ingot", "default:copper_ingot", "default:steel_ingot"}, + } +}) + +smartshop.strpos=function(str,spl) + if str==nil then return "" end + if spl then + local c="," + if string.find(str," ") then c=" " end + local s=str.split(str,c) + if s[3]==nil then + return nil + else + local p={x=tonumber(s[1]),y=tonumber(s[2]),z=tonumber(s[3])} + if not (p and p.x and p.y and p.z) then return nil end + return p + end + else if str and str.x and str.y and str.z then + return str.x .."," .. str.y .."," .. str.z + else + return nil + end + end +end + +smartshop.send_mesecon=function(pos) + if smartshop.mesecon then + mesecon.receptor_on(pos) + minetest.get_node_timer(pos):start(1) + end +end + +smartshop.use_offer=function(pos,player,n) + local pressed={} + pressed["buy" .. n]=true + smartshop.user[player:get_player_name()]=pos + smartshop.receive_fields(player,pressed) + smartshop.user[player:get_player_name()]=nil + smartshop.update(pos) +end + +smartshop.get_offer=function(pos) + if not pos or not minetest.get_node(pos) then return end + if minetest.get_node(pos).name~="smartshop:shop" then return end + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local offer={} + for i=1,4,1 do + offer[i]={ + give=inv:get_stack("give" .. i,1):get_name(), + give_count=inv:get_stack("give" .. i,1):get_count(), + pay=inv:get_stack("pay" .. i,1):get_name(), + pay_count=inv:get_stack("pay" .. i,1):get_count(), + } + end + return offer +end + +smartshop.receive_fields=function(player,pressed) + local pname=player:get_player_name() + local pos=smartshop.user[pname] + if not pos then + return + elseif pressed.tsend then + smartshop.add_storage[pname]={send=true,pos=pos} + minetest.after(30, function(pname) + if smartshop.add_storage[pname] then + minetest.chat_send_player(pname, "Time expired (30s)") + smartshop.add_storage[pname]=nil + end + end, pname) + minetest.chat_send_player(pname, "Open a storage owned by you") + return + elseif pressed.trefill then + smartshop.add_storage[pname]={refill=true,pos=pos} + minetest.after(30, function(pname) + if smartshop.add_storage[pname] then + minetest.chat_send_player(pname, "Time expired (30s)") + smartshop.add_storage[pname]=nil + end + end, pname) + minetest.chat_send_player(pname, "Open a storage owned by you") + return + elseif pressed.customer then + return smartshop.showform(pos,player,true) + elseif pressed.sellall then + local meta=minetest.get_meta(pos) + local pname=player:get_player_name() + if meta:get_int("sellall")==0 then + meta:set_int("sellall",1) + minetest.chat_send_player(pname, "Sell your stock and give line") + else + meta:set_int("sellall",0) + minetest.chat_send_player(pname, "Sell your stock only") + end + elseif pressed.toogleee then + local meta=minetest.get_meta(pos) + local pname=player:get_player_name() + if meta:get_int("type")==0 then + meta:set_int("type",1) + minetest.chat_send_player(pname, "Your stock is limited") + else + meta:set_int("type",0) + minetest.chat_send_player(pname, "Your stock is unlimited") + end + elseif not pressed.quit then + local n=1 + for i=1,4,1 do + n=i + if pressed["buy" .. i] then break end + end + local meta=minetest.get_meta(pos) + local type=meta:get_int("type") + local sellall=meta:get_int("sellall") + local inv=meta:get_inventory() + local pinv=player:get_inventory() + local pname=player:get_player_name() + local check_storage + if pressed["buy" .. n] then + local name=inv:get_stack("give" .. n,1):get_name() + local stack=name .." ".. inv:get_stack("give" .. n,1):get_count() + local pay=inv:get_stack("pay" .. n,1):get_name() .." ".. inv:get_stack("pay" .. n,1):get_count() + local stack_to_use="main" + if name~="" then +--fast checks + if not pinv:room_for_item("main", stack) then + minetest.chat_send_player(pname, "Error: Your inventory is full, exchange aborted.") + return + elseif not pinv:contains_item("main", pay) then + minetest.chat_send_player(pname, "Error: You dont have enough in your inventory to buy this, exchange aborted.") + return + elseif type==1 and inv:room_for_item("main", pay)==false then + minetest.chat_send_player(pname, "Error: The owners stock is full, cant receive, exchange aborted.") + else + if inv:contains_item("main", stack) then + elseif sellall==1 and inv:contains_item("give" .. n, stack) then + stack_to_use="give" .. n + else + minetest.chat_send_player(pname, "Error: The owners stock is end.") + check_storage=1 + end + if not check_storage then + for i=0,32,1 do + if pinv:get_stack("main", i):get_name()==inv:get_stack("pay" .. n,1):get_name() and pinv:get_stack("main",i):get_wear()>0 then + minetest.chat_send_player(pname, "Error: your item is used") + return + end + end + local rastack=inv:remove_item(stack_to_use, stack) + pinv:remove_item("main", pay) + pinv:add_item("main",rastack) + if type==1 then inv:add_item("main",pay) end + if type==0 then inv:add_item("main", rastack) end + end + end +-- send to / refill from wifi storage + if type==1 then + local tsend=smartshop.strpos(meta:get_string("item_send"),1) + local trefill=smartshop.strpos(meta:get_string("item_refill"),1) + if tsend then + local m=minetest.get_meta(tsend) + local inv2=m:get_inventory() + local mes=m:get_int("mesein") + for i=1,10,1 do + if inv2:room_for_item("main", pay) and inv:contains_item("main", pay) then + inv2:add_item("main",pay) + inv:remove_item("main", pay) + if mes==1 or mes==3 then + smartshop.send_mesecon(tsend) + end + else + break + end + end + end + if trefill then + local m=minetest.get_meta(trefill) + local inv2=m:get_inventory() + local mes=m:get_int("mesein") + + local space=0 +--check if its room for other items, else the shop will stuck + for i=1,32,1 do + if inv:get_stack("main",i):get_count()==0 then + space=space+1 + end + end + for i=1,space,1 do + if ismartshop.max_wifi_distance then + minetest.chat_send_player(uname, "Too far, max distance " .. smartshop.max_wifi_distance) + end + local meta=minetest.get_meta(a.pos) + local p=smartshop.strpos(pos) + if a.send and p then + meta:set_string("item_send",p) + elseif a.refill and p then + meta:set_string("item_refill",p) + end + minetest.chat_send_player(uname, "smartshop connected") + smartshop.add_storage[uname]=nil + end +end + +minetest.register_node("smartshop:wifistorage", { + description = "Wifi storage", + tiles = {"default_chest_top.png^[colorize:#ffffff77^default_obsidian_glass.png"}, + groups = {choppy = 2, oddly_breakable_by_hand = 1,tubedevice = 1, tubedevice_receiver = 1,mesecon=2}, + paramtype = "light", + sunlight_propagates = true, + light_source = 10, + on_timer = function (pos, elapsed) + if smartshop.mesecon then + mesecon.receptor_off(pos) + end + return false + end, + tube = {insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local added = inv:add_item("main", stack) + return added + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("main", stack) + end, + input_inventory = "main", + connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1}}, +after_place_node = function(pos, placer) + local meta=minetest.get_meta(pos) + local name=placer:get_player_name() + meta:set_string("owner",name) + meta:set_string("infotext", "Wifi storage by: " .. name) + end, +on_construct = function(pos) + local meta=minetest.get_meta(pos) + meta:get_inventory():set_size("main", 60) + meta:set_int("mesein",0) + meta:set_string("title","wifi" .. math.random(1,999)) + end, +on_rightclick = function(pos, node, player, itemstack, pointed_thing) + smartshop.showform2(pos,player) + end, +allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if stack:get_wear()==0 and (minetest.get_meta(pos):get_string("owner")==player:get_player_name() or minetest.check_player_privs(player:get_player_name(), {protection_bypass=true})) then + return stack:get_count() + end + return 0 + end, +allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if minetest.get_meta(pos):get_string("owner")==player:get_player_name() or minetest.check_player_privs(player:get_player_name(), {protection_bypass=true}) then + return stack:get_count() + end + return 0 + end, +can_dig = function(pos, player) + local meta=minetest.get_meta(pos) + local inv=meta:get_inventory() + local p=player:get_player_name() + if (meta:get_string("owner")==p or minetest.check_player_privs(p, {protection_bypass=true})) and inv:is_empty("main") or meta:get_string("owner")=="" then + return true + end + end, +}) + diff --git a/mods/smartshop/screenshot.png b/mods/smartshop/screenshot.png new file mode 100644 index 00000000..96c8cc4d Binary files /dev/null and b/mods/smartshop/screenshot.png differ diff --git a/mods/spectator_mode/.luacheckrc b/mods/spectator_mode/.luacheckrc new file mode 100644 index 00000000..8143a8c0 --- /dev/null +++ b/mods/spectator_mode/.luacheckrc @@ -0,0 +1,12 @@ +unused_args = false +allow_defined_top = true + +read_globals = { + "minetest", + "vector", +} + +globals = { + "default", + "player_api", +} diff --git a/mods/spectator_mode/LICENSE b/mods/spectator_mode/LICENSE new file mode 100644 index 00000000..5a8e3325 --- /dev/null +++ b/mods/spectator_mode/LICENSE @@ -0,0 +1,14 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + diff --git a/mods/spectator_mode/README.md b/mods/spectator_mode/README.md new file mode 100644 index 00000000..6f9f21ea --- /dev/null +++ b/mods/spectator_mode/README.md @@ -0,0 +1,21 @@ +# Spectator Mode + +A mod for Minetest allowing you to watch other players in their 3rd person view. +You're invisible and undetectable for the players when you're in this mode. + +Can be useful for admins or moderators in their task of monitoring. +Requires the privilege `watch`. + +## Dependencies + +- `player_api` (included in [`minetest_game`](https://github.com/minetest/minetest_game)) +- `default` (included in [`minetest_game`](https://github.com/minetest/minetest_game)) + +## Requirements + +This mod requires MT 5.0.0 and above. + +## Commands + +`/watch `
+`/unwatch` (get back to your initial position) diff --git a/mods/spectator_mode/init.lua b/mods/spectator_mode/init.lua new file mode 100644 index 00000000..308d9e46 --- /dev/null +++ b/mods/spectator_mode/init.lua @@ -0,0 +1,106 @@ +local original_pos = {} + +minetest.register_privilege("watch", { + description = "Player can watch other players", + give_to_singleplayer = false, + give_to_admin = true, +}) + +local function toggle_hud_flags(player, bool) + local flags = player:hud_get_flags() + local new_hud_flags = {} + + for flag in pairs(flags) do + new_hud_flags[flag] = bool + end + + player:hud_set_flags(new_hud_flags) +end + +local function unwatching(name) + local watcher = minetest.get_player_by_name(name) + local privs = minetest.get_player_privs(name) + + if watcher and default.player_attached[name] == true then + watcher:set_detach() + player_api.player_attached[name] = false + watcher:set_eye_offset(vector.new(), vector.new()) + watcher:set_nametag_attributes({color = {a = 255, r = 255, g = 255, b = 255}}) + + toggle_hud_flags(watcher, true) + + watcher:set_properties({ + visual_size = {x = 1, y = 1}, + makes_footstep_sound = true, + collisionbox = {-0.3, 0.0, -0.3, 0.3, 1.7, 0.3} + }) + + if not privs.interact and privs.watch == true then + privs.interact = true + minetest.set_player_privs(name, privs) + end + + local pos = original_pos[watcher] + if pos then + -- set_pos seems to be very unreliable + -- this workaround helps though + minetest.after(0.1, function() + watcher:set_pos(pos) + end) + original_pos[watcher] = nil + end + end +end + +minetest.register_chatcommand("watch", { + params = "", + description = "Watch a given player", + privs = {watch = true}, + func = function(name, param) + local watcher = minetest.get_player_by_name(name) + local target = minetest.get_player_by_name(param) + local privs = minetest.get_player_privs(name) + + if target and watcher ~= target then + if player_api.player_attached[name] == true then + unwatching(param) + else + original_pos[watcher] = watcher:get_pos() + end + + player_api.player_attached[name] = true + watcher:set_attach(target, "", vector.new(0, -5, -20), vector.new()) + watcher:set_eye_offset(vector.new(0, -5, -20), vector.new()) + watcher:set_nametag_attributes({color = {a = 0}}) + + toggle_hud_flags(watcher, true) + + watcher:set_properties({ + visual_size = {x = 0, y = 0}, + makes_footstep_sound = false, + collisionbox = {0} + }) + + privs.interact = nil + minetest.set_player_privs(name, privs) + + return true, "Watching '" .. param .. "' at ".. + minetest.pos_to_string(vector.round(target:get_pos())) + end + + return false, "Invalid parameter ('" .. param .. "')." + end +}) + +minetest.register_chatcommand("unwatch", { + description = "Unwatch a player", + privs = {watch=true}, + func = function(name, param) + unwatching(name) + end +}) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + unwatching(name) +end) diff --git a/mods/spectator_mode/mod.conf b/mods/spectator_mode/mod.conf new file mode 100644 index 00000000..707ce838 --- /dev/null +++ b/mods/spectator_mode/mod.conf @@ -0,0 +1,6 @@ +name = spectator_mode +depends = default, player_api +description = """ +A mod for Minetest allowing you to watch other players in their 3rd person view. +You're invisible and undetectable for the players when you're in this mode. +""" diff --git a/mods/stoneworks/README.md b/mods/stoneworks/README.md new file mode 100644 index 00000000..8c4a1197 --- /dev/null +++ b/mods/stoneworks/README.md @@ -0,0 +1 @@ +# stoneworks \ No newline at end of file diff --git a/mods/stoneworks/README.txt b/mods/stoneworks/README.txt new file mode 100644 index 00000000..54dff797 --- /dev/null +++ b/mods/stoneworks/README.txt @@ -0,0 +1,4 @@ + Stoneworks 1.1 by TumeniNodes (released - June 16, 2016) +Adds various, single node arches..., straight, T-connect, Quad-connect, corner. +Adds various, thin wall system components..., and thin wall arches. +For more info see description.txt, and licensing.txt diff --git a/mods/stoneworks/changelog.txt b/mods/stoneworks/changelog.txt new file mode 100644 index 00000000..857d86de --- /dev/null +++ b/mods/stoneworks/changelog.txt @@ -0,0 +1,6 @@ +02/03/2017: +chg-01: Updated with new _block nodes from Minetest 0.04.15 +chg-02: Update version to 1.1 +06/17/2017 +chg-01: Update with 0.4.16 +chg-02: Update version to 1.2 diff --git a/mods/stoneworks/depends.txt b/mods/stoneworks/depends.txt new file mode 100644 index 00000000..4ad96d51 --- /dev/null +++ b/mods/stoneworks/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/stoneworks/description.txt b/mods/stoneworks/description.txt new file mode 100644 index 00000000..35b7d603 --- /dev/null +++ b/mods/stoneworks/description.txt @@ -0,0 +1,4 @@ +Stoneworks simply adds some fun, and cool building options to Minetest. +Thin wall system, and arches sytem +The "low iron fence works with all "low walls" +The "high/low iron fence" works with all arches. It can be doubled over to fill taller/wider openings. diff --git a/mods/stoneworks/init.lua b/mods/stoneworks/init.lua new file mode 100644 index 00000000..e80f843b --- /dev/null +++ b/mods/stoneworks/init.lua @@ -0,0 +1,894 @@ +-- [MOD] StoneWorks [stoneworks] (1.2) by TumeniNodes + +stoneworks = {} + +-- Register stoneworks. +-- Node will be called stoneworks:arches_ + +function stoneworks.register_arches(subname, recipeitem, groups, images, description, sounds) + groups.arches = 1 +minetest.register_node(":stoneworks:arches_low_wall" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_high" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.5, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, 0.5}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, 0.5}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, 0.5}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, 0.5}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, 0.5}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, 0.5}, + {0.375, -0.4375, -0.5, 0.5, -0.25, 0.5}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, 0.5}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_low" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.125, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, 0.5}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, 0.5}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, 0.5}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, 0.5}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, 0.5}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, 0.5}, + {0.375, -0.4375, -0.5, 0.5, -0.25, 0.5}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, 0.5}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_high_quad" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.5, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, -0.0625}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, -0.0625}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, -0.1875}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, -0.1875}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, -0.3125}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, -0.3125}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, -0.375}, + {0.375, -0.4375, -0.5, 0.5, -0.25, -0.375}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, -0.4375}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, -0.4375}, + {0.0625, -0.125, 0.0625, 0.5, -0.0625, 0.5}, + {0.1875, -0.1875, 0.1875, 0.5, -0.125, 0.5}, + {-0.5, -0.3125, 0.3125, -0.3125, -0.1875, 0.5}, + {-0.5, -0.4375, 0.375, -0.375, -0.25, 0.5}, + {0.375, -0.4375, 0.375, 0.5, -0.25, 0.5}, + {-0.5, -0.5, 0.4375, -0.4375, -0.3125, 0.5}, + {0.3125, -0.3125, 0.3125, 0.5, -0.1875, 0.5}, + {0.4375, -0.5, 0.4375, 0.5, -0.3125, 0.5}, + {-0.5, -0.1875, 0.1875, -0.1875, -0.125, 0.5}, + {-0.5, -0.125, 0.0625, -0.0625, -0.0625, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_low_quad" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.125, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, -0.0625}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, -0.0625}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, -0.1875}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, -0.1875}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, -0.3125}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, -0.3125}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, -0.375}, + {0.375, -0.4375, -0.5, 0.5, -0.25, -0.375}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, -0.4375}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, -0.4375}, + {0.0625, -0.125, 0.0625, 0.5, -0.0625, 0.5}, + {0.1875, -0.1875, 0.1875, 0.5, -0.125, 0.5}, + {-0.5, -0.3125, 0.3125, -0.3125, -0.1875, 0.5}, + {-0.5, -0.4375, 0.375, -0.375, -0.25, 0.5}, + {0.375, -0.4375, 0.375, 0.5, -0.25, 0.5}, + {-0.5, -0.5, 0.4375, -0.4375, -0.3125, 0.5}, + {0.3125, -0.3125, 0.3125, 0.5, -0.1875, 0.5}, + {0.4375, -0.5, 0.4375, 0.5, -0.3125, 0.5}, + {-0.5, -0.1875, 0.1875, -0.1875, -0.125, 0.5}, + {-0.5, -0.125, 0.0625, -0.0625, -0.0625, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_high_T" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.5, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, -0.0625}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, -0.0625}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, -0.1875}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, -0.1875}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, -0.3125}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, -0.3125}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, -0.375}, + {0.375, -0.4375, -0.5, 0.5, -0.25, -0.375}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, -0.4375}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, -0.4375}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, 0.5}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, 0.5}, + {-0.5, -0.3125, 0.3125, -0.3125, -0.1875, 0.5}, + {-0.5, -0.4375, 0.375, -0.375, -0.25, 0.5}, + {0.375, -0.4375, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.5, 0.4375, -0.4375, -0.3125, 0.5}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {0.4375, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, -0.1875, 0.1875, -0.1875, -0.125, 0.5}, + {-0.5, -0.125, 0.0625, -0.0625, -0.0625, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_low_T" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.125, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, -0.0625}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, -0.0625}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, -0.1875}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, -0.1875}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, -0.3125}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, -0.3125}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, -0.375}, + {0.375, -0.4375, -0.5, 0.5, -0.25, -0.375}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, -0.4375}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, -0.4375}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, 0.5}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, 0.5}, + {-0.5, -0.3125, 0.3125, -0.3125, -0.1875, 0.5}, + {-0.5, -0.4375, 0.375, -0.375, -0.25, 0.5}, + {0.375, -0.4375, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.5, 0.4375, -0.4375, -0.3125, 0.5}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {0.4375, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, -0.1875, 0.1875, -0.1875, -0.125, 0.5}, + {-0.5, -0.125, 0.0625, -0.0625, -0.0625, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_high_corner" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.5, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, -0.0625}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, -0.0625}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, -0.1875}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, -0.1875}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, -0.3125}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, -0.375}, + {0.375, -0.4375, -0.5, 0.5, -0.25, -0.375}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, -0.4375}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, -0.4375}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, 0.5}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, 0.5}, + {-0.5, -0.3125, 0.3125, 0.5, -0.1875, 0.5}, + {-0.5, -0.4375, 0.375, 0.5, -0.25, 0.5}, + {0.375, -0.4375, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.5, 0.4375, 0.5, -0.3125, 0.5}, + {0.375, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {0.4375, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, -0.1875, 0.1875, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.0625, 0.5, -0.0625, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:arches_low_corner" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0.125, 0.5}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, -0.0625}, + {-0.5, -0.125, -0.5, -0.0625, -0.0625, -0.0625}, + {-0.5, -0.1875, -0.5, -0.1875, -0.125, -0.1875}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, -0.1875}, + {0.3125, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {-0.5, -0.3125, -0.5, -0.3125, -0.1875, -0.3125}, + {-0.5, -0.4375, -0.5, -0.375, -0.25, -0.375}, + {0.375, -0.4375, -0.5, 0.5, -0.25, -0.375}, + {0.4375, -0.5, -0.5, 0.5, -0.3125, -0.4375}, + {-0.5, -0.5, -0.5, -0.4375, -0.3125, -0.4375}, + {0.0625, -0.125, -0.5, 0.5, -0.0625, 0.5}, + {0.1875, -0.1875, -0.5, 0.5, -0.125, 0.5}, + {-0.5, -0.3125, 0.3125, 0.5, -0.1875, 0.5}, + {-0.5, -0.4375, 0.375, 0.5, -0.25, 0.5}, + {0.375, -0.4375, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.5, 0.4375, 0.5, -0.3125, 0.5}, + {0.375, -0.3125, -0.5, 0.5, -0.1875, 0.5}, + {0.4375, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, -0.1875, 0.1875, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.0625, 0.5, -0.0625, 0.5}, + } + } +}) +end + +-- Register stoneworks. +-- Node will be called stoneworks:thin_wall_ + +function stoneworks.register_thin_wall(subname, recipeitem, groups, images, description, sounds) + groups.thin_wall = 1 +minetest.register_node("stoneworks:thin_wall_high" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.5, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_low" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.125, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_high_corner" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.1875, 0.5, 0.1875}, + {-0.1875, -0.5, -0.5, 0.1875, 0.5, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_low_corner" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.1875, 0.5, 0.125, 0.1875}, + {-0.1875, -0.5, -0.1875, 0.1875, 0.125, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_high_T" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.5, 0.1875}, + {-0.1875, -0.5, -0.5, 0.1875, 0.5, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_high_low_T" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.5, 0.1875}, + {-0.1875, -0.5, -0.5, 0.1875, 0.125, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_low_T" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.5, 0.1875, 0.125, 0.1875}, + {-0.5, -0.5, -0.1875, 0.5, 0.125, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_high_quad" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.5, 0.1875}, + {-0.1875, -0.5, -0.5, 0.1875, 0.5, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_high_low_quad" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1875, 0.5, 0.125, 0.1875}, + {-0.1875, -0.5, -0.5, 0.1875, 0.5, 0.5}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_low_quad" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.1875, -0.5, -0.5, 0.1875, 0.125, 0.5}, + {-0.5, -0.5, -0.1875, 0.5, 0.125, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_high_arch" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.1875, 0.5, 0.5, 0.1875}, + {0.0625, -0.125, -0.1875, 0.5, -0.0625, 0.1875}, + {-0.5, -0.125, -0.1875, -0.0625, -0.0625, 0.1875}, + {-0.5, -0.1875, -0.1875, -0.1875, -0.125, 0.1875}, + {0.1875, -0.1875, -0.1875, 0.5, -0.125, 0.1875}, + {0.3125, -0.3125, -0.1875, 0.5, -0.1875, 0.1875}, + {-0.5, -0.3125, -0.1875, -0.3125, -0.1875, 0.1875}, + {-0.5, -0.4375, -0.1875, -0.375, -0.25, 0.1875}, + {0.375, -0.4375, -0.1875, 0.5, -0.25, 0.1875}, + {0.4375, -0.5, -0.1875, 0.5, -0.3125, 0.1875}, + {-0.5, -0.5, -0.1875, -0.4375, -0.3125, 0.1875}, + } + } +}) + +minetest.register_node(":stoneworks:thin_wall_low_arch" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = groups, + is_ground_content = false, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.1875, 0.5, 0.125, 0.1875}, + {0.0625, -0.125, -0.1875, 0.5, -0.0625, 0.1875}, + {-0.5, -0.125, -0.1875, -0.0625, -0.0625, 0.1875}, + {-0.5, -0.1875, -0.1875, -0.1875, -0.125, 0.1875}, + {0.1875, -0.1875, -0.1875, 0.5, -0.125, 0.1875}, + {0.3125, -0.3125, -0.1875, 0.5, -0.1875, 0.1875}, + {-0.5, -0.3125, -0.1875, -0.3125, -0.1875, 0.1875}, + {-0.5, -0.4375, -0.1875, -0.375, -0.25, 0.1875}, + {0.375, -0.4375, -0.1875, 0.5, -0.25, 0.1875}, + {0.4375, -0.5, -0.1875, 0.5, -0.3125, 0.1875}, + {-0.5, -0.5, -0.1875, -0.4375, -0.3125, 0.1875}, + } + } +}) +end + +-- Arches/thin wall registration function. +-- Nodes will be called stoneworks:{arches,thin_wall}_ + +function stoneworks.register_arches_and_thin_wall(subname, recipeitem, groups, images,desc_arches, desc_thin_wall, sounds) + stoneworks.register_arches(subname, recipeitem, groups, images, desc_arches, sounds) + stoneworks.register_thin_wall(subname, recipeitem, groups, images, desc_thin_wall, sounds) +end + +-- Register arches and thin_wall + +stoneworks.register_arches_and_thin_wall("wood", "default:wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_wood.png"}, + "Wooden Arches", + "Wooden Thin Wall", + default.node_sound_wood_defaults()) + +stoneworks.register_arches_and_thin_wall("junglewood", "default:junglewood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_junglewood.png"}, + "Junglewood Arches", + "Junglewood Thin Wall", + default.node_sound_wood_defaults()) + +stoneworks.register_arches_and_thin_wall("pine_wood", "default:pine_wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_pine_wood.png"}, + "Pine Wood Arches", + "Pine Wood Thin Wall", + default.node_sound_wood_defaults()) + +stoneworks.register_arches_and_thin_wall("acacia_wood", "default:acacia_wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_acacia_wood.png"}, + "Acacia Wood Arches", + "Acacia Wood Thin Wall", + default.node_sound_wood_defaults()) + +stoneworks.register_arches_and_thin_wall("aspen_wood", "default:aspen_wood", + {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + {"default_aspen_wood.png"}, + "Aspen Wood Arches", + "Aspen Wood Thin Wall", + default.node_sound_wood_defaults()) + +stoneworks.register_arches_and_thin_wall("brick", "default:brick", + {cracky = 3}, + {"default_brick.png"}, + "Brick Arches", + "Brick Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("clay", "default:clay", + {cracky = 3}, + {"default_clay.png"}, + "Clay Arches", + "Clay Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("stone", "default:stone", + {cracky = 3}, + {"default_stone.png"}, + "Stone Arches", + "Stone Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("stonebrick", "default:stonebrick", + {cracky = 3}, + {"default_stone_brick.png"}, + "Stone Brick Arches", + "Stone Brick Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("stone_block", "default:stone_block", + {cracky = 3}, + {"default_stone_block.png"}, + "Stone Block Arches", + "Stone Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("cobble", "default:cobble", + {cracky = 3}, + {"default_cobble.png"}, + "Cobblestone Arches", + "Cobblestone Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("mossycobble", "default:mossycobble", + {cracky = 3}, + {"default_mossycobble.png"}, + "Mossy Cobblestone Arches", + "Mossy Cobblestone Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("desert_cobble", "default:desert_cobble", + {cracky = 3}, + {"default_desert_cobble.png"}, + "Desert Cobble Arches", + "Desert Cobble Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("desert_stone", "default:desert_stone", + {cracky = 3}, + {"default_desert_stone.png"}, + "Desertstone Arches", + "Desertstone Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("desert_stonebrick", "default:desert_stonebrick", + {cracky = 3}, + {"default_desert_stone_brick.png"}, + "Desertstone Brick Arches", + "Desertstone Brick Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("desert_stone_block", "default:desert_stone_block", + {cracky = 3}, + {"default_desert_stone_block.png"}, + "Desertstone Block Arches", + "Desertstone Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("desert_sandstone", "default:desert_sandstone", + {crumbly = 1, cracky = 3}, + {"default_desert_sandstone.png"}, + "Desert Sandstone Arches", + "Desert Sandstone Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("desert_sandstone_brick", "default:desert_sandstone_brick", + {cracky = 2}, + {"default_desert_sandstone_brick.png"}, + "Desert Sandstone Brick Arches", + "Desert Sandstone Brick Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("desert_sandstone_block", "default:desert_sandstone_block", + {cracky = 2}, + {"default_desert_sandstone_block.png"}, + "Desert Sandstone Block Arches", + "Desert Sandstone Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("sandstone", "default:sandstone", + {crumbly = 1, cracky = 3}, + {"default_sandstone.png"}, + "Sandstone Arches", + "Sandstone Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("sandstonebrick", "default:sandstonebrick", + {cracky = 2}, + {"default_sandstone_brick.png"}, + "Sandstone Brick Arches", + "Sandstone Brick Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("sandstone_block", "default:sandstone_block", + {cracky = 2}, + {"default_sandstone_block.png"}, + "Sandstone Block Arches", + "Sandstone Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("silver_sandstone", "default:silver_sandstone", + {crumbly = 1, cracky = 3}, + {"default_silver_sandstone.png"}, + "Silver Sandstone Arches", + "Silver Sandstone Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("silver_sandstone_brick", "default:silver_sandstone_brick", + {cracky = 2}, + {"default_silver_sandstone_brick.png"}, + "Silver Sandstone Brick Arches", + "Silver Sandstone Brick Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("silver_sandstone_block", "default:silver_sandstone_block", + {cracky = 2}, + {"default_silver_sandstone_block.png"}, + "Silver Sandstone Block Arches", + "Silver Sandstone Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("obsidian", "default:obsidian", + {cracky = 1, level = 2}, + {"default_obsidian.png"}, + "Obsidian Arches", + "Obsidian Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("obsidianbrick", "default:obsidianbrick", + {cracky = 1, level = 2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick Arches", + "Obsidian Brick Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("obsidian_block", "default:obsidian_block", + {cracky = 1, level = 2}, + {"default_obsidian_block.png"}, + "Obsidian Block Arches", + "Obsidian Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("bronzeblock", "default:bronzeblock", + {cracky = 1, level = 2}, + {"default_bronze_block.png"}, + "Bronze Block Arches", + "Bronze Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("coalblock", "default:coalblock", + {cracky = 1, level = 2}, + {"default_coal_block.png"}, + "Coal Block Arches", + "Coal Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("copperblock", "default:copperblock", + {cracky = 1, level = 2}, + {"default_copper_block.png"}, + "Copper Block Arches", + "Copper Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("diamondblock", "default:diamondblock", + {cracky = 1, level = 2}, + {"default_diamond_block.png"}, + "Diamond Block Arches", + "Diamond Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("goldblock", "default:goldblock", + {cracky = 1, level = 2}, + {"default_gold_block.png"}, + "Gold Block Arches", + "Gold Block Thin Wall", + default.node_sound_stone_defaults()) + +--[[stoneworks.register_arches_and_thin_wall("ironblock", "default:ironblock", + {cracky = 1, level = 2}, + {"default_iron_block.png"}, + "Iron Block Arches", + "Iron Block Thin Wall", + default.node_sound_stone_defaults())]]-- + +stoneworks.register_arches_and_thin_wall("meseblock", "default:meseblock", + {cracky = 1, level = 2}, + {"default_mese_block.png"}, + "Mese Block Arches", + "Mese Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("steelblock", "default:steelblock", + {cracky = 1, level = 2}, + {"default_steel_block.png"}, + "Steel Block Arches", + "Steel Block Thin Wall", + default.node_sound_stone_defaults()) + +stoneworks.register_arches_and_thin_wall("tinblock", "default:tinblock", + {cracky = 1, level = 2}, + {"default_tin_block.png"}, + "Tin Block Arches", + "Tin Block Thin Wall", + default.node_sound_stone_defaults()) + + +minetest.register_node("stoneworks:highironfence", { + description = "StoneWorks high ironfence", + drawtype = "nodebox", + tiles = {"stoneworks_ironfence_side.png", "stoneworks_ironfence_side.png", + "stoneworks_ironfence_side.png", "stoneworks_ironfence_side.png", + "stoneworks_ironfence.png", "stoneworks_ironfence.png"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.0625, 0.5, 0.5, 0}, + } + } +}) + +minetest.register_node("stoneworks:lowironfence", { + description = "StoneWorks low ironfence", + drawtype = "nodebox", + tiles = {"stoneworks_ironfence_side.png", "stoneworks_ironfence_side.png", + "stoneworks_ironfence_side.png", "stoneworks_ironfence_side.png", + "stoneworks_ironfence.png", "stoneworks_ironfence.png"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.875, -0.0625, 0.5, -0.5, 0}, + } + } +}) + +minetest.register_node("stoneworks:highlowironfence", { + description = "StoneWorks Highlow ironfence", + drawtype = "nodebox", + tiles = {"stoneworks_ironfence_side.png", "stoneworks_ironfence_side.png", + "stoneworks_ironfence_side.png", "stoneworks_ironfence_side.png", + "stoneworks_ironfence.png", "stoneworks_ironfence.png"}, + use_texture_alpha = true, + paramtype = "light", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {cracky=3, stone=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.875, -0.0625, 0.5, 1, 0}, + } + } +}) diff --git a/mods/stoneworks/license.txt b/mods/stoneworks/license.txt new file mode 100644 index 00000000..1bf9243d --- /dev/null +++ b/mods/stoneworks/license.txt @@ -0,0 +1,334 @@ +-----*This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +-----*Minetest default textures are licensed as stated in the default mod README.txt: + +Minetest Game mod: default +========================== + +License of source code: +----------------------- +Copyright (C) 2011-2012 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or +(at your option) any later version. + +http://www.gnu.org/licenses/lgpl-2.1.html + +License of media (textures and sounds) +-------------------------------------- +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ + +Authors of media files +----------------------- +Everything not listed in here: +Copyright (C) 2010-2012 celeron55, Perttu Ahola + +Cisoun's WTFPL texture pack: + default_jungletree.png + default_lava.png + default_leaves.png + default_sapling.png + default_stone.png + default_tree.png + default_tree_top.png + default_water.png + +Cisoun's conifers mod (WTFPL): + default_pine_needles.png + +Originating from G4JC's Almost MC Texture Pack: + default_torch.png + default_torch_on_ceiling.png + default_torch_on_floor.png + +VanessaE's animated torches (WTFPL): + default_torch_animated.png + default_torch_on_ceiling_animated.png + default_torch_on_floor_animated.png + default_torch_on_floor.png + +RealBadAngel's animated water (WTFPL): + default_water_source_animated.png + default_water_flowing_animated.png + +VanessaE (WTFPL): + default_nc_back.png + default_nc_front.png + default_nc_rb.png + default_nc_side.png + default_desert_sand.png + default_desert_stone.png + default_sand.png + +Calinou (CC BY-SA): + default_brick.png + default_papyrus.png + default_mineral_copper.png + default_glass_detail.png + +MirceaKitsune (WTFPL): + character.x + +Jordach (CC BY-SA 3.0): + character.png + +PilzAdam (WTFPL): + default_jungleleaves.png + default_junglesapling.png + default_obsidian_glass.png + default_obsidian_shard.png + default_mineral_gold.png + default_snowball.png + +jojoa1997 (WTFPL): + default_obsidian.png + +InfinityProject (WTFPL): + default_mineral_diamond.png + +Splizard (CC BY-SA 3.0): + default_snow.png + default_pine_sapling.png + +Zeg9 (CC BY-SA 3.0): + default_coal_block.png + default_steel_block.png + default_copper_block.png + default_bronze_block.png + default_gold_block.png + +paramat (CC BY-SA 3.0): + wieldhand.png -- Copied from character.png by Jordach (CC BY-SA 3.0) + default_pinetree.png + default_pinetree_top.png + default_pinewood.png + default_acacia_leaves.png + default_acacia_sapling.png + default_acacia_tree.png + default_acacia_tree_top.png + default_acacia_wood.png + default_junglewood.png + default_jungletree_top.png + default_sandstone_brick.png + default_obsidian_brick.png + default_stone_brick.png + default_desert_stone_brick.png + default_river_water.png + default_river_water_source_animated.png + default_river_water_flowing_animated.png + default_dry_grass.png + default_dry_grass_side.png + default_dry_grass_*.png + default_grass.png + default_grass_side.png + default_snow_side.png + +brunob.santos (CC BY-SA 4.0): + default_desert_cobble.png + +BlockMen (CC BY-SA 3.0): + default_wood.png + default_clay_brick.png + default_iron_ingot.png + default_gold_ingot.png + default_tool_steelsword.png + default_diamond.png + default_book.png + default_tool_*.png + default_lava_source_animated.png + default_lava_flowing_animated.png + default_stick.png + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + default_mineral_mese.png + default_meselamp.png + bubble.png + gui_*.png + +sofar (CC BY-SA 3.0): + default_book_written.png, based on default_book.png + default_aspen_sapling + default_aspen_leaves + default_aspen_tree + default_aspen_tree_top, derived from default_pine_tree_top (by paramat) + default_aspen_wood, derived from default_pine_wood (by paramat) + +sofar (WTFPL): + default_gravel.png -- Derived from Gambit's PixelBOX texture pack light gravel + +Neuromancer (CC BY-SA 2.0): + default_cobble.png, based on texture by Brane praefect + default_mossycobble.png, based on texture by Brane praefect +Neuromancer (CC BY-SA 3.0): + default_dirt.png + default_furnace_*.png + +Gambit (WTFPL): + default_bronze_ingot.png + default_copper_ingot.png + default_copper_lump.png + default_iron_lump.png + default_gold_lump.png + default_clay_lump.png + default_coal.png + default_grass_*.png + default_paper.png + default_diamond_block.png + default_ladder_steel.png + default_sign_wall_wood.png + default_flint.png + +asl97 (WTFPL): + default_ice.png + +KevDoy (CC BY-SA 3.0) + heart.png + +Glass breaking sounds (CC BY 3.0): + 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ + 2: http://www.freesound.org/people/Tomlija/sounds/97669/ + 3: http://www.freesound.org/people/lsprice/sounds/88808/ + +Mito551 (sounds) (CC BY-SA): + default_dig_choppy.ogg + default_dig_cracky.ogg + default_dig_crumbly.1.ogg + default_dig_crumbly.2.ogg + default_dig_dig_immediate.ogg + default_dig_oddly_breakable_by_hand.ogg + default_dug_node.1.ogg + default_dug_node.2.ogg + default_grass_footstep.1.ogg + default_grass_footstep.2.ogg + default_grass_footstep.3.ogg + default_gravel_footstep.1.ogg + default_gravel_footstep.2.ogg + default_gravel_footstep.3.ogg + default_gravel_footstep.4.ogg + default_grass_footstep.1.ogg + default_place_node.1.ogg + default_place_node.2.ogg + default_place_node.3.ogg + default_place_node_hard.1.ogg + default_place_node_hard.2.ogg + default_snow_footstep.1.ogg + default_snow_footstep.2.ogg + default_hard_footstep.1.ogg + default_hard_footstep.2.ogg + default_hard_footstep.3.ogg + default_sand_footstep.1.ogg + default_sand_footstep.2.ogg + default_wood_footstep.1.ogg + default_wood_footstep.2.ogg + default_dirt_footstep.1.ogg + default_dirt_footstep.2.ogg + default_glass_footstep.ogg + +-----*All Other Textures, Artwork, & graphics fall under the following license: + +Creative Commons +Attribution-NonCommercial-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. + +License + +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(g) 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 above) for the purposes of 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, Noncommercial, 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. + +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, including but not limited to the rights described in Section 4(e). + +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(d), 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(d), as requested. + You may Distribute or Publicly Perform an Adaptation only under: (i) the terms of 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-NonCommercial-ShareAlike 3.0 US) ("Applicable License"). You must include a copy of, or the URI, for Applicable License with every copy of each Adaptation You Distribute or Publicly Perform. 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. 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. 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. + You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in con-nection with the exchange of copyrighted works. + 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 Section 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(d) 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. + + 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 reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and, + Voluntary License Schemes. The Licensor reserves 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 that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c). + 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 AND TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, 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, MERCHANTABILITY, 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 THIS 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 this License. + + Creative Commons may be contacted at https://creativecommons.org/. + +« Back to Commons Deed + diff --git a/mods/stoneworks/screenshot.png b/mods/stoneworks/screenshot.png new file mode 100644 index 00000000..ee18afc2 Binary files /dev/null and b/mods/stoneworks/screenshot.png differ diff --git a/mods/stoneworks/textures/stoneworks_ironfence.png b/mods/stoneworks/textures/stoneworks_ironfence.png new file mode 100644 index 00000000..66317ae8 Binary files /dev/null and b/mods/stoneworks/textures/stoneworks_ironfence.png differ diff --git a/mods/stoneworks/textures/stoneworks_ironfence_side.png b/mods/stoneworks/textures/stoneworks_ironfence_side.png new file mode 100644 index 00000000..3c929191 Binary files /dev/null and b/mods/stoneworks/textures/stoneworks_ironfence_side.png differ diff --git a/mods/stoneworks/textures/textures.txt b/mods/stoneworks/textures/textures.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/mods/stoneworks/textures/textures.txt @@ -0,0 +1 @@ + diff --git a/mods/techpack/COPYING.txt b/mods/techpack/COPYING.txt new file mode 100644 index 00000000..68beccdc --- /dev/null +++ b/mods/techpack/COPYING.txt @@ -0,0 +1,28 @@ +The TechPack Modpack for Minetest is + +Copyright (C) 2017-2018 Joachim Stolberg + +License of source code +---------------------- + +This program is free software; you can redistribute and/or +modify it under the terms of the GNU Lesser General Public License version 2.1 or later +published by the Free Software Foundation. + +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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301, USA. + + +License of media (textures, sounds and documentation) +----------------------------------------------------- + +All textures, sounds and documentation files are licensed under the +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/techpack/LICENSE.txt b/mods/techpack/LICENSE.txt new file mode 100644 index 00000000..4362b491 --- /dev/null +++ b/mods/techpack/LICENSE.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/techpack/README.md b/mods/techpack/README.md new file mode 100644 index 00000000..73369bf6 --- /dev/null +++ b/mods/techpack/README.md @@ -0,0 +1,171 @@ +# TechPack V2.03 + +TechPack, a Mining, Crafting, & Farming Modpack for Minetest. + +![TechPack](https://github.com/joe7575/techpack/blob/master/screenshot.png) + +**After update to v2, don't forget to activate the new mods "techpack_stairway" and "techpack_warehouse" as part of the mod pack.** + + +TechPack is a collection of following Mods: + +* tubelib, a Mod for item exchange via lumber tubes and wireless message communication between nodes. +* tubelib_addons1, a Tubelib extension with mining, farming, and crafting nodes +* tubelib_addons2, a Tubelib extension with control nodes +* tubelib_addons3, a Tubelib extension with high performance nodes +* techpack_stairway, Ladders, stairways, and bridges for your machines +* techpack_warehouse, Warehouse Boxes in steel, copper, and gold +* gravelsieve, a Mod to sieve ores from gravel. +* smartline, a Mod with small and smart sensors, actors and controllers. +* safer_lua, a subset of the language Lua for safe and secure Lua sandboxes +* SaferLua Controller - a controller to be programmed in LUA +* lcdlib - a display lib used by smartline + +**A TechPack Tutorial is available as ![Wiki](https://github.com/joe7575/techpack/wiki)** + +**Machine data is stored in memory and not in the nodes itself. Therefore, never move or copy machines or tubes by means of Worldedit.** +**The moved/copied nodes will not have valid node numbers, which could lead to a server crash.** + +TechPack provides: +- lumber tubes to connect 2 nodes +- a Pusher node to pull/push items through tubes +- a Distributor node with 4 output channels to sort incoming items +- a Blackhole node which lets all items disappear +- Button/switches to send "switch on/off" messages +- a Forceload block to keep your machines operational +- Several lamp nodes in different colors (can be switched on/off) +- a Quarry node to dig for stones and other ground nodes +- a Harvester node to chop wood, leaves, flowers and crops +- a Grinder node to grind all kinds of cobblestone to gravel, gravel to sand, and sand to clay +- a Gravelsieve node to sieve ores from gravel +- an Autocrafter node for automated crafting of tools and items +- a Fermenter node to produce Bio Gas from leaves +- a Reformer node to produce Bio Fuel from Bio Gas (the Bio Fuel is needed by Harvester and Quarry nodes) +- a Funnel node to collect dropped items +- two Timer nodes for a daytime controlled sending of commands (on/off) +- two Sequencer nodes for a waiting time controlled sending of commands (on/off) +- an item Detector node sending commands (on/off) +- a Repeater node to distribute received commands to connected nodes +- a Logic Not node to invert on/off commands +- Gate/Door nodes in different textures to be controlled via on/off commands +- an Access Lock node with number key field +- a Mesecon Converter node to translate tubelib commands in mesecon commands and vice versa +- a Programmer tool to simply collect node numbers +- a Player Detector node +- a Controller node with "IF this then that" rules, which allows: + - reading node states + - receiving commands from other nodes + - sending commands and alarms + - sending mails or chat messages + - output on a display +- a Controller to be programmed in Lua +- a Terminal to be connected to the Lua Controller +- a Signal Tower node showing machine states +- a Display node for text outputs of the Controller +- Metal ladders, stairways, and bridges +- Warehouse Boxes in steel, copper, and gold + + +TechPack supports the following mods: +- Farming Redo (Harvester, Fermenter) +- Ethereal (Harvester, Quarry, Fermenter) +- Pipeworks (Gravel Sieve) +- Hopper (Gravel Sieve) +- Mesecon (Mesecon Converter) + + +### Configuration +The following can be changed in the minetest menu (Settings -> Advanced Settings -> Mods -> tubelib) or directly in 'minetest.conf' +- Maximum number of Forceload Blocks per player +- Enable Basalt Stone (and disable ore generation via Cobblestone generator) +- Machine aging value to calculate the lifetime of machines + +Example for 'minetest.conf': +```LUA +tubelib_basalt_stone_enabled = false +tubelib_max_num_forceload_blocks = 12 +tubelib_machine_aging_value = 200 +``` + +Example for a v1 compatible 'minetest.conf': +```LUA +tubelib_basalt_stone_enabled = false +tubelib_max_num_forceload_blocks = 0 +tubelib_machine_aging_value = 999999 +``` + + +#### Maximum number of Forceload Blocks per player +Default value is 12. +I higher number allows to build larger farms and machines which keep loaded, but increases the server load, too. +But the areas are only loaded when the player is online. +To be able to use e.g. 12 forceloaded blocks per player, the pararamter 'max_forceloaded_blocks' in 'minetest.conf' has to be ajusted. + +#### Enable Basalt Stone (and disable ore generation via Cobblestone generator) +The lava/water Cobblestone generator allows to produce infinite Cobblestone. By means of Quarry, +Grinder, and Gravel Sieve it allows to infinite generate ores. +This can be disabled by means of the setting parameter. If enabled, the Cobblestone +generator generates Basalt instead, which only can be used for building purposes. + +#### Machine aging value to calculate the lifetime of machines +Default value is 200. +This aging value is used to calculate the lifetime of machines before they go defect. +The value 200 (default) results in a lifetime for standard machines of about 2000 - 8000 item processing cycles (~2-4 hours). + + +### License +Copyright (C) 2017-2020 Joachim Stolberg +Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt +Textures: CC BY-SA 3.0 + + +### Dependencies +default, doors, intllib, basic_materials +tubelib2 (![GitHub](https://github.com/joe7575/tubelib2)) +Tubelib Color Lamps optional: unifieddyes +SmartLine Controller optional: mail +Gravelsieve optional: moreores, hopper, pipeworks +tubelib_addons1 optional: unified_inventory + +### History +- 2018-03-18 V1.00 * Tubelib, tubelib_addons1, tubelib_addons2, smartline, and gravelsieve combined to one modpack. +- 2018-03-24 V1.01 * Support for Ethereal added +- 2018-03-27 V1.02 * Timer improvements for unloaded areas +- 2018-03-29 V1.03 * Area protected chest added to tubelib_addons1 +- 2018-03-31 V1.04 * Maintenance, minor issues, Unifieddyes support for Color Lamp, Street Lamp added +- 2018-04-27 V1.05 * Ceiling lamp added, further improvements +- 2018-06-09 V1.06 * Recipes with API to grinder added +- 2018-06-17 V1.07 * Tube placement completely reworked +- 2018-06-22 V1.08 * Lua Controller and SaferLua added +- 2018-07-22 V1.09 * Item counters for Pusher/Distributor and tubelib commands for Autocrafter added +- 2018-08-08 V1.10 * tubelib_addon3 with high performance nodes added +- 2018-08-13 V1.11 * Detector node added +- 2018-08-14 V1.12 * Teleporter node added +- 2018-08-28 V1.13 * Smartline Controller completely revised. Liquid Sampler added +- 2018-09-10 V1.14 * Distributor performance improved, chest commands added +- 2018-09-15 V1.15 * Smartline Controller command added, chest commands improved +- 2018-09-20 V1.16 * Switched from "Display mod pack" to lcdlib +- 2018-12-23 V2.xx * on the way to v2 +- 2018-12-29 V2.00 * beta +- 2019-01-12 V2.00 * release +- 2019-01-27 V2.01 * SaferLua Controller Terminal added +- 2019-01-28 V2.02 * Logic Not added, output reduction on Harvester, Fermenter, and Gravel Sieve +- 2019-04-23 V2.03 * Piston/WorldEdit/replacer detection added, farming and grinder recipes added + + +## New in v2 (from players point of view) +- Almost all machines break after a certain amount of time (switch into the state 'defect') and have to be repaired. +- A Repair Kit is available to repair defect machines. +- A Forceload block (16x16x16) is added which keeps the corresponding area loaded and the machines operational as far as the player is logged in. +- The Quarry now uses LVM techniques to go down up to 100 meter +- Ladders, stairways, and bridges added for the machines (techpack_stairway) +- Industrial lamps +- Warehouse Boxes in steel, copper, and gold for your warehouse/stock (techpack_warehouse) + + +## New in v2 (from admins point of view) +- settingtypes introduced with the following settings: tubelib_max_num_forceload_blocks, tubelib_basalt_stone_enabled, tubelib_machine_aging_value +- the new mods 'techpack_stairway' and 'techpack_warehouse' have to be enabled +- TechPack depends now on the mod 'basic_materials' and 'tubelib2' (![GitHub](https://github.com/joe7575/tubelib2)) + +See ![releasenotes.txt](https://github.com/joe7575/techpack/blob/master/releasenotes.md) for further information diff --git a/mods/techpack/gravelsieve/README.md b/mods/techpack/gravelsieve/README.md new file mode 100644 index 00000000..36cee3a9 --- /dev/null +++ b/mods/techpack/gravelsieve/README.md @@ -0,0 +1,33 @@ +# Gravel Sieve Mod +A Mod for those who do not want to spend half their lives underground... + +Inspired from a Minecr**t Video on YT. + +This mod simplifies the extraction of ores by the fact that ores can be obtained simply by sieving gravel. + +This mod includes three new tools: + - a hammer to produce gravel from Cobblestone + - two gravel sieves to find ores (a manual sieve and a automatic sieve) + +The sieved gravel can be crafted to Compressed Gravel (inspired by Modern Hippie) and "cooked" in the furnace to get Cobblestone again. + +Recipe for the Gravel Sieve: + + Wood, -----------, Wood + Wood, Steel Ingot, Wood + Wood, -----------, Wood + + +Recipe for the Automatic Gravel Sieve: + + Gravel Sieve, Mese Crystal, Mese Crystal + + +Recipe for Compressed Gravel: + + Sieved Gravel, Sieved Gravel, + Sieved Gravel, Sieved Gravel, + + +### Dependencies +default, optional moreores, hopper, and pipeworks diff --git a/mods/techpack/gravelsieve/depends.txt b/mods/techpack/gravelsieve/depends.txt new file mode 100644 index 00000000..f18b1c53 --- /dev/null +++ b/mods/techpack/gravelsieve/depends.txt @@ -0,0 +1,6 @@ +default +moreblocks? +tubelib? +hopper? +pipeworks? + diff --git a/mods/techpack/gravelsieve/description.txt b/mods/techpack/gravelsieve/description.txt new file mode 100644 index 00000000..530c902e --- /dev/null +++ b/mods/techpack/gravelsieve/description.txt @@ -0,0 +1 @@ +This mod includes a hammer to produce gravel from Cobblestone and a sieve to sift gravel to find ores. \ No newline at end of file diff --git a/mods/techpack/gravelsieve/hammer.lua b/mods/techpack/gravelsieve/hammer.lua new file mode 100644 index 00000000..bcd82147 --- /dev/null +++ b/mods/techpack/gravelsieve/hammer.lua @@ -0,0 +1,58 @@ +--[[ + + Gravel Sieve Mod + ================ + +]]-- + + +gravelsieve.disallow = function(pos, node, user, mode, new_param2) + return false +end + +gravelsieve.handler = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + + local node = minetest.get_node(pos) + if node.name == "default:cobble" or node.name == "default:mossycobble" + or node.name == "default:desert_cobble" then + node.name = "default:gravel" + minetest.swap_node(pos, node) + minetest.sound_play({ + name="default_dig_crumbly"},{ + gain=1, + pos=pos, + max_hear_distance=6, + loop=false}) + end + + itemstack:add_wear(65535 / (500 - 1)) + return itemstack +end + +minetest.register_tool("gravelsieve:hammer", { + description = "Hammer converts Cobblestone into Gravel", + inventory_image = "gravelsieve_hammer.png", + on_use = function(itemstack, user, pointed_thing) + return gravelsieve.handler(itemstack, user, pointed_thing) + end, +}) + +minetest.register_craft({ + output = "gravelsieve:hammer", + recipe = { + {"", "default:steel_ingot", ""}, + {"", "group:stick", "default:steel_ingot"}, + {"group:stick", "", ""}, + } +}) + diff --git a/mods/techpack/gravelsieve/init.lua b/mods/techpack/gravelsieve/init.lua new file mode 100644 index 00000000..7fbe74d7 --- /dev/null +++ b/mods/techpack/gravelsieve/init.lua @@ -0,0 +1,664 @@ +--[[ + + Gravel Sieve Mod + ================ + + v1.09 by JoSt + Derived from the work of celeron55, Perttu Ahola (furnace) + Pipeworks support added by FiftySix + + Copyright (C) 2017-2018 Joachim Stolberg + Copyright (C) 2011-2016 celeron55, Perttu Ahola + Copyright (C) 2011-2016 Various Minetest developers and contributors + + LGPLv2.1+ + See LICENSE.txt for more information + + History: + 2017-06-14 v0.01 First version + 2017-06-15 v0.02 Manually use of the sieve added + 2017-06-17 v0.03 * Settings bug fixed + * Drop bug fixed + * Compressed Gravel block added (Inspired by Modern Hippie) + * Recipes for Compressed Gravel added + 2017-06-17 v0.04 * Support for manual and automatic gravel sieve + * Rarity now configurable + * Output is 50% gravel and 50% sieved gravel + 2017-06-20 v0.05 * Hammer sound bugfix + 2017-06-24 v1.00 * Released version w/o any changes + 2017-07-08 V1.01 * extended for moreores + 2017-07-09 V1.02 * Cobblestone bugfix (NathanSalapat) + * ore_probability is now global accessable (bell07) + 2017-08-29 V1.03 * Fix syntax listring (Jat15) + 2017-09-08 V1.04 * Adaption to Tubelib + 2017-11-03 V1.05 * Adaption to Tubelib v0.06 + 2018-01-01 V1.06 * Hopper support added + 2018-01-02 V1.07 * changed to registered ores + 2018-02-09 V1.08 * Pipeworks support added, bugfix for issue #7 + 2018-12-28 V1.09 * Ore probability calculation changed (thanks to obl3pplifp) + tubelib aging added +]]-- + +gravelsieve = { +} + +dofile(minetest.get_modpath("gravelsieve") .. "/hammer.lua") + +local settings_get +if minetest.setting_get then + settings_get = minetest.setting_get +else + settings_get = function(...) endminetest.settings:get(...) end +end +gravelsieve.ore_rarity = tonumber(settings_get("gravelsieve_ore_rarity")) or 1.16 +gravelsieve.ore_max_elevation = tonumber(settings_get("gravelsieve_ore_max_elevation")) or 0 +gravelsieve.ore_min_elevation = tonumber(settings_get("gravelsieve_ore_min_elevation")) or -30912 +local y_spread = math.max(1 + gravelsieve.ore_max_elevation - gravelsieve.ore_min_elevation, 1) + +-- Increase the probability over the natural occurrence +local PROBABILITY_FACTOR = 3 + +-- tubelib aging feature +local AGING_LEVEL1 = nil +local AGING_LEVEL2 = nil +if minetest.get_modpath("tubelib") and tubelib ~= nil then + AGING_LEVEL1 = 15 * tubelib.machine_aging_value + AGING_LEVEL2 = 60 * tubelib.machine_aging_value +end + +-- Ore probability table (1/n) +gravelsieve.ore_probability = { +} + + +-- Pipeworks support +local pipeworks_after_dig = nil +local pipeworks_after_place = function(pos, placer) end + +if minetest.get_modpath("pipeworks") and pipeworks ~= nil then + pipeworks_after_dig = pipeworks.after_dig + pipeworks_after_place = pipeworks.after_place +end + +local function harmonic_sum(a, b) + return 1 / ((1 / a) + (1 / b)) +end + +local function calculate_probability(item) + local ymax = math.min(item.y_max, gravelsieve.ore_max_elevation) + local ymin = math.max(item.y_min, gravelsieve.ore_min_elevation) + return (gravelsieve.ore_rarity / PROBABILITY_FACTOR) * + item.clust_scarcity / (item.clust_num_ores * ((ymax - ymin) / y_spread)) +end + +local function pairs_by_values(t, f) + if not f then + f = function(a, b) return a < b end + end + local s = {} + for k, v in pairs(t) do + table.insert(s, {k, v}) + end + table.sort(s, function(a, b) + return f(a[2], b[2]) + end) + local i = 0 + return function() + i = i + 1 + local v = s[i] + if v then + return unpack(v) + else + return nil + end + end +end + +local function parse_drop(drop) + local d, count = drop:match("^%s*(%S+)%s+(%d+)%s*$") + if d and count then + return d, count + end + d, count = drop:match("%s*craft%s+\"?([^%s\"]+)\"?%s+(%d+)%s*") + if d and count then + return d, count + end + return drop, 1 +end + +-- collect all registered ores and calculate the probability +local function add_ores() + for _,item in pairs(minetest.registered_ores) do + if minetest.registered_nodes[item.ore] then + local drop = minetest.registered_nodes[item.ore].drop + if type(drop) == "string" + and drop ~= item.ore + and drop ~= "" + and item.ore_type == "scatter" + and item.wherein == "default:stone" + and item.clust_scarcity ~= nil and item.clust_scarcity > 0 + and item.clust_num_ores ~= nil and item.clust_num_ores > 0 + and item.y_max ~= nil and item.y_min ~= nil then + local count + drop, count = parse_drop(drop) + + local probability = calculate_probability(item) / count + if probability > 0 then + local cur_probability = gravelsieve.ore_probability[drop] + if cur_probability then + gravelsieve.ore_probability[drop] = harmonic_sum(cur_probability, probability) + else + gravelsieve.ore_probability[drop] = probability + end + end + end + end + end + minetest.log("action", "[gravelsieve] ore probabilties:") + local overall_probability = 0.0 + for name,probability in pairs_by_values(gravelsieve.ore_probability) do + minetest.log("action", ("[gravelsieve] %-32s: 1 / %.02f"):format(name, probability)) + overall_probability = overall_probability + 1.0/probability + end + minetest.log("action", ("[gravelsieve] Overall probability %f"):format(overall_probability)) +end + +minetest.after(1, add_ores) + +local sieve_formspec = + "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;1,1.5;1,1;]".. + "image[3,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[context;dst;4,0;4,4;]".. + "list[current_player;main;0,4.2;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]" + + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function aging(pos, meta) + if AGING_LEVEL1 then + local cnt = meta:get_int("tubelib_aging") + 1 + meta:set_int("tubelib_aging", cnt) + if cnt > AGING_LEVEL1 and math.random(AGING_LEVEL2) == 1 then + minetest.get_node_timer(pos):stop() + minetest.swap_node(pos, {name = "gravelsieve:sieve_defect"}) + end + end +end + +-- handle the sieve animation +local function swap_node(pos, meta, start) + local node = minetest.get_node(pos) + local idx = meta:get_int("idx") + if start then + if idx == 3 then + idx = 0 + end + else + idx = (idx + 1) % 4 + end + meta:set_int("idx", idx) + node.name = meta:get_string("node_name")..idx + minetest.swap_node(pos, node) + return idx == 3 +end + +-- place ores to dst according to the calculated probability +local function random_ore(inv, src) + local num + for ore, probability in pairs(gravelsieve.ore_probability) do + if math.random(probability) == 1 then + local item = ItemStack(ore) + if inv:room_for_item("dst", item) then + inv:add_item("dst", item) + return true -- ore placed + end + end + end + return false -- gravel has to be moved +end + + +local function add_gravel_to_dst(meta, inv) + -- maintain a counter for gravel kind selection + local gravel_cnt = meta:get_int("gravel_cnt") + 1 + meta:set_int("gravel_cnt", gravel_cnt) + + if (gravel_cnt % 2) == 0 then -- gravel or sieved gravel? + inv:add_item("dst", ItemStack("default:gravel")) -- add to dest + else + inv:add_item("dst", ItemStack("gravelsieve:sieved_gravel")) -- add to dest + end +end + + +-- move gravel and ores to dst +local function move_src2dst(meta, pos, inv, src, dst) + if inv:room_for_item("dst", dst) and inv:contains_item("src", src) then + local res = swap_node(pos, meta, false) + if res then -- time to move one item? + if src:get_name() == "default:gravel" then -- will we find ore? + if not random_ore(inv, src) then -- no ore found? + add_gravel_to_dst(meta, inv) + end + else + inv:add_item("dst", ItemStack("gravelsieve:sieved_gravel")) -- add to dest + end + inv:remove_item("src", src) + end + return true -- process finished + end + return false -- process still running +end + +-- timer callback, alternatively called by on_punch +local function sieve_node_timer(pos, elapsed) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local gravel = ItemStack("default:gravel") + local gravel_sieved = ItemStack("gravelsieve:sieved_gravel") + + if move_src2dst(meta, pos, inv, gravel) then + aging(pos, meta) + return true + elseif move_src2dst(meta, pos, inv, gravel_sieved) then + aging(pos, meta) + return true + else + minetest.get_node_timer(pos):stop() + return false + end +end + + +for automatic = 0,1 do +for idx = 0,4 do + local nodebox_data = { + { -8/16, -8/16, -8/16, 8/16, 4/16, -6/16 }, + { -8/16, -8/16, 6/16, 8/16, 4/16, 8/16 }, + { -8/16, -8/16, -8/16, -6/16, 4/16, 8/16 }, + { 6/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, + { -6/16, -2/16, -6/16, 6/16, 8/16, 6/16 }, + } + nodebox_data[5][5] = (8 - 2*idx) / 16 + + local node_name + local description + local tiles_data + local tube_info + if automatic == 0 then + node_name = "gravelsieve:sieve" + description = "Gravel Sieve" + tiles_data = { + -- up, down, right, left, back, front + "gravelsieve_gravel.png", + "gravelsieve_gravel.png", + "gravelsieve_sieve.png", + "gravelsieve_sieve.png", + "gravelsieve_sieve.png", + "gravelsieve_sieve.png", + } + else + node_name = "gravelsieve:auto_sieve" + description = "Automatic Gravel Sieve" + tiles_data = { + -- up, down, right, left, back, front + "gravelsieve_gravel.png", + "gravelsieve_gravel.png", + "gravelsieve_auto_sieve.png", + "gravelsieve_auto_sieve.png", + "gravelsieve_auto_sieve.png", + "gravelsieve_auto_sieve.png", + } + + -- Pipeworks support + tube_info = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if automatic == 0 then + local meta = minetest.get_meta(pos) + swap_node(pos, meta, true) + else + minetest.get_node_timer(pos):start(1.0) + end + return inv:add_item("src", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("src", stack) + end, + input_inventory = "dst", + connect_sides = {left = 1, right = 1, front = 1, back = 1, bottom = 1, top = 1} + } + end + + if idx == 3 then + tiles_data[1] = "gravelsieve_top.png" + not_in_creative_inventory = 0 + else + not_in_creative_inventory = 1 + end + + + minetest.register_node(node_name..idx, { + description = description, + tiles = tiles_data, + drawtype = "nodebox", + drop = node_name, + + tube = tube_info, -- NEW + + node_box = { + type = "fixed", + fixed = nodebox_data, + }, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, + }, + + on_timer = sieve_node_timer, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("idx", idx) -- for the 4 sieve phases + meta:set_int("gravel_cnt", 0) -- counter to switch between gravel and sieved gravel + meta:set_string("node_name", node_name) + meta:set_string("formspec", sieve_formspec) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('dst', 16) + end, + + -- Pipeworks support + after_dig_node = pipeworks_after_dig, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Gravel Sieve") + + -- Pipeworks support + pipeworks_after_place(pos, placer) + end, + + on_metadata_inventory_move = function(pos) + if automatic == 0 then + local meta = minetest.get_meta(pos) + swap_node(pos, meta, true) + else + minetest.get_node_timer(pos):start(1.0) + end + end, + + on_metadata_inventory_take = function(pos) + if automatic == 0 then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("src") then + -- sieve should be empty + meta:set_int("idx", 2) + swap_node(pos, meta, false) + meta:set_int("gravel_cnt", 0) + end + else + minetest.get_node_timer(pos):start(1.0) + end + end, + + on_metadata_inventory_put = function(pos) + if automatic == 0 then + local meta = minetest.get_meta(pos) + swap_node(pos, meta, true) + else + minetest.get_node_timer(pos):start(1.0) + end + end, + + on_punch = function(pos, node, puncher, pointed_thing) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_punch(pos, node, puncher, pointed_thing) + else + sieve_node_timer(pos, 0) + end + end, + + on_dig = function(pos, node, puncher, pointed_thing) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + end + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy=2, cracky=1, not_in_creative_inventory=not_in_creative_inventory, tubedevice = 1, tubedevice_receiver = 1}, + drop = node_name.."3", + }) +end +end + + +------------------------------------------------------------------------ +-- Optional adaption to tubelib +------------------------------------------------------------------------ +if minetest.global_exists("tubelib") then + minetest.register_node("gravelsieve:sieve_defect", { + tiles = { + -- up, down, right, left, back, front + "gravelsieve_top.png", + "gravelsieve_gravel.png", + "gravelsieve_auto_sieve.png^tubelib_defect.png", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, 4/16, -6/16 }, + { -8/16, -8/16, 6/16, 8/16, 4/16, 8/16 }, + { -8/16, -8/16, -8/16, -6/16, 4/16, 8/16 }, + { 6/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, + { -6/16, -2/16, -6/16, 6/16, 2/16, 6/16 }, + }, + }, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, 4/16, 8/16 }, + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("idx", 0) -- for the 4 sieve phases + meta:set_int("gravel_cnt", 0) -- counter to switch between gravel and sieved gravel + meta:set_string("node_name", "gravelsieve:auto_sieve") + meta:set_string("formspec", sieve_formspec) + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('dst', 16) + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Gravel Sieve") + end, + + on_dig = function(pos, node, puncher, pointed_thing) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + end + end, + + paramtype = "light", + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy=2, cracky=1, not_in_creative_inventory=1}, + }) + + tubelib.register_node("gravelsieve:auto_sieve3", + { + "gravelsieve:auto_sieve0", + "gravelsieve:auto_sieve1", + "gravelsieve:auto_sieve2", + "gravelsieve:sieve_defect", + }, + { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "dst") + end, + on_push_item = function(pos, side, item) + minetest.get_node_timer(pos):start(1.0) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "src", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "dst", item) + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, + on_node_repair = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("tubelib_aging", 0) + meta:set_int("idx", 2) + meta:set_string("node_name", "gravelsieve:auto_sieve") + local inv = meta:get_inventory() + inv:set_size('src', 1) + inv:set_size('dst', 16) + swap_node(pos, meta, false) + minetest.get_node_timer(pos):start(1.0) + return true + end, + }) +end + +minetest.register_node("gravelsieve:sieved_gravel", { + description = "Sieved Gravel", + tiles = {"default_gravel.png"}, + groups = {crumbly=2, falling_node=1, not_in_creative_inventory=1}, + sounds = default.node_sound_gravel_defaults(), +}) + +minetest.register_node("gravelsieve:compressed_gravel", { + description = "Compressed Gravel", + tiles = {"gravelsieve_compressed_gravel.png"}, + groups = {cracky=2, crumbly = 2, cracky = 2}, + sounds = default.node_sound_gravel_defaults(), +}) + +minetest.register_craft({ + output = "gravelsieve:sieve", + recipe = { + {"group:wood", "", "group:wood"}, + {"group:wood", "default:steel_ingot", "group:wood"}, + {"group:wood", "", "group:wood"}, + }, +}) + +minetest.register_craft({ + output = "gravelsieve:auto_sieve", + type = "shapeless", + recipe = { + "gravelsieve:sieve", "default:mese_crystal", "default:mese_crystal", + }, +}) + +minetest.register_craft({ + output = "gravelsieve:compressed_gravel", + recipe = { + {"gravelsieve:sieved_gravel", "gravelsieve:sieved_gravel"}, + {"gravelsieve:sieved_gravel", "gravelsieve:sieved_gravel"}, + }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:cobble", + recipe = "gravelsieve:compressed_gravel", + cooktime = 10, +}) + +minetest.register_alias("gravelsieve:sieve", "gravelsieve:sieve3") +minetest.register_alias("gravelsieve:auto_sieve", "gravelsieve:auto_sieve3") + +-- adaption to hopper +if minetest.get_modpath("hopper") and hopper ~= nil and hopper.add_container ~= nil then + hopper:add_container({ + {"bottom", "gravelsieve:auto_sieve0", "src"}, + {"top", "gravelsieve:auto_sieve0", "dst"}, + {"side", "gravelsieve:auto_sieve0", "src"}, + + {"bottom", "gravelsieve:auto_sieve1", "src"}, + {"top", "gravelsieve:auto_sieve1", "dst"}, + {"side", "gravelsieve:auto_sieve1", "src"}, + + {"bottom", "gravelsieve:auto_sieve2", "src"}, + {"top", "gravelsieve:auto_sieve2", "dst"}, + {"side", "gravelsieve:auto_sieve2", "src"}, + + {"bottom", "gravelsieve:auto_sieve3", "src"}, + {"top", "gravelsieve:auto_sieve3", "dst"}, + {"side", "gravelsieve:auto_sieve3", "src"}, + }) +end + +-- adaption to Circular Saw +if minetest.get_modpath("moreblocks") then + + stairsplus:register_all("gravelsieve", "compressed_gravel", "gravelsieve:compressed_gravel", { + description="Compressed Gravel", + groups={cracky=2, crumbly=2, choppy=2, not_in_creative_inventory=1}, + tiles = {"gravelsieve_compressed_gravel.png"}, + sounds = default.node_sound_stone_defaults(), + }) +end + + diff --git a/mods/techpack/gravelsieve/mod.conf b/mods/techpack/gravelsieve/mod.conf new file mode 100644 index 00000000..3280ed69 --- /dev/null +++ b/mods/techpack/gravelsieve/mod.conf @@ -0,0 +1,4 @@ +name=gravelsieve +description=This mod includes a hammer to produce gravel from Cobblestone and a sieve to sift gravel to find ores. +depends=default +optional_depends=moreblocks,tubelib,hopper,pipeworks diff --git a/mods/techpack/gravelsieve/settingtypes.txt b/mods/techpack/gravelsieve/settingtypes.txt new file mode 100644 index 00000000..411d5b2d --- /dev/null +++ b/mods/techpack/gravelsieve/settingtypes.txt @@ -0,0 +1,7 @@ +# Rarity factor to find ores when sieving with the Gravel Sieve +# 1.0 is according to the mapgen generator +# 2.0 means half as many ores as result +# 0.5 means twice as many ores as result +gravelsieve_ore_rarity (Rarity factor to find ores) float 1.16 +gravelsieve_ore_max_elevation (Maximum elevation considered when calculating ore distribution) int 0 -30912 30927 +gravelsieve_ore_min_elevation (Minimum elevation considered when calculating ore distribution) int -30912 -30912 30927 diff --git a/mods/techpack/gravelsieve/textures/gravelsieve_auto_sieve.png b/mods/techpack/gravelsieve/textures/gravelsieve_auto_sieve.png new file mode 100644 index 00000000..90ef83d6 Binary files /dev/null and b/mods/techpack/gravelsieve/textures/gravelsieve_auto_sieve.png differ diff --git a/mods/techpack/gravelsieve/textures/gravelsieve_compressed_gravel.png b/mods/techpack/gravelsieve/textures/gravelsieve_compressed_gravel.png new file mode 100644 index 00000000..858aebe9 Binary files /dev/null and b/mods/techpack/gravelsieve/textures/gravelsieve_compressed_gravel.png differ diff --git a/mods/techpack/gravelsieve/textures/gravelsieve_gravel.png b/mods/techpack/gravelsieve/textures/gravelsieve_gravel.png new file mode 100644 index 00000000..8b0597aa Binary files /dev/null and b/mods/techpack/gravelsieve/textures/gravelsieve_gravel.png differ diff --git a/mods/techpack/gravelsieve/textures/gravelsieve_hammer.png b/mods/techpack/gravelsieve/textures/gravelsieve_hammer.png new file mode 100644 index 00000000..169efdd8 Binary files /dev/null and b/mods/techpack/gravelsieve/textures/gravelsieve_hammer.png differ diff --git a/mods/techpack/gravelsieve/textures/gravelsieve_sieve.png b/mods/techpack/gravelsieve/textures/gravelsieve_sieve.png new file mode 100644 index 00000000..dbf785c0 Binary files /dev/null and b/mods/techpack/gravelsieve/textures/gravelsieve_sieve.png differ diff --git a/mods/techpack/gravelsieve/textures/gravelsieve_top.png b/mods/techpack/gravelsieve/textures/gravelsieve_top.png new file mode 100644 index 00000000..32f61590 Binary files /dev/null and b/mods/techpack/gravelsieve/textures/gravelsieve_top.png differ diff --git a/mods/techpack/lcdlib/LICENSE.txt b/mods/techpack/lcdlib/LICENSE.txt new file mode 100644 index 00000000..341c30bd --- /dev/null +++ b/mods/techpack/lcdlib/LICENSE.txt @@ -0,0 +1,166 @@ + 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. + diff --git a/mods/techpack/lcdlib/README.md b/mods/techpack/lcdlib/README.md new file mode 100644 index 00000000..3f620e3e --- /dev/null +++ b/mods/techpack/lcdlib/README.md @@ -0,0 +1,13 @@ +# LCD Lib + +This LCD Lib is based on Display Lib and Font Lib from Pierre-Yves Rollo + +**Dependancies**: default + +**License**: LGPL + +Code by Pierre-Yves Rollo (pyrollo) +Textures by Vanessa Ezekowitz (VanessaE). +(Default font taken from VanessaE's homedecor/signs_lib, originally under WTFPL) + + diff --git a/mods/techpack/lcdlib/copyright.txt b/mods/techpack/lcdlib/copyright.txt new file mode 100644 index 00000000..eb0ec6ae --- /dev/null +++ b/mods/techpack/lcdlib/copyright.txt @@ -0,0 +1,2 @@ +Code by Pierre-Yves Rollo (pyrollo) +Textures by Vanessa Ezekowitz (VanessaE) diff --git a/mods/techpack/lcdlib/depends.txt b/mods/techpack/lcdlib/depends.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/techpack/lcdlib/display.lua b/mods/techpack/lcdlib/display.lua new file mode 100644 index 00000000..de8689aa --- /dev/null +++ b/mods/techpack/lcdlib/display.lua @@ -0,0 +1,229 @@ +--[[ + cldlib based on: + + display_lib mod for Minetest - Library to add dynamic display + capabilities to nodes + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Miscelaneous values depending on wallmounted param2 +local wallmounted_values = { + [0]={dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, -- Should never be used + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=1}, -- Should never be used + {dx=-1, dz=0, rx=0, rz=-1, yaw=-math.pi/2, rotate=5}, + {dx=1, dz=0, rx=0, rz=1, yaw=math.pi/2, rotate=4}, + {dx=0, dz=-1, rx=1, rz=0, yaw=0, rotate=2}, + {dx=0, dz=1, rx=-1, rz=0, yaw=math.pi, rotate=3} +} + +-- Miscelaneous values depending on facedir param2 +local facedir_values = { + [0]={dx=0, dz=-1, rx=1, rz=0, yaw=0, rotate=1}, + {dx=-1, dz=0, rx=0, rz=-1, yaw=-math.pi/2, rotate=2}, + {dx=0, dz=1, rx=-1, rz=0, yaw=math.pi, rotate=3}, + {dx=1, dz=0, rx=0, rz=1, yaw=math.pi/2, rotate=0}, + -- Forbiden values : + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + {dx=0, dz=0, rx=0, rz=0, yaw=0, rotate=0}, + } + +-- dx/dy = depth vector, rx/ly = right vector, yaw = yaw of entity, +-- rotate = next facedir/wallmount on rotate + +local function get_values(node) + local ndef = minetest.registered_nodes[node.name] + + if ndef then + if ndef.paramtype2 == "wallmounted" then + return wallmounted_values[node.param2] + end + if ndef.paramtype2 == "facedir" then + return facedir_values[node.param2] + end + end +end + +--- Gets the display entities attached with a node. Removes extra ones +local function get_entities(pos) + local objrefs = {} + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + if ndef and ndef.display_entities then + for _, objref in ipairs(minetest.get_objects_inside_radius(pos, 0.5)) do + local entity = objref:get_luaentity() + if entity and ndef.display_entities[entity.name] then + if objrefs[entity.name] then + objref:remove() + else + objrefs[entity.name] = objref + end + end + end + end + return objrefs +end + +local function clip_pos_prop(posprop) + if posprop then + return math.max(-0.5, math.min(0.5, posprop)) + else + return 0 + end +end + +--- (Create and) place display entities according to the node orientation +local function place_entities(pos) + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + local values = get_values(node) + local objrefs = get_entities(pos) + + if values and ndef and ndef.display_entities then + + for entity_name, props in pairs(ndef.display_entities) do + local depth = clip_pos_prop(props.depth) + local height = clip_pos_prop(props.height) + local right = clip_pos_prop(props.right) + if not objrefs[entity_name] then + objrefs[entity_name] = minetest.add_entity(pos, entity_name) + end + + objrefs[entity_name]:setpos({ + x = pos.x - values.dx * depth + values.rx * right, + y = pos.y + height, + z = pos.z - values.dz * depth + values.rz * right}) + + objrefs[entity_name]:setyaw(values.yaw) + end + end + return objrefs +end + +--- Call on_display_update callback of a node for one of its display entities +local function call_node_on_display_update(pos, objref) + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + local entity = objref:get_luaentity() + if ndef and ndef.display_entities and entity and ndef.display_entities[entity.name] then + ndef.display_entities[entity.name].on_display_update(pos, objref) + end +end + +--- Force entity update +function lcdlib.update_entities(pos) + local objrefs = place_entities(pos) + for _, objref in pairs(objrefs) do + call_node_on_display_update(pos, objref) + end +end + +--- On_activate callback for lcdlib entities. Calls on_display_update callbacks +--- of corresponding node for each entity. +function lcdlib.on_activate(entity, staticdata) + if entity then + entity.object:set_armor_groups({immortal=1}) + call_node_on_display_update(entity.object:getpos(), entity.object) + end +end + +--- On_place callback for lcdlib items. Does nothing more than preventing item +--- from being placed on ceiling or ground +function lcdlib.on_place(itemstack, placer, pointed_thing) + local ndef = itemstack:get_definition() + local above = pointed_thing.above + local under = pointed_thing.under + local dir = {x = under.x - above.x, + y = under.y - above.y, + z = under.z - above.z} + + if ndef then + if ndef.paramtype2 == "wallmounted" then + + local wdir = minetest.dir_to_wallmounted(dir) + + if wdir == 0 or wdir == 1 then + dir = placer:get_look_dir() + dir.y = 0 + wdir = minetest.dir_to_wallmounted(dir) + end + + return minetest.item_place(itemstack, placer, pointed_thing, wdir) + else + return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(dir)) + end + end + +end + +--- On_construct callback for lcdlib items. Creates entities and update them. +function lcdlib.on_construct(pos) + lcdlib.update_entities(pos) +end + +--- On_destruct callback for lcdlib items. Removes entities. +function lcdlib.on_destruct(pos) + local objrefs = get_entities(pos) + + for _, objref in pairs(objrefs) do + objref:remove() + end +end + +-- On_rotate (screwdriver) callback for lcdlib items. Prevents axis rotation and reorients entities. +function lcdlib.on_rotate(pos, node, user, mode, new_param2) + if mode ~= 1 then return false end + + local values = get_values(node) + + if values then + minetest.swap_node(pos, {name = node.name, param1 = node.param1, param2 = values.rotate}) + place_entities(pos) + return true + else + return false + end +end + +--- Creates display entity with some fields and the on_activate callback +function lcdlib.register_display_entity(entity_name) + if not minetest.registered_entity then + minetest.register_entity(':'..entity_name, { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + on_activate = lcdlib.on_activate, + }) + end +end + + + diff --git a/mods/techpack/lcdlib/font_default.lua b/mods/techpack/lcdlib/font_default.lua new file mode 100644 index 00000000..1802b57b --- /dev/null +++ b/mods/techpack/lcdlib/font_default.lua @@ -0,0 +1,12 @@ +--[[ + + generated by tools/make_font_lua.sh Thu Dec 21 21:45:53 CET 2017 + +--]] + +lcdlib.register_font( + 'default', + 12, + { [0]=6, [32]=4, [33]=3, [34]=4, [35]=7, [36]=6, [37]=8, [38]=8, [39]=3, [40]=4, [41]=4, [42]=4, [43]=7, [44]=3, [45]=5, [46]=3, [47]=5, [48]=6, [49]=4, [50]=6, [51]=6, [52]=7, [53]=6, [54]=6, [55]=6, [56]=6, [57]=6, [58]=3, [59]=3, [60]=5, [61]=6, [62]=5, [63]=6, [64]=11, [65]=8, [66]=7, [67]=8, [68]=7, [69]=6, [70]=6, [71]=8, [72]=7, [73]=3, [74]=6, [75]=8, [76]=6, [77]=10, [78]=8, [79]=8, [80]=7, [81]=8, [82]=7, [83]=7, [84]=7, [85]=7, [86]=8, [87]=11, [88]=8, [89]=9, [90]=7, [91]=4, [92]=5, [93]=4, [94]=5, [95]=7, [96]=3, [97]=7, [98]=6, [99]=5, [100]=6, [101]=6, [102]=5, [103]=6, [104]=6, [105]=3, [106]=3, [107]=7, [108]=3, [109]=9, [110]=6, [111]=6, [112]=6, [113]=6, [114]=5, [115]=6, [116]=4, [117]=6, [118]=6, [119]=8, [120]=7, [121]=6, [122]=6, [123]=5, [124]=3, [125]=5, [126]=6, [138]=6, [141]=3, [161]=3, [177]=6, [191]=6, [192]=8, [193]=8, [194]=8, [195]=8, [196]=8, [197]=8, [198]=10, [199]=8, [200]=6, [201]=6, [202]=6, [203]=6, [204]=3, [205]=3, [206]=3, [207]=3, [208]=8, [209]=8, [210]=8, [211]=8, [212]=8, [213]=8, [214]=8, [215]=6, [216]=8, [217]=7, [218]=7, [219]=7, [220]=7, [221]=9, [224]=7, [225]=7, [226]=7, [227]=7, [228]=7, [229]=7, [230]=9, [231]=5, [232]=6, [233]=6, [234]=6, [235]=6, [236]=3, [237]=3, [238]=3, [239]=3, [242]=6, [244]=6, [245]=6, [246]=6, [247]=6, [249]=6, [250]=6, [251]=6, [252]=6, [253]=6, [255]=6 } +); + diff --git a/mods/techpack/lcdlib/init.lua b/mods/techpack/lcdlib/init.lua new file mode 100644 index 00000000..ead84c65 --- /dev/null +++ b/mods/techpack/lcdlib/init.lua @@ -0,0 +1,282 @@ +--[[ + lcdlib based on: + + font_lib mod for Minetest - Library to add font display capability + to display_lib mod. + (c) Pierre-Yves Rollo + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +--]] + +-- Global variables +lcdlib = {} +lcdlib.registered_fonts = {} + +-- Local functions +------------------ + +-- Split multiline text into array of lines, with maximum lines. + +local function split_lines(text, maxlines) + local splits = text:split("\n") + if maxlines then + local lines = {} + for num = 1,maxlines do + lines[num] = splits[num] + end + return lines + else + return splits + end +end + +-- Returns next char, managing ascii and unicode plane 0 (0000-FFFF). + +local function get_next_char(text, pos) + pos = pos + 1 + local char = text:sub(pos, pos):byte() + + -- 1 byte char + if char < 0x80 then + return char, pos + end + + -- 4 bytes char not managed + if char >= 0xF0 then + pos = pos + 3 + return 0, pos + end + + -- 3 bytes char not managed + if char >= 0xE0 then + pos = pos + 2 + return 0, pos + end + + -- 2 bytes char (little endian) + if char >= 0xC2 then + pos = pos + 1 + return (char - 0xC2) * 0x40 + text:sub(pos, pos):byte(), pos + end + + -- Not an UTF char + return 0, pos + +end + +-- Returns font properties to be used according to font_name + +local function get_font(font_name) + local font = lcdlib.registered_fonts[font_name] + + if font == nil then + local message + + if font_name == nil then + message = "No font given" + else + message = "Font \""..font_name.."\" unregistered" + end + + if lcdlib.fallback_font == nil then + minetest.log("error", message.." and no other font registered.") + else + minetest.log("info", message..", using font \""..lcdlib.fallback_font.."\".") + font = lcdlib.registered_fonts[lcdlib.fallback_font] + end + end + + return font +end + +-- API functions +---------------- + +-- Computes text size for a given font and text (ignores new lines) +-- @param font_name Font to be used +-- @param text Text to be rendered +-- @return Rendered text (width, height) + +function lcdlib.get_text_size(font_name, text) + local char + local width = 0 + local pos = 0 + local font = get_font(font_name) + + if font == nil then + return 0, 0 + else + while pos < #text do + char, pos = get_next_char(text, pos) + -- Ignore chars with no texture + if font.widths[char] ~= nil then + width = width + font.widths[char] + end + end + end + + return width, font.height +end + +--- Builds texture part for a text line +-- @param font_name Font to be used +-- @param text Text to be rendered +-- @param width Width of the texture (extra text is not rendered) +-- @param x Starting x position in texture +-- @param y Vertical position of the line in texture +-- @return Texture string + +--> ADD ALIGN +function lcdlib.make_line_texture(font_name, text, width, x, y) + local texture = "" + local char + local pos = 0 + local font = get_font(font_name) + + if font ~= nil then + while pos < #text do + char, pos = get_next_char(text, pos) + + -- Ignore chars with no texture + if font.widths[char] ~= nil then + -- Add image only if it is visible (at least partly) + if x + font.widths[char] >= 0 and x <= width then + texture = texture.. + string.format(":%d,%d=font_%s_%04x.png", + x, y, font.name, char) + end + x = x + font.widths[char] + else + print(string.format("Missing char %d (%04x)",char,char)) + end + end + end + + return texture +end + +--- Builds texture for a multiline colored text +-- @param font_name Font to be used +-- @param text Text to be rendered +-- @param texturew Width of the texture (extra text will be truncated) +-- @param textureh Height of the texture +-- @param maxlines Maximum number of lines +-- @param valign Vertical text align ("top" or "center") +-- @param color Color of the text +-- @return Texture string + +function lcdlib.make_multiline_texture(font_name, text, width, height, + maxlines, valign, color) + local texture = "" + local lines = {} + local textheight = 0 + local y, w, h + h = get_font(font_name).height + + for num, line in pairs(split_lines(text, maxlines)) do + if line:byte(1) == 60 then -- '<' + lines[num] = { text = line:sub(2,-1), width = width - 4, height = h, } + else + w, h = lcdlib.get_text_size(font_name, line) + lines[num] = { text = line, width = w, height = h, } + end + textheight = textheight + h + end + + if #lines then + if valign == "top" then + y = 0 + elseif valign == "bottom" then + y = height - textheight + else + y = (height - textheight) / 2 + end + end + + for _, line in pairs(lines) do + texture = texture.. + lcdlib.make_line_texture(font_name, line.text, width, + (width - line.width) / 2, y) + y = y + line.height + end + + texture = string.format("[combine:%dx%d", width, height)..texture + if color then texture = texture.."^[colorize:"..color end + + return texture +end + +--- Register a new font +-- Textures corresponding to the font should be named after following patern : +-- font__.png +-- : name of the font +-- : 4 digit hexadecimal unicode of the char +-- If registering different sizes, add size in the font name (e.g. times_10, times_12...) +-- @param height Font height in pixels +-- @param widths Array of character widths in pixel, indexed by unicode number. + +function lcdlib.register_font(font_name, height, widths) + if lcdlib.registered_fonts[font_name] ~= nil then + minetest.log("error", "Font \""..font_name.."\" already registered.") + return + end + + lcdlib.registered_fonts[font_name] = + { name = font_name, height = height, widths = widths } + + -- If no fallback font, set it (so, first font registered will be the default fallback font) + if lcdlib.fallback_font == nil then + lcdlib.fallback_font = font_name + end +end + +--- Define the fallback font +-- This font will be used instead of given font if not registered. +-- @param font_name Name of the font to be used as fallback font (has to be registered). + +function lcdlib.set_fallback_font(font_name) + if lcdlib.registered_fonts[font_name] == nil then + minetest.log("error", "Fallback font \""..font_name.."\" not registered.") + else + lcdlib.fallback_font = font_name + end +end + +--- Standard on_display_update entity callback. +-- Node should have a corresponding display_entity with size, resolution and maxlines fields and +-- optionally valign and color fields +-- @param pos Node position +-- @param objref Object reference of entity + +function lcdlib.on_display_update(pos, objref) + local meta = minetest.get_meta(pos) + local text = meta:get_string("display_text") + local ndef = minetest.registered_nodes[minetest.get_node(pos).name] + local entity = objref:get_luaentity() + + if entity and ndef.display_entities[entity.name] then + local def = ndef.display_entities[entity.name] + + objref:set_properties({ + textures={lcdlib.make_multiline_texture( + def.font_name, text, def.size.x*def.resolution.x, def.size.y*def.resolution.y, + def.maxlines, def.valign, def.color)}, + visual_size = def.size + }) + end +end + +dofile(minetest.get_modpath("lcdlib").."/font_default.lua") +dofile(minetest.get_modpath("lcdlib").."/display.lua") + diff --git a/mods/techpack/lcdlib/textures/font_default_0000.png b/mods/techpack/lcdlib/textures/font_default_0000.png new file mode 100644 index 00000000..65e43a7b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0000.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0020.png b/mods/techpack/lcdlib/textures/font_default_0020.png new file mode 100644 index 00000000..049fd142 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0020.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0021.png b/mods/techpack/lcdlib/textures/font_default_0021.png new file mode 100644 index 00000000..7691a140 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0021.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0022.png b/mods/techpack/lcdlib/textures/font_default_0022.png new file mode 100644 index 00000000..91f4c5f8 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0022.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0023.png b/mods/techpack/lcdlib/textures/font_default_0023.png new file mode 100644 index 00000000..9290dc15 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0023.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0024.png b/mods/techpack/lcdlib/textures/font_default_0024.png new file mode 100644 index 00000000..cde69d45 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0024.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0025.png b/mods/techpack/lcdlib/textures/font_default_0025.png new file mode 100644 index 00000000..703ab163 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0025.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0026.png b/mods/techpack/lcdlib/textures/font_default_0026.png new file mode 100644 index 00000000..6f98d493 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0026.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0027.png b/mods/techpack/lcdlib/textures/font_default_0027.png new file mode 100644 index 00000000..df31d758 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0027.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0028.png b/mods/techpack/lcdlib/textures/font_default_0028.png new file mode 100644 index 00000000..478c2c4b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0028.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0029.png b/mods/techpack/lcdlib/textures/font_default_0029.png new file mode 100644 index 00000000..89734881 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0029.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_002a.png b/mods/techpack/lcdlib/textures/font_default_002a.png new file mode 100644 index 00000000..2b83a5ca Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_002a.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_002b.png b/mods/techpack/lcdlib/textures/font_default_002b.png new file mode 100644 index 00000000..abce9108 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_002b.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_002c.png b/mods/techpack/lcdlib/textures/font_default_002c.png new file mode 100644 index 00000000..8a624c75 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_002c.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_002d.png b/mods/techpack/lcdlib/textures/font_default_002d.png new file mode 100644 index 00000000..f0ff962c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_002d.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_002e.png b/mods/techpack/lcdlib/textures/font_default_002e.png new file mode 100644 index 00000000..aff49bc8 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_002e.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_002f.png b/mods/techpack/lcdlib/textures/font_default_002f.png new file mode 100644 index 00000000..4667bf7c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_002f.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0030.png b/mods/techpack/lcdlib/textures/font_default_0030.png new file mode 100644 index 00000000..470f0b0c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0030.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0031.png b/mods/techpack/lcdlib/textures/font_default_0031.png new file mode 100644 index 00000000..e84a9d30 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0031.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0032.png b/mods/techpack/lcdlib/textures/font_default_0032.png new file mode 100644 index 00000000..1ef3e848 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0032.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0033.png b/mods/techpack/lcdlib/textures/font_default_0033.png new file mode 100644 index 00000000..ec9f5189 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0033.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0034.png b/mods/techpack/lcdlib/textures/font_default_0034.png new file mode 100644 index 00000000..bc828232 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0034.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0035.png b/mods/techpack/lcdlib/textures/font_default_0035.png new file mode 100644 index 00000000..3ed26c5a Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0035.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0036.png b/mods/techpack/lcdlib/textures/font_default_0036.png new file mode 100644 index 00000000..6e706a49 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0036.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0037.png b/mods/techpack/lcdlib/textures/font_default_0037.png new file mode 100644 index 00000000..884b48a2 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0037.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0038.png b/mods/techpack/lcdlib/textures/font_default_0038.png new file mode 100644 index 00000000..a1e05bff Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0038.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0039.png b/mods/techpack/lcdlib/textures/font_default_0039.png new file mode 100644 index 00000000..6443be94 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0039.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_003a.png b/mods/techpack/lcdlib/textures/font_default_003a.png new file mode 100644 index 00000000..752e9de1 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_003a.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_003b.png b/mods/techpack/lcdlib/textures/font_default_003b.png new file mode 100644 index 00000000..77878e81 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_003b.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_003c.png b/mods/techpack/lcdlib/textures/font_default_003c.png new file mode 100644 index 00000000..0252ab93 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_003c.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_003d.png b/mods/techpack/lcdlib/textures/font_default_003d.png new file mode 100644 index 00000000..af0325a4 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_003d.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_003e.png b/mods/techpack/lcdlib/textures/font_default_003e.png new file mode 100644 index 00000000..77fe9546 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_003e.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_003f.png b/mods/techpack/lcdlib/textures/font_default_003f.png new file mode 100644 index 00000000..e94177c2 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_003f.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0040.png b/mods/techpack/lcdlib/textures/font_default_0040.png new file mode 100644 index 00000000..c7a11d2b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0040.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0041.png b/mods/techpack/lcdlib/textures/font_default_0041.png new file mode 100644 index 00000000..5917cc03 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0041.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0042.png b/mods/techpack/lcdlib/textures/font_default_0042.png new file mode 100644 index 00000000..69a92b35 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0042.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0043.png b/mods/techpack/lcdlib/textures/font_default_0043.png new file mode 100644 index 00000000..6f687036 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0043.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0044.png b/mods/techpack/lcdlib/textures/font_default_0044.png new file mode 100644 index 00000000..94c0a304 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0044.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0045.png b/mods/techpack/lcdlib/textures/font_default_0045.png new file mode 100644 index 00000000..b6732c3c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0045.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0046.png b/mods/techpack/lcdlib/textures/font_default_0046.png new file mode 100644 index 00000000..992bdc19 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0046.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0047.png b/mods/techpack/lcdlib/textures/font_default_0047.png new file mode 100644 index 00000000..12340e7f Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0047.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0048.png b/mods/techpack/lcdlib/textures/font_default_0048.png new file mode 100644 index 00000000..f315c035 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0048.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0049.png b/mods/techpack/lcdlib/textures/font_default_0049.png new file mode 100644 index 00000000..53ef0bcb Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0049.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_004a.png b/mods/techpack/lcdlib/textures/font_default_004a.png new file mode 100644 index 00000000..32cd5698 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_004a.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_004b.png b/mods/techpack/lcdlib/textures/font_default_004b.png new file mode 100644 index 00000000..1f770e74 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_004b.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_004c.png b/mods/techpack/lcdlib/textures/font_default_004c.png new file mode 100644 index 00000000..313ecfe8 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_004c.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_004d.png b/mods/techpack/lcdlib/textures/font_default_004d.png new file mode 100644 index 00000000..f6676fbc Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_004d.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_004e.png b/mods/techpack/lcdlib/textures/font_default_004e.png new file mode 100644 index 00000000..4e281109 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_004e.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_004f.png b/mods/techpack/lcdlib/textures/font_default_004f.png new file mode 100644 index 00000000..1b277777 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_004f.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0050.png b/mods/techpack/lcdlib/textures/font_default_0050.png new file mode 100644 index 00000000..ddfff40f Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0050.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0051.png b/mods/techpack/lcdlib/textures/font_default_0051.png new file mode 100644 index 00000000..c3df8ec5 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0051.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0052.png b/mods/techpack/lcdlib/textures/font_default_0052.png new file mode 100644 index 00000000..f93ff7c0 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0052.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0053.png b/mods/techpack/lcdlib/textures/font_default_0053.png new file mode 100644 index 00000000..389a62b3 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0053.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0054.png b/mods/techpack/lcdlib/textures/font_default_0054.png new file mode 100644 index 00000000..11ec5449 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0054.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0055.png b/mods/techpack/lcdlib/textures/font_default_0055.png new file mode 100644 index 00000000..5d157045 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0055.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0056.png b/mods/techpack/lcdlib/textures/font_default_0056.png new file mode 100644 index 00000000..3e6f48a8 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0056.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0057.png b/mods/techpack/lcdlib/textures/font_default_0057.png new file mode 100644 index 00000000..cc140d08 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0057.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0058.png b/mods/techpack/lcdlib/textures/font_default_0058.png new file mode 100644 index 00000000..fe71fb95 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0058.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0059.png b/mods/techpack/lcdlib/textures/font_default_0059.png new file mode 100644 index 00000000..1d1db03c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0059.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_005a.png b/mods/techpack/lcdlib/textures/font_default_005a.png new file mode 100644 index 00000000..e89b0eb7 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_005a.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_005b.png b/mods/techpack/lcdlib/textures/font_default_005b.png new file mode 100644 index 00000000..e547c515 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_005b.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_005c.png b/mods/techpack/lcdlib/textures/font_default_005c.png new file mode 100644 index 00000000..35fc222c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_005c.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_005d.png b/mods/techpack/lcdlib/textures/font_default_005d.png new file mode 100644 index 00000000..040ebe0f Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_005d.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_005e.png b/mods/techpack/lcdlib/textures/font_default_005e.png new file mode 100644 index 00000000..be3bbb18 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_005e.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_005f.png b/mods/techpack/lcdlib/textures/font_default_005f.png new file mode 100644 index 00000000..3cc8d3dc Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_005f.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0060.png b/mods/techpack/lcdlib/textures/font_default_0060.png new file mode 100644 index 00000000..58500d27 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0060.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0061.png b/mods/techpack/lcdlib/textures/font_default_0061.png new file mode 100644 index 00000000..2121aa84 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0061.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0062.png b/mods/techpack/lcdlib/textures/font_default_0062.png new file mode 100644 index 00000000..ba3feebf Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0062.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0063.png b/mods/techpack/lcdlib/textures/font_default_0063.png new file mode 100644 index 00000000..cee372c2 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0063.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0064.png b/mods/techpack/lcdlib/textures/font_default_0064.png new file mode 100644 index 00000000..c5989c1e Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0064.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0065.png b/mods/techpack/lcdlib/textures/font_default_0065.png new file mode 100644 index 00000000..7cd370ae Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0065.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0066.png b/mods/techpack/lcdlib/textures/font_default_0066.png new file mode 100644 index 00000000..a63276cc Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0066.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0067.png b/mods/techpack/lcdlib/textures/font_default_0067.png new file mode 100644 index 00000000..baf3e88e Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0067.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0068.png b/mods/techpack/lcdlib/textures/font_default_0068.png new file mode 100644 index 00000000..1c9e9b44 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0068.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0069.png b/mods/techpack/lcdlib/textures/font_default_0069.png new file mode 100644 index 00000000..785cdb59 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0069.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_006a.png b/mods/techpack/lcdlib/textures/font_default_006a.png new file mode 100644 index 00000000..a7abd8e4 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_006a.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_006b.png b/mods/techpack/lcdlib/textures/font_default_006b.png new file mode 100644 index 00000000..ff5f32a0 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_006b.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_006c.png b/mods/techpack/lcdlib/textures/font_default_006c.png new file mode 100644 index 00000000..53ef0bcb Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_006c.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_006d.png b/mods/techpack/lcdlib/textures/font_default_006d.png new file mode 100644 index 00000000..351aeefc Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_006d.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_006e.png b/mods/techpack/lcdlib/textures/font_default_006e.png new file mode 100644 index 00000000..60e089d0 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_006e.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_006f.png b/mods/techpack/lcdlib/textures/font_default_006f.png new file mode 100644 index 00000000..dd48b6c1 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_006f.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0070.png b/mods/techpack/lcdlib/textures/font_default_0070.png new file mode 100644 index 00000000..0fdb26ff Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0070.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0071.png b/mods/techpack/lcdlib/textures/font_default_0071.png new file mode 100644 index 00000000..787418e7 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0071.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0072.png b/mods/techpack/lcdlib/textures/font_default_0072.png new file mode 100644 index 00000000..7d2bf4c9 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0072.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0073.png b/mods/techpack/lcdlib/textures/font_default_0073.png new file mode 100644 index 00000000..b2b2ed29 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0073.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0074.png b/mods/techpack/lcdlib/textures/font_default_0074.png new file mode 100644 index 00000000..dcdbd375 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0074.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0075.png b/mods/techpack/lcdlib/textures/font_default_0075.png new file mode 100644 index 00000000..5ef59c7d Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0075.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0076.png b/mods/techpack/lcdlib/textures/font_default_0076.png new file mode 100644 index 00000000..710703fa Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0076.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0077.png b/mods/techpack/lcdlib/textures/font_default_0077.png new file mode 100644 index 00000000..373ecb03 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0077.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0078.png b/mods/techpack/lcdlib/textures/font_default_0078.png new file mode 100644 index 00000000..23541ff3 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0078.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_0079.png b/mods/techpack/lcdlib/textures/font_default_0079.png new file mode 100644 index 00000000..e3fddb2e Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_0079.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_007a.png b/mods/techpack/lcdlib/textures/font_default_007a.png new file mode 100644 index 00000000..2a928230 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_007a.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_007b.png b/mods/techpack/lcdlib/textures/font_default_007b.png new file mode 100644 index 00000000..7606697f Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_007b.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_007c.png b/mods/techpack/lcdlib/textures/font_default_007c.png new file mode 100644 index 00000000..777f1e4c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_007c.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_007d.png b/mods/techpack/lcdlib/textures/font_default_007d.png new file mode 100644 index 00000000..b9ee3970 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_007d.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_007e.png b/mods/techpack/lcdlib/textures/font_default_007e.png new file mode 100644 index 00000000..759b56e1 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_007e.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_008a.png b/mods/techpack/lcdlib/textures/font_default_008a.png new file mode 100644 index 00000000..e4f32361 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_008a.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_008d.png b/mods/techpack/lcdlib/textures/font_default_008d.png new file mode 100644 index 00000000..fcc3b38b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_008d.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00a1.png b/mods/techpack/lcdlib/textures/font_default_00a1.png new file mode 100644 index 00000000..df91ae35 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00a1.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00b1.png b/mods/techpack/lcdlib/textures/font_default_00b1.png new file mode 100644 index 00000000..2413844e Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00b1.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00bf.png b/mods/techpack/lcdlib/textures/font_default_00bf.png new file mode 100644 index 00000000..fec3debd Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00bf.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c0.png b/mods/techpack/lcdlib/textures/font_default_00c0.png new file mode 100644 index 00000000..4652acfd Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c0.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c1.png b/mods/techpack/lcdlib/textures/font_default_00c1.png new file mode 100644 index 00000000..f2d7464d Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c1.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c2.png b/mods/techpack/lcdlib/textures/font_default_00c2.png new file mode 100644 index 00000000..c759ac99 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c2.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c3.png b/mods/techpack/lcdlib/textures/font_default_00c3.png new file mode 100644 index 00000000..6239ee6a Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c3.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c4.png b/mods/techpack/lcdlib/textures/font_default_00c4.png new file mode 100644 index 00000000..1178423e Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c4.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c5.png b/mods/techpack/lcdlib/textures/font_default_00c5.png new file mode 100644 index 00000000..64e5efc4 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c5.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c6.png b/mods/techpack/lcdlib/textures/font_default_00c6.png new file mode 100644 index 00000000..7eaf5883 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c6.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c7.png b/mods/techpack/lcdlib/textures/font_default_00c7.png new file mode 100644 index 00000000..247fbc4b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c7.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c8.png b/mods/techpack/lcdlib/textures/font_default_00c8.png new file mode 100644 index 00000000..517b63dc Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c8.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00c9.png b/mods/techpack/lcdlib/textures/font_default_00c9.png new file mode 100644 index 00000000..cd4f8d8e Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00c9.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ca.png b/mods/techpack/lcdlib/textures/font_default_00ca.png new file mode 100644 index 00000000..39aa1aa6 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ca.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00cb.png b/mods/techpack/lcdlib/textures/font_default_00cb.png new file mode 100644 index 00000000..7058b5a2 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00cb.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00cc.png b/mods/techpack/lcdlib/textures/font_default_00cc.png new file mode 100644 index 00000000..a382d73a Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00cc.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00cd.png b/mods/techpack/lcdlib/textures/font_default_00cd.png new file mode 100644 index 00000000..86339a10 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00cd.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ce.png b/mods/techpack/lcdlib/textures/font_default_00ce.png new file mode 100644 index 00000000..78583dfe Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ce.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00cf.png b/mods/techpack/lcdlib/textures/font_default_00cf.png new file mode 100644 index 00000000..b680e2e7 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00cf.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d0.png b/mods/techpack/lcdlib/textures/font_default_00d0.png new file mode 100644 index 00000000..50db9f94 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d0.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d1.png b/mods/techpack/lcdlib/textures/font_default_00d1.png new file mode 100644 index 00000000..912524fe Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d1.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d2.png b/mods/techpack/lcdlib/textures/font_default_00d2.png new file mode 100644 index 00000000..d7e635f5 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d2.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d3.png b/mods/techpack/lcdlib/textures/font_default_00d3.png new file mode 100644 index 00000000..27ae0161 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d3.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d4.png b/mods/techpack/lcdlib/textures/font_default_00d4.png new file mode 100644 index 00000000..a62a3ed8 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d4.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d5.png b/mods/techpack/lcdlib/textures/font_default_00d5.png new file mode 100644 index 00000000..3740df76 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d5.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d6.png b/mods/techpack/lcdlib/textures/font_default_00d6.png new file mode 100644 index 00000000..9b3cd621 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d6.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d7.png b/mods/techpack/lcdlib/textures/font_default_00d7.png new file mode 100644 index 00000000..a92ac662 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d7.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d8.png b/mods/techpack/lcdlib/textures/font_default_00d8.png new file mode 100644 index 00000000..0453191b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d8.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00d9.png b/mods/techpack/lcdlib/textures/font_default_00d9.png new file mode 100644 index 00000000..607ac147 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00d9.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00da.png b/mods/techpack/lcdlib/textures/font_default_00da.png new file mode 100644 index 00000000..91e5781c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00da.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00db.png b/mods/techpack/lcdlib/textures/font_default_00db.png new file mode 100644 index 00000000..f63177d6 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00db.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00dc.png b/mods/techpack/lcdlib/textures/font_default_00dc.png new file mode 100644 index 00000000..eeaa7c6b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00dc.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00dd.png b/mods/techpack/lcdlib/textures/font_default_00dd.png new file mode 100644 index 00000000..f1941368 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00dd.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e0.png b/mods/techpack/lcdlib/textures/font_default_00e0.png new file mode 100644 index 00000000..b9779fe2 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e0.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e1.png b/mods/techpack/lcdlib/textures/font_default_00e1.png new file mode 100644 index 00000000..aeaeaf59 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e1.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e2.png b/mods/techpack/lcdlib/textures/font_default_00e2.png new file mode 100644 index 00000000..8ca07ed2 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e2.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e3.png b/mods/techpack/lcdlib/textures/font_default_00e3.png new file mode 100644 index 00000000..e2f00bbf Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e3.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e4.png b/mods/techpack/lcdlib/textures/font_default_00e4.png new file mode 100644 index 00000000..6bcf6fb9 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e4.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e5.png b/mods/techpack/lcdlib/textures/font_default_00e5.png new file mode 100644 index 00000000..698094e3 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e5.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e6.png b/mods/techpack/lcdlib/textures/font_default_00e6.png new file mode 100644 index 00000000..70ac70a5 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e6.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e7.png b/mods/techpack/lcdlib/textures/font_default_00e7.png new file mode 100644 index 00000000..f0462bd6 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e7.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e8.png b/mods/techpack/lcdlib/textures/font_default_00e8.png new file mode 100644 index 00000000..841363ed Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e8.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00e9.png b/mods/techpack/lcdlib/textures/font_default_00e9.png new file mode 100644 index 00000000..7752df44 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00e9.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ea.png b/mods/techpack/lcdlib/textures/font_default_00ea.png new file mode 100644 index 00000000..b549be60 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ea.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00eb.png b/mods/techpack/lcdlib/textures/font_default_00eb.png new file mode 100644 index 00000000..f9c4dbcb Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00eb.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ec.png b/mods/techpack/lcdlib/textures/font_default_00ec.png new file mode 100644 index 00000000..e86f3a7b Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ec.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ed.png b/mods/techpack/lcdlib/textures/font_default_00ed.png new file mode 100644 index 00000000..94f12e86 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ed.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ee.png b/mods/techpack/lcdlib/textures/font_default_00ee.png new file mode 100644 index 00000000..e8a743d0 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ee.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ef.png b/mods/techpack/lcdlib/textures/font_default_00ef.png new file mode 100644 index 00000000..d2c744f6 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ef.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00f2.png b/mods/techpack/lcdlib/textures/font_default_00f2.png new file mode 100644 index 00000000..f7d11270 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00f2.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00f4.png b/mods/techpack/lcdlib/textures/font_default_00f4.png new file mode 100644 index 00000000..4b0cce6c Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00f4.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00f5.png b/mods/techpack/lcdlib/textures/font_default_00f5.png new file mode 100644 index 00000000..ec7cec1e Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00f5.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00f6.png b/mods/techpack/lcdlib/textures/font_default_00f6.png new file mode 100644 index 00000000..7213c8a6 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00f6.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00f7.png b/mods/techpack/lcdlib/textures/font_default_00f7.png new file mode 100644 index 00000000..408687db Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00f7.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00f9.png b/mods/techpack/lcdlib/textures/font_default_00f9.png new file mode 100644 index 00000000..67d16b51 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00f9.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00fa.png b/mods/techpack/lcdlib/textures/font_default_00fa.png new file mode 100644 index 00000000..97de7e1a Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00fa.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00fb.png b/mods/techpack/lcdlib/textures/font_default_00fb.png new file mode 100644 index 00000000..2861e15d Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00fb.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00fc.png b/mods/techpack/lcdlib/textures/font_default_00fc.png new file mode 100644 index 00000000..c7deddd8 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00fc.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00fd.png b/mods/techpack/lcdlib/textures/font_default_00fd.png new file mode 100644 index 00000000..b6f45f9a Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00fd.png differ diff --git a/mods/techpack/lcdlib/textures/font_default_00ff.png b/mods/techpack/lcdlib/textures/font_default_00ff.png new file mode 100644 index 00000000..d182a299 Binary files /dev/null and b/mods/techpack/lcdlib/textures/font_default_00ff.png differ diff --git a/mods/techpack/modpack.conf b/mods/techpack/modpack.conf new file mode 100644 index 00000000..eb4274a5 --- /dev/null +++ b/mods/techpack/modpack.conf @@ -0,0 +1 @@ +name = techpack diff --git a/mods/techpack/modpack.txt b/mods/techpack/modpack.txt new file mode 100644 index 00000000..33d91f57 --- /dev/null +++ b/mods/techpack/modpack.txt @@ -0,0 +1 @@ +The presence of this file indicates that the current folder is a modpack. \ No newline at end of file diff --git a/mods/techpack/releasenotes.md b/mods/techpack/releasenotes.md new file mode 100644 index 00000000..08a1fac1 --- /dev/null +++ b/mods/techpack/releasenotes.md @@ -0,0 +1,614 @@ +# Release Notes for ModPack TechPack [techpack] + + + +## V2.03.12 (2020-07-23) + +### Additions + +### Removals + +### Changes + +### Fixes +- string.split bugfix (issue #49) + + +## V2.03.11 (2020-07-21) + +### Additions + +### Removals + +### Changes + +### Fixes +- SaferLua Controller comments bugfix (issue #48) +- SmartLine Controller bugfix + + +## V2.03.10 (2020-06-06) + +### Additions + +### Removals + +### Changes +Merged fork from BlockySurvival back to base (pull request #46) + +### Fixes + + + +## V2.03.09 (2020-03-23) + +### Additions + +### Removals + +### Changes +Tubelib database optimized to reduce the size of the mod storage file (based on issue #41) + +### Fixes + + + +## V2.03.08 (2020-03-03) + +### Additions + +### Removals + +### Changes + +### Fixes +Set Idle state instead of fault when there is no liquid (issue #44) + + + +## V2.03.07 (2019-09-14) + +### Additions + +### Removals + +### Changes + +### Fixes +- Stack overflow bugfix for the detector from fluxionary (issue #39) + + + +## V2.03.06 (2019-08-08) + +### Additions + +### Removals + +### Changes + +### Fixes +- Fixes to distributor metadata_inventory functions + + + +## V2.03.05 (2019-08-06) + +### Additions +- Tubelib_addons3 "HighPerf Funnel" added (see isssue #36) + +### Removals + +### Changes + +### Fixes + + + +## V2.03.04 (2019-07-20) + +### Additions + +### Removals + +### Changes + +### Fixes +- Use Unified Dyes on_dig where needed (issue #35) + + +## V2.03.03 (2019-05-22) + +### Additions + +### Removals + +### Changes + +### Fixes +- Bug fixes from obl3pplifp (Blocky Survival) (issues #27, #28) +- Unstackable items vanish when using HighPerf pushers (issue #29) + + +## V2.03.02 (2019-05-09) + +### Additions + +### Removals + +### Changes +- HighPerf Pusher support for autocrafter, grinder, and harvester + added (issue #22, #23) +- Both distributor behaviours changed (issue #26) + +### Fixes +- Black Hole "items disappeared" counter bugfix (issue #24) +- HighPerf distributor behaviour without an active filtered channel + changed (issue #25) + + + +## V2.03.01 (2019-05-03) + +### Additions + +### Removals + +### Changes + +### Fixes +- Warehouse nodes inventory handling bugfix + + + +## V2.03 (2019-04-23) + +### Additions +- Farming and Grinder recipes added (thanks to obl3pplifp) +- Support for Signs Bot chest and Box added + +### Removals + +### Changes + +### Fixes +- Piston/WorldEdit/Replacer tool detection added. If node is replaced/removed/copied, + it will switch to a "defect" dummy node. + + + +## V2.02.06 (2019-03-23) + +### Additions + +### Removals + +### Changes + +### Fixes +- Warehouse boxes bugfix for the Blackhole bugfix + + + +## V2.02.05 (2019-03-14) + +### Additions + +### Removals + +### Changes + +### Fixes +- Blackhole tube side bugfix + + + +## V2.02.04 (2019-03-02) + +### Additions + +### Removals + +### Changes + +### Fixes +- Fermenter leaves bugfix (moretrees) + + + +## V2.02.03 (2019-02-27) + +### Additions + +### Removals + +### Changes + +### Fixes +- industriallamp bugfix + + + +## V2.02.02 (2019-02-16) + +### Additions +- sl_controller: add battery status command + +### Removals + +### Changes + +### Fixes +- forceload block bugfix + + + +## V2.02.01 (2019-01-29) + +### Additions + +### Removals + +### Changes +- Terminal related Controller commands changed + +### Fixes +- Terminal output bugfix +- Controller event handling bugfix + + + +## V2.02 (2019-01-28) + +### Additions +- Tubelib_addons2 "Logic Not" added +- second (classical) SaferLua Terminal added + +### Removals + +### Changes +- Output reduction on Harvester (cycle time from 4 to 6 s), + Fermenter (from 2 to 3 input items needed per bio gas), + and Gravel Sieve (rarity from 1 to 1.5) + +### Fixes +- removing the Gate block returns the original block + + +## V2.01 (2019-01-27) + +### Additions +- SaferLua Terminal to be connected to the SaferLua Controller + +### Removals + +### Changes +- Server: formspec added to enter valid usernames for server access + +### Fixes + + + +## V2.00.07 (2019-01-27) + +### Additions + +### Removals + +### Changes +- SmartLine Controller: Own node number to on/off command added to be able + to cascade SmartLine Controllers + +### Fixes + + + +## V2.00.06 (2019-01-22) + +### Additions + +### Removals + +### Changes + +### Fixes +- SaferLua Collector: Formspec handling bugfix +- Quarry: Bugfix + + + +## V2.00.05 (2019-01-21) + +### Additions +- SmartLine Collector added + +### Removals + +### Changes +- SmartLine Repeater recipe +- SmartLine textures shrunken + +### Fixes +- SaferLua-Controller: Event handling disabled when Controller is stopped + + + +## V2.00.04 (2019-01-20) + +### Additions +- SaferLua: range(from, to) added, standard string functions added + +### Removals + +### Changes + +### Fixes +- SaferLua-Controller: Lua error messages bugfix +- SmartLine Server: data base was shared between several severs + + + + +## V2.00.03 (2019-01-19) + +### Additions + +### Removals + +### Changes +- SaferLua-Controller: Lua error messages output improved +- SmartLine Display: row 0 can be used to set the infotext + +### Fixes + + + + +## V2.00.02 (2019-01-15) + +### Additions +- SaferLua: Init parameter to the function Store() added +- Warehouse Boxes: Command 'num_items' added +- SaferLua-Controller: Command 'num_items' added + +### Removals + +### Changes + +### Fixes +- Distributors: Formspec bugfixes + + + + +## V2.00.01 (2019-01-13) + +### Additions +- SaferLua-Controller: Support for Lua functions added +- Warehouse Boxes: Formspec tooltips added + +### Removals + +### Changes +- Grinder: Recipes for clay changed + +### Fixes + + + +## V2.00.00 (2019-01-12) + +### Additions +- Almost all machines break after a certain amount of time (switch into the state 'defect') and have to be repaired. +- A Repair Kit is available to repair defect machines. +- A Forceload block (16x16x16) is added which keeps the corresponding area loaded and the machines operational as far as the player is logged in. +- Ladders, stairways, and bridges added for the machines (techpack_stairway) +- Industrial lamps added +- Warehouse Boxes in steel, copper, and gold for your warehouse/stock (techpack_warehouse) added + +### Removals + +### Changes +- TechPack now uses the external library 'tubelib2' (![GitHub](https://github.com/joe7575/tubelib2)), all tubes will be converted to be tubelib2 compatible +- TechPack depends now on the mod 'basic_materials' +- The Quarry now uses LVM techniques to go down up to 100 meter +- Almost all machines have an 'on_node_load' function to repair timer routines after a server crash +- 3 settings parameter: + - Maximum number of Forceload Blocks per player + - Enable Basalt Stone (and disable ore generation via Cobblestone generator) + - Machine aging value to calculate the lifetime of machines +- SmartLine Controller adapter to the new state 'defect' +- Gravel Sieve: Ore probability calculation changed (thanks to obl3pplifp) + +### Fixes + + + +## V1.16.7 (2018-11-30) + +### Fixes +- Teleporter channel bug fixed + +### Changes +- Fermenter: Improved input items processing (pull request from micu) + + + +## V1.16.6 (2018-10-20) + +### Fixes +- 'minetest.LIGHT_MAX' bugfix (Minetest 5.0.0) + + + +## V1.16.5 (2018-10-14) + +### Additions +- Cobblestone generation can be disabled via configuration + +### Fixes +- Teleporter recursion bugfix +- tube bugfix + + + +## V1.16.4 (2018-09-26) + +### Additions +- Stopwatch function to SmartLine Controller added +- Display supports now left oriented text outputs via prefix '<' + +### Fixes +- Owner bugfix for the SmartLine Controller + + + +## V1.16.3 (2018-09-26) + +### Changes +- Added further textures to the Gate Block + + + +## V1.16.2 (2018-09-22) + +### Changes +- Futher improvement of the "sneak" button usage + + + +## V1.16.1 (2018-09-21) + +### Additions +- Straight ahead tubes can be placed my means of the "sneak" button + +### Fixes +- Minor tube placing bug fixed + + + +## V1.16 (2018-09-20) + +### Changes +- Switched from "Display mod pack" to an internal lcdlib, based + on a former version of the Display mod pack. This was necessary + due to extensive and ongoing changes on the Display mod pack API. + +### Additions +- Added three kinds of sandstone to the grinder. + + + +## V1.15.1 (2018-09-17) + +### Fixes +- Button bug (detected in the video of Nathan) fixed + + + +## V1.15 (2018-09-15) + +### Additions +- Tubelib has a new helper function "get_inv_state()" used by the chests. +- The Lua Controller got a new command "$get_player_action()" to read the chest player state. +- SmartLine Controller got a new command to turn Distributor filter ports on/off. +- Chests send on/off commands for each player interaction to a node with a predefined number. +- Chests support the "player_action" command request. +- Chests support the "set_number" Programmer command to program a node number. + +### Changes +- Chests now return the state "empty", loader" **and** "full". + "full" is returned, when no empty stack is available. + +### Fixes +- Distributor and HighPerf Distributor item counter bugfixes. + + + +## V1.14 Beta (2018-09-10) + +### Additions +- The Tubelib chests now provide the states ("empty"/"loaded") +- The SmartLine Controller got the command "chest state request" for Tubelib chests +- Minetest fuel recipe for Bio Fuel added + +### Changes +- The Distributor is now able to push up to 20 items per slot and phase (instead of 6). +- The Distributor now uses an unconfigured port for blocked/rejected items. +- The Tubelib Protected Chest got a new texture. +- The Harvester is now HighPerf Pusher compatible. + + +## V1.13.4 Beta (2018-09-08) + +### Changes +- SmartLine Controller got some form/submenu updates + + + +## V1.13.3 Beta (2018-09-06) + +### Additions +- Sieved Gravel to Grinder recipes added + +### Fixes +- Parameter 'side' bugfix (used e.g. for on_push_item(...)) + + + +## V1.13.2 Beta (2018-09-05) + +### Changes +- Harvester continues now at that position, where it last switched to faulty. + +### Fixes +- Recipe bug for SaferLua Controller fixed + + + +## V1.13.1 Beta (2018-09-02) + +### Changes +- Unloaded pushers now return "blocked", if the status is requested. + Before, it returned the last stored state. + +### Fixes +- Bug in the "HighPerf Pushing Chest" fixed. For the case the node pushes items + in its own chest, the items went lost. + + + +## V1.13 Beta (2018-08-28) + +### Additions +- A Liquid Sampler node is added. It is able to take all kind or renewable liquids (registered via bucket.register_liquid) + Currently only useful for recipes where a water-bucket is needed. +- Smartline has a new IF-THIS-THEN-THAT Controller V2 which should be much simpler to use. + It will replace the current one (V1). + Currently both are active, but if you dig a controller V1 it will be converted to a controller V2. +- The new controller needs batteries. Thus, Smartline has now its own battery node. The sl_controller.battery will not be + needed any more. + +### Removals +- recipe for sl_controller/batteries removed. +- Recipe for Smartline controller V1 removed. + +### Changes +- Quarry can no go direct from FAULT into RUNNING without reset the digging position + +### Fixes +- bug in open/close door command for Minetest v0.4.17+ fixed + + + + +------------------------------------------------------------- +## Vx.xx.x (2018-mm-dd) + +### Additions + +### Removals + +### Changes + +### Fixes diff --git a/mods/techpack/safer_lua/data_struct.lua b/mods/techpack/safer_lua/data_struct.lua new file mode 100644 index 00000000..03bbe825 --- /dev/null +++ b/mods/techpack/safer_lua/data_struct.lua @@ -0,0 +1,364 @@ +--[[ + + SaferLua [safer_lua] + ==================== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + data_struct.lua: + + see https://github.com/joe7575/techpack/wiki/Data-Structures + +]]-- + +safer_lua.DataStructHelp = [[ + Data structures as a secure shell over the LUA table type. + see https://github.com/joe7575/techpack/wiki/Data-Structures + + 'Arrays' are lists of elements, which can be addressed + by means of an index: + + a = Array(1,2,3,4) --> {1,2,3,4} + a.add(6) --> {1,2,3,4,6} + a.set(2, 8) --> {1,8,3,4,6} + a.insert(5,7) --> {1,8,3,4,7,6} + a.remove(3) --> {1,8,4,7,6} + a.insert(1, "hello") --> {"hello",1,8,4,7,6} + a.size() --> function returns 6 + a.memsize() --> return returns 10 + a.next() --> for loop iterator function + a.sort(reverse) --> sort the array elements in place + + Unlike arrays, which are indexed by a range of numbers, + 'stores' are indexed by keys: + + s = Store("a",4,"b",5) --> {a = 4, b = 5} + s.set("val", 12) --> {a = 4, b = 5, val = 12} + s.get("val") --> returns 12 + s.set(0, "hello") --> {a = 4, b = 5, val = 12, [0] = "hello"} + s.del("val") --> {[0] = "hello"} + s.size() --> function returns 4 + s.memsize() --> function returns 8 + s.next() --> for loop iterator function + s.keys(order) --> return an array with the keys + + A 'set' is an unordered collection with no duplicate + elements. + + s = Set("Tom", "Lucy") + --> {Tom = true, Lucy = true} + s.del("Tom") --> {Lucy = true} + s.add("Susi") --> {Lucy = true, Susi = true} + s.has("Susi") --> function returns `true` + s.has("Mike") --> function returns `false` + s.size() --> function returns 2 + s.memsize() --> function returns 8 + s.next() --> for loop iterator function +]] + +local function var_count(v) + if type(v) == "number" then + return 1 + elseif type(v) == "boolean" then + return 1 + elseif v == nil then + return 0 + elseif type(v) == "string" then + return #v + elseif type(v) == "table" then + return v.memsize() + else + return nil + end +end + + +function safer_lua.Store(...) + + local new_t = {} + local mt = {} + + local MemSize = 0 + local Size = 0 + local Data = {} + + mt.__newindex = function(t, k, v) return end + + mt.count = var_count + + new_t.set = function(k,v) + if type(k) == "number" then + if rawget(Data, k) then -- has entry? + MemSize = MemSize - mt.count(rawget(Data, k)) + else + Size = Size + 1 + end + MemSize = MemSize + mt.count(v) + rawset(Data, k, v) + elseif type(k) == "string" then + if rawget(Data, k) then -- has entry? + MemSize = MemSize - mt.count(rawget(Data, k)) + else + MemSize = MemSize + mt.count(k) + Size = Size + 1 + end + MemSize = MemSize + mt.count(v) + rawset(Data, k, v) + end + end + + new_t.get = function(k) + return rawget(Data, k) + end + + new_t.del = function(k) + if rawget(Data, k) then -- has entry? + MemSize = MemSize - mt.count(k) + MemSize = MemSize - mt.count(rawget(Data, k)) + rawset(Data, k, nil) + Size = Size - 1 + end + end + + new_t.memsize = function(t) + return MemSize + end + + new_t.size = function(t) + return Size + end + + new_t.next = function(t) + local n = nil + return function () + n = next(Data, n) + if n then return n, Data[n] end + end + end + + new_t.keys = function(order) + local keyset = {} + local n = 0 + local size = 0 + + for k,v in pairs(Data) do + n = n + 1 + keyset[n] = k + size = size + var_count(k) + end + + if order == "up" then + table.sort(keyset, function(a,b) return a > b end) + elseif order == "down" then + table.sort(keyset) + end + local a = safer_lua.Array() + a.__load(size, keyset) + return a + end + + new_t.__dump = function() + -- remove the not serializable meta data + return {Type = "Store", Size = Size, MemSize = MemSize, Data = Data} + end + + new_t.__load = function(size, memsize, data) + Size = size + MemSize = memsize + Data = data + end + + for idx = 1,select('#',...),2 do + local k,v = select(idx,...),select(idx+1,...) + new_t.set(k,v) + end + + return setmetatable(new_t, mt) +end + + +function safer_lua.Array(...) + + local new_t = {} + local mt = {} + + local MemSize = 0 + local Data = {} + + mt.__newindex = function(t, k, v) return end + + mt.count = var_count + + for idx = 1,select('#',...) do + local v = select(idx,...) + local cnt = mt.count(v) + if cnt then + MemSize = MemSize + cnt + rawset(Data, idx, v) + end + end + + new_t.add = function(v) + MemSize = MemSize + mt.count(v) + local i = #Data + 1 + table.insert(Data, i, v) + end + + new_t.set = function(i,v) + i = math.min(#Data, i) + MemSize = MemSize - mt.count(rawget(Data, i)) + MemSize = MemSize + mt.count(v) + rawset(Data, i, v) + end + + new_t.get = function(i) + return Data[i] + end + + new_t.insert = function(i, v) + MemSize = MemSize + mt.count(v) + i = math.min(#Data, i) + table.insert(Data, i, v) + end + + new_t.remove = function(i) + local v = table.remove(Data, i) + MemSize = MemSize - mt.count(v) + return v + end + + new_t.sort = function(reverse) + if reverse then + table.sort(Data, function(a,b) return a > b end) + else + table.sort(Data) + end + end + + new_t.memsize = function(t) + return MemSize + end + + new_t.size = function(t) + return #Data + end + + new_t.next = function(t) + local i = 0 + local n = #Data + return function () + i = i + 1 + if i <= n then return i, Data[i] end + end + end + + new_t.__dump = function() + -- remove the not serializable meta data + return {Type = "Array", MemSize = MemSize, Data = Data} + end + + new_t.__load = function(memsize, data) + MemSize = memsize + Data = data + end + + return setmetatable(new_t, mt) +end + + +function safer_lua.Set(...) + + local new_t = {} + local mt = {} + + local MemSize = 0 + local Size = 0 + local Data = {} + + mt.__newindex = function(t, k, v) return end + + mt.count = var_count + + for idx = 1,select('#',...) do + local v = select(idx,...) + local cnt = mt.count(v) + if cnt then + MemSize = MemSize + cnt + Size = Size + 1 + rawset(Data, v, true) + end + end + + new_t.add = function(k) + MemSize = MemSize + mt.count(k) + rawset(Data, k, true) + Size = Size + 1 + end + + new_t.del = function(k) + MemSize = MemSize - mt.count(k) + rawset(Data, k, nil) + Size = Size - 1 + end + + new_t.has = function(k) + return rawget(Data, k) == true + end + + new_t.memsize = function(t) + return MemSize + end + + new_t.size = function(t) + return Size + end + + new_t.next = function(t) + local i = 0 + local n = nil + return function () + i = i + 1 + n = next(Data, n) + if n then return i, n end + end + end + + new_t.__dump = function() + -- remove the not serializable meta data + return {Type = "Set", Size = Size, MemSize = MemSize, Data = Data} + end + + new_t.__load = function(size, memsize, data) + Size = size + MemSize = memsize + Data = data + end + + return setmetatable(new_t, mt) +end + + +-- remove the not serializable meta data +function safer_lua.datastruct_to_table(ds) + return ds.__dump() +end + +-- add the not serializable meta data again +function safer_lua.table_to_datastruct(tbl) + if tbl.Type == "Store" then + local s = safer_lua.Store() + s.__load(tbl.Size, tbl.MemSize, tbl.Data) + return s + elseif tbl.Type == "Set" then + local s = safer_lua.Set() + s.__load(tbl.Size, tbl.MemSize, tbl.Data) + return s + elseif tbl.Type == "Array" then + local a = safer_lua.Array() + a.__load(tbl.MemSize, tbl.Data) + return a + end +end \ No newline at end of file diff --git a/mods/techpack/safer_lua/depends.txt b/mods/techpack/safer_lua/depends.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/techpack/safer_lua/description.txt b/mods/techpack/safer_lua/description.txt new file mode 100644 index 00000000..97257ee7 --- /dev/null +++ b/mods/techpack/safer_lua/description.txt @@ -0,0 +1,4 @@ +SaferLua [safer_lua], a subset of the language Lua for safe and secure Lua sandboxes + + + diff --git a/mods/techpack/safer_lua/environ.lua b/mods/techpack/safer_lua/environ.lua new file mode 100644 index 00000000..fe16bafc --- /dev/null +++ b/mods/techpack/safer_lua/environ.lua @@ -0,0 +1,214 @@ +--[[ + + SaferLua [safer_lua] + ==================== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + environ.lua: + +]]-- + +safer_lua.MaxCodeSize = 5000 -- size if source code in bytes +safer_lua.MaxTableSize = 1000 -- sum over all table sizes +safer_lua.MaxExeTime = 5000 -- max. execution time in us + +local function memsize() + return safer_lua.MaxTableSize +end + +local function range(from, to) + return function(expired_at,last) + assert(expired_at > minetest.get_us_time(), "Runtime limit exceeded") + if last >= to then + return nil + else + return last+1 + end + end, minetest.get_us_time() + safer_lua.MaxExeTime, from-1 +end + +local BASE_ENV = { + Array = safer_lua.Array, + Store = safer_lua.Store, + Set = safer_lua.Set, + memsize = memsize, + range = range, + math = { + floor = math.floor, + abs = math.abs, + max = math.max, + min = math.min, + random = math.random, + }, + string = { + byte = string.byte, + char = string.char, + find = string.find, + format = string.format, + gmatch = string.gmatch, + gsub = string.gsub, + len = string.len, + lower = string.lower, + match = string.match, + rep = string.rep, + sub = string.sub, + upper = string.upper, + split = function(str, separator, include_empty, max_splits, sep_is_pattern) + if separator == "" then separator = " " end + return safer_lua.Array(unpack(string.split(str, separator, include_empty, max_splits, sep_is_pattern))) + end, + trim = string.trim, + }, + tonumber = tonumber, + tostring = tostring, + unpack = unpack, + type = type, + ticks = 0, +} + +local function map(dest, source) + for k,v in pairs(source) do + dest[k] = v + end + return dest +end + +local function calc_used_mem_size(env) + local size = 0 + for key,val in pairs(env) do + if type(val) == "table" and val.size ~= nil then + size = size + val.size() or 0 + end + end + return size +end + +function safer_lua.config(max_code_size, max_table_size) + safer_lua.MaxCodeSize = max_code_size + safer_lua.MaxTableSize = max_table_size +end + +local function format_error_str(str, label) + local tbl = {} + for s in str:gmatch("[^\r\n]+") do + s = s:match("^%s*(.-)%s*$") + if s:find("function 'xpcall'") then + break + elseif s:find(".-%.lua:%d+:(.+)") then + local err = s:gsub(".-%.lua:%d+:%s*(.+)", "extern: %1") + table.insert(tbl, err) + elseif s:find('%[string ".-"%]') then + local line, err = s:match('^%[string ".-"%]:(%d+): (.+)$') + table.insert(tbl, label..":"..line..": "..err) + elseif s:find('%(load%):(%d+):') then + local line, err = s:match('%(load%):(%d+): (.+)$') + table.insert(tbl, label..":"..line..": "..err) + end + end + return "Error: "..table.concat(tbl, "\n >> ") +end + +local function format_error(err, label) + if err:find("stack overflow") then + return "Error: Stack overflow due to recursive function calls!" + end + return format_error_str(err, label) +end + +local function compile(pos, text, label, err_clbk) + if safer_lua:check(pos, text, label, err_clbk) == 0 then + text = text:gsub("%$", "S:") + local code, err = loadstring(text) + if not code then + err_clbk(pos, format_error(err, label)) + else + return code + end + end +end + +------------------------------------------------------------------------------- +-- Standard init/loop controller +------------------------------------------------------------------------------- +function safer_lua.init(pos, init, loop, environ, err_clbk) + if (#init + #loop) > safer_lua.MaxCodeSize then + err_clbk(pos, "Error: Code size limit exceeded") + return + end + local code = compile(pos, init, "init", err_clbk, 0) + if code then + local env = table.copy(BASE_ENV) + env.S = {} + env.S = map(env.S, environ) + setfenv(code, env) + local res, err = xpcall(code, debug.traceback) + if not res then + err_clbk(pos, format_error(err, "init")) + else + env = getfenv(code) + code = compile(pos, loop, "loop", err_clbk) + if code then + setfenv(code, env) + return code + end + end + end +end + +function safer_lua.run_loop(pos, elapsed, code, err_clbk) + local env = getfenv(code) + env.elapsed = elapsed + if elapsed < 0 then -- event? + env.event = true + else + env.event = false + env.ticks = env.ticks + 1 + end + local res, err = xpcall(code, debug.traceback) + if calc_used_mem_size(env) > safer_lua.MaxTableSize then + err_clbk(pos, "Error: Data memory limit exceeded") + return false + end + if not res then + err_clbk(pos, format_error(err, "loop")) + return false + end + return true +end + +------------------------------------------------------------------------------- +-- Endless/Coroutine controller +------------------------------------------------------------------------------- +local function thread(pos, code, err_clbk) + while true do + local res, err = xpcall(code, debug.traceback) + if not res then + err_clbk(pos, format_error(err, "loop")) + return false + end + local env = getfenv(code) + if calc_used_mem_size(env) > safer_lua.MaxTableSize then + err_clbk(pos, "Error: Memory limit exceeded") + return false + end + coroutine.yield() + end +end + +function safer_lua.co_create(pos, init, loop, environ, err_clbk) + local code = safer_lua.init(pos, init, loop, environ, err_clbk) + return coroutine.create(thread), code +end + +function safer_lua.co_resume(pos, co, code, err_clbk) + local res, err = coroutine.resume(co, pos, code, err_clbk) + if not res then + err_clbk(pos, format_error(err, "loop")) + return false + end + return true +end diff --git a/mods/techpack/safer_lua/init.lua b/mods/techpack/safer_lua/init.lua new file mode 100644 index 00000000..f5e75aa0 --- /dev/null +++ b/mods/techpack/safer_lua/init.lua @@ -0,0 +1,19 @@ +--[[ + + SaferLua [safer_lua] + ==================== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + environ.lua: + +]]-- + +safer_lua = {} + +dofile(minetest.get_modpath("safer_lua") .. "/data_struct.lua") +dofile(minetest.get_modpath("safer_lua") .. "/scanner.lua") +dofile(minetest.get_modpath("safer_lua") .. "/environ.lua") \ No newline at end of file diff --git a/mods/techpack/safer_lua/mod.conf b/mods/techpack/safer_lua/mod.conf new file mode 100644 index 00000000..d319b89d --- /dev/null +++ b/mods/techpack/safer_lua/mod.conf @@ -0,0 +1 @@ +name=safer_lua diff --git a/mods/techpack/safer_lua/readme.md b/mods/techpack/safer_lua/readme.md new file mode 100644 index 00000000..2917d886 --- /dev/null +++ b/mods/techpack/safer_lua/readme.md @@ -0,0 +1,19 @@ +SaferLua [safer_lua] v0.01 +========================== + +A subset of the language Lua for safe and secure Lua sandboxes with: + - limited code length + - limited execution time + - limited memory use + - limited posibilities to call functions + +### License +Copyright (C) 2018 Joachim Stolberg +Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt + + +### Dependencies +none + +### History +- 2018-06-24 v0.01 * first draft diff --git a/mods/techpack/safer_lua/scanner.lua b/mods/techpack/safer_lua/scanner.lua new file mode 100644 index 00000000..54817e27 --- /dev/null +++ b/mods/techpack/safer_lua/scanner.lua @@ -0,0 +1,141 @@ +--[[ + + SaferLua [safer_lua] + ==================== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + scanner.lua: + +]]-- + +local function trim(s) + return (s:gsub("^%s*(.-)%s*$", "%1")) +end + +function safer_lua:word(ch, pttrn) + local word = "" + while ch:match(pttrn) do + word = word .. ch + self.pos = self.pos + 1 + ch = self.line:sub(self.pos, self.pos) + end + return word +end + +function safer_lua:string(pttrn) + self.pos = self.pos + 1 + local ch = self.line:sub(self.pos, self.pos) + while not ch:match(pttrn) and self.pos < #self.line do + if ch == "\\" then + self.pos = self.pos + 1 + end + self.pos = self.pos + 1 + ch = self.line:sub(self.pos, self.pos) + end + self.pos = self.pos + 1 + -- result is not needed +end + +local function lines(str) + local t = {} + local function helper(line) + table.insert(t, line) + return "" + end + helper((str:gsub("(.-)\r?\n", helper))) + return t +end + +function safer_lua:scanner(text) + local lToken = {} + for idx, line in ipairs(lines(text)) do + self.line = line + self.pos = 1 + self.line = trim(self.line) + self.line = string.split(self.line, "--", true, 1)[1] + table.insert(lToken, idx) -- line number + if self.line then + -- devide line in tokens + while true do + if self.pos > #self.line then break end + local ch = self.line:sub(self.pos, self.pos) + if ch:match("[%u%l_]") then -- identifier? + table.insert(lToken, self:word(ch, "[%w_]")) + elseif ch:match("[%d]") then -- number? + table.insert(lToken, self:word(ch, "[%d%xx]")) + elseif ch:match("'") then -- string? + self:string("'") + elseif ch:match('"') then -- string? + self:string('"') + elseif ch:match("[%s]") then -- Space? + self.pos = self.pos + 1 + elseif ch:match("[:{}]") then -- critical tokens? + table.insert(lToken,ch) + self.pos = self.pos + 1 + else + self.pos = self.pos + 1 + end + end + end + end + return lToken +end + +local InvalidKeywords = { + ["while"] = true, + ["repeat"] = true, + ["until"] = true, + ["for"] = true, + ["range"] = true, + --["function"] = true, + ["_G"] = true, + ["__load"] = true, + ["__dump"] = true, +} + +local InvalidChars = { + [":"] = true, + ["{"] = true, + ["["] = true, + ["]"] = true, + ["}"] = true, +} + +function safer_lua:check(pos, text, label, err_clbk) + local lToken = self:scanner(text) + local lineno = 0 + local errno = 0 + for idx,token in ipairs(lToken) do + if type(token) == "number" then + lineno = token + elseif InvalidKeywords[token] then + if token == "for" then + -- invalid for statement? + if lToken[idx + 3] == "in" and lToken[idx + 5] == "next" then + -- + elseif lToken[idx + 2] == "in" and lToken[idx + 3] == "range" then + -- + else + err_clbk(pos, label..":"..lineno..": Invalid use of 'for'") + errno = errno + 1 + end + elseif token == "range" then + if lToken[idx - 1] ~= "in" then + err_clbk(pos, label..":"..lineno..": Invalid use of 'range'") + errno = errno + 1 + end + else + err_clbk(pos, label..":"..lineno..": Invalid keyword '"..token.."'") + errno = errno + 1 + end + elseif InvalidChars[token] then + err_clbk(pos, label..":"..lineno..": Invalid character '"..token.."'") + errno = errno + 1 + end + end + return errno +end diff --git a/mods/techpack/screenshot.png b/mods/techpack/screenshot.png new file mode 100644 index 00000000..f8b3cc38 Binary files /dev/null and b/mods/techpack/screenshot.png differ diff --git a/mods/techpack/sl_controller/battery.lua b/mods/techpack/sl_controller/battery.lua new file mode 100644 index 00000000..c9def62c --- /dev/null +++ b/mods/techpack/sl_controller/battery.lua @@ -0,0 +1,158 @@ +--[[ + + sl_controller + ============= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + battery.lua: + + REPLACED BY SMARTLINE BATTERY !!! + +]]-- + +local function calc_percent(content) + local val = (sl_controller.battery_capacity - + math.min(content or 0, sl_controller.battery_capacity)) + return 100 - math.floor((val * 100.0 / sl_controller.battery_capacity)) +end + +local function on_timer(pos, elapsed) + local meta = minetest.get_meta(pos) + local percent = calc_percent(meta:get_int("content")) + meta:set_string("infotext", "Battery ("..percent.."%)") + if percent == 0 then + local node = minetest.get_node(pos) + node.name = "sl_controller:battery_empty" + minetest.swap_node(pos, node) + return false + end + return true +end + +local function register_battery(ext, percent, nici) + minetest.register_node("sl_controller:battery"..ext, { + description = "Battery "..ext, + inventory_image = 'sl_controller_battery_inventory.png', + wield_image = 'sl_controller_battery_inventory.png', + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^sl_controller_battery_green.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_int("content", sl_controller.battery_capacity * percent) + local node = minetest.get_node(pos) + node.name = "sl_controller:battery" + minetest.swap_node(pos, node) + on_timer(pos, 1) + minetest.get_node_timer(pos):start(30) + end, + + on_timer = on_timer, + + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local percent = calc_percent(tonumber(oldmetadata.fields.content)) + local stack + if percent > 95 then + stack = ItemStack("smartline:battery") + elseif percent > 75 then + stack = ItemStack("smartline:battery75") + elseif percent > 50 then + stack = ItemStack("smartline:battery50") + elseif percent > 25 then + stack = ItemStack("smartline:battery25") + else + return + end + local inv = minetest.get_inventory({type="player", name=digger:get_player_name()}) + inv:add_item("main", stack) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=nici}, + drop = "", + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + }) +end + +register_battery("", 1.0, 1) +register_battery("75", 0.75, 1) +register_battery("50", 0.5, 1) +register_battery("25", 0.25, 1) + +minetest.register_node("sl_controller:battery_empty", { + description = "Battery", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^sl_controller_battery_red.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_int("content", 0) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=1}, + drop = "", + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +--if minetest.global_exists("moreores") then +-- minetest.register_craft({ +-- output = "sl_controller:battery 2", +-- recipe = { +-- {"", "moreores:silver_ingot", ""}, +-- {"", "default:copper_ingot", ""}, +-- {"", "moreores:silver_ingot", ""}, +-- } +-- }) +--else +-- minetest.register_craft({ +-- output = "sl_controller:battery 2", +-- recipe = { +-- {"", "default:tin_ingot", ""}, +-- {"", "default:copper_ingot", ""}, +-- {"", "default:tin_ingot", ""}, +-- } +-- }) +--end diff --git a/mods/techpack/sl_controller/commands.lua b/mods/techpack/sl_controller/commands.lua new file mode 100644 index 00000000..ca159b57 --- /dev/null +++ b/mods/techpack/sl_controller/commands.lua @@ -0,0 +1,221 @@ +--[[ + + sl_controller + ============= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + commands.lua: + + Register all basic controller commands + +]]-- + +sl_controller.register_function("get_input", { + cmnd = function(self, num) + num = tostring(num or "") + return sl_controller.get_input(self.meta.number, num) + end, + help = ' $get_input(num) --> "on", "off", or nil\n'.. + ' Read local input value from device with number "num".\n'.. + ' example: inp = $get_input("1234")\n'.. + " The device has to be connected with the controller." +}) + +sl_controller.register_function("get_status", { + cmnd = function(self, num) + num = tostring(num or "") + return tubelib.send_request(num, "state", nil) + end, + help = " $get_status(num) ,\n".. + " Read status from a remote device. See\n".. + " https://github.com/joe7575/techpack/wiki/nodes\n".. + ' example: sts = $get_status("1234")' +}) + +sl_controller.register_function("get_player_action", { + cmnd = function(self, num) + num = tostring(num or "") + return unpack(tubelib.send_request(num, "player_action", nil) or {"","",""}) + end, + help = " $get_player_action(num) ,\n".. + " Read player action status from a Tubelib chest. See\n".. + " https://github.com/joe7575/techpack/wiki/nodes\n".. + ' example: player, action, item = $get_player_action("1234")' +}) + +sl_controller.register_function("get_counter", { + cmnd = function(self, num) + num = tostring(num or "") + return tubelib.send_request(num, "counter", nil) + end, + help = " $get_counter(num)\n".. + " Read number of pushed items from a\n".. + " Pusher/Distributor node.\n".. + " The Pusher returns a single value (number)\n".. + " The Distributor returns a list with 4 values\n".. + " like: {red=1, green=0, blue=8, yellow=0}\n".. + ' example: cnt = $get_counter("1234")\n' +}) + +sl_controller.register_function("clear_counter", { + cmnd = function(self, num) + num = tostring(num or "") + return tubelib.send_request(num, "clear_counter", nil) + end, + help = " $clear_counter(num)\n".. + " Set counter(s) from Pusher/Distributor to zero.\n".. + ' example: $clear_counter("1234")' +}) + +sl_controller.register_function("get_fuel_status", { + cmnd = function(self, num) + num = tostring(num or "") + return tubelib.send_request(num, "fuel", nil) + end, + help = " $get_fuel_status(num)\n".. + " Read fuel status from Harverster and Quarry.\n".. + ' Fuel status is one of: "full","empty"\n'.. + ' example: sts = $get_fuel_status("1234")' +}) + +sl_controller.register_function("get_num_items", { + cmnd = function(self, num, idx) + num = tostring(num or "") + idx = tonumber(idx) + return tubelib.send_request(num, "num_items", idx) + end, + help = " $get_num_items(num)\n".. + " Read number of stored items in one\n".. + " storage (1..8) from a Warehouse Box.\n".. + ' example: cnt = $get_num_items("1234", 4)\n' +}) + +sl_controller.register_function("time_as_str", { + cmnd = function(self) + local t = minetest.get_timeofday() + local h = math.floor(t*24) % 24 + local m = math.floor(t*1440) % 60 + return string.format("%02d:%02d", h, m) + end, + help = " $time_as_str() --> e.g. '18:45'\n".. + " Read time of day as string (24h).\n".. + ' example: time = $time_as_str()' +}) + +sl_controller.register_function("time_as_num", { + cmnd = function(self, num) + local t = minetest.get_timeofday() + local h = math.floor(t*24) % 24 + local m = math.floor(t*1440) % 60 + return h * 100 + m + end, + help = " $time_as_num() --> e.g.: 1845\n".. + " Read time of day as number (24h).\n".. + ' example: time = $time_as_num()' +}) + +sl_controller.register_function("playerdetector", { + cmnd = function(self, num) + num = tostring(num or "") + return tubelib.send_request(num, "name", nil) + end, + help = ' $playerdetector(num) --> e.g. "Joe"\n'.. + ' "" is returned if no player is nearby.\n'.. + ' example: name = $playerdetector("1234")' +}) + +sl_controller.register_action("send_cmnd", { + cmnd = function(self, num, text) + num = tostring(num or "") + text = tostring(text or "") + tubelib.send_message(num, self.meta.owner, nil, text, nil) + end, + help = " $send_cmnd(num, text)\n".. + ' Send a command to the device with number "num".\n'.. + " For more help, see:\n".. + " https://github.com/joe7575/techpack/wiki/nodes\n".. + ' example: $send_cmnd("1234", "on")' +}) + +sl_controller.register_action("set_filter", { + cmnd = function(self, num, slot, val) + num = tostring(num or "") + slot = tostring(slot or "red") + val = tostring(val or "on") + tubelib.send_message(num, self.meta.owner, nil, "filter", {slot=slot, val=val}) + end, + help = " $set_filter(num, slot, val)\n".. + ' Turn on/off a Distributor filter slot.\n'.. + " For more help, see:\n".. + " https://github.com/joe7575/techpack/wiki/nodes\n".. + ' example: $set_filter("1234", "red", "off")' +}) + + +sl_controller.register_action("display", { + cmnd = function(self, num, row, text1, text2, text3) + text1 = tostring(text1 or "") + text2 = tostring(text2 or "") + text3 = tostring(text3 or "") + tubelib.send_message(num, self.meta.owner, nil, "row", {row = row, str = text1..text2..text3}) + end, + help = " $display(num, row, text,...)\n".. + ' Send a text line to the display with number "num".\n'.. + " 'row' is a value from 1..9\n".. + " The function accepts up to 3 text parameters\n".. + ' example: $display("0123", 1, "Hello ", name, " !")' +}) + +sl_controller.register_action("clear_screen", { + cmnd = function(self, num) + num = tostring(num or "") + tubelib.send_message(num, self.meta.owner, nil, "clear", nil) + end, + help = " $clear_screen(num)\n".. + ' Clear the screen of the display\n'.. + ' with number "num".\n'.. + ' example: $clear_screen("1234")' +}) + +sl_controller.register_action("chat", { + cmnd = function(self, text1, text2, text3) + text1 = tostring(text1 or "") + text2 = tostring(text2 or "") + text3 = tostring(text3 or "") + minetest.chat_send_player(self.meta.owner, "[SmartLine Controller] "..text1..text2..text3) + end, + help = " $chat(text,...)\n".. + " Send yourself a chat message.\n".. + " The function accepts up to 3 text parameters\n".. + ' example: $chat("Hello ", name)' +}) + +sl_controller.register_action("door", { + cmnd = function(self, pos, text) + pos = tostring(pos or "") + text = tostring(text or "") + pos = minetest.string_to_pos("("..pos..")") + if pos then + local door = doors.get(pos) + if door then + local player = { + get_player_name = function() return self.meta.owner end, + is_player = function() return true end, + } + if text == "open" then + door:open(player) + elseif text == "close" then + door:close(player) + end + end + end + end, + help = " $door(pos, text)\n".. + ' Open/Close a door at position "pos"\n'.. + ' example: $door("123,7,-1200", "close")\n'.. + " Hint: Use the Tubelib Programmer to\ndetermine the door position." +}) diff --git a/mods/techpack/sl_controller/config.lua b/mods/techpack/sl_controller/config.lua new file mode 100644 index 00000000..407c516f --- /dev/null +++ b/mods/techpack/sl_controller/config.lua @@ -0,0 +1,2 @@ +-- Battery capacity in usec CPU time +sl_controller.battery_capacity = tonumber(minetest.setting_get("battery_capacity")) or 5000000 diff --git a/mods/techpack/sl_controller/controller.lua b/mods/techpack/sl_controller/controller.lua new file mode 100644 index 00000000..8c30f7a3 --- /dev/null +++ b/mods/techpack/sl_controller/controller.lua @@ -0,0 +1,617 @@ +--[[ + + sl_controller + ============= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + controller.lua: + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local M = minetest.get_meta + +local sHELP = [[SaferLua Controller + + This controller is used to control and monitor + Tubelib/TechPack machines. + This controller can be programmed in Lua. + + See on GitHub for more help: goo.gl/Et8D6n + + The controller only runs, if a battery is + placed nearby. + +]] + +local Cache = {} + +local tCommands = {} +local tFunctions = {" Overview", " Data structures"} +local tHelpTexts = {[" Overview"] = sHELP, [" Data structures"] = safer_lua.DataStructHelp} +local sFunctionList = "" +local tFunctionIndex = {} + +minetest.after(2, function() + sFunctionList = table.concat(tFunctions, ",") + for idx,key in ipairs(tFunctions) do + tFunctionIndex[key] = idx + end +end) + +local function output(pos, text) + local meta = minetest.get_meta(pos) + text = meta:get_string("output") .. "\n" .. (text or "") + text = text:sub(-500,-1) + meta:set_string("output", text) +end + +-- +-- API functions for function/action registrations +-- +function sl_controller.register_function(key, attr) + tCommands[key] = attr.cmnd + table.insert(tFunctions, " $"..key) + tHelpTexts[" $"..key] = attr.help +end + +function sl_controller.register_action(key, attr) + tCommands[key] = attr.cmnd + table.insert(tFunctions, " $"..key) + tHelpTexts[" $"..key] = attr.help +end + +local function merge(dest, keys, values) + for idx,key in ipairs(keys) do + dest.env[key] = values[idx] + end + return dest +end + +sl_controller.register_action("print", { + cmnd = function(self, text1, text2, text3) + local pos = self.meta.pos + text1 = tostring(text1 or "") + text2 = tostring(text2 or "") + text3 = tostring(text3 or "") + output(pos, text1..text2..text3) + end, + help = " $print(text,...)\n".. + " Send a text line to the output window.\n".. + " The function accepts up to 3 text strings\n".. + ' e.g. $print("Hello ", name, " !")' +}) + +sl_controller.register_action("loopcycle", { + cmnd = function(self, cycletime) + cycletime = math.floor(tonumber(cycletime) or 0) + local meta = minetest.get_meta(self.meta.pos) + meta:set_int("cycletime", cycletime) + meta:set_int("cyclecount", 0) + end, + help = "$loopcycle(seconds)\n".. + " This function allows to change the\n".. + " call frequency of the loop() function.\n".. + " value is in seconds, 0 = disable\n".. + ' e.g. $loopcycle(10)' +}) + +sl_controller.register_action("events", { + cmnd = function(self, event) + self.meta.events = event or false + end, + help = "$events(true/false)\n".. + " Enable/disable event handling.\n".. + ' e.g. $events(true) -- enable events' +}) + +sl_controller.register_function("get_ms_time", { + cmnd = function(self) + return math.floor(minetest.get_us_time() / 1000) + end, + help = "$get_ms_time()\n".. + " returns time with millisecond precision." +}) + +sl_controller.register_function("position", { + cmnd = function(self, number) + local info = tubelib.get_node_info(number) + if info then + return S(info.pos) + end + return "(-,-,-)" + end, + help = "$position(number)\n".. + " returns the position '(x,y,z)' of the device\n with given number." +}) + +sl_controller.register_action("battery", { + cmnd = function(self) + local meta = minetest.get_meta(self.meta.pos) + local batpos = minetest.string_to_pos(meta:get_string("battery")) + local batmeta = minetest.get_meta(batpos) + local val = (sl_controller.battery_capacity - + math.min(batmeta:get_int("content") or 0, + sl_controller.battery_capacity)) + return 100 - math.floor((val * 100.0 / sl_controller.battery_capacity)) + end, + help = " $battery()\n".. + " Get charge level of battery connected to Controller.\n".. + " Function returns percent number (0-100) where 100 means full.\n".. + " example: battery_percent = $battery()" +}) + + +local function formspec0(meta) + local state = meta:get_int("state") == tubelib.RUNNING + local cmnd = state and "stop;Stop" or "start;Start" + local init = meta:get_string("init") + init = minetest.formspec_escape(init) + return "size[4,3]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;No Battery?]".. + "button[1,2;1.8,1;start;Start]" +end + +local function formspec1(meta) + local state = meta:get_int("state") == tubelib.RUNNING + local cmnd = state and "stop;Stop" or "start;Start" + local init = meta:get_string("init") + init = minetest.formspec_escape(init) + return "size[10,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;1;;true]".. + "textarea[0.3,0.2;10,8.3;init;function init();"..init.."]".. + "label[0,7.3;end]".. + "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. + "button[6.3,7.5;1.8,1;save;Save]".. + "button[8.2,7.5;1.8,1;"..cmnd.."]" +end + +local function formspec2(meta) + local state = meta:get_int("state") == tubelib.RUNNING + local cmnd = state and "stop;Stop" or "start;Start" + local func = meta:get_string("func") + func = minetest.formspec_escape(func) + return "size[10,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;2;;true]".. + "textarea[0.3,0.2;10,8.3;func;functions:;"..func.."]".. + "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. + "button[6.3,7.5;1.8,1;save;Save]".. + "button[8.2,7.5;1.8,1;"..cmnd.."]" +end + +local function formspec3(meta) + local state = meta:get_int("state") == tubelib.RUNNING + local cmnd = state and "stop;Stop" or "start;Start" + local loop = meta:get_string("loop") + loop = minetest.formspec_escape(loop) + return "size[10,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;3;;true]".. + "textarea[0.3,0.2;10,8.3;loop;function loop(ticks, elapsed);"..loop.."]".. + "label[0,7.3;end]".. + "button_exit[4.4,7.5;1.8,1;cancel;Cancel]".. + "button[6.3,7.5;1.8,1;save;Save]".. + "button[8.2,7.5;1.8,1;"..cmnd.."]" +end + +local function formspec4(meta) + local state = meta:get_int("state") == tubelib.RUNNING + local cmnd = state and "stop;Stop" or "start;Start" + local output = meta:get_string("output") + output = minetest.formspec_escape(output) + output = output:gsub("\n", ",") + return "size[10,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;4;;true]".. + "table[0.2,0.2;9.5,7;output;"..output..";200]".. + "button[4.4,7.5;1.8,1;clear;Clear]".. + "button[6.3,7.5;1.8,1;update;Update]".. + "button[8.2,7.5;1.8,1;"..cmnd.."]" +end + +local function formspec5(meta) + local notes = meta:get_string("notes") + notes = minetest.formspec_escape(notes) + return "size[10,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;5;;true]".. + "textarea[0.3,0.2;10,8.3;notes;Notepad:;"..notes.."]".. + "button_exit[6.3,7.5;1.8,1;cancel;Cancel]".. + "button[8.2,7.5;1.8,1;save;Save]" +end + +local function formspec6(items, pos, text) + text = minetest.formspec_escape(text) + return "size[10,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;init,func,loop,outp,notes,help;6;;true]".. + "label[0,-0.2;Functions:]".. + "dropdown[0.3,0.2;10,8.3;functions;"..items..";"..pos.."]".. + "textarea[0.3,1.3;10,8;help;Help:;"..text.."]" +end + +local function patch_error_string(err, line_offs) + local tbl = {} + for s in err:gmatch("[^\r\n]+") do + if s:find("loop:(%d+):") then + local prefix, line, err = s:match("(.-)loop:(%d+):(.+)") + if prefix and line and err then + if tonumber(line) < line_offs then + table.insert(tbl, prefix.."func:"..line..":"..err) + else + line = tonumber(line) - line_offs + table.insert(tbl, prefix.."loop:"..line..":"..err) + end + end + else + table.insert(tbl, s) + end + end + return table.concat(tbl, "\n") +end + +local function error(pos, err) + local meta = minetest.get_meta(pos) + local func = meta:get_string("func") + local _,line_offs = string.gsub(func, "\n", "\n") + line_offs = line_offs + 1 + err = patch_error_string(err, line_offs) + output(pos, err) + local number = meta:get_string("number") + meta:set_string("infotext", "Controller "..number..": error") + meta:set_int("state", tubelib.STOPPED) + meta:set_int("running", tubelib.STATE_STOPPED) + meta:set_string("formspec", formspec4(meta)) + minetest.get_node_timer(pos):stop() + return false +end + +local function compile(pos, meta, number) + local init = meta:get_string("init") + local func = meta:get_string("func") + local loop = meta:get_string("loop") + local owner = meta:get_string("owner") + local env = table.copy(tCommands) + env.meta = {pos=pos, owner=owner, number=number, error=error} + local code = safer_lua.init(pos, init, func.."\n"..loop, env, error) + + if code then + Cache[number] = {code=code, inputs={}, events=env.meta.events} + Cache[number].inputs.term = nil -- terminal inputs + Cache[number].inputs.msg = {} -- message queue + return true + end + return false +end + +local function battery(pos) + local battery_pos = minetest.find_node_near(pos, 1, {"sl_controller:battery", "smartline:battery"}) + if battery_pos then + local meta = minetest.get_meta(pos) + meta:set_string("battery", minetest.pos_to_string(battery_pos)) + return true + end + return false +end + +local function start_controller(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + if not battery(pos) then + meta:set_string("formspec", formspec0(meta)) + return false + end + + meta:set_string("output", "") + meta:set_int("cycletime", 1) + meta:set_int("cyclecount", 0) + meta:set_int("cpu", 0) + + if compile(pos, meta, number) then + meta:set_int("state", tubelib.RUNNING) + meta:set_int("running", tubelib.STATE_RUNNING) + minetest.get_node_timer(pos):start(1) + meta:set_string("formspec", formspec4(meta)) + meta:set_string("infotext", "Controller "..number..": running") + return true + end + return false +end + +local function stop_controller(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("state", tubelib.STOPPED) + meta:set_int("running", tubelib.STATE_STOPPED) + minetest.get_node_timer(pos):stop() + meta:set_string("infotext", "Controller "..number..": stopped") + meta:set_string("formspec", formspec3(meta)) +end + +local function no_battery(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("state", tubelib.STOPPED) + meta:set_int("running", tubelib.STATE_STOPPED) + minetest.get_node_timer(pos):stop() + meta:set_string("infotext", "Controller "..number..": No battery") + meta:set_string("formspec", formspec0(meta)) +end + +local function update_battery(meta, cpu) + local pos = minetest.string_to_pos(meta:get_string("battery")) + if pos then + meta = minetest.get_meta(pos) + local content = meta:get_int("content") - cpu + if content <= 0 then + meta:set_int("content", 0) + return false + end + meta:set_int("content", content) + return true + end +end + +local function call_loop(pos, meta, elapsed) + local t = minetest.get_us_time() + local number = meta:get_string("number") + if Cache[number] or compile(pos, meta, number) then + local cpu = meta:get_int("cpu") or 0 + local code = Cache[number].code + local res = safer_lua.run_loop(pos, elapsed, code, error) + if res then + t = minetest.get_us_time() - t + cpu = math.floor(((cpu * 20) + t) / 21) + meta:set_int("cpu", cpu) + meta:set_string("infotext", "Controller "..number..": running ("..cpu.."us)") + if not update_battery(meta, cpu) then + no_battery(pos) + return false + end + end + -- further messages available? + if next(Cache[number].inputs["msg"]) then + minetest.after(1, call_loop, pos, meta, -1) + end + return res + end + return false +end + +local function on_timer(pos, elapsed) + local meta = minetest.get_meta(pos) + -- considering cycle frequency + local cycletime = meta:get_int("cycletime") or 1 + local cyclecount = (meta:get_int("cyclecount") or 0) + 1 + if cycletime == 0 or cyclecount < cycletime then + meta:set_int("cyclecount", cyclecount) + return true + end + meta:set_int("cyclecount", 0) + + return call_loop(pos, meta, elapsed) +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + + --print(dump(fields)) + if fields.cancel == nil then + if fields.init then + meta:set_string("init", fields.init) + meta:set_string("formspec", formspec1(meta)) + elseif fields.func then + meta:set_string("func", fields.func) + meta:set_string("formspec", formspec2(meta)) + elseif fields.loop then + meta:set_string("loop", fields.loop) + meta:set_string("formspec", formspec3(meta)) + elseif fields.notes then + meta:set_string("notes", fields.notes) + meta:set_string("formspec", formspec5(meta)) + end + end + + if fields.update then + meta:set_string("formspec", formspec4(meta)) + elseif fields.clear then + meta:set_string("output", "") + meta:set_string("formspec", formspec4(meta)) + elseif fields.tab == "1" then + meta:set_string("formspec", formspec1(meta)) + elseif fields.tab == "2" then + meta:set_string("formspec", formspec2(meta)) + elseif fields.tab == "3" then + meta:set_string("formspec", formspec3(meta)) + elseif fields.tab == "4" then + meta:set_string("formspec", formspec4(meta)) + elseif fields.tab == "5" then + meta:set_string("formspec", formspec5(meta)) + elseif fields.tab == "6" then + meta:set_string("formspec", formspec6(sFunctionList, 1, sHELP)) + elseif fields.start == "Start" then + start_controller(pos) + minetest.log("action", player:get_player_name() .. + " starts the sl_controller at ".. minetest.pos_to_string(pos)) + elseif fields.stop == "Stop" then + stop_controller(pos) + elseif fields.functions then + local key = fields.functions + local text = tHelpTexts[key] or "" + local pos = tFunctionIndex[key] or 1 + meta:set_string("formspec", formspec6(sFunctionList, pos, text)) + end +end + +minetest.register_node("sl_controller:controller", { + description = "SaferLua Controller", + inventory_image = "sl_controller_inventory.png", + wield_image = "sl_controller_inventory.png", + stack_max = 1, + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^sl_controller.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "sl_controller:controller") + meta:set_string("owner", placer:get_player_name()) + meta:set_string("number", number) + meta:set_int("state", tubelib.STOPPED) + meta:set_int("running", tubelib.STATE_STOPPED) + meta:set_string("init", "-- called only once") + meta:set_string("func", "-- for your functions") + meta:set_string("loop", "-- called every second") + meta:set_string("notes", "For your notes / snippets") + meta:mark_as_private("init") + meta:mark_as_private("func") + meta:mark_as_private("loop") + meta:mark_as_private("notes") + meta:set_string("formspec", formspec1(meta)) + meta:set_string("infotext", "Controller "..number..": stopped") + end, + + on_receive_fields = on_receive_fields, + + on_dig = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end, + + on_timer = on_timer, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + type = "shapeless", + output = "sl_controller:controller", + recipe = {"smartline:controller2"} +}) + +-- write inputs from remote nodes +local function set_input(pos, number, input, val) + if input and M(pos):get_int("state") == tubelib.RUNNING then + if (Cache[number] or compile(pos, M(pos), number)) and Cache[number].inputs then + if input == "msg" then + if #Cache[number].inputs["msg"] < 10 then + table.insert(Cache[number].inputs["msg"], val) + end + else + Cache[number].inputs[input] = val + end + if Cache[number].events then -- events enabled? + -- only one event per second + local t = minetest.get_us_time() + if not Cache[number].last_event or Cache[number].last_event < t then + local meta = minetest.get_meta(pos) + minetest.after(0.01, call_loop, pos, meta, -1) + Cache[number].last_event = t + 500000 -- add 500 ms + end + end + end + end +end + +-- used by the command "input" +function sl_controller.get_input(number, input) + if input then + if Cache[number] and Cache[number].inputs then + return Cache[number].inputs[input] or "off" + end + end + return "off" +end + +-- used for Terminal commands +function sl_controller.get_command(number) + if Cache[number] and Cache[number].inputs then + local cmnd = Cache[number].inputs["term"] + Cache[number].inputs["term"] = nil + return cmnd + end +end + +-- used for queued messages +function sl_controller.get_msg(number) + if Cache[number] and Cache[number].inputs then + return table.remove(Cache[number].inputs["msg"], 1) + end +end + +tubelib.register_node("sl_controller:controller", {}, { + on_recv_message = function(pos, topic, payload) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + + if topic == "on" then + set_input(pos, number, payload, topic) + elseif topic == "off" then + set_input(pos, number, payload, topic) + elseif topic == "term" then + set_input(pos, number, "term", payload) + elseif topic == "msg" then + set_input(pos, number, "msg", payload) + elseif topic == "state" then + local running = meta:get_int("running") or tubelib.STATE_STOPPED + return tubelib.statestring(running) + else + return "unsupported" + end + end, + on_node_load = function(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("running") ~= tubelib.STATE_STOPPED then + minetest.get_node_timer(pos):start(1) + end + end, +}) diff --git a/mods/techpack/sl_controller/depends.txt b/mods/techpack/sl_controller/depends.txt new file mode 100644 index 00000000..f87d3597 --- /dev/null +++ b/mods/techpack/sl_controller/depends.txt @@ -0,0 +1,5 @@ +default +doors +tubelib +safer_lua + diff --git a/mods/techpack/sl_controller/description.txt b/mods/techpack/sl_controller/description.txt new file mode 100644 index 00000000..062f1b30 --- /dev/null +++ b/mods/techpack/sl_controller/description.txt @@ -0,0 +1,2 @@ +SaferLua Controller - a controller to be programmed in LUA + diff --git a/mods/techpack/sl_controller/init.lua b/mods/techpack/sl_controller/init.lua new file mode 100644 index 00000000..a5714762 --- /dev/null +++ b/mods/techpack/sl_controller/init.lua @@ -0,0 +1,20 @@ +--[[ + + sl_controller + ============= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + +sl_controller = {} + +dofile(minetest.get_modpath("sl_controller") .. "/config.lua") +dofile(minetest.get_modpath("sl_controller") .. "/controller.lua") +dofile(minetest.get_modpath("sl_controller") .. "/commands.lua") +dofile(minetest.get_modpath("sl_controller") .. "/battery.lua") +dofile(minetest.get_modpath("sl_controller") .. "/server.lua") +dofile(minetest.get_modpath("sl_controller") .. "/terminal.lua") \ No newline at end of file diff --git a/mods/techpack/sl_controller/mod.conf b/mods/techpack/sl_controller/mod.conf new file mode 100644 index 00000000..b2058b69 --- /dev/null +++ b/mods/techpack/sl_controller/mod.conf @@ -0,0 +1 @@ +name=sl_controller diff --git a/mods/techpack/sl_controller/readme.md b/mods/techpack/sl_controller/readme.md new file mode 100644 index 00000000..8fb6acdc --- /dev/null +++ b/mods/techpack/sl_controller/readme.md @@ -0,0 +1,20 @@ +SaferLua Controller [sl_controller] +=================================== + + +A tubelib compatible controller to be programmed in LUA + +The mod uses SaferLua [safer_lua] as Lua sandbox for safe and secure code execution. + + +### License +Copyright (C) 2018 Joachim Stolberg +Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt + + +### Dependencies +tubelib, safer_lua + +### History +- 2018-06-24 v0.01 * first draft +- 2018-06-26 v0.02 * Battery and Server added diff --git a/mods/techpack/sl_controller/server.lua b/mods/techpack/sl_controller/server.lua new file mode 100644 index 00000000..01178a9a --- /dev/null +++ b/mods/techpack/sl_controller/server.lua @@ -0,0 +1,225 @@ +--[[ + + sl_controller + ============= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + server.lua: + +]]-- + +local SERVER_CAPA = 5000 +local DEFAULT_MEM = { + size=0, + data={ + version = 1, + info = "SaferLua key/value Server", + } +} + +local function formspec(meta) + local names = meta:get_string("names") or "" + return "size[9,4]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0.2,1;9,1;names;Allowed user names (spaces separated):;"..names.."]" .. + "button_exit[3.5,2.5;2,1;exit;Save]" +end + + +local function on_time(pos, elasped) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + local mem = tubelib.get_data(number, "memory") or table.copy(DEFAULT_MEM) + meta:set_string("infotext", "Server "..number..": ("..(mem.size or 0).."/"..SERVER_CAPA..")") + return true + end + return false +end + +minetest.register_node("sl_controller:server", { + description = "Central Server", + tiles = { + -- up, down, right, left, back, front + "sl_controller_server_top.png", + "sl_controller_server_top.png", + "sl_controller_server_side.png", + "sl_controller_server_side.png^[transformFX", + "sl_controller_server_back.png", + { + image = "sl_controller_server_front.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1, + }, + }, + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -3/16, -8/16, -7/16, 3/16, 6/16, 7/16}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "sl_controller:server") + meta:set_string("owner", placer:get_player_name()) + meta:set_string("number", number) + tubelib.set_data(number, "memory", table.copy(DEFAULT_MEM)) + meta:set_string("formspec", formspec(meta)) + on_time(pos, 0) + minetest.get_node_timer(pos):start(20) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player:get_player_name() == owner then + if fields.names and fields.names ~= "" then + local names = string.gsub(fields.names, " +", " ") + meta:set_string("names", names) + meta:set_string("formspec", formspec(meta)) + end + end + end, + + on_dig = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + tubelib.set_data(number, "memory", nil) + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end, + + on_timer = on_time, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_craft({ + output = "sl_controller:server", + recipe = { + {"", "dye:black", ""}, + {"default:mese_crystal", "tubelib:wlanchip", "default:mese_crystal"}, + {"default:steel_ingot", "default:copper_ingot", "default:steel_ingot"}, + }, +}) + +local function calc_size(v) + if type(v) == "number" then + return 1 + elseif v == nil then + return 0 + elseif type(v) == "string" then + return #v + elseif v.MemSize then + return v.MemSize + else + return nil + end +end + +local function get_memory(num, name) + local info = tubelib.get_node_info(num) + if info and info.name == "sl_controller:server" then + local meta = minetest.get_meta(info.pos) + local owner = meta:get_string("owner") + if name == owner then + return tubelib.get_data(num, "memory") or table.copy(DEFAULT_MEM) + end + local names = meta:get_string("names") + for _,n in ipairs(string.split(names, " ")) do + if name == n then + return tubelib.get_data(num, "memory") or table.copy(DEFAULT_MEM) + end + end + end +end + +local function write_value(mem, key, item) + if mem and mem.size < SERVER_CAPA then + if mem.data[key] then + mem.size = mem.size - calc_size(mem.data[key]) + end + if type(item) == "table" then + item = safer_lua.datastruct_to_table(item) + end + mem.size = mem.size + calc_size(item) + mem.data[key] = item + end +end + +local function read_value(mem, key) + local item = mem.data[key] + if type(item) == "table" then + item = safer_lua.table_to_datastruct(item) + end + return item +end + +tubelib.register_node("sl_controller:server", {}, { + on_recv_message = function(pos, topic, payload) + return "unsupported" + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(20) + end, +}) + + +sl_controller.register_function("server_read", { + cmnd = function(self, num, key) + if type(key) == "string" then + local mem = get_memory(num, self.meta.owner) + if mem then + return read_value(mem, key) + end + else + self.error("Invalid server_read parameter") + end + end, + help = " $server_read(num, key)\n".. + " Read a value from the server.\n".. + " 'key' must be a string.\n".. + ' example: state = $server_read("0123", "state")' +}) + +sl_controller.register_action("server_write", { + cmnd = function(self, num, key, value) + if type(key) == "string" then + local mem = get_memory(num, self.meta.owner) + if mem then + write_value(mem, key, value) + end + else + self.error("Invalid server_write parameter") + end + end, + help = " $server_write(num, key, value)\n".. + " Store a value on the server under the key 'key'.\n".. + " 'key' must be a string. 'value' can be either a\n".. + " number, string, boolean, nil or data structure.\n".. + ' example: $server_write("0123", "state", state)' +}) + + diff --git a/mods/techpack/sl_controller/terminal.lua b/mods/techpack/sl_controller/terminal.lua new file mode 100644 index 00000000..552fb67b --- /dev/null +++ b/mods/techpack/sl_controller/terminal.lua @@ -0,0 +1,282 @@ +--[[ + + sl_controller + ============= + + Copyright (C) 2018-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + terminal.lua: + +]]-- + +local HELP = [[#### SmartLine Controller Terminal #### + +Send commands to your Controller +and output text messages from your +Controller to the Terminal. + +Commands can have up to 80 characters. +Local commands: +- clear = clear screen +- help = this message +- pub = switch to public use +- priv = switch to private use +Global commands: +- send on/off = send on/off event +- msg = send a text message +]] + +local function formspec1() + return "size[6,4]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0.5,1;5,1;number;SaferLua Controller number:;]" .. + "button_exit[1.5,2.5;2,1;exit;Save]" +end + +local function formspec2(meta) + local output = meta:get_string("output") + output = minetest.formspec_escape(output) + output = output:gsub("\n", ",") + return "size[9,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "table[0.1,0.1;8.6,6.6;output;"..output..";200]".. + "field[0.5,7.6;6,1;cmnd;Enter command;]" .. + "field_close_on_enter[cmnd;false]".. + "button[6.7,7.3;2,1;ok;Enter]" +end + +local function output(pos, text) + local meta = minetest.get_meta(pos) + text = meta:get_string("output") .. "\n" .. (text or "") + text = text:sub(-500,-1) + meta:set_string("output", text) + meta:set_string("formspec", formspec2(meta)) + +end + +local function command(pos, cmnd, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") or "" + if cmnd then + cmnd = cmnd:sub(1,80) + + if cmnd == "clear" then + meta:set_string("output", "") + meta:set_string("formspec", formspec2(meta)) + elseif cmnd == "help" then + local meta = minetest.get_meta(pos) + meta:set_string("output", HELP) + meta:set_string("formspec", formspec2(meta)) + elseif cmnd == "pub" and owner == player then + meta:set_int("public", 1) + output(pos, player..":$ "..cmnd) + output(pos, "Switched to public use!") + elseif cmnd == "priv" and owner == player then + meta:set_int("public", 0) + output(pos, player..":$ "..cmnd) + output(pos, "Switched to private use!") + elseif meta:get_int("public") == 1 or owner == player then + -- send on/off + local num, topic = cmnd:match('^send%s+([0-9]+)%s+([onff]+)$') + if num and topic then + local own_number = meta:get_string("own_number") + output(pos, player..":$ send "..num.." "..topic) + tubelib.send_message(num, owner, nil, topic, own_number) + return + end + -- msg + local num, text = cmnd:match('^msg%s+([0-9]+)%s+(.+)$') + if num and text then + local own_number = meta:get_string("own_number") + output(pos, player..":$ msg "..num.." "..text) + tubelib.send_message(num, owner, nil, "msg", {src=own_number, text=text}) + return + end + local number = meta:get_string("number") or "0000" + output(pos, player..":$ "..cmnd) + tubelib.send_message(number, owner, nil, "term", cmnd) + end + end +end + +local function register_terminal(num, tiles, node_box, selection_box) + minetest.register_node("sl_controller:terminal"..num, { + description = "SaferLua Controller Terminal", + tiles = tiles, + drawtype = "nodebox", + node_box = node_box, + selection_box = selection_box, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, minetest.get_node(pos).name) + local meta = minetest.get_meta(pos) + meta:set_string("own_number", number) + meta:set_string("formspec", formspec1()) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("infotext", "SaferLua Controller Terminal "..number..": not connected") + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if fields.number and fields.number ~= "" then + if tubelib.check_numbers(fields.number) then + meta:set_string("number", fields.number) + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "SaferLua Controller Terminal "..own_number..": connected with "..fields.number) + meta:set_string("formspec", formspec2(meta)) + end + elseif (fields.key_enter == "true" or fields.ok == "Enter") and fields.cmnd ~= "" then + command(pos, fields.cmnd, player:get_player_name()) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + }) +end + +register_terminal("", { + -- up, down, right, left, back, front + 'sl_controller_terminal_top.png', + 'sl_controller_terminal_bottom.png', + 'sl_controller_terminal_side.png', + 'sl_controller_terminal_side.png', + 'sl_controller_terminal_bottom.png', + "sl_controller_terminal_front.png", + }, + { + type = "fixed", + fixed = { + {-12/32, -16/32, -8/32, 12/32, -14/32, 12/32}, + {-12/32, -14/32, 12/32, 12/32, 6/32, 14/32}, + }, + }) + +minetest.register_craft({ + output = "sl_controller:terminal", + recipe = { + {"", "smartline:display", ""}, + {"", "", ""}, + {"dye:black", "tubelib:wlanchip", "default:copper_ingot"}, + }, +}) + +register_terminal("2", { + -- up, down, right, left, back, front + 'sl_controller_terminal2_top.png', + 'sl_controller_terminal2_side.png', + 'sl_controller_terminal2_side.png^[transformFX', + 'sl_controller_terminal2_side.png', + 'sl_controller_terminal2_back.png', + "sl_controller_terminal2_front.png", + }, + { + type = "fixed", + fixed = { + {-12/32, -16/32, -16/32, 12/32, -14/32, 16/32}, + {-12/32, -14/32, -3/32, 12/32, 6/32, 16/32}, + {-10/32, -12/32, 14/32, 10/32, 4/32, 18/32}, + {-12/32, 4/32, -4/32, 12/32, 6/32, 16/32}, + {-12/32, -16/32, -4/32, -10/32, 6/32, 16/32}, + { 10/32, -16/32, -4/32, 12/32, 6/32, 16/32}, + {-12/32, -14/32, -4/32, 12/32, -12/32, 16/32}, + }, + }, + { + type = "fixed", + fixed = { + {-12/32, -16/32, -4/32, 12/32, 6/32, 16/32}, + }, + }) + +minetest.register_craft({ + output = "sl_controller:terminal2", + recipe = { + {"", "smartline:display", ""}, + {"", "", ""}, + {"dye:grey", "tubelib:wlanchip", "default:copper_ingot"}, + }, +}) + +tubelib.register_node("sl_controller:terminal", {}, { + on_recv_message = function(pos, topic, payload) + if topic == "term" then + output(pos, payload) + return true + elseif topic == "msg" then + output(pos, payload.src..": "..payload.text) + return true + end + end, +}) + +tubelib.register_node("sl_controller:terminal2", {}, { + on_recv_message = function(pos, topic, payload) + if topic == "term" then + output(pos, payload) + return true + elseif topic == "msg" then + output(pos, payload.src..": "..payload.text) + return true + end + end, +}) + +sl_controller.register_function("get_term", { + cmnd = function(self) + return sl_controller.get_command(self.meta.number) + end, + help = ' $get_term() --> text string or nil\n'.. + ' Read an entered string (command) from the Terminal.\n'.. + ' example: s = $get_term()\n'.. + " The Terminal has to be connected to the controller." +}) + +sl_controller.register_action("put_term", { + cmnd = function(self, num, text) + text = tostring(text or "") + tubelib.send_message(num, self.meta.owner, nil, "term", text) + end, + help = " $put_term(num, text)\n".. + ' Send a text line to the terminal with number "num".\n'.. + ' example: $put_term("0123", "Hello "..name)' +}) + +sl_controller.register_function("get_msg", { + cmnd = function(self) + local msg = sl_controller.get_msg(self.meta.number) + if msg then + return msg.src, msg.text + end + end, + help = ' $get_msg() --> number and text string or nil\n'.. + ' Read a received messages. Number is the node\n'.. + ' number of the sender.\n'.. + ' example: num,msg = $get_msg().' +}) + +sl_controller.register_action("send_msg", { + cmnd = function(self, num, text) + local msg = {src = self.meta.number, text = tostring(text or "")} + tubelib.send_message(num, self.meta.owner, nil, "msg", msg) + end, + help = " $send_msg(num, text)\n".. + ' Send a message to the controller with number "num".\n'.. + ' example: $send_msg("0123", "test")' +}) + diff --git a/mods/techpack/sl_controller/textures/sl_controller.png b/mods/techpack/sl_controller/textures/sl_controller.png new file mode 100644 index 00000000..b55cc4eb Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_battery_green.png b/mods/techpack/sl_controller/textures/sl_controller_battery_green.png new file mode 100644 index 00000000..b66821fb Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_battery_green.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_battery_inventory.png b/mods/techpack/sl_controller/textures/sl_controller_battery_inventory.png new file mode 100644 index 00000000..c7139554 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_battery_inventory.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_battery_red.png b/mods/techpack/sl_controller/textures/sl_controller_battery_red.png new file mode 100644 index 00000000..fb194d98 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_battery_red.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_inventory.png b/mods/techpack/sl_controller/textures/sl_controller_inventory.png new file mode 100644 index 00000000..4a5de554 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_inventory.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_server_back.png b/mods/techpack/sl_controller/textures/sl_controller_server_back.png new file mode 100644 index 00000000..f2500168 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_server_back.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_server_front.png b/mods/techpack/sl_controller/textures/sl_controller_server_front.png new file mode 100644 index 00000000..047e0d5a Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_server_front.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_server_side.png b/mods/techpack/sl_controller/textures/sl_controller_server_side.png new file mode 100644 index 00000000..281f7159 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_server_side.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_server_top.png b/mods/techpack/sl_controller/textures/sl_controller_server_top.png new file mode 100644 index 00000000..b44c6914 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_server_top.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal2_back.png b/mods/techpack/sl_controller/textures/sl_controller_terminal2_back.png new file mode 100644 index 00000000..c9632fa0 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal2_back.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal2_front.png b/mods/techpack/sl_controller/textures/sl_controller_terminal2_front.png new file mode 100644 index 00000000..7ae0723b Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal2_front.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal2_side.png b/mods/techpack/sl_controller/textures/sl_controller_terminal2_side.png new file mode 100644 index 00000000..813fcfb7 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal2_side.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal2_top.png b/mods/techpack/sl_controller/textures/sl_controller_terminal2_top.png new file mode 100644 index 00000000..760ce77b Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal2_top.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal_bottom.png b/mods/techpack/sl_controller/textures/sl_controller_terminal_bottom.png new file mode 100644 index 00000000..773331d5 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal_bottom.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal_front.png b/mods/techpack/sl_controller/textures/sl_controller_terminal_front.png new file mode 100644 index 00000000..038a6ae8 Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal_front.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal_side.png b/mods/techpack/sl_controller/textures/sl_controller_terminal_side.png new file mode 100644 index 00000000..23e791ba Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal_side.png differ diff --git a/mods/techpack/sl_controller/textures/sl_controller_terminal_top.png b/mods/techpack/sl_controller/textures/sl_controller_terminal_top.png new file mode 100644 index 00000000..72e797dc Binary files /dev/null and b/mods/techpack/sl_controller/textures/sl_controller_terminal_top.png differ diff --git a/mods/techpack/smartline/README.md b/mods/techpack/smartline/README.md new file mode 100644 index 00000000..83371d5e --- /dev/null +++ b/mods/techpack/smartline/README.md @@ -0,0 +1,13 @@ +# SmartLine \[smartline\] + +This tubelib extension provides small and smart sensors, actors and controllers. + +A Tutorial to this Mod is available as ![Wiki](https://github.com/joe7575/techpack/wiki) + +API Reference: ![api.md](https://github.com/joe7575/techpack/blob/master/smartline/api.md) + + +## Dependencies +tubelib, default, doors +optional: display_lib, font_lib, mail + diff --git a/mods/techpack/smartline/api.md b/mods/techpack/smartline/api.md new file mode 100644 index 00000000..69cc5015 --- /dev/null +++ b/mods/techpack/smartline/api.md @@ -0,0 +1,98 @@ +# SmartLine Controller API + + +The SmartLine Controller provides the following API to register additional condition and action commands from other mods: + +* smartline.register_condition(name, condition definition) +* smartline.register_action(name, action definition) + + +Each registered condition and action has the function `on_execute` which is called for each rule (every second). +* The condition function has to return true or false, depending if the condition is true or not. +* The action function has to execute the defined action. + +In addition each registered condition and action has the function `button_label`, which determines the button label +for the Controller main formspec. Please note that the maximum number of visible characters for the button label is +something about 15. + +See `commands.lua` as reference. All predefined SmartLine Controller commands are registered via `commands.lua`. + +## Prototypes + +```LUA +smartline.register_condition(name, { + title = "my condition", + formspec = {}, + on_execute = function(data, environ) + -- data: table with the formspec data + -- environ: not relevant here + end, + button_label = function(data) + return "button label" + end, +}) +``` + + +```LUA +smartline.register_action(name, { + title = "my action", + formspec = {}, + on_execute = function(data, environ, inputs) + -- data: table with the formspec data + -- environ: not relevant here + -- inputs: table with the input values + end, + button_label = function(data) + return "button label" + end, +}) +``` + +The 'name' parameter should be unique. External mods should use the mod name as prefix, like "mymod_mycond". +The 'title' is used in the main menu for the condition and action selection dialog. +The 'formspec' table defines the condition/action related form for additional user parameters. +It supports the following subset of the minetest formspec elements: + + - textlist + - field + - label + +Please note that size and position is automatically determined. +All other attributes are according to the original formspec. +Example: + +```LUA +formspec = { + { + type = "field", -- formspec element + name = "number", -- reference key for the table 'data' + label = "input from node with number", -- label shown above of the element + default = "", -- default value + }, + { + type = "textlist", -- formspec element + name = "value", -- reference key for the table 'data' + label = "is", -- label shown above of the element + choices = "on,off", -- list elements + default = 1, -- first list element as default value + }, + { + type = "label", + name = "lbl", -- not really used, but internally needed + label = "Hint: Connect the input nodes with the controller", + }, +} +``` + +The table 'data' includes the condition/action related 'formspec' data. +For the above 'formspec' example, it is: + +```LUA + data = { + number = , -- the entered value of the "field", + value = , -- the number of the selected element of the "textlist" + value_text = , -- in addition the text of the selected element of the "textlist" + } +``` + diff --git a/mods/techpack/smartline/button.lua b/mods/techpack/smartline/button.lua new file mode 100644 index 00000000..6b2b087a --- /dev/null +++ b/mods/techpack/smartline/button.lua @@ -0,0 +1,205 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + button.lua: + Derived from Tubelib button + +]]-- + + +local function switch_on(pos, node) + if tubelib.data_not_corrupted(pos) then + node.name = "smartline:button_active" + minetest.swap_node(pos, node) + minetest.sound_play("button", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) + local meta = minetest.get_meta(pos) + local own_num = meta:get_string("own_num") + local numbers = meta:get_string("numbers") + local cycle_time = meta:get_int("cycle_time") + if cycle_time > 0 then -- button mode? + minetest.get_node_timer(pos):start(cycle_time) + end + local placer_name = meta:get_string("placer_name") + local clicker_name = nil + if meta:get_string("public") == "false" then + clicker_name = meta:get_string("clicker_name") + end + tubelib.send_message(numbers, placer_name, clicker_name, "on", own_num) + end +end + +local function switch_off(pos) + if tubelib.data_not_corrupted(pos) then + local node = minetest.get_node(pos) + node.name = "smartline:button" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):stop() + minetest.sound_play("button", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) + local meta = minetest.get_meta(pos) + local own_num = meta:get_string("own_num") + local numbers = meta:get_string("numbers") + local placer_name = meta:get_string("placer_name") + local clicker_name = nil + if meta:get_string("public") == "false" then + clicker_name = meta:get_string("clicker_name") + end + tubelib.send_message(numbers, placer_name, clicker_name, "off", own_num) + end +end + + +minetest.register_node("smartline:button", { + description = "SmartLine Button/Switch", + inventory_image = "smartline_button_inventory.png", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_button_off.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_num = tubelib.add_node(pos, "smartline:button") + meta:set_string("own_num", own_num) + meta:set_string("formspec", "size[5,6]".. + "dropdown[0.2,0;3;type;switch,button 2s,button 4s,button 8s,button 16s;1]".. + "field[0.5,2;3,1;numbers;Insert destination block number(s);]" .. + "checkbox[1,3;public;public;false]".. + "button_exit[1,4;2,1;exit;Save]") + meta:set_string("placer_name", placer:get_player_name()) + meta:set_string("public", "false") + meta:set_int("cycle_time", 0) + meta:set_string("infotext", "SmartLine Button "..own_num) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if tubelib.check_numbers(fields.numbers) then + meta:set_string("numbers", fields.numbers) + local own_num = meta:get_string("own_num") + meta:set_string("infotext", "SmartLine Button "..own_num..", connected with block "..fields.numbers) + else + return + end + if fields.public then + meta:set_string("public", fields.public) + end + local cycle_time = nil + if fields.type == "switch" then + cycle_time = 0 + elseif fields.type == "button 2s" then + cycle_time = 2 + elseif fields.type == "button 4s" then + cycle_time = 4 + elseif fields.type == "button 8s" then + cycle_time = 8 + elseif fields.type == "button 16s" then + cycle_time = 16 + end + if cycle_time ~= nil then + meta:set_int("cycle_time", cycle_time) + end + if fields.exit then + meta:set_string("formspec", nil) + end + end, + + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if meta:get_string("numbers") ~= "" and meta:get_string("numbers") ~= nil then + meta:set_string("clicker_name", clicker:get_player_name()) + switch_on(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("smartline:button_active", { + description = "SmartLine Button/Switch", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_button_on.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + meta:set_string("clicker_name", clicker:get_player_name()) + if meta:get_int("cycle_time") == nil or meta:get_int("cycle_time") == 0 then + switch_off(pos, node) + end + end, + + on_timer = switch_off, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, not_in_creative_inventory=1}, + drop = "smartline:button", + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "smartline:button", + recipe = { + {"", "", ""}, + {"dye:blue", "default:copper_ingot", "tubelib:wlanchip"}, + {"", "", ""}, + }, +}) diff --git a/mods/techpack/smartline/collector.lua b/mods/techpack/smartline/collector.lua new file mode 100644 index 00000000..d307d0db --- /dev/null +++ b/mods/techpack/smartline/collector.lua @@ -0,0 +1,210 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + collector.lua: + + Collects states from other nodes, acting as a state concentrator. + +]]-- + +local CYCLE_TIME = 1 + +local tStates = {stopped = 0, running = 0, standby = 1, blocked = 2, fault = 3, defect = 4} +local tDropdownPos = {["1 standby"] = 1, ["2 blocked"] = 2 , ["3 fault"] = 3, ["4 defect"] = 4} +local lStates = {[0] = "stopped", "standby", "blocked", "fault", "defect"} + +local function formspec(meta) + local poll_numbers = meta:get_string("poll_numbers") + local event_number = meta:get_string("event_number") + local dropdown_pos = meta:get_int("dropdown_pos") + if dropdown_pos == 0 then dropdown_pos = 1 end + + return "size[9,6]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0.3,0.6;9,1;poll_numbers;Node numbers to read the states from:;"..poll_numbers.."]" .. + "field[0.3,2;9,1;event_number;Node number to send the events to:;"..event_number.."]" .. + "label[1.3,2.8;Send an event if state is equal or larget than:]".. + "dropdown[1.2,3.4;7,4;severity;1 standby,2 blocked,3 fault,4 defect;"..dropdown_pos.."]".. + "button_exit[3,5;2,1;exit;Save]" +end + + +local function send_event(meta) + local event_number = meta:get_string("event_number") + if event_number ~= "" then + local state = meta:get_int("state") + local severity = meta:get_int("dropdown_pos") + local owner = meta:get_string("owner") + local own_number = meta:get_string("own_number") + if state >= severity then + tubelib.send_message(event_number, owner, nil, "on", own_number) + else + tubelib.send_message(event_number, owner, nil, "off", own_number) + end + meta:set_string("infotext", "SmartLine State Collector "..own_number..': "'..lStates[state]..'"') + meta:set_int("stored_state", state) + meta:set_int("state", 0) + end +end + +local function request_state(meta, poll_numbers, idx) + local number = string.split(poll_numbers, " ")[idx] + local state = tubelib.send_request(number, "state", nil) + if state then + state = tStates[state] or 0 + meta:set_int("state", math.max(meta:get_int("state"), state)) + end +end + + +local function on_timer(pos,elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + local poll_numbers = meta:get_string("poll_numbers") + local idx = meta:get_int("index") + 1 + + if poll_numbers == "" then + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "SmartLine State Collector "..own_number..": stopped") + meta:set_int("state", 0) + meta:set_int("stored_state", 0) + return false + end + + if idx > meta:get_int("num_numbers") then + idx = 1 + send_event(meta) + end + meta:set_int("index", idx) + + request_state(meta, poll_numbers, idx) + + return true + end + return false +end + +minetest.register_node("smartline:collector", { + description = "SmartLine State Collector", + inventory_image = "smartline_collector_inventory.png", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_collector.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_number = tubelib.add_node(pos, "smartline:collector") + meta:set_string("own_number", own_number) + meta:set_string("poll_numbers", "") + meta:set_string("event_number", "") + meta:set_string("formspec", formspec(meta)) + meta:set_string("infotext", "SmartLine State Collector "..own_number) + meta:set_string("owner", placer:get_player_name()) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local timer = minetest.get_node_timer(pos) + local own_number = meta:get_string("own_number") + if owner ~= player:get_player_name() then + return + end + + if fields.quit == "true" and fields.poll_numbers then + if tubelib.check_numbers(fields.event_number) then + meta:set_string("event_number", fields.event_number) + end + if tubelib.check_numbers(fields.poll_numbers) then + meta:set_string("poll_numbers", fields.poll_numbers) + meta:set_int("index", 0) + meta:set_int("num_numbers", #string.split(fields.poll_numbers, " ")) + if not timer:is_started() then + timer:start(CYCLE_TIME) + end + meta:set_string("infotext", "SmartLine State Collector "..own_number..": running") + else + if timer:is_started() then + timer:stop() + end + meta:set_string("infotext", "SmartLine State Collector "..own_number..": stopped") + meta:set_int("stored_state", 0) + end + if fields.severity then + meta:set_int("dropdown_pos", tDropdownPos[fields.severity]) + end + meta:set_string("formspec", formspec(meta)) + end + + end, + + on_timer = on_timer, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "smartline:collector", + recipe = { + {"", "default:copper_ingot", ""}, + {"tubelib:wlanchip", "dye:blue", "tubelib:wlanchip"}, + {"", "default:copper_ingot", ""}, + }, +}) + +tubelib.register_node("smartline:collector", {}, { + on_recv_message = function(pos, topic, payload) + if topic == "set_numbers" then + local meta = minetest.get_meta(pos) + if tubelib.check_numbers(payload) then + meta:set_string("poll_numbers", payload) + meta:set_string("formspec", formspec(meta)) + meta:set_int("num_numbers", #string.split(payload, " ")) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end + return true + elseif topic == "state" then + local meta = minetest.get_meta(pos) + local state = meta:get_int("stored_state") + return lStates[state] + else + return "unsupported" + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, +}) diff --git a/mods/techpack/smartline/commands.lua b/mods/techpack/smartline/commands.lua new file mode 100644 index 00000000..4c054bbd --- /dev/null +++ b/mods/techpack/smartline/commands.lua @@ -0,0 +1,715 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + command.lua: + + Register all basic controller commands + +]]-- + +smartline.register_condition("default", { + title = "", + formspec = {}, + on_execute = function(data, environ) end, + button_label = function(data) return "" end, +}) + +smartline.register_action("default", { + title = "", + formspec = {}, + on_execute = function(data, environ, number) end, + button_label = function(data) return "" end, +}) + + +smartline.register_condition("true", { + title = "true", + formspec = { + { + type = "label", + name = "lbl", + label = "Hint: Condition is always true.", + }, + }, + on_execute = function(data, environ) + return true + end, + button_label = function(data) + return "true" + end, +}) + +smartline.register_condition("false", { + title = "false", + formspec = { + { + type = "label", + name = "lbl", + label = "Hint: Condition is always false.", + }, + }, + on_execute = function(data, environ) + return false + end, + button_label = function(data) + return "false" + end, +}) + +smartline.register_condition("toggle", { + title = "toggle flag", + formspec = { + { + type = "label", + name = "lbl", + label = "Hint: This flag toggles (true/false) every two\nseconds and can be used to trigger\nan action every four seconds.", + }, + }, + on_execute = function(data, environ) + return environ.toggle + end, + button_label = function(data) + return "toggle" + end, +}) + +smartline.register_condition("flag", { + title = "flag", + formspec = { + { + type = "textlist", + name = "flag", + label = "flag", + choices = "f1,f2,f3,f4,f5,f6,f7,f8", + default = 1, + }, + { + type = "textlist", + name = "value", + label = "is", + choices = "true,false", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: The flag will keep its state.", + }, + }, + on_execute = function(data, environ) + return environ.flags[data.flag] == data.value_text + end, + button_label = function(data) + return data.flag_text.."=="..data.value_text + end, +}) + +smartline.register_condition("flag_reset", { + title = "flag test and clear", + formspec = { + { + type = "textlist", + name = "flag", + label = "flag", + choices = "f1,f2,f3,f4,f5,f6,f7,f8", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: The result is true, if the flag was true.\nAfter evaluation the flag is set to false.", + }, + }, + on_execute = function(data, environ) + local res = environ.flags[data.flag] == "true" + environ.flags[data.flag] = "false" + return res + end, + button_label = function(data) + return "test_clear("..data.flag_text..")" + end, +}) + +smartline.register_action("flag", { + title = "flag set", + formspec = { + { + type = "textlist", + name = "flag", + label = "set flag", + choices = "f1,f2,f3,f4,f5,f6,f7,f8", + default = 1, + }, + { + type = "textlist", + name = "value", + label = "to value", + choices = "true,false", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: Flags are stored permanently and\ncan be used as condition by other rules.", + }, + }, + on_execute = function(data, environ, number) + environ.flags[data.flag] = data.value_text + end, + button_label = function(data) + return data.flag_text.."="..data.value_text + end, +}) + +smartline.register_condition("input", { + title = "inputs", + formspec = { + { + type = "field", + name = "number", + label = "input from node with number", + default = "", + }, + { + type = "textlist", + name = "value", + label = "is", + choices = "on,off,false", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: An input is only available,\nif the sending node is connected\nwith the controller.", + }, + }, + on_execute = function(data, environ) + return environ.inputs[data.number] == data.value_text + end, + button_label = function(data) + return "i("..data.number..")=="..data.value_text + end, +}) + + +smartline.register_condition("timer", { + title = "timer expired", + formspec = { + { + type = "textlist", + name = "timer", + label = "timer expired", + choices = "t1,t2,t3,t4,t5,t6,t7,t8", + default = 1, + }, + }, + on_execute = function(data, environ) + return environ.timers[data.timer] == 0 + end, + button_label = function(data) + return data.timer_text.." expired" + end, +}) + +smartline.register_action("timer", { + title = "timer start", + formspec = { + { + type = "textlist", + name = "timer", + label = "start timer", + choices = "t1,t2,t3,t4,t5,t6,t7,t8", + default = 1, + }, + { + type = "field", + name = "value", + label = "value in sec.", + default = "", + }, + }, + on_execute = function(data, environ, number) + environ.timers[data.timer] = tonumber(data.value) or 0 + end, + button_label = function(data) + return data.timer_text.."="..data.value + end, +}) + +smartline.register_condition("pusher", { + title = "node state request", + formspec = { + { + type = "field", + name = "number", + label = "state from node with number", + default = "", + }, + { + type = "textlist", + name = "value", + label = "is", + choices = "stopped,running,standby,blocked,fault,defect,false", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: Read the state from another node.\nWorks for Pusher, Harvester, Quarry,\nFermenter, and Reformer", + }, + }, + + on_execute = function(data, environ) + environ.state = tubelib.send_request(data.number, "state", "") + return environ.state == data.value_text + end, + button_label = function(data) + return "st("..data.number..")=="..string.sub(data.value_text or "???", 1, 4).."." + end, +}) + +smartline.register_condition("fuel", { + title = "fuel state request", + formspec = { + { + type = "field", + name = "number", + label = "fuel state from node with number", + default = "", + }, + { + type = "textlist", + name = "value", + label = "is", + choices = "full,empty,not full,not empty,false", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: Read the fuel state from another node.\nWorks for Harvester and Quarry", + }, + }, + + on_execute = function(data, environ) + if data.value > 2 then + return tubelib.send_request(data.number, "fuel", nil) ~= string.sub(data.value_text or "???", 5) + else + return tubelib.send_request(data.number, "fuel", nil) == data.value_text + end + end, + button_label = function(data) + if data.value > 2 then + return "st("..data.number..")<>"..string.sub(data.value_text or "???", 5) + else + return "st("..data.number..")=="..data.value_text + end + end, +}) + +smartline.register_condition("signaltower", { + title = "Signal Tower state request", + formspec = { + { + type = "field", + name = "number", + label = "state from Signal Tower with number", + default = "", + }, + { + type = "textlist", + name = "value", + label = "is", + choices = "off,green,amber,red,not off,not green,not amber,not red,false", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: Read the state from a Signal Tower.", + }, + }, + + on_execute = function(data, environ) + if data.value > 4 then + return tubelib.send_request(data.number, "state", nil) ~= string.sub(data.value_text or "???", 5) + else + return tubelib.send_request(data.number, "state", nil) == data.value_text + end + end, + button_label = function(data) + if data.value > 4 then + return "sig("..data.number..")<>"..string.sub(data.value_text or "???", 5) + else + return "sig("..data.number..")=="..data.value_text + end + end, +}) + +smartline.register_action("signaltower", { + title = "Signal Tower command", + formspec = { + { + type = "field", + name = "number", + label = "set Signal Tower with number", + default = "", + }, + { + type = "textlist", + name = "value", + label = "to color", + choices = "off,green,amber,red", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: Turn on a lamp from a Signal Tower.", + }, + }, + on_execute = function(data, environ, number) + tubelib.send_message(data.number, data.owner, nil, data.value_text, number) + end, + button_label = function(data) + return "sig("..data.number..","..data.value_text..")" + end, +}) + +smartline.register_action("switch", { + title = "node on/off command", + formspec = { + { + type = "field", + name = "number", + label = "set node with number", + default = "", + }, + { + type = "textlist", + name = "value", + label = "to state", + choices = "on,off", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: Used for pushers, lamps, machines, gates,...", + }, + }, + on_execute = function(data, environ, number) + tubelib.send_message(data.number, data.owner, nil, data.value_text, number) + end, + button_label = function(data) + return "cmnd("..data.number..","..data.value_text..")" + end, +}) + +smartline.register_action("display1", { + title = "Display: add one line", + formspec = { + { + type = "field", + name = "number", + label = "output to Display with number", + default = "", + }, + { + type = "field", + name = "text", + label = "the following text", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: Use a '*' character as reference to any\ncondition state", + }, + }, + on_execute = function(data, environ, number) + local text = string.gsub(data.text, "*", environ.state or "") + tubelib.send_message(data.number, data.owner, nil, "text", text) + end, + button_label = function(data) + return "display("..data.number..")" + end, +}) + +smartline.register_action("display2", { + title = "Display: overwrite one line", + formspec = { + { + type = "field", + name = "number", + label = "output to Display with number", + default = "", + }, + { + type = "textlist", + name = "row", + label = "Display line", + choices = "1,2,3,4,5,6,7,8,9", + default = 1, + }, + { + type = "field", + name = "text", + label = "the following text", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: Use a '*' character as reference to any\ncondition state", + }, + }, + on_execute = function(data, environ, number) + local text = string.gsub(data.text, "*", environ.state or "") + local payload = {row = data.row, str = text} + tubelib.send_message(data.number, data.owner, nil, "row", payload) + end, + button_label = function(data) + return "display("..data.number..")" + end, +}) + +smartline.register_action("display3", { + title = "Display: player name", + formspec = { + { + type = "field", + name = "number", + label = "output to Display with number", + default = "", + }, + { + type = "field", + name = "text", + label = "the following text", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: Use a '*' character as reference to the\nplayer name", + }, + }, + on_execute = function(data, environ, number) + local text = string.gsub(data.text, "*", environ.state or "") + tubelib.send_message(data.number, data.owner, nil, "text", text) + end, + button_label = function(data) + return "display()" + end, +}) + +smartline.register_action("display4", { + title = "Display: Clear screen", + formspec = { + { + type = "field", + name = "number", + label = "Display number", + default = "", + }, + }, + on_execute = function(data, environ, number) + tubelib.send_message(data.number, data.owner, nil, "clear", "") + end, + button_label = function(data) + return "Clear screen" + end, +}) + +if minetest.get_modpath("mail") and mail ~= nil then + smartline.register_action("mail", { + title = "mail send", + formspec = { + { + type = "field", + name = "text", + label = "send the message", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: The mail is send to the Controller owner, only.", + }, + }, + on_execute = function(data, environ, number) + mail.send("Server", data.owner, "[SmartLine Controller]", data.text) + end, + button_label = function(data) + return "mail(...)" + end, + }) +end + +smartline.register_action("chat", { + title = "chat send", + formspec = { + { + type = "field", + name = "text", + label = "send the message", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: The chat message is send to the\nController owner, only.", + }, + }, + on_execute = function(data, environ, number) + minetest.chat_send_player(data.owner, "[SmartLine Controller] "..data.text) + end, + button_label = function(data) + return "chat(...)" + end, +}) + +local function door_toggle(pos, owner, state) + pos = minetest.string_to_pos("("..pos..")") + if pos then + local door = doors.get(pos) + if door then + local player = { + get_player_name = function() return owner end, + is_player = function() return true end, + } + if state == "open" then + door:open(player) + elseif state == "close" then + door:close(player) + end + end + end +end + +smartline.register_action("door", { + title = "doors open/close", + formspec = { + { + type = "field", + name = "pos", + label = "door position like: 123,7,-1200", + default = "", + }, + { + type = "textlist", + name = "door_state", + label = "set", + choices = "open,close", + default = 1, + }, + { + type = "label", + name = "lbl1", + label = "For standard doors like the Steel Doors.", + }, + { + type = "label", + name = "lbl2", + label = "Hint: Use the Tubelib Programmer to\ndetermine the door position.", + }, + }, + on_execute = function(data, environ, number) + door_toggle(data.pos, data.owner, data.door_state_text) + end, + button_label = function(data) + return "door("..data.door_state_text..")" + end, +}) + +smartline.register_condition("playerdetector", { + title = "Player Detector: name request", + formspec = { + { + type = "field", + name = "number", + label = "name from player detector with number", + default = "", + }, + { + type = "field", + name = "name", + label = "is", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: Read and check the name\nfrom a Player Detector.\n Use a '*' character for all player names.", + }, + }, + + on_execute = function(data, environ) + environ.state = tubelib.send_request(data.number, "name", nil) + return (data.name == "*" and environ.state ~= "") or environ.state == data.name + end, + button_label = function(data) + if string.len(data.name) > 6 then + return "name=="..string.sub(data.name or "???", 1, 6).."." + end + return "name=="..data.name + end, +}) + +smartline.register_condition("action", { + title = "actions", + formspec = { + { + type = "textlist", + name = "action", + label = "action is executed", + choices = "a1,a2,a3,a4,a5,a6,a7,a8,a9,a10", + default = 1, + }, + { + type = "label", + name = "lbl", + label = "Hint: The corresponding flag is set for each\nexecuted action. Useful to execute\nmore than one action with one condition.", + }, + }, + on_execute = function(data, environ) + return environ.actions[data.action] == true + end, + button_label = function(data) + return "action"..data.action + end, +}) + + +local function daytime() + local t = minetest.get_timeofday() + return string.format("%02d:%02d", math.floor(t*24) % 24, math.floor(t*1440) % 60) +end + +smartline.register_condition("rtc", { + title = "Read RTC", + formspec = { + { + type = "label", + name = "lbl", + label = "Hint: The condition is always false.\nThe time is available as state\n(see Display actions).", + }, + }, + + on_execute = function(data, environ) + environ.state = daytime() + return false + end, + button_label = function(data) + return "RTC" + end, +}) + diff --git a/mods/techpack/smartline/controller.lua b/mods/techpack/smartline/controller.lua new file mode 100644 index 00000000..1d4b6da8 --- /dev/null +++ b/mods/techpack/smartline/controller.lua @@ -0,0 +1,984 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + controller.lua: + + REPLACED BY SMARTLINE CONTROLLER2 !!! +]]-- + + +local NUM_RULES = 10 + +local mail_exists = minetest.get_modpath("mail") and mail ~= nil + +local sHELP = [[SmartLine Controller Help + +Control other nodes by means of rules, according to: + IF and/or THEN + +These rules allow to execute actions based on conditions. +Examples for conditions are: + - the Player Detector detects a player + - a button is pressed + - a node state is fault, blocked, standby,... + - a timer is expired + +Actions are: + - switch on/off tubelib nodes, like lamps, door blocks, machines + - send mail/chat messages to the owner + - output a text message to the display + - set timer variables + - set/reset flag variables + +Variables and timers: + - 8 flags (set/reset) can be used to store conditions + for later use. + - Action flags (one flag for each rule, set when action is executed) + The flag can be used as condition for subsequent rules. + - 8 timers (resolution in seconds) can be use + for delayed actions. + +The controller executes all rules once per second. +Independent how long the input condition stays 'true', +the corresponding action will be triggered only once. +The condition has to become false and then true again, to +re-trigger/execute the action again. + +The 'label' has no function. It is only used +to give rules a name. + +Edit command examples: + - 'x 1 8' exchange rows 1 with row 8 + - 'c 1 2' copy row 1 to 2 + - 'd 3' delete row 3 + +The state view shows the current state of all rules. +The colors show, if conditions are true or false and +if actions were already executed or not. +It has a 'update' button to update the view. + +]] + +local sOUTPUT = "Press 'help' for edit commands" + +-- +-- Helper functions +-- +local function create_kv_list(elem) + local a = {} + for i,v in ipairs(elem) do + a[v] = i + end + return a +end + +local function output(label, prefix, postfix, kvTbl) + local tbl = {label..": "} + for k,v in pairs(kvTbl) do + tbl[#tbl+1] = prefix..k..postfix.."="..v..", " + end + return table.concat(tbl) +end + + +-- +-- Conditions +-- + +-- tables with all data from condition/action registrations +local kvRegisteredCond = {} +local kvRegisteredActn = {} + +-- list of keys for conditions/actions +local aCondTypes = {} +local aActnTypes = {} + +-- list of titles for conditions/actions +local aCondTitles = {} +local aActnTitles = {} + +-- table with runtime functions +local CondRunTimeHandlers = {} +local ActnRunTimeHandlers = {} + + +local function eval_cond(data, environ) + return CondRunTimeHandlers[data.__idx__](data, environ) and 1 or 0 +end + +local function exec_action(data, environ, number) + ActnRunTimeHandlers[data.__idx__](data, environ, number) +end + +-- +-- API functions for condition/action registrations +-- +function smartline.register_condition(key, tData) + table.insert(CondRunTimeHandlers, tData.on_execute) + table.insert(aCondTypes, key) + table.insert(aCondTitles, tData.title) + tData.__idx__ = #aCondTypes + if kvRegisteredCond[key] ~= nil then + print("[SmartLine] Condition registration error "..key) + return + end + kvRegisteredCond[key] = tData + for _,item in ipairs(tData.formspec) do + if item.type == "textlist" then + item.tChoices = string.split(item.choices, ",") + item.num_choices = #item.tChoices + end + end +end + +function smartline.register_action(key, tData) + table.insert(ActnRunTimeHandlers, tData.on_execute) + table.insert(aActnTypes, key) + table.insert(aActnTitles, tData.title) + tData.__idx__ = #aActnTypes + if kvRegisteredActn[key] ~= nil then + print("[SmartLine] Action registration error "..key) + return + end + kvRegisteredActn[key] = tData + for _,item in ipairs(tData.formspec) do + if item.type == "textlist" then + item.tChoices = string.split(item.choices, ",") + item.num_choices = #item.tChoices + end + end +end + + +-- +-- Formspec +-- + +-- Determine the selected submenu and return the corresponding +-- formspec definition. +-- postfix: row/culumn info like "11" or "a2" +-- type: "cond" or "actn" +-- fs_data: formspec data +local function get_active_subm_definition(postfix, type, fs_data) + local idx = 1 + local fs_definition = {} + if type == "cond" then + idx = fs_data["subm"..postfix.."_cond"] or 1 + local key = aCondTypes[idx] + fs_definition = kvRegisteredCond[key] + elseif type == "actn" then + idx = fs_data["subm"..postfix.."_actn"] or 1 + local key = aActnTypes[idx] + fs_definition = kvRegisteredActn[key] + end + return idx, fs_definition +end + +-- Extract runtime relevant data from the given submenu +-- postfix: row/culum info like "11" or "a2" +-- fs_definition: submenu formspec definition +-- fs_data: formspec data +local function get_subm_data(postfix, fs_definition, fs_data) + local data = {} + for idx,elem in ipairs(fs_definition.formspec) do + if elem.type == "field" then + data[elem.name] = fs_data["subm"..postfix.."_"..elem.name] or "?" + elseif elem.type == "textlist" then + local num = tonumber(fs_data["subm"..postfix.."_"..elem.name]) or 1 + num = math.min(num, elem.num_choices) + data[elem.name] = num + data[elem.name.."_text"] = elem.tChoices[num] + end + end + -- type of the condition/action + data.__idx__ = fs_definition.__idx__ + return data +end + +-- Copy field/formspec data to the table fs_data +-- fs_definition: submenu formspec definituion +-- fields: formspec input +-- fs_data: formspec data +local function field2fs_data(fs_definition, fields, fs_data) + for idx,elem in ipairs(fs_definition.formspec) do + local key = "subm"..fields._postfix_.."_"..elem.name + if elem.type == "field" then + if fields[elem.name] then + fs_data[key] = fields[elem.name] + end + elseif elem.type == "textlist" then + local evt = minetest.explode_textlist_event(fields[elem.name]) + if evt.type == "CHG" then + fs_data[key] = evt.index + end + end + if fs_data[key] == nil then + fs_data[key] = elem.default + end + end + return fs_data +end + +local function add_controls_to_table(tbl, postfix, fs_data, fs_definition) + local val = "" + local offs = 2.4 + for idx,elem in ipairs(fs_definition.formspec) do + if elem.label then + tbl[#tbl+1] = "label[0,"..offs..";"..elem.label.."]" + offs = offs + 0.5 + end + if elem.type == "field" then + val = fs_data["subm"..postfix.."_"..elem.name] or elem.default + tbl[#tbl+1] = "field[0.3,"..(offs+0.2)..";8.2,1;"..elem.name..";;"..val.."]" + offs = offs + 0.9 + elseif elem.type == "textlist" then + val = fs_data["subm"..postfix.."_"..elem.name] or elem.default + tbl[#tbl+1] = "textlist[0.0,"..(offs)..";8,1.4;"..elem.name..";"..elem.choices..";"..val.."]" + offs = offs + 1.8 + end + end + return tbl +end + +local function runtime_data(postfix, type, fs_data) + local _,fs_definition = get_active_subm_definition(postfix, type, fs_data) + return get_subm_data(postfix, fs_definition, fs_data) +end + +local function decrement_timers(timers) + if timers ~= nil then + for idx,_ in pairs(timers) do + timers[idx] = tonumber(timers[idx]) + if timers[idx] >= 0 then + timers[idx] = timers[idx] - 1 + end + end + end +end + +local function toggle_flag(meta, environ) + environ.toggle = (meta:get_int("runtime") or 0) % 4 >= 2 +end + + +-- +-- Condition formspec +-- +local function formspec_cond(_postfix_, fs_data) + local tbl = {"size[8.2,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;cond]".. + "field[0,0;0,0;_postfix_;;".._postfix_.."]"} + + local sConditions = table.concat(aCondTitles, ",") + local cond_idx, fs_definition = get_active_subm_definition(_postfix_, "cond", fs_data) + tbl[#tbl+1] = "label[0,0.1;Condition type:]" + tbl[#tbl+1] = "textlist[0,0.6;8,1.4;cond;"..sConditions..";"..cond_idx.."]" + tbl = add_controls_to_table(tbl, _postfix_, fs_data, fs_definition) + tbl[#tbl+1] = "button[4,8.4;2,1;_cancel_;cancel]" + tbl[#tbl+1] = "button[6,8.4;2,1;_exit_;ok]" + return table.concat(tbl) +end + +-- evaluate the row condition +local function eval_formspec_cond(meta, fs_data, fields, readonly) + if readonly then return fs_data end + -- determine condition type + local cond = minetest.explode_textlist_event(fields.cond) + if cond.type == "CHG" then + fs_data["subm"..fields._postfix_.."_cond"] = cond.index + end + -- prepare data + local _, fs_definition = get_active_subm_definition(fields._postfix_, "cond", fs_data) + fs_data = field2fs_data(fs_definition, fields, fs_data) + local data = get_subm_data(fields._postfix_, fs_definition, fs_data) + -- update button for main menu + fs_data["cond"..fields._postfix_] = fs_definition.button_label(data) + + if fields._exit_ == nil then + -- update formspec if exit is not pressed + meta:set_string("formspec", formspec_cond(fields._postfix_, fs_data)) + end + return fs_data +end + + +-- +-- Action formspec +-- +local function formspec_actn(_postfix_, fs_data) + local tbl = {"size[8.2,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;actn]".. + "field[0,0;0,0;_postfix_;;".._postfix_.."]"} + + local sActions = table.concat(aActnTitles, ",") + local actn_idx, fs_definition = get_active_subm_definition(_postfix_, "actn", fs_data) + tbl[#tbl+1] = "label[0,0.1;Action type:]" + tbl[#tbl+1] = "textlist[0,0.6;8,1.4;actn;"..sActions..";"..actn_idx.."]" + tbl = add_controls_to_table(tbl, _postfix_, fs_data, fs_definition) + tbl[#tbl+1] = "button[4,8.4;2,1;_cancel_;cancel]" + tbl[#tbl+1] = "button[6,8.4;2,1;_exit_;ok]" + return table.concat(tbl) +end + +-- evaluate the row action +local function eval_formspec_actn(meta, fs_data, fields, readonly) + if readonly then return fs_data end + -- determine action type + local actn = minetest.explode_textlist_event(fields.actn) + if actn.type == "CHG" then + fs_data["subm"..fields._postfix_.."_actn"] = actn.index + end + -- prepare data + local _, fs_definition = get_active_subm_definition(fields._postfix_, "actn", fs_data) + fs_data = field2fs_data(fs_definition, fields, fs_data) + local data = get_subm_data(fields._postfix_, fs_definition, fs_data) + -- update button for main menu + fs_data["actn"..fields._postfix_] = fs_definition.button_label(data) + + if fields._exit_ == nil then + -- update formspec if exit is not pressed + meta:set_string("formspec", formspec_actn(fields._postfix_, fs_data)) + end + if fields._cancel_ then + fields._exit_ = true + end + return fs_data +end + + +-- +-- Label text formspec +-- +local function formspec_label(_postfix_, fs_data) + local label = fs_data["label".._postfix_] or "" + return "size[6,4]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;label]".. + "field[0,0;0,0;_postfix_;;".._postfix_.."]".. + "label[0.2,0.3;Label:]".. + "field[0.3,1.5;5,1;label;;"..label.."]".. + "button[4.5,3;1.5,1;_exit_;ok]" +end + +-- evaluate the row label +local function eval_formspec_label(meta, fs_data, fields, readonly) + if readonly then return fs_data end + fs_data["subml"..fields._postfix_.."_label"] = fields.label + if fields._exit_ == nil then + meta:set_string("formspec", formspec_label(fields._postfix_, fs_data)) + end + -- set the button label of the main menu based on the given input in the submenu + fs_data["label"..fields._postfix_] = fs_data["subml"..fields._postfix_.."_label"] + return fs_data +end + + +-- +-- Operand formspec +-- +local function formspec_oprnd(_postfix_, fs_data) + local oprnd = fs_data["submo".._postfix_.."_oprnd"] or "" + return "size[6,4]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;oprnd]".. + "field[0,0;0,0;_postfix_;;".._postfix_.."]".. + "label[0.2,0.3;Operand:]".. + "textlist[0,0.8;5.6,1.4;oprnd;or,and;"..oprnd.."]".. + "button[4.5,3;1.5,1;_exit_;ok]" +end + +-- evaluate the row operand +local function eval_formspec_oprnd(meta, fs_data, fields, readonly) + if readonly then return fs_data end + local oprnd = minetest.explode_textlist_event(fields.oprnd) + if oprnd.type == "CHG" then + fs_data["submo"..fields._postfix_.."_oprnd"] = oprnd.index + end + if fields._exit_ == nil then + meta:set_string("formspec", formspec_oprnd(fields._postfix_, fs_data)) + end + -- set the button label of the main menu based on the given input in the submenu + fs_data["oprnd"..fields._postfix_] = fs_data["submo"..fields._postfix_.."_oprnd"] == 1 and "or" or "and" + return fs_data +end + +local function formspec_main(state, fs_data, output) + local tbl = {"size[15,9;true]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;main]".. + "label[0.8,0;label:]label[3.8,0;IF cond 1:]label[7,0;and/or]label[8.3,0;cond 2:]label[11.7,0;THEN action:]"} + + for idx = 1,NUM_RULES do + local ypos = idx * 0.75 - 0.4 + tbl[#tbl+1] = "label[0,"..(0.2+ypos)..";"..idx.."]" + tbl[#tbl+1] = "button[0.4,"..ypos..";3,1;label"..idx..";"..(fs_data["label"..idx] or "...").."]" + tbl[#tbl+1] = "button[3.5,"..ypos..";3.4,1;cond1"..idx..";"..(fs_data["cond1"..idx] or "...").."]" + tbl[#tbl+1] = "button[7,".. ypos..";1,1;oprnd".. idx..";"..(fs_data["oprnd"..idx] or "or").."]" + tbl[#tbl+1] = "button[8,".. ypos..";3.4,1;cond2"..idx..";"..(fs_data["cond2"..idx] or "...").."]" + tbl[#tbl+1] = "button[11.5,".. ypos..";3.4,1;actna"..idx..";"..(fs_data["actna"..idx] or "...").."]" + end + tbl[#tbl+1] = "image_button[14,8.1;1,1;".. tubelib.state_button(state) ..";button;]" + tbl[#tbl+1] = "button[10.6,8.2;1.5,1;state;state]" + tbl[#tbl+1] = "button[12.2,8.2;1.5,1;help;help]" + tbl[#tbl+1] = "label[0.2,8.4;"..output.."]" + tbl[#tbl+1] = "field[6.5,8.5;3,1;cmnd;;]" + tbl[#tbl+1] = "button[9.2,8.2;1,1;ok;OK]" + return table.concat(tbl) +end + +local function eval_formspec_main(meta, fs_data, fields, readonly) + meta:set_string("fs_old", minetest.serialize(fs_data)) + for idx = 1,NUM_RULES do + -- eval standard inputs + if not readonly then + fs_data["oprnd"..idx] = fields["oprnd"..idx] or fs_data["oprnd"..idx] + end + + -- eval submenu button events + if fields["label"..idx] then + meta:set_string("formspec", formspec_label(idx, fs_data)) + elseif fields["cond1"..idx] then + meta:set_string("formspec", formspec_cond("1"..idx, fs_data)) + elseif fields["cond2"..idx] then + meta:set_string("formspec", formspec_cond("2"..idx, fs_data)) + elseif fields["oprnd"..idx] then + meta:set_string("formspec", formspec_oprnd(idx, fs_data)) + elseif fields["actna"..idx] then + meta:set_string("formspec", formspec_actn("a"..idx, fs_data)) + end + end + return fs_data +end + +local function formspec_help(offs) + return "size[15,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;help]".. + "label[0,"..(-offs/50)..";"..sHELP.."]".. + --"label[0.2,0;test]".. + "scrollbar[13.5,1;0.5,7;vertical;sb_help;"..offs.."]".. + "button[13.3,8.2;1.5,1;close;close]" +end + +local function background(xpos, ypos, val) + if val == true then + return "box["..(xpos-0.1)..",".. ypos..";3.3,0.4;#008000]" + elseif val == false then + return "box["..(xpos-0.1)..",".. ypos..";3.3,0.4;#800000]" + else + return "box["..(xpos-0.1)..",".. ypos..";3.3,0.4;#202020]" + end +end + +local function formspec_state(meta, fs_data) + local number = meta:get_string("number") + local state = meta:get_int("state") + local tbl = {"size[15,9;true]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;state]".. + "label[0.8,0;label:]label[3.8,0;IF cond 1:]label[7,0;and/or]label[8.3,0;cond 2:]label[11.7,0;THEN action:]"} + + if state == tubelib.RUNNING and number then + local environ = tubelib.get_data(number, "environ") + local act_gate = tubelib.get_data(number, "act_gate") + local conds = tubelib.get_data(number, "conds") + + if environ and act_gate and conds then + for idx = 1,NUM_RULES do + local ypos = idx * 0.6 + 0.2 + local s1 = fs_data["cond1"..idx] or " ... " + local s2 = fs_data["cond2"..idx] or " ... " + local sa = fs_data["actna"..idx] or " ... " + if conds[idx] == nil then + tbl[#tbl+1] = background(3.7, ypos, nil) + tbl[#tbl+1] = background(8, ypos, nil) + else + tbl[#tbl+1] = background(3.7, ypos, conds[idx] == 1 or conds[idx] == 3) + tbl[#tbl+1] = background(8, ypos, conds[idx] == 2 or conds[idx] == 3) + end + tbl[#tbl+1] = background(11.5, ypos, act_gate[idx]) + tbl[#tbl+1] = "label[0,".. ypos..";"..idx.."]" + tbl[#tbl+1] = "label[0.5,"..ypos..";"..(fs_data["label"..idx] or " ... ").."]" + tbl[#tbl+1] = "label[3.7,".. ypos..";"..s1.."]" + tbl[#tbl+1] = "label[7.2,".. ypos..";"..(fs_data["oprnd"..idx] or "or").."]" + tbl[#tbl+1] = "label[8,".. ypos..";"..s2.."]" + tbl[#tbl+1] = "label[11.5,".. ypos..";"..sa.."]" + if act_gate[idx] == true then + act_gate[idx] = false + end + end + + tbl[#tbl+1] = "label[10,7; Seconds: "..(meta:get_int("runtime") or 1).."]" + + tbl[#tbl+1] = "label[0,7;"..output("Inputs", "i(", ")", environ.inputs).."]" + tbl[#tbl+1] = "label[0,7.6;"..output("Timers", "t", "", environ.timers).."]" + tbl[#tbl+1] = "label[0,8.2;"..output("Flags", "f", "", environ.flags).."]" + + tbl[#tbl+1] = "label[0,8.8;Hint:]" + tbl[#tbl+1] = "box[1.3,8.8;6,0.4;#008000]" + tbl[#tbl+1] = "label[1.4,8.8;condition true / action executed]" + tbl[#tbl+1] = "box[7.9,8.8;6,0.4;#800000]" + tbl[#tbl+1] = "label[8,8.8;condition false / action out-of-date]" + end + end + + tbl[#tbl+1] = "button[13.3,6.9;1.7,1;update;update]" + tbl[#tbl+1] = "button[13.3,7.8;1.7,1;close;close]" + return table.concat(tbl) +end + +local function execute(meta, number, debug) + local rt_rules = tubelib.get_data(number, "rt_rules") + local environ = tubelib.get_data(number, "environ") + local act_gate = tubelib.get_data(number, "act_gate") + local conds = tubelib.get_data(number, "conds") + if rt_rules and environ and act_gate and conds then + environ.actions = {} + decrement_timers(environ.timers) + toggle_flag(meta, environ) + for i,item in ipairs(rt_rules) do + local c1 = eval_cond(item.cond1, environ) + local c2 = eval_cond(item.cond2, environ) + conds[i] = c1 + c2*2 + if c1 + c2 >= item.cond_cnt then + if act_gate[i] == nil then + -- execute action + exec_action(item.actn, environ, number) + environ.actions[i] = true + act_gate[i] = true + end + else + act_gate[i] = nil + end + end + end +end + +local function check_rules(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + --local t = minetest.get_us_time() + local meta = minetest.get_meta(pos) + meta:set_int("runtime", (meta:get_int("runtime") or 1) + 1) + local number = meta:get_string("number") + local state = meta:get_int("state") + if state == tubelib.RUNNING and number then + execute(meta, number, debug) + end + --print("time", minetest.get_us_time() - t) + return true + end + return false +end + +local function switch_state(pos, state, fs_data) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("state", state) + meta:set_string("formspec", formspec_main(state, fs_data, sOUTPUT)) + if state == tubelib.RUNNING then + meta:set_string("infotext", "SmartLine Controller "..number..": running") + minetest.get_node_timer(pos):start(1) + else + meta:set_string("infotext", "SmartLine Controller "..number..": stopped") + minetest.get_node_timer(pos):stop() + end +end + +local function start_controller(pos, number, fs_data) + -- delete old data + tubelib.set_data(number, "environ", { + timers = {}, + flags = {}, + inputs = {} + }) + tubelib.set_data(number, "conds", {}) + tubelib.set_data(number, "act_gate", {}) + switch_state(pos, tubelib.RUNNING, fs_data) +end + +function smartline.stop_controller(pos, fs_data) + switch_state(pos, tubelib.STOPPED, fs_data) +end + +local function formspec2runtime_rule(number, owner, fs_data) + local rt_rules = {} + local num2inp = {} + for idx = 1,NUM_RULES do + -- valid rule? + if fs_data["subm1"..idx.."_cond"] and fs_data["subm2"..idx.."_cond"] + and fs_data["subma"..idx.."_actn"] then + -- add to list of runtine rules + local rule = { + cond_cnt = fs_data["oprnd"..idx] == "and" and 2 or 1, + cond1 = runtime_data("1"..idx, "cond", fs_data), + cond2 = runtime_data("2"..idx, "cond", fs_data), + actn = runtime_data("a"..idx, "actn", fs_data), + } + rule.actn.owner = owner + table.insert(rt_rules, rule) + end + end + tubelib.set_data(number, "rt_rules", rt_rules) +end + + +local function get_keys(fs_data) + -- collect all keys and remove row information + local keys = {} + for k,v in pairs(fs_data) do + local key = string.sub(k,1,5).."*"..string.sub(k, 7) + if type(v) == 'number' then + keys[key] = 1 -- default value + else + keys[key] = "..." -- default value + end + end + return keys +end + +local function exchange_rules(fs_data, pos1, pos2) + -- exchange elem by elem + for k,v in pairs(get_keys(fs_data)) do + local k1 = string.gsub(k, "*", pos1) + local k2 = string.gsub(k, "*", pos2) + local temp = fs_data[k1] or v + fs_data[k1] = fs_data[k2] or v + fs_data[k2] = temp + end + return fs_data +end + +local function copy_rule(fs_data, pos1, pos2) + -- copy elem by elem + for k,v in pairs(get_keys(fs_data)) do + local k1 = string.gsub(k, "*", pos1) + local k2 = string.gsub(k, "*", pos2) + fs_data[k2] = fs_data[k1] or v + end + return fs_data +end + +local function delete_rule(fs_data, pos) + for k,v in pairs(get_keys(fs_data)) do + local k1 = string.gsub(k, "*", pos) + fs_data[k1] = nil + end + return fs_data +end + +local function edit_command(fs_data, text) + local cmnd, pos1, pos2 = text:match('^(%S)%s(%d+)%s(%d+)$') + if pos2 == nil then + cmnd, pos1 = text:match('^(%S)%s(%d+)$') + end + if cmnd and pos1 and pos2 then + pos1 = math.max(1, math.min(pos1, NUM_RULES)) + pos2 = math.max(1, math.min(pos2, NUM_RULES)) + + if cmnd == "x" then + exchange_rules(fs_data, pos1, pos2) + return "rows "..pos1.." and "..pos2.." exchanged" + end + if cmnd == "c" then + copy_rule(fs_data, pos1, pos2) + return "row "..pos1.." copied to "..pos2 + end + elseif cmnd == "d" and pos1 then + pos1 = math.max(1, math.min(pos1, NUM_RULES)) + + delete_rule(fs_data, pos1) + return "row "..pos1.." deleted" + end + return "Invalid command '"..text.."'" +end + +local function on_receive_fields(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local state = meta:get_int("state") + if not player or not player:is_player() then + return + end + local fs_data = minetest.deserialize(meta:get_string("fs_data")) or {} + local output = "" + local readonly = player:get_player_name() ~= owner + + -- FIRST: test if command entered? + if fields.ok then + if not readonly then + output = edit_command(fs_data, fields.cmnd) + smartline.stop_controller(pos, fs_data) + meta:set_string("formspec", formspec_main(tubelib.STOPPED, fs_data, output)) + meta:set_string("fs_data", minetest.serialize(fs_data)) + end + -- SECOND: eval none edit events (events based in __type__)? + elseif fields.help then + meta:set_string("formspec", formspec_help(1)) + elseif fields.state then + meta:set_string("formspec", formspec_state(meta, fs_data)) + elseif fields.update then + meta:set_string("formspec", formspec_state(meta, fs_data)) + elseif fields._cancel_ then + fs_data = minetest.deserialize(meta:get_string("fs_old")) + meta:set_string("formspec", formspec_main(state, fs_data, sOUTPUT)) + elseif fields.close then + meta:set_string("formspec", formspec_main(state, fs_data, sOUTPUT)) + elseif fields.sb_help then + local evt = minetest.explode_scrollbar_event(fields.sb_help) + if evt.type == "CHG" then + meta:set_string("formspec", formspec_help(evt.value)) + end + elseif fields.button then + if not readonly then + local number = meta:get_string("number") + local state = meta:get_int("state") + if state == tubelib.RUNNING then + smartline.stop_controller(pos, fs_data) + meta:set_string("formspec", formspec_main(tubelib.STOPPED, fs_data, sOUTPUT)) + else + formspec2runtime_rule(number, owner, fs_data) + start_controller(pos, number, fs_data) + meta:set_string("formspec", formspec_main(tubelib.RUNNING, fs_data, sOUTPUT)) + end + end + -- THIRD: evaluate edit events from sub-menus + elseif fields._type_ == "main" then + fs_data = eval_formspec_main(meta, fs_data, fields, readonly) + meta:set_string("fs_data", minetest.serialize(fs_data)) + elseif fields._type_ == "label" then + fs_data = eval_formspec_label(meta, fs_data, fields, readonly) + meta:set_string("fs_data", minetest.serialize(fs_data)) + elseif fields._type_ == "cond" then + fs_data = eval_formspec_cond(meta, fs_data, fields, readonly) + meta:set_string("fs_data", minetest.serialize(fs_data)) + elseif fields._type_ == "oprnd" then + fs_data = eval_formspec_oprnd(meta, fs_data, fields, readonly) + meta:set_string("fs_data", minetest.serialize(fs_data)) + elseif fields._type_ == "actn" then + fs_data = eval_formspec_actn(meta, fs_data, fields, readonly) + meta:set_string("fs_data", minetest.serialize(fs_data)) + elseif fields._type_ == "help" then + meta:set_string("formspec", formspec_main(state, fs_data, sOUTPUT)) + elseif fields._type_ == "state" then + meta:set_string("formspec", formspec_main(state, fs_data, sOUTPUT)) + end + -- FOURTH: back to main menu + if fields._exit_ then + meta:set_string("formspec", formspec_main(state, fs_data, sOUTPUT)) +-- smartline.stop_controller(pos, fs_data) +-- meta:set_string("fs_data", minetest.serialize(fs_data)) +-- end + end +end + +minetest.register_node("smartline:controller", { + description = "SmartLine Controller", + inventory_image = "smartline_controller_inventory.png", + wield_image = "smartline_controller_inventory.png", + stack_max = 1, + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_controller.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "smartline:controller") + local fs_data = {} + meta:set_string("fs_data", minetest.serialize(fs_data)) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("number", number) + meta:set_int("state", tubelib.STOPPED) + meta:set_int("debug", 0) + meta:set_string("formspec", formspec_main(tubelib.STOPPED, fs_data, sOUTPUT)) + meta:set_string("infotext", "SmartLine Controller "..number..": stopped") + end, + + on_receive_fields = on_receive_fields, + + on_dig = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end, + + on_timer = check_rules, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + drop = "smartline:controller2", +}) + + +minetest.register_craft({ + output = "smartline:controller", + recipe = { + {"", "default:mese_crystal", ""}, + {"dye:blue", "default:copper_ingot", "tubelib:wlanchip"}, + {"", "default:mese_crystal", ""}, + }, +}) + + +local function set_input(meta, payload, val) + if payload then + local number = meta:get_string("number") + local environ = tubelib.get_data(number, "environ") or {} + if environ.inputs then + environ.inputs[payload] = val + tubelib.set_data(number, "environ", environ) + end + end +end + +tubelib.register_node("smartline:controller", {}, { + on_recv_message = function(pos, topic, payload) + local meta = minetest.get_meta(pos) + if topic == "on" then + set_input(meta, payload, topic) + elseif topic == "off" then + set_input(meta, payload, topic) + elseif topic == "state" then + local state = meta:get_int("state") + return tubelib.statestring(state) + else + return "unsupported" + end + end, + on_node_load = function(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("state") == tubelib.RUNNING then + minetest.get_node_timer(pos):start(1) + end + end, +}) + +-- List of Controller actions and conditions is dependent on loaded mods. +-- Therefore, the order of actions and conditions has to be re-assembled each time. +-- last order from last run is stored as meta data +local storage = minetest.get_mod_storage() + +local function old_to_new(newTypes, oldTypes) + local res = {} + if #oldTypes == 0 then + return nil + end + local new = create_kv_list(newTypes) + for idx,key in ipairs(oldTypes) do + res[idx] = new[key] or 1 + end + return res +end + +local function update_node_database(meta) + local aOldCondTypes = minetest.deserialize(meta:get_string("aCondTypes")) or {} + local aOldActnTypes = minetest.deserialize(meta:get_string("aActnTypes")) or {} + + local tOld2NewCond = old_to_new(aCondTypes, aOldCondTypes) + local tOld2NewActn = old_to_new(aActnTypes, aOldActnTypes) + + meta:set_string("aCondTypes", minetest.serialize(aCondTypes)) + meta:set_string("aActnTypes", minetest.serialize(aActnTypes)) + + return tOld2NewCond, tOld2NewActn +end + +local function maintain_dataset(number) + local flags = tubelib.get_data(number, "flags") + if flags ~= nil then + local timers = tubelib.get_data(number, "timers") or {} + local inputs = tubelib.get_data(number, "inputs") or {} + + tubelib.set_data(number, "environ", { + flags = flags, + timers = timers, + inputs = inputs, + vars = {} + }) + + tubelib.set_data(number, "inputs", nil) + tubelib.set_data(number, "timers", nil) + tubelib.set_data(number, "flags", nil) + end +end + +-- +-- Update formspec data for the case that rules order has changed or new rules were added +-- +function smartline.update_fs_data(meta, fs_data) + local tOld2NewCond, tOld2NewActn = update_node_database(meta) + if tOld2NewCond and tOld2NewActn then + -- map from old to new indexes + for idx = 1,NUM_RULES do + fs_data["subm1"..idx.."_cond"] = tOld2NewCond[fs_data["subm1"..idx.."_cond"]] + fs_data["subm2"..idx.."_cond"] = tOld2NewCond[fs_data["subm2"..idx.."_cond"]] + fs_data["subma"..idx.."_actn"] = tOld2NewActn[fs_data["subma"..idx.."_actn"]] + end + + end + return fs_data +end + +minetest.register_lbm({ + label = "[SmartLine] Controller update", + name = "smartline:update", + nodenames = {"smartline:controller"}, + run_at_every_load = true, + action = function(pos, node) + local meta = minetest.get_meta(pos) + + local fs_data = minetest.deserialize(meta:get_string("fs_data")) + fs_data = smartline.update_fs_data(meta, fs_data) + meta:set_string("fs_data", minetest.serialize(fs_data)) + + local number = meta:get_string("number") + local owner = meta:get_string("owner") + formspec2runtime_rule(number, owner, fs_data) + + maintain_dataset(number) + end +}) + diff --git a/mods/techpack/smartline/depends.txt b/mods/techpack/smartline/depends.txt new file mode 100644 index 00000000..32cfef97 --- /dev/null +++ b/mods/techpack/smartline/depends.txt @@ -0,0 +1,7 @@ +default +doors +tubelib +lcdlib +sl_controller +mail? + diff --git a/mods/techpack/smartline/description.txt b/mods/techpack/smartline/description.txt new file mode 100644 index 00000000..90f2231f --- /dev/null +++ b/mods/techpack/smartline/description.txt @@ -0,0 +1,2 @@ +SmartLine is a Tubelib extension with small and smart sensors, actors and controllers. + diff --git a/mods/techpack/smartline/display.lua b/mods/techpack/smartline/display.lua new file mode 100644 index 00000000..62d8b267 --- /dev/null +++ b/mods/techpack/smartline/display.lua @@ -0,0 +1,164 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + display.lua: + +]]-- + + + +lcdlib.register_display_entity("smartline:entity") + +local function display_update(pos, objref) + local meta = minetest.get_meta(pos) + local text = meta:get_string("text") or "" + text = string.gsub(text, "|", " \n") + local texture = lcdlib.make_multiline_texture( + "default", text, + 120, 120, 9, "top", "#000") + objref:set_properties({ textures = {texture}, + visual_size = {x=0.94, y=0.94} }) +end + +local function on_timer(pos) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + lcdlib.update_entities(pos) + return false + end + return false +end + +local lcd_box = { + type = "wallmounted", + wall_top = {-8/16, 15/32, -8/16, 8/16, 8/16, 8/16} +} + +minetest.register_node("smartline:display", { + description = "SmartLine Display", + inventory_image = 'smartline_display_inventory.png', + tiles = {"smartline_display.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + node_box = lcd_box, + selection_box = lcd_box, + light_source = 6, + + display_entities = { + ["smartline:entity"] = { depth = 0.42, + on_display_update = display_update}, + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "smartline:display") + local meta = minetest.get_meta(pos) + meta:set_string("number", number) + meta:set_string("text", " \n \nMinetest\nSmartLine Tools\n \nDisplay\nNumber: "..number) + meta:set_int("startscreen", 1) + lcdlib.update_entities(pos) + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + on_timer = on_timer, + on_place = lcdlib.on_place, + on_construct = lcdlib.on_construct, + on_destruct = lcdlib.on_destruct, + on_rotate = lcdlib.on_rotate, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + + +minetest.register_craft({ + output = "smartline:display", + recipe = { + {"", "", ""}, + {"default:glass", "dye:green", "tubelib:wlanchip"}, + {"", "default:copper_ingot", ""}, + }, +}) + +local function add_line(meta, payload) + local text = meta:get_string("text") + local rows + if meta:get_int("startscreen") == 1 then + rows = {} + meta:set_int("startscreen", 0) + else + rows = string.split(text, "|") + end + if #rows > 8 then + table.remove(rows, 1) + end + table.insert(rows, payload) + text = table.concat(rows, "|") + meta:set_string("text", text) +end + +local function write_row(meta, payload) + local text = meta:get_string("text") + if type(payload) == "table" then + local row = tonumber(payload.row) or 0 + if row > 9 then row = 9 end + local str = payload.str or "oops" + if row == 0 then + meta:set_string("infotext", str) + return + end + local rows + if meta:get_int("startscreen") == 1 then + rows = {} + meta:set_int("startscreen", 0) + else + rows = string.split(text, "|") + end + if #rows < 9 then + for i = #rows, 9 do + table.insert(rows, " ") + end + end + rows[row] = str + text = table.concat(rows, "|") + meta:set_string("text", text) + end +end + +tubelib.register_node("smartline:display", {}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + local timer = minetest.get_node_timer(pos) + if topic == "text" then -- add one line and scroll if necessary + local meta = minetest.get_meta(pos) + add_line(meta, payload) + if not timer:is_started() then + timer:start(1) + end + elseif topic == "row" then -- overwrite the given row + local meta = minetest.get_meta(pos) + write_row(meta, payload) + if not timer:is_started() then + timer:start(1) + end + elseif topic == "clear" then -- clear the screen + local meta = minetest.get_meta(pos) + meta:set_string("text", "") + if not timer:is_started() then + timer:start(1) + end + end + end, +}) + diff --git a/mods/techpack/smartline/icta/action.lua b/mods/techpack/smartline/icta/action.lua new file mode 100644 index 00000000..7bcfc9a1 --- /dev/null +++ b/mods/techpack/smartline/icta/action.lua @@ -0,0 +1,105 @@ +--[[ + + ICTA Controller + =============== + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + action.lua + +]]-- + +local sl = smartline + +--local mail_exists = minetest.get_modpath("mail") and mail ~= nil TODO + +-- tables with all data from action registrations +local kvRegisteredActn = {} + +-- list of keys for actions +local aActnTypes = {} + +-- list of titles for actions +local aActnTitles = {} + +-- +-- API function for action registrations +-- +function sl.icta_register_action(key, tData) + table.insert(aActnTypes, key) + table.insert(aActnTitles, tData.title) + tData.__idx__ = #aActnTypes + if kvRegisteredActn[key] ~= nil then + print("[SmartLine] Action registration error "..key) + return + end + kvRegisteredActn[key] = tData + for _,item in ipairs(tData.formspec) do + if item.type == "textlist" then + item.tChoices = string.split(item.choices, ",") + item.num_choices = #item.tChoices + end + end +end + +-- return formspec string +function sl.actn_formspec(row, kvSelect) + return sl.submenu_generate_formspec( + row, "actn", "Action type", aActnTypes, aActnTitles, kvRegisteredActn, kvSelect) +end + +-- evaluate the row action input +-- and return new data +function sl.actn_eval_input(kvSelect, fields) + kvSelect = sl.submenu_eval_input(kvRegisteredActn, aActnTypes, aActnTitles, kvSelect, fields) + return kvSelect +end + + +-- return the Lua code +function sl.code_action(kvSelect, environ) + if kvSelect and kvRegisteredActn[kvSelect.choice] then + if smartline.submenu_verify(kvRegisteredActn, kvSelect) then + return kvRegisteredActn[kvSelect.choice].code(kvSelect, environ) + end + end + return nil +end + +sl.icta_register_action("default", { + title = "", + formspec = {}, + code = function(data, environ) return false, false end, + button = function(data, environ) return "..." end, +}) + +sl.icta_register_action("print", { + title = "print to output window", + formspec = { + { + type = "ascii", + name = "text", + label = "Output the following text", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Use a '*' character as reference to any\ncondition state", + }, + }, + button = function(data, environ) + return 'print("'..data.text:sub(1,12)..'")' + end, + code = function(data, environ) + local s1 = 'local text = string.gsub("'..(smartline.escape(data.text))..'", "*", env.result[#])' + local s2 = 'output(env.pos, text)' + return s1.."\n\t"..s2 + end, +}) + diff --git a/mods/techpack/smartline/icta/balancer.lua b/mods/techpack/smartline/icta/balancer.lua new file mode 100644 index 00000000..34fe5a75 --- /dev/null +++ b/mods/techpack/smartline/icta/balancer.lua @@ -0,0 +1,125 @@ +--[[ + + ICTA Controller + =============== + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + balancer.lua + +]]-- + +local MAX_DIFF = 10 + +function smartline.balancer_condition(number1, number2, ratio1, ratio2, owner) + local cnt1 = tubelib.send_request(number1, "counter", nil) / ratio1 + local cnt2 = tubelib.send_request(number2, "counter", nil) / ratio2 + if cnt1 > cnt2 + MAX_DIFF then + tubelib.send_message(number1, owner, nil, "off", nil) + return number1 + elseif cnt2 > cnt1 + MAX_DIFF then + tubelib.send_message(number2, owner, nil, "off", nil) + return number2 + end +end + +smartline.icta_register_condition("ratio", { + title = "balancer ratio", + formspec = { + { + type = "numbers", + name = "number1", + label = "Pusher1 number", + default = "", + }, + { + type = "digits", + name = "ratio1", + label = "Ratio1 value", + default = "", + }, + { + type = "numbers", + name = "number2", + label = "Pusher2 number", + default = "", + }, + { + type = "digits", + name = "ratio2", + label = "Ratio1 value", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: Pusher1:Pusher2 shall have an\nitem counter ratio of Ratio1:Ratio2.", + }, + }, + -- Return two chunks of executable Lua code for the controller, according: + -- return , + code = function(data, environ) + local s = 'smartline.balancer_condition("%s", "%s", %s, %s, "%s")' + return s:format(data.number1, data.number2, data.ratio1, data.ratio2, environ.owner), '~= nil' + end, + button = function(data, environ) + return "ratio("..smartline.fmt_number(data.number1)..",".. + smartline.fmt_number(data.number2)..","..data.ratio1..":"..data.ratio2..')' + end, +}) + +smartline.icta_register_action("balancer", { + title = "balancer action", + formspec = { + { + type = "label", + name = "lbl", + label = "Hint: Action part of the balancer rule.", + }, + }, + button = function(data, environ) + return 'balancer()' + end, + code = function(data, environ) + local s = 'tubelib.send_message(env.result[#], "%s", nil, "on", nil)' + return string.format(s, data.number, environ.owner) + end, +}) + +smartline.icta_register_action("clearcounter", { + title = "balancer clear counter", + formspec = { + { + type = "numbers", + name = "number1", + label = "Pusher1 number", + default = "", + }, + { + type = "numbers", + name = "number2", + label = "Pusher2 number", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: Clear both Pusher counters\ne.g. after controller start.", + }, + }, + button = function(data, environ) + return 'clear cnt('..smartline.fmt_number(data.number1)..",".. + smartline.fmt_number(data.number2)..')' + end, + code = function(data, environ) + local s = [[tubelib.send_message("%s", "%s", nil, "clear_counter", nil) + tubelib.send_message("%s", "%s", nil, "clear_counter", nil)]] + return string.format(s, data.number1, environ.owner, data.number2, environ.owner) + end, +}) + diff --git a/mods/techpack/smartline/icta/battery.lua b/mods/techpack/smartline/icta/battery.lua new file mode 100644 index 00000000..cca063c8 --- /dev/null +++ b/mods/techpack/smartline/icta/battery.lua @@ -0,0 +1,165 @@ +--[[ + + ICTA Controller + =============== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + battery.lua + +]]-- + +local BATTERY_CAPACITY = 5000000 + +local function calc_percent(content) + local val = (BATTERY_CAPACITY - math.min(content or 0, BATTERY_CAPACITY)) + return 100 - math.floor((val * 100.0 / BATTERY_CAPACITY)) +end + +local function on_timer(pos, elapsed) + local meta = minetest.get_meta(pos) + local percent = calc_percent(meta:get_int("content")) + meta:set_string("infotext", "Battery ("..percent.."%)") + if percent == 0 then + local node = minetest.get_node(pos) + node.name = "smartline:battery_empty" + minetest.swap_node(pos, node) + return false + end + return true +end + +local function register_battery(ext, percent, nici) + minetest.register_node("smartline:battery"..ext, { + description = "Battery "..ext, + inventory_image = 'smartline_battery_inventory.png', + wield_image = 'smartline_battery_inventory.png', + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_battery_green.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_int("content", BATTERY_CAPACITY * percent) + local node = minetest.get_node(pos) + node.name = "smartline:battery" + minetest.swap_node(pos, node) + on_timer(pos, 1) + minetest.get_node_timer(pos):start(30) + end, + + on_timer = on_timer, + + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local percent = calc_percent(tonumber(oldmetadata.fields.content)) + local stack + if percent > 95 then + stack = ItemStack("smartline:battery") + elseif percent > 75 then + stack = ItemStack("smartline:battery75") + elseif percent > 50 then + stack = ItemStack("smartline:battery50") + elseif percent > 25 then + stack = ItemStack("smartline:battery25") + else + return + end + local inv = minetest.get_inventory({type="player", name=digger:get_player_name()}) + inv:add_item("main", stack) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=nici}, + drop = "", + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + }) +end + +register_battery("", 1.0, 0) +register_battery("75", 0.75, 1) +register_battery("50", 0.5, 1) +register_battery("25", 0.25, 1) + +minetest.register_node("smartline:battery_empty", { + description = "Battery", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_battery_red.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_int("content", 0) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1, not_in_creative_inventory=1}, + drop = "", + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +if minetest.global_exists("moreores") then + minetest.register_craft({ + output = "smartline:battery 2", + recipe = { + {"", "moreores:silver_ingot", ""}, + {"", "default:copper_ingot", ""}, + {"", "moreores:silver_ingot", ""}, + } + }) +else + minetest.register_craft({ + output = "smartline:battery 2", + recipe = { + {"", "default:tin_ingot", ""}, + {"", "default:copper_ingot", ""}, + {"", "default:tin_ingot", ""}, + } + }) +end + +tubelib.register_node("smartline:battery", + {"smartline:battery25", "smartline:battery50", "smartline:battery75"}, + { + on_node_load = function(pos) + minetest.get_node_timer(pos):start(30) + end, +}) diff --git a/mods/techpack/smartline/icta/commands.lua b/mods/techpack/smartline/icta/commands.lua new file mode 100644 index 00000000..16119ce6 --- /dev/null +++ b/mods/techpack/smartline/icta/commands.lua @@ -0,0 +1,568 @@ +--[[ + + ICTA Controller + =============== + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + command.lua: + + Register all controller commands + +]]-- + +local sl = smartline + +function sl.operand(s) + if s == "is" then + return "== " + else + return "~= " + end +end + +function sl.fmt_number(num) + local mtch = num:match('^(%d+).*') + if mtch and num ~= mtch then + return mtch.."..." + end + return num +end + +-- '#' is used as placeholder for rule numbers and has to be escaped +function smartline.escape(s) + s = tostring(s) + s = s:gsub('\\', '') -- to prevent code injection!!! + s = s:gsub('"', '\\"') -- to prevent code injection!!! + return s:gsub("#", '"..string.char(35).."') +end + + +smartline.icta_register_condition("initial", { + title = "initial", + formspec = { + { + type = "label", + name = "lbl", + label = "Condition is true only after\ncontroller start.", + }, + }, + -- Return two chunks of executable Lua code for the controller, according: + -- return , + code = function(data, environ) + return 'env.ticks', '== 1' + end, + button = function(data, environ) return "Initial after start" end, +}) + +smartline.icta_register_condition("true", { + title = "true", + formspec = { + { + type = "label", + name = "lbl", + label = "Condition is always true.", + }, + }, + code = function(data, environ) + return '"true"', '== "true"' + end, + button = function(data, environ) return "true" end, +}) + +smartline.icta_register_condition("condition", { + title = "condition", + formspec = { + { + type = "textlist", + name = "condition", + label = "condition row number", + choices = "1,2,3,4,5,6,7,8", + default = "", + }, + { + type = "textlist", + name = "operand", + label = "condition", + choices = "was true, was not true", + default = "was true", + }, + { + type = "label", + name = "lbl", + label = "Used to execute two or several\nactions based on one condition.", + }, + }, + code = function(data, environ) + local idx = data.condition:byte(-1) - 0x30 + local expected_result = "== false" + if data.operand == "was true" then + expected_result = "== true" + end + return "env.condition["..idx.."]", expected_result + end, + button = function(data, environ) return "cond("..data.condition:sub(-1,-1)..","..data.operand..")" end, +}) + +smartline.icta_register_condition("input", { + title = "inputs", + formspec = { + { + type = "digits", + name = "number", + label = "node number", + default = "", + }, + { + type = "textlist", + name = "operand", + choices = "is,is not", + default = "is", + }, + { + type = "textlist", + name = "value", + choices = "on,off,invalid", + default = "on", + }, + { + type = "label", + name = "lbl", + label = "An input is only available,\nif a nodes sends on/off\ncommands to the controller.", + }, + }, + button = function(data, environ) -- default button label + return 'inp('..sl.fmt_number(data.number)..','..data.operand.." "..data.value..')' + end, + code = function(data, environ) + return 'env.input["'..data.number..'"]', + sl.operand(data.operand)..'"'..data.value..'"' + end, +}) + +smartline.icta_register_condition("state", { + title = "node state request", + formspec = { + { + type = "digits", + name = "number", + label = "node number", + default = "", + }, + { + type = "textlist", + name = "operand", + label = "", + choices = "is,is not", + default = "is", + }, + { + type = "textlist", + name = "value", + label = "", + choices = "stopped,running,standby,blocked,defect,fault,invalid", + default = "stopped", + }, + { + type = "label", + name = "lbl", + label = "Read the state from a node.\nWorks for Pusher, Harvester, Quarry,\n".. + "and other similar nodes.", + }, + }, + button = function(data, environ) -- default button label + return 'sts('..sl.fmt_number(data.number)..","..data.operand..' '..data.value..')' + end, + code = function(data, environ) + return 'tubelib.send_request("'..data.number..'", "state", "")', + sl.operand(data.operand)..'"'..data.value..'"' + end, +}) + +smartline.icta_register_condition("fuel", { + title = "fuel state request", + formspec = { + { + type = "digits", + name = "number", + label = "node number", + default = "", + }, + { + type = "textlist", + name = "operand", + label = "", + choices = "is,is not", + default = "is", + }, + { + type = "textlist", + name = "value", + label = "", + choices = "full,loaded,empty,invalid", + default = "full" + }, + { + type = "label", + name = "lbl", + label = "Read the fuel state from a node.\nWorks for Harvester, Quarry,\n".. + "and other fuel consuming nodes.", + }, + }, + button = function(data, environ) + return 'fuel('..sl.fmt_number(data.number)..","..data.operand..' '..data.value..')' + end, + code = function(data, environ) + return 'tubelib.send_request("'..data.number..'", "fuel", "")', + sl.operand(data.operand)..'"'..data.value..'"' + end, +}) + +smartline.icta_register_condition("chest", { + title = "chest state request", + formspec = { + { + type = "digits", + name = "number", + label = "chest number", + default = "", + }, + { + type = "textlist", + name = "operand", + label = "", + choices = "is,is not", + default = "is", + }, + { + type = "textlist", + name = "value", + label = "", + choices = "empty,loaded,invalid", + default = "empty", + }, + { + type = "label", + name = "lbl", + label = "Read the state from a Tubelib chest\n".. + "and other similar nodes.", + }, + }, + button = function(data, environ) -- default button label + return 'sts('..sl.fmt_number(data.number)..","..data.operand..' '..data.value..')' + end, + code = function(data, environ) + return 'tubelib.send_request("'..data.number..'", "state", "")', + sl.operand(data.operand)..'"'..data.value..'"' + end, +}) + +smartline.icta_register_condition("signaltower", { + title = "Signal Tower state request", + formspec = { + { + type = "digits", + name = "number", + label = "Signal Tower number", + default = "", + }, + { + type = "textlist", + name = "operand", + choices = "is,is not", + default = "is", + }, + { + type = "textlist", + name = "value", + choices = "off,green,amber,red,invalid", + default = "off", + }, + { + type = "label", + name = "lbl", + label = "Read the color state\nfrom a Signal Tower.", + }, + }, + button = function(data, environ) -- default button label + return 'tower('..sl.fmt_number(data.number)..","..data.operand..' '..data.value..')' + end, + code = function(data, environ) + return 'tubelib.send_request("'..data.number..'", "state", "")', + sl.operand(data.operand)..'"'..data.value..'"' + end, +}) + +smartline.icta_register_action("signaltower", { + title = "Signal Tower command", + formspec = { + { + type = "numbers", + name = "number", + label = "Signal Tower number", + default = "", + }, + { + type = "textlist", + name = "value", + label = "lamp color", + choices = "off,green,amber,red", + default = "red", + }, + { + type = "label", + name = "lbl", + label = "Turn on/off a Signal Tower lamp.", + }, + }, + button = function(data, environ) + return 'tower('..sl.fmt_number(data.number)..","..data.value..')' + end, + code = function(data, environ) + local s = 'tubelib.send_message("%s", "%s", nil, "%s", nil)' + return string.format(s, data.number, environ.owner, data.value) + end, +}) + +smartline.icta_register_action("switch", { + title = "turn node on/off", + formspec = { + { + type = "numbers", + name = "number", + label = "node number(s)", + default = "", + }, + { + type = "textlist", + name = "value", + label = "state", + choices = "on,off", + default = "on", + }, + { + type = "label", + name = "lbl", + label = "Used for pushers, lamps, machines, gates,...", + }, + }, + button = function(data, environ) + return 'turn('..sl.fmt_number(data.number)..","..data.value..')' + end, + code = function(data, environ) + local s = 'tubelib.send_message("%s", "%s", nil, "%s", "%s")' + return string.format(s, data.number, environ.owner, data.value, environ.number) + end, +}) + +smartline.icta_register_action("display", { + title = "Display: overwrite one line", + formspec = { + { + type = "numbers", + name = "number", + label = "Display number", + default = "", + }, + { + type = "textlist", + name = "row", + label = "Display line", + choices = "1,2,3,4,5,6,7,8,9", + default = "1", + }, + { + type = "ascii", + name = "text", + label = "text", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Use a '*' character as reference\nto any condition result", + }, + }, + code = function(data, environ) + local s1 = string.format('local text = string.gsub("%s", "*", tostring(env.result[#]))', smartline.escape(data.text)) + local s2 = string.format('local payload = {row = %s, str = text}', data.row) + local s3 = string.format('tubelib.send_message("%s", "%s", nil, "row", payload)', data.number, environ.owner) + return s1.."\n\t"..s2.."\n\t"..s3 + end, + button = function(data, environ) + return "lcd("..sl.fmt_number(data.number)..","..data.row..',"'..data.text..'")' + end, +}) + +smartline.icta_register_action("cleardisplay", { + title = "Display: Clear screen", + formspec = { + { + type = "numbers", + name = "number", + label = "Display number", + default = "", + }, + }, + code = function(data, environ) + return 'tubelib.send_message("'..data.number..'", "'..environ.owner..'", nil, "clear", nil)' + end, + button = function(data, environ) + return "clear lcd("..sl.fmt_number(data.number)..")" + end, +}) + +smartline.icta_register_action("chat", { + title = "chat send", + formspec = { + { + type = "ascii", + name = "text", + label = "message", + default = "", + }, + { + type = "label", + name = "lbl", + label = "The chat message is send to the\nController owner, only.", + }, + }, + code = function(data, environ) + return 'minetest.chat_send_player("'..environ.owner..'", "[SmartLine Controller] '..smartline.escape(data.text)..'")' + end, + button = function(data, environ) + return 'chat("'..data.text:sub(1,12)..'")' + end, +}) + +function smartline.icta_door_toggle(pos, owner, state) + pos = minetest.string_to_pos("("..pos..")") + if pos then + local door = doors.get(pos) + if door then + local player = { + get_player_name = function() return owner end, + is_player = function() return true end, + } + if state == "open" then + door:open(player) + elseif state == "close" then + door:close(player) + end + end + end +end + +smartline.icta_register_action("door", { + title = "doors open/close", + formspec = { + { + type = "digits", + name = "pos", + label = "door position like: 123,7,-1200", + default = "", + }, + { + type = "textlist", + name = "door_state", + label = "door state", + choices = "open,close", + default = "open", + }, + { + type = "label", + name = "lbl", + label = "For standard doors like the Steel Doors.\n".. + "Use the Tubelib Programmer to\neasily determine a door position.", + }, + }, + code = function(data, environ) + return 'smartline.icta_door_toggle("'..data.pos..'", "'..environ.owner..'", "'..data.door_state..'")' + end, + button = function(data, environ) + return 'door("'..data.pos..'",'..data.door_state..")" + end, +}) + +function smartline.icta_player_detect(number, name) + local state = tubelib.send_request(number, "name", nil) + if (name == "*" and state ~= "") or string.find(name, state) then + return state + end + return nil +end + +smartline.icta_register_condition("playerdetector", { + title = "Player Detector name request", + formspec = { + { + type = "digits", + name = "number", + label = "Player Detector number", + default = "", + }, + { + type = "ascii", + name = "name", + label = "player name(s) or * for all", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Read and check the name\nfrom a Player Detector.\n Use a '*' character for all player names.", + }, + }, + + code = function(data, environ) + return 'smartline.icta_player_detect("'..data.number..'", "'..smartline.escape(data.name)..'")', "~= nil" + end, + button = function(data, environ) + return "detector("..sl.fmt_number(data.number)..","..data.name:sub(1,8)..")" + end, +}) + +smartline.icta_register_action("set_filter", { + title = "turn Distributor filter on/off", + formspec = { + { + type = "numbers", + name = "number", + label = "distri number", + default = "", + }, + { + type = "textlist", + name = "color", + label = "filter port", + choices = "red,green,blue,yellow", + default = "red", + }, + { + type = "textlist", + name = "value", + label = "state", + choices = "on,off", + default = "on", + }, + { + type = "label", + name = "lbl", + label = "turn Distributor filter port on/off\n", + }, + }, + button = function(data, environ) + return 'turn('..sl.fmt_number(data.number)..","..data.color..","..data.value..')' + end, + code = function(data, environ) + local payload = '{slot = "'..data.color..'", val = "'..data.value..'"}' + local s = 'tubelib.send_message("%s", "%s", nil, "filter", %s)' + return string.format(s, data.number, environ.owner, payload) + end, +}) + diff --git a/mods/techpack/smartline/icta/condition.lua b/mods/techpack/smartline/icta/condition.lua new file mode 100644 index 00000000..4a2c92d6 --- /dev/null +++ b/mods/techpack/smartline/icta/condition.lua @@ -0,0 +1,76 @@ +--[[ + + ICTA Controller + =============== + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + condition.lua + +]]-- + +local sl = smartline + +-- tables with all data from condition registrations +local kvRegisteredCond = {} + +-- list of keys for conditions +local aCondTypes = {} + +-- list of titles for conditions +local aCondTitles = {} + +-- +-- API functions for condition registrations +-- +function sl.icta_register_condition(key, tData) + table.insert(aCondTypes, key) + table.insert(aCondTitles, tData.title) + if kvRegisteredCond[key] ~= nil then + print("[SmartLine] Condition registration error "..key) + return + end + kvRegisteredCond[key] = tData + for _,item in ipairs(tData.formspec) do + if item.type == "textlist" then + item.tChoices = string.split(item.choices, ",") + item.num_choices = #item.tChoices + end + end +end + +-- return formspec string +function sl.cond_formspec(row, kvSelect) + return sl.submenu_generate_formspec( + row, "cond", "Condition type", aCondTypes, aCondTitles, kvRegisteredCond, kvSelect) +end + +-- evaluate the row condition input +-- and return new data +function sl.cond_eval_input(kvSelect, fields) + kvSelect = sl.submenu_eval_input(kvRegisteredCond, aCondTypes, aCondTitles, kvSelect, fields) + return kvSelect +end + +-- return the Lua code +function sl.code_condition(kvSelect, environ) + if kvSelect and kvRegisteredCond[kvSelect.choice] then + if smartline.submenu_verify(kvRegisteredCond, kvSelect) then + return kvRegisteredCond[kvSelect.choice].code(kvSelect, environ) + end + end + return nil, nil +end + +sl.icta_register_condition("default", { + title = "", + formspec = {}, + code = function(data, environ) return false, false end, + button = function(data, environ) return "..." end, +}) + diff --git a/mods/techpack/smartline/icta/controller.lua b/mods/techpack/smartline/icta/controller.lua new file mode 100644 index 00000000..661553f4 --- /dev/null +++ b/mods/techpack/smartline/icta/controller.lua @@ -0,0 +1,515 @@ +--[[ + + ICTA Controller + =============== + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + controller.lua + +]]-- + +-- +-- Helper functions +-- +local function gen_table(size, val) + local tbl = {} + for idx = 1,size do + if type(val) == "table" then + tbl[idx] = table.copy(val) + else + tbl[idx] = val + end + end + return tbl +end + +local function integer(s, min, max) + if s and s ~= "" and s:find("^%d+$") then + local num = tonumber(s) + if num < min then num = min end + if num > max then num = max end + return num + end + return min +end + +local sOUTPUT = "Edit commands (see help)" +local Cache = {} +local FS_DATA = gen_table(smartline.NUM_RULES, {}) + + +local function output(pos, text, flush_buffer) + local meta = minetest.get_meta(pos) + if not flush_buffer then + text = meta:get_string("output") .. "\n" .. (text or "") + text = text:sub(-500,-1) + end + meta:set_string("output", text) + meta:set_string("formspec", smartline.formspecOutput(meta)) +end + +----------------- template ------------------------------- +-- -- Rule 1 +-- if env.blocked[1] == false and env.ticks % == 0 then +-- env.result[1] = +-- env.blocked[1] = env.result[1] +-- if env.blocked[1] then +-- env.timer[1] = env.ticks + +-- end +-- env.conditions[1] = env.blocked[1] +-- else +-- env.conditions[1] = false +-- end +-- if env.blocked[1] and env.timer[1] == env.ticks then +-- +-- env.blocked[1] = false +-- end + +-- -- Callback variant +-- if env.blocked[1] == false and env.ticks % == 0 then +-- env.result[1], env.blocked[1] = +-- if env.blocked[1] then +-- env.timer[1] = env.ticks + +-- end +-- env.conditions[1] = env.blocked[1] +-- else +-- env.conditions[1] = false +-- end +-- if env.blocked[1] and env.timer[1] == env.ticks then +-- +-- env.blocked[1] = false +-- end + + +-- cyclic execution +local TemplCyc = [[ +-- Rule # +if env.blocked[#] == false and env.ticks %% %s == 0 then + env.result[#] = %s + env.blocked[#] = env.result[#] %s + if env.blocked[#] then + env.timer[#] = env.ticks + %s + end + env.condition[#] = env.blocked[#] +else + env.condition[#] = false +end +if env.blocked[#] and env.timer[#] == env.ticks then + %s + env.blocked[#] = false +end +]] + +-- event based execution +local TemplEvt = [[ +-- Rule # +if env.blocked[#] == false and env.event then + env.result[#] = %s + env.blocked[#] = env.result[#] %s + if env.blocked[#] then + env.timer[#] = env.ticks + %s + end + env.condition[#] = env.blocked[#] +else + env.condition[#] = false +end +if env.blocked[#] and env.timer[#] == env.ticks then + %s + env.blocked[#] = false +end +]] + +-- event based execution of callback function +local TemplEvtClbk = [[ +-- Rule # +if env.blocked[#] == false and env.event then + env.result[#], env.blocked[#] = %s(env, %s) + if env.blocked[#] then + env.timer[#] = env.ticks + %s + end + env.condition[#] = env.blocked[#] +else + env.condition[#] = false +end +if env.blocked[#] and env.timer[#] == env.ticks then + %s + env.blocked[#] = false +end +]] + +-- generate the Lua code from the NUM_RULES rules +local function generate(pos, meta, environ) + local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA + -- chunks are compiled as vararg functions. Parameters are available via: local a, b, c = ... + local tbl = {"local env, output = ...\n"} + for idx = 1,smartline.NUM_RULES do + local cycle = integer(fs_data[idx].cycle, 0, 1000) + local cond, result = smartline.code_condition(fs_data[idx].cond, environ) + local after = integer(fs_data[idx].after, 0, 1000) + local actn = smartline.code_action(fs_data[idx].actn, environ) + -- valid rule? + if cycle and cond and after and actn then + -- add rule number + local s + if cycle == 0 then -- event? + if result then + s = string.format(TemplEvt, cond, result, after, actn) + else -- callback function + local data = dump(fs_data[idx].cond) + s = string.format(TemplEvtClbk, cond, data, after, actn) + end + else -- cyclic + s = string.format(TemplCyc, cycle, cond, result, after, actn) + end + -- add to list of rules + tbl[#tbl+1] = s:gsub("#", idx) + elseif cond ~= nil and actn == nil then + output(pos, "Error in action in rule "..idx) + elseif cond == nil and actn ~= nil then + output(pos, "Error in condition in rule "..idx) + end + end + return table.concat(tbl) +end + +local function runtime_environ(pos) + return { + ticks = 0, + pos = pos, + timer = gen_table(8, 0), + blocked = gen_table(8, false), + result = gen_table(8, false), + condition = gen_table(8, false), + input = {}, -- node number is key + } +end + +local function compile(pos, meta, number) + local gen_environ = { + meta = meta, + pos = pos, + number = number, + owner = meta:get_string("owner"), + } + local text = generate(pos, meta, gen_environ) + if text then + local code, err = loadstring(text) + if code then + Cache[number] = { + code = code, + env = runtime_environ(pos), + } + return true + else + output(pos, err) + return false + end + end + return false +end + +local function execute(pos, number, event) + local code = Cache[number].code + local env = Cache[number].env + if event then + env.event = true + else + env.event = false + env.ticks = env.ticks + 1 + end + local res, err = pcall(code, env, output) + if not res then + output(pos, err) + return false + end + return true +end + + +local function battery(pos) + local battery_pos = minetest.find_node_near(pos, 1, {"smartline:battery", "sl_controller:battery"}) + if battery_pos then + local meta = minetest.get_meta(pos) + meta:set_string("battery", minetest.pos_to_string(battery_pos)) + return true + end + return false +end + +local function start_controller(pos, meta) + local number = meta:get_string("number") + if not battery(pos) then + meta:set_string("formspec", smartline.formspecError(meta)) + return false + end + + meta:set_string("output", "") + meta:set_int("cpu", 0) + + if compile(pos, meta, number) then + meta:set_int("state", tubelib.RUNNING) + minetest.get_node_timer(pos):start(1) + local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA + meta:set_string("formspec", smartline.formspecRules(meta, fs_data, sOUTPUT)) + meta:set_string("infotext", "Controller "..number..": running") + return true + end + return false +end + +local function stop_controller(pos, meta) + local number = meta:get_string("number") + meta:set_int("state", tubelib.STOPPED) + minetest.get_node_timer(pos):stop() + meta:set_string("infotext", "Controller "..number..": stopped") + local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA + meta:set_string("formspec", smartline.formspecRules(meta, fs_data, sOUTPUT)) +end + +local function no_battery(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("state", tubelib.STOPPED) + minetest.get_node_timer(pos):stop() + meta:set_string("infotext", "Controller "..number..": No battery") + meta:set_string("formspec", smartline.formspecError(meta)) +end + +local function update_battery(meta, cpu) + local pos = minetest.string_to_pos(meta:get_string("battery")) + if pos then + meta = minetest.get_meta(pos) + local content = meta:get_int("content") - cpu + if content <= 0 then + meta:set_int("content", 0) + return false + end + meta:set_int("content", content) + return true + end +end + +local function on_timer(pos, elapsed) + local meta = minetest.get_meta(pos) + local t = minetest.get_us_time() + local number = meta:get_string("number") + if Cache[number] or compile(pos, meta, number) then + local res = execute(pos, number, elapsed == -1) + if res then + t = minetest.get_us_time() - t + if not update_battery(meta, t) then + no_battery(pos) + return false + end + end + --print("on_timer", t) + return res + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if not player or not player:is_player() then + return + end + if player:get_player_name() ~= owner then + return + end + + --print("fields", dump(fields)) + if fields.quit then -- cancel button + return + end + if fields.notes then -- notes tab? + meta:set_string("notes", fields.notes) + end + if fields.go then + local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA + local output = smartline.edit_command(fs_data, fields.cmnd) + stop_controller(pos, meta) + meta:set_string("formspec", smartline.formspecRules(meta, fs_data, output)) + meta:set_string("fs_data", minetest.serialize(fs_data)) + end + if fields._type_ == "main" then + smartline.store_main_form_data(meta, fields) + local key = smartline.main_form_button_pressed(fields) + if key then + -- store data before going into sub-menu + meta:set_string("fs_old", meta:get_string("fs_data")) + meta:set_string("formspec", smartline.formspecSubMenu(meta, key)) + end + elseif fields._col_ == "cond" then + smartline.cond_formspec_update(meta, fields) + elseif fields._col_ == "actn" then + smartline.actn_formspec_update(meta, fields) + end + if fields._exit_ == "ok" then -- exit from sub-menu? + if fields._button_ then + smartline.formspec_button_update(meta, fields) + end + -- simulate tab selection + fields.tab = "1" + elseif fields._cancel_ == "cancel" then -- abort from sub-menu? + -- restore old data + meta:set_string("fs_data", meta:get_string("fs_old")) + -- simulate tab selection + fields.tab = "1" + elseif fields.save == "Save" then -- abort from sub-menu? + -- store as old data + meta:set_string("fs_old", meta:get_string("fs_data")) + -- simulate tab selection + fields.tab = "1" + elseif fields.sb_help then + local evt = minetest.explode_scrollbar_event(fields.sb_help) + meta:set_string("formspec", smartline.formspecHelp(evt.value)) + end + if fields.update then + meta:set_string("formspec", smartline.formspecOutput(meta)) + elseif fields.clear then + meta:set_string("output", "") + meta:set_string("formspec", smartline.formspecOutput(meta)) + elseif fields.list then + local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA + local s = smartline.listing(fs_data) + output(pos, s, true) + elseif fields.tab == "1" then + local fs_data = minetest.deserialize(meta:get_string("fs_data")) or FS_DATA + meta:set_string("formspec", smartline.formspecRules(meta, fs_data, sOUTPUT)) + elseif fields.tab == "2" then + meta:set_string("formspec", smartline.formspecOutput(meta)) + elseif fields.tab == "3" then + meta:set_string("formspec", smartline.formspecNotes(meta)) + elseif fields.tab == "4" then + meta:set_string("formspec", smartline.formspecHelp(1)) + elseif fields.start == "Start" then + local environ = { + meta = meta, + pos = pos, + number = meta:get_string("number"), + owner = meta:get_string("owner"), + } + --print("CODE:", generate(pos, meta, environ)) + start_controller(pos, meta) + minetest.log("action", player:get_player_name() .. + " starts the smartline_controller2 at ".. minetest.pos_to_string(pos)) + elseif fields.stop == "Stop" then + stop_controller(pos, meta) + end +end + +minetest.register_node("smartline:controller2", { + description = "SmartLine Controller", + inventory_image = "smartline_controller_inventory.png", + wield_image = "smartline_controller_inventory.png", + stack_max = 1, + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_controller.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "smartline:controller2") + local fs_data = FS_DATA + meta:set_string("fs_data", minetest.serialize(fs_data)) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("number", number) + meta:set_int("state", tubelib.STOPPED) + meta:set_string("formspec", smartline.formspecRules(meta, fs_data, sOUTPUT)) + --meta:set_string("formspec", smartline.cond_formspec(1, 1, nil)) + meta:set_string("infotext", "SmartLine Controller "..number..": stopped") + end, + + on_receive_fields = on_receive_fields, + + on_dig = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end, + + on_timer = on_timer, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=1, cracky=1, crumbly=1}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "smartline:controller2", + recipe = { + {"", "default:mese_crystal", ""}, + {"dye:blue", "default:copper_ingot", "tubelib:wlanchip"}, + {"", "default:mese_crystal", ""}, + }, +}) + +-- write inputs from remote nodes +local function set_input(pos, own_number, rmt_number, val) + if rmt_number then + if Cache[own_number] and Cache[own_number].env.input then + local t = minetest.get_us_time() + Cache[own_number].env.input[rmt_number] = val + Cache[own_number].env.last_event = t + -- only two events per second + if not Cache[own_number].last_event or Cache[own_number].last_event < t then + minetest.after(0.01, on_timer, pos, -1) + Cache[own_number].last_event = t + 500000 -- add 500 ms + end + end + end +end + +tubelib.register_node("smartline:controller2", {}, { + on_recv_message = function(pos, topic, payload) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + local state = meta:get_int("state") + + if state == tubelib.RUNNING and topic == "on" then + set_input(pos, number, payload, topic) + elseif state == tubelib.RUNNING and topic == "off" then + set_input(pos, number, payload, topic) + elseif topic == "state" then + local state = meta:get_int("state") + return tubelib.statestring(state) + else + return "unsupported" + end + end, + on_node_load = function(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("state") == tubelib.RUNNING then + minetest.get_node_timer(pos):start(1) + end + end, +}) + diff --git a/mods/techpack/smartline/icta/edit.lua b/mods/techpack/smartline/icta/edit.lua new file mode 100644 index 00000000..3e04ccbf --- /dev/null +++ b/mods/techpack/smartline/icta/edit.lua @@ -0,0 +1,40 @@ +--[[ + + ICTA Controller + =============== + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + edit.lua + +]]-- + +function smartline.edit_command(fs_data, text) + local cmnd, pos1, pos2 = text:match('^(%S)%s(%d+)%s(%d+)$') + if pos2 == nil then + cmnd, pos1 = text:match('^(%S)%s(%d+)$') + end + if cmnd and pos1 and pos2 then + pos1 = math.max(1, math.min(pos1, smartline.NUM_RULES)) + pos2 = math.max(1, math.min(pos2, smartline.NUM_RULES)) + + if cmnd == "x" then + local temp = fs_data[pos1] + fs_data[pos1] = fs_data[pos2] + fs_data[pos2] = temp + return "rows "..pos1.." and "..pos2.." exchanged" + end + if cmnd == "c" then + fs_data[pos2] = table.copy(fs_data[pos1]) + return "row "..pos1.." copied to "..pos2 + end + elseif cmnd == "d" and pos1 then + pos1 = math.max(1, math.min(pos1, smartline.NUM_RULES)) + fs_data[pos1] = {} + return "row "..pos1.." deleted" + end + return "Invalid command '"..text.."'" +end diff --git a/mods/techpack/smartline/icta/formspec.lua b/mods/techpack/smartline/icta/formspec.lua new file mode 100644 index 00000000..19f019c3 --- /dev/null +++ b/mods/techpack/smartline/icta/formspec.lua @@ -0,0 +1,241 @@ +--[[ + + SmartLine + ========= + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + formspec.lua: + + controller formspecs +]]-- + +smartline.NUM_RULES = 8 + +local SIZE = "size[13,8]" + +local sHELP = [[SmartLine Controller Help + +Control other nodes by means of rules like: + IF THEN + +These rules allow to execute actions based on conditions. +Examples for conditions are: + - the Player Detector detects a player + - a button is pressed + - a node state is fault, blocked, standby,... + +Actions are: + - switch on/off tubelib nodes, like lamps, machines + - send chat messages to the owner + - output a text message to the display + +The controller executes all rules cyclically. +The cycle time for each rule is configurable +(1..1000 sec). +0 means, the rule will only be called, if +the controller received a command from +another node, such as buttons. + +Actions can be delayed. Therefore, the +'after' value can be set (0..1000 sec). + +Edit command examples: + - 'x 1 8' exchange rows 1 with row 8 + - 'c 1 2' copy row 1 to 2 + - 'd 3' delete row 3 + +The 'outp' tab is for debugging outputs via 'print' +The 'notes' tab for your notes. + +The controller needs battery power to work. +The battery pack has to be placed near the +controller (1 node distance). +The needed battery power is directly dependent +on the CPU time the controller consumes. + +For more information, see: goo.gl/fF5ap6 +]] + +-- to simplify the search for a pressed main form button (condition/action) +local lButtonKeys = {} + +for idx = 1,smartline.NUM_RULES do + lButtonKeys[#lButtonKeys+1] = "cond"..idx + lButtonKeys[#lButtonKeys+1] = "actn"..idx +end + +local function buttons(s) + return "button_exit[7.4,7.5;1.8,1;cancel;Cancel]".. + "button[9.3,7.5;1.8,1;save;Save]".. + "button[11.2,7.5;1.8,1;"..s.."]" +end + +function smartline.formspecError(meta) + local running = meta:get_int("state") == tubelib.RUNNING + local cmnd = running and "stop;Stop" or "start;Start" + local init = meta:get_string("init") + init = minetest.formspec_escape(init) + return "size[4,3]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;No Battery?]".. + "button[1,2;1.8,1;start;Start]" +end + +local function button(data) + if data then + return data.button + else + return "..." + end +end + +function smartline.listing(fs_data) + local tbl = {} + + for idx = 1,smartline.NUM_RULES do + tbl[#tbl+1] = idx.." ("..fs_data[idx].cycle.."s): IF "..button(fs_data[idx].cond) + tbl[#tbl+1] = " THEN "..button(fs_data[idx].actn).." after "..fs_data[idx].after.."s\n" + end + return table.concat(tbl) +end + +local function formspec_rules(fs_data) + local tbl = {"field[0,0;0,0;_type_;;main]".. + "label[0.4,0;Cycle/s:]label[2.5,0;IF cond:]label[7,0;THEN action:]label[11.5,0;after/s:]"} + + for idx = 1,smartline.NUM_RULES do + local ypos = idx * 0.75 - 0.4 + tbl[#tbl+1] = "label[0,"..(0.2+ypos)..";"..idx.."]" + tbl[#tbl+1] = "field[0.7,"..(0.3+ypos)..";1.4,1;cycle"..idx..";;"..(fs_data[idx].cycle or "").."]" + tbl[#tbl+1] = "button[1.9,"..ypos..";4.9,1;cond"..idx..";"..minetest.formspec_escape(button(fs_data[idx].cond)).."]" + tbl[#tbl+1] = "button[6.8,"..ypos..";4.9,1;actn"..idx..";"..minetest.formspec_escape(button(fs_data[idx].actn)).."]" + tbl[#tbl+1] = "field[12,"..(0.3+ypos)..";1.4,1;after"..idx..";;"..(fs_data[idx].after or "").."]" + end + return table.concat(tbl) +end + +function smartline.store_main_form_data(meta, fields) + local fs_data = minetest.deserialize(meta:get_string("fs_data")) + for idx = 1,smartline.NUM_RULES do + fs_data[idx].cycle = fields["cycle"..idx] or "" + fs_data[idx].after = fields["after"..idx] or "0" + end + meta:set_string("fs_data", minetest.serialize(fs_data)) +end + +function smartline.main_form_button_pressed(fields) + for _,key in ipairs(lButtonKeys) do + if fields[key] then + return key + end + end + return nil +end + +function smartline.formspecSubMenu(meta, key) + local fs_data = minetest.deserialize(meta:get_string("fs_data")) + if key:sub(1,4) == "cond" then + local row = tonumber(key:sub(5,5)) + return smartline.cond_formspec(row, fs_data[row].cond) + else + local row = tonumber(key:sub(5,5)) + return smartline.actn_formspec(row, fs_data[row].actn) + end +end + +function smartline.formspec_button_update(meta, fields) + local fs_data = minetest.deserialize(meta:get_string("fs_data")) + local row = tonumber(fields._row_ or 1) + if fields._col_ == "cond" then + fs_data[row].cond = smartline.cond_eval_input(fs_data[row].cond, fields) + elseif fields._col_ == "actn" then + fs_data[row].actn = smartline.actn_eval_input(fs_data[row].actn, fields) + end + meta:set_string("fs_data", minetest.serialize(fs_data)) +end + +function smartline.cond_formspec_update(meta, fields) + local fs_data = minetest.deserialize(meta:get_string("fs_data")) + local row = tonumber(fields._row_ or 1) + fs_data[row].cond = smartline.cond_eval_input(fs_data[row].cond, fields) + meta:set_string("formspec", smartline.cond_formspec(row, fs_data[row].cond)) + meta:set_string("fs_data", minetest.serialize(fs_data)) +end + +function smartline.actn_formspec_update(meta, fields) + local fs_data = minetest.deserialize(meta:get_string("fs_data")) + local row = tonumber(fields._row_ or 1) + fs_data[row].actn = smartline.actn_eval_input(fs_data[row].actn, fields) + meta:set_string("formspec", smartline.actn_formspec(row, fs_data[row].actn)) + meta:set_string("fs_data", minetest.serialize(fs_data)) +end + + +function smartline.formspecRules(meta, fs_data, output) + local running = meta:get_int("state") == tubelib.RUNNING + local cmnd = running and "stop;Stop" or "start;Start" + local init = meta:get_string("init") + init = minetest.formspec_escape(init) + return SIZE.. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;rules,outp,notes,help;1;;true]".. + formspec_rules(fs_data).. + "label[0.2,7.0;"..output.."]".. + "field[0.3,7.8;4,1;cmnd;;]".. + "button[4.0,7.5;1.5,1;go;GO]".. + buttons(cmnd) +end + +function smartline.formspecOutput(meta) + local running = meta:get_int("state") == tubelib.RUNNING + local cmnd = running and "stop;Stop" or "start;Start" + local output = meta:get_string("output") + output = minetest.formspec_escape(output) + return SIZE.. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;rules,outp,notes,help;2;;true]".. + "textarea[0.3,0.2;13,8.3;output;Output:;"..output.."]".. + "button[5.5,7.5;1.8,1;list;List]".. + "button[7.4,7.5;1.8,1;clear;Clear]".. + "button[9.3,7.5;1.8,1;update;Update]".. + "button[11.2,7.5;1.8,1;"..cmnd.."]" +end + +function smartline.formspecNotes(meta) + local running = meta:get_int("state") == tubelib.RUNNING + local cmnd = running and "stop;Stop" or "start;Start" + local notes = meta:get_string("notes") or "" + if notes == "" then notes = "" end + notes = minetest.formspec_escape(notes) + return SIZE.. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;rules,outp,notes,help;3;;true]".. + "textarea[0.3,0.2;13,8.3;notes;Notepad:;"..notes.."]".. + buttons(cmnd) +end + +function smartline.formspecHelp(offs) + return SIZE.. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "tabheader[0,0;tab;rules,outp,notes,help;4;;true]".. + "field[0,0;0,0;_type_;;help]".. + "label[0,"..(-offs/50)..";"..sHELP.."]".. + --"label[0.2,0;test]".. + "scrollbar[12,1;0.5,7;vertical;sb_help;"..offs.."]" +end diff --git a/mods/techpack/smartline/icta/stopwatch.lua b/mods/techpack/smartline/icta/stopwatch.lua new file mode 100644 index 00000000..67d18fdf --- /dev/null +++ b/mods/techpack/smartline/icta/stopwatch.lua @@ -0,0 +1,130 @@ +--[[ + + ICTA Controller + =============== + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + stopwatch.lua + Start/stop the watch with an on/off commands. + The player name clicking the stop is stored in addition. + +]]-- + +local sl = smartline + +local function retrieve_clicker_name(number) + local pos = tubelib.get_node_info(number).pos + if pos then + local meta = minetest.get_meta(pos) + return meta:get_string("clicker_name") or "" + end + return "" +end + +-- env = { +-- event = , +-- last_event = -- last event time +-- ticks = , +-- timer = gen_table(8, 0), +-- blocked = gen_table(8, false), +-- result = gen_table(8, false), +-- condition = gen_table(8, false), +-- input = , -- node number is key +-- number = , +-- owner = , +-- }, +-- +-- return cond_result, trigger_action +function smartline.stopwatch(env, data) + if env.input[data.number] == "on" then + env.time = env.last_event + if not env.highscore then + env.highscore = 99999 + end + return nil, false + else + local time = (env.last_event - env.time) / 1000000 + local name = retrieve_clicker_name(data.number) + env.highscore = math.min(time, env.highscore) + local s1 = string.format("%2.1f s", time) + local s2 = string.format("%2.1f s", env.highscore) + env.stopwatch_result = {s1, s2, name} + return nil, true + end +end + +smartline.icta_register_condition("stopwatch", { + title = "stopwatch", + formspec = { + { + type = "numbers", + name = "number", + label = "Switch number", + default = "", + }, + { + type = "label", + name = "lbl", + label = "Hint: Stop the time between switching on\nand switching off of the connected switch.", + }, + }, + code = function(data, environ) + return "smartline.stopwatch" + end, + button = function(data, environ) + return 'stopwatch('..sl.fmt_number(data.number)..')' + end, +}) + +smartline.icta_register_action("stopwatch", { + title = "stopwatch", + formspec = { + { + type = "numbers", + name = "number", + label = "Display number", + default = "", + }, + { + type = "textlist", + name = "row", + label = "Display line", + choices = "1,2,3,4,5,6,7,8,9", + default = "1", + }, + { + type = "ascii", + name = "text", + label = "label", + default = "", + }, + { + type = "textlist", + name = "type", + label = "type", + choices = "time,highscore,name", + default = "time", + }, + { + type = "label", + name = "lbl", + label = "Hint: Display number for the output\nof time, highscore and player name.", + }, + }, + button = function(data, environ) + return "lcd("..sl.fmt_number(data.number)..","..data.row..","..data.type..')' + end, + code = function(data, environ) + local idx = ({time=1, highscore= 2, name=3})[data.type] + local s1 = string.format('local payload = {row = %s, str = "%s "..env.stopwatch_result['..idx..']}', data.row, smartline.escape(data.text)) + local s2 = string.format('tubelib.send_message("%s", "%s", nil, "row", payload)', data.number, environ.owner) + return s1.."\n\t"..s2 + end, +}) diff --git a/mods/techpack/smartline/icta/submenu.lua b/mods/techpack/smartline/icta/submenu.lua new file mode 100644 index 00000000..bb547ead --- /dev/null +++ b/mods/techpack/smartline/icta/submenu.lua @@ -0,0 +1,200 @@ +--[[ + + ICTA Controller + =============== + + Part of the SmartLine mod + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + submenu.lua + + A sub-menu control to generate a formspec sting for conditions and actions +]]-- + +local sl = smartline + +local function index(list, x) + for idx, v in ipairs(list) do + if v == x then return idx end + end + return nil +end + +-- generate the choice dependent part of the form +local function add_controls_to_table(tbl, kvDefinition, kvSelect) + local val = "" + local offs = 1.4 + if kvDefinition[kvSelect.choice] then + local lControls = kvDefinition[kvSelect.choice].formspec + for idx,elem in ipairs(lControls) do + if elem.type == "label" then + tbl[#tbl+1] = "label[0,"..offs..";Description:\n"..elem.label.."]" + offs = offs + 0.4 + elseif elem.label and elem.label ~= "" then + tbl[#tbl+1] = "label[0,"..offs..";"..elem.label..":]" + offs = offs + 0.4 + end + if elem.type == "numbers" or elem.type == "digits" or elem.type == "letters" + or elem.type == "ascii" then + val = kvSelect[elem.name] or elem.default + tbl[#tbl+1] = "field[0.3,"..(offs+0.2)..";8,1;"..elem.name..";;"..val.."]" + offs = offs + 0.9 + elseif elem.type == "textlist" then + local l = elem.choices:split(",") + val = index(l, kvSelect[elem.name]) or elem.default + tbl[#tbl+1] = "dropdown[0.0,"..(offs)..";8.5,1.4;"..elem.name..";"..elem.choices..";"..val.."]" + offs = offs + 0.9 + end + end + end + return tbl +end + +local function default_data(kvDefinition, kvSelect) + local lControls = kvDefinition[kvSelect.choice].formspec + for idx,elem in ipairs(lControls) do + kvSelect[elem.name] = elem.default + end + kvSelect.button = kvDefinition[kvSelect.choice].button(kvSelect) + return kvSelect +end + +-- Copy field/formspec data to the table kvSelect +-- kvDefinition: submenu formspec definition +-- kvSelect: form data +-- fields: formspec input +local function field_to_kvSelect(kvDefinition, kvSelect, fields) + local error = false + local lControls = kvDefinition[kvSelect.choice].formspec + for idx,elem in ipairs(lControls) do + if elem.type == "numbers" then + if fields[elem.name] then + if fields[elem.name]:find("^[%d ]+$") then + kvSelect[elem.name] = fields[elem.name] + else + kvSelect[elem.name] = elem.default + error = true + end + end + elseif elem.type == "digits" then -- including positions + if fields[elem.name] then + if fields[elem.name]:find("^[+%%-,%d]+$") then + kvSelect[elem.name] = fields[elem.name] + else + kvSelect[elem.name] = elem.default + error = true + end + end + elseif elem.type == "letters" then + if fields[elem.name] then + if fields[elem.name]:find("^[+-]?%a+$") then + kvSelect[elem.name] = fields[elem.name] + else + kvSelect[elem.name] = elem.default + error = true + end + end + elseif elem.type == "ascii" then + if fields[elem.name] then + kvSelect[elem.name] = fields[elem.name] + end + elseif elem.type == "textlist" then + if fields[elem.name] ~= nil then + kvSelect[elem.name] = fields[elem.name] + end + end + end + -- store user input of button text + if fields._button_ then + kvSelect._button_ = fields._button_ + end + -- select button text + if error then + kvSelect.button = "invalid" + elseif kvSelect._button_ and kvSelect._button_ ~= "" then + kvSelect.button = kvSelect._button_ + else + kvSelect.button = kvDefinition[kvSelect.choice].button(kvSelect) + end + return kvSelect +end + +function smartline.submenu_verify(kvDefinition, kvSelect) + local error = false + local lControls = kvDefinition[kvSelect.choice].formspec + for idx,elem in ipairs(lControls) do + if elem.type == "numbers" then + if not kvSelect[elem.name]:find("^[%d ]+$") then + error = true + end + elseif elem.type == "digits" then -- including positions + if not kvSelect[elem.name]:find("^[+%%-,%d]+$") then + error = true + end + elseif elem.type == "letters" then + if not kvSelect[elem.name]:find("^[+-]?%a+$") then + error = true + end + elseif elem.type == "ascii" then + if kvSelect[elem.name] == "" or kvSelect[elem.name] == nil then + error = true + end + elseif elem.type == "textlist" then + if kvSelect[elem.name] == "" or kvSelect[elem.name] == nil then + error = true + end + end + end + return (error == false) +end + +-- generate a formspec string from the given control definition +-- row, col: numbers to identify the control +-- title: Title text for the control +-- lKeys: list of keywords of selected choices according to fields +-- lChoice: list of possible choices for the control +-- kvDefinition: definitions of the choice dependent controls +-- kvSelect: data of the last selected item {choice, number, value, ...} +function smartline.submenu_generate_formspec(row, col, title, lKeys, lChoice, kvDefinition, kvSelect) + if kvSelect == nil or next(kvSelect) == nil then + kvSelect = {choice = "default"} + end + local tbl = {"size[8.2,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_row_;;"..row.."]".. + "field[0,0;0,0;_col_;;"..col.."]"} + + local sChoice = table.concat(lChoice, ",") + local idx = index(lKeys, kvSelect.choice) or 1 + tbl[#tbl+1] = "label[0,0;"..title..":]" + tbl[#tbl+1] = "dropdown[0,0.5;8.5,1;choice;"..sChoice..";"..idx.."]" + tbl = add_controls_to_table(tbl, kvDefinition, kvSelect) + tbl[#tbl+1] = "field[0.2,8.7;4,1;_button_;Alternative button text;"..(kvSelect._button_ or "").."]" + tbl[#tbl+1] = "button[4,8.4;2,1;_cancel_;cancel]" + tbl[#tbl+1] = "button[6,8.4;2,1;_exit_;ok]" + return table.concat(tbl) +end + + +-- return the selected and configured menu item based on user inputs (fields) +function smartline.submenu_eval_input(kvDefinition, lKeys, lChoice, kvSelect, fields) + -- determine selected choice + if fields.choice then + -- load with default values + local idx = index(lChoice, fields.choice) or 1 + kvSelect = {choice = lKeys[idx]} + kvSelect = default_data(kvDefinition, kvSelect) + kvSelect = field_to_kvSelect(kvDefinition, kvSelect, fields) + else + -- add real data + kvSelect = field_to_kvSelect(kvDefinition, kvSelect, fields) + end + return kvSelect +end + diff --git a/mods/techpack/smartline/init.lua b/mods/techpack/smartline/init.lua new file mode 100644 index 00000000..bd6f43a1 --- /dev/null +++ b/mods/techpack/smartline/init.lua @@ -0,0 +1,37 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + +smartline = {} + +local MP = minetest.get_modpath("smartline") + +dofile(MP.."/display.lua") +dofile(MP.."/button.lua") +dofile(MP.."/signaltower.lua") +dofile(MP.."/playerdetector.lua") +dofile(MP.."/sequencer.lua") +dofile(MP.."/timer.lua") +dofile(MP.."/repeater.lua") +dofile(MP.."/collector.lua") +dofile(MP.."/controller.lua") +dofile(MP.."/commands.lua") +-- ICTA Controller +dofile(MP.."/icta/submenu.lua") +dofile(MP.."/icta/condition.lua") +dofile(MP.."/icta/action.lua") +dofile(MP.."/icta/formspec.lua") +dofile(MP.."/icta/controller.lua") +dofile(MP.."/icta/commands.lua") +dofile(MP.."/icta/edit.lua") +dofile(MP.."/icta/battery.lua") +dofile(MP.."/icta/balancer.lua") +dofile(MP.."/icta/stopwatch.lua") diff --git a/mods/techpack/smartline/mod.conf b/mods/techpack/smartline/mod.conf new file mode 100644 index 00000000..e6c04d4d --- /dev/null +++ b/mods/techpack/smartline/mod.conf @@ -0,0 +1 @@ +name=smartline diff --git a/mods/techpack/smartline/playerdetector.lua b/mods/techpack/smartline/playerdetector.lua new file mode 100644 index 00000000..eca67073 --- /dev/null +++ b/mods/techpack/smartline/playerdetector.lua @@ -0,0 +1,230 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + playerdetector.lua: + +]]-- + +local function switch_on(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + node.name = "smartline:playerdetector_active" + minetest.swap_node(pos, node) + local number = meta:get_string("number") + local numbers = meta:get_string("numbers") + local owner = meta:get_string("owner") + tubelib.send_message(numbers, owner, nil, "on", number) +end + +local function switch_off(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + node.name = "smartline:playerdetector" + minetest.swap_node(pos, node) + local number = meta:get_string("number") + local numbers = meta:get_string("numbers") + local owner = meta:get_string("owner") + tubelib.send_message(numbers, owner, nil, "off", number) +end + +local function scan_for_player(pos) + local meta = minetest.get_meta(pos) + local names = meta:get_string("names") or "" + for _, object in pairs(minetest.get_objects_inside_radius(pos, 4)) do + if object:is_player() then + if names == "" then + meta:set_string("player_name", object:get_player_name()) + return true + end + for _,name in ipairs(string.split(names, " ")) do + if object:get_player_name() == name then + meta:set_string("player_name", name) + return true + end + end + end + end + meta:set_string("player_name", nil) + return false +end + +local function formspec_help() + return "size[10,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[3,0;Player Detector Help]".. + "label[0,1;Input the number(s) of the receiving node(s).\n".. + "Separate numbers via blanks, like '0123 0234'.\n\n".. + "Input the player name(s) separated by blanks,\nor empty for all players.]".. + "button_exit[4,8;2,1;exit;close]" +end + + +local function formspec(numbers, names) + return "size[8,5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[2,0;Player Detector]".. + "field[0.3,1;8,1;numbers;Receiver node numbers:;"..numbers.."]" .. + "field[0.3,2.5;8,1;names;Player name(s):;"..names.."]" .. + "button_exit[5,3.5;2,1;exit;Save]".. + "button[1,3.5;1,1;help;help]" +end + +local function on_receive_fields(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player:get_player_name() == owner then + if fields.exit == "Save" then + if tubelib.check_numbers(fields.numbers) then + meta:set_string("numbers", fields.numbers) + end + meta:set_string("names", fields.names) + meta:set_string("formspec", formspec(fields.numbers, fields.names)) + elseif fields.help ~= nil then + meta:set_string("formspec", formspec_help()) + elseif fields.exit == "close" then + local numbers = meta:get_string("numbers") + local names = meta:get_string("names") + meta:set_string("formspec", formspec(numbers, names)) + end + end +end + +minetest.register_node("smartline:playerdetector", { + description = "SmartLine Player Detector", + inventory_image = "smartline_detector_inventory.png", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_detector.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "smartline:playerdetector") + local meta = minetest.get_meta(pos) + meta:set_string("number", number) + local numbers = meta:get_string("numbers") or "" + local names = meta:get_string("names") or "" + meta:set_string("formspec", formspec(numbers, names)) + meta:set_string("infotext", "SmartLine Player Detector "..number) + meta:set_string("owner", placer:get_player_name()) + minetest.get_node_timer(pos):start(1) + end, + + on_receive_fields = on_receive_fields, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + on_timer = function (pos, elapsed) + if tubelib.data_not_corrupted(pos) then + if scan_for_player(pos) then + switch_on(pos) + minetest.get_node_timer(pos):start(1) + return false + end + return true + end + return false + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("smartline:playerdetector_active", { + description = "SmartLine Player Detector", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_detector_active.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + on_receive_fields = on_receive_fields, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + on_timer = function (pos, elapsed) + if not scan_for_player(pos) then + switch_off(pos) + minetest.get_node_timer(pos):start(1) + return false + end + return true + end, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), + drop = "smartline:playerdetector" +}) + +minetest.register_craft({ + output = "smartline:playerdetector", + recipe = { + {"", "default:copper_ingot", ""}, + {"dye:blue", "default:copper_ingot", "tubelib:wlanchip"}, + {"", "", ""}, + }, +}) + +tubelib.register_node("smartline:playerdetector", {"smartline:playerdetector_active"}, { + on_recv_message = function(pos, topic, payload) + if topic == "set_numbers" then + local meta = minetest.get_meta(pos) + meta:set_string("numbers", payload) + local names = meta:get_string("names") or "" + meta:set_string("formspec", formspec(payload, names)) + return true + elseif topic == "name" then + local meta = minetest.get_meta(pos) + return meta:get_string("player_name") + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, +}) + diff --git a/mods/techpack/smartline/repeater.lua b/mods/techpack/smartline/repeater.lua new file mode 100644 index 00000000..a942bd2a --- /dev/null +++ b/mods/techpack/smartline/repeater.lua @@ -0,0 +1,133 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + repeater.lua: + Derived from Tubelib repeater + +]]-- + +local OVER_LOAD_MAX = 5 + +local function formspec(meta) + local numbers = meta:get_string("numbers") + return "size[7,5]".. + "field[0.5,2;6,1;number;Destination node numbers;"..numbers.."]" .. + "button_exit[1,3;2,1;exit;Save]" +end + +minetest.register_node("smartline:repeater", { + description = "SmartLine Repeater", + inventory_image = "smartline_repeater_inventory.png", + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_repeater.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_number = tubelib.add_node(pos, "smartline:repeater") + meta:set_string("own_number", own_number) + meta:set_string("formspec", formspec(meta)) + meta:set_string("infotext", "SmartLine Repeater "..own_number..": not connected") + meta:set_string("owner", placer:get_player_name()) + meta:set_int("overload_cnt", 0) + minetest.get_node_timer(pos):start(1) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner ~= player:get_player_name() then + return + end + + if tubelib.check_numbers(fields.number) then + meta:set_string("numbers", fields.number) + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "SmartLine Repeater "..own_number..": connected with "..fields.number) + meta:set_string("formspec", formspec(meta)) + end + + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(1) + end + end, + + on_timer = function(pos,elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + meta:set_int("overload_cnt", 0) + return true + end + return false + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "smartline:repeater", + recipe = { + {"", "default:copper_ingot", ""}, + {"tubelib:wlanchip", "", "tubelib:wlanchip"}, + {"", "dye:blue", ""}, + }, +}) + +tubelib.register_node("smartline:repeater", {}, { + on_recv_message = function(pos, topic, payload) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local numbers = meta:get_string("numbers") + local overload_cnt = meta:get_int("overload_cnt") + 1 + meta:set_int("overload_cnt", overload_cnt) + if overload_cnt > OVER_LOAD_MAX then + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "SmartLine Repeater "..own_number..": fault (overloaded)") + minetest.get_node_timer(pos):stop() + return false + elseif topic == "set_numbers" then + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "SmartLine Repeater "..own_number..": connected with "..payload) + meta:set_string("numbers", payload) + meta:set_string("formspec", formspec(meta)) + return true + else + return tubelib.send_message(numbers, owner, nil, topic, payload) + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(1) + end, +}) diff --git a/mods/techpack/smartline/sequencer.lua b/mods/techpack/smartline/sequencer.lua new file mode 100644 index 00000000..8758c383 --- /dev/null +++ b/mods/techpack/smartline/sequencer.lua @@ -0,0 +1,295 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + sequencer.lua: + Derived from Tubelib sequencer + +]]-- + +local RUNNING_STATE = 1 +local STOP_STATE = 0 +local NUM_SLOTS = 8 + +local sHELP = [[label[0,0;SmartLine Sequencer Help + +Define a sequence of commands to control other machines. +Numbers(s) are the node numbers, the command shall sent to. +The commands 'on'/'off' are used for machines and other nodes. +Offset is the time to the next line in seconds (1..999). +If endless is set, the Sequencer restarts again and again. +The command ' ' does nothing, only consuming the offset time. +] +]] + + +local sAction = ",on,off" +local kvAction = {[""]=1, ["on"]=2, ["off"]=3} +local tAction = {nil, "on", "off"} + +local function formspec(state, rules, endless) + endless = endless == 1 and "true" or "false" + local tbl = {"size[8,9.2]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;Number(s)]label[2.1,0;Command]label[6.4,0;Offset/s]"} + + for idx, rule in ipairs(rules or {}) do + tbl[#tbl+1] = "field[0.2,"..(-0.2+idx)..";2,1;num"..idx..";;"..(rule.num or "").."]" + tbl[#tbl+1] = "dropdown[2,"..(-0.4+idx)..";3.9,1;act"..idx..";"..sAction..";"..(rule.act or "").."]" + tbl[#tbl+1] = "field[6.2,"..(-0.2+idx)..";2,1;offs"..idx..";;"..(rule.offs or "").."]" + end + tbl[#tbl+1] = "checkbox[0,8.5;endless;Run endless;"..endless.."]" + tbl[#tbl+1] = "button[4.5,8.5;1.5,1;help;help]" + tbl[#tbl+1] = "image_button[6.5,8.5;1,1;".. tubelib.state_button(state) ..";button;]" + + return table.concat(tbl) +end + +local function formspec_help() + return "size[13,10]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;help]".. + sHELP.. + --"label[0.2,0;test]".. + "button[11.5,9;1.5,1;close;close]" +end + +local function stop_the_sequencer(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", STOP_STATE) + meta:set_string("infotext", "SmartLine Sequencer "..number..": stopped") + local rules = minetest.deserialize(meta:get_string("rules")) + local endless = meta:get_int("endless") or 0 + meta:set_string("formspec", formspec(tubelib.STOPPED, rules, endless)) + minetest.get_node_timer(pos):stop() + return false +end + +local function get_next_slot(idx, rules, endless) + idx = idx + 1 + if idx <= #rules and rules[idx].offs ~= "" and rules[idx].num ~= "" then + return idx + elseif endless == 1 then + return 1 + end + return nil +end + +local function restart_timer(pos, time) + local timer = minetest.get_node_timer(pos) + if timer:is_started() then + timer:stop() + end + if type(time) == "number" then + timer:start(time) + end +end + +local function check_rules(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + local rules = minetest.deserialize(meta:get_string("rules")) + if rules then + local running = meta:get_int("running") + local index = meta:get_int("index") or 1 + local number = meta:get_string("number") + local endless = meta:get_int("endless") or 0 + local placer_name = meta:get_string("placer_name") + while true do -- process all rules as long as offs == 0 + local rule = rules[index] + local offs = rules[index].offs + if type(offs) == "string" then + offs = 0 + end + tubelib.send_message(rule.num, placer_name, nil, tAction[rule.act], number) + index = get_next_slot(index, rules, endless) + if index ~= nil and offs ~= nil and running == 1 then + -- after the last rule a pause with 2 or more sec is required + if index == 1 and offs < 1 then + offs = 2 + end + meta:set_string("infotext", "SmartLine Sequencer "..number..": running ("..index.."/"..NUM_SLOTS..")") + meta:set_int("index", index) + if offs > 0 then + minetest.after(0, restart_timer, pos, offs) + return false + end + else + return stop_the_sequencer(pos) + end + end + end + return false + end + return false +end + +local function start_the_sequencer(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", RUNNING_STATE) + meta:set_int("index", 1) + meta:set_string("infotext", "SmartLine Sequencer "..number..": running (1/"..NUM_SLOTS..")") + local rules = minetest.deserialize(meta:get_string("rules")) + local endless = meta:get_int("endless") or 0 + meta:set_string("formspec", formspec(tubelib.RUNNING, rules, endless)) + minetest.get_node_timer(pos):start(0.1) + return false +end + +local function on_receive_fields(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if fields.help ~= nil then + meta:set_string("formspec", formspec_help()) + return + end + + local endless = meta:get_int("endless") or 0 + if fields.endless ~= nil then + endless = fields.endless == "true" and 1 or 0 + meta:set_int("index", 1) + end + meta:set_int("endless", endless) + + local rules = minetest.deserialize(meta:get_string("rules")) + if fields.exit ~= nil then + meta:set_string("formspec", formspec(tubelib.state(running), rules, endless)) + return + end + + for idx = 1,NUM_SLOTS do + if fields["offs"..idx] ~= nil then + rules[idx].offs = tonumber(fields["offs"..idx]) or "" + end + if fields["num"..idx] ~= nil and tubelib.check_numbers(fields["num"..idx]) then + rules[idx].num = fields["num"..idx] + end + if fields["act"..idx] ~= nil then + rules[idx].act = kvAction[fields["act"..idx]] + end + end + meta:set_string("rules", minetest.serialize(rules)) + + if fields.button ~= nil then + if running > STOP_STATE then + stop_the_sequencer(pos) + else + start_the_sequencer(pos) + end + elseif fields.num1 ~= nil then -- any other change? + stop_the_sequencer(pos) + else + local endless = meta:get_int("endless") or 0 + meta:set_string("formspec", formspec(tubelib.state(running), rules, endless)) + end +end + +minetest.register_node("smartline:sequencer", { + description = "SmartLine Sequencer", + inventory_image = "smartline_sequencer_inventory.png", + wield_image = "smartline_sequencer_inventory.png", + stack_max = 1, + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_sequencer.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "smartline:sequencer") + local rules = {} + for idx = 1,NUM_SLOTS do + rules[idx] = {offs = "", num = "", act = 1} + end + meta:set_string("placer_name", placer:get_player_name()) + meta:set_string("rules", minetest.serialize(rules)) + meta:set_string("number", number) + meta:set_int("index", 1) + meta:set_int("endless", 0) + meta:get_int("running", STOP_STATE) + meta:set_string("formspec", formspec(tubelib.STOPPED, rules, 0)) + meta:set_string("infotext", "SmartLine Sequencer "..number) + end, + + on_receive_fields = on_receive_fields, + + on_dig = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") + if running ~= 1 then + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end + end, + + on_timer = check_rules, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "smartline:sequencer", + recipe = { + {"", "default:mese_crystal", ""}, + {"dye:blue", "default:copper_ingot", "tubelib:wlanchip"}, + {"", "", ""}, + }, +}) + +tubelib.register_node("smartline:sequencer", {}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + start_the_sequencer(pos) + elseif topic == "off" then + -- do not stop immediately + local meta = minetest.get_meta(pos) + meta:set_int("endless", 0) + end + end, + on_node_load = function(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("running") ~= STOP_STATE then + meta:set_int("running", RUNNING_STATE) + minetest.get_node_timer(pos):start(1) + end + end, +}) diff --git a/mods/techpack/smartline/signaltower.lua b/mods/techpack/smartline/signaltower.lua new file mode 100644 index 00000000..9156abc5 --- /dev/null +++ b/mods/techpack/smartline/signaltower.lua @@ -0,0 +1,133 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + signaltower.lua: + +]]-- + + +local function switch_on(pos, node, color) + local meta = minetest.get_meta(pos) + meta:set_string("state", color) + node.name = "smartline:signaltower_"..color + minetest.swap_node(pos, node) +end + +local function switch_off(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("state", "off") + node.name = "smartline:signaltower" + minetest.swap_node(pos, node) +end + +minetest.register_node("smartline:signaltower", { + description = "SmartLine Signal Tower", + tiles = { + 'smartline_signaltower_top.png', + 'smartline_signaltower_top.png', + 'smartline_signaltower.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -5/32, -16/32, -5/32, 5/32, 16/32, 5/32}, + }, + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "smartline:signaltower") + local meta = minetest.get_meta(pos) + meta:set_string("state", "off") + meta:set_string("infotext", "SmartLine Signal Tower "..number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_on(pos, node, "green") + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = 0, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +for _,color in ipairs({"green", "amber", "red"}) do + minetest.register_node("smartline:signaltower_"..color, { + description = "SmartLine Signal Tower", + tiles = { + 'smartline_signaltower_top.png', + 'smartline_signaltower_top.png', + 'smartline_signaltower_'..color..'.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -5/32, -16/32, -5/32, 5/32, 16/32, 5/32}, + }, + }, + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_off(pos, node) + end + end, + + paramtype = "light", + light_source = 10, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), + drop = "smartline:signaltower", + }) +end + +minetest.register_craft({ + output = "smartline:signaltower", + recipe = { + {"dye:red", "default:copper_ingot", ""}, + {"dye:orange", "default:glass", ""}, + {"dye:green", "tubelib:wlanchip", ""}, + }, +}) + +tubelib.register_node("smartline:signaltower", { + "smartline:signaltower_green", + "smartline:signaltower_amber", + "smartline:signaltower_red"}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "green" then + switch_on(pos, node, "green") + elseif topic == "amber" then + switch_on(pos, node, "amber") + elseif topic == "red" then + switch_on(pos, node, "red") + elseif topic == "off" then + switch_off(pos, node) + elseif topic == "state" then + local meta = minetest.get_meta(pos) + return meta:get_string("state") + end + end, +}) diff --git a/mods/techpack/smartline/textures/smartline.png b/mods/techpack/smartline/textures/smartline.png new file mode 100644 index 00000000..471aee35 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline.png differ diff --git a/mods/techpack/smartline/textures/smartline_battery_green.png b/mods/techpack/smartline/textures/smartline_battery_green.png new file mode 100644 index 00000000..b66821fb Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_battery_green.png differ diff --git a/mods/techpack/smartline/textures/smartline_battery_inventory.png b/mods/techpack/smartline/textures/smartline_battery_inventory.png new file mode 100644 index 00000000..c7139554 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_battery_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_battery_red.png b/mods/techpack/smartline/textures/smartline_battery_red.png new file mode 100644 index 00000000..fb194d98 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_battery_red.png differ diff --git a/mods/techpack/smartline/textures/smartline_button_inventory.png b/mods/techpack/smartline/textures/smartline_button_inventory.png new file mode 100644 index 00000000..8ac272eb Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_button_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_button_off.png b/mods/techpack/smartline/textures/smartline_button_off.png new file mode 100644 index 00000000..64f00064 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_button_off.png differ diff --git a/mods/techpack/smartline/textures/smartline_button_on.png b/mods/techpack/smartline/textures/smartline_button_on.png new file mode 100644 index 00000000..9bab52e6 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_button_on.png differ diff --git a/mods/techpack/smartline/textures/smartline_collector.png b/mods/techpack/smartline/textures/smartline_collector.png new file mode 100644 index 00000000..272a953d Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_collector.png differ diff --git a/mods/techpack/smartline/textures/smartline_collector_inventory.png b/mods/techpack/smartline/textures/smartline_collector_inventory.png new file mode 100644 index 00000000..cbd28c61 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_collector_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_controller.png b/mods/techpack/smartline/textures/smartline_controller.png new file mode 100644 index 00000000..a1e59321 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_controller.png differ diff --git a/mods/techpack/smartline/textures/smartline_controller_inventory.png b/mods/techpack/smartline/textures/smartline_controller_inventory.png new file mode 100644 index 00000000..b36bdae6 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_controller_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_detector.png b/mods/techpack/smartline/textures/smartline_detector.png new file mode 100644 index 00000000..ef39e1fc Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_detector.png differ diff --git a/mods/techpack/smartline/textures/smartline_detector_active.png b/mods/techpack/smartline/textures/smartline_detector_active.png new file mode 100644 index 00000000..c378a321 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_detector_active.png differ diff --git a/mods/techpack/smartline/textures/smartline_detector_inventory.png b/mods/techpack/smartline/textures/smartline_detector_inventory.png new file mode 100644 index 00000000..e92acc6e Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_detector_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_display.png b/mods/techpack/smartline/textures/smartline_display.png new file mode 100644 index 00000000..9e9e3e76 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_display.png differ diff --git a/mods/techpack/smartline/textures/smartline_display_inventory.png b/mods/techpack/smartline/textures/smartline_display_inventory.png new file mode 100644 index 00000000..58b11be2 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_display_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_repeater.png b/mods/techpack/smartline/textures/smartline_repeater.png new file mode 100644 index 00000000..fdf7c03c Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_repeater.png differ diff --git a/mods/techpack/smartline/textures/smartline_repeater_inventory.png b/mods/techpack/smartline/textures/smartline_repeater_inventory.png new file mode 100644 index 00000000..d47c33c5 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_repeater_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_sequencer.png b/mods/techpack/smartline/textures/smartline_sequencer.png new file mode 100644 index 00000000..5e3066ba Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_sequencer.png differ diff --git a/mods/techpack/smartline/textures/smartline_sequencer_inventory.png b/mods/techpack/smartline/textures/smartline_sequencer_inventory.png new file mode 100644 index 00000000..de56ec4f Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_sequencer_inventory.png differ diff --git a/mods/techpack/smartline/textures/smartline_signaltower.png b/mods/techpack/smartline/textures/smartline_signaltower.png new file mode 100644 index 00000000..6fe09bbb Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_signaltower.png differ diff --git a/mods/techpack/smartline/textures/smartline_signaltower_amber.png b/mods/techpack/smartline/textures/smartline_signaltower_amber.png new file mode 100644 index 00000000..74c6473b Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_signaltower_amber.png differ diff --git a/mods/techpack/smartline/textures/smartline_signaltower_green.png b/mods/techpack/smartline/textures/smartline_signaltower_green.png new file mode 100644 index 00000000..c75409ea Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_signaltower_green.png differ diff --git a/mods/techpack/smartline/textures/smartline_signaltower_red.png b/mods/techpack/smartline/textures/smartline_signaltower_red.png new file mode 100644 index 00000000..2835266a Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_signaltower_red.png differ diff --git a/mods/techpack/smartline/textures/smartline_signaltower_top.png b/mods/techpack/smartline/textures/smartline_signaltower_top.png new file mode 100644 index 00000000..7c9ed8d7 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_signaltower_top.png differ diff --git a/mods/techpack/smartline/textures/smartline_timer.png b/mods/techpack/smartline/textures/smartline_timer.png new file mode 100644 index 00000000..bd59a588 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_timer.png differ diff --git a/mods/techpack/smartline/textures/smartline_timer_inventory.png b/mods/techpack/smartline/textures/smartline_timer_inventory.png new file mode 100644 index 00000000..3aa15b14 Binary files /dev/null and b/mods/techpack/smartline/textures/smartline_timer_inventory.png differ diff --git a/mods/techpack/smartline/timer.lua b/mods/techpack/smartline/timer.lua new file mode 100644 index 00000000..9367973e --- /dev/null +++ b/mods/techpack/smartline/timer.lua @@ -0,0 +1,240 @@ +--[[ + + SmartLine + ========= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + timer.lua: + Derived from Tubelib timer + +]]-- + +local CYCLE_TIME = 8 + +local sHELP = [[label[0,0;SmartLine Timer Help + +tbd +] +]] + + +local tTime = { + ["00:00"] = 1, ["02:00"] = 2, ["04:00"] = 3, + ["06:00"] = 4, ["08:00"] = 5, ["10:00"] = 6, + ["12:00"] = 7, ["14:00"] = 8, ["16:00"] = 9, + ["18:00"] =10, ["20:00"] =11, ["22:00"] =12, +} + +local sTime = "00:00,02:00,04:00,06:00,08:00,10:00,12:00,14:00,16:00,18:00,20:00,22:00" + +local tAction = { + [""] = 1, + ["on"] = 2, + ["off"] = 3, +} + +local sAction = ",on,off" + +local function formspec(events, numbers, actions) + return "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + + "label[0,0;Time]label[2.3,0;Number(s)]label[4.5,0;Command]".. + "dropdown[0,1;2,1;e1;"..sTime..";"..events[1].."]".. + "field[2.3,1.2;2,1;n1;;"..numbers[1].."]" .. + "dropdown[4.5,1;3,1;a1;"..sAction..";"..tAction[actions[1]].."]".. + + "dropdown[0,2;2,1;e2;"..sTime..";"..events[2].."]".. + "field[2.3,2.2;2,1;n2;;"..numbers[2].."]" .. + "dropdown[4.5,2;3,1;a2;"..sAction..";"..tAction[actions[2]].."]".. + + "dropdown[0,3;2,1;e3;"..sTime..";"..events[3].."]".. + "field[2.3,3.2;2,1;n3;;"..numbers[3].."]" .. + "dropdown[4.5,3;3,1;a3;"..sAction..";"..tAction[actions[3]].."]".. + + "dropdown[0,4;2,1;e4;"..sTime..";"..events[4].."]".. + "field[2.3,4.2;2,1;n4;;"..numbers[4].."]" .. + "dropdown[4.5,4;3,1;a4;"..sAction..";"..tAction[actions[4]].."]".. + + "dropdown[0,5;2,1;e5;"..sTime..";"..events[5].."]".. + "field[2.3,5.2;2,1;n5;;"..numbers[5].."]" .. + "dropdown[4.5,5;3,1;a5;"..sAction..";"..tAction[actions[5]].."]".. + + "dropdown[0,6;2,1;e6;"..sTime..";"..events[6].."]".. + "field[2.3,6.2;2,1;n6;;"..numbers[6].."]" .. + "dropdown[4.5,6;3,1;a6;"..sAction..";"..tAction[actions[6]].."]".. + + "button[4.5,7;1.5,1;help;help]".. + "button_exit[6.5,7;1.5,1;exit;close]" +end + +local function formspec_help() + return "size[13,10]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0,0;0,0;_type_;;help]".. + sHELP.. + --"label[0.2,0;test]".. + "button[11.5,9;1.5,1;close;close]" +end + +local function check_rules(pos,elapsed) + if tubelib.data_not_corrupted(pos) then + local hour = math.floor(minetest.get_timeofday() * 24) + local meta = minetest.get_meta(pos) + local events = minetest.deserialize(meta:get_string("events")) + local numbers = minetest.deserialize(meta:get_string("numbers")) + local actions = minetest.deserialize(meta:get_string("actions")) + local done = minetest.deserialize(meta:get_string("done")) + local placer_name = meta:get_string("placer_name") + local own_num = meta:get_string("own_num") + + -- check all rules + for idx,act in ipairs(actions) do + if act ~= "" and numbers[idx] ~= "" then + local hr = (events[idx] - 1) * 2 + if ((hour - hr) % 24) <= 4 then -- last 4 hours? + if done[idx] == false then -- not already executed? + tubelib.send_message(numbers[idx], placer_name, nil, act, own_num) + done[idx] = true + end + else + done[idx] = false + end + if hour == hr and done[idx] == false then + tubelib.send_message(numbers[idx], placer_name, nil, act, own_num) + done[idx] = true + end + end + end + + -- prepare for the next day + if hour == 23 then + done = {false,false,false,false,false,false} + end + meta:set_string("done", minetest.serialize(done)) + meta:set_string("infotext","SmartLine Timer ("..own_num..")"..hour..":00") + return true + end + return false +end + + +minetest.register_node("smartline:timer", { + description = "SmartLine Timer", + inventory_image = "smartline_timer_inventory.png", + wield_image = "smartline_timer_inventory.png", + stack_max = 1, + tiles = { + -- up, down, right, left, back, front + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png", + "smartline.png^smartline_timer.png", + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -6/32, -6/32, 14/32, 6/32, 6/32, 16/32}, + }, + }, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local events = {1,1,1,1,1,1} + local numbers = {"0000","","","","",""} + local actions = {"","","","","",""} + local done = {false,false,false,false,false,false} + local own_num = tubelib.add_node(pos, "smartline:timer") + meta:set_string("own_num", own_num) + meta:set_string("placer_name", placer:get_player_name()) + meta:set_string("events", minetest.serialize(events)) + meta:set_string("numbers", minetest.serialize(numbers)) + meta:set_string("actions", minetest.serialize(actions)) + meta:set_string("done", minetest.serialize(done)) + meta:set_string("formspec", formspec(events, numbers, actions)) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + if fields.help ~= nil then + meta:set_string("formspec", formspec_help()) + return + end + local events = minetest.deserialize(meta:get_string("events")) + for idx, evt in ipairs({fields.e1, fields.e2, fields.e3, fields.e4, fields.e5, fields.e6}) do + if evt ~= nil then + events[idx] = tTime[evt] + end + end + meta:set_string("events", minetest.serialize(events)) + + local numbers = minetest.deserialize(meta:get_string("numbers")) + for idx, num in ipairs({fields.n1, fields.n2, fields.n3, fields.n4, fields.n5, fields.n6}) do + if num ~= nil and tubelib.check_numbers(num)then + numbers[idx] = num + end + end + meta:set_string("numbers", minetest.serialize(numbers)) + + local actions = minetest.deserialize(meta:get_string("actions")) + for idx, act in ipairs({fields.a1, fields.a2, fields.a3, fields.a4, fields.a5, fields.a6}) do + if act ~= nil then + actions[idx] = act + end + end + meta:set_string("actions", minetest.serialize(actions)) + + meta:set_string("formspec", formspec(events, numbers, actions)) + local done = {false,false,false,false,false,false} + meta:set_string("done", minetest.serialize(done)) + end, + + on_timer = check_rules, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = default.node_sound_stone_defaults(), + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, +}) + +tubelib.register_node("smartline:timer", {}, { + on_node_load = function(pos) + local meta = minetest.get_meta(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + -- check rules for just loaded areas + local done = {false,false,false,false,false,false} + meta:set_string("done", minetest.serialize(done)) + check_rules(pos,0) + end, +}) + + +minetest.register_craft({ + output = "smartline:timer", + recipe = { + {"", "", ""}, + {"dye:blue", "default:copper_ingot", "tubelib:wlanchip"}, + {"", "default:mese_crystal", ""}, + }, +}) diff --git a/mods/techpack/techpack_stairway/depends.txt b/mods/techpack/techpack_stairway/depends.txt new file mode 100644 index 00000000..3a7daa1d --- /dev/null +++ b/mods/techpack/techpack_stairway/depends.txt @@ -0,0 +1,2 @@ +default + diff --git a/mods/techpack/techpack_stairway/description.txt b/mods/techpack/techpack_stairway/description.txt new file mode 100644 index 00000000..1769ea42 --- /dev/null +++ b/mods/techpack/techpack_stairway/description.txt @@ -0,0 +1,2 @@ +Simple stairways and bridges for your machines. + diff --git a/mods/techpack/techpack_stairway/init.lua b/mods/techpack/techpack_stairway/init.lua new file mode 100644 index 00000000..b74ec4e9 --- /dev/null +++ b/mods/techpack/techpack_stairway/init.lua @@ -0,0 +1,609 @@ +--[[ + + TechPack Stairway + ================= + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + init.lua + +]]-- +minetest.register_node("techpack_stairway:grating", { + description = "TechPack Grating", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -15/32, -17/32, 17/32, -14/32, 17/32} + }, + }, + + selection_box = { + type = "fixed", + fixed = { + {-16/32, -16/32, -16/32, 16/32, -10/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:handrail1", { + description = "TechPack Handrail 1", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + }, + }, + + selection_box = { + type = "fixed", + fixed = { + { -16/32, -16/32, -16/32, -12/32, -6/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:handrail2", { + description = "TechPack Handrail 2", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { 15/32, -17/32, -17/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + }, + }, + + selection_box = { + type = "fixed", + fixed = { + { 12/32, -16/32, -16/32, 16/32, -6/32, 16/32}, + {-16/32, -16/32, -16/32, -12/32, -6/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:handrail3", { + description = "TechPack Handrail 3", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, 15/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + }, + }, + + selection_box = { + type = "fixed", + fixed = { + { -16/32, -16/32, 12/32, 16/32, -6/32, 16/32}, + { -16/32, -16/32, -16/32, -12/32, -6/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:handrail4", { + description = "TechPack Handrail 4", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, 15/32, 17/32, 17/32, 17/32}, + { 15/32, -17/32, -17/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + }, + }, + + selection_box = { + type = "fixed", + fixed = { + { 12/32, -16/32, -16/32, 16/32, -6/32, 16/32}, + {-16/32, -16/32, -16/32, -12/32, -6/32, 16/32}, + {-16/32, -16/32, 12/32, 16/32, -6/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:bridge1", { + description = "TechPack Bridge 1", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + {-17/32, -15/32, -17/32, 17/32, -14/32, 17/32} + }, + }, + + selection_box = { + type = "fixed", + fixed = { + {-16/32, -16/32, -16/32, 16/32, -10/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:bridge2", { + description = "TechPack Bridge 2", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { 15/32, -17/32, -17/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + {-17/32, -15/32, -17/32, 17/32, -14/32, 17/32} + }, + }, + + selection_box = { + type = "fixed", + fixed = { + {-16/32, -16/32, -16/32, 16/32, -10/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:bridge3", { + description = "TechPack Bridge 3", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, 15/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + {-17/32, -15/32, -17/32, 17/32, -14/32, 17/32} + }, + }, + + selection_box = { + type = "fixed", + fixed = { + {-16/32, -16/32, -16/32, 16/32, -10/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:bridge4", { + description = "TechPack Bridge 4", + tiles = { + 'techpack_stairway_bottom.png', + 'techpack_stairway_bottom.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, 15/32, 17/32, 17/32, 17/32}, + { 15/32, -17/32, -17/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + {-17/32, -15/32, -17/32, 17/32, -14/32, 17/32} + }, + }, + + selection_box = { + type = "fixed", + fixed = { + {-16/32, -16/32, -16/32, 16/32, -10/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:stairway", { + description = "TechPack Stairway", + tiles = { + 'techpack_stairway_steps.png', + 'techpack_stairway_steps.png', + 'techpack_stairway_side.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { 15/32, -1/32, -1/32, 17/32, 49/32, 17/32}, + {-17/32, -1/32, -1/32, -15/32, 49/32, 17/32}, + {-17/32, -1/32, -1/32, 17/32, 1/32, 17/32}, + + { 15/32, -17/32, -17/32, 17/32, 33/32, 1/32}, + {-17/32, -17/32, -17/32, -15/32, 33/32, 1/32}, + {-17/32, -17/32, -17/32, 17/32, -15/32, 1/32}, + }, + }, + + selection_box = { + type = "fixed", + fixed = { + {-16/32, -16/32, -16/32, 16/32, -10/32, 0/32}, + {-16/32, -16/32, 0/32, 16/32, 2/32, 16/32}, + }, + }, + + --climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:ladder1", { + description = "TechPack Ladder 1", + tiles = { + 'techpack_stairway_steps.png', + 'techpack_stairway_steps.png', + 'techpack_stairway_ladder.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, 15/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, 17/32, 17/32, -15/32}, + { 15/32, -17/32, -17/32, 17/32, 17/32, 17/32}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:ladder2", { + description = "TechPack Ladder 2", + tiles = { + 'techpack_stairway_steps.png', + 'techpack_stairway_steps.png', + 'techpack_stairway_ladder.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, 15/32, 17/32, 17/32, 17/32}, + {-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + --{-17/32, -17/32, -17/32, 17/32, 17/32, -15/32}, + { 15/32, -17/32, -17/32, 17/32, 17/32, 17/32}, + }, + }, + + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:ladder3", { + description = "TechPack Ladder 3", + tiles = { + 'techpack_stairway_steps.png', + 'techpack_stairway_steps.png', + 'techpack_stairway_ladder.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-17/32, -17/32, 15/32, 17/32, 17/32, 17/32}, + --{-17/32, -17/32, -17/32, -15/32, 17/32, 17/32}, + --{-17/32, -17/32, -17/32, 17/32, 17/32, -15/32}, + { 15/32, -17/32, -17/32, 17/32, 17/32, 17/32}, + }, + }, + + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + climbable = true, + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techpack_stairway:lattice", { + description = "TechPack Lattice", + tiles = { + 'techpack_stairway_lattice.png', + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, -7/16, 8/16, 8/16}, + { 7/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, + {-8/16, 7/16, -8/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, 8/16, 8/16, -7/16}, + {-8/16, -8/16, 7/16, 8/16, 8/16, 8/16}, + }, + }, + + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + paramtype2 = "facedir", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 2}, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_craft({ + output = "techpack_stairway:grating 4", + recipe = { + {"", "", ""}, + {"dye:dark_grey", "", "default:coal_lump"}, + {"default:steel_ingot", "default:tin_ingot", "default:steel_ingot"}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:handrail1 4", + recipe = { + {"default:steel_ingot", "default:coal_lump", ""}, + {"default:tin_ingot", "", ""}, + {"default:steel_ingot", "dye:dark_grey", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:stairway 2", + recipe = { + {"", "", "default:steel_ingot"}, + {"dye:dark_grey", "default:tin_ingot", "default:coal_lump"}, + {"default:steel_ingot", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:ladder1 2", + recipe = { + {"", "default:steel_ingot", ""}, + {"dye:dark_grey", "default:tin_ingot", "default:coal_lump"}, + {"", "default:steel_ingot", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:ladder3 4", + recipe = { + {"", "", "default:steel_ingot"}, + {"dye:dark_grey", "default:tin_ingot", "default:coal_lump"}, + {"", "", "default:steel_ingot"}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:lattice 2", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"dye:dark_grey", "default:tin_ingot", "default:coal_lump"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + }, +}) + + +minetest.register_craft({ + output = "techpack_stairway:handrail2", + recipe = { + {"", "", ""}, + {"techpack_stairway:handrail1", "", "techpack_stairway:handrail1"}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:handrail3", + recipe = { + {"", "techpack_stairway:handrail1", ""}, + {"techpack_stairway:handrail1", "", ""}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:handrail4", + recipe = { + {"", "techpack_stairway:handrail1", ""}, + {"techpack_stairway:handrail1", "", "techpack_stairway:handrail1"}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:bridge1", + recipe = { + {"", "", ""}, + {"techpack_stairway:handrail1", "techpack_stairway:grating", ""}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:bridge2", + recipe = { + {"", "", ""}, + {"techpack_stairway:handrail1", "techpack_stairway:grating", "techpack_stairway:handrail1"}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:bridge3", + recipe = { + {"", "techpack_stairway:handrail1", ""}, + {"techpack_stairway:handrail1", "techpack_stairway:grating", ""}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:bridge4", + recipe = { + {"", "techpack_stairway:handrail1", ""}, + {"techpack_stairway:handrail1", "techpack_stairway:grating", "techpack_stairway:handrail1"}, + {"", "", ""}, + }, +}) + +minetest.register_craft({ + output = "techpack_stairway:ladder2", + recipe = {{"techpack_stairway:ladder1"}}, +}) + +minetest.register_alias("tubelib_stairway:grating", "techpack_stairway:grating") +minetest.register_alias("tubelib_stairway:lattice", "techpack_stairway:lattice") +minetest.register_alias("tubelib_stairway:handrail1", "techpack_stairway:handrail1") +minetest.register_alias("tubelib_stairway:handrail2", "techpack_stairway:handrail3") +minetest.register_alias("tubelib_stairway:handrail3", "techpack_stairway:handrail4") +minetest.register_alias("tubelib_stairway:handrail4", "techpack_stairway:handrail5") +minetest.register_alias("tubelib_stairway:stairway", "techpack_stairway:stairway") +minetest.register_alias("tubelib_stairway:ladder1", "techpack_stairway:ladder1") +minetest.register_alias("tubelib_stairway:ladder2", "techpack_stairway:ladder2") +minetest.register_alias("tubelib_stairway:bridge1", "techpack_stairway:bridge1") +minetest.register_alias("tubelib_stairway:bridge2", "techpack_stairway:bridge2") +minetest.register_alias("tubelib_stairway:bridge3", "techpack_stairway:bridge3") +minetest.register_alias("tubelib_stairway:bridge4", "techpack_stairway:bridge4") diff --git a/mods/techpack/techpack_stairway/mod.conf b/mods/techpack/techpack_stairway/mod.conf new file mode 100644 index 00000000..9ab75172 --- /dev/null +++ b/mods/techpack/techpack_stairway/mod.conf @@ -0,0 +1,3 @@ +name=techpack_stairway +description=Simple stairways and bridges for your machines. +depends=default diff --git a/mods/techpack/techpack_stairway/textures/techpack_stairway_bottom.png b/mods/techpack/techpack_stairway/textures/techpack_stairway_bottom.png new file mode 100644 index 00000000..d806d427 Binary files /dev/null and b/mods/techpack/techpack_stairway/textures/techpack_stairway_bottom.png differ diff --git a/mods/techpack/techpack_stairway/textures/techpack_stairway_ladder.png b/mods/techpack/techpack_stairway/textures/techpack_stairway_ladder.png new file mode 100644 index 00000000..68a61e9e Binary files /dev/null and b/mods/techpack/techpack_stairway/textures/techpack_stairway_ladder.png differ diff --git a/mods/techpack/techpack_stairway/textures/techpack_stairway_lattice.png b/mods/techpack/techpack_stairway/textures/techpack_stairway_lattice.png new file mode 100644 index 00000000..99008b44 Binary files /dev/null and b/mods/techpack/techpack_stairway/textures/techpack_stairway_lattice.png differ diff --git a/mods/techpack/techpack_stairway/textures/techpack_stairway_side.png b/mods/techpack/techpack_stairway/textures/techpack_stairway_side.png new file mode 100644 index 00000000..d28339ad Binary files /dev/null and b/mods/techpack/techpack_stairway/textures/techpack_stairway_side.png differ diff --git a/mods/techpack/techpack_stairway/textures/techpack_stairway_steps.png b/mods/techpack/techpack_stairway/textures/techpack_stairway_steps.png new file mode 100644 index 00000000..4c75c7a5 Binary files /dev/null and b/mods/techpack/techpack_stairway/textures/techpack_stairway_steps.png differ diff --git a/mods/techpack/techpack_warehouse/box_copper.lua b/mods/techpack/techpack_warehouse/box_copper.lua new file mode 100644 index 00000000..2683b1bd --- /dev/null +++ b/mods/techpack/techpack_warehouse/box_copper.lua @@ -0,0 +1,175 @@ +--[[ + + TechPack Warehouse + ================== + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + box_copper.lua + +]]-- + +--- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta +local wh = techpack_warehouse + +local NODE_NAME = "techpack_warehouse:box_copper" +local DESCRIPTION = "Warehouse Box Copper" +local INV_SIZE = 1200 +local BACKGROUND_IMG = "default_copper_block.png" + + +local Box = wh.Box:new({ + node_name = NODE_NAME, + description = DESCRIPTION, + inv_size = INV_SIZE, + background_img = BACKGROUND_IMG, +}) + +minetest.register_node(NODE_NAME, { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + return wh.after_place_node(Box, pos, placer, itemstack) + end, + on_receive_fields = function(pos, formname, fields, player) + wh.on_receive_fields(Box, pos, formname, fields, player) + end, + on_timer = function(pos,elapsed) + return wh.on_timer(Box, pos,elapsed) + end, + can_dig = function(pos) + return wh.can_dig(Box, pos) + end, + on_dig = function(pos, node, player) + wh.on_dig_node(Box, pos, node, player) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node(NODE_NAME.."_active", { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles_active(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + return wh.after_place_node(Box, pos, placer, itemstack) + end, + on_receive_fields = function(pos, formname, fields, player) + wh.on_receive_fields(Box, pos, formname, fields, player) + end, + on_timer = function(pos,elapsed) + return wh.on_timer(Box, pos,elapsed) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node(NODE_NAME.."_defect", { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles_defect(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + wh.after_place_node(Box, pos, placer, itemstack) + Box.State:defect(pos, M(pos)) + end, + can_dig = function(pos) + return wh.can_dig(Box, pos) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + wh.after_dig_node(Box, pos, oldnode, oldmetadata, digger) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +tubelib.register_node(NODE_NAME, + {NODE_NAME.."_active", NODE_NAME.."_defect"}, { + on_push_item = function(pos, side, item) + local meta = M(pos) + meta:set_string("push_dir", wh.Turn180[side]) + local num = wh.numbers_to_shift(Box, meta, item) + if num > 0 then + item:set_count(num) + return tubelib.put_item(meta, "shift", item) + end + return true + end, + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "main") + end, + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "main") + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "main", item) + end, + + on_recv_message = function(pos, topic, payload) + local resp = Box.State:on_receive_message(pos, topic, payload) + if resp then + return resp + elseif topic == "num_items" then + return wh.get_num_items(M(pos), payload) + else + return "unsupported" + end + end, + on_node_load = function(pos) + Box.State:on_node_load(pos) + end, + on_node_repair = function(pos) + return Box.State:on_node_repair(pos) + end, +}) + +minetest.register_craft({ + output = NODE_NAME, + recipe = { + {"default:copper_ingot", "tubelib:pusher", "default:copper_ingot"}, + {"default:copper_ingot", "tubelib_addons1:chest", "default:copper_ingot"}, + {"", "", ""}, + } +}) diff --git a/mods/techpack/techpack_warehouse/box_gold.lua b/mods/techpack/techpack_warehouse/box_gold.lua new file mode 100644 index 00000000..b6745c2f --- /dev/null +++ b/mods/techpack/techpack_warehouse/box_gold.lua @@ -0,0 +1,175 @@ +--[[ + + TechPack Warehouse + ================== + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + box_gold.lua + +]]-- + +--- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta +local wh = techpack_warehouse + +local NODE_NAME = "techpack_warehouse:box_gold" +local DESCRIPTION = "Warehouse Box Gold" +local INV_SIZE = 3600 +local BACKGROUND_IMG = "default_gold_block.png" + + +local Box = wh.Box:new({ + node_name = NODE_NAME, + description = DESCRIPTION, + inv_size = INV_SIZE, + background_img = BACKGROUND_IMG, +}) + +minetest.register_node(NODE_NAME, { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + return wh.after_place_node(Box, pos, placer, itemstack) + end, + on_receive_fields = function(pos, formname, fields, player) + wh.on_receive_fields(Box, pos, formname, fields, player) + end, + on_timer = function(pos,elapsed) + return wh.on_timer(Box, pos,elapsed) + end, + can_dig = function(pos) + return wh.can_dig(Box, pos) + end, + on_dig = function(pos, node, player) + wh.on_dig_node(Box, pos, node, player) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node(NODE_NAME.."_active", { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles_active(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + return wh.after_place_node(Box, pos, placer, itemstack) + end, + on_receive_fields = function(pos, formname, fields, player) + wh.on_receive_fields(Box, pos, formname, fields, player) + end, + on_timer = function(pos,elapsed) + return wh.on_timer(Box, pos,elapsed) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node(NODE_NAME.."_defect", { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles_defect(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + wh.after_place_node(Box, pos, placer, itemstack) + Box.State:defect(pos, M(pos)) + end, + can_dig = function(pos) + return wh.can_dig(Box, pos) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + wh.after_dig_node(Box, pos, oldnode, oldmetadata, digger) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +tubelib.register_node(NODE_NAME, + {NODE_NAME.."_active", NODE_NAME.."_defect"}, { + on_push_item = function(pos, side, item) + local meta = M(pos) + meta:set_string("push_dir", wh.Turn180[side]) + local num = wh.numbers_to_shift(Box, meta, item) + if num > 0 then + item:set_count(num) + return tubelib.put_item(meta, "shift", item) + end + return true + end, + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "main") + end, + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "main") + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "main", item) + end, + + on_recv_message = function(pos, topic, payload) + local resp = Box.State:on_receive_message(pos, topic, payload) + if resp then + return resp + elseif topic == "num_items" then + return wh.get_num_items(M(pos), payload) + else + return "unsupported" + end + end, + on_node_load = function(pos) + Box.State:on_node_load(pos) + end, + on_node_repair = function(pos) + return Box.State:on_node_repair(pos) + end, +}) + +minetest.register_craft({ + output = NODE_NAME, + recipe = { + {"default:gold_ingot", "tubelib:pusher", "default:gold_ingot"}, + {"default:gold_ingot", "tubelib_addons1:chest", "default:gold_ingot"}, + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + } +}) diff --git a/mods/techpack/techpack_warehouse/box_steel.lua b/mods/techpack/techpack_warehouse/box_steel.lua new file mode 100644 index 00000000..cf6f85a5 --- /dev/null +++ b/mods/techpack/techpack_warehouse/box_steel.lua @@ -0,0 +1,175 @@ +--[[ + + TechPack Warehouse + ================== + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + box_steel.lua + +]]-- + +--- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta +local wh = techpack_warehouse + +local NODE_NAME = "techpack_warehouse:box_steel" +local DESCRIPTION = "Warehouse Box Steel" +local INV_SIZE = 400 +local BACKGROUND_IMG = "default_steel_block.png" + + +local Box = wh.Box:new({ + node_name = NODE_NAME, + description = DESCRIPTION, + inv_size = INV_SIZE, + background_img = BACKGROUND_IMG, +}) + +minetest.register_node(NODE_NAME, { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + return wh.after_place_node(Box, pos, placer, itemstack) + end, + on_receive_fields = function(pos, formname, fields, player) + wh.on_receive_fields(Box, pos, formname, fields, player) + end, + on_timer = function(pos,elapsed) + return wh.on_timer(Box, pos,elapsed) + end, + can_dig = function(pos) + return wh.can_dig(Box, pos) + end, + on_dig = function(pos, node, player) + wh.on_dig_node(Box, pos, node, player) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node(NODE_NAME.."_active", { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles_active(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + return wh.after_place_node(Box, pos, placer, itemstack) + end, + on_receive_fields = function(pos, formname, fields, player) + wh.on_receive_fields(Box, pos, formname, fields, player) + end, + on_timer = function(pos,elapsed) + return wh.on_timer(Box, pos,elapsed) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node(NODE_NAME.."_defect", { + description = DESCRIPTION.." (8 x "..INV_SIZE.." items)", + tiles = wh.tiles_defect(BACKGROUND_IMG), + + after_place_node = function(pos, placer, itemstack) + wh.after_place_node(Box, pos, placer, itemstack) + Box.State:defect(pos, M(pos)) + end, + can_dig = function(pos) + return wh.can_dig(Box, pos) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) + wh.after_dig_node(Box, pos, oldnode, oldmetadata, digger) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + return wh.allow_metadata_inventory_put(Box, pos, listname, index, stack, player) + end, + on_metadata_inventory_put = wh.on_metadata_inventory_put, + allow_metadata_inventory_take = wh.allow_metadata_inventory_take, + allow_metadata_inventory_move = wh.allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +tubelib.register_node(NODE_NAME, + {NODE_NAME.."_active", NODE_NAME.."_defect"}, { + on_push_item = function(pos, side, item) + local meta = M(pos) + meta:set_string("push_dir", wh.Turn180[side]) + local num = wh.numbers_to_shift(Box, meta, item) + if num > 0 then + item:set_count(num) + return tubelib.put_item(meta, "shift", item) + end + return true + end, + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "main") + end, + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "main") + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "main", item) + end, + + on_recv_message = function(pos, topic, payload) + local resp = Box.State:on_receive_message(pos, topic, payload) + if resp then + return resp + elseif topic == "num_items" then + return wh.get_num_items(M(pos), payload) + else + return "unsupported" + end + end, + on_node_load = function(pos) + Box.State:on_node_load(pos) + end, + on_node_repair = function(pos) + return Box.State:on_node_repair(pos) + end, +}) + +minetest.register_craft({ + output = NODE_NAME, + recipe = { + {"default:steel_ingot", "tubelib:pusher", "default:steel_ingot"}, + {"", "tubelib_addons1:chest", ""}, + {"", "", ""}, + } +}) diff --git a/mods/techpack/techpack_warehouse/common.lua b/mods/techpack/techpack_warehouse/common.lua new file mode 100644 index 00000000..cfba34a5 --- /dev/null +++ b/mods/techpack/techpack_warehouse/common.lua @@ -0,0 +1,339 @@ +--[[ + + TechPack Warehouse + ================== + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + common.lua + +]]-- + +--- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 2 +local CYCLE_TIME = 2 + + +local Cache = {} + +techpack_warehouse.Box = {} +techpack_warehouse.Turn180 = {F="B", L="R", B="F", R="L", U="D", D="U"} + +local function formspec(self, pos, meta) + return "size[10,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "image_button[0,0;1,1;techpack_warehouse_arrow_inv.png;shift;;true;false;]".. + "list[context;shift;1,0;7,1;]".. + "image_button[9,0;1,1;techpack_warehouse_arrow_inv.png;shift;;true;false;]".. + "image_button[8,0;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + + "image_button[0,1.4;1,1;techpack_warehouse_filter_inv.png;filter;;true;false;]".. + "list[context;filter;1,1.4;8,1;]".. + "image_button[9,1.4;1,1;techpack_warehouse_filter_inv.png;filter;;true;false;]".. + + "image_button[0,2.5;1,1;techpack_warehouse_inventory_inv.png;storage;;true;false;]".. + "list[context;main;1,2.5;8,1;]".. + "image_button[9,2.5;1,1;techpack_warehouse_inventory_inv.png;storage;;true;false;]".. + + "image_button[0,3.6;1,1;techpack_warehouse_input_inv.png;input;;true;false;]".. + "list[context;input;1,3.6;8,1;]".. + "image_button[9,3.6;1,1;techpack_warehouse_input_inv.png;input;;true;false;]".. + + "tooltip[shift;Pass-through storage for unconfigured items (turn on/off)]".. + "tooltip[filter;Filter: To configure the 8 storages]".. + "tooltip[storage;Storage: All items will be stored here]".. + "tooltip[input;Input: Put items will be moved to the storage, if configured]".. + + "list[current_player;main;1,5.3;8,4;]".. + "listring[context;shift]".. + "listring[current_player;main]".. + "listring[context;input]" +end + +local function move_to_main(pos, index) + local inv = M(pos):get_inventory() + local main_stack = inv:get_stack("main", index) + local inp_stack = inv:get_stack("input", index) + + if inp_stack:get_name() ~= "" then + local stack = ItemStack(inp_stack:get_name()) + stack:set_count(inp_stack:get_count() + main_stack:get_count()) + inp_stack:clear() + + inv:set_stack("main", index, stack) + inv:set_stack("input", index, inp_stack) + end +end + +local function move_to_player_inv(player_name, pos, index) + local node_inv = M(pos):get_inventory() + local main_stack = node_inv:get_stack("main", index) + local player_inv = minetest.get_inventory({type="player", name=player_name}) + local num = main_stack:get_count() + if num > 99 then + num = 99 + end + local leftover = player_inv:add_item("main", ItemStack(main_stack:get_name().." "..num)) + main_stack:set_count(main_stack:get_count() - num + leftover:get_count()) + node_inv:set_stack("main", index, main_stack) +end + +function techpack_warehouse.tiles(background_img) + return { + -- up, down, right, left, back, front + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + background_img..'^techpack_warehouse_box_side.png', + background_img..'^techpack_warehouse_box_side.png', + background_img..'^techpack_warehouse_box_back.png', + background_img..'^techpack_warehouse_box_front.png', + } +end + +function techpack_warehouse.tiles_active(background_img) + return { + -- up, down, right, left, back, front + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + background_img..'^techpack_warehouse_box_side.png', + background_img..'^techpack_warehouse_box_side.png', + background_img..'^techpack_warehouse_box_back.png', + background_img..'^techpack_warehouse_box_front.png', + } +end + +function techpack_warehouse.tiles_defect(background_img) + return { + -- up, down, right, left, back, front + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + background_img..'^techpack_warehouse_box_side.png^tubelib_defect.png', + background_img..'^techpack_warehouse_box_side.png^tubelib_defect.png', + background_img..'^techpack_warehouse_box_back.png^tubelib_defect.png', + background_img..'^techpack_warehouse_box_front.png^tubelib_defect.png', + } +end + + + +function techpack_warehouse.Box:new(attr) + local o = { + node_name = attr.node_name, + description = attr.description, + inv_size = attr.inv_size, + background_img = attr.background_img, + } + o.State = tubelib.NodeStates:new({ + node_name_passive = attr.node_name, + node_name_active = attr.node_name.."_active", + node_name_defect = attr.node_name.."_defect", + infotext_name = attr.description, + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 50, + formspec_func = formspec, + }) + setmetatable(o, self) + self.__index = self + return o +end + +function techpack_warehouse.numbers_to_shift(self, meta, item) + -- check cache + local number = meta:get_string("tubelib_number") + local item_name = item:get_name() + if not Cache[number] then + local inv = meta:get_inventory() + Cache[number] = {} + for idx,items in ipairs(inv:get_list("filter")) do + Cache[number][idx] = items:get_name() + end + end + + -- determine number to shift + local num_items = item:get_count() + local inv_size = meta:get_int("inv_size") + local inv = meta:get_inventory() + + for idx, name in ipairs(Cache[number]) do + if item_name == name then + local stack_size = inv:get_stack("main", idx):get_count() + if stack_size == self.inv_size then -- full? + Cache[number][idx] = "" -- delete for searching + elseif (stack_size + num_items) > self.inv_size then -- limit will be reached? + inv:set_stack("main", idx, ItemStack({name = item_name, count = self.inv_size})) + Cache[number][idx] = "" -- delete for searching + -- search with the rest for further slots + num_items = num_items - (self.inv_size - stack_size) + else + inv:set_stack("main", idx, ItemStack({name = item_name, count = stack_size + num_items})) + return 0 + end + end + end + return num_items +end + +function techpack_warehouse.allow_metadata_inventory_put(self, pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + elseif stack:get_wear() ~= 0 then + return 0 + elseif stack:get_stack_max() == 1 then + return 0 + end + local inv = M(pos):get_inventory() + local main_stack = inv:get_stack("main", index) + local item_name = inv:get_stack("filter", index):get_name() + if listname == "input" and item_name == stack:get_name() then + return math.min(stack:get_count(), self.inv_size - main_stack:get_count()) + elseif listname == "filter" and item_name == main_stack:get_name() then + local number = M(pos):get_string("tubelib_number") + Cache[number] = nil + return 1 + elseif listname == "shift" then + return stack:get_count() + end + return 0 +end + +function techpack_warehouse.on_metadata_inventory_put(pos, listname, index, stack, player) + if listname == "input" then + local number = M(pos):get_string("tubelib_number") + Cache[number] = nil + minetest.after(0.5, move_to_main, pos, index) + end +end + +function techpack_warehouse.allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local inv = M(pos):get_inventory() + local main_stack = inv:get_stack("main", index) + local number = M(pos):get_string("tubelib_number") + if listname == "main" then + Cache[number] = nil + minetest.after(0.1, move_to_player_inv, player:get_player_name(), pos, index) + return 0 + elseif listname == "filter" and main_stack:is_empty() then + Cache[number] = nil + return 1 + elseif listname == "shift" then + Cache[number] = nil + return stack:get_count() + end + return 0 +end + +function techpack_warehouse.allow_metadata_inventory_move(pos, listname, index, stack, player) + return 0 +end + +function techpack_warehouse.on_receive_fields(self, pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local number = M(pos):get_string("tubelib_number") + Cache[number] = nil + self.State:state_button_event(pos, fields) +end + +function techpack_warehouse.after_place_node(self, pos, placer, itemstack) + local meta = M(pos) + local number = tubelib.add_node(pos, self.node_name) + self.State:node_init(pos, number) + meta:set_string("player_name", placer:get_player_name()) + local inv = meta:get_inventory() + inv:set_size('shift', 7) + inv:set_size('filter', 8) + inv:set_size('main', 8) + inv:set_size('input', 8) +end + +function techpack_warehouse.on_timer(self, pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + local inv = meta:get_inventory() + if not inv:is_empty("shift") then + --local number = meta:get_string("tubelib_number") + local player_name = meta:get_string("player_name") + local offs = meta:get_int("offs") + local push_dir = meta:get_string("push_dir") + if push_dir == "" then push_dir = "L" end + meta:set_int("offs", offs + 1) + for i = 0,7 do + local idx = ((i + offs) % 8) + 1 + local stack = inv:get_stack("shift", idx) + if stack:get_count() > 0 then + if tubelib.push_items(pos, push_dir, stack, player_name) then + -- The effort is needed here for the case the + -- pusher pushes into its own chest. + local num = stack:get_count() + stack = inv:get_stack("shift", idx) + stack:take_item(num) + inv:set_stack("shift", idx, stack) + self.State:keep_running(pos, meta, COUNTDOWN_TICKS) + break + else + self.State:blocked(pos, meta) + end + end + end + else + self.State:idle(pos, meta) + end + + return self.State:is_active(meta) + end + return false +end + +function techpack_warehouse.can_dig(self, pos) + local inv = M(pos):get_inventory() + return inv:is_empty("main") and inv:is_empty("shift") +end + +function techpack_warehouse.on_dig_node(self, pos, node, digger) + tubelib.remove_node(pos) + if node.name == self.node_name then -- not for defect nodes + self.State:on_dig_node(pos, node, digger) + end +end + +function techpack_warehouse.get_num_items(meta, index) + index = index and tonumber(index) + if index < 1 then index = 1 end + if index > 8 then index = 8 end + local inv = meta:get_inventory() + return inv:get_stack("main", index):get_count() +end diff --git a/mods/techpack/techpack_warehouse/depends.txt b/mods/techpack/techpack_warehouse/depends.txt new file mode 100644 index 00000000..ea2f0c22 --- /dev/null +++ b/mods/techpack/techpack_warehouse/depends.txt @@ -0,0 +1,3 @@ +tubelib +tubelib_addons1 + diff --git a/mods/techpack/techpack_warehouse/description.txt b/mods/techpack/techpack_warehouse/description.txt new file mode 100644 index 00000000..8c2eaac1 --- /dev/null +++ b/mods/techpack/techpack_warehouse/description.txt @@ -0,0 +1,2 @@ +Warehouse boxes + diff --git a/mods/techpack/techpack_warehouse/init.lua b/mods/techpack/techpack_warehouse/init.lua new file mode 100644 index 00000000..2dac8a47 --- /dev/null +++ b/mods/techpack/techpack_warehouse/init.lua @@ -0,0 +1,20 @@ +--[[ + + TechPack Warehouse + ================== + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + init.lua + +]]-- + +techpack_warehouse = {} + +dofile(minetest.get_modpath("techpack_warehouse") .. "/common.lua") +dofile(minetest.get_modpath("techpack_warehouse") .. "/box_steel.lua") +dofile(minetest.get_modpath("techpack_warehouse") .. "/box_copper.lua") +dofile(minetest.get_modpath("techpack_warehouse") .. "/box_gold.lua") diff --git a/mods/techpack/techpack_warehouse/mod.conf b/mods/techpack/techpack_warehouse/mod.conf new file mode 100644 index 00000000..66b5b1ae --- /dev/null +++ b/mods/techpack/techpack_warehouse/mod.conf @@ -0,0 +1,3 @@ +name=techpack_warehouse +description=Warehouse boxes +depends=tubelib,tubelib_addons1 diff --git a/mods/techpack/techpack_warehouse/textures/techpack_warehouse_arrow_inv.png b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_arrow_inv.png new file mode 100644 index 00000000..e2fdcb83 Binary files /dev/null and b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_arrow_inv.png differ diff --git a/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_back.png b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_back.png new file mode 100644 index 00000000..067d9e60 Binary files /dev/null and b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_back.png differ diff --git a/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_front.png b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_front.png new file mode 100644 index 00000000..fc1cef23 Binary files /dev/null and b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_front.png differ diff --git a/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_side.png b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_side.png new file mode 100644 index 00000000..f80246f7 Binary files /dev/null and b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_box_side.png differ diff --git a/mods/techpack/techpack_warehouse/textures/techpack_warehouse_filter_inv.png b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_filter_inv.png new file mode 100644 index 00000000..7b99c932 Binary files /dev/null and b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_filter_inv.png differ diff --git a/mods/techpack/techpack_warehouse/textures/techpack_warehouse_input_inv.png b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_input_inv.png new file mode 100644 index 00000000..e0df9fe1 Binary files /dev/null and b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_input_inv.png differ diff --git a/mods/techpack/techpack_warehouse/textures/techpack_warehouse_inventory_inv.png b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_inventory_inv.png new file mode 100644 index 00000000..721a8604 Binary files /dev/null and b/mods/techpack/techpack_warehouse/textures/techpack_warehouse_inventory_inv.png differ diff --git a/mods/techpack/tubelib/README.md b/mods/techpack/tubelib/README.md new file mode 100644 index 00000000..4cc0304b --- /dev/null +++ b/mods/techpack/tubelib/README.md @@ -0,0 +1,39 @@ +# Tube Library + +Minetest Tube Mod for item exchange via lumber tubes and wireless message communication between nodes. + +The focus for this Mod are: +- minimized server load and thus minimized server lags +- simple and intuitive usage for players +- simple API for programmers + +The mod provides: +- lumber tubes to connect 2 nodes +- a Pusher node to pull/push items through tubes +- a Distributor node with 4 output channels to sort incoming items +- a Blackhole node which lets all items disappear (example/template for programmers) +- a Button/switch node to send "switch on/off" messages +- a Lamp node as receiving example for message communication +- support for default node: furnace and chests + +Hints for Admins: ![manual.md](https://github.com/joe7575/Minetest-Tubelib/blob/master/manual.md) +Programmers Manual: ![api.md](https://github.com/joe7575/Minetest-Tubelib/blob/master/api.md) + +This mod is part of the ModPack ![TechPack](https://github.com/joe7575/techpack) +A Tutorial to this Mod is available as ![TechPack Wiki](https://github.com/joe7575/techpack/wiki) + +Browse on: ![GitHub](https://github.com/joe7575/Minetest-Tubelib) + +Download: ![GitHub](https://github.com/joe7575/Minetest-Tubelib/archive/master.zip) + + +## Dependencies +default +tubelib2 +basic_materials + + +# License +Copyright (C) 2017-2018 Joachim Stolberg +Code: Licensed under the GNU LGPL version 2.1 or later. See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt +Textures: CC0 diff --git a/mods/techpack/tubelib/api.md b/mods/techpack/tubelib/api.md new file mode 100644 index 00000000..350bb3fe --- /dev/null +++ b/mods/techpack/tubelib/api.md @@ -0,0 +1,283 @@ +# Tubelib Programmers Interface + + +Tubelib supports: +- StackItem exchange via tubes and +- wireless data communication between nodes. + + + +## 1. StackItem Exchange + +Tubes represent connections between two nodes, so that it is irrelevant +if the receiving node is nearby, or far away connected via tubes. +The length of the tube is limited to 100 nodes. + +For StackItem exchange we have to distinguish the following roles: +- client: An active node calling push/pull functions +- server: A passive node typically with inventory, which will be called + +Client and server API use the following special parameters: + +- `side` the contact side where the items shall be pulled out or pushed in. + This is one of B(ack), R(ight), F(ront), L(eft), D(own), U(p) according to the + following diagram (view onto the placed node). It can be used to separate + incoming items for different inventories. + +``` + Up Back + | / + | / + +--|-----+ + / o /| + +--------+ | + Left ----| |o---- Right + | o | | + | / | + + | / |/ + +-/------+ + / | + Front | + | + Down +``` + +- `player_name`: Normally the name of the player, who placed the pushing node. + But this could also be used to identify the player interacting with the + pushing node. + +The use of both parameters on server side is not required. See chap. 4 for an example +of an inventory node. + + + +## 2. Data communication + +For the data communication an addressing method based on node numbers is used. +Each registered node gets a unique node number with 4 figures (or more if needed). +The numbers are stored in a storage list. That means, a new node, placed on +the same position gets the same node number as the previously placed node on that +position. + +The communication supports two services: +- `send_message`: Send a message to one or more nodes without response +- `send_request`: Send a messages to exactly one node and return the response + +It is up to the programmer, which messages shall be supported. +But if a node can be switched on/off or started/stopped, use "on" and "off" as commands +for both cases. + + + +## 3. API Functions + + +### Register, Add, Remove Nodes + +Before a node can take part on the item exchange via tubes or data communication, +it has to be registered once. + +```LUA + tubelib.register_node(name, add_names, node_definition) +``` +Call this function only at load time! +Parameters: +- name: The node name like "tubelib:pusher" +- add_names: A table with additional node names if needed, e.g.: "tubelib:pusher_active" +- node_definition: A table with the server callback functions according to: + +```LUA + { + on_pull_item = func(pos, side, player_name), + -- Pull an item from the node inventory. + -- The function shall return an item stack with one element + -- like ItemStack("default:cobble") or nil. + -- Param side: The node contact side, where the item shall be pulled out. + -- Param player_name: Can be used to check access rights. + + on_push_item = func(pos, side, item, player_name), + -- Push the given item into the node inventory. + -- Param side: The node contact side, where the item shall be pushed in. + -- Param player_name: Can be used to check access rights. + -- The function shall return true if successful, or false if not. + + on_unpull_item = func(pos, side, item, player_name), + -- Undo the previous pull and place the given item back into the inventory. + -- Param side: The node contact side, where the item shall be unpulled. + -- Param player_name: Can be used to check access rights. + -- The function shall return true if successful, or false if not. + + on_recv_message = func(pos, topic, payload), + -- Execute the requested message + -- Param topic: A topic string like "on" + -- Param payload: Additional data for more come complex commands, + -- payload can be a number, string, or table. + -- The function shall return true/false for commands like on/off + -- or return the requested data for commands like a "state" request. + } +``` + +**Each node has to call:** + +```LUA + tubelib.add_node(pos, name) +``` +`add_node` shall be called when the node is placed. +The function is used to register the nodes position for the communication node +number and to update the tube surrounding. +`pos` the node position, `name` is the node name. + + + +```LUA + tubelib.remove_node(pos) +``` +'remove_node' shall be called then the node is dig. +The function is used to remove the node number from the internal list. + + + +### Item Exchange via Tubes + +For item exchange as a pushing/pulling node the following functions exist: + +```LUA + tubelib.pull_items(pos, side, player_name) +``` +Pull one item from the given position specified by `pos` and `side`. +Parameters: +- `pos` is the own node position +- `side` is the contact side, where the item shall be pulled in +- `player_name` can be used to check access rights. +- The function returns an item stack with one element like ItemStack("default:cobble") or nil. + + +```LUA + tubelib.push_items(pos, side, items, player_name) +``` +Push one item to the given position specified by `pos` and `side`. +Parameters: +- `pos` is the own node position +- `side` is the contact side, where the item shall be pushed out +- `item` is an item stack with one element like ItemStack("default:cobble") +- `player_name` can be used to check access rights. +The function returns true if successful, or false if not. + + + +```LUA + tubelib.unpull_items(pos, side, items, player_name)` +``` +Undo the previous pull and place the item back into the inventory. +Parameters: +- `pos` is the own node position +- `side` id the node contact side, where the item shall be unpulled +- `player_name` can be used to check access rights. +The function returns true if successful, or false if not. + + + +### Wireless Data Communication + +For data communication the following functions exist: + +```LUA + tubelib.send_message(numbers, placer_name, clicker_name, topic, payload) +``` +Send a message to all nodes referenced by `numbers`, a string with +one or more destination node numbers separated by blanks. +The message is based on a topic string (e.g. "start") and +a topic related payload. +The placer and clicker names are needed to check the protection rights. +`placer_name` is the name of the player, who places the node. +`clicker_name` is the name of the player, who uses the node. +`placer_name` of sending and receiving nodes have to be the same. +If every player should be able to send a message, use nil for `clicker_name`. +Because several nodes could be addressed, the function don't return any response. + + +```LUA + tubelib.send_request(number, topic, payload) +``` +In contrast to `send_message` this functions send a message to exactly one node +referenced by `number` and returns the node response. +The message is based on the topic string (e.g. "state") and +topic related payload. + + +## 4. Code Snippets + +### Register Node (from 'legacy_nodes.lua') + +```LUA + tubelib.register_node("default:chest", {"default:chest_open"}, { + on_pull_item = function(pos, side, player_name) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_push_item = function(pos, side, item, player_name) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + on_unpull_item = function(pos, side, item, player_name) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + }) +``` + + +### Add/remove node (from 'lamp.lua') + +```LUA + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib:lamp") + ... + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, +``` + +### Item exchange via tubes (from 'pusher.lua') + +```LUA + local items = tubelib.pull_items(pos, "L", player_name) + if items ~= nil then + if tubelib.push_items(pos, "R", items, player_name) == false then + tubelib.unpull_items(pos, "L", items, player_name) + end + end +``` + +### Message communication (from 'button.lua') + +```LUA + local number = meta:get_string("number") + local placer_name = meta:get_string("placer_name") + tubelib.send_message(number, placer_name, nil, "stop", nil) +``` + +### 5. Example Code + +Tubelib includes the following example nodes which can be used for study +and as templates for own projects: + +- pusher.lua: a simple client pushing/pulling items +- blackhole.lua: a simple server client, makes all items disappear +- button.lua: a simple communication node, only sending messages +- lamp.lua: a simple communication node, only receiving messages + + +## 6. Further information + +The complete functionality is implemented in the file +![command.lua](https://github.com/joe7575/techpack/blob/master/tubelib/command.lua). +This file has further helper functions and is recommended for deeper study. + +## 7. History + +2017-10-02 First draft +2017-10-29 Commands start/stop replaced by on/off +2018-03-31 Corrections for 'send_request' and 'add_node' diff --git a/mods/techpack/tubelib/basalt.lua b/mods/techpack/tubelib/basalt.lua new file mode 100644 index 00000000..f2c4a18d --- /dev/null +++ b/mods/techpack/tubelib/basalt.lua @@ -0,0 +1,68 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + basalt.lua: + +]]-- + +if tubelib.basalt_stone_enabled then + -- Replace default:stone with tubelib:basalt which is useless for ore generation. + default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + minetest.set_node(pos, {name = "default:obsidian"}) + else -- Lava flowing + minetest.set_node(pos, {name = "tubelib:basalt_stone"}) + end + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.25}) + end + + minetest.register_node("tubelib:basalt_stone", { + description = "Basalt Stone", + tiles = {"default_stone.png^[brighten"}, + groups = {cracky = 3, stone = 1}, + drop = "default:silver_sand", + sounds = default.node_sound_stone_defaults(), + }) + minetest.register_node("tubelib:basalt_stone_brick", { + description = "Basalt Stone Brick", + paramtype2 = "facedir", + place_param2 = 0, + tiles = {"default_stone_brick.png^[brighten"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_node("tubelib:basalt_stone_block", { + description = "Basalt Stone Block", + tiles = {"default_stone_block.png^[brighten"}, + is_ground_content = false, + groups = {cracky = 2, stone = 1}, + sounds = default.node_sound_stone_defaults(), + }) + + minetest.register_craft({ + output = "tubelib:basalt_stone_brick 4", + recipe = { + {"tubelib:basalt_stone", "tubelib:basalt_stone"}, + {"tubelib:basalt_stone", "tubelib:basalt_stone"}, + } + }) + + minetest.register_craft({ + output = "tubelib:basalt_stone_block 9", + recipe = { + {"tubelib:basalt_stone", "tubelib:basalt_stone", "tubelib:basalt_stone"}, + {"tubelib:basalt_stone", "tubelib:basalt_stone", "tubelib:basalt_stone"}, + {"tubelib:basalt_stone", "tubelib:basalt_stone", "tubelib:basalt_stone"}, + } + }) +end diff --git a/mods/techpack/tubelib/blackhole.lua b/mods/techpack/tubelib/blackhole.lua new file mode 100644 index 00000000..baef64fd --- /dev/null +++ b/mods/techpack/tubelib/blackhole.lua @@ -0,0 +1,98 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + blackhole.lua: + + Simple node which lets all items disappear. + The blackhole supports the following message: + - topic = "status", payload = nil, + response is the number of disappeared items (0..n) +]]-- + +-- +--------+ +-- / /| +-- +--------+ | +-- IN (L) -->| BLACK | | +-- | HOLE | + +-- | |/ +-- +--------+ + + +minetest.register_node("tubelib:blackhole", { + description = "Tubelib Black Hole", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_black_hole.png', + 'tubelib_black_hole_inp.png', + "tubelib_black_hole.png", + "tubelib_black_hole.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib:blackhole") -- <<=== tubelib + meta:set_string("number", number) + meta:set_int("disappeared", 0) + meta:set_string("infotext","0 items disappeared") + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) -- <<=== tubelib + end, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + + +minetest.register_craft({ + output = "tubelib:blackhole 2", + recipe = { + {"group:wood", "", "group:wood"}, + {"tubelib:tubeS", "default:coal_lump", "default:coal_lump"}, + {"group:wood", "", "group:wood"}, + }, +}) + +--------------------------------------------------------------- tubelib +tubelib.register_node("tubelib:blackhole", {}, { + on_pull_item = nil, -- not needed + on_unpull_item = nil, -- not needed + + on_push_item = function(pos, side, item) + if side == "L" then + local meta = minetest.get_meta(pos) + local disappeared = meta:get_int("disappeared") + item:get_count() + meta:set_int("disappeared", disappeared) + meta:set_string("infotext", disappeared.." items disappeared") + return true + end + return false + end, + + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "state" then + local meta = minetest.get_meta(pos) + return meta:get_int("disappeared") + else + return "not supported" + end + end, +}) +--------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib/button.lua b/mods/techpack/tubelib/button.lua new file mode 100644 index 00000000..1d5225ba --- /dev/null +++ b/mods/techpack/tubelib/button.lua @@ -0,0 +1,184 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + button.lua: + + Example of a simple communication node, only sending messages to other nodes. + +]]-- + + +local function switch_on(pos, node) + if tubelib.data_not_corrupted(pos) then + node.name = "tubelib:button_active" + minetest.swap_node(pos, node) + minetest.sound_play("button", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) + local meta = minetest.get_meta(pos) + local own_num = meta:get_string("own_num") + local numbers = meta:get_string("numbers") + local cycle_time = meta:get_int("cycle_time") + if cycle_time > 0 then -- button mode? + minetest.get_node_timer(pos):start(cycle_time) + end + local placer_name = meta:get_string("placer_name") + local clicker_name = nil + if meta:get_string("public") == "false" then + clicker_name = meta:get_string("clicker_name") + end + tubelib.send_message(numbers, placer_name, clicker_name, "on", own_num) -- <<=== tubelib + end +end + +local function switch_off(pos) + if tubelib.data_not_corrupted(pos) then + local node = minetest.get_node(pos) + node.name = "tubelib:button" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):stop() + minetest.sound_play("button", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) + local meta = minetest.get_meta(pos) + local own_num = meta:get_string("own_num") + local numbers = meta:get_string("numbers") + local placer_name = meta:get_string("placer_name") + local clicker_name = nil + if meta:get_string("public") == "false" then + clicker_name = meta:get_string("clicker_name") + end + tubelib.send_message(numbers, placer_name, clicker_name, "off", own_num) -- <<=== tubelib + end +end + + +minetest.register_node("tubelib:button", { + description = "Tubelib Button/Switch", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_button.png', + 'tubelib_button.png', + 'tubelib_button.png', + 'tubelib_button.png', + "tubelib_button_off.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_num = tubelib.add_node(pos, "tubelib:button") + meta:set_string("own_num", own_num) + meta:set_string("formspec", "size[7.5,6]".. + "dropdown[0.2,0;3;type;switch,button 2s,button 4s,button 8s,button 16s;1]".. + "field[0.5,2;7,1;numbers;Insert destination node number(s);]" .. + "checkbox[1,3;public;public;false]".. + "button_exit[2,4;3,1;exit;Save]") + meta:set_string("placer_name", placer:get_player_name()) + meta:set_string("public", "false") + meta:set_int("cycle_time", 0) + meta:set_string("infotext", "Tubelib Button "..own_num) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if tubelib.check_numbers(fields.numbers) then -- <<=== tubelib + meta:set_string("numbers", fields.numbers) + local own_num = meta:get_string("own_num") + meta:set_string("infotext", "Tubelib Button "..own_num..", connected with block "..fields.numbers) + else + return + end + if fields.public then + meta:set_string("public", fields.public) + end + local cycle_time = nil + if fields.type == "switch" then + cycle_time = 0 + elseif fields.type == "button 2s" then + cycle_time = 2 + elseif fields.type == "button 4s" then + cycle_time = 4 + elseif fields.type == "button 8s" then + cycle_time = 8 + elseif fields.type == "button 16s" then + cycle_time = 16 + end + if cycle_time ~= nil then + meta:set_int("cycle_time", cycle_time) + end + if fields.exit then + meta:set_string("formspec", nil) + end + end, + + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if meta:get_string("numbers") ~= "" and meta:get_string("numbers") ~= nil then + meta:set_string("clicker_name", clicker:get_player_name()) + switch_on(pos, node) + end + end, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib:button_active", { + description = "Tubelib Button/Switch", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_button.png', + 'tubelib_button.png', + 'tubelib_button.png', + 'tubelib_button.png', + "tubelib_button_on.png", + }, + + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + meta:set_string("clicker_name", clicker:get_player_name()) + if meta:get_int("cycle_time") == nil or meta:get_int("cycle_time") == 0 then + switch_off(pos, node) + end + end, + + on_timer = switch_off, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + drop = "tubelib:button", +}) + +minetest.register_craft({ + output = "tubelib:button", + recipe = { + {"", "group:wood", ""}, + {"default:glass", "tubelib:wlanchip", ""}, + {"", "group:wood", ""}, + }, +}) + diff --git a/mods/techpack/tubelib/command.lua b/mods/techpack/tubelib/command.lua new file mode 100644 index 00000000..c735b31e --- /dev/null +++ b/mods/techpack/tubelib/command.lua @@ -0,0 +1,693 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + command.lua: + + See [api.md] for the interface documentation + +]]-- + +--- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local function deserialize(s) + local tbl = {} + for line in s:gmatch("[^;]+") do + local num, spos = unpack(string.split(line, "=")) + tbl[num] = {pos = minetest.string_to_pos(spos)} + end + return tbl +end + +local function serialize(data) + local tbl = {} + for k,v in pairs(data) do + tbl[#tbl+1] = k.."="..minetest.pos_to_string(v.pos) + end + return table.concat(tbl, ";") +end + +-- to convert the data base from v2 to v3 +local function extract_data(data) + local tbl = {} + for num,item in pairs(data) do + local new_item = {} + local data_present = false + for k,v in pairs(item) do + if k ~= "name" and k ~= "pos" then + new_item[k] = v + data_present = true + end + end + if data_present then + tbl[num] = new_item + end + end + return tbl +end + +------------------------------------------------------------------ +-- Data base storage +------------------------------------------------------------------- +local storage = minetest.get_mod_storage() +local NextNumber = minetest.deserialize(storage:get_string("NextNumber")) or 1 +local Version = minetest.deserialize(storage:get_string("Version")) or 1 + +local Number2Pos +local Number2Data +local TemporaryRemovedNodes +if Version == 2 then -- legacy data base + Number2Pos = minetest.deserialize(storage:get_string("Number2Pos")) or {} + Number2Data = extract_data(Number2Pos) + TemporaryRemovedNodes = {} + Version = 3 +else + Number2Pos = deserialize(storage:get_string("Number2Pos")) + Number2Data = minetest.deserialize(storage:get_string("Number2Data")) or {} + TemporaryRemovedNodes = minetest.deserialize(storage:get_string("TemporaryRemovedNodes")) or {} +end + + + +local function update_mod_storage() + local t = minetest.get_us_time() + minetest.log("action", "[Tubelib] Store data...") + storage:set_string("NextNumber", minetest.serialize(NextNumber)) + storage:set_string("Version", minetest.serialize(Version)) + storage:set_string("Number2Pos", serialize(Number2Pos)) + storage:set_string("Number2Data", minetest.serialize(Number2Data)) + storage:set_string("TemporaryRemovedNodes", minetest.serialize(TemporaryRemovedNodes)) + -- store data each hour + minetest.after(60*59, update_mod_storage) + t = minetest.get_us_time() - t + minetest.log("action", "[Tubelib] Data stored. t="..t.."us") +end + +minetest.register_on_shutdown(function() + update_mod_storage() +end) + +-- store data after one hour +minetest.after(60*59, update_mod_storage) + +-- Key2Number will be generated at runtine +local Key2Number = {} + +local Name2Name = {} -- translation table + +------------------------------------------------------------------- +-- Local helper functions +------------------------------------------------------------------- + +-- Localize functions to avoid table lookups (better performance). +local string_find = string.find +local string_split = string.split +local tubelib_NodeDef = tubelib.NodeDef +local Tube = tubelib.Tube + +-- Generate a key string based on the given pos table, +-- Used internaly as table key, +local function get_key_str(pos) + pos = minetest.pos_to_string(pos) + return string.sub(pos, 2, -2) +end + +-- Determine position related node number for addressing purposes +local function get_number(pos) + local key = get_key_str(pos) + if not Key2Number[key] then + Key2Number[key] = NextNumber + NextNumber = NextNumber + 1 + end + return string.format("%.04u", Key2Number[key]) +end + +local function get_node_lvm(pos) + local node = minetest.get_node_or_nil(pos) + if node then + return node + end + local vm = minetest.get_voxel_manip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local param2_data = vm:get_param2_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local idx = area:index(pos.x, pos.y, pos.z) + node = { + name = minetest.get_name_from_content_id(data[idx]), + param2 = param2_data[idx] + } + return node +end + +local function generate_Key2Number() + local key + for num,item in pairs(Number2Pos) do + key = get_key_str(item.pos) + Key2Number[key] = num + end +end + +local function not_protected(pos, placer_name, clicker_name) + local meta = minetest.get_meta(pos) + if meta then + local cached_name = meta:get_string("tubelib_cached_name") + if placer_name and (placer_name == cached_name or not minetest.is_protected(pos, placer_name)) then + meta:set_string("tubelib_cached_name", placer_name) + if clicker_name == nil or not minetest.is_protected(pos, clicker_name) then + return true + end + end + end + return false +end + +local function register_lbm(name, nodenames) + minetest.register_lbm({ + label = "[Tubelib] Node update", + name = name.."update", + nodenames = nodenames, + run_at_every_load = true, + action = function(pos, node) + local name = Name2Name[node.name] + if tubelib_NodeDef[name] and tubelib_NodeDef[name].on_node_load then + tubelib_NodeDef[name].on_node_load(pos) + end + end + }) +end + + +local DirToSide = {"B", "R", "F", "L", "D", "U"} + +local function dir_to_side(dir, param2) + if dir < 5 then + dir = (((dir - 1) - (param2 % 4)) % 4) + 1 + end + return DirToSide[dir] +end + +local SideToDir = {B=1, R=2, F=3, L=4, D=5, U=6} + +local function side_to_dir(side, param2) + local dir = SideToDir[side] + if dir < 5 then + dir = (((dir - 1) + (param2 % 4)) % 4) + 1 + end + return dir +end + +local function get_dest_node(pos, side) + local _,node = Tube:get_node(pos) + local dir = side_to_dir(side, node.param2) + local spos, sdir = Tube:get_connected_node_pos(pos, dir) + if not (spos and sdir) then return end + _,node = Tube:get_node(spos) + local out_side = dir_to_side(tubelib2.Turn180Deg[sdir], node.param2) + return spos, out_side, Name2Name[node.name] or node.name +end + +local function item_handling_node(name) + local node_def = name and tubelib_NodeDef[name] + if node_def then + return node_def.on_pull_item or node_def.on_push_item or node_def.is_pusher + end +end + +------------------------------------------------------------------- +-- API helper functions +------------------------------------------------------------------- + +-- Check the given list of numbers. +-- Returns true if number(s) is/are valid and point to real nodes. +function tubelib.check_numbers(numbers) + if numbers then + for _,num in ipairs(string_split(numbers, " ")) do + if Number2Pos[num] == nil then + return false + end + end + return true + end + return false +end + +-- Function returns { pos, name } for the node on the given position number. +function tubelib.get_node_info(dest_num) + if Number2Pos[dest_num] then + return Number2Pos[dest_num] + end + return nil +end + +-- Function returns the node number from the given position or +-- nil, if no node number for this position is assigned. +function tubelib.get_node_number(pos) + local key = get_key_str(pos) + local num = Key2Number[key] + if num then + num = string.format("%.04u", num) + if Number2Pos[num] and Number2Pos[num].name then + return num + end + end + return nil +end + +-- Function is used for available nodes with lost numbers, only. +function tubelib.get_new_number(pos, name) + -- store position + local number = get_number(pos) + Number2Pos[number] = { + pos = pos, + name = name, + } + return number +end + + +-- Store any node number related, additional data +-- param number: node number, returned by tubelib.add_node +-- param name: name of the data (string) +-- param data: any data (number, string, table) +function tubelib.set_data(number, name, data) + Number2Data[number] = Number2Data[number] or {} + if type(name) == "string" then + Number2Data[number]["u_"..name] = data + end +end + +-- Read node number related data +-- param number: node number, returned by tubelib.add_node +-- param name: name of the data (string) +function tubelib.get_data(number, name) + if Number2Data[number] and type(name) == "string" then + return Number2Data[number]["u_"..name] + end + return nil +end + +------------------------------------------------------------------- +-- Node construction/destruction functions +------------------------------------------------------------------- + +-- Add node to the tubelib lists. +-- Function determines and returns the node position number, +-- needed for message communication. +function tubelib.add_node(pos, name) + if item_handling_node(name) then + Tube:after_place_node(pos) + end + -- store position + local number = get_number(pos) + Number2Pos[number] = { + pos = pos, + name = name, + } + return number +end + +-- Function removes the node from the tubelib lists. +function tubelib.remove_node(pos) + local number = get_number(pos) + local name + if Number2Pos[number] then + name = Number2Pos[number].name + Number2Pos[number] = { + pos = pos, + name = nil, + time = minetest.get_day_count() -- used for reservation timeout + } + end + if item_handling_node(name) then + Tube:after_dig_node(pos) + end +end + + +------------------------------------------------------------------- +-- Node register function +------------------------------------------------------------------- + +-- Register node for tubelib communication +-- Call this function only at load time! +-- Param name: The node name like "tubelib:pusher" +-- Param add_names: Alternativ node names if needded, e.g.: "tubelib:pusher_active" +-- Param node_definition: A table according to: +-- { +-- on_pull_item = func(pos, side, player_name), +-- on_push_item = func(pos, side, item, player_name), +-- on_unpull_item = func(pos, side, item, player_name), +-- on_recv_message = func(pos, topic, payload), +-- on_node_load = func(pos), -- LBM function +-- on_node_repair = func(pos), -- repair defect (feature!) nodes +-- } +function tubelib.register_node(name, add_names, node_definition) + tubelib_NodeDef[name] = node_definition + -- store facedir table for all known node names + Name2Name[name] = name + for _,n in ipairs(add_names) do + Name2Name[n] = name + end + if node_definition.on_pull_item or node_definition.on_push_item or + node_definition.is_pusher then + Tube:add_secondary_node_names({name}) + Tube:add_secondary_node_names(add_names) + + tubelib.KnownNodes[name] = true + for _,n in ipairs(add_names) do + tubelib.KnownNodes[n] = true + end + end + -- register LBM + if node_definition.on_node_load then + local nodenames = {name} + for _,n in ipairs(add_names) do + nodenames[#nodenames + 1] = n + end + register_lbm(name, nodenames) + end +end + +------------------------------------------------------------------- +-- Send message functions +------------------------------------------------------------------- + +function tubelib.send_message(numbers, placer_name, clicker_name, topic, payload) + for _,num in ipairs(string_split(numbers, " ")) do + if Number2Pos[num] and Number2Pos[num].name then + local data = Number2Pos[num] + if not_protected(data.pos, placer_name, clicker_name) then + if tubelib_NodeDef[data.name] and tubelib_NodeDef[data.name].on_recv_message then + tubelib_NodeDef[data.name].on_recv_message(data.pos, topic, payload) + end + end + end + end +end + +function tubelib.send_request(number, topic, payload) + if Number2Pos[number] and Number2Pos[number].name then + local data = Number2Pos[number] + if tubelib_NodeDef[data.name] and tubelib_NodeDef[data.name].on_recv_message then + return tubelib_NodeDef[data.name].on_recv_message(data.pos, topic, payload) + end + end + return false +end + +-- for defect nodes +function tubelib.repair_node(pos) + local node = minetest.get_node(pos) + local name = Name2Name[node.name] + if tubelib_NodeDef[name] and tubelib_NodeDef[name].on_node_repair then + return tubelib_NodeDef[name].on_node_repair(pos) + end + return false +end + +------------------------------------------------------------------- +-- Client side Push/Pull item functions +------------------------------------------------------------------- + +function tubelib.pull_items(pos, side, player_name) + local npos, nside, name = get_dest_node(pos, side) + if npos == nil then return end + if tubelib_NodeDef[name] and tubelib_NodeDef[name].on_pull_item then + return tubelib_NodeDef[name].on_pull_item(npos, nside, player_name) + end + return nil +end + +function tubelib.push_items(pos, side, items, player_name) + local npos, nside, name = get_dest_node(pos, side) + if npos == nil then return end + if tubelib_NodeDef[name] and tubelib_NodeDef[name].on_push_item then + return tubelib_NodeDef[name].on_push_item(npos, nside, items, player_name) + elseif name == "air" then + minetest.add_item(npos, items) + return true + end + return false +end + +function tubelib.unpull_items(pos, side, items, player_name) + local npos, nside, name = get_dest_node(pos, side) + if npos == nil then return end + if tubelib_NodeDef[name] and tubelib_NodeDef[name].on_unpull_item then + return tubelib_NodeDef[name].on_unpull_item(npos, nside, items, player_name) + end + return false +end + +function tubelib.pull_stack(pos, side, player_name) + local npos, nside, name = get_dest_node(pos, side) + if npos == nil then return end + if tubelib_NodeDef[name] then + if tubelib_NodeDef[name].on_pull_stack then + return tubelib_NodeDef[name].on_pull_stack(npos, nside, player_name) + elseif tubelib_NodeDef[name].on_pull_item then + return tubelib_NodeDef[name].on_pull_item(npos, nside, player_name) + end + end + return nil +end + +------------------------------------------------------------------- +-- Server side helper functions +------------------------------------------------------------------- + +-- Get one item from the given ItemList. The position within the list +-- is incremented each time so that different item stacks will be considered. +-- Returns nil if ItemList is empty. +function tubelib.get_item(meta, listname) + if meta == nil or meta.get_inventory == nil then return nil end + local inv = meta:get_inventory() + if inv:is_empty(listname) then + return nil + end + local size = inv:get_size(listname) + local startpos = meta:get_int("tubelib_startpos") or 0 + for idx = startpos, startpos+size do + idx = (idx % size) + 1 + local items = inv:get_stack(listname, idx) + if items:get_count() > 0 then + local taken = items:take_item(1) + inv:set_stack(listname, idx, items) + meta:set_int("tubelib_startpos", idx) + return taken + end + end + meta:set_int("tubelib_startpos", 0) + return nil +end + +-- Get one (or more) item(s) from the given ItemList, specified by stack number (1..n). +-- Returns nil if ItemList is empty. +function tubelib.get_this_item(meta, listname, list_number, num_items) + if meta == nil or meta.get_inventory == nil then return nil end + local inv = meta:get_inventory() + if inv:is_empty(listname) then + return nil + end + + if num_items == nil then num_items = 1 end + local items = inv:get_stack(listname, list_number) + if items:get_count() > 0 then + local taken = items:take_item(num_items) + inv:set_stack(listname, list_number, items) + return taken + end + return nil +end + + +-- Put the given item into the given ItemList. +-- Function returns false if ItemList is full. +function tubelib.put_item(meta, listname, item) + if meta == nil or meta.get_inventory == nil then return false end + local inv = meta:get_inventory() + if inv:room_for_item(listname, item) then + inv:add_item(listname, item) + return true + end + return false +end + +-- Take the number of items from the given ItemList. +-- Returns nil if the requested number is not available. +function tubelib.get_num_items(meta, listname, num) + if meta == nil or meta.get_inventory == nil then return nil end + local inv = meta:get_inventory() + if inv:is_empty(listname) then + return nil + end + local size = inv:get_size(listname) + for idx = 1, size do + local items = inv:get_stack(listname, idx) + if items:get_count() >= num then + local taken = items:take_item(num) + inv:set_stack(listname, idx, items) + return taken + end + end + return nil +end + +function tubelib.get_stack(meta, listname) + local inv = meta:get_inventory() + local item = tubelib.get_item(meta, listname) + if item and item:get_stack_max() > 1 and inv:contains_item(listname, item) then + -- try to remove a complete stack + item:set_count(math.min(98, item:get_stack_max() - 1)) + local taken = inv:remove_item(listname, item) + -- add the already removed + taken:set_count(taken:get_count() + 1) + return taken + end + return item +end + +-- Return "full", "loaded", or "empty" depending +-- on the number of fuel stack items. +-- Function only works on fuel inventories with one stacks/99 items +function tubelib.fuelstate(meta, listname, item) + if meta == nil or meta.get_inventory == nil then return nil end + local inv = meta:get_inventory() + if inv:is_empty(listname) then + return "empty" + end + local list = inv:get_list(listname) + if #list == 1 and list[1]:get_count() == 99 then + return "full" + else + return "loaded" + end +end + +-- Return "full", "loaded", or "empty" depending +-- on the inventory load. +-- Full is returned, when no empty stack is available. +function tubelib.get_inv_state(meta, listname) + if meta == nil or meta.get_inventory == nil then return nil end + local inv = meta:get_inventory() + local state + if inv:is_empty(listname) then + state = "empty" + else + local list = inv:get_list(listname) + state = "full" + local num = 0 + for i, item in ipairs(list) do + if item:is_empty() then + return "loaded" + end + end + end + return state +end + +-- Mainly used for door/gate nodes +-- To delete an entry, provide nil as number. The stored data will be returned. +function tubelib.temporary_remove_node(pos, number, name, add_data) + local key = get_key_str(pos) + if number then + add_data = add_data or {} + add_data.pos = pos + add_data.number = number + add_data.name = name + TemporaryRemovedNodes[key] = add_data + else + local data = table.copy(TemporaryRemovedNodes[key]) + TemporaryRemovedNodes[key] = nil + return data + end +end + +------------------------------------------------------------------------------- +-- Data Maintenance +------------------------------------------------------------------------------- + +local function parse_number(s) + for _,word in ipairs(s:split(" ")) do + local n = tonumber(word) + if n and n > 0 then + return word + end + end +end + +local function get_node_number(pos) + local meta = M(pos) + local num = meta:get_string("tubelib_number") + if num and num ~= "" then return num end + + num = meta:get_string("number") + if num and num ~= "" then return num end + + num = meta:get_string("own_number") + if num and num ~= "" then return num end + + num = parse_number(meta:get_string("infotext")) + if num and num ~= "" then return num end + + return 0 +end + +local function data_maintenance() + minetest.log("info", "[Tubelib] Data maintenance started") + + -- Remove unused positions + local tbl = table.copy(Number2Pos) + Number2Pos = {} + local cnt1 = 0 + local cnt2 = 0 + for num,item in pairs(tbl) do + local name = Name2Name[get_node_lvm(item.pos).name] + cnt1 = cnt1 + 1 + -- Is there a tubelib node? + if tubelib_NodeDef[name] then + -- Does the number match? + local nnum = get_node_number(item.pos) + if nnum == num then + cnt2 = cnt2 + 1 + -- Store again + Number2Pos[num] = item + -- Add node names which are not stored as file + Number2Pos[num].name = name + --print("added", num, name) + else + --print("wrong number", num, name) + end + else + local key = get_key_str(item.pos) + local data = TemporaryRemovedNodes[key] + if data then + cnt2 = cnt2 + 1 + -- Store again + Number2Pos[data.number] = data + --print("restored", data.number, data.name) + else + --print("no data", num) + end + end + end + minetest.log("info", "[Tubelib] Data base shrank from "..cnt1.." to "..cnt2.." nodes") + minetest.log("info", "[Tubelib] Data maintenance finished") +end + +generate_Key2Number() + +-- maintain data after 2 seconds +minetest.after(2, data_maintenance) + + diff --git a/mods/techpack/tubelib/defect.lua b/mods/techpack/tubelib/defect.lua new file mode 100644 index 00000000..40ede921 --- /dev/null +++ b/mods/techpack/tubelib/defect.lua @@ -0,0 +1,63 @@ +minetest.register_node("tubelib:defect_dummy", { + description = "Corrupted Tubelib Node", + tiles = { + "tubelib_front.png", + "tubelib_front.png", + "tubelib_front.png^tubelib_defect.png", + "tubelib_front.png^tubelib_defect.png", + "tubelib_front.png^tubelib_defect.png", + "tubelib_front.png^tubelib_defect.png", + }, + groups = {cracky=3, crumbly=3, choppy=3, not_in_creative_inventory=1}, + is_ground_content = false, +}) + +local reported_machines = {} +local function report(pos) + reported_machines[minetest.pos_to_string(pos)] = true +end +local function already_reported(pos) + local key = minetest.pos_to_string(pos) + return reported_machines[key] +end + + +function tubelib.data_not_corrupted(pos) + if minetest.pos_to_string(pos) ~= minetest.get_meta(pos):get_string("my_pos") then + -- node number corrupt? + local meta = minetest.get_meta(pos) + local number = meta:get_string("tubelib_number") + if number == "" then + number = meta:get_string("number") + end + if number == "" then + number = meta:get_string("own_num") + end + if number == "" then + number = meta:get_string("own_number") + end + if number == "" then + if not already_reported(pos) then + minetest.log('error', ('[tubelib] machine @ %s has no number'):format(minetest.pos_to_string(pos))) + report(pos) + end + end + -- node moved? + local info = tubelib.get_node_info(number) + if not info or not vector.equals(info.pos, pos) then + if not already_reported(pos) then + if not info then + minetest.log('error', ('[tubelib] machine @ %s has no info'):format(minetest.pos_to_string(pos))) + else + minetest.log('error', ('[tubelib] machine @ %s thinks it is at %s'):format(minetest.pos_to_string(pos), minetest.pos_to_string(info.pos))) + end + report(pos) + end + local node = minetest.get_node(pos) + number = tubelib.get_new_number(pos, node.name) + meta:set_string("tubelib_number", number) + end + minetest.get_meta(pos):get_string("my_pos", minetest.pos_to_string(pos)) + end + return true +end diff --git a/mods/techpack/tubelib/depends.txt b/mods/techpack/tubelib/depends.txt new file mode 100644 index 00000000..6bd43252 --- /dev/null +++ b/mods/techpack/tubelib/depends.txt @@ -0,0 +1,4 @@ +default +tubelib2 +basic_materials + diff --git a/mods/techpack/tubelib/description.txt b/mods/techpack/tubelib/description.txt new file mode 100644 index 00000000..3dee6994 --- /dev/null +++ b/mods/techpack/tubelib/description.txt @@ -0,0 +1,2 @@ +Tubes Mod with message communication interface as basis for further technique Mods. + diff --git a/mods/techpack/tubelib/distributor.lua b/mods/techpack/tubelib/distributor.lua new file mode 100644 index 00000000..5df42099 --- /dev/null +++ b/mods/techpack/tubelib/distributor.lua @@ -0,0 +1,561 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + distributor.lua: + + A more complex node acting as server and client. + This node claims a position number and registers its message and items interface. + The Distributor is based on the class NodeStates and supports the following messages: + - topic = "on", payload = nil + - topic = "off" , payload = nil + - topic = "state", payload = nil, + response is "running", "stopped", "standby", "defect", or "not supported" +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local MAX_NUM_PER_CYC = 20 -- maximum number of items, which can be pushed per slot +local NUM_FILTER_ELEM = 6 +local NUM_FILTER_SLOTS = 4 + +local COUNTDOWN_TICKS = 8 +local STANDBY_TICKS = 4 +local CYCLE_TIME = 2 + +local function formspec(self, pos, meta) + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} + return "size[10.5,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;0,0;2,4;]".. + "image[2,1.5;1,1;tubelib_gui_arrow.png]".. + "image_button[2,3;1,1;"..self:get_state_button_image(meta)..";state_button;]".. + "checkbox[3,0;filter1;On;"..dump(filter[1]).."]".. + "checkbox[3,1;filter2;On;"..dump(filter[2]).."]".. + "checkbox[3,2;filter3;On;"..dump(filter[3]).."]".. + "checkbox[3,3;filter4;On;"..dump(filter[4]).."]".. + "image[4,0;0.3,1;tubelib_red.png]".. + "image[4,1;0.3,1;tubelib_green.png]".. + "image[4,2;0.3,1;tubelib_blue.png]".. + "image[4,3;0.3,1;tubelib_yellow.png]".. + "list[context;red;4.5,0;6,1;]".. + "list[context;green;4.5,1;6,1;]".. + "list[context;blue;4.5,2;6,1;]".. + "list[context;yellow;4.5,3;6,1;]".. + "list[current_player;main;1.25,4.5;8,4;]".. + "listring[context;src]".. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib:distributor", + node_name_active = "tubelib:distributor_active", + node_name_defect = "tubelib:distributor_defect", + infotext_name = "Tubelib Distributor", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + aging_factor = 10, + formspec_func = formspec, +}) + +-- Return a key/value table with all items and the corresponding stack numbers +local function invlist_content_as_kvlist(list) + local res = {} + for idx,items in ipairs(list or {}) do + local name = items:get_name() + if name ~= "" then + res[name] = idx + end + end + return res +end + +-- Return the total number of list entries +local function invlist_num_entries(list) + local res = 0 + for _,items in ipairs(list) do + local name = items:get_name() + if name ~= "" then + res = res + items:get_count() + end + end + return res +end + +-- Return a gapless table with all items +local function invlist_entries_as_list(list) + local res = {} + for _,items in ipairs(list) do + if items:get_count() > 0 then + res[#res+1] = {items:get_name(), items:get_count()} + end + end + return res +end + + +local function AddToTbl(kvTbl, new_items) + for _, l in ipairs(new_items) do + kvTbl[l[1]] = true + end + return kvTbl +end + +local function countItemOccurrenceInFilters(kvTbl, new_items) + for _, l in ipairs(new_items) do + local name = l[1] + if kvTbl[name] == nil then + kvTbl[name] = 1 + else + kvTbl[name] = kvTbl[name] + 1 + end + end + return kvTbl +end + +-- return the number of items to be pushed to an unconfigured slot +local function num_items(moved_items, name, filter_item_names, rejected_item_names) + if filter_item_names[name] == nil then -- not configured in one filter? + if moved_items < MAX_NUM_PER_CYC then + return math.min(4, MAX_NUM_PER_CYC - moved_items) + end + end + if rejected_item_names[name] then -- rejected item from another slot? + if moved_items < MAX_NUM_PER_CYC then + return math.min(rejected_item_names[name], MAX_NUM_PER_CYC - moved_items) + end + end +end + +local SlotColors = {"red", "green", "blue", "yellow"} +local Num2Ascii = {"B", "L", "F", "R"} -- color to side translation +local FilterCache = {} -- local cache for filter settings + +local function filter_settings(pos) + local hash = minetest.hash_node_position(pos) + local meta = M(pos) + local inv = meta:get_inventory() + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} + local kvFilterItemNames = {} -- { = true,...} + local kvSide2ItemNames = {} -- {"F" = {,...},...} + local kvNumOccur = {} + + -- collect all filter settings + for idx,slot in ipairs(SlotColors) do + local side = Num2Ascii[idx] + if filter[idx] == true then + local list = inv:get_list(slot) + local filter = invlist_entries_as_list(list) + AddToTbl(kvFilterItemNames, filter) + kvSide2ItemNames[side] = filter + countItemOccurrenceInFilters(kvNumOccur, filter) + end + end + + FilterCache[hash] = { + kvFilterItemNames = kvFilterItemNames, + kvSide2ItemNames = kvSide2ItemNames, + kvRejectedItemNames = {}, + kvNumOccur = kvNumOccur, + } +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + local meta = M(pos) + local inv = meta:get_inventory() + local list = inv:get_list(listname) + local stack_count = stack:get_count() + + if listname == "src" then + if State:get_state(M(pos)) == tubelib.STANDBY then + State:start(pos, meta) + end + return stack_count + end + + local space_left = MAX_NUM_PER_CYC - invlist_num_entries(list) + if space_left <= 0 then -- < 0 case is possible if distributor is already misconfigured + return 0 + end + + filter_settings(pos) + return math.min(stack_count, space_left) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + if listname ~= "src" then + filter_settings(pos) + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = M(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +-- move items from configured filters to the output +local function distributing(pos, meta) + local player_name = meta:get_string("player_name") + local slot_idx = meta:get_int("slot_idx") or 1 + meta:set_int("slot_idx", (slot_idx + 1) % NUM_FILTER_SLOTS) + local side = Num2Ascii[slot_idx+1] + local listname = SlotColors[slot_idx+1] + local inv = meta:get_inventory() + local list = inv:get_list("src") + local kvSrc = invlist_content_as_kvlist(list) + local counter = minetest.deserialize(meta:get_string("item_counter")) or + {red=0, green=0, blue=0, yellow=0} + + -- calculate the filter settings only once + local hash = minetest.hash_node_position(pos) + if FilterCache[hash] == nil then + filter_settings(pos) + end + + -- read data from Cache + -- all filter items as key/value { = true,...} + local kvFilterItemNames = FilterCache[hash].kvFilterItemNames + -- filter items of one slot as list {{, },...} + local items = FilterCache[hash].kvSide2ItemNames[side] + local kvNumOccur = FilterCache[hash].kvNumOccur + -- rejected items from other filter slots + local rejected = FilterCache[hash].kvRejectedItemNames + + if items == nil then return end + + local moved_items_total = 0 + if next(items) then + for _,item in ipairs(items) do + local name, num = item[1], item[2] + if kvSrc[name] then + local item = tubelib.get_this_item(meta, "src", kvSrc[name], num) -- <<=== tubelib + if item then + if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib + tubelib.put_item(meta, "src", item) + rejected[name] = num + else + counter[listname] = counter[listname] + num + moved_items_total = moved_items_total + num + end + end + end + end + end + + -- move additional items from unconfigured filters to the output + if next(items) == nil then + local moved_items = 0 + for name,_ in pairs(kvSrc) do + local num = num_items(moved_items, name, kvFilterItemNames, rejected) + if num then + local item = tubelib.get_this_item(meta, "src", kvSrc[name], num) -- <<=== tubelib + if item then + if not kvNumOccur[item:get_name()] or kvNumOccur[item:get_name()] < 2 then + if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib + tubelib.put_item(meta, "src", item) + else + counter[listname] = counter[listname] + num + moved_items = moved_items + num + moved_items_total = moved_items_total + num + end + else + tubelib.put_item(meta, "src", item) + end + end + end + end + -- delete list for next slot round + if moved_items > 0 then + FilterCache[hash].kvRejectedItemNames = {} + end + end + meta:set_string("item_counter", minetest.serialize(counter)) + if moved_items_total > 0 then + State:keep_running(pos, meta, COUNTDOWN_TICKS, moved_items_total) + else + State:idle(pos, meta) + end +end + +-- move items to the output slots +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + distributing(pos, meta) + return State:is_active(meta) + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = M(pos) + local filter = minetest.deserialize(meta:get_string("filter")) + if fields.filter1 ~= nil then + filter[1] = fields.filter1 == "true" + elseif fields.filter2 ~= nil then + filter[2] = fields.filter2 == "true" + elseif fields.filter3 ~= nil then + filter[3] = fields.filter3 == "true" + elseif fields.filter4 ~= nil then + filter[4] = fields.filter4 == "true" + end + meta:set_string("filter", minetest.serialize(filter)) + + filter_settings(pos) + + if fields.state_button ~= nil then + State:state_button_event(pos, fields) + else + meta:set_string("formspec", formspec(State, pos, meta)) + end +end + +-- tubelib command to turn on/off filter channels +local function change_filter_settings(pos, slot, val) + local slots = {["red"] = 1, ["green"] = 2, ["blue"] = 3, ["yellow"] = 4} + local meta = M(pos) + local filter = minetest.deserialize(meta:get_string("filter")) + local num = slots[slot] or 1 + if num >= 1 and num <= 4 then + filter[num] = val == "on" + end + meta:set_string("filter", minetest.serialize(filter)) + + filter_settings(pos) + + meta:set_string("formspec", formspec(State, pos, meta)) + return true +end + +minetest.register_node("tubelib:distributor", { + description = "Tubelib Distributor", + tiles = { + -- up, down, right, left, back, front + 'tubelib_distributor.png', + 'tubelib_front.png', + 'tubelib_distributor_yellow.png', + 'tubelib_distributor_green.png', + "tubelib_distributor_red.png", + "tubelib_distributor_blue.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local number = tubelib.add_node(pos, "tubelib:distributor") -- <<=== tubelib + local filter = {false,false,false,false} + meta:set_string("filter", minetest.serialize(filter)) + State:node_init(pos, number) + meta:set_string("player_name", placer:get_player_name()) + + local inv = meta:get_inventory() + inv:set_size('src', 8) + inv:set_size('yellow', 6) + inv:set_size('green', 6) + inv:set_size('red', 6) + inv:set_size('blue', 6) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + end, + + on_receive_fields = on_receive_fields, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("src") + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib:distributor_active", { + description = "Tubelib Distributor", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_distributor_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_front.png', + 'tubelib_distributor_yellow.png', + 'tubelib_distributor_green.png', + "tubelib_distributor_red.png", + "tubelib_distributor_blue.png", + }, + + on_receive_fields = on_receive_fields, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib:distributor_defect", { + description = "Tubelib Distributor", + tiles = { + -- up, down, right, left, back, front + 'tubelib_distributor.png', + 'tubelib_front.png', + 'tubelib_distributor_yellow.png^tubelib_defect.png', + 'tubelib_distributor_green.png^tubelib_defect.png', + "tubelib_distributor_red.png^tubelib_defect.png", + "tubelib_distributor_blue.png^tubelib_defect.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local number = tubelib.add_node(pos, "tubelib:distributor") -- <<=== tubelib + State:node_init(pos, number) + meta:set_string("player_name", placer:get_player_name()) + + local filter = {false,false,false,false} + meta:set_string("filter", minetest.serialize(filter)) + local inv = meta:get_inventory() + inv:set_size('src', 8) + inv:set_size('yellow', 6) + inv:set_size('green', 6) + inv:set_size('red', 6) + inv:set_size('blue', 6) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + State:defect(pos, meta) + end, + + on_receive_fields = on_receive_fields, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("src") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) -- <<=== tubelib + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib:distributor 2", + recipe = { + {"group:wood", "default:steel_ingot", "group:wood"}, + {"tubelib:tubeS", "default:mese_crystal", "tubelib:tubeS"}, + {"group:wood", "default:steel_ingot", "group:wood"}, + }, +}) + + +--------------------------------------------------------------- tubelib +tubelib.register_node("tubelib:distributor", + {"tubelib:distributor_active", "tubelib:distributor_defect"}, { + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "src") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_recv_message = function(pos, topic, payload) + if topic == "filter" then + return change_filter_settings(pos, payload.slot, payload.val) + elseif topic == "counter" then + local meta = minetest.get_meta(pos) + return minetest.deserialize(meta:get_string("item_counter")) or + {red=0, green=0, blue=0, yellow=0} + elseif topic == "clear_counter" then + local meta = minetest.get_meta(pos) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + else + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end + end, + + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) +--------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib/forceload.lua b/mods/techpack/tubelib/forceload.lua new file mode 100644 index 00000000..0f214bbb --- /dev/null +++ b/mods/techpack/tubelib/forceload.lua @@ -0,0 +1,218 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + forceload.lua: + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local function calc_area(pos) + local xpos = (math.floor(pos.x / 16) * 16) + local ypos = (math.floor(pos.y / 16) * 16) + local zpos = (math.floor(pos.z / 16) * 16) + local pos1 = {x=xpos, y=ypos, z=zpos} + local pos2 = {x=xpos+15, y=ypos+15, z=zpos+15} + return pos1, pos2 +end + +local function in_list(list, x) + local pos1 = calc_area(x) + for _,v in ipairs(list) do + local pos2 = calc_area(v) + if vector.equals(pos1, pos2) then return true end + end + return false +end + +local function remove_list_elem(list, x) + local n = nil + for idx, v in ipairs(list) do + if vector.equals(v, x) then + n = idx + break + end + end + if n then + table.remove(list, n) + end + return list +end + +local function chat(player, text) + minetest.chat_send_player(player:get_player_name(), "[Tubelib] "..text) +end + +local function get_node_lvm(pos) + local node = minetest.get_node_or_nil(pos) + if node then + return node + end + local vm = minetest.get_voxel_manip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local param2_data = vm:get_param2_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local idx = area:index(pos.x, pos.y, pos.z) + node = { + name = minetest.get_name_from_content_id(data[idx]), + param2 = param2_data[idx] + } + return node +end + +local function add_pos(pos, player) + local lPos = minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or {} + if not in_list(lPos, pos) and #lPos < tubelib.max_num_forceload_blocks then + lPos[#lPos+1] = pos + player:set_attribute("tubelib_forceload_blocks", minetest.serialize(lPos)) + return true + end + return false +end + +local function del_pos(pos, player) + local lPos = minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or {} + lPos = remove_list_elem(lPos, pos) + player:set_attribute("tubelib_forceload_blocks", minetest.serialize(lPos)) +end + +local function get_pos_list(player) + return minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or {} +end + +local function set_pos_list(player, lPos) + player:set_attribute("tubelib_forceload_blocks", minetest.serialize(lPos)) +end + +local function get_data(pos, player) + local pos1, pos2 = calc_area(pos) + local num = #minetest.deserialize(player:get_attribute("tubelib_forceload_blocks")) or 0 + local max = tubelib.max_num_forceload_blocks + return pos1, pos2, num, max +end + +local function formspec(player) + local lPos = get_pos_list(player) + local tRes = {} + tRes[1] = "size[7,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;List of your Forceload Blocks:]" + + for idx,pos in ipairs(lPos) do + local pos1, pos2 = calc_area(pos) + local ypos = 0.2 + idx * 0.4 + tRes[#tRes+1] = "label[0,"..ypos..";"..idx.."]" + tRes[#tRes+1] = "label[0.8,"..ypos..";"..S(pos1).."]" + tRes[#tRes+1] = "label[3.2,"..ypos..";to]" + tRes[#tRes+1] = "label[4,"..ypos..";"..S(pos2).."]" + end + return table.concat(tRes) +end + + +minetest.register_node("tubelib:forceload", { + description = "Tubelib Forceload Block", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + { + image = "tubelib_forceload.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.5, + }, + }, + }, + + after_place_node = function(pos, placer, itemstack) + if add_pos(pos, placer) then + minetest.forceload_block(pos, true) + local pos1, pos2, num, max = get_data(pos, placer) + M(pos):set_string("infotext", "Area "..S(pos1).." to "..S(pos2).." loaded!\n".. + "Punch the block to make the area visible.") + chat(placer, "Area ("..num.."/"..max..") "..S(pos1).." to "..S(pos2).." loaded!") + tubelib.mark_region(placer:get_player_name(), pos1, pos2) + M(pos):set_string("owner", placer:get_player_name()) + else + chat(placer, "Area already loaded or max. number of Forceload Blocks reached!") + minetest.remove_node(pos) + return itemstack + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local player = minetest.get_player_by_name(oldmetadata.fields.owner) + if player then + del_pos(pos, player) + end + minetest.forceload_free_block(pos, true) + tubelib.unmark_region(oldmetadata.fields.owner) + end, + + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if M(pos):get_string("owner") == clicker:get_player_name() or + minetest.check_player_privs(clicker:get_player_name(), "server") then + local s = formspec(clicker) + minetest.show_formspec(clicker:get_player_name(), "tubelib:forceload", s) + end + end, + + on_punch = function(pos, node, puncher, pointed_thing) + local pos1, pos2 = calc_area(pos) + tubelib.switch_region(puncher:get_player_name(), pos1, pos2) + end, + + paramtype = "light", + sunlight_propagates = true, + groups = {choppy=2, cracky=2, crumbly=2, + not_in_creative_inventory = tubelib.max_num_forceload_blocks == 0 and 1 or 0}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +if tubelib.max_num_forceload_blocks > 0 then + minetest.register_craft({ + output = "tubelib:forceload", + recipe = { + {"group:wood", "", "group:wood"}, + {"", "basic_materials:energy_crystal_simple", ""}, + {"group:wood", "tubelib:wlanchip", "group:wood"}, + }, + }) +end + +minetest.register_on_joinplayer(function(player) + local lPos = {} + for _,pos in ipairs(get_pos_list(player)) do + local node = get_node_lvm(pos) + if node.name == "tubelib:forceload" then + minetest.forceload_block(pos, true) + lPos[#lPos+1] = pos + end + end + set_pos_list(player, lPos) +end) + +minetest.register_on_leaveplayer(function(player) + for _,pos in ipairs(get_pos_list(player)) do + minetest.forceload_free_block(pos, true) + end +end) diff --git a/mods/techpack/tubelib/init.lua b/mods/techpack/tubelib/init.lua new file mode 100644 index 00000000..fb803c2c --- /dev/null +++ b/mods/techpack/tubelib/init.lua @@ -0,0 +1,116 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + History: + 2017-09-08 v0.01 first version + 2017-09-12 v0.02 bugfix in tubelib.get_pos() and others + 2017-09-21 v0.03 function get_num_items added + 2017-09-26 v0.04 param side added, node blackhole added + 2017-10-06 v0.05 Parameter 'player_name' added, furnace fuel detection changed + 2017-10-08 v0.06 tubelib.get_node_number() added, tubelib.version added + 2017-10-29 v0.07 Pusher bugfix, commands start/stop replaced by on/off + 2017-11-02 v0.08 Data base changed, aging of node positions added + 2017-11-04 v0.09 functions set_data/get_data added + 2018-01-27 v0.10 WLAN Chip added, recipes reviced, Pusher state 'blocked' added, + function send_request changed + 2018-08-09 v1.00 Extracted from TechPack to be used as standalone mod + - new tubing algorithm + - tubelib.pull_stack()/tubelib.get_stack() added + - item counter for pusher/distributor added + 2018-12-21 v2.00 Switch to tubelib2, "defect" nodes and "Repair Kit" added, + Forceload block added, Basalt as Cobble Stone alternative added + +]]-- + + +tubelib = { + NodeDef = {}, -- node registration info +} + +tubelib.version = 2.00 + +tubelib.max_num_forceload_blocks = tonumber(minetest.setting_get("tubelib_max_num_forceload_blocks")) or 10 +tubelib.basalt_stone_enabled = minetest.setting_get("tubelib_basalt_stone_enabled") == "true" +tubelib.machine_aging_value = tonumber(minetest.setting_get("tubelib_machine_aging_value")) or 100 + + +--------------------------- conversion to v0.04 +minetest.register_lbm({ + label = "[Tubelib] Distributor update", + name = "tubelib:update", + nodenames = {"tubelib:distributor", "tubelib:distributor_active"}, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + if minetest.deserialize(meta:get_string("filter")) == nil then + local filter = {false,false,false,false} + meta:set_string("filter", minetest.serialize(filter)) + end + local inv = meta:get_inventory() + inv:set_size('yellow', 6) + inv:set_size('green', 6) + inv:set_size('red', 6) + inv:set_size('blue', 6) + end +}) + +--------------------------- conversion to v0.10 +minetest.register_lbm({ + label = "[Tubelib] Button update", + name = "tubelib:update2", + nodenames = {"tubelib:button", "tubelib:button_active"}, + run_at_every_load = false, + action = function(pos, node) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + if number ~= "" then + meta:set_string("numbers", number) + meta:set_string("number", nil) + end + end +}) + +minetest.register_craftitem("tubelib:wlanchip", { + description = "Tubelib WLAN Chip", + inventory_image = "tubelib_wlanchip.png", +}) + + +minetest.register_craft({ + output = "tubelib:wlanchip 8", + recipe = { + {"default:mese_crystal", "default:copper_ingot", ""}, + {"default:gold_ingot", "default:glass", ""}, + {"", "", ""}, + }, +}) + + +if tubelib2.version < 0.8 then + minetest.log("error", "TechPack/Tubelib requires tubelib2 version 0.8 or newer!!!") +else + dofile(minetest.get_modpath("tubelib") .. "/tubes.lua") + dofile(minetest.get_modpath("tubelib") .. "/command.lua") + -- conversion from v1.16 to v2.00 + dofile(minetest.get_modpath("tubelib") .. "/migrate.lua") + dofile(minetest.get_modpath("tubelib") .. "/states.lua") + dofile(minetest.get_modpath("tubelib") .. "/defect.lua") + dofile(minetest.get_modpath("tubelib") .. "/node_states.lua") + dofile(minetest.get_modpath("tubelib") .. "/pusher.lua") + dofile(minetest.get_modpath("tubelib") .. "/blackhole.lua") + dofile(minetest.get_modpath("tubelib") .. "/button.lua") + dofile(minetest.get_modpath("tubelib") .. "/lamp.lua") + dofile(minetest.get_modpath("tubelib") .. "/distributor.lua") + dofile(minetest.get_modpath("tubelib") .. "/legacy_nodes.lua") + dofile(minetest.get_modpath("tubelib") .. "/repairkit.lua") + dofile(minetest.get_modpath("tubelib") .. "/mark.lua") + dofile(minetest.get_modpath("tubelib") .. "/forceload.lua") + dofile(minetest.get_modpath("tubelib") .. "/basalt.lua") +end diff --git a/mods/techpack/tubelib/lamp.lua b/mods/techpack/tubelib/lamp.lua new file mode 100644 index 00000000..67703e0d --- /dev/null +++ b/mods/techpack/tubelib/lamp.lua @@ -0,0 +1,106 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + lamp.lua: + + Example of a simple communication node, only receiving messages from others. + This node claims a position number and registers its message interface. + The Lamp supports the following messages: + - topic = "on", payload = nil + - topic = "off" , payload = nil + +]]-- + +local function switch_on(pos, node) + node.name = "tubelib:lamp_on" + minetest.swap_node(pos, node) +end + +local function switch_off(pos, node) + node.name = "tubelib:lamp" + minetest.swap_node(pos, node) +end + +minetest.register_node("tubelib:lamp", { + description = "Tubelib Lamp", + tiles = { + 'tubelib_lamp.png', + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib:lamp") -- <<=== tubelib + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Tubelib Lamp "..number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_on(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) -- <<=== tubelib + end, + + paramtype = "light", + light_source = 0, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib:lamp_on", { + description = "Tubelib Lamp", + tiles = { + 'tubelib_lamp.png', + }, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_off(pos, node) + end + end, + + paramtype = "light", + light_source = minetest.LIGHT_MAX, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "tubelib:lamp 4", + recipe = { + {"wool:white", "wool:white", "wool:white"}, + {"tubelib:wlanchip", "default:coal_lump", ""}, + {"group:wood", "", "group:wood"}, + }, +}) + +--------------------------------------------------------------- tubelib +tubelib.register_node("tubelib:lamp", {"tubelib:lamp_on"}, { + on_pull_item = nil, -- lamp has no inventory + on_push_item = nil, -- lamp has no inventory + on_unpull_item = nil, -- lamp has no inventory + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + switch_on(pos, node) + elseif topic == "off" then + switch_off(pos, node) + end + end, +}) +--------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib/legacy_nodes.lua b/mods/techpack/tubelib/legacy_nodes.lua new file mode 100644 index 00000000..8b814a08 --- /dev/null +++ b/mods/techpack/tubelib/legacy_nodes.lua @@ -0,0 +1,135 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + legacy_nodes.lua: + + Tubelib support for chests and furnace + +]]-- + +tubelib.register_node("default:chest", {"default:chest_open"}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, +}) + + +tubelib.register_node("default:chest_locked", {"default:chest_locked_open"}, { + on_pull_item = function(pos, side, player_name) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player_name == owner or player_name == "" then + return tubelib.get_item(meta, "main") + end + return nil + end, + on_push_item = function(pos, side, item, player_name) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player_name == owner or player_name == "" then + return tubelib.put_item(meta, "main", item) + end + return false + end, + on_unpull_item = function(pos, side, item, player_name) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player_name == owner or player_name == "" then + return tubelib.put_item(meta, "main", item) + end + return nil + end, +}) + +tubelib.register_node("default:furnace", {"default:furnace_active"}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "dst") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + minetest.get_node_timer(pos):start(1.0) + if minetest.get_craft_result({method="fuel", width=1, items={item}}).time ~= 0 then + return tubelib.put_item(meta, "fuel", item) + else + return tubelib.put_item(meta, "src", item) + end + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "dst", item) + end, +}) + +tubelib.register_node("shop:shop", {}, { + on_pull_item = function(pos, side, player_name) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player_name == owner or player_name == "" then + return tubelib.get_item(meta, "register") + end + return nil + end, + on_push_item = function(pos, side, item, player_name) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player_name == owner or player_name == "" then + return tubelib.put_item(meta, "stock", item) + end + return false + end, + on_unpull_item = function(pos, side, item, player_name) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if player_name == owner or player_name == "" then + return tubelib.put_item(meta, "register", item) + end + return nil + end, +}) + +tubelib.register_node("signs_bot:box", {}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, +}) + +tubelib.register_node("signs_bot:chest", {}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, +}) diff --git a/mods/techpack/tubelib/mark.lua b/mods/techpack/tubelib/mark.lua new file mode 100644 index 00000000..73328db3 --- /dev/null +++ b/mods/techpack/tubelib/mark.lua @@ -0,0 +1,93 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2019 Joachim Stolberg + Code derived from wordedit (sfan5, Anthony Zhang (Uberi/Temperest), and Brett O'Donnell (cornernote)) + + LGPLv2.1+ + See LICENSE.txt for more information + + mark.lua: + +]]-- + +local marker_region = {} + +function tubelib.unmark_region(name) + if marker_region[name] ~= nil then --marker already exists + --wip: make the area stay loaded somehow + for _, entity in ipairs(marker_region[name]) do + entity:remove() + end + marker_region[name] = nil + end +end + +function tubelib.mark_region(name, pos1, pos2) + + tubelib.unmark_region(name) + + local thickness = 0.2 + local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 + local markers = {} + + --XY plane markers + for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do + local marker = minetest.add_entity({x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z}, "tubelib:region_cube") + if marker ~= nil then + marker:set_properties({ + visual_size={x=sizex * 2, y=sizey * 2}, + collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness}, + }) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end + end + + --YZ plane markers + for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do + local marker = minetest.add_entity({x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5}, "tubelib:region_cube") + if marker ~= nil then + marker:set_properties({ + visual_size={x=sizez * 2, y=sizey * 2}, + collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez}, + }) + marker:setyaw(math.pi / 2) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end + end + + marker_region[name] = markers +end + +function tubelib.switch_region(name, pos1, pos2) + if marker_region[name] ~= nil then --marker already exists + tubelib.unmark_region(name) + else + tubelib.mark_region(name, pos1, pos2) + end +end + +minetest.register_entity(":tubelib:region_cube", { + initial_properties = { + visual = "upright_sprite", + visual_size = {x=1.1, y=1.1}, + textures = {"tubelib_cube.png"}, + use_texture_alpha = true, + visual_size = {x=10, y=10}, + physical = false, + }, + on_step = function(self, dtime) + if marker_region[self.player_name] == nil then + self.object:remove() + return + end + end, + on_punch = function(self, hitter) + tubelib.unmark_region(self.player_name) + end, +}) + diff --git a/mods/techpack/tubelib/migrate.lua b/mods/techpack/tubelib/migrate.lua new file mode 100644 index 00000000..1c918917 --- /dev/null +++ b/mods/techpack/tubelib/migrate.lua @@ -0,0 +1,133 @@ +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local Tube = tubelib.Tube + +local TubesTranslation = { + ["tubelib:tube1"] = {[0]= + {12, "S"}, + {21, "S"}, + {12, "S"}, + {21, "S"}, + }, + ["tubelib:tube2"] = {[0]= + { 4, "S"}, + { 4, "S"}, + { 4, "S"}, + { 4, "S"}, + }, + ["tubelib:tube3"] = {[0]= + { 5, "A"}, + {14, "A"}, + {11, "A"}, + { 7, "A"}, + }, + ["tubelib:tube4"] = {[0]= + { 0, "A"}, + {15, "A"}, + { 8, "A"}, + { 3, "A"}, + }, + ["tubelib:tube5"] = {[0]= + {20, "A"}, + {13, "A"}, + {10, "A"}, + {19, "A"}, + }, +} + +minetest.register_lbm({ + label = "[Tubelib] tubes migration", + name = "tubelib:migrate", + nodenames = { + "tubelib:tube1", + "tubelib:tube2", + "tubelib:tube3", + "tubelib:tube4", + "tubelib:tube5", + "tubelib_addons3:teleporter", + }, + run_at_every_load = true, + action = function(pos, node) + if node.name == "tubelib_addons3:teleporter" then + local meta = M(pos) + local peer = meta:get_string("peer") + if peer ~= "" then + meta:set_string("tele_pos", peer) + local peer_pos = P(peer) + local _,node = Tube:get_node(peer_pos) + local tube_dir = ((3 + (node.param2 % 4)) % 4) + 1 + --print("migrate "..node.name.." at "..S(pos)) + meta:set_string("peer", nil) + if tube_dir then + meta:set_int("tube_dir", tube_dir) + end + tube_dir = Tube:get_primary_dir(pos) + Tube:tool_repair_tube(Tube:get_pos(pos, tube_dir)) + end + else + local items = TubesTranslation[node.name][node.param2] + if items then + --print("migrate "..node.name.." at "..S(pos)) + local param2, ntype = items[1], items[2] + minetest.set_node(pos, {name = "tubelib:tube"..ntype, param2 = param2}) + end + end + end +}) + +-- legacy tube, to be converted after placed +minetest.register_node("tubelib:tube1", { + description = "Tubelib Tube (old)", + tiles = { -- Top, base, right, left, front, back + "tubelib_tube.png^tubelib_defect.png^[transformR90", + "tubelib_tube.png^tubelib_defect.png^[transformR90", + "tubelib_tube.png^tubelib_defect.png", + "tubelib_tube.png^tubelib_defect.png", + "tubelib_hole.png", + "tubelib_hole.png", + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + if not Tube:after_place_tube(pos, placer, pointed_thing) then + minetest.remove_node(pos) + return true + end + return false + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2/8, -2/8, -4/8, 2/8, 2/8, 4/8}, + }, + }, + selection_box = { + type = "fixed", + fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, + }, + collision_box = { + type = "fixed", + fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, + }, + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy=2, cracky=3, stone=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + type = "shapeless", + output = "tubelib:tubeS", + recipe = {"tubelib:tube1"}, +}) diff --git a/mods/techpack/tubelib/mod.conf b/mods/techpack/tubelib/mod.conf new file mode 100644 index 00000000..75fca445 --- /dev/null +++ b/mods/techpack/tubelib/mod.conf @@ -0,0 +1,3 @@ +name=tubelib +description=Tubes Mod with message communication interface as basis for further technique Mods. +depends=default,tubelib2,basic_materials diff --git a/mods/techpack/tubelib/node_states.lua b/mods/techpack/tubelib/node_states.lua new file mode 100644 index 00000000..573ff6c5 --- /dev/null +++ b/mods/techpack/tubelib/node_states.lua @@ -0,0 +1,466 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + node_states.lua: + + A state model/class for tubelib nodes. + +]]-- + + +--[[ + +Node states: + + +-----------------------------------+ +------------+ + | | | | + | V V | + | +---------+ | + | | | | + | +---------| STOPPED | | + | | | | | + | button | +---------+ | + | | ^ | + repair | V | button | + | +---------+ | | button + | | |---------+ | + | | RUNNING | | + | +--------| |---------+ | + | | +---------+ | | + | | ^ | | | + | | | | | | + | V | V V | + | +---------+ +----------+ +---------+ | + | | | | | | | | + +---| DEFECT | | STANDBY/ | | FAULT |----------+ + | | | BLOCKED | | | + +---------+ +----------+ +---------+ + +Node metadata: + "tubelib_number" - string with tubelib number, like "0123" + "tubelib_state" - node state, like "RUNNING" + "tubelib_item_meter" - node item/runtime counter + "tubelib_countdown" - countdown to stadby mode + "tubelib_aging" - aging counter +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + + +local AGING_FACTOR = 4 -- defect random factor + +-- +-- Local States +-- +local STOPPED = tubelib.STOPPED +local RUNNING = tubelib.RUNNING +local STANDBY = tubelib.STANDBY +local FAULT = tubelib.FAULT +local BLOCKED = tubelib.BLOCKED +local DEFECT = tubelib.DEFECT + + +-- +-- NodeStates Class Functions +-- +tubelib.NodeStates = {} +local NodeStates = tubelib.NodeStates + +local function start_condition_fullfilled(pos, meta) + return true +end + +function NodeStates:new(attr) + local o = { + -- mandatory + cycle_time = attr.cycle_time, -- for running state + standby_ticks = attr.standby_ticks, -- for standby state + has_item_meter = attr.has_item_meter, -- true/false + -- optional + node_name_passive = attr.node_name_passive, + node_name_active = attr.node_name_active, + node_name_defect = attr.node_name_defect, + infotext_name = attr.infotext_name, + start_condition_fullfilled = attr.start_condition_fullfilled or start_condition_fullfilled, + on_start = attr.on_start, + on_stop = attr.on_stop, + formspec_func = attr.formspec_func, + } + if attr.aging_factor then + o.aging_level1 = attr.aging_factor * tubelib.machine_aging_value + o.aging_level2 = attr.aging_factor * tubelib.machine_aging_value * AGING_FACTOR + end + setmetatable(o, self) + self.__index = self + return o +end + +function NodeStates:node_init(pos, number) + local meta = M(pos) + meta:set_int("tubelib_state", STOPPED) + meta:set_string("tubelib_number", number) + if self.infotext_name then + meta:set_string("infotext", self.infotext_name.." "..number..": stopped") + end + if self.has_item_meter then + meta:set_int("tubelib_item_meter", 0) + end + if self.aging_level1 then + meta:set_int("tubelib_aging", 0) + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end +end + +function NodeStates:stop(pos, meta) + local state = meta:get_int("tubelib_state") + if state ~= DEFECT then + if self.on_stop then + self.on_stop(pos, meta, state) + end + meta:set_int("tubelib_state", STOPPED) + if self.node_name_passive then + local node = minetest.get_node(pos) + node.name = self.node_name_passive + minetest.swap_node(pos, node) + end + if self.infotext_name then + local number = meta:get_string("tubelib_number") + meta:set_string("infotext", self.infotext_name.." "..number..": stopped") + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end + minetest.get_node_timer(pos):stop() + return true + end + return false +end + +function NodeStates:start(pos, meta, called_from_on_timer) + local state = meta:get_int("tubelib_state") + if state == STOPPED or state == STANDBY or state == BLOCKED then + if not self.start_condition_fullfilled(pos, meta) then + return false + end + if self.on_start then + self.on_start(pos, meta, state) + end + meta:set_int("tubelib_state", RUNNING) + meta:set_int("tubelib_countdown", 4) + if called_from_on_timer then + -- timer has to be stopped once to be able to be restarted + self.stop_timer = true + end + if self.node_name_active then + local node = minetest.get_node(pos) + node.name = self.node_name_active + minetest.swap_node(pos, node) + end + if self.infotext_name then + local number = meta:get_string("tubelib_number") + meta:set_string("infotext", self.infotext_name.." "..number..": running") + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end + minetest.get_node_timer(pos):start(self.cycle_time) + return true + end + return false +end + +function NodeStates:standby(pos, meta) + if meta:get_int("tubelib_state") == RUNNING then + meta:set_int("tubelib_state", STANDBY) + -- timer has to be stopped once to be able to be restarted + self.stop_timer = true + if self.node_name_passive then + local node = minetest.get_node(pos) + node.name = self.node_name_passive + minetest.swap_node(pos, node) + end + if self.infotext_name then + local number = meta:get_string("tubelib_number") + meta:set_string("infotext", self.infotext_name.." "..number..": standby") + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end + minetest.get_node_timer(pos):start(self.cycle_time * self.standby_ticks) + return true + end + return false +end + +-- special case of standby for pushing nodes +function NodeStates:blocked(pos, meta) + if meta:get_int("tubelib_state") == RUNNING then + meta:set_int("tubelib_state", BLOCKED) + -- timer has to be stopped once to be able to be restarted + self.stop_timer = true + if self.node_name_passive then + local node = minetest.get_node(pos) + node.name = self.node_name_passive + minetest.swap_node(pos, node) + end + if self.infotext_name then + local number = meta:get_string("tubelib_number") + meta:set_string("infotext", self.infotext_name.." "..number..": blocked") + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end + minetest.get_node_timer(pos):start(self.cycle_time * self.standby_ticks) + return true + end + return false +end + +function NodeStates:fault(pos, meta) + if meta:get_int("tubelib_state") == RUNNING then + meta:set_int("tubelib_state", FAULT) + if self.node_name_passive then + local node = minetest.get_node(pos) + node.name = self.node_name_passive + minetest.swap_node(pos, node) + end + if self.infotext_name then + local number = meta:get_string("tubelib_number") + meta:set_string("infotext", self.infotext_name.." "..number..": fault") + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end + minetest.get_node_timer(pos):stop() + return true + end + return false +end + +function NodeStates:defect(pos, meta) + meta:set_int("tubelib_state", DEFECT) + if self.node_name_defect then + local node = minetest.get_node(pos) + node.name = self.node_name_defect + minetest.swap_node(pos, node) + end + if self.infotext_name then + local number = meta:get_string("tubelib_number") + meta:set_string("infotext", self.infotext_name.." "..number..": defect") + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end + minetest.get_node_timer(pos):stop() + return true +end + +function NodeStates:get_state(meta) + return meta:get_int("tubelib_state") +end + +function NodeStates:get_state_string(meta) + return tubelib.StateStrings[meta:get_int("tubelib_state")] +end + +function NodeStates:is_active(meta) + local state = meta:get_int("tubelib_state") + if self.stop_timer == true then + self.stop_timer = false + return false + end + return state == RUNNING or state == STANDBY or state == BLOCKED +end + +-- To be called if node is idle. +-- If countdown reaches zero, the node is set to STANDBY. +function NodeStates:idle(pos, meta) + local countdown = meta:get_int("tubelib_countdown") - 1 + meta:set_int("tubelib_countdown", countdown) + if countdown < 0 then + self:standby(pos, meta) + end +end + +-- To be called after successful node action to raise the timer +-- and keep the node in state RUNNING +function NodeStates:keep_running(pos, meta, val, num_items) + if not num_items or num_items < 1 then num_items = 1 end + -- set to RUNNING if not already done + self:start(pos, meta, true) + meta:set_int("tubelib_countdown", val) + meta:set_int("tubelib_item_meter", meta:get_int("tubelib_item_meter") + (num_items or 1)) + + if self.aging_level1 then + local cnt = meta:get_int("tubelib_aging") + num_items + meta:set_int("tubelib_aging", cnt) + if (cnt > (self.aging_level1) and math.random(math.max(1, math.floor(self.aging_level2/num_items))) == 1) + or cnt >= 999999 then + self:defect(pos, meta) + end + end +end + +-- Start/stop node based on button events. +-- if function returns false, no button was pressed +function NodeStates:state_button_event(pos, fields) + if fields.state_button ~= nil then + local state = self:get_state(M(pos)) + if state == STOPPED or state == STANDBY or state == BLOCKED then + self:start(pos, M(pos)) + elseif state == RUNNING or state == FAULT then + self:stop(pos, M(pos)) + end + return true + end + return false +end + +function NodeStates:get_state_button_image(meta) + local state = meta:get_int("tubelib_state") + return tubelib.state_button(state) +end + +-- command interface +function NodeStates:on_receive_message(pos, topic, payload) + if topic == "on" then + self:start(pos, M(pos)) + return true + elseif topic == "off" then + self:stop(pos, M(pos)) + return true + elseif topic == "state" then + local node = minetest.get_node(pos) + if node.name == "ignore" then -- unloaded node? + return "blocked" + end + return self:get_state_string(M(pos)) + elseif self.has_item_meter and topic == "counter" then + return M(pos):get_int("tubelib_item_meter") + elseif self.has_item_meter and topic == "clear_counter" then + M(pos):set_int("tubelib_item_meter", 0) + return true + elseif self.aging_level1 and topic == "aging" then + return M(pos):get_int("tubelib_aging") + end +end + +-- repair corrupt node data and/or migrate node to state2 +function NodeStates:on_node_load(pos, not_start_timer) + local meta = minetest.get_meta(pos) + + -- legacy node number/state/counter? + local number = meta:get_string("number") + if number ~= "" and number ~= nil then + meta:set_string("tubelib_number", number) + meta:set_int("tubelib_state", tubelib.state(meta:get_int("running"))) + if self.has_item_meter then + meta:set_int("tubelib_item_meter", meta:get_int("counter")) + end + if self.aging_level1 then + meta:set_int("tubelib_aging", 0) + end + meta:set_string("number", nil) + meta:set_int("running", 0) + meta:set_int("counter", 0) + end + + -- node corrupt? + if not tubelib.data_not_corrupted(pos) then + return + end + + -- state corrupt? + local state = meta:get_int("tubelib_state") + if state == 0 then + if minetest.get_node_timer(pos):is_started() then + meta:set_int("tubelib_state", RUNNING) + else + meta:set_int("tubelib_state", STOPPED) + end + elseif state == RUNNING and not not_start_timer then + minetest.get_node_timer(pos):start(self.cycle_time) + elseif state == STANDBY then + minetest.get_node_timer(pos):start(self.cycle_time * self.standby_ticks) + elseif state == BLOCKED then + minetest.get_node_timer(pos):start(self.cycle_time * self.standby_ticks) + end + + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end +end + +-- Repair of defect (feature!) nodes +function NodeStates:on_node_repair(pos) + local meta = M(pos) + if meta:get_int("tubelib_state") == DEFECT then + meta:set_int("tubelib_state", STOPPED) + if self.node_name_passive then + local node = minetest.get_node(pos) + node.name = self.node_name_passive + minetest.swap_node(pos, node) + end + if self.aging_level1 then + meta:set_int("tubelib_aging", 0) + end + if self.infotext_name then + local number = meta:get_string("tubelib_number") + meta:set_string("infotext", self.infotext_name.." "..number..": stopped") + end + if self.formspec_func then + meta:set_string("formspec", self.formspec_func(self, pos, meta)) + end + return true + end + return false +end + + +--[[ +Callback after digging a node but before removing the node. + +The tubelib node becomes defect after digging it: + - always if the aging counter "tubelib_aging" is greater than self.aging_level2 + - with a certain probability if the aging counter "tubelib_aging" is greater than self.aging_level1 + but smaller than self.aging_level2 + +Info: If a tubelib machine has been running quite some time but is dropped as a non-defect machine and then placed back again, the +tubelib machine will be reset to new (digging will reset the aging counter). So this code tries to prevent this exploit + +]]-- +function NodeStates:on_dig_node(pos, node, player) + local meta = M(pos) + local cnt = tonumber(meta:get_string("tubelib_aging")) + if (not cnt or cnt < 1) then + cnt = 1 + end + + local is_defect = (cnt > self.aging_level1) and ( math.random(math.max(1, math.floor(self.aging_level2 / cnt))) == 1 ) + + if is_defect then + self:defect(pos, meta) -- replace node with defect one + node = minetest.get_node(pos) + end + + + minetest.node_dig(pos, node, player) -- default behaviour (this function is called automatically if on_dig() callback isn't set) + +end + + + + + diff --git a/mods/techpack/tubelib/pusher.lua b/mods/techpack/tubelib/pusher.lua new file mode 100644 index 00000000..87fc30c7 --- /dev/null +++ b/mods/techpack/tubelib/pusher.lua @@ -0,0 +1,252 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + pusher.lua: + + Simple node for push/pull operation of StackItems from chests or other + inventory/server nodes to tubes or other inventory/server nodes. + + The Pusher is based on the class NodeStates and supports the following messages: + - topic = "on", payload = nil + - topic = "off", payload = nil + - topic = "state", payload = nil, + response is "running", "stopped", "standby", "blocked", or "not supported" + +]]-- + +-- +--------+ +-- / /| +-- +--------+ | +-- IN (L) -->| |x--> OUT (R) +-- | PUSHER | + +-- | |/ +-- +--------+ + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 5 +local COUNTDOWN_TICKS = 5 +local CYCLE_TIME = 2 + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib:pusher", + node_name_active = "tubelib:pusher_active", + node_name_defect = "tubelib:pusher_defect", + infotext_name = "Tubelib Pusher", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 10, +}) + +local function pushing(pos, meta) + local player_name = meta:get_string("player_name") + local items = tubelib.pull_items(pos, "L", player_name) -- <<=== tubelib + if items ~= nil then + if tubelib.push_items(pos, "R", items, player_name) == false then -- <<=== tubelib + -- place item back + tubelib.unpull_items(pos, "L", items, player_name) -- <<=== tubelib + State:blocked(pos, meta) + return + end + State:keep_running(pos, meta, COUNTDOWN_TICKS) + return + end + State:idle(pos, meta) +end + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + pushing(pos, meta) + return State:is_active(meta) + end + return false +end + +minetest.register_node("tubelib:pusher", { + description = "Tubelib Pusher", + tiles = { + -- up, down, right, left, back, front + 'tubelib_pusher1.png', + 'tubelib_pusher1.png', + 'tubelib_outp.png', + 'tubelib_inp.png', + "tubelib_pusher1.png^[transformR180]", + "tubelib_pusher1.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + local number = tubelib.add_node(pos, "tubelib:pusher") -- <<=== tubelib + State:node_init(pos, number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + State:start(pos, M(pos)) + end + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib:pusher_active", { + description = "Tubelib Pusher", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_pusher.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + { + image = "tubelib_pusher.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_outp.png', + 'tubelib_inp.png', + { + image = "tubelib_pusher.png^[transformR180]", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + { + image = "tubelib_pusher.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + }, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + State:stop(pos, M(pos)) + end + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib:pusher_defect", { + description = "Tubelib Pusher", + tiles = { + -- up, down, right, left, back, front + 'tubelib_pusher1.png', + 'tubelib_pusher1.png', + 'tubelib_outp.png^tubelib_defect.png', + 'tubelib_inp.png^tubelib_defect.png', + "tubelib_pusher1.png^[transformR180]^tubelib_defect.png", + "tubelib_pusher1.png^tubelib_defect.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + local number = tubelib.add_node(pos, "tubelib:pusher") -- <<=== tubelib + State:node_init(pos, number) + State:defect(pos, meta) + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) -- <<=== tubelib + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib:pusher 2", + recipe = { + {"group:wood", "wool:dark_green", "group:wood"}, + {"tubelib:tubeS", "default:mese_crystal", "tubelib:tubeS"}, + {"group:wood", "wool:dark_green", "group:wood"}, + }, +}) + +--------------------------------------------------------------- tubelib +tubelib.register_node("tubelib:pusher", + {"tubelib:pusher_active", "tubelib:pusher_defect"}, { + on_pull_item = nil, -- pusher has no inventory + on_push_item = nil, -- pusher has no inventory + on_unpull_item = nil, -- pusher has no inventory + is_pusher = true, -- is a pulling/pushing node + + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) +--------------------------------------------------------------- tubelib diff --git a/mods/techpack/tubelib/repairkit.lua b/mods/techpack/tubelib/repairkit.lua new file mode 100644 index 00000000..4aba31e9 --- /dev/null +++ b/mods/techpack/tubelib/repairkit.lua @@ -0,0 +1,92 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + repairkit.lua: +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local function destroy_node(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.under + if not minetest.is_protected(pos, placer:get_player_name()) then + M(pos):set_int("tubelib_aging", 999999) + end + end +end + +local function repair_node(itemstack, user, pointed_thing) + local pos = pointed_thing.under + if pos then + if tubelib.repair_node(pos) then + minetest.chat_send_player(user:get_player_name(), "[Tubelib] Node repaired") + itemstack:take_item() + return itemstack + end + end + return +end + +local function read_state(itemstack, user, pointed_thing) + local pos = pointed_thing.under + if pos then + local number = tubelib.get_node_number(pos) + if number then + local state = tubelib.send_request(number, "state", nil) + local counter = tubelib.send_request(number, "counter", nil) + local aging = tubelib.send_request(number, "aging", nil) + if state and counter and aging then + if type(counter) ~= "number" then counter = "unknown" end + minetest.chat_send_player(user:get_player_name(), "[Tubelib] state ="..state..", counter = "..counter..", aging = "..aging) + end + end + end +end + +minetest.register_craftitem("tubelib:repairkit", { + description = "Tubelib Repair Kit", + inventory_image = "tubelib_repairkit.png", + wield_image = "tubelib_repairkit.png^[transformR270", + groups = {cracky=1, book=1}, + on_use = repair_node, + node_placement_prediction = "", +}) + + +minetest.register_node("tubelib:end_wrench", { + description = "Tubelib End Wrench (use = read status, place = destroy)", + inventory_image = "tubelib_end_wrench.png", + wield_image = "tubelib_end_wrench.png", + groups = {cracky=1, book=1}, + on_use = read_state, + on_place = destroy_node, + node_placement_prediction = "", +}) + +minetest.register_craft({ + output = "tubelib:repairkit", + recipe = { + {"", "basic_materials:gear_steel", ""}, + {"", "tubelib:end_wrench", ""}, + {"", "basic_materials:oil_extract", ""}, + }, +}) + +minetest.register_craft({ + output = "tubelib:end_wrench 4", + recipe = { + {"", "", "default:steel_ingot"}, + {"", "default:tin_ingot", ""}, + {"default:steel_ingot", "", ""}, + }, +}) diff --git a/mods/techpack/tubelib/settingtypes.txt b/mods/techpack/tubelib/settingtypes.txt new file mode 100644 index 00000000..b44b4c1f --- /dev/null +++ b/mods/techpack/tubelib/settingtypes.txt @@ -0,0 +1,10 @@ +# Maximim number of Forceload Blocks per player (default 12) +tubelib_max_num_forceload_blocks (max number of Forceload Blocks) int 12 + +# Enable Basalt Stone (and disable ore generation via cobble generator) +tubelib_basalt_stone_enabled (Basalt Stone enabled) bool true + +# This aging value is used to calculate the lifetime of machines before +# they go defect . The value 200 (default) results in a lifetime +# for standard machines of about 2000 - 8000 item processing cycles. +tubelib_machine_aging_value (machine aging value) int 200 \ No newline at end of file diff --git a/mods/techpack/tubelib/sounds/button.ogg b/mods/techpack/tubelib/sounds/button.ogg new file mode 100644 index 00000000..3d6b28c5 Binary files /dev/null and b/mods/techpack/tubelib/sounds/button.ogg differ diff --git a/mods/techpack/tubelib/states.lua b/mods/techpack/tubelib/states.lua new file mode 100644 index 00000000..3710d63a --- /dev/null +++ b/mods/techpack/tubelib/states.lua @@ -0,0 +1,89 @@ +--[[ + + Tube Library + ============ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + states.lua: + + A state model for tubelib nodes. + +]]-- + +-- +-- Tubelib machine states +-- +tubelib.STOPPED = 1 -- not operational/turned off +tubelib.RUNNING = 2 -- in normal operation/turned on +tubelib.STANDBY = 3 -- nothing to do (e.g. no input items), or blocked anyhow (output jammed), + -- or node (world) not loaded +tubelib.FAULT = 4 -- any fault state (e.g. no fuel), which can be fixed by the player +tubelib.BLOCKED = 5 -- a pushing node is blocked due to a full destination inventory +tubelib.DEFECT = 6 -- a defect (broken), which has to be repaired by the player + +tubelib.StatesImg = { + "tubelib_inv_button_off.png", + "tubelib_inv_button_on.png", + "tubelib_inv_button_standby.png", + "tubelib_inv_button_error.png", + "tubelib_inv_button_warning.png", + "tubelib_inv_button_off.png", +} + +-- Return state button image for the node inventory +function tubelib.state_button(state) + if state and state < 7 and state > 0 then + return tubelib.StatesImg[state] + end + return "tubelib_inv_button_off.png" +end + +-- State string based on button states +tubelib.StateStrings = {"stopped", "running", "standby", "fault", "blocked", "defect"} + + + + +-- +-- 'running' variable States (deprecated) +-- + +tubelib.STATE_RUNNING = 1 -- in normal operation +tubelib.STATE_STOPPED = 0 -- not operational +tubelib.STATE_STANDBY = -1 -- nothing to do +tubelib.STATE_BLOCKED = -2 -- pushing node is blocked due to a full inventory +tubelib.STATE_FAULT = -3 -- any fault state, which has to be fixed by the player + +-- Return machine state based on the running counter +function tubelib.state(running) + if running > 0 then + return tubelib.RUNNING + elseif running == 0 then + return tubelib.STOPPED + elseif running == -1 then + return tubelib.STANDBY + elseif running == -2 then + return tubelib.BLOCKED + else + return tubelib.STOPPED + end +end + +-- Return state string based on the running counter +function tubelib.statestring(running) + if running > 0 then + return "running" + elseif running == 0 then + return "stopped" + elseif running == -1 then + return "standby" + elseif running == -2 then + return "blocked" + else + return "fault" + end +end diff --git a/mods/techpack/tubelib/textures/tubelib_black_hole.png b/mods/techpack/tubelib/textures/tubelib_black_hole.png new file mode 100644 index 00000000..80f31199 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_black_hole.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_black_hole_inp.png b/mods/techpack/tubelib/textures/tubelib_black_hole_inp.png new file mode 100644 index 00000000..bd883f66 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_black_hole_inp.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_blue.png b/mods/techpack/tubelib/textures/tubelib_blue.png new file mode 100644 index 00000000..b8d75c17 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_blue.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_button.png b/mods/techpack/tubelib/textures/tubelib_button.png new file mode 100644 index 00000000..0848a563 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_button.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_button_off.png b/mods/techpack/tubelib/textures/tubelib_button_off.png new file mode 100644 index 00000000..77863ec8 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_button_off.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_button_on.png b/mods/techpack/tubelib/textures/tubelib_button_on.png new file mode 100644 index 00000000..f6c0f23c Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_button_on.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_cube.png b/mods/techpack/tubelib/textures/tubelib_cube.png new file mode 100644 index 00000000..767e9d46 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_cube.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_defect.png b/mods/techpack/tubelib/textures/tubelib_defect.png new file mode 100644 index 00000000..5cb0b7ce Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_defect.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_distributor.png b/mods/techpack/tubelib/textures/tubelib_distributor.png new file mode 100644 index 00000000..653ab565 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_distributor.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_distributor_active.png b/mods/techpack/tubelib/textures/tubelib_distributor_active.png new file mode 100644 index 00000000..3893ae00 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_distributor_active.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_distributor_blue.png b/mods/techpack/tubelib/textures/tubelib_distributor_blue.png new file mode 100644 index 00000000..f43e2b67 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_distributor_blue.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_distributor_green.png b/mods/techpack/tubelib/textures/tubelib_distributor_green.png new file mode 100644 index 00000000..92e92769 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_distributor_green.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_distributor_red.png b/mods/techpack/tubelib/textures/tubelib_distributor_red.png new file mode 100644 index 00000000..6ec1e03b Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_distributor_red.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_distributor_yellow.png b/mods/techpack/tubelib/textures/tubelib_distributor_yellow.png new file mode 100644 index 00000000..0573c7d2 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_distributor_yellow.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_end_wrench.png b/mods/techpack/tubelib/textures/tubelib_end_wrench.png new file mode 100644 index 00000000..60d23f56 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_end_wrench.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_forceload.png b/mods/techpack/tubelib/textures/tubelib_forceload.png new file mode 100644 index 00000000..b45f8d25 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_forceload.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_front.png b/mods/techpack/tubelib/textures/tubelib_front.png new file mode 100644 index 00000000..d3f9b7ad Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_front.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_green.png b/mods/techpack/tubelib/textures/tubelib_green.png new file mode 100644 index 00000000..014a96e6 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_green.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_gui_arrow.png b/mods/techpack/tubelib/textures/tubelib_gui_arrow.png new file mode 100644 index 00000000..f5565f7e Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_gui_arrow.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_hole.png b/mods/techpack/tubelib/textures/tubelib_hole.png new file mode 100644 index 00000000..6d61205f Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_hole.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_hole2.png b/mods/techpack/tubelib/textures/tubelib_hole2.png new file mode 100644 index 00000000..f890046a Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_hole2.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_inp.png b/mods/techpack/tubelib/textures/tubelib_inp.png new file mode 100644 index 00000000..f884169e Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_inp.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_inv_button_error.png b/mods/techpack/tubelib/textures/tubelib_inv_button_error.png new file mode 100644 index 00000000..e4b0d1d6 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_inv_button_error.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_inv_button_off.png b/mods/techpack/tubelib/textures/tubelib_inv_button_off.png new file mode 100644 index 00000000..355fee5c Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_inv_button_off.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_inv_button_on.png b/mods/techpack/tubelib/textures/tubelib_inv_button_on.png new file mode 100644 index 00000000..a10aa506 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_inv_button_on.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_inv_button_standby.png b/mods/techpack/tubelib/textures/tubelib_inv_button_standby.png new file mode 100644 index 00000000..a13b2015 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_inv_button_standby.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_inv_button_warning.png b/mods/techpack/tubelib/textures/tubelib_inv_button_warning.png new file mode 100644 index 00000000..33ec686b Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_inv_button_warning.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_knee.png b/mods/techpack/tubelib/textures/tubelib_knee.png new file mode 100644 index 00000000..935d75e9 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_knee.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_knee2.png b/mods/techpack/tubelib/textures/tubelib_knee2.png new file mode 100644 index 00000000..50b32056 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_knee2.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_lamp.png b/mods/techpack/tubelib/textures/tubelib_lamp.png new file mode 100644 index 00000000..e4c2b096 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_lamp.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_outp.png b/mods/techpack/tubelib/textures/tubelib_outp.png new file mode 100644 index 00000000..3b1dc206 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_outp.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_pusher.png b/mods/techpack/tubelib/textures/tubelib_pusher.png new file mode 100644 index 00000000..26726ae9 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_pusher.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_pusher1.png b/mods/techpack/tubelib/textures/tubelib_pusher1.png new file mode 100644 index 00000000..296260a3 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_pusher1.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_red.png b/mods/techpack/tubelib/textures/tubelib_red.png new file mode 100644 index 00000000..4e4cd2ab Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_red.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_repairkit.png b/mods/techpack/tubelib/textures/tubelib_repairkit.png new file mode 100644 index 00000000..8215c464 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_repairkit.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_tube.png b/mods/techpack/tubelib/textures/tubelib_tube.png new file mode 100644 index 00000000..72b8602b Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_tube.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_wlanchip.png b/mods/techpack/tubelib/textures/tubelib_wlanchip.png new file mode 100644 index 00000000..c4ddb933 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_wlanchip.png differ diff --git a/mods/techpack/tubelib/textures/tubelib_yellow.png b/mods/techpack/tubelib/textures/tubelib_yellow.png new file mode 100644 index 00000000..8ac93436 Binary files /dev/null and b/mods/techpack/tubelib/textures/tubelib_yellow.png differ diff --git a/mods/techpack/tubelib/tubes.lua b/mods/techpack/tubelib/tubes.lua new file mode 100644 index 00000000..f2e932f8 --- /dev/null +++ b/mods/techpack/tubelib/tubes.lua @@ -0,0 +1,130 @@ +--[[ + + Tubes based on tubelib2 + ======================= + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + tubes.lua: Node registration and API functions to move items via tubes + +]]-- + +-- used for registered nodes +tubelib.KnownNodes = { + ["tubelib:tubeS"] = true, + ["tubelib:tubeA"] = true, +} + + +local Tube = tubelib2.Tube:new({ + -- North, East, South, West, Down, Up + dirs_to_check = {1,2,3,4,5,6}, + max_tube_length = 200, + show_infotext = false, + primary_node_names = {"tubelib:tubeS", "tubelib:tubeA"}, + after_place_tube = function(pos, param2, tube_type, num_tubes, tbl) + minetest.swap_node(pos, {name = "tubelib:tube"..tube_type, param2 = param2}) + end, +}) + +tubelib.Tube = Tube + +minetest.register_node("tubelib:tubeS", { + description = "Tubelib Tube", + tiles = { -- Top, base, right, left, front, back + "tubelib_tube.png^[transformR90", + "tubelib_tube.png^[transformR90", + "tubelib_tube.png", + "tubelib_tube.png", + "tubelib_hole.png", + "tubelib_hole.png", + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + if not Tube:after_place_tube(pos, placer, pointed_thing) then + minetest.remove_node(pos) + return true + end + return false + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2/8, -2/8, -4/8, 2/8, 2/8, 4/8}, + }, + }, + selection_box = { + type = "fixed", + fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, + }, + collision_box = { + type = "fixed", + fixed = { -1/4, -1/4, -1/2, 1/4, 1/4, 1/2 }, + }, + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy=2, cracky=3}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib:tubeA", { + description = "Tubelib Tube", + tiles = { -- Top, base, right, left, front, back + "tubelib_knee2.png", + "tubelib_hole2.png^[transformR180", + "tubelib_knee.png^[transformR270", + "tubelib_knee.png", + "tubelib_knee2.png", + "tubelib_hole2.png", + }, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2/8, -4/8, -2/8, 2/8, 2/8, 2/8}, + {-2/8, -2/8, -4/8, 2/8, 2/8, -2/8}, + }, + }, + selection_box = { + type = "fixed", + fixed = { -1/4, -1/2, -1/2, 1/4, 1/4, 1/4 }, + }, + collision_box = { + type = "fixed", + fixed = { -1/4, -1/2, -1/2, 1/4, 1/4, 1/4 }, + }, + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {choppy=2, cracky=3, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + drop = "tubelib:tubeS", +}) + +minetest.register_craft({ + output = "tubelib:tubeS 4", + recipe = { + {"default:steel_ingot", "", "group:wood"}, + {"", "group:wood", ""}, + {"group:wood", "", "default:tin_ingot"}, + }, +}) diff --git a/mods/techpack/tubelib_addons1/README.md b/mods/techpack/tubelib_addons1/README.md new file mode 100644 index 00000000..499481eb --- /dev/null +++ b/mods/techpack/tubelib_addons1/README.md @@ -0,0 +1,17 @@ +# Tubelib Extension with Mining, Farming, and Crafting Nodes \[tubelib_addons1\] + +This Mod provides Quarry, Harvester, Grinder, Autocrafter, Fermenter, Funnel, Detector, and Reformer nodes and thus allows +the automated mining, farming, and crafting. + +A Tutorial to this Mod is available as ![Wiki](https://github.com/joe7575/techpack/wiki) + + +With contributions from: +* obl3pplifp, https://github.com/obl3pplifp/techpack_compat and as pull requests +* realmicu, as pull requests +* theFox6, as pull request + + +## Dependencies +tubelib, default +opt. unified_inventory diff --git a/mods/techpack/tubelib_addons1/autocrafter.lua b/mods/techpack/tubelib_addons1/autocrafter.lua new file mode 100644 index 00000000..8437903e --- /dev/null +++ b/mods/techpack/tubelib_addons1/autocrafter.lua @@ -0,0 +1,454 @@ +--[[ + + Tubelib Addons + ============== + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + The autocrafter is derived from pipeworks: + Copyright (C) 2004 Sam Hocevar WTFPL + + autocrafter.lua: + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 6 +local COUNTDOWN_TICKS = 6 +local CYCLE_TIME = 2 + +local function formspec(self, pos, meta) + return "size[8,9.2]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;recipe;0,0;3,3;]".. + "image[2.8,1;1,1;tubelib_gui_arrow.png]".. + "list[context;output;3.5,1;1,1;]".. + "image_button[3.5,2;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + "list[context;src;0,3.2;8,2;]".. + "list[context;dst;5,0;3,3;]".. + "list[current_player;main;0,5.4;8,4;]" .. + "listring[current_player;main]".. + "listring[context;src]" .. + "listring[current_player;main]".. + "listring[context;dst]" .. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:autocrafter", + node_name_active = "tubelib_addons1:autocrafter_active", + node_name_defect = "tubelib_addons1:autocrafter_defect", + infotext_name = "Tubelib Autocrafter", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 10, + start_condition_fullfilled = function(pos, meta) + local output = meta:get_inventory():get_stack("output", 1) + if output:is_empty() then -- no recipe? + return false + end + return true + end, + formspec_func = formspec, +}) + + +local function count_index(invlist) + local index = {} + for _, stack in pairs(invlist) do + if not stack:is_empty() then + local stack_name = stack:get_name() + index[stack_name] = (index[stack_name] or 0) + stack:get_count() + end + end + return index +end + +-- caches some recipe data +local autocrafterCache = {} + +local function get_craft(pos, inventory, hash) + hash = hash or minetest.hash_node_position(pos) + local craft = autocrafterCache[hash] + if not craft then + local recipe = inventory:get_list("recipe") + local output, decremented_input = minetest.get_craft_result( + {method = "normal", width = 3, items = recipe}) + craft = {recipe = recipe, consumption=count_index(recipe), + output = output, decremented_input = decremented_input} + autocrafterCache[hash] = craft + end + return craft +end + +local function autocraft(pos, meta, inventory, craft) + if not craft then return false end + local output_item = craft.output.item + + -- check if we have enough room in dst + if not inventory:room_for_item("dst", output_item) then + State:blocked(pos, meta) + return + end + local consumption = craft.consumption + local inv_index = count_index(inventory:get_list("src")) + -- check if we have enough material available + for itemname, number in pairs(consumption) do + if (not inv_index[itemname]) or inv_index[itemname] < number then + State:idle(pos, meta) + return + end + end + -- consume material + for itemname, number in pairs(consumption) do + for i = 1, number do -- We have to do that since remove_item does not work if count > stack_max + inventory:remove_item("src", ItemStack(itemname)) + end + end + + -- craft the result into the dst inventory and add any "replacements" as well + inventory:add_item("dst", output_item) + for i = 1, 9 do + inventory:add_item("dst", craft.decremented_input.items[i]) + end + + State:keep_running(pos, meta, COUNTDOWN_TICKS, output_item:get_count()) +end + + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + local inv = meta:get_inventory() + local craft = get_craft(pos, inv) + local output_item = craft.output.item + autocraft(pos, meta, inv, craft) + return State:is_active(meta) + end + return false +end + +-- note, that this function assumes allready being updated to virtual items +-- and doesn't handle recipes with stacksizes > 1 +local function after_recipe_change(pos, inventory) + local meta = M(pos) + -- if we emptied the grid, there's no point in keeping it running or cached + if inventory:is_empty("recipe") then + autocrafterCache[minetest.hash_node_position(pos)] = nil + inventory:set_stack("output", 1, "") + State:stop(pos, meta) + return + end + local recipe_changed = false + local recipe = inventory:get_list("recipe") + + local hash = minetest.hash_node_position(pos) + local craft = autocrafterCache[hash] + + if craft then + -- check if it changed + local cached_recipe = craft.recipe + for i = 1, 9 do + if recipe[i]:get_name() ~= cached_recipe[i]:get_name() then + autocrafterCache[hash] = nil -- invalidate recipe + craft = nil + break + end + end + end + + craft = craft or get_craft(pos, inventory, hash) + local output_item = craft.output.item + inventory:set_stack("output", 1, output_item) + State:stop(pos, meta) +end + +-- clean out unknown items and groups, which would be handled like unknown items in the crafting grid +-- if minetest supports query by group one day, this might replace them +-- with a canonical version instead +local function normalize(item_list) + for i = 1, #item_list do + local name = item_list[i] + if not minetest.registered_items[name] then + item_list[i] = "" + end + end + return item_list +end + +local function on_output_change(pos, inventory, stack) + if not stack then + inventory:set_list("output", {}) + inventory:set_list("recipe", {}) + else + local input = minetest.get_craft_recipe(stack:get_name()) + if not input.items or input.type ~= "normal" then return end + local items, width = normalize(input.items), input.width + local item_idx, width_idx = 1, 1 + for i = 1, 9 do + if width_idx <= width then + inventory:set_stack("recipe", i, items[item_idx]) + item_idx = item_idx + 1 + else + inventory:set_stack("recipe", i, ItemStack("")) + end + width_idx = (width_idx < 3) and (width_idx + 1) or 1 + end + -- we'll set the output slot in after_recipe_change to the actual result of the new recipe + end + after_recipe_change(pos, inventory) +end + + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local inv = minetest.get_meta(pos):get_inventory() + if listname == "recipe" then + stack:set_count(1) + inv:set_stack(listname, index, stack) + after_recipe_change(pos, inv) + return 0 + elseif listname == "output" then + on_output_change(pos, inv, stack) + return 0 + elseif listname == "src" and State:get_state(M(pos)) == tubelib.STANDBY then + State:start(pos, M(pos)) + end + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end +-- upgrade_autocrafter(pos) + local inv = minetest.get_meta(pos):get_inventory() + if listname == "recipe" then + inv:set_stack(listname, index, ItemStack("")) + after_recipe_change(pos, inv) + return 0 + elseif listname == "output" then + on_output_change(pos, inv, nil) + return 0 + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local inv = minetest.get_meta(pos):get_inventory() + local stack = inv:get_stack(from_list, from_index) + + if to_list == "output" then + on_output_change(pos, inv, stack) + return 0 + elseif from_list == "output" then + on_output_change(pos, inv, nil) + if to_list ~= "recipe" then + return 0 + end -- else fall through to recipe list handling + end + + if from_list == "recipe" or to_list == "recipe" then + if from_list == "recipe" then + inv:set_stack(from_list, from_index, ItemStack("")) + end + if to_list == "recipe" then + stack:set_count(1) + inv:set_stack(to_list, to_index, stack) + end + after_recipe_change(pos, inv) + return 0 + end + + return count +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + State:state_button_event(pos, fields) +end + + +minetest.register_node("tubelib_addons1:autocrafter", { + description = "Tubelib Autocrafter", + drawtype = "normal", + tiles = { + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_autocrafter.png'}, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:autocrafter") + State:node_init(pos, number) + local inv = M(pos):get_inventory() + inv:set_size("src", 2*8) + inv:set_size("recipe", 3*3) + inv:set_size("dst", 3*3) + inv:set_size("output", 1) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") + end, + + on_dig = function(pos, node, player) + autocrafterCache[minetest.hash_node_position(pos)] = nil + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:autocrafter_active", { + description = "Tubelib Autocrafter", + drawtype = "normal", + tiles = { + 'tubelib_front.png', + 'tubelib_front.png', + { + image = 'tubelib_addons1_autocrafter_active.png', + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 0.5, + }, + }, + }, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:autocrafter_defect", { + description = "Tubelib Autocrafter", + drawtype = "normal", + tiles = { + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_autocrafter.png^tubelib_defect.png' + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:autocrafter") + State:node_init(pos, number) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size("src", 2*8) + inv:set_size("recipe", 3*3) + inv:set_size("dst", 3*3) + inv:set_size("output", 1) + State:defect(pos, meta) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + autocrafterCache[minetest.hash_node_position(pos)] = nil + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "tubelib_addons1:autocrafter", + recipe = { + {"group:wood", "default:steel_ingot", "group:wood"}, + {"tubelib:tubeS", "default:mese_crystal", "tubelib:tubeS"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) + + +tubelib.register_node("tubelib_addons1:autocrafter", + {"tubelib_addons1:autocrafter_active", "tubelib_addons1:autocrafter_defect"}, { + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "dst") + end, + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "dst") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "dst", item) + end, + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) diff --git a/mods/techpack/tubelib_addons1/chest.lua b/mods/techpack/tubelib_addons1/chest.lua new file mode 100644 index 00000000..c585b385 --- /dev/null +++ b/mods/techpack/tubelib_addons1/chest.lua @@ -0,0 +1,167 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + chest.lua + +]]-- + +local PlayerActions = {} +local InventoryState = {} + + +local function store_action(pos, player, action, stack) + local meta = minetest.get_meta(pos) + local name = player and player:get_player_name() or "" + local number = meta:get_string("number") + local item = stack:get_name().." "..stack:get_count() + PlayerActions[number] = {name, action, item} +end + +local function send_off_command(pos) + local meta = minetest.get_meta(pos) + local dest_num = meta:get_string("dest_num") + local own_num = meta:get_string("number") + local owner = meta:get_string("owner") + tubelib.send_message(dest_num, owner, nil, "off", own_num) +end + + +local function send_command(pos) + local meta = minetest.get_meta(pos) + local dest_num = meta:get_string("dest_num") + if dest_num ~= "" then + local own_num = meta:get_string("number") + local owner = meta:get_string("owner") + tubelib.send_message(dest_num, owner, nil, "on", own_num) + minetest.after(1, send_off_command, pos) + end +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + store_action(pos, player, "put", stack) + send_command(pos) + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + store_action(pos, player, "take", stack) + send_command(pos) + return stack:get_count() +end + +local function formspec() + return "size[9,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;main;0.5,0;8,4;]".. + "list[current_player;main;0.5,4.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +minetest.register_node("tubelib_addons1:chest", { + description = "Tubelib Protected Chest", + tiles = { + -- up, down, right, left, back, front + "default_chest_top.png^tubelib_addons1_frame.png", + "default_chest_top.png^tubelib_addons1_frame.png", + "default_chest_side.png^tubelib_addons1_frame.png", + "default_chest_side.png^tubelib_addons1_frame.png", + "default_chest_side.png^tubelib_addons1_frame.png", + "default_chest_lock.png^tubelib_addons1_frame.png", + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 32) + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib_addons1:chest") + meta:set_string("number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("formspec", formspec()) + meta:set_string("infotext", "Tubelib Protected Chest "..number) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + type = "shapeless", + output = "tubelib_addons1:chest", + recipe = {"default:chest", "tubelib:tubeS", "default:steel_ingot"} +}) + +tubelib.register_node("tubelib_addons1:chest", {}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + + on_recv_message = function(pos, topic, payload) + if topic == "state" then + local meta = minetest.get_meta(pos) + return tubelib.get_inv_state(meta, "main") + elseif topic == "player_action" then + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + return PlayerActions[number] + elseif topic == "set_numbers" then + if tubelib.check_numbers(payload) then + local meta = minetest.get_meta(pos) + meta:set_string("dest_num", payload) + local number = meta:get_string("number") + meta:set_string("infotext", "Tubelib Protected Chest "..number.." connected with "..payload) + return true + end + else + return "unsupported" + end + end, +}) diff --git a/mods/techpack/tubelib_addons1/depends.txt b/mods/techpack/tubelib_addons1/depends.txt new file mode 100644 index 00000000..c1ea2c71 --- /dev/null +++ b/mods/techpack/tubelib_addons1/depends.txt @@ -0,0 +1,10 @@ +tubelib +default +bucket +ethereal? +farming? +moreores? +moretrees? +skytest? +stairs? +unified_inventory? diff --git a/mods/techpack/tubelib_addons1/description.txt b/mods/techpack/tubelib_addons1/description.txt new file mode 100644 index 00000000..8307dcb5 --- /dev/null +++ b/mods/techpack/tubelib_addons1/description.txt @@ -0,0 +1,2 @@ +Tubelib Extension with Mining, Farming, and Crafting nodes + diff --git a/mods/techpack/tubelib_addons1/detector.lua b/mods/techpack/tubelib_addons1/detector.lua new file mode 100644 index 00000000..e6573449 --- /dev/null +++ b/mods/techpack/tubelib_addons1/detector.lua @@ -0,0 +1,144 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + detector.lua: + +]]-- + + +local function switch_on(pos) + if tubelib.data_not_corrupted(pos) then + local node = minetest.get_node(pos) + node.name = "tubelib_addons1:detector_active" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):start(1) + local meta = minetest.get_meta(pos) + local own_num = meta:get_string("own_num") + local numbers = meta:get_string("numbers") + local placer_name = meta:get_string("placer_name") + tubelib.send_message(numbers, placer_name, nil, "on", own_num) + end +end + +local function switch_off(pos) + if tubelib.data_not_corrupted(pos) then + local node = minetest.get_node(pos) + node.name = "tubelib_addons1:detector" + minetest.swap_node(pos, node) + local meta = minetest.get_meta(pos) + local own_num = meta:get_string("own_num") + local numbers = meta:get_string("numbers") + local placer_name = meta:get_string("placer_name") + tubelib.send_message(numbers, placer_name, nil, "off", own_num) + end +end + + +minetest.register_node("tubelib_addons1:detector", { + description = "Tubelib Detector", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_outp.png', + 'tubelib_inp.png', + 'tubelib_addons1_detector.png^[transformFX', + "tubelib_addons1_detector.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_num = tubelib.add_node(pos, "tubelib_addons1:detector") + meta:set_string("own_num", own_num) + meta:set_string("formspec", "size[7.5,3]".. + "field[0.5,1;7,1;numbers;Insert destination node number(s);]" .. + "button_exit[2,2;3,1;exit;Save]") + meta:set_string("placer_name", placer:get_player_name()) + meta:set_string("infotext", "Tubelib Detector, unconfigured") + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if tubelib.check_numbers(fields.numbers) then + meta:set_string("numbers", fields.numbers) + local own_num = meta:get_string("own_num") + meta:set_string("infotext", "Tubelib Detector, connected") + meta:set_string("formspec", "size[7.5,3]".. + "field[0.5,1;7,1;numbers;Insert destination node number(s);"..fields.numbers.."]" .. + "button_exit[2,2;3,1;exit;Save]") + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib_addons1:detector_active", { + description = "Tubelib Detector", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_outp.png', + 'tubelib_inp.png', + 'tubelib_addons1_detector_active.png^[transformFX', + "tubelib_addons1_detector_active.png", + }, + + on_timer = switch_off, + on_rotate = screwdriver.disallow, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = 2, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + drop = "tubelib_addons1:detector", +}) + +minetest.register_craft({ + output = "tubelib_addons1:detector", + recipe = { + {"", "group:wood", ""}, + {"tubelib:tubeS", "tubelib:wlanchip", "tubelib:tubeS"}, + {"", "group:wood", ""}, + }, +}) + + +tubelib.register_node("tubelib_addons1:detector", {"tubelib_addons1:detector_active"}, { + on_push_item = function(pos, side, item) + if side ~= "L" then return false end + local player_name = minetest.get_meta(pos):get_string("player_name") + if tubelib.push_items(pos, "R", item, player_name) then + switch_on(pos) + return true + end + return false + end, + is_pusher = true, -- is a pulling/pushing node +}) + diff --git a/mods/techpack/tubelib_addons1/fermenter.lua b/mods/techpack/tubelib_addons1/fermenter.lua new file mode 100644 index 00000000..0abb51f9 --- /dev/null +++ b/mods/techpack/tubelib_addons1/fermenter.lua @@ -0,0 +1,390 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + fermenter.lua + + The Fermenter converts 3 leave items of any kind into one Bio Gas item, + needed by the Reformer to produce Bio Fuel. + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 4 +local CYCLE_TIME = 2 +local NUM_LEAVES = 3 -- to produce on bio gas + +local function formspec(self, pos, meta) + return "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;0,0;3,3;]".. + "item_image[0,0;1,1;default:leaves]".. + "image[3.5,1;1,1;tubelib_gui_arrow.png]".. + "image_button[3.5,3;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + "list[context;dst;5,0;3,3;]".. + "item_image[5,0;1,1;tubelib_addons1:biogas]".. + "list[current_player;main;0,4.3;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:fermenter", + node_name_defect = "tubelib_addons1:fermenter_defect", + infotext_name = "Tubelib Fermenter", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 10, + formspec_func = formspec, +}) + +local function is_leaves(name) + return (tubelib_addons1.FarmingNodes[name] ~= nil and + tubelib_addons1.FarmingNodes[name].leaves == true) or + minetest.get_item_group(name, "leaves") > 0 +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = M(pos) + local inv = meta:get_inventory() + if listname == "src" and is_leaves(stack:get_name()) then + if State:get_state(meta) == tubelib.STANDBY then + State:start(pos, meta) + end + return stack:get_count() + elseif listname == "dst" then + return stack:get_count() + end + return 0 +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = M(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + + +local function place_top(pos, facedir, placer) + if minetest.is_protected(pos, placer:get_player_name()) then + return false + end + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + if not def or not def.buildable_to then + return false + end + minetest.add_node(pos, {name="tubelib_addons1:fermenter_top", param2=facedir}) + return true +end + +local function convert_leaves_to_biogas(pos, meta) + local inv = meta:get_inventory() + local biogas = ItemStack("tubelib_addons1:biogas") + + -- Not enough output space? + if not inv:room_for_item("dst", biogas) then + State:blocked(pos, meta) + return + end + + -- take NUM_LEAVES items + local items = {} + for i = 1, NUM_LEAVES do + items[i] = tubelib.get_num_items(meta, "src", 1) + if items[i] then -- input available? + if not is_leaves(items[i]:get_name()) then + for j = 1, #items do + inv:add_item("src", items[j]) + end + State:fault(pos, meta) + return + end + end + end + + -- put result into dst inventory + if #items == NUM_LEAVES then + inv:add_item("dst", biogas) + State:keep_running(pos, meta, COUNTDOWN_TICKS) + return + end + + -- put leaves back to src inventory + for i = 1, #items do + inv:add_item("src", items[i]) + end + State:idle(pos, meta) +end + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + convert_leaves_to_biogas(pos, meta) + return State:is_active(meta) + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + State:state_button_event(pos, fields) +end + +minetest.register_node("tubelib_addons1:fermenter", { + description = "Tubelib Fermenter", + inventory_image = "tubelib_addons1_fermenter_inventory.png", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_fermenter_bottom.png', + 'tubelib_addons1_fermenter_bottom.png', + 'tubelib_addons1_fermenter_bottom.png', + 'tubelib_addons1_fermenter_bottom.png', + }, + + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, 24/16, 8/16 }, + }, + + on_construct = function(pos) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('src', 9) + inv:set_size('dst', 9) + end, + + after_place_node = function(pos, placer) + local facedir = minetest.dir_to_facedir(placer:get_look_dir(), false) + if place_top({x=pos.x, y=pos.y+1, z=pos.z}, facedir, placer) then + local number = tubelib.add_node(pos, "tubelib_addons1:fermenter") + State:node_init(pos, number) + else + minetest.remove_node(pos) + minetest.chat_send_player(placer:get_player_name(), "Fermenter will not fit there") + return true + end + end, + + -- the fermenter needs 'on_dig' to be able to remove the upper node + on_dig = function(pos, node, player) + local pos_above = vector.add(pos, vector.new(0, 1, 0)) + local player_name = player:get_player_name() + + if minetest.is_protected(pos, player_name) or minetest.is_protected(pos_above, player_name) then + return + end + + local meta = M(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + minetest.remove_node(pos_above) + end + end, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("tubelib_addons1:fermenter_defect", { + description = "Tubelib Fermenter defect", + inventory_image = "tubelib_addons1_fermenter_inventory.png", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_fermenter_bottom.png^tubelib_defect.png', + 'tubelib_addons1_fermenter_bottom.png^tubelib_defect.png', + 'tubelib_addons1_fermenter_bottom.png^tubelib_defect.png', + 'tubelib_addons1_fermenter_bottom.png^tubelib_defect.png', + }, + + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, 24/16, 8/16 }, + }, + + on_construct = function(pos) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('src', 9) + inv:set_size('dst', 9) + end, + + after_place_node = function(pos, placer) + local facedir = minetest.dir_to_facedir(placer:get_look_dir(), false) + if place_top({x=pos.x, y=pos.y+1, z=pos.z}, facedir, placer) then + local number = tubelib.add_node(pos, "tubelib_addons1:fermenter") + State:node_init(pos, number) + State:defect(pos, M(pos)) + else + minetest.remove_node(pos) + minetest.chat_send_player(placer:get_player_name(), "Fermenter will not fit there") + return true + end + end, + + -- the fermenter needs 'on_dig' to be able to remove the upper node + on_dig = function(pos, node, puncher, pointed_thing) + local pos_above = vector.add(pos, vector.new(0, 1, 0)) + local puncher_name = puncher:get_player_name() + + if minetest.is_protected(pos, puncher_name) or minetest.is_protected(pos_above, puncher_name) then + return + end + + local meta = M(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + minetest.remove_node(pos_above) + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("tubelib_addons1:fermenter_top", { + description = "Tubelib Fermenter Top", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + "tubelib_front.png", + 'tubelib_addons1_fermenter_top.png', + 'tubelib_addons1_fermenter_top.png', + 'tubelib_addons1_fermenter_top.png', + 'tubelib_addons1_fermenter_top.png', + }, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + pointable = false, +}) + +minetest.register_craftitem("tubelib_addons1:biogas", { + description = "Bio Gas", + inventory_image = "tubelib_addons1_biogas.png", +}) + +if minetest.global_exists("unified_inventory") then + unified_inventory.register_craft_type("fermenting", { + description = "Fermenter", + icon = "tubelib_addons1_fermenter_inventory.png", + width = 2, + height = 2, + }) + unified_inventory.register_craft_type("reforming", { + description = "Reformer", + icon = "tubelib_addons1_reformer_inventory.png", + width = 2, + height = 2, + }) + unified_inventory.register_craft({ + items = {"group:leaves", "group:leaves"}, + output = "tubelib_addons1:biogas", + type = "fermenting" + }) + unified_inventory.register_craft({ + items = {"tubelib_addons1:biogas", "tubelib_addons1:biogas", + "tubelib_addons1:biogas", "tubelib_addons1:biogas"}, + output = "tubelib_addons1:biofuel", + type = "reforming" + }) +end + +minetest.register_craft({ + output = "tubelib_addons1:fermenter", + recipe = { + {"default:steel_ingot", "default:dirt", "default:steel_ingot"}, + {"tubelib:tubeS", "default:mese_crystal", "tubelib:tubeS"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + }, +}) + + +tubelib.register_node("tubelib_addons1:fermenter", {"tubelib_addons1:fermenter_defect"}, { + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "dst") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "dst", item) + end, + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) diff --git a/mods/techpack/tubelib_addons1/funnel.lua b/mods/techpack/tubelib_addons1/funnel.lua new file mode 100644 index 00000000..108f520b --- /dev/null +++ b/mods/techpack/tubelib_addons1/funnel.lua @@ -0,0 +1,162 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + funnel.lua + +]]-- + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + minetest.log("action", player:get_player_name().." moves "..stack:get_name().. + " to funnel at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + minetest.log("action", player:get_player_name().." takes "..stack:get_name().. + " from funnel at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function formspec() + return "size[9,7]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;main;0.5,0;8,2;]".. + "list[current_player;main;0.5,3.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +local function scan_for_objects(pos, elapsed) + local meta = minetest.get_meta(pos) + for _, object in pairs(minetest.get_objects_inside_radius(pos, 1)) do + local lua_entity = object:get_luaentity() + if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then + local obj_pos = object:getpos() + if lua_entity.itemstring ~= "" and ((obj_pos.y - pos.y) >= 0.4) then + if tubelib.put_item(meta, "main", lua_entity.itemstring) then + lua_entity.itemstring = "" + object:remove() + end + end + + end + end + return true +end + +minetest.register_node("tubelib_addons1:funnel", { + description = "Tubelib Funnel", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons1_funnel_top.png', + 'tubelib_addons1_funnel_top.png', + 'tubelib_addons1_funnel.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, 8/16, -6/16}, + {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, + { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-6/16, -8/16, -6/16, 6/16, 4/16, 6/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 16) + end, + + after_place_node = function(pos, placer) + tubelib.add_node(pos, "tubelib_addons1:funnel") + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec()) + minetest.get_node_timer(pos):start(1) + end, + + on_timer = scan_for_objects, + on_rotate = screwdriver.disallow, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons1:funnel 2", + recipe = { + {"group:wood", "", "group:wood"}, + {"default:steel_ingot", "default:mese_crystal", "tubelib:tubeS"}, + {"group:wood", "", "group:wood"}, + }, +}) + + +tubelib.register_node("tubelib_addons1:funnel", {}, { + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + + on_recv_message = function(pos, topic, payload) + if topic == "state" then + local meta = minetest.get_meta(pos) + return tubelib.get_inv_state(meta, "main") + else + return "unsupported" + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(1) + end, + +}) + + diff --git a/mods/techpack/tubelib_addons1/grinder.lua b/mods/techpack/tubelib_addons1/grinder.lua new file mode 100644 index 00000000..23124adf --- /dev/null +++ b/mods/techpack/tubelib_addons1/grinder.lua @@ -0,0 +1,343 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + grinder.lua + + Grinding Cobble to Gravel + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 4 +local CYCLE_TIME = 2 + + +-- Grinder recipes +local Recipes = {} + +local function formspec(self, pos, meta) + return "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;0,0;3,3;]".. + "item_image[0,0;1,1;default:cobble]".. + "image[3.5,1;1,1;tubelib_gui_arrow.png]".. + "image_button[3.5,2;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + "list[context;dst;5,0;3,3;]".. + "item_image[5,0;1,1;default:gravel]".. + "list[current_player;main;0,4;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:grinder", + node_name_active = "tubelib_addons1:grinder_active", + node_name_defect = "tubelib_addons1:grinder_defect", + infotext_name = "Tubelib Grinder", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 10, + formspec_func = formspec, +}) + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + if listname == "src" and State:get_state(M(pos)) == tubelib.STANDBY then + State:start(pos, M(pos)) + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local inv = M(pos):get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function grinding(pos, meta, inv) + for _,stack in ipairs(inv:get_list("src")) do + if not stack:is_empty() then + local name = stack:get_name() + if Recipes[name] then + local output = Recipes[name] + if inv:room_for_item("dst", output) then + inv:add_item("dst", output) + inv:remove_item("src", ItemStack(name)) + State:keep_running(pos, meta, COUNTDOWN_TICKS) + else + State:blocked(pos, meta) + end + else + State:fault(pos, meta) + end + return + end + end + State:idle(pos, meta) +end + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + local inv = meta:get_inventory() + grinding(pos, meta, inv) + return State:is_active(meta) + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + State:state_button_event(pos, fields) +end + +minetest.register_node("tubelib_addons1:grinder", { + description = "Tubelib Grinder", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons1_grinder.png', + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png', + "tubelib_front.png", + "tubelib_front.png", + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:grinder") + State:node_init(pos, number) + local inv = M(pos):get_inventory() + inv:set_size('src', 9) + inv:set_size('dst', 9) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib_addons1:grinder_active", { + description = "Tubelib Grinder", + tiles = { + -- up, down, right, left, back, front + { + image = 'tubelib_addons1_grinder_active.png', + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1.0, + }, + }, + + 'tubelib_front.png', + "tubelib_front.png", + "tubelib_front.png", + "tubelib_front.png", + "tubelib_front.png", + }, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:grinder_defect", { + description = "Tubelib Grinder", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons1_grinder.png', + 'tubelib_front.png', + 'tubelib_front.png^tubelib_defect.png', + 'tubelib_front.png^tubelib_defect.png', + "tubelib_front.png^tubelib_defect.png", + "tubelib_front.png^tubelib_defect.png", + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:grinder") + State:node_init(pos, number) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('src', 9) + inv:set_size('dst', 9) + State:defect(pos, meta) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "tubelib_addons1:grinder", + recipe = { + {"group:wood", "default:tin_ingot", "group:wood"}, + {"tubelib:tubeS", "default:mese_crystal", "tubelib:tubeS"}, + {"group:wood", "default:tin_ingot", "group:wood"}, + }, +}) + + +tubelib.register_node("tubelib_addons1:grinder", + {"tubelib_addons1:grinder_active", "tubelib_addons1:grinder_defect"}, { + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "dst") + end, + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "dst") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "dst", item) + end, + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) + + +if minetest.global_exists("unified_inventory") then + unified_inventory.register_craft_type("grinding", { + description = "Grinding", + icon = 'tubelib_addons1_grinder.png', + width = 1, + height = 1, + }) +end + +function tubelib.add_grinder_recipe(recipe) + Recipes[recipe.input] = ItemStack(recipe.output) + if minetest.global_exists("unified_inventory") then + recipe.items = {recipe.input} + recipe.type = "grinding" + unified_inventory.register_craft(recipe) + end +end + + +tubelib.add_grinder_recipe({input="default:cobble", output="default:gravel"}) +tubelib.add_grinder_recipe({input="default:desert_cobble", output="default:gravel"}) +tubelib.add_grinder_recipe({input="default:mossycobble", output="default:gravel"}) +tubelib.add_grinder_recipe({input="default:gravel", output="default:sand"}) +tubelib.add_grinder_recipe({input="gravelsieve:sieved_gravel", output="default:sand"}) +tubelib.add_grinder_recipe({input="default:coral_skeleton", output="default:silver_sand"}) +tubelib.add_grinder_recipe({input="tubelib:basalt_stone", output="default:silver_sand"}) + +if minetest.global_exists("skytest") then + tubelib.add_grinder_recipe({input="default:desert_sand", output="skytest:dust"}) + tubelib.add_grinder_recipe({input="default:silver_sand", output="skytest:dust"}) + tubelib.add_grinder_recipe({input="default:sand", output="skytest:dust"}) + tubelib.add_grinder_recipe({input="skytest:dust 12", output="skytest:powder"}) +else + tubelib.add_grinder_recipe({input="default:desert_sand", output="default:clay"}) + tubelib.add_grinder_recipe({input="default:silver_sand", output="default:clay"}) + tubelib.add_grinder_recipe({input="default:sand", output="default:clay"}) +end + +tubelib.add_grinder_recipe({input="default:sandstone", output="default:sand 4"}) +tubelib.add_grinder_recipe({input="default:desert_sandstone", output="default:desert_sand 4"}) +tubelib.add_grinder_recipe({input="default:silver_sandstone", output="default:silver_sand 4"}) + +tubelib.add_grinder_recipe({input="default:tree", output="default:leaves 8"}) +tubelib.add_grinder_recipe({input="default:jungletree", output="default:jungleleaves 8"}) +tubelib.add_grinder_recipe({input="default:pine_tree", output="default:pine_needles 8"}) +tubelib.add_grinder_recipe({input="default:acacia_tree", output="default:acacia_leaves 8"}) +tubelib.add_grinder_recipe({input="default:aspen_tree", output="default:aspen_leaves 8"}) diff --git a/mods/techpack/tubelib_addons1/harvester.lua b/mods/techpack/tubelib_addons1/harvester.lua new file mode 100644 index 00000000..37b05f61 --- /dev/null +++ b/mods/techpack/tubelib_addons1/harvester.lua @@ -0,0 +1,475 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + harvester.lua + + Harvester machine to chop wood, leaves and harvest farming crops and flowers. + + The machine is able to harvest an square area of up to 33x33 blocks (radius = 16). + The base node has to be placed in the middle of the harvesting area. + The Harvester processes one node every 6 seconds. + It requires one item Bio Fuel per 20 nodes. + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local CYCLE_TIME = 6 +local MAX_HEIGHT = 18 -- harvesting altitude +local MAX_DIAMETER = 33 +local BURNING_TIME = 20 -- fuel +local STANDBY_TICKS = 4 -- used for blocked state +local COUNTDOWN_TICKS = 2 +local OFFSET = 5 -- for uneven terrains + +-- start on top of the base block +local function working_start_pos(pos) + local working_pos = table.copy(pos) + working_pos.y = working_pos.y + MAX_HEIGHT + return working_pos +end + +local Radius2Idx = {[4]=1 ,[6]=2, [8]=3, [10]=4, [12]=5, [14]=6, [16]=7} + +local function formspec(self, pos, meta) + -- some recalculations + local this = minetest.deserialize(meta:get_string("this")) + local endless = this.endless == 1 and "true" or "false" + local fuel = this.fuel * 100/BURNING_TIME + if self:get_state(meta) ~= tubelib.RUNNING then + fuel = 0 + end + local radius = Radius2Idx[this.radius] or 2 + + return "size[9,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "dropdown[0,0;1.5;radius;4,6,8,10,12,14,16;"..radius.."]".. + "label[1.6,0.2;Area radius]".. + "checkbox[0,1;endless;Run endless;"..endless.."]".. + "list[context;main;5,0;4,4;]".. + "list[context;fuel;1.5,3;1,1;]".. + "item_image[1.5,3;1,1;tubelib_addons1:biofuel]".. + "image[2.5,3;1,1;default_furnace_fire_bg.png^[lowpart:".. + fuel..":default_furnace_fire_fg.png]".. + "image_button[3.5,3;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + "list[current_player;main;0.5,4.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:harvester_base", + node_name_defect = "tubelib_addons1:harvester_defect", + infotext_name = "Tubelib Harvester", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 15, + on_start = function(pos, meta, oldstate) + local this = minetest.deserialize(meta:get_string("this")) + this.idx = 0 + this.working_pos = working_start_pos(pos) + meta:set_string("this", minetest.serialize(this)) + end, + formspec_func = formspec, +}) + +local function gen_working_steps() + -- Working steps like a snail shell from inner to outer + local t = {} + for steps = 1,MAX_DIAMETER,2 do + for idx = 1,steps do + t[#t+1] = 0 + end + for idx = 1,steps do + t[#t+1] = 1 + end + steps = steps + 1 + for idx = 1,steps do + t[#t+1] = 2 + end + for idx = 1,steps do + t[#t+1] = 3 + end + end + return t +end + +local WorkingSteps = gen_working_steps() + + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local inv = M(pos):get_inventory() + if listname == "main" then + return stack:get_count() + elseif listname == "fuel" and stack:get_name() == "tubelib_addons1:biofuel" then + return stack:get_count() + end + return 0 +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function get_next_pos(old_pos, idx) + local facedir = WorkingSteps[idx] + return vector.add(old_pos, core.facedir_to_dir(facedir)) +end + +-- Remove saplings lying arround +local function remove_all_sapling_items(pos) + for _, object in pairs(minetest.get_objects_inside_radius(pos, 4)) do + local lua_entity = object:get_luaentity() + if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then + object:remove() + end + end +end + +-- Remove wood/leave nodes and place sapling if necessary +-- Return false if inventory is full +-- else return true +local function remove_or_replace_node(this, pos, inv, node, order) + local next_pos = table.copy(pos) + next_pos.y = next_pos.y - 1 + + -- Not enough space in the inventory + if not inv:room_for_item("main", ItemStack(node.name)) then + return false + end + local next_node = minetest.get_node_or_nil(next_pos) + if next_node then + minetest.remove_node(pos) + inv:add_item("main", ItemStack(order.drop)) + this.num_items = this.num_items + 1 + if tubelib_addons1.GroundNodes[next_node.name] ~= nil and order.plant then -- hit the ground? + minetest.set_node(pos, {name=order.plant, paramtype2 = "wallmounted", param2=1}) + if order.t1 ~= nil then + -- We have to simulate "on_place" and start the timer by hand + -- because the after_place_node function checks player rights and can't therefore + -- be used. + minetest.get_node_timer(pos):start(math.random(order.t1, order.t2)) + end + remove_all_sapling_items(pos) + end + end + return true +end + +-- check the fuel level and return false if empty +local function check_fuel(pos, this, meta) + if this.fuel <= 0 then + if tubelib.get_this_item(meta, "fuel", 1) == nil then + return false + end + this.fuel = BURNING_TIME + else + this.fuel = this.fuel - 1 + end + return true +end + +local function calc_new_pos(pos, this, meta) + this.idx = this.idx + 1 + if this.idx >= this.max then + if this.endless == 1 then + this.idx = 0 + this.working_pos = working_start_pos(pos) + return true + else + return false + end + end + this.working_pos = get_next_pos(this.working_pos, this.idx) + return true +end + +-- Scan the space below the given position +-- Return false if inventory is full +-- else return true +local function harvest_field(this, meta) + local inv = meta:get_inventory() + local pos = table.copy(this.working_pos) + local start_y_pos = pos.y - 1 + local stop_y_pos = pos.y - MAX_HEIGHT - OFFSET + if minetest.is_protected(pos, this.owner) then + return true + end + for y_pos = start_y_pos,stop_y_pos,-1 do + pos.y = y_pos + local node = minetest.get_node_or_nil(pos) + if node and node.name ~= "air" then + local order = tubelib_addons1.FarmingNodes[node.name] or tubelib_addons1.Flowers[node.name] + if order then + if not remove_or_replace_node(this, pos, inv, node, order) then + return false + end + else + return true -- hit the ground + end + end + end + return true +end + +local function not_blocked(pos, this, meta) + if State:get_state(meta) == tubelib.BLOCKED then + if harvest_field(this, meta) then + minetest.after(0, State.start, State, pos, meta) + end + return false + end + return true +end + +-- move the "harvesting copter" to the next pos and harvest the field below +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + local this = minetest.deserialize(meta:get_string("this")) + this.num_items = 0 + + if not_blocked(pos, this, meta) then + if check_fuel(pos, this, meta) then + if calc_new_pos(pos, this, meta) then + if harvest_field(this, meta) then + meta:set_string("this", minetest.serialize(this)) + meta:set_string("infotext", + "Tubelib Harvester "..this.number.. + ": running ("..this.idx.."/"..this.max..")") + State:keep_running(pos, meta, COUNTDOWN_TICKS, this.num_items) + else + State:blocked(pos, meta) + end + else + State:stop(pos, meta) + end + else + State:fault(pos, meta) + end + end + return State:is_active(meta) + end + return false +end + + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = M(pos) + local this = minetest.deserialize(meta:get_string("this")) + local radius = this.radius + + if fields.radius ~= nil then + radius = tonumber(fields.radius) + end + if radius ~= this.radius then + this.radius = radius + this.max = (radius*2 + 1) * (radius*2 + 1) + meta:set_string("this", minetest.serialize(this)) + State:stop(pos, meta) + end + + if fields.endless ~= nil then + this.endless = fields.endless == "true" and 1 or 0 + end + meta:set_string("this", minetest.serialize(this)) + + State:state_button_event(pos, fields) +end + +minetest.register_node("tubelib_addons1:harvester_base", { + description = "Tubelib Harvester Base", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_harvester.png', + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('main', 16) + inv:set_size('fuel', 1) + local number = tubelib.add_node(pos, "tubelib_addons1:harvester_base") + local this = { + number = number, + owner = placer:get_player_name(), + working_pos = working_start_pos(pos), + fuel = 0, + endless = 0, + radius = 6, + idx = 0, + max = (6+1+6) * (6+1+6) + } + meta:set_string("this", minetest.serialize(this)) + State:node_init(pos, number) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("main") + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + on_receive_fields = on_receive_fields, + on_timer = keep_running, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:harvester_defect", { + description = "Tubelib Harvester Base", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_harvester.png^tubelib_defect.png', + }, + + on_construct = function(pos) + local inv = M(pos):get_inventory() + inv:set_size('main', 16) + inv:set_size('fuel', 1) + end, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:harvester_base") + local this = { + number = number, + owner = placer:get_player_name(), + working_pos = working_start_pos(pos), + fuel = 0, + endless = 0, + radius = 6, + idx = 0, + max = (6+1+6) * (6+1+6) + } + local meta = M(pos) + meta:set_string("this", minetest.serialize(this)) + State:node_init(pos, number) + State:defect(pos, meta) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("main") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons1:harvester_base", + recipe = { + {"default:steel_ingot", "default:mese_crystal", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_crystal", "tubelib:tubeS"}, + {"group:wood", "default:mese_crystal", "group:wood"}, + }, +}) + + +tubelib.register_node("tubelib_addons1:harvester_base", {"tubelib_addons1:harvester_defect"}, { + on_pull_stack = function(pos, side) + return tubelib.get_stack(M(pos), "main") + end, + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "main") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "fuel", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "main", item) + end, + on_recv_message = function(pos, topic, payload) + if topic == "fuel" then + return tubelib.fuelstate(M(pos), "fuel") + end + + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) + + +-- update to v0.08 +minetest.register_lbm({ + label = "[tubelib_addons1] Harvester update", + name = "tubelib_addons1:update", + nodenames = {"tubelib_addons1:harvester_base", "tubelib:harvester_base_active"}, + run_at_every_load = false, + action = function(pos, node) + local meta = M(pos) + local this = minetest.deserialize(meta:get_string("this")) + if this then + this.working_pos = this.copter_pos or working_start_pos(pos) + meta:set_string("this", minetest.serialize(this)) + end + end +}) + diff --git a/mods/techpack/tubelib_addons1/init.lua b/mods/techpack/tubelib_addons1/init.lua new file mode 100644 index 00000000..46c140b1 --- /dev/null +++ b/mods/techpack/tubelib_addons1/init.lua @@ -0,0 +1,26 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017,2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + + +dofile(minetest.get_modpath("tubelib_addons1") .. "/quarry.lua") +dofile(minetest.get_modpath("tubelib_addons1") .. "/grinder.lua") +dofile(minetest.get_modpath("tubelib_addons1") .. "/nodes.lua") +dofile(minetest.get_modpath("tubelib_addons1") .. '/autocrafter.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. '/harvester.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. '/fermenter.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. '/reformer.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. '/funnel.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. "/pusher_fast.lua") +dofile(minetest.get_modpath("tubelib_addons1") .. "/detector.lua") +dofile(minetest.get_modpath("tubelib_addons1") .. '/chest.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. '/liquidsampler.lua') +dofile(minetest.get_modpath("tubelib_addons1") .. '/lbms.lua') diff --git a/mods/techpack/tubelib_addons1/lbms.lua b/mods/techpack/tubelib_addons1/lbms.lua new file mode 100644 index 00000000..7816fbf8 --- /dev/null +++ b/mods/techpack/tubelib_addons1/lbms.lua @@ -0,0 +1,67 @@ +local bottoms_by_top = { + ["tubelib_addons1:fermenter_top"] = {"tubelib_addons1:fermenter", "tubelib_addons1:fermenter_defect"}, + ["tubelib_addons1:reformer_top"] = {"tubelib_addons1:reformer", "tubelib_addons1:reformer_defect"}, +} + +local top_by_bottom = { + ["tubelib_addons1:fermenter"] = "tubelib_addons1:fermenter_top", + ["tubelib_addons1:fermenter_defect"] = "tubelib_addons1:fermenter_top", + ["tubelib_addons1:reformer"] = "tubelib_addons1:reformer_top", + ["tubelib_addons1:reformer_defect"] = "tubelib_addons1:reformer_top", +} + +-- remove tops of multiblocks which aren't over the bottom; happens due to bugs or worldedit +minetest.register_lbm({ + label = "Remove detached tops of multiblocks", + name = "tubelib_addons1:remove_detached_tops", + nodenames = { + "tubelib_addons1:fermenter_top", + "tubelib_addons1:reformer_top", + }, + run_at_every_load = true, + action = function(pos, node) + local bottoms = bottoms_by_top[node.name] + local pos_under = vector.subtract(pos, vector.new(0, 1, 0)) + local node_under = minetest.get_node_or_nil(pos_under) + + if not node_under then + -- not loaded + return + end + + local node_under_name = node_under.name + + for _, bottom in ipairs(bottoms) do + if node_under_name == bottom then + -- has an acceptable bottom + return + end + end + + minetest.remove_node(pos) + end +}) + +-- fix multiblocks with missing tops; happens due to bugs or worldedit +minetest.register_lbm({ + label = "Fix missing tops of multiblocks", + name = "tubelib_addons1:fix_missing_tops", + nodenames = { + "tubelib_addons1:fermenter", + "tubelib_addons1:fermenter_defect", + "tubelib_addons1:reformer", + "tubelib_addons1:reformer_defect", + }, + run_at_every_load = true, + action = function(pos, node) + local pos_above = vector.add(pos, vector.new(0, 1, 0)) + local node_above = minetest.get_node(pos_above) + + if node_above.name ~= "air" then + return + end + + local top = top_by_bottom[node.name] + minetest.add_node(pos_above, {name=top, param2=node.param2}) + end +}) diff --git a/mods/techpack/tubelib_addons1/liquidsampler.lua b/mods/techpack/tubelib_addons1/liquidsampler.lua new file mode 100644 index 00000000..3e51938e --- /dev/null +++ b/mods/techpack/tubelib_addons1/liquidsampler.lua @@ -0,0 +1,302 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + liquidsampler.lua + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 2 +local CYCLE_TIME = 8 + +local function formspec(self, pos, meta) + return "size[9,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;0,0;1,4;]".. + "image[0,0;1,1;bucket.png]".. + "image[1,1;1,1;tubelib_gui_arrow.png]".. + "image_button[1,3;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + "list[context;dst;2,0;7,4;]".. + "list[current_player;main;0.5,4.5;8,4;]".. + "listring[current_player;main]".. + "listring[context;src]" .. + "listring[current_player;main]".. + "listring[context;dst]" .. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:liquidsampler", + node_name_active = "tubelib_addons1:liquidsampler_active", + node_name_defect = "tubelib_addons1:liquidsampler_defect", + infotext_name = "Liquid Sampler", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 8, + formspec_func = formspec, +}) + +local function get_pos(pos, facedir, side) + local offs = {F=0, R=1, B=2, L=3, D=4, U=5} + local dst_pos = table.copy(pos) + facedir = (facedir + offs[side]) % 4 + local dir = minetest.facedir_to_dir(facedir) + return vector.add(dst_pos, dir) +end + + +local function test_liquid(node) + local liquiddef = bucket.liquids[node.name] + if liquiddef ~= nil and liquiddef.itemname ~= nil and + node.name == liquiddef.source then + return liquiddef.itemname + end +end + +local function sample_liquid(pos, meta) + local water_pos = P(meta:get_string("water_pos")) + local giving_back = test_liquid(minetest.get_node(water_pos)) + if giving_back then + local inv = meta:get_inventory() + if inv:room_for_item("dst", ItemStack(giving_back)) and + inv:contains_item("src", ItemStack("bucket:bucket_empty")) then + minetest.remove_node(water_pos) + inv:remove_item("src", ItemStack("bucket:bucket_empty")) + inv:add_item("dst", ItemStack(giving_back)) + State:keep_running(pos, meta, COUNTDOWN_TICKS) + else + State:blocked(pos, meta) + end + else + State:idle(pos, meta) + end + State:idle(pos, meta) +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + if listname == "src" and State:get_state(M(pos)) == tubelib.STANDBY then + State:start(pos, M(pos)) + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local inv = M(pos):get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + sample_liquid(pos, meta) + return State:is_active(meta) + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + State:state_button_event(pos, fields) +end + +minetest.register_node("tubelib_addons1:liquidsampler", { + description = "Liquid Sampler", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_liquidsampler.png', + 'tubelib_addons1_liquidsampler_passive.png', + 'tubelib_addons1_liquidsampler.png', + 'tubelib_addons1_liquidsampler.png', + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:liquidsampler") + State:node_init(pos, number) + local meta = M(pos) + local node = minetest.get_node(pos) + local water_pos = get_pos(pos, node.param2, "L") + meta:set_string("water_pos", minetest.pos_to_string(water_pos)) + local inv = meta:get_inventory() + inv:set_size("src", 4) + inv:set_size("dst", 28) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:liquidsampler_active", { + description = "Liquid Sampler", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_liquidsampler.png', + { + image = "tubelib_addons1_liquidsampler_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2, + }, + }, + 'tubelib_addons1_liquidsampler.png', + 'tubelib_addons1_liquidsampler.png', + }, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:liquidsampler_defect", { + description = "Liquid Sampler", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_liquidsampler.png^tubelib_defect.png', + 'tubelib_addons1_liquidsampler_passive.png^tubelib_defect.png', + 'tubelib_addons1_liquidsampler.png^tubelib_defect.png', + 'tubelib_addons1_liquidsampler.png^tubelib_defect.png', + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons1:liquidsampler") + State:node_init(pos, number) + local meta = M(pos) + local node = minetest.get_node(pos) + local water_pos = get_pos(pos, node.param2, "L") + meta:set_string("water_pos", minetest.pos_to_string(water_pos)) + local inv = meta:get_inventory() + inv:set_size("src", 4) + inv:set_size("dst", 28) + State:defect(pos, meta) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("dst") and inv:is_empty("src") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "tubelib_addons1:liquidsampler", + recipe = { + {"group:wood", "default:steel_ingot", "group:wood"}, + {"default:mese_crystal", "bucket:bucket_empty", "tubelib:tubeS"}, + {"group:wood", "default:steel_ingot", "group:wood"}, + }, +}) + +tubelib.register_node("tubelib_addons1:liquidsampler", + {"tubelib_addons1:liquidsampler_active", "tubelib_addons1:liquidsampler_defect"}, { + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "dst") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "dst", item) + end, + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) diff --git a/mods/techpack/tubelib_addons1/mod.conf b/mods/techpack/tubelib_addons1/mod.conf new file mode 100644 index 00000000..cdcb991e --- /dev/null +++ b/mods/techpack/tubelib_addons1/mod.conf @@ -0,0 +1,4 @@ +name=tubelib_addons1 +description=Tubelib Extension with Mining, Farming, and Crafting nodes +depends=tubelib,default,bucket +optional_depends=ethereal,farming,moreores,moretrees,skytest,stairs,unified_inventory diff --git a/mods/techpack/tubelib_addons1/nodes.lua b/mods/techpack/tubelib_addons1/nodes.lua new file mode 100644 index 00000000..bf6c1bbc --- /dev/null +++ b/mods/techpack/tubelib_addons1/nodes.lua @@ -0,0 +1,309 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017,2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + +tubelib_addons1 = {} + +-- tables needed for Harvester +tubelib_addons1.FarmingNodes = {} +tubelib_addons1.Flowers = {} + +-- table needed for Grinder +tubelib_addons1.GroundNodes = {} + + +-- default trees which require the node timer +function tubelib_addons1.register_tree_node(name, drop, plant) + tubelib_addons1.FarmingNodes[name] = {drop = drop or name, plant = plant, t1= 166, t2 = 288} +end + +-- default farming nodes which require the node timer +function tubelib_addons1.register_default_farming_node(name, drop, plant) + tubelib_addons1.FarmingNodes[name] = {drop = drop or name, plant = plant, t1 = 2400, t2 = 4800} +end + +function tubelib_addons1.register_flower(name) + tubelib_addons1.FarmingNodes[name] = {drop = name} +end + +-- farming nodes with ABM +function tubelib_addons1.register_farming_node(name, drop, plant) + tubelib_addons1.FarmingNodes[name] = {drop = drop or name, plant = plant} + tubelib_addons1.FarmingNodes[name].leaves = string.find(name, "leaves") ~= nil +end + +function tubelib_addons1.register_ground_node(name, drop) + tubelib_addons1.GroundNodes[name] = {drop = drop or name} +end + +local tn = tubelib_addons1.register_tree_node +local dn = tubelib_addons1.register_default_farming_node +local fn = tubelib_addons1.register_farming_node +local gn = tubelib_addons1.register_ground_node +local gr = tubelib.add_grinder_recipe + +------------------------------------------------------------------------------- +-- Default Farming +------------------------------------------------------------------------------- +tn("default:tree", "default:tree", "default:sapling") +tn("default:aspen_tree", "default:aspen_tree", "default:aspen_sapling") +tn("default:pine_tree", "default:pine_tree", "default:pine_sapling") +tn("default:acacia_tree", "default:acacia_tree", "default:acacia_sapling") +tn("default:jungletree", "default:jungletree", "default:junglesapling") + +fn("default:leaves") +fn("default:aspen_leaves") +fn("default:pine_needles") +tubelib_addons1.FarmingNodes["default:pine_needles"].leaves = true -- accepted as leaves +fn("default:acacia_leaves") +fn("default:jungleleaves") + +fn("default:bush_leaves") +fn("default:acacia_bush_leaves") + +fn("default:cactus", "default:cactus", "default:cactus") +fn("default:papyrus", "default:papyrus", "default:papyrus") + +fn("default:apple") + +if farming.mod ~= "redo" then + dn("farming:wheat_8", "farming:wheat", "farming:wheat_1") + dn("farming:cotton_8", "farming:cotton", "farming:cotton_1") +end + +------------------------------------------------------------------------------- +-- Farming Redo +----------------------------------------------- -------------------------------- +if farming.mod == "redo" then + fn("farming:wheat_8", "farming:wheat", "farming:wheat_1") + fn("farming:cotton_8", "farming:cotton", "farming:cotton_1") + fn("farming:carrot_8", "farming:carrot 2", "farming:carrot_1") + fn("farming:potato_4", "farming:potato 3", "farming:potato_1") + fn("farming:tomato_8", "farming:tomato 3", "farming:tomato_1") + fn("farming:cucumber_4", "farming:cucumber 2", "farming:cucumber_1") + fn("farming:corn_8", "farming:corn 2", "farming:corn_1") + fn("farming:coffee_5", "farming:coffee_beans 2", "farming:coffee_1") + fn("farming:melon_8", "farming:melon_slice 4", "farming:melon_1") + fn("farming:pumpkin_8", "farming:pumpkin_slice 4","farming:pumpkin_1") + fn("farming:raspberry_4", "farming:raspberries", "farming:raspberry_1") + fn("farming:blueberry_4", "farming:blueberries", "farming:blueberry_1") + fn("farming:rhubarb_3", "farming:rhubarb 2", "farming:rhubarb_1") + fn("farming:beanpole_5", "farming:beans 3", "farming:beanpole_1") + fn("farming:grapes_8", "farming:grapes 3", "farming:grapes_1") + fn("farming:barley_7", "farming:barley", "farming:barley_1") + fn("farming:chili_8", "farming:chili_pepper 2", "farming:chili_1") + fn("farming:hemp_8", "farming:hemp_leaf", "farming:hemp_1") + fn("farming:oat_8", "farming:oat", "farming:oat_1") + fn("farming:rye_8", "farming:rye", "farming:rye_1") + fn("farming:rice_8", "farming:rice", "farming:rice_1") + fn('farming:beetroot_5', 'farming:beetroot 2', 'farming:beetroot_1') + fn('farming:cocoa_4', 'farming:cocoa_beans 2', 'farming:cocoa_1') + fn('farming:garlic_5', 'farming:garlic 2', 'farming:garlic_1') + fn('farming:onion_5', 'farming:onion 2', 'farming:onion_1') + fn('farming:pea_5', 'farming:pea_pod 3', 'farming:pea_1') + fn('farming:pepper_5', 'farming:pepper 2', 'farming:pepper_1') + fn('farming:pineapple_8', 'farming:pineapple 1', 'farming:pineapple_1') +end + +------------------------------------------------------------------------------- +-- Ethereal Farming +------------------------------------------------------------------------------- +fn("ethereal:strawberry_8", "ethereal:strawberry 2", "ethereal:strawberry 1") +fn("ethereal:onion_5", "ethereal:wild_onion_plant 2", "ethereal:onion_1") + + +fn("ethereal:willow_trunk", "ethereal:willow_trunk", "ethereal:willow_sapling") +fn("ethereal:redwood_trunk", "ethereal:redwood_trunk", "ethereal:redwood_sapling") +fn("ethereal:frost_tree", "ethereal:frost_tree", "ethereal:frost_tree_sapling") +fn("ethereal:yellow_trunk", "ethereal:yellow_trunk", "ethereal:yellow_tree_sapling") +fn("ethereal:palm_trunk", "ethereal:palm_trunk", "ethereal:palm_sapling") +fn("ethereal:banana_trunk", "ethereal:banana_trunk", "ethereal:banana_tree_sapling") +fn("ethereal:mushroom_trunk", "ethereal:mushroom_trunk", "ethereal:mushroom_sapling") +fn("ethereal:birch_trunk", "ethereal:birch_trunk", "ethereal:birch_sapling") +fn("ethereal:bamboo", "ethereal:bamboo", "ethereal:bamboo_sprout") + +fn("ethereal:willow_twig") +fn("ethereal:redwood_leaves") +fn("ethereal:orange_leaves") +fn("ethereal:bananaleaves") +fn("ethereal:yellowleaves") +fn("ethereal:palmleaves") +fn("ethereal:birch_leaves") +fn("ethereal:frost_leaves") +fn("ethereal:bamboo_leaves") +fn("ethereal:mushroom") +fn("ethereal:mushroom_pore") +fn("ethereal:bamboo_leaves") +fn("ethereal:bamboo_leaves") +fn("ethereal:banana") +fn("ethereal:orange") +fn("ethereal:coconut") + +------------------------------------------------------------------------------- +-- Default Ground +------------------------------------------------------------------------------- +gn("default:cobble") +gn("default:desert_cobble") +gn("default:mossycobble") +gn("default:gravel") +gn("default:dirt") +gn("default:sand") +gn("default:desert_sand") +gn("default:silver_sand") +gn("default:ice") +gn("default:snowblock") +gn("default:snow") +gn("default:obsidian") + +gn("stairs:stair_cobble") +gn("stairs:stair_mossycobble") +gn("stairs:stair_desert_cobble") + +gn("default:stone", "default:cobble") +gn("default:desert_stone", "default:desert_cobble") +gn("default:sandstone", "default:sandstone") +gn("default:desert_sandstone", "default:desert_sandstone") +gn("default:clay", "default:clay_lump") +gn("default:stone_with_coal", "default:coal_lump") +gn("default:stone_with_iron", "default:iron_lump") +gn("default:stone_with_copper", "default:copper_lump") +gn("default:stone_with_gold", "default:gold_lump") +gn("default:stone_with_tin", "default:tin_lump") + +gn("default:stone_with_mese", "default:mese_crystal") + +gn("default:stone_with_diamond", "default:diamond") + +gn("default:dirt_with_grass", "default:dirt") +gn("default:dirt_with_grass_footsteps", "default:dirt") +gn("default:dirt_with_dry_grass", "default:dirt") +gn("default:dirt_with_snow", "default:dirt") +gn("default:dirt_with_rainforest_litter", "default:dirt") +gn("default:dirt_with_grass", "default:dirt") + +gn("default:coral_skeleton", "default:coral_skeleton") +gn("default:coral_orange", "default:coral_skeleton") +gn("default:coral_brown", "default:coral_skeleton") + +------------------------------------------------------------------------------- +-- tubelib Ground +------------------------------------------------------------------------------- + +gn("tubelib:basalt_stone", "tubelib:basalt_stone") + +------------------------------------------------------------------------------- +-- Moreores Ground +------------------------------------------------------------------------------- +gn("moreores:mineral_silver", "moreores:silver_lump") +gn("moreores:mineral_mithril", "moreores:mithril_lump") + +------------------------------------------------------------------------------- +-- Farming Ground +------------------------------------------------------------------------------- +gn("farming:soil", "default:dirt") +gn("farming:soil_wet", "default:dirt") + +------------------------------------------------------------------------------- +-- Compost Ground +------------------------------------------------------------------------------- +gn("compost:garden_soil", "compost:garden_soil") + +------------------------------------------------------------------------------- +-- Ethereal Ground +------------------------------------------------------------------------------- +gn("ethereal:dry_dirt", "default:dirt") +gn("ethereal:bamboo_dirt", "default:dirt") +gn("ethereal:jungle_dirt", "default:dirt") +gn("ethereal:grove_dirt", "default:dirt") +gn("ethereal:prairie_dirt", "default:dirt") +gn("ethereal:cold_dirt", "default:dirt") +gn("ethereal:crystal_dirt", "default:dirt") +gn("ethereal:mushroom_dirt", "default:dirt") +gn("ethereal:fiery_dirt", "default:dirt") +gn("ethereal:gray_dirt", "default:dirt") +gn("ethereal:green_dirt", "default:dirt") + +gn("bakedclay:red", "bakedclay:red") +gn("bakedclay:orange", "bakedclay:orange") +gn("bakedclay:grey", "bakedclay:grey") + +gn("ethereal:quicksand2", "default:sand") + +gn("ethereal:illumishroom") +gn("ethereal:illumishroom2") +gn("ethereal:illumishroom3") + + +------------------------------------------------------------------------------- +-- Registered flowers +------------------------------------------------------------------------------- +local function register_flowers() + for name,item in pairs(minetest.registered_items) do + if item.groups.flower == 1 then + tubelib_addons1.register_flower(name) + end + end +end + +minetest.after(10, register_flowers) + +------------------------------------------------------------------------------- +-- moretrees +------------------------------------------------------------------------------- + +if minetest.global_exists("moretrees") then + local function register_tree(treename) + local trunk_name = 'moretrees:' .. treename .. '_trunk' + local sappling_name = 'moretrees:' .. treename .. '_sapling' + local leaves_name = 'moretrees:' .. treename .. '_leaves' + + tn(trunk_name, trunk_name, sappling_name) + fn(leaves_name) + gr({input=trunk_name, output=leaves_name .. ' 8'}) + end + + -- "ordinary" moretrees blocks + for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + + if treename ~= 'jungletree' then + register_tree(treename) + end + end + + -- "weird" moretrees trunks + tn('moretrees:date_palm_fruit_trunk', 'moretrees:date_palm_trunk', 'moretrees:date_palm_sapling') + gr({input='moretrees:date_palm_fruit_trunk', output='moretrees:date_palm_leaves 8'}) + tn('moretrees:date_palm_ffruit_trunk', 'moretrees:date_palm_trunk', 'moretrees:date_palm_sapling') + gr({input='moretrees:date_palm_ffruit_trunk', output='moretrees:date_palm_leaves 8'}) + tn('moretrees:date_palm_mfruit_trunk', 'moretrees:date_palm_trunk', 'moretrees:date_palm_sapling') + gr({input='moretrees:date_palm_mfruit_trunk', output='moretrees:date_palm_leaves 8'}) + tn('moretrees:jungletree_trunk', 'default:jungletree', 'default:junglesapling') + gr({input='moretrees:jungletree_trunk', output='default:jungleleaves 8'}) + tn('moretrees:palm_fruit_trunk', 'moretrees:palm_trunk', 'moretrees:palm_sapling') + gr({input='moretrees:palm_fruit_trunk', output='moretrees:palm_leaves 8'}) + tn('moretrees:palm_fruit_trunk_gen', 'moretrees:palm_trunk', 'moretrees:palm_sapling') + gr({input='moretrees:palm_fruit_trunk_gen', output='moretrees:palm_leaves 8'}) + tn('moretrees:rubber_tree_trunk_empty', 'moretrees:rubber_tree_trunk_empty', 'moretrees:rubber_tree_sapling') + gr({input='moretrees:rubber_tree_trunk_empty', output='moretrees:rubber_tree_leaves 8'}) + + -- moretrees fruit and leaves + fn('moretrees:acorn') + fn('moretrees:cedar_cone') + fn('moretrees:coconut_3', 'moretrees:coconut') + fn('moretrees:dates_f4', 'moretrees:date 16') + fn('moretrees:fir_cone') + fn('moretrees:fir_leaves_bright') + fn('moretrees:jungletree_leaves_red') + fn('moretrees:jungletree_leaves_yellow') + fn('moretrees:spruce_cone') +end + diff --git a/mods/techpack/tubelib_addons1/pusher_fast.lua b/mods/techpack/tubelib_addons1/pusher_fast.lua new file mode 100644 index 00000000..4baad5c1 --- /dev/null +++ b/mods/techpack/tubelib_addons1/pusher_fast.lua @@ -0,0 +1,250 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + pusher_fast.lua: + + Fast pusher for push/pull operation of StackItems from chests or other + inventory/server nodes to tubes or other inventory/server nodes. + + The Pusher is based on the class NodeStates and supports the following messages: + - topic = "on", payload = nil + - topic = "off", payload = nil + - topic = "state", payload = nil, + response is "running", "stopped", "standby", "blocked", or "not supported" + +]]-- + +-- +--------+ +-- / /| +-- +--------+ | +-- IN (L) -->| |x--> OUT (R) +-- | PUSHER | + +-- | |/ +-- +--------+ + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 5 +local COUNTDOWN_TICKS = 5 +local CYCLE_TIME = 1 + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:pusher_fast", + node_name_active = "tubelib_addons1:pusher_fast_active", + node_name_defect = "tubelib_addons1:pusher_fast_defect", + infotext_name = "Fast Pusher", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 30, +}) + +local function pushing(pos, meta) + local player_name = meta:get_string("player_name") + local items = tubelib.pull_items(pos, "L", player_name) + if items ~= nil then + if tubelib.push_items(pos, "R", items, player_name) == false then + -- place item back + tubelib.unpull_items(pos, "L", items, player_name) + State:blocked(pos, meta) + return + end + State:keep_running(pos, meta, COUNTDOWN_TICKS) + return + end + State:idle(pos, meta) +end + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + pushing(pos, meta) + return State:is_active(meta) + end + return false +end + +minetest.register_node("tubelib_addons1:pusher_fast", { + description = "Fast Pusher", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons1_pusher.png', + 'tubelib_addons1_pusher.png', + 'tubelib_outp.png', + 'tubelib_inp.png', + "tubelib_addons1_pusher.png^[transformR180]", + "tubelib_addons1_pusher.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + local number = tubelib.add_node(pos, "tubelib_addons1:pusher_fast") + State:node_init(pos, number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + State:start(pos, M(pos)) + end + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib_addons1:pusher_fast_active", { + description = "Fast Pusher", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_addons1_pusher_an.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1.0, + }, + }, + { + image = "tubelib_addons1_pusher_an.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1.0, + }, + }, + 'tubelib_outp.png', + 'tubelib_inp.png', + { + image = "tubelib_addons1_pusher_an.png^[transformR180]", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1.0, + }, + }, + { + image = "tubelib_addons1_pusher_an.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 1.0, + }, + }, + }, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + State:stop(pos, M(pos)) + end + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:pusher_fast_defect", { + description = "Fast Pusher", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons1_pusher.png', + 'tubelib_addons1_pusher.png', + 'tubelib_outp.png^tubelib_defect.png', + 'tubelib_inp.png^tubelib_defect.png', + "tubelib_addons1_pusher.png^[transformR180]^tubelib_defect.png", + "tubelib_addons1_pusher.png^tubelib_defect.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + local number = tubelib.add_node(pos, "tubelib_addons1:pusher_fast") + State:node_init(pos, number) + State:defect(pos, meta) + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons1:pusher_fast", + recipe = { + {"", "tubelib:pusher", ""}, + {"", "tubelib:pusher", ""}, + {"", "tubelib:pusher", ""}, + }, +}) + +tubelib.register_node("tubelib_addons1:pusher_fast", + {"tubelib_addons1:pusher_fast_active", "tubelib_addons1:pusher_fast_defect"}, { + on_pull_item = nil, -- pusher has no inventory + on_push_item = nil, -- pusher has no inventory + on_unpull_item = nil, -- pusher has no inventory + is_pusher = true, -- is a pulling/pushing node + + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) diff --git a/mods/techpack/tubelib_addons1/quarry.lua b/mods/techpack/tubelib_addons1/quarry.lua new file mode 100644 index 00000000..ea294b66 --- /dev/null +++ b/mods/techpack/tubelib_addons1/quarry.lua @@ -0,0 +1,469 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + quarry.lua + + Quarry machine to dig stones and other ground blocks. + + The Quarry digs a hole 5x5 blocks large and up to 100 blocks deep. + It starts at the given level (0 is same level as the quarry block, + 1 is one level higher and so on)) and goes down to the given depth number. + It digs one block every 4 seconds. + It requires one item Bio Fuel per 16 blocks. + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local CYCLE_TIME = 4 +local BURNING_TIME = 16 +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 5 + +local Side2Facedir = {F=0, R=1, B=2, L=3, D=4, U=5} +local Depth2Idx = {[1]=1 ,[2]=2, [3]=3, [5]=4, [10]=5, [15]=6, [20]=7, [25]=8, [50]=9, [100]=10} +local Level2Idx = {[2]=1, [1]=2, [0]=3, [-1]=4, [-2]=5, [-3]=6, + [-5]=7, [-10]=8, [-15]=9, [-20]=10} + +local function formspec(self, pos, meta) + local depth = meta:get_int("max_levels") + if not Depth2Idx[depth] then depth = 1 end + local start_level = meta:get_int("start_level") + if not Level2Idx[start_level] then start_level = 0 end + local endless = meta:get_int("endless") or 0 + local fuel = meta:get_int("fuel") or 0 + -- some recalculations + endless = endless == 1 and "true" or "false" + if self:get_state(meta) ~= tubelib.RUNNING then + fuel = fuel * 100/BURNING_TIME + else + fuel = 0 + end + + return "size[9,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "dropdown[0,0;1.5;level;2,1,0,-1,-2,-3,-5,-10,-15,-20;"..Level2Idx[start_level].."]".. + "label[1.6,0.2;Start level]".. + "dropdown[0,1;1.5;depth;1,2,3,5,10,15,20,25,50,100;"..Depth2Idx[depth].."]".. + "label[1.6,1.2;Digging depth]".. + "checkbox[0,2;endless;Run endless;"..endless.."]".. + "list[context;main;5,0;4,4;]".. + "list[context;fuel;1.5,3;1,1;]".. + "item_image[1.5,3;1,1;tubelib_addons1:biofuel]".. + "image[2.5,3;1,1;default_furnace_fire_bg.png^[lowpart:".. + fuel..":default_furnace_fire_fg.png]".. + "image_button[3.5,3;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + "list[current_player;main;0.5,4.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:quarry", + node_name_active = "tubelib_addons1:quarry_active", + node_name_defect = "tubelib_addons1:quarry_defect", + infotext_name = "Tubelib Quarry", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 12, + on_stop = function(pos, meta, oldstate) + if oldstate == tubelib.RUNNING then + meta:set_int("idx", 1) -- restart from the beginning + meta:set_string("quarry_pos", nil) + end + end, + formspec_func = formspec, +}) + +local function get_pos(pos, facedir, side, steps) + facedir = (facedir + Side2Facedir[side]) % 4 + local dir = vector.multiply(minetest.facedir_to_dir(facedir), steps or 1) + return vector.add(pos, dir) +end + +local function get_node_lvm(pos) + local node = minetest.get_node_or_nil(pos) + if node then + return node + end + local vm = minetest.get_voxel_manip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local param2_data = vm:get_param2_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local idx = area:index(pos.x, pos.y, pos.z) + node = { + name = minetest.get_name_from_content_id(data[idx]), + param2 = param2_data[idx] + } + return node +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local inv = M(pos):get_inventory() + if listname == "main" then + return stack:get_count() + elseif listname == "fuel" and stack:get_name() == "tubelib_addons1:biofuel" then + return stack:get_count() + end + return 0 +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + + +local QuarrySchedule = {0,0,3,3,3,3,2,2,2,2,1,1,1,1,0,3,0,0,3,3,2,2,1,0,0} + + +local function get_next_pos(pos, facedir, dir) + facedir = (facedir + dir) % 4 + return vector.add(pos, core.facedir_to_dir(facedir)) +end + +local function skip_the_air(pos, curr_level, facedir) + local pos1, pos2, lPos + pos1 = get_pos(pos, facedir, "F", 2) + pos2 = get_pos(pos, facedir, "B", 2) + pos2 = get_pos(pos2, facedir, "L", 5) + pos1.y = curr_level + pos2.y = curr_level + while true do + lPos = minetest.find_nodes_in_area(pos1, pos2, {"air"}) + if #lPos ~= 25 then break end + pos1.y = pos1.y - 1 + pos2.y = pos2.y - 1 + end + return pos2.y +end + +local function quarry_next_node(pos, meta) + -- check fuel + local fuel = meta:get_int("fuel") or 0 + if fuel <= 0 then + if tubelib.get_this_item(meta, "fuel", 1) == nil then + State:fault(pos, meta) + return + end + fuel = BURNING_TIME + else + fuel = fuel - 1 + end + meta:set_int("fuel", fuel) + + local idx = meta:get_int("idx") + if idx == 0 then idx = 1 end + local facedir = minetest.get_node(pos).param2 + local owner = meta:get_string("owner") + local endless = meta:get_int("endless") + local start_y = pos.y + meta:get_int("start_level") + local stop_y = pos.y + meta:get_int("start_level") - meta:get_int("max_levels") + 1 + local quarry_pos = P(meta:get_string("quarry_pos")) + + if quarry_pos == nil then -- start at the beginning? + quarry_pos = get_pos(pos, facedir, "L") + local y = skip_the_air(quarry_pos, start_y, facedir) + if y < stop_y then -- below the base line? + meta:set_int("idx", 1) + meta:set_string("quarry_pos", nil) + State:stop(pos, meta) + return + end + quarry_pos.y = y + elseif idx < #QuarrySchedule then + quarry_pos = get_next_pos(quarry_pos, facedir, QuarrySchedule[idx]) + idx = idx + 1 + elseif quarry_pos.y > stop_y then + local y = quarry_pos.y + quarry_pos = get_pos(pos, facedir, "L") + quarry_pos.y = y - 1 + idx = 1 + elseif endless == 1 then -- farming mode + quarry_pos = get_pos(pos, facedir, "L") + quarry_pos.y = start_y + idx = 1 + else + meta:set_int("idx", 1) + meta:set_string("quarry_pos", nil) + State:stop(pos, meta) + return + end + meta:set_int("idx", idx) + meta:set_string("quarry_pos", S(quarry_pos)) + + if minetest.is_protected(quarry_pos, owner) then + minetest.chat_send_player(owner, "[Tubelib Quarry] Area is protected!") + State:fault(pos, meta) + return + end + + local node = get_node_lvm(quarry_pos) + if node then + local number = meta:get_string("tubelib_number") + local order = tubelib_addons1.GroundNodes[node.name] + if order ~= nil then + local inv = meta:get_inventory() + if inv:room_for_item("main", ItemStack(order.drop)) then + minetest.remove_node(quarry_pos) + inv:add_item("main", ItemStack(order.drop)) + meta:set_string("infotext", "Tubelib Quarry "..number.. + ": running "..idx.."/"..(start_y-quarry_pos.y+1)) + State:keep_running(pos, meta, COUNTDOWN_TICKS, 1) + else + State:blocked(pos, meta) + end + else + meta:set_string("infotext", "Tubelib Quarry "..number.. + ": running "..idx.."/"..(start_y-quarry_pos.y+1)) + end + end +end + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + quarry_next_node(pos, meta) + return State:is_active(meta) + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = M(pos) + + local max_levels = meta:get_int("max_levels") + if fields.depth then + max_levels = tonumber(fields.depth) + end + if max_levels ~= meta:get_int("max_levels") then + meta:set_string("quarry_pos", nil) -- reset the quarry + meta:set_int("max_levels", max_levels) + State:stop(pos, meta) + end + + local start_level = meta:get_int("start_level") or 0 + if fields.level ~= nil then + start_level = tonumber(fields.level) + end + if start_level ~= meta:get_int("start_level") then + meta:set_string("quarry_pos", nil) -- reset the quarry + meta:set_int("start_level", start_level) + State:stop(pos, meta) + end + + local endless = meta:get_int("endless") or 0 + if fields.endless ~= nil then + endless = fields.endless == "true" and 1 or 0 + end + meta:set_int("endless", endless) + + State:state_button_event(pos, fields) +end + +minetest.register_node("tubelib_addons1:quarry", { + description = "Tubelib Quarry", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_addons1_quarry.png', + 'tubelib_addons1_quarry.png', + 'tubelib_addons1_quarry_passive.png', + 'tubelib_addons1_quarry.png', + 'tubelib_addons1_quarry.png^[transformFX', + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('main', 16) + inv:set_size('fuel', 1) + local number = tubelib.add_node(pos, "tubelib_addons1:quarry") + meta:set_string("owner", placer:get_player_name()) + meta:set_int("endless", 0) + meta:set_int("curr_level", -1) + meta:set_int("max_levels", 1) + State:node_init(pos, number) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("main") + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + on_receive_fields = on_receive_fields, + on_timer = keep_running, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:quarry_active", { + description = "Tubelib Quarry", + tiles = { + -- up, down, right, left, back, front + + 'tubelib_front.png', + 'tubelib_addons1_quarry.png', + 'tubelib_addons1_quarry.png', + { + image = 'tubelib_addons1_quarry_active.png', + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_addons1_quarry.png', + 'tubelib_addons1_quarry.png^[transformFX', + }, + + on_receive_fields = on_receive_fields, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons1:quarry_defect", { + description = "Tubelib Quarry", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_quarry.png^tubelib_defect.png', + 'tubelib_addons1_quarry_passive.png^tubelib_defect.png', + 'tubelib_addons1_quarry.png^tubelib_defect.png', + 'tubelib_addons1_quarry.png^[transformFX^tubelib_defect.png', + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('main', 16) + inv:set_size('fuel', 1) + local number = tubelib.add_node(pos, "tubelib_addons1:quarry") + meta:set_string("owner", placer:get_player_name()) + meta:set_int("endless", 0) + meta:set_int("curr_level", -1) + meta:set_int("max_levels", 1) + State:node_init(pos, number) + State:defect(pos, M(pos)) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("main") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + output = "tubelib_addons1:quarry", + recipe = { + {"group:wood", "default:mese_crystal", "group:wood"}, + {"default:steel_ingot", "default:mese_crystal", "tubelib:tubeS"}, + {"group:wood", "default:mese_crystal", "group:wood"}, + }, +}) + + +tubelib.register_node("tubelib_addons1:quarry", + {"tubelib_addons1:quarry_active", "tubelib_addons1:quarry_defect"}, { + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "main") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "fuel", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "main", item) + end, + on_recv_message = function(pos, topic, payload) + if topic == "fuel" then + return tubelib.fuelstate(M(pos), "fuel") + end + + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + local depth = M(pos):get_int("max_levels") or 1 + -- If depth is 1, it is likely that the quarry is used as cobble generator, + -- controlled by a sequencer. If so, don't restart the timer. + State:on_node_load(pos, depth == 1) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) + diff --git a/mods/techpack/tubelib_addons1/reformer.lua b/mods/techpack/tubelib_addons1/reformer.lua new file mode 100644 index 00000000..4a88b61a --- /dev/null +++ b/mods/techpack/tubelib_addons1/reformer.lua @@ -0,0 +1,368 @@ +--[[ + + Tubelib Addons 1 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + reformer.lua + + The Reformer converts 4 Bio Gas items into one Bio Fuel item, + needed by Harvester and Quarry. + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 4 +local COUNTDOWN_TICKS = 4 +local CYCLE_TIME = 2 +local NUM_BIOGAS = 4 -- to produce on biofuel + +local function formspec(self, pos, meta) + return "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;0,0;3,3;]".. + "item_image[0,0;1,1;tubelib_addons1:biogas]".. + "image[3.5,1;1,1;tubelib_gui_arrow.png]".. + "image_button[3.5,3;1,1;".. self:get_state_button_image(meta) ..";state_button;]".. + "list[context;dst;5,0;3,3;]".. + "item_image[5,0;1,1;tubelib_addons1:biofuel]".. + "list[current_player;main;0,4.3;8,4;]".. + "listring[context;dst]".. + "listring[current_player;main]".. + "listring[context;src]".. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons1:reformer", + node_name_defect = "tubelib_addons1:reformer_defect", + infotext_name = "Tubelib Reformer", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 10, + formspec_func = formspec, +}) + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = M(pos) + local inv = meta:get_inventory() + if listname == "src" and stack:get_name() == "tubelib_addons1:biogas" then + if State:get_state(meta) == tubelib.STANDBY then + State:start(pos, meta) + end + return stack:get_count() + elseif listname == "dst" then + return stack:get_count() + end + return 0 +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = M(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + + +local function place_top(pos, facedir, placer) + if minetest.is_protected(pos, placer:get_player_name()) then + return false + end + local node = minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] + if not def or not def.buildable_to then + return false + end + minetest.add_node(pos, {name="tubelib_addons1:reformer_top", param2=facedir}) + return true +end + +local function convert_biogas_to_biofuel(pos, meta) + local inv = meta:get_inventory() + local biofuel = ItemStack("tubelib_addons1:biofuel") + + -- Not enough output space? + if not inv:room_for_item("dst", biofuel) then + State:blocked(pos, meta) + return + end + + -- take NUM_BIOGAS items + local items = {} + for i = 1, NUM_BIOGAS do + items[i] = tubelib.get_num_items(meta, "src", 1) + if items[i] then -- input available? + if items[i]:get_name() ~= "tubelib_addons1:biogas" then + for j = 1, #items do + inv:add_item("src", items[j]) + end + State:fault(pos, meta) + return + end + end + end + + -- put result into dst inventory + if #items == NUM_BIOGAS then + inv:add_item("dst", biofuel) + State:keep_running(pos, meta, COUNTDOWN_TICKS) + return + end + + -- put biogas back to src inventory + for i = 1, #items do + inv:add_item("src", items[i]) + end + State:idle(pos, meta) +end + + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + convert_biogas_to_biofuel(pos, meta) + return State:is_active(meta) + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + State:state_button_event(pos, fields) +end + + +minetest.register_node("tubelib_addons1:reformer", { + description = "Tubelib Reformer", + inventory_image = "tubelib_addons1_reformer_inventory.png", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_reformer1_bottom.png', + 'tubelib_addons1_reformer1_bottom.png', + 'tubelib_addons1_reformer2_bottom.png', + 'tubelib_addons1_reformer2_bottom.png', + }, + + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, 24/16, 8/16 }, + }, + + on_construct = function(pos) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('src', 9) + inv:set_size('dst', 9) + end, + + after_place_node = function(pos, placer) + local facedir = minetest.dir_to_facedir(placer:get_look_dir(), false) + if place_top({x=pos.x, y=pos.y+1, z=pos.z}, facedir, placer) then + local number = tubelib.add_node(pos, "tubelib_addons1:reformer") + State:node_init(pos, number) + else + minetest.remove_node(pos) + minetest.chat_send_player(placer:get_player_name(), "Reformer will not fit there") + return true + end + end, + + -- the reformer needs 'on_dig' to be able to remove the upper node + on_dig = function(pos, node, puncher) + local pos_above = vector.add(pos, vector.new(0, 1, 0)) + local player_name = puncher:get_player_name() + + if minetest.is_protected(pos, player_name) or minetest.is_protected(pos_above, player_name) then + return + end + + local meta = M(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + State:on_dig_node(pos, node, puncher) + tubelib.remove_node(pos) + minetest.remove_node(pos_above) + end + end, + + on_rotate = screwdriver.disallow, + on_timer = keep_running, + on_receive_fields = on_receive_fields, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("tubelib_addons1:reformer_defect", { + description = "Tubelib Reformer defect", + inventory_image = "tubelib_addons1_reformer_inventory.png", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_addons1_reformer1_bottom.png^tubelib_defect.png', + 'tubelib_addons1_reformer1_bottom.png^tubelib_defect.png', + 'tubelib_addons1_reformer2_bottom.png^tubelib_defect.png', + 'tubelib_addons1_reformer2_bottom.png^tubelib_defect.png', + }, + + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, 24/16, 8/16 }, + }, + + on_construct = function(pos) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('src', 9) + inv:set_size('dst', 9) + end, + + after_place_node = function(pos, placer) + local facedir = minetest.dir_to_facedir(placer:get_look_dir(), false) + if place_top({x=pos.x, y=pos.y+1, z=pos.z}, facedir, placer) then + local number = tubelib.add_node(pos, "tubelib_addons1:reformer") + State:node_init(pos, number) + State:defect(pos, M(pos)) + else + minetest.remove_node(pos) + minetest.chat_send_player(placer:get_player_name(), "Reformer will not fit there") + return true + end + end, + + -- the reformer needs 'on_dig' to be able to remove the upper node + on_dig = function(pos, node, puncher, pointed_thing) + local pos_above = vector.add(pos, vector.new(0, 1, 0)) + local puncher_name = puncher:get_player_name() + + if minetest.is_protected(pos, puncher_name) or minetest.is_protected(pos_above, puncher_name) then + return + end + + local meta = M(pos) + local inv = meta:get_inventory() + if inv:is_empty("dst") and inv:is_empty("src") then + minetest.node_dig(pos, node, puncher, pointed_thing) + minetest.remove_node(pos_above) + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + on_rotate = screwdriver.disallow, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_node("tubelib_addons1:reformer_top", { + description = "Tubelib Reformer Top", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + "tubelib_front.png", + 'tubelib_addons1_reformer1_top.png', + 'tubelib_addons1_reformer1_top.png', + 'tubelib_addons1_reformer2_top.png', + 'tubelib_addons1_reformer2_top.png', + }, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + pointable = false, +}) + +minetest.register_craftitem("tubelib_addons1:biofuel", { + description = "Bio Fuel", + inventory_image = "tubelib_addons1_biofuel.png", +}) + +minetest.register_craft({ + type = "fuel", + recipe = "tubelib_addons1:biofuel", + burntime = 12, +}) + + +minetest.register_craft({ + output = "tubelib_addons1:reformer", + recipe = { + {"default:steel_ingot", "default:clay", "default:steel_ingot"}, + {"tubelib:tubeS", "default:mese_crystal", "tubelib:tubeS"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + }, +}) + + +tubelib.register_node("tubelib_addons1:reformer", {"tubelib_addons1:reformer_defect"}, { + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "dst") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "dst", item) + end, + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_autocrafter.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_autocrafter.png new file mode 100644 index 00000000..e1ce3705 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_autocrafter.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_autocrafter_active.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_autocrafter_active.png new file mode 100644 index 00000000..eaf85dd7 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_autocrafter_active.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_biofuel.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_biofuel.png new file mode 100644 index 00000000..a5feeaf7 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_biofuel.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_biogas.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_biogas.png new file mode 100644 index 00000000..b528306a Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_biogas.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_detector.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_detector.png new file mode 100644 index 00000000..1c4febb5 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_detector.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_detector_active.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_detector_active.png new file mode 100644 index 00000000..ee1c6185 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_detector_active.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_bottom.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_bottom.png new file mode 100644 index 00000000..8a1cb79a Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_bottom.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_inventory.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_inventory.png new file mode 100644 index 00000000..a4795a5e Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_inventory.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_top.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_top.png new file mode 100644 index 00000000..c2811971 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_fermenter_top.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_frame.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_frame.png new file mode 100644 index 00000000..55f70071 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_frame.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_funnel.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_funnel.png new file mode 100644 index 00000000..de08d008 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_funnel.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_funnel_top.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_funnel_top.png new file mode 100644 index 00000000..514723cb Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_funnel_top.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_grinder.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_grinder.png new file mode 100644 index 00000000..87e5c582 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_grinder.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_grinder_active.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_grinder_active.png new file mode 100644 index 00000000..11f8bd36 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_grinder_active.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_harvester.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_harvester.png new file mode 100644 index 00000000..20e4505e Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_harvester.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_harvester_top.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_harvester_top.png new file mode 100644 index 00000000..0237ce30 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_harvester_top.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler.png new file mode 100644 index 00000000..5033f439 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler_active.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler_active.png new file mode 100644 index 00000000..b6d30667 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler_active.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler_passive.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler_passive.png new file mode 100644 index 00000000..3a4e5483 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_liquidsampler_passive.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_pusher.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_pusher.png new file mode 100644 index 00000000..96c01e08 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_pusher.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_pusher_an.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_pusher_an.png new file mode 100644 index 00000000..c87d5af2 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_pusher_an.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry.png new file mode 100644 index 00000000..5a4c7743 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry_active.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry_active.png new file mode 100644 index 00000000..e7b5e81f Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry_active.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry_passive.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry_passive.png new file mode 100644 index 00000000..2103b6cf Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_quarry_passive.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer1_bottom.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer1_bottom.png new file mode 100644 index 00000000..74a6ebd2 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer1_bottom.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer1_top.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer1_top.png new file mode 100644 index 00000000..fa961e46 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer1_top.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer2_bottom.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer2_bottom.png new file mode 100644 index 00000000..392186a5 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer2_bottom.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer2_top.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer2_top.png new file mode 100644 index 00000000..e5e29e08 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer2_top.png differ diff --git a/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer_inventory.png b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer_inventory.png new file mode 100644 index 00000000..bd06dfb0 Binary files /dev/null and b/mods/techpack/tubelib_addons1/textures/tubelib_addons1_reformer_inventory.png differ diff --git a/mods/techpack/tubelib_addons2/README.md b/mods/techpack/tubelib_addons2/README.md new file mode 100644 index 00000000..97e56efd --- /dev/null +++ b/mods/techpack/tubelib_addons2/README.md @@ -0,0 +1,12 @@ +# Tubelib Extension with Control Blocks \[tubelib_addons2\] + +This extension provides Timer, Sequencer, Repeater, Gate, Door, Access Lock, +Mesecons Converter and different kinds of Lamps, all with tubelib communication support. + + +A Tutorial to this Mod is available as ![Wiki](https://github.com/joe7575/techpack/wiki) + + +## Dependencies +tubelib, default + diff --git a/mods/techpack/tubelib_addons2/accesscontrol.lua b/mods/techpack/tubelib_addons2/accesscontrol.lua new file mode 100644 index 00000000..bfe8d73a --- /dev/null +++ b/mods/techpack/tubelib_addons2/accesscontrol.lua @@ -0,0 +1,161 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + accesscontrol.lua: + +]]-- + +local function switch_on(pos, meta) + if tubelib.data_not_corrupted(pos) then + minetest.sound_play("tubelib_addons2_door", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) + local numbers = meta:get_string("numbers") + local number = meta:get_string("number") + local placer_name = meta:get_string("placer_name") + tubelib.send_message(numbers, placer_name, nil, "on", number) + minetest.get_node_timer(pos):start(4) + end +end + +local function switch_off(pos) + if tubelib.data_not_corrupted(pos) then + minetest.sound_play("tubelib_addons2_door", { + pos = pos, + gain = 0.5, + max_hear_distance = 5, + }) + local meta = minetest.get_meta(pos) + local numbers = meta:get_string("numbers") + local number = meta:get_string("number") + local placer_name = meta:get_string("placer_name") + tubelib.send_message(numbers, placer_name, nil, "off", number) + end +end + +local function formspec1(numbers) + return "size[6,5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0.5,1;5,1;numbers;Door block numbers:;"..numbers.."]" .. + "field[0.5,2.5;5,1;code;Access code (4 digits):;]" .. + "button_exit[1.5,3.5;2,1;exit;Save]" +end + +local function formspec2(code) + return "size[4.2,6]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0.5,1;3.6,1;code;Enter access code;"..code.."]" .. + "button[0.4,2;1,1;b1;1]" .. + "button[1.6,2;1,1;b2;2]" .. + "button[2.8,2;1,1;b3;3]" .. + "button[0.4,3;1,1;b4;4]" .. + "button[1.6,3;1,1;b5;5]" .. + "button[2.8,3;1,1;b6;6]" .. + "button[0.4,4;1,1;b7;7]" .. + "button[1.6,4;1,1;b8;8]" .. + "button[2.8,4;1,1;b9;9]" .. + "button_exit[1.6,5;1,1;ok;OK]" +end + +minetest.register_node("tubelib_addons2:accesscontrol", { + description = "Tubelib Access Lock", + tiles = { + -- up, down, right, left, back, front + 'default_steel_block.png', + 'default_steel_block.png', + 'default_steel_block.png', + 'default_steel_block.png', + 'default_steel_block.png^tubelib_addon2_access_control.png', + "default_steel_block.png^tubelib_addon2_access_control.png", + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons2:accesscontrol") + local meta = minetest.get_meta(pos) + meta:set_string("number", number) + local numbers = meta:get_string("numbers") or "" + meta:set_string("formspec", formspec1(numbers)) + meta:set_string("placer_name", placer:get_player_name()) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if meta:get_string("code") == "" then + if fields.numbers ~= "" and fields.code ~= "" then + if tubelib.check_numbers(fields.numbers) then + meta:set_string("numbers", fields.numbers) + meta:set_string("code", fields.code) + meta:mark_as_private("code") + meta:set_string("infotext", "Tubelib Access Lock, Enter access code") + meta:set_string("formspec", formspec2("")) + end + end + else + local code = meta:get_string("input") or "" + if fields.code == nil then + fields.code = "" + end + for num = 1,9 do + if fields["b"..num] then + code = code..tostring(num) + fields.code = fields.code .. "*" + end + end + meta:set_string("input", code) + if fields.quit == "true" then + meta:set_string("input", "") + if code == meta:get_string("code") then + switch_on(pos, meta) + end + meta:set_string("formspec", formspec2("")) + else + meta:set_string("formspec", formspec2(fields.code)) + end + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + on_timer = switch_off, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons2:accesscontrol", + recipe = { + {"default:steelblock", "tubelib:wlanchip"}, + }, +}) + +tubelib.register_node("tubelib_addons2:accesscontrol", {}, { + on_recv_message = function(pos, topic, payload) + if topic == "set_numbers" then + local meta = minetest.get_meta(pos) + meta:set_string("numbers", payload) + meta:set_string("formspec", formspec1(payload)) + return true + end + end, +}) diff --git a/mods/techpack/tubelib_addons2/ceilinglamp.lua b/mods/techpack/tubelib_addons2/ceilinglamp.lua new file mode 100644 index 00000000..71374063 --- /dev/null +++ b/mods/techpack/tubelib_addons2/ceilinglamp.lua @@ -0,0 +1,132 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + ceilinglamp.lua: + +]]-- + + +local function switch_on(pos, node) + node.name = "tubelib_addons2:ceilinglamp_on" + minetest.swap_node(pos, node) +end + +local function switch_off(pos, node) + node.name = "tubelib_addons2:ceilinglamp" + minetest.swap_node(pos, node) + local pos1 = {x=pos.x-5, y=pos.y-5, z=pos.z-5} + local pos2 = {x=pos.x+5, y=pos.y+5, z=pos.z+5} + minetest.fix_light(pos1, pos2) +end + +minetest.register_node("tubelib_addons2:ceilinglamp", { + description = "Tubelib Ceiling Lamp", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons2_ceilinglamp_top.png', + 'tubelib_addons2_ceilinglamp_bottom.png', + 'tubelib_addons2_ceilinglamp.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-5/16, -5/16, -5/16, 5/16, -7/16, 5/16}, + {-4/16, -7/16, -4/16, 4/16, -8/16, 4/16}, + }, + }, + selection_box = { + type = "wallmounted", + wall_top = {-5/16, 5/16, -5/16, 5/16, 8/16, 5/16}, + wall_bottom = {-5/16, -8/16, -5/16, 5/16, -5/16, 5/16}, + wall_side = {-8/16, -5/16, -5/16, -5/16, 5/16, 5/16} + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons2:ceilinglamp") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Tubelib Ceiling Lamp "..number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_on(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = 0, + sunlight_propagates = true, + paramtype2 = "wallmounted", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("tubelib_addons2:ceilinglamp_on", { + description = "Tubelib Ceiling Lamp", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons2_ceilinglamp_top.png', + 'tubelib_addons2_ceilinglamp_bottom.png', + 'tubelib_addons2_ceilinglamp.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-5/16, -5/16, -5/16, 5/16, -7/16, 5/16}, + {-4/16, -7/16, -4/16, 4/16, -8/16, 4/16}, + }, + }, + selection_box = { + type = "wallmounted", + wall_top = {-5/16, 5/16, -5/16, 5/16, 8/16, 5/16}, + wall_bottom = {-5/16, -8/16, -5/16, 5/16, -5/16, 5/16}, + wall_side = {-8/16, -5/16, -5/16, -5/16, 5/16, 5/16} + }, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_off(pos, node) + end + end, + + paramtype = "light", + light_source = 12, + sunlight_propagates = true, + paramtype2 = "wallmounted", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + type = "shapeless", + output = "tubelib_addons2:ceilinglamp 3", + recipe = {"tubelib:lamp", "default:wood", "default:glass"}, +}) + +tubelib.register_node("tubelib_addons2:ceilinglamp", {"tubelib_addons2:ceilinglamp_on"}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + switch_on(pos, node) + elseif topic == "off" then + switch_off(pos, node) + end + end, +}) diff --git a/mods/techpack/tubelib_addons2/colorlamp.lua b/mods/techpack/tubelib_addons2/colorlamp.lua new file mode 100644 index 00000000..93b84885 --- /dev/null +++ b/mods/techpack/tubelib_addons2/colorlamp.lua @@ -0,0 +1,128 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + colorlamp.lua: + +]]-- + +local tColors = {"#0000FF", "#00FFFF", "#00FF00", "#FFFF00", "#FF0000", "#FF00FF", + "#FFFFFF", "#000000", "#3BC23B", "#CA3131", "#FFA500", "#FFC0CB"} +local sColor = "1,2,3,4,5,6,7,8,9,10,11,12" + +local function switch_node(pos, num, player) + if player == nil or not minetest.is_protected(pos, player:get_player_name()) then + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + node.name = "tubelib_addons2:lamp"..num + minetest.swap_node(pos, node) + local number = meta:get_int("number") + number = string.format("%.04u", number) + meta:set_string("infotext", "Tubelib Color Lamp "..number) + if num ~= "" then + meta:set_int("color", num) + end + end +end + +minetest.register_node("tubelib_addons2:lamp", { + description = "Tubelib Color Lamp", + tiles = {"tubelib_addons2_lamp.png^[colorize:#000000:100"}, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons2:lamp") + local meta = minetest.get_meta(pos) + meta:set_int("number", number) + switch_node(pos, "", placer) + meta:set_string("formspec", "size[3,2]".. + "label[0,0;Select color]".. + "dropdown[0,0.5;3;type;"..sColor..";1]".. + "button_exit[0.5,1.5;2,1;exit;Save]") + meta:set_int("color", 1) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if fields.type then + switch_node(pos, fields.type, player) + end + if fields.exit then + meta:set_string("formspec", nil, player) + end + end, + + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + switch_node(pos, meta:get_int("color"), clicker) + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = 'light', + sunlight_propagates = true, + sounds = default.node_sound_stone_defaults(), + groups = {choppy=2, cracky=1}, + is_ground_content = false, +}) + +tubelib.register_node("tubelib_addons2:lamp", {}, { + on_recv_message = function(pos, topic, payload) + if topic == "on" then + local meta = minetest.get_meta(pos) + switch_node(pos, meta:get_int("color") or "", nil) + elseif topic == "off" then + switch_node(pos, "", nil) + end + end, +}) + + +minetest.register_craft({ + output = "tubelib_addons2:lamp 2", + recipe = { + {"wool:green", "wool:red", "wool:blue"}, + {"tubelib:wlanchip", "default:coal_lump", "tubelib:wlanchip"}, + {"group:wood", "", "group:wood"}, + }, +}) + +for idx,color in ipairs(tColors) do + minetest.register_node("tubelib_addons2:lamp"..idx, { + description = "Tubelib Color Lamp", + tiles = { + "tubelib_addons2_lamp.png^[colorize:"..color..":120", + }, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if fields.type then + switch_node(pos, fields.type, player) + end + if fields.exit then + meta:set_string("formspec", nil) + end + end, + + on_rightclick = function(pos, node, clicker) + switch_node(pos, "", clicker) + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = 'light', + light_source = minetest.LIGHT_MAX, + groups = {choppy=2, cracky=1, not_in_creative_inventory=1}, + is_ground_content = false, + drop = "tubelib_addons2:lamp" + }) +end diff --git a/mods/techpack/tubelib_addons2/colorlamp_ud.lua b/mods/techpack/tubelib_addons2/colorlamp_ud.lua new file mode 100644 index 00000000..2fc7a150 --- /dev/null +++ b/mods/techpack/tubelib_addons2/colorlamp_ud.lua @@ -0,0 +1,149 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + colorlamp_ud.lua which requires the mod unifieddyes: + +]]-- + +local function switch_on(pos, node, player) + if player == nil or not minetest.is_protected(pos, player:get_player_name()) then + node.name = "tubelib_addons2:lamp_on" + minetest.swap_node(pos, node) + end +end + +local function switch_off(pos, node, player) + if player == nil or not minetest.is_protected(pos, player:get_player_name()) then + node.name = "tubelib_addons2:lamp_off" + minetest.swap_node(pos, node) + end +end + +minetest.register_node("tubelib_addons2:lamp_off", { + description = "Tubelib Color Lamp", + tiles = {"tubelib_addons2_lamp.png^[colorize:#000000:100"}, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local number = tubelib.add_node(pos, "tubelib_addons2:lamp_off") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Tubelib Color Lamp "..number) + unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing) + end, + + on_rightclick = switch_on, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger) + end, + + on_construct = unifieddyes.on_construct, + on_dig = unifieddyes.on_dig, + + paramtype = "light", + paramtype2 = "color", + palette = "unifieddyes_palette_extended.png", + place_param2 = 241, + sunlight_propagates = true, + sounds = default.node_sound_stone_defaults(), + groups = {choppy=2, cracky=1, ud_param2_colorable = 1}, + is_ground_content = false, + drop = "tubelib_addons2:lamp_off" +}) + + +minetest.register_node("tubelib_addons2:lamp_on", { + description = "Tubelib Color Lamp", + tiles = {"tubelib_addons2_lamp.png"}, + + on_rightclick = switch_off, + + paramtype = "light", + paramtype2 = "color", + palette = "unifieddyes_palette_extended.png", + groups = {choppy=2, cracky=1, not_in_creative_inventory=1, ud_param2_colorable = 1}, + + on_construct = unifieddyes.on_construct, + after_place_node = unifieddyes.recolor_on_place, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger) + end, + + on_dig = unifieddyes.on_dig, + light_source = minetest.LIGHT_MAX, + is_ground_content = false, + drop = "tubelib_addons2:lamp_off" +}) + +tubelib.register_node("tubelib_addons2:lamp_off", {"tubelib_addons2:lamp_on"}, { + on_recv_message = function(pos, topic, payload) + if topic == "on" then + local node = minetest.get_node(pos) + switch_on(pos, node, nil) + elseif topic == "off" then + local node = minetest.get_node(pos) + switch_off(pos, node, nil) + end + end, +}) + +minetest.register_craft({ + type = "shapeless", + output = "tubelib_addons2:lamp_off", + recipe = {"tubelib:lamp"}, +}) + + +-- +-- Convert legacy nodes +-- +for idx=1,12 do + minetest.register_node("tubelib_addons2:lamp"..idx, { + description = "Tubelib Color Lamp "..idx, + tiles = {"tubelib_addons2_lamp.png"}, + paramtype = 'light', + groups = {choppy=2, cracky=1, not_in_creative_inventory=1}, + is_ground_content = false, + drop = "tubelib_addons2:lamp_off" + }) +end + + +minetest.register_lbm({ + label = "[Tubelib] Color Lamp update", + name = "tubelib_addons2:update", + nodenames = { + "tubelib_addons2:lamp", + "tubelib_addons2:lamp1", "tubelib_addons2:lamp2", "tubelib_addons2:lamp3", + "tubelib_addons2:lamp4", "tubelib_addons2:lamp5", "tubelib_addons2:lamp6", + "tubelib_addons2:lamp7", "tubelib_addons2:lamp8", "tubelib_addons2:lamp9", + "tubelib_addons2:lamp10", "tubelib_addons2:lamp11", "tubelib_addons2:lamp12", + }, + run_at_every_load = true, + action = function(pos, node) + local color = {112, 108, 104, 100, 96, 115, 240, 255, 80, 120, 99, 20} + local meta = minetest.get_meta(pos) + local num = meta:get_int("color") + if node.name == "tubelib_addons2:lamp" then + node.param2 = color[tonumber(num)] + node.name = "tubelib_addons2:lamp_off" + else + node.param2 = color[tonumber(num)] + node.name = "tubelib_addons2:lamp_on" + end + minetest.swap_node(pos, node) + local number = meta:get_int("number") or 0 + number = string.format("%.04u", number) + meta:set_string("infotext", "Tubelib Color Lamp "..number) + end +}) + diff --git a/mods/techpack/tubelib_addons2/depends.txt b/mods/techpack/tubelib_addons2/depends.txt new file mode 100644 index 00000000..b9433b2a --- /dev/null +++ b/mods/techpack/tubelib_addons2/depends.txt @@ -0,0 +1,5 @@ +default +tubelib +basic_materials +mesecons? +unifieddyes? \ No newline at end of file diff --git a/mods/techpack/tubelib_addons2/description.txt b/mods/techpack/tubelib_addons2/description.txt new file mode 100644 index 00000000..bc6f9e1b --- /dev/null +++ b/mods/techpack/tubelib_addons2/description.txt @@ -0,0 +1,2 @@ +Tubelib Extension for switching/controlling tasks + diff --git a/mods/techpack/tubelib_addons2/doorblock.lua b/mods/techpack/tubelib_addons2/doorblock.lua new file mode 100644 index 00000000..c65275c8 --- /dev/null +++ b/mods/techpack/tubelib_addons2/doorblock.lua @@ -0,0 +1,120 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + doorblock.lua: + +]]-- + +local sTextures = "Gate Wood,Aspen Wood,Jungle Wood,Pine Wood,".. + "Cobblestone,Sandstone,Stone,Desert Sandstone,".. + "Copper,Steel,Tin,Coral,".. + "Glas,Obsidian Glas" + +local tTextures = { + ["Gate Wood"]=1, ["Aspen Wood"]=2, ["Jungle Wood"]=3, ["Pine Wood"]=4, + ["Cobblestone"]=5, ["Sandstone"]=6, ["Stone"]=7, ["Desert Sandstone"]=8, + ["Copper"]=9, ["Steel"]=10, ["Tin"]=11, ["Coral"]=12, + ["Glas"]=13, ["Obsidian Glas"]=14, +} + +local tPgns = {"tubelib_addon2_door.png", "default_aspen_wood.png", "default_junglewood.png", "default_pine_wood.png", + "default_cobble.png", "default_sandstone.png", "default_stone.png", "default_desert_sandstone.png", + "default_copper_block.png", "default_steel_block.png", "default_tin_block.png", "default_coral_skeleton.png", + "default_glass.png", "default_obsidian_glass.png"} + +local not_in_inventory=nil +for idx,pgn in ipairs(tPgns) do + minetest.register_node("tubelib_addons2:doorblock"..idx, { + description = "Tubelib Door Block", + tiles = { + pgn.."^[transformR90", + pgn, + pgn.."^[transformR90", + pgn.."^[transformR90", + pgn, + pgn.."^[transformFX", + }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -2/16, 8/16, 8/16, 2/16}, + }, + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + local number = tubelib.add_node(pos, node.name) + meta:set_string("number", number) + meta:set_string("infotext", "Tubelib Door Block "..number) + meta:set_string("formspec", "size[3,2]".. + "label[0,0;Select texture]".. + "dropdown[0,0.5;3;type;"..sTextures..";1]".. + "button_exit[0.5,1.5;2,1;exit;Save]") + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + if fields.type then + node.name = "tubelib_addons2:doorblock"..tTextures[fields.type] + minetest.swap_node(pos, node) + tubelib.add_node(pos, node.name) + end + if fields.exit then + meta:set_string("formspec", nil) + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata) + tubelib.remove_node(pos) + end, + + --drawtype = "glasslike", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=2, choppy=2, crumbly=2, not_in_creative_inventory=not_in_inventory}, + is_ground_content = false, + drop = "tubelib_addons2:doorblock1", + }) + + not_in_inventory = 1 + + tubelib.register_node("tubelib_addons2:doorblock"..idx, {}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + minetest.remove_node(pos) + tubelib.temporary_remove_node(pos, number, node.name, {param2 = node.param2}) + elseif topic == "off" then + local data = tubelib.temporary_remove_node(pos) + if data then + minetest.add_node(pos, {name = data.name, param2 = data.param2}) + local meta = minetest.get_meta(pos) + meta:set_string("number", data.number) + end + end + end, + }) +end + +minetest.register_craft({ + output = "tubelib_addons2:doorblock1", + recipe = { + {"tubelib:wlanchip", "", ""}, + {"group:wood", "", ""}, + {"", "",""}, + }, +}) diff --git a/mods/techpack/tubelib_addons2/gateblock.lua b/mods/techpack/tubelib_addons2/gateblock.lua new file mode 100644 index 00000000..756ee2f3 --- /dev/null +++ b/mods/techpack/tubelib_addons2/gateblock.lua @@ -0,0 +1,110 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + gateblock.lua: + +]]-- + +local NUM_TEXTURES = 20 + +local sTextures = "Wood,Aspen Wood,Jungle Wood,Pine Wood,".. + "Cobblestone,Sandstone,Stone,Desert Sandstone,".. + "Desert Stone,Silver Sandstone,Mossy Cobble,Desert Cobble,".. + "Copper,Steel,Tin,Coral,".. + "Glas,Obsidian Glas,Ice,Gate Wood" + +local tTextures = { + ["Wood"]=1, ["Aspen Wood"]=2, ["Jungle Wood"]=3, ["Pine Wood"]=4, + ["Cobblestone"]=5, ["Sandstone"]=6, ["Stone"]=7, ["Desert Sandstone"]=8, + ["Desert Stone"]=9, ["Silver Sandstone"]=10, ["Mossy Cobble"]=11, ["Desert Cobble"]=12, + ["Copper"]=13, ["Steel"]=14, ["Tin"]=15, ["Coral"]=16, + ["Glas"]=17, ["Obsidian Glas"]=18, ["Ice"]=19, ["Gate Wood"]=20, +} + +local tPgns = {"default_wood.png", "default_aspen_wood.png", "default_junglewood.png", "default_pine_wood.png", + "default_cobble.png", "default_sandstone.png", "default_stone.png", "default_desert_sandstone.png", + "default_desert_stone_block.png", "default_silver_sandstone.png", "default_mossycobble.png", "default_desert_cobble.png", + "default_copper_block.png", "default_steel_block.png", "default_tin_block.png", "default_coral_skeleton.png", + "default_glass.png", "default_obsidian_glass.png", "default_ice.png", "tubelib_addon2_gate.png"} + +local not_in_inventory=nil +for idx,pgn in ipairs(tPgns) do + minetest.register_node("tubelib_addons2:gateblock"..idx, { + description = "Tubelib Gate Block", + tiles = {pgn}, + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + local number = tubelib.add_node(pos, node.name) + meta:set_string("number", number) + meta:set_string("infotext", "Tubelib Gate Block "..number) + meta:set_string("formspec", "size[3,2]".. + "label[0,0;Select texture]".. + "dropdown[0,0.5;3;type;"..sTextures..";"..NUM_TEXTURES.."]".. + "button_exit[0.5,1.5;2,1;exit;Save]") + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + if fields.type then + node.name = "tubelib_addons2:gateblock"..tTextures[fields.type] + minetest.swap_node(pos, node) + tubelib.add_node(pos, node.name) + end + if fields.exit then + meta:set_string("formspec", nil) + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata) + tubelib.remove_node(pos) + end, + + drawtype = "glasslike", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=2, choppy=2, crumbly=2, not_in_creative_inventory=not_in_inventory}, + is_ground_content = false, + drop = "tubelib_addons2:gateblock1", + }) + + not_in_inventory = 1 + + tubelib.register_node("tubelib_addons2:gateblock"..idx, {}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + minetest.remove_node(pos) + tubelib.temporary_remove_node(pos, number, node.name, {param2 = node.param2}) + elseif topic == "off" then + local data = tubelib.temporary_remove_node(pos) + if data then + minetest.add_node(pos, {name = data.name, param2 = data.param2}) + local meta = minetest.get_meta(pos) + meta:set_string("number", data.number) + end + end + end, + }) +end + +minetest.register_craft({ + output = "tubelib_addons2:gateblock"..NUM_TEXTURES, + recipe = { + {"group:wood", "", ""}, + {"tubelib:wlanchip", "", ""}, + {"", "",""}, + }, +}) diff --git a/mods/techpack/tubelib_addons2/industriallamp.lua b/mods/techpack/tubelib_addons2/industriallamp.lua new file mode 100644 index 00000000..373879e1 --- /dev/null +++ b/mods/techpack/tubelib_addons2/industriallamp.lua @@ -0,0 +1,209 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + industriallamp.lua: + +]]-- + +local function switch_on(pos, node) + if string.sub(node.name, -3) ~= "_on" then + node.name = node.name.."_on" + minetest.swap_node(pos, node) + end +end + +local function switch_off(pos, node) + if string.sub(node.name, -3) == "_on" then + node.name = string.sub(node.name, 1, -4) + minetest.swap_node(pos, node) + local pos1 = {x=pos.x-5, y=pos.y-5, z=pos.z-5} + local pos2 = {x=pos.x+5, y=pos.y+5, z=pos.z+5} + minetest.fix_light(pos1, pos2) + end +end + +local function register_lamp(tbl) + local num, tiles, tiles_on, node_box, size = tbl.num, tbl.tiles, tbl.tiles_on, tbl.node_box, tbl.size + minetest.register_node("tubelib_addons2:industriallamp"..num, { + description = "Tubelib Industrial Lamp "..num, + tiles = tiles, + drawtype = "nodebox", + node_box = node_box, + inventory_image = 'tubelib_addons2_industriallamp_inv'..num..'.png', + + selection_box = { + type = "wallmounted", + wall_top = {-size.x, 0.5 - size.y, -size.z, size.x, 0.5, size.z}, + wall_bottom = {-size.x, -0.5, -size.z, size.x, -0.5 + size.y, size.z}, + wall_side = {-0.5, -size.z, size.x, -0.5 + size.y, size.z, -size.x}, + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons2:industriallamp"..num) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Tubelib Industrial Lamp "..num..": "..number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + node.name = "tubelib_addons2:industriallamp"..num.."_on" + minetest.swap_node(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = 0, + sunlight_propagates = true, + paramtype2 = "wallmounted", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), + }) + + minetest.register_node("tubelib_addons2:industriallamp"..num.."_on", { + description = "Tubelib Industrial Lamp "..num, + tiles = tiles_on, + drawtype = "nodebox", + node_box = node_box, + + selection_box = { + type = "wallmounted", + wall_top = {-size.x, 0.5 - size.y, -size.z, size.x, 0.5, size.z}, + wall_bottom = {-size.x, -0.5, -size.z, size.x, -0.5 + size.y, size.z}, + wall_side = {-0.5, -size.z, size.x, -0.5 + size.y, size.z, -size.x}, + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons2:industriallamp"..num) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Tubelib Industrial Lamp "..num..": "..number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + node.name = "tubelib_addons2:industriallamp"..num + minetest.swap_node(pos, node) + local pos1 = {x=pos.x-5, y=pos.y-5, z=pos.z-5} + local pos2 = {x=pos.x+5, y=pos.y+5, z=pos.z+5} + minetest.fix_light(pos1, pos2) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = minetest.LIGHT_MAX, + sunlight_propagates = true, + paramtype2 = "wallmounted", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + drop = "tubelib_addons2:industriallamp"..num, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), + }) + + tubelib.register_node("tubelib_addons2:industriallamp"..num, {"tubelib_addons2:industriallamp"..num.."_on"}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + switch_on(pos, node) + elseif topic == "off" then + switch_off(pos, node) + end + end, + }) +end + +minetest.register_craft({ + output = "tubelib_addons2:industriallamp1 2", + recipe = { + {"", "", ""}, + {"default:glass", "tubelib:wlanchip", "dye:grey"}, + {"basic_materials:plastic_strip", "default:copper_ingot", "basic_materials:plastic_strip"}, + }, +}) + +minetest.register_craft({ + output = "tubelib_addons2:industriallamp2 2", + recipe = { + {"default:glass", "default:glass", ""}, + {"tubelib:wlanchip", "dye:black", ""}, + {"basic_materials:steel_bar", "basic_materials:steel_bar", ""}, + }, +}) + + +register_lamp({ + num = 1, + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons2_industriallamp1.png', + 'tubelib_addons2_industriallamp1.png', + 'tubelib_addons2_industriallamp1.png^[transformR180', + 'tubelib_addons2_industriallamp1.png^[transformR180', + 'tubelib_addons2_industriallamp1.png', + 'tubelib_addons2_industriallamp1.png', + }, + tiles_on = { + -- up, down, right, left, back, front + 'tubelib_addons2_industriallamp1_on.png', + 'tubelib_addons2_industriallamp1_on.png', + 'tubelib_addons2_industriallamp1_on.png^[transformR180', + 'tubelib_addons2_industriallamp1_on.png^[transformR180', + 'tubelib_addons2_industriallamp1_on.png', + 'tubelib_addons2_industriallamp1_on.png', + }, + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -3/32, -6/16, -9/32, 3/32}, + { 6/16, -8/16, -3/32, 8/16, -9/32, 3/32}, + {-6/16, -7/16, -1/16, 6/16, -5/16, 1/16}, + }, + }, + size = {x = 8/16, y = 7/32, z = 3/32} +}) + +register_lamp({ + num = 2, + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons2_industriallamp2.png', + 'tubelib_addons2_industriallamp2.png', + 'tubelib_addons2_industriallamp2.png^[transformR180', + 'tubelib_addons2_industriallamp2.png^[transformR180', + 'tubelib_addons2_industriallamp2.png', + 'tubelib_addons2_industriallamp2.png', + }, + tiles_on = { + -- up, down, right, left, back, front + 'tubelib_addons2_industriallamp2_on.png', + 'tubelib_addons2_industriallamp2_on.png', + 'tubelib_addons2_industriallamp2_on.png^[transformR180', + 'tubelib_addons2_industriallamp2_on.png^[transformR180', + 'tubelib_addons2_industriallamp2_on.png', + 'tubelib_addons2_industriallamp2_on.png', + }, + node_box = { + type = "fixed", + fixed = { + {-8/32, -16/32, -4/32, 8/32, -9/32, 4/32}, + {-7/32, -16/32, -5/32, 7/32, -9/32, 5/32}, + {-7/32, -9/32, -4/32, 7/32, -8/32, 4/32}, + }, + }, + size = {x = 8/32, y = 8/32, z = 5/32} +}) + \ No newline at end of file diff --git a/mods/techpack/tubelib_addons2/init.lua b/mods/techpack/tubelib_addons2/init.lua new file mode 100644 index 00000000..fb378101 --- /dev/null +++ b/mods/techpack/tubelib_addons2/init.lua @@ -0,0 +1,33 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017,2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + +dofile(minetest.get_modpath("tubelib_addons2") .. "/timer.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/sequencer.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/gateblock.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/doorblock.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/repeater.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/logic_not.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/programmer.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/accesscontrol.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/streetlamp.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/ceilinglamp.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/invisiblelamp.lua") +dofile(minetest.get_modpath("tubelib_addons2") .. "/industriallamp.lua") + +if minetest.get_modpath("mesecons") and mesecon then + dofile(minetest.get_modpath("tubelib_addons2") .. "/mesecons_converter.lua") +end +if minetest.get_modpath("unifieddyes") and unifieddyes then + dofile(minetest.get_modpath("tubelib_addons2") .. "/colorlamp_ud.lua") +else + dofile(minetest.get_modpath("tubelib_addons2") .. "/colorlamp.lua") +end diff --git a/mods/techpack/tubelib_addons2/invisiblelamp.lua b/mods/techpack/tubelib_addons2/invisiblelamp.lua new file mode 100644 index 00000000..8e532efb --- /dev/null +++ b/mods/techpack/tubelib_addons2/invisiblelamp.lua @@ -0,0 +1,103 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + invisiblelamp.lua: + +]]-- + + +local function switch_on(pos, node) + node.name = "tubelib_addons2:invisiblelamp_on" + minetest.swap_node(pos, node) +end + +local function switch_off(pos, node) + node.name = "tubelib_addons2:invisiblelamp" + minetest.swap_node(pos, node) + local pos1 = {x=pos.x-5, y=pos.y-5, z=pos.z-5} + local pos2 = {x=pos.x+5, y=pos.y+5, z=pos.z+5} + minetest.fix_light(pos1, pos2) +end + +minetest.register_node("tubelib_addons2:invisiblelamp", { + description = "Tubelib Invisible Lamp", + drawtype = "glasslike_framed_optional", + tiles = {"tubelib_addons2_invisiblelamp.png"}, + inventory_image = 'tubelib_addons2_invisiblelamp_inventory.png', + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons2:invisiblelamp") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Tubelib Invisible Lamp "..number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_on(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = 0, + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("tubelib_addons2:invisiblelamp_on", { + description = "Tubelib Invisible Lamp", + drawtype = "glasslike_framed_optional", + tiles = {"tubelib_addons2_invisiblelamp.png"}, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_off(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = minetest.LIGHT_MAX, + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + drop = "tubelib_addons2:invisiblelamp", + groups = {cracky = 3, oddly_breakable_by_hand = 3, not_in_creative_inventory=1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft({ + output = "tubelib_addons2:invisiblelamp 2", + recipe = { + {"", "default:torch", ""}, + {"default:torch", "tubelib:wlanchip", "default:torch"}, + {"", "default:torch", ""}, + } +}) + +tubelib.register_node("tubelib_addons2:invisiblelamp", {"tubelib_addons2:invisiblelamp_on"}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + switch_on(pos, node) + elseif topic == "off" then + switch_off(pos, node) + end + end, +}) diff --git a/mods/techpack/tubelib_addons2/logic_not.lua b/mods/techpack/tubelib_addons2/logic_not.lua new file mode 100644 index 00000000..3003447b --- /dev/null +++ b/mods/techpack/tubelib_addons2/logic_not.lua @@ -0,0 +1,96 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + logic_not.lua: + +]]-- + +local function formspec(meta) + local numbers = meta:get_string("numbers") + return "size[7,5]".. + "field[0.5,2;6,1;number;Destination node numbers;"..numbers.."]" .. + "button_exit[1,3;2,1;exit;Save]" +end + +minetest.register_node("tubelib_addons2:logic_not", { + description = "Tubelib Logic Not", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png^tubelib_addon2_logic_not.png', + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_number = tubelib.add_node(pos, "tubelib_addons2:logic_not") + meta:set_string("own_number", own_number) + meta:set_string("formspec", formspec(meta)) + meta:set_string("infotext", "Tubelib Logic Not "..own_number..": not connected") + meta:set_string("owner", placer:get_player_name()) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner ~= player:get_player_name() then + return + end + + if tubelib.check_numbers(fields.number) then + meta:set_string("numbers", fields.number) + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "Tubelib Logic Not "..own_number..": connected with "..fields.number) + meta:set_string("formspec", formspec(meta)) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons2:logic_not", + recipe = { + {"", "tubelib:wlanchip", ""}, + {"group:wood", "", "group:wood"}, + {"", "tubelib:wlanchip", ""}, + }, +}) + +tubelib.register_node("tubelib_addons2:logic_not", {}, { + on_recv_message = function(pos, topic, payload) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local numbers = meta:get_string("numbers") + local own_number = meta:get_string("own_number") + if topic == "set_numbers" then + meta:set_string("infotext", "Tubelib Logic Not "..own_number..": connected with "..payload) + meta:set_string("numbers", payload) + meta:set_string("formspec", formspec(meta)) + return true + elseif topic == "on" then + return tubelib.send_message(numbers, owner, nil, "off", payload) + elseif topic == "off" then + return tubelib.send_message(numbers, owner, nil, "on", payload) + end + end + end, +}) diff --git a/mods/techpack/tubelib_addons2/mesecons_converter.lua b/mods/techpack/tubelib_addons2/mesecons_converter.lua new file mode 100644 index 00000000..f64d0c5b --- /dev/null +++ b/mods/techpack/tubelib_addons2/mesecons_converter.lua @@ -0,0 +1,154 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + mesecons_converter.lua: + +]]-- + +local OVER_LOAD_MAX = 5 + +local function formspec(meta) + local numbers = meta:get_string("numbers") + return "size[7,5]".. + "field[0.5,2;6,1;number;Destination node numbers;"..numbers.."]" .. + "button_exit[1,3;2,1;exit;Save]" +end + +local function send_message(pos, topic, payload) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local numbers = meta:get_string("numbers") + local overload_cnt = meta:get_int("overload_cnt") + 1 + meta:set_int("overload_cnt", overload_cnt) + if overload_cnt > OVER_LOAD_MAX then + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "Tubelib Mesecons Converter "..own_number..": fault (overloaded)") + minetest.get_node_timer(pos):stop() + return + else + if topic == "change" then + topic = meta:get_string("state") == "on" and "off" or "on" + end + tubelib.send_message(numbers, owner, nil, topic, payload) + end + meta:set_string("state", topic) +end + +minetest.register_node("tubelib_addons2:mesecons_converter", { + description = "Tubelib Mesecons Converter", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png^tubelib_addon2_mesecons_converter.png', + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_number = tubelib.add_node(pos, "tubelib_addons2:mesecons_converter") + meta:set_string("own_number", own_number) + meta:set_string("formspec", formspec(meta)) + meta:set_string("infotext", "Tubelib Mesecons Converter "..own_number..": not connected") + meta:set_string("owner", placer:get_player_name()) + -- send_message is called 24 times after the node is placed + meta:set_int("overload_cnt", -24) + minetest.get_node_timer(pos):start(1) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner ~= player:get_player_name() then + return + end + + if tubelib.check_numbers(fields.number) then + meta:set_string("numbers", fields.number) + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "Tubelib Mesecons Converter "..own_number..": connected with "..fields.number) + meta:set_string("formspec", formspec(meta)) + end + + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(1) + end + end, + + mesecons = { + receptor = { + state = mesecon.state.off, + rules = mesecon.rules.default, + }, + effector = { + rules = mesecon.rules.default, + action_on = function (pos, node) + local meta = minetest.get_meta(pos) + local own_number = meta:get_string("own_number") + send_message(pos, "on", own_number) + end, + action_off = function (pos, node) + local meta = minetest.get_meta(pos) + local own_number = meta:get_string("own_number") + send_message(pos, "off", own_number) + end, + action_change = function (pos, node) + local meta = minetest.get_meta(pos) + local own_number = meta:get_string("own_number") + send_message(pos, "change", own_number) + end, + } + }, + + on_timer = function(pos,elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + meta:set_int("overload_cnt", 0) + return true + end + return false + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons2:mesecons_converter", + recipe = { + {"tubelib:button", "mesecons:wire_00000000_off"}, + }, +}) + +tubelib.register_node("tubelib_addons2:mesecons_converter", {}, { + on_recv_message = function(pos, topic, payload) + if topic == "on" then + mesecon.receptor_on(pos, mesecon.rules.default) + elseif topic == "off" then + mesecon.receptor_off(pos, mesecon.rules.default) + elseif topic == "set_numbers" then + local meta = minetest.get_meta(pos) + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "Tubelib Mesecons Converter "..own_number..": connected with "..payload) + meta:set_string("numbers", payload) + meta:set_string("formspec", formspec(meta)) + end + return true + end, +}) diff --git a/mods/techpack/tubelib_addons2/mod.conf b/mods/techpack/tubelib_addons2/mod.conf new file mode 100644 index 00000000..476f8c74 --- /dev/null +++ b/mods/techpack/tubelib_addons2/mod.conf @@ -0,0 +1,4 @@ +name=tubelib_addons2 +description=Tubelib Extension for switching/controlling tasks +depends=default,tubelib,basic_materials +optional_depends=mesecons,unifieddyes diff --git a/mods/techpack/tubelib_addons2/programmer.lua b/mods/techpack/tubelib_addons2/programmer.lua new file mode 100644 index 00000000..fe83da76 --- /dev/null +++ b/mods/techpack/tubelib_addons2/programmer.lua @@ -0,0 +1,93 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + programmer.lua: + +]]-- + +local function join_to_string(tbl) + local t = {} + for key,_ in pairs(tbl) do + t[#t + 1] = key .. " " + end + -- remove the last blank + return string.sub(table.concat(t), 1, -2) +end + +local function reset_programmer(itemstack, user, pointed_thing) + user:set_attribute("tubelib_prog_numbers", nil) + minetest.chat_send_player(user:get_player_name(), "[Tubelib Programmer] programmer reset") + return itemstack +end + +local function read_number(itemstack, user, pointed_thing) + local pos = pointed_thing.under + if pos then + local number = tubelib.get_node_number(pos) + if number then + local numbers = minetest.deserialize(user:get_attribute("tubelib_prog_numbers")) or {} + numbers[number] = true + user:set_attribute("tubelib_prog_numbers", minetest.serialize(numbers)) + minetest.chat_send_player(user:get_player_name(), "[Tubelib Programmer] number "..number.." read") + else + minetest.chat_send_player(user:get_player_name(), "[Tubelib Programmer] Unknown node on "..minetest.pos_to_string(pos)) + end + else + return reset_programmer(itemstack, user, pointed_thing) + end + return itemstack +end + +local function program_numbers(itemstack, placer, pointed_thing) + local pos = pointed_thing.under + if pos then + local meta = minetest.get_meta(pos) + local node_number = tubelib.get_node_number(pos) + local numbers = minetest.deserialize(placer:get_attribute("tubelib_prog_numbers")) or {} + placer:set_attribute("tubelib_prog_numbers", nil) + local text = join_to_string(numbers) + local player_name = placer:get_player_name() + if meta and meta:get_string("owner") ~= player_name then + minetest.chat_send_player(player_name, "[Tubelib Programmer] foreign or unknown node!") + return itemstack + end + local res = tubelib.send_request(node_number, "set_numbers", text) + if res == true then + minetest.chat_send_player(player_name, "[Tubelib Programmer] node programmed!") + else + minetest.chat_send_player(player_name, "[Tubelib Programmer] Error: programmer not supported!") + end + return itemstack + else + return reset_programmer(itemstack, placer, pointed_thing) + end +end + +minetest.register_craftitem("tubelib_addons2:programmer", { + description = "Tubelib Programmer", + inventory_image = "tubelib_addons2_programmer.png", + stack_max = 1, + wield_image = "tubelib_addons2_programmer_wield.png", + groups = {cracky=1, book=1}, + -- left mouse button = program + on_use = program_numbers, + on_secondary_use = reset_programmer, + -- right mouse button = read + on_place = read_number, +}) + +minetest.register_craft({ + output = "tubelib_addons2:programmer", + recipe = { + {"", "default:steel_ingot", ""}, + {"", "tubelib:wlanchip", ""}, + {"", "dye:red", ""}, + }, +}) diff --git a/mods/techpack/tubelib_addons2/repeater.lua b/mods/techpack/tubelib_addons2/repeater.lua new file mode 100644 index 00000000..313996ff --- /dev/null +++ b/mods/techpack/tubelib_addons2/repeater.lua @@ -0,0 +1,120 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + repeater.lua: + +]]-- + +local OVER_LOAD_MAX = 5 + +local function formspec(meta) + local numbers = meta:get_string("numbers") + return "size[7,5]".. + "field[0.5,2;6,1;number;Destination node numbers;"..numbers.."]" .. + "button_exit[1,3;2,1;exit;Save]" +end + +minetest.register_node("tubelib_addons2:repeater", { + description = "Tubelib Repeater", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png^tubelib_addon2_repeater.png', + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local own_number = tubelib.add_node(pos, "tubelib_addons2:repeater") + meta:set_string("own_number", own_number) + meta:set_string("formspec", formspec(meta)) + meta:set_string("infotext", "Tubelib Repeater "..own_number..": not connected") + meta:set_string("owner", placer:get_player_name()) + meta:set_int("overload_cnt", 0) + minetest.get_node_timer(pos):start(1) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner ~= player:get_player_name() then + return + end + + if tubelib.check_numbers(fields.number) then + meta:set_string("numbers", fields.number) + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "Tubelib Repeater "..own_number..": connected with "..fields.number) + meta:set_string("formspec", formspec(meta)) + end + + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(1) + end + end, + + on_timer = function(pos,elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + meta:set_int("overload_cnt", 0) + return true + end + return false + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons2:repeater", + recipe = { + {"", "group:wood", ""}, + {"tubelib:wlanchip", "", "tubelib:wlanchip"}, + {"", "group:wood", ""}, + }, +}) + +tubelib.register_node("tubelib_addons2:repeater", {}, { + on_recv_message = function(pos, topic, payload) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local numbers = meta:get_string("numbers") + local overload_cnt = meta:get_int("overload_cnt") + 1 + meta:set_int("overload_cnt", overload_cnt) + if overload_cnt > OVER_LOAD_MAX then + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "Tubelib Repeater "..own_number..": fault (overloaded)") + minetest.get_node_timer(pos):stop() + return false + elseif topic == "set_numbers" then + local own_number = meta:get_string("own_number") + meta:set_string("infotext", "Tubelib Repeater "..own_number..": connected with "..payload) + meta:set_string("numbers", payload) + meta:set_string("formspec", formspec(meta)) + return true + else + return tubelib.send_message(numbers, owner, nil, topic, payload) + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(1) + end, +}) diff --git a/mods/techpack/tubelib_addons2/sequencer.lua b/mods/techpack/tubelib_addons2/sequencer.lua new file mode 100644 index 00000000..9c7fec17 --- /dev/null +++ b/mods/techpack/tubelib_addons2/sequencer.lua @@ -0,0 +1,276 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + sequencer.lua: + +]]-- + +local RUNNING_STATE = 1 +local STOP_STATE = 0 +local NUM_SLOTS = 8 + +local sAction = ",on,off" +local kvAction = {[""]=1, ["on"]=2, ["off"]=3} +local tAction = {nil, "on", "off"} + +local function formspec(state, rules, endless) + endless = endless == 1 and "true" or "false" + local tbl = {"size[8,9.2]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[0,0;Number(s)]label[2.1,0;Command]label[6.4,0;Offset/s]"} + + for idx, rule in ipairs(rules or {}) do + tbl[#tbl+1] = "field[0.2,"..(-0.2+idx)..";2,1;num"..idx..";;"..(rule.num or "").."]" + tbl[#tbl+1] = "dropdown[2,"..(-0.4+idx)..";3.9,1;act"..idx..";"..sAction..";"..(rule.act or "").."]" + tbl[#tbl+1] = "field[6.2,"..(-0.2+idx)..";2,1;offs"..idx..";;"..(rule.offs or "").."]" + end + tbl[#tbl+1] = "checkbox[0,8.5;endless;Run endless;"..endless.."]" + tbl[#tbl+1] = "image_button[5,8.5;1,1;".. tubelib.state_button(state) ..";button;]" + tbl[#tbl+1] = "button[6.2,8.5;1.5,1;help;help]" + + return table.concat(tbl) +end + +local function formspec_help() + return "size[8,9.2]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "label[2,0;Sequencer Help]".. + "label[0,1;Define a sequence of commands\nto control other machines.]".. + "label[0,2.2;Numbers(s) are the node numbers,\nthe command shall sent to.]".. + "label[0,3.4;The commands 'on'/'off' are used\n for machines and other nodes.]".. + "label[0,4.6;Offset is the time to the\nnext line in seconds (1..999).]".. + "label[0,5.8;If endless is set, the Sequencer\nrestarts again and again.]".. + "label[0,7;The command ' ' does nothing,\nonly consuming the offset time.]".. + "button[3,8;2,1;exit;close]" +end + +local function stop_the_sequencer(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", STOP_STATE) + meta:set_string("infotext", "Tubelib Sequencer "..number..": stopped") + local rules = minetest.deserialize(meta:get_string("rules")) + local endless = meta:get_int("endless") or 0 + meta:set_string("formspec", formspec(tubelib.STOPPED, rules, endless)) + minetest.get_node_timer(pos):stop() + return false +end + +local function get_next_slot(idx, rules, endless) + idx = idx + 1 + if idx <= #rules and rules[idx].offs ~= "" and rules[idx].num ~= "" then + return idx + elseif endless == 1 then + return 1 + end + return nil +end + +local function restart_timer(pos, time) + local timer = minetest.get_node_timer(pos) + if timer:is_started() then + timer:stop() + end + if type(time) == "number" then + timer:start(time) + end +end + +local function check_rules(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + local rules = minetest.deserialize(meta:get_string("rules")) + if rules then + local running = meta:get_int("running") + local index = meta:get_int("index") or 1 + local number = meta:get_string("number") + local endless = meta:get_int("endless") or 0 + local placer_name = meta:get_string("placer_name") + while true do -- process all rules as long as offs == 0 + local rule = rules[index] + local offs = rules[index].offs + if type(offs) == "string" then + offs = 0 + end + tubelib.send_message(rule.num, placer_name, nil, tAction[rule.act], number) + index = get_next_slot(index, rules, endless) + if index ~= nil and offs ~= nil and running == 1 then + -- after the last rule a pause with 1 or more sec is required + if index == 1 and offs < 1 then + offs = 1 + end + meta:set_string("infotext", "Tubelib Sequencer "..number..": running ("..index.."/"..NUM_SLOTS..")") + meta:set_int("index", index) + if offs > 0 then + minetest.after(0, restart_timer, pos, offs) + return false + end + else + return stop_the_sequencer(pos) + end + end + end + return false + end + return false +end + +local function start_the_sequencer(pos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + meta:set_int("running", 1) + meta:set_int("index", 1) + meta:set_string("infotext", "Tubelib Sequencer "..number..": running (1/"..NUM_SLOTS..")") + local rules = minetest.deserialize(meta:get_string("rules")) + local endless = meta:get_int("endless") or 0 + meta:set_string("formspec", formspec(tubelib.RUNNING, rules, endless)) + minetest.get_node_timer(pos):start(0.1) + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + if fields.help ~= nil then + meta:set_string("formspec", formspec_help()) + return + end + + local endless = meta:get_int("endless") or 0 + if fields.endless ~= nil then + endless = fields.endless == "true" and 1 or 0 + meta:set_int("index", 1) + end + meta:set_int("endless", endless) + + local rules = minetest.deserialize(meta:get_string("rules")) + if fields.exit ~= nil then + meta:set_string("formspec", formspec(tubelib.state(running), rules, endless)) + return + end + + for idx = 1,NUM_SLOTS do + if fields["offs"..idx] ~= nil then + rules[idx].offs = tonumber(fields["offs"..idx]) or "" + end + if fields["num"..idx] ~= nil and tubelib.check_numbers(fields["num"..idx]) then + rules[idx].num = fields["num"..idx] + end + if fields["act"..idx] ~= nil then + rules[idx].act = kvAction[fields["act"..idx]] + end + end + meta:set_string("rules", minetest.serialize(rules)) + + if fields.button ~= nil then + if running > STOP_STATE then + stop_the_sequencer(pos) + else + start_the_sequencer(pos) + end + elseif fields.num1 ~= nil then -- any other change? + stop_the_sequencer(pos) + else + local endless = meta:get_int("endless") or 0 + meta:set_string("formspec", formspec(tubelib.state(running), rules, endless)) + end + end +end + +minetest.register_node("tubelib_addons2:sequencer", { + description = "Tubelib Sequencer", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png^tubelib_addons2_sequencer.png', + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib_addons2:sequencer") + local rules = {} + for idx = 1,NUM_SLOTS do + rules[idx] = {offs = "", num = "", act = 1} + end + meta:set_string("placer_name", placer:get_player_name()) + meta:set_string("rules", minetest.serialize(rules)) + meta:set_string("number", number) + meta:set_int("index", 1) + meta:set_int("endless", 0) + meta:get_int("running", STOP_STATE) + meta:set_string("formspec", formspec(tubelib.STOPPED, rules, 0)) + meta:set_string("infotext", "Tubelib Sequencer "..number) + end, + + on_receive_fields = on_receive_fields, + + on_dig = function(pos, node, puncher, pointed_thing) + if minetest.is_protected(pos, puncher:get_player_name()) then + return + end + local meta = minetest.get_meta(pos) + local running = meta:get_int("running") + if running ~= 1 then + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end + end, + + on_timer = check_rules, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons2:sequencer", + recipe = { + {"group:wood", "group:wood", ""}, + {"default:mese_crystal", "tubelib:wlanchip", ""}, + {"group:wood", "group:wood", ""}, + }, +}) + +tubelib.register_node("tubelib_addons2:sequencer", {}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + start_the_sequencer(pos) + elseif topic == "off" then + -- do not stop immediately + local meta = minetest.get_meta(pos) + meta:set_int("endless", 0) + end + end, + on_node_load = function(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("running") ~= STOP_STATE then + meta:set_int("running", RUNNING_STATE) + minetest.get_node_timer(pos):start(1) + end + end, +}) \ No newline at end of file diff --git a/mods/techpack/tubelib_addons2/sounds/tubelib_addons2_door.ogg b/mods/techpack/tubelib_addons2/sounds/tubelib_addons2_door.ogg new file mode 100644 index 00000000..976cc388 Binary files /dev/null and b/mods/techpack/tubelib_addons2/sounds/tubelib_addons2_door.ogg differ diff --git a/mods/techpack/tubelib_addons2/streetlamp.lua b/mods/techpack/tubelib_addons2/streetlamp.lua new file mode 100644 index 00000000..81002d4a --- /dev/null +++ b/mods/techpack/tubelib_addons2/streetlamp.lua @@ -0,0 +1,129 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + streetlamp.lua: + +]]-- + + +local function switch_on(pos, node) + node.name = "tubelib_addons2:streetlamp_on" + minetest.swap_node(pos, node) +end + +local function switch_off(pos, node) + node.name = "tubelib_addons2:streetlamp" + minetest.swap_node(pos, node) +end + +minetest.register_node("tubelib_addons2:streetlamp", { + description = "Tubelib Street Lamp", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons2_streetlamp_top.png', + 'tubelib_addons2_streetlamp_top.png', + 'tubelib_addons2_streetlamp_off.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-5/16, -8/16, -5/16, 5/16, 8/16, 5/16}, + {-2/16, -8/16, -2/16, 2/16, 8/16, 2/16}, + {-8/16, 4/16, -8/16, 8/16, 5/16, 8/16}, + {-5/16, -8/16, -5/16, 5/16, -7/16, 5/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + after_place_node = function(pos, placer) + local number = tubelib.add_node(pos, "tubelib_addons2:streetlamp") + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Tubelib Street Lamp "..number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_on(pos, node) + end + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + light_source = 0, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("tubelib_addons2:streetlamp_on", { + description = "Tubelib Street Lamp", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons2_streetlamp_top.png', + 'tubelib_addons2_streetlamp_top.png', + 'tubelib_addons2_streetlamp.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-5/16, -8/16, -5/16, 5/16, 8/16, 5/16}, + {-8/16, 4/16, -8/16, 8/16, 5/16, 8/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + switch_off(pos, node) + end + end, + + paramtype = "light", + light_source = minetest.LIGHT_MAX, + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craft({ + type = "shapeless", + output = "tubelib_addons2:streetlamp 2", + recipe = {"tubelib:lamp", "default:steel_ingot", "default:glass"}, +}) + +--------------------------------------------------------------- tubelib +tubelib.register_node("tubelib_addons2:streetlamp", {"tubelib_addons2:streetlamp_on"}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "on" then + switch_on(pos, node) + elseif topic == "off" then + switch_off(pos, node) + end + end, +}) +--------------------------------------------------------------- tubelib. \ No newline at end of file diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addon2_access_control.png b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_access_control.png new file mode 100644 index 00000000..b03bb737 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_access_control.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addon2_door.png b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_door.png new file mode 100644 index 00000000..2ef811b4 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_door.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addon2_gate.png b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_gate.png new file mode 100644 index 00000000..7c7644ed Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_gate.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addon2_logic_not.png b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_logic_not.png new file mode 100644 index 00000000..21064667 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_logic_not.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addon2_mesecons_converter.png b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_mesecons_converter.png new file mode 100644 index 00000000..dee002e2 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_mesecons_converter.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addon2_repeater.png b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_repeater.png new file mode 100644 index 00000000..37b5bad5 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_repeater.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addon2_timer.png b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_timer.png new file mode 100644 index 00000000..960376de Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addon2_timer.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp.png new file mode 100644 index 00000000..a6730ae8 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp_bottom.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp_bottom.png new file mode 100644 index 00000000..f7635ef0 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp_bottom.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp_top.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp_top.png new file mode 100644 index 00000000..835c1c37 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_ceilinglamp_top.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp1.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp1.png new file mode 100644 index 00000000..8fc49000 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp1.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp1_on.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp1_on.png new file mode 100644 index 00000000..9c2a7020 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp1_on.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp2.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp2.png new file mode 100644 index 00000000..58eb44e9 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp2.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp2_on.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp2_on.png new file mode 100644 index 00000000..8d46b21f Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp2_on.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp_inv1.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp_inv1.png new file mode 100644 index 00000000..58f04d62 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp_inv1.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp_inv2.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp_inv2.png new file mode 100644 index 00000000..18a975f3 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_industriallamp_inv2.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_invisiblelamp.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_invisiblelamp.png new file mode 100644 index 00000000..ad598ca1 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_invisiblelamp.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_invisiblelamp_inventory.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_invisiblelamp_inventory.png new file mode 100644 index 00000000..1767749c Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_invisiblelamp_inventory.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_lamp.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_lamp.png new file mode 100644 index 00000000..f6697687 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_lamp.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_programmer.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_programmer.png new file mode 100644 index 00000000..03a08d70 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_programmer.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_programmer_wield.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_programmer_wield.png new file mode 100644 index 00000000..7a6866c0 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_programmer_wield.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_sequencer.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_sequencer.png new file mode 100644 index 00000000..6d028a8e Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_sequencer.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp.png new file mode 100644 index 00000000..974da017 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp_off.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp_off.png new file mode 100644 index 00000000..4385f298 Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp_off.png differ diff --git a/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp_top.png b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp_top.png new file mode 100644 index 00000000..f4ea4abc Binary files /dev/null and b/mods/techpack/tubelib_addons2/textures/tubelib_addons2_streetlamp_top.png differ diff --git a/mods/techpack/tubelib_addons2/timer.lua b/mods/techpack/tubelib_addons2/timer.lua new file mode 100644 index 00000000..588e0598 --- /dev/null +++ b/mods/techpack/tubelib_addons2/timer.lua @@ -0,0 +1,202 @@ +--[[ + + Tubelib Addons 2 + ================ + + Copyright (C) 2017 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + timer.lua: + +]]-- + +local CYCLE_TIME = 8 + +local tTime = { + ["00:00"] = 1, ["02:00"] = 2, ["04:00"] = 3, + ["06:00"] = 4, ["08:00"] = 5, ["10:00"] = 6, + ["12:00"] = 7, ["14:00"] = 8, ["16:00"] = 9, + ["18:00"] =10, ["20:00"] =11, ["22:00"] =12, +} + +local sTime = "00:00,02:00,04:00,06:00,08:00,10:00,12:00,14:00,16:00,18:00,20:00,22:00" + +local tAction = { + [""] = 1, + ["on"] = 2, + ["off"] = 3, +} + +local sAction = ",on,off" + +local function formspec(events, numbers, actions) + return "size[8,8]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + + "label[0,0;Time]label[2.3,0;Number(s)]label[4.5,0;Command]".. + "dropdown[0,1;2,1;e1;"..sTime..";"..events[1].."]".. + "field[2.3,1.2;2,1;n1;;"..numbers[1].."]" .. + "dropdown[4.5,1;3,1;a1;"..sAction..";"..tAction[actions[1]].."]".. + + "dropdown[0,2;2,1;e2;"..sTime..";"..events[2].."]".. + "field[2.3,2.2;2,1;n2;;"..numbers[2].."]" .. + "dropdown[4.5,2;3,1;a2;"..sAction..";"..tAction[actions[2]].."]".. + + "dropdown[0,3;2,1;e3;"..sTime..";"..events[3].."]".. + "field[2.3,3.2;2,1;n3;;"..numbers[3].."]" .. + "dropdown[4.5,3;3,1;a3;"..sAction..";"..tAction[actions[3]].."]".. + + "dropdown[0,4;2,1;e4;"..sTime..";"..events[4].."]".. + "field[2.3,4.2;2,1;n4;;"..numbers[4].."]" .. + "dropdown[4.5,4;3,1;a4;"..sAction..";"..tAction[actions[4]].."]".. + + "dropdown[0,5;2,1;e5;"..sTime..";"..events[5].."]".. + "field[2.3,5.2;2,1;n5;;"..numbers[5].."]" .. + "dropdown[4.5,5;3,1;a5;"..sAction..";"..tAction[actions[5]].."]".. + + "dropdown[0,6;2,1;e6;"..sTime..";"..events[6].."]".. + "field[2.3,6.2;2,1;n6;;"..numbers[6].."]" .. + "dropdown[4.5,6;3,1;a6;"..sAction..";"..tAction[actions[6]].."]".. + + "button_exit[3,7;2,1;exit;close]" +end + + +local function check_rules(pos,elapsed) + if tubelib.data_not_corrupted(pos) then + local hour = math.floor(minetest.get_timeofday() * 24) + local meta = minetest.get_meta(pos) + local events = minetest.deserialize(meta:get_string("events")) + local numbers = minetest.deserialize(meta:get_string("numbers")) + local actions = minetest.deserialize(meta:get_string("actions")) + local done = minetest.deserialize(meta:get_string("done")) + local placer_name = meta:get_string("placer_name") + local number = meta:get_string("number") + + -- check all rules + for idx,act in ipairs(actions) do + if act ~= "" and numbers[idx] ~= "" then + local hr = (events[idx] - 1) * 2 + if ((hour - hr) % 24) <= 4 then -- last 4 hours? + if done[idx] == false then -- not already executed? + tubelib.send_message(numbers[idx], placer_name, nil, act, number) + done[idx] = true + end + else + done[idx] = false + end + end + end + + -- prepare for the next day + if hour == 23 then + done = {false,false,false,false,false,false} + end + meta:set_string("done", minetest.serialize(done)) + meta:set_string("infotext","Tubelib Timer "..hour..":00") + return true + end + return false +end + + +minetest.register_node("tubelib_addons2:timer", { + description = "Tubelib Timer", + tiles = { + -- up, down, right, left, back, front + 'tubelib_front.png', + 'tubelib_front.png', + 'tubelib_front.png^tubelib_addon2_timer.png', + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib_addons2:timer") + meta:set_string("number", number) + local events = {1,1,1,1,1,1} + local numbers = {"0000","","","","",""} + local actions = {"","","","","",""} + local done = {false,false,false,false,false,false} + meta:set_string("placer_name", placer:get_player_name()) + meta:set_string("events", minetest.serialize(events)) + meta:set_string("numbers", minetest.serialize(numbers)) + meta:set_string("actions", minetest.serialize(actions)) + meta:set_string("done", minetest.serialize(done)) + meta:set_string("formspec", formspec(events, numbers, actions)) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + on_receive_fields = function(pos, formname, fields, player) + local meta = minetest.get_meta(pos) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + local events = minetest.deserialize(meta:get_string("events")) + for idx, evt in ipairs({fields.e1, fields.e2, fields.e3, fields.e4, fields.e5, fields.e6}) do + if evt ~= nil then + events[idx] = tTime[evt] + end + end + meta:set_string("events", minetest.serialize(events)) + + local numbers = minetest.deserialize(meta:get_string("numbers")) + for idx, num in ipairs({fields.n1, fields.n2, fields.n3, fields.n4, fields.n5, fields.n6}) do + if num ~= nil and tubelib.check_numbers(num)then + numbers[idx] = num + end + end + meta:set_string("numbers", minetest.serialize(numbers)) + + local actions = minetest.deserialize(meta:get_string("actions")) + for idx, act in ipairs({fields.a1, fields.a2, fields.a3, fields.a4, fields.a5, fields.a6}) do + if act ~= nil then + actions[idx] = act + end + end + meta:set_string("actions", minetest.serialize(actions)) + + meta:set_string("formspec", formspec(events, numbers, actions)) + local done = {false,false,false,false,false,false} + meta:set_string("done", minetest.serialize(done)) + end, + + on_timer = check_rules, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + sounds = default.node_sound_stone_defaults(), + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, +}) + + +minetest.register_craft({ + output = "tubelib_addons2:timer", + recipe = { + {"group:wood", "group:wood", ""}, + {"default:gold_ingot", "tubelib:wlanchip", ""}, + {"group:wood", "group:wood", ""}, + }, +}) + +tubelib.register_node("tubelib_addons2:timer", {}, { + on_node_load = function(pos) + local meta = minetest.get_meta(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + -- check rules for just loaded areas + local done = {false,false,false,false,false,false} + meta:set_string("done", minetest.serialize(done)) + check_rules(pos,0) + end, +}) + diff --git a/mods/techpack/tubelib_addons3/chest.lua b/mods/techpack/tubelib_addons3/chest.lua new file mode 100644 index 00000000..e32aeb34 --- /dev/null +++ b/mods/techpack/tubelib_addons3/chest.lua @@ -0,0 +1,178 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + chest.lua + + A high performance chest + +]]-- + +local PlayerActions = {} +local InventoryState = {} + + +local function store_action(pos, player, action, stack) + local meta = minetest.get_meta(pos) + local name = player and player:get_player_name() or "" + local number = meta:get_string("number") + local item = stack:get_name().." "..stack:get_count() + PlayerActions[number] = {name, action, item} +end + +local function send_off_command(pos) + local meta = minetest.get_meta(pos) + local dest_num = meta:get_string("dest_num") + local own_num = meta:get_string("number") + local owner = meta:get_string("owner") + tubelib.send_message(dest_num, owner, nil, "off", own_num) +end + + +local function send_command(pos) + local meta = minetest.get_meta(pos) + local dest_num = meta:get_string("dest_num") + if dest_num ~= "" then + local own_num = meta:get_string("number") + local owner = meta:get_string("owner") + tubelib.send_message(dest_num, owner, nil, "on", own_num) + minetest.after(1, send_off_command, pos) + end +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + store_action(pos, player, "put", stack) + send_command(pos) + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + store_action(pos, player, "take", stack) + send_command(pos) + return stack:get_count() +end + +local function formspec() + return "size[12,10]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;main;0,0;12,6;]".. + "list[current_player;main;2,6.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +minetest.register_node("tubelib_addons3:chest", { + description = "HighPerf Chest", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons3_chest_bottom.png', + 'tubelib_addons3_chest_bottom.png', + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_front.png", + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 72) + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib_addons3:chest") + meta:set_string("number", number) + meta:set_string("owner", placer:get_player_name()) + meta:set_string("formspec", formspec()) + meta:set_string("infotext", "HighPerf Chest "..number) + end, + + can_dig = function(pos,player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + + on_dig = function(pos, node, puncher, pointed_thing) + minetest.node_dig(pos, node, puncher, pointed_thing) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons3:chest", + recipe = { + {"default:tin_ingot", "tubelib_addons1:chest", ""}, + {"tubelib_addons1:chest", "default:gold_ingot", ""}, + {"", "", ""}, + }, +}) + +tubelib.register_node("tubelib_addons3:chest", {}, { + on_pull_stack = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_stack(meta, "main") + end, + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + + on_recv_message = function(pos, topic, payload) + if topic == "state" then + local meta = minetest.get_meta(pos) + return tubelib.get_inv_state(meta, "main") + elseif topic == "player_action" then + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + return PlayerActions[number] + elseif topic == "set_numbers" then + if tubelib.check_numbers(payload) then + local meta = minetest.get_meta(pos) + meta:set_string("dest_num", payload) + local number = meta:get_string("number") + meta:set_string("infotext", "HighPerf Chest "..number.." connected with "..payload) + return true + end + else + return "unsupported" + end + end, +}) diff --git a/mods/techpack/tubelib_addons3/depends.txt b/mods/techpack/tubelib_addons3/depends.txt new file mode 100644 index 00000000..278e6ab1 --- /dev/null +++ b/mods/techpack/tubelib_addons3/depends.txt @@ -0,0 +1,3 @@ +tubelib +tubelib_addons1 +default diff --git a/mods/techpack/tubelib_addons3/description.txt b/mods/techpack/tubelib_addons3/description.txt new file mode 100644 index 00000000..317b0ebd --- /dev/null +++ b/mods/techpack/tubelib_addons3/description.txt @@ -0,0 +1,2 @@ +Tubelib Extension with High Performance nodes + diff --git a/mods/techpack/tubelib_addons3/distributor.lua b/mods/techpack/tubelib_addons3/distributor.lua new file mode 100644 index 00000000..86d621e8 --- /dev/null +++ b/mods/techpack/tubelib_addons3/distributor.lua @@ -0,0 +1,528 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018-2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + distributor.lua: + + A high performance distributor +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local NUM_FILTER_ELEM = 6 +local NUM_FILTER_SLOTS = 4 + +local COUNTDOWN_TICKS = 8 +local STANDBY_TICKS = 4 +local CYCLE_TIME = 2 + +local function formspec(self, pos, meta) + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} + return "size[10.5,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;src;0,0;2,4;]".. + "image[2,1.5;1,1;tubelib_gui_arrow.png]".. + "image_button[2,3;1,1;"..self:get_state_button_image(meta)..";state_button;]".. + "checkbox[3,0;filter1;On;"..dump(filter[1]).."]".. + "checkbox[3,1;filter2;On;"..dump(filter[2]).."]".. + "checkbox[3,2;filter3;On;"..dump(filter[3]).."]".. + "checkbox[3,3;filter4;On;"..dump(filter[4]).."]".. + "image[4,0;0.3,1;tubelib_red.png]".. + "image[4,1;0.3,1;tubelib_green.png]".. + "image[4,2;0.3,1;tubelib_blue.png]".. + "image[4,3;0.3,1;tubelib_yellow.png]".. + "list[context;red;4.5,0;6,1;]".. + "list[context;green;4.5,1;6,1;]".. + "list[context;blue;4.5,2;6,1;]".. + "list[context;yellow;4.5,3;6,1;]".. + "list[current_player;main;1.25,4.5;8,4;]".. + "listring[context;src]".. + "listring[current_player;main]" +end + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons3:distributor", + node_name_active = "tubelib_addons3:distributor_active", + node_name_defect = "tubelib_addons3:distributor_defect", + infotext_name = "HighPerf Distributor", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + aging_factor = 50, + formspec_func = formspec, +}) + +-- Return the total number of list entries +local function invlist_num_entries(list) + local res = 0 + for _,items in ipairs(list) do + local name = items:get_name() + if name ~= "" then + res = res + items:get_count() + end + end + return res +end + +-- Return a flat table with all items +local function invlist_entries_as_list(list) + local res = {} + for _,items in ipairs(list) do + local name = items:get_name() + local count = items:get_count() + if name ~= "" then + for i = 1,count do + res[#res+1] = name + end + end + end + return res +end + +local function AddToTbl(kvTbl, new_items, val) + for _, l in ipairs(new_items) do + if kvTbl[l] == nil then + kvTbl[l] = {val} + else + kvTbl[l][#kvTbl[l] + 1] = val + end + end + return kvTbl +end + +local function random_list_elem(list) + if list == nil then + return nil + elseif #list > 1 then + return list[math.random(1, #list)] + else + return list[1] + end +end + +local function rearrange_table(t) + if #t > 1 then + local elem = table.remove(t, 1) + table.insert(t, elem) + end + return t +end + +local Side2Color = {B="red", L="green", F="blue", R="yellow"} +local SlotColors = {"red", "green", "blue", "yellow"} +local Num2Ascii = {"B", "L", "F", "R"} +local FilterCache = {} -- local cache for filter settings + +local function filter_settings(pos) + local hash = minetest.hash_node_position(pos) + local meta = M(pos) + local inv = meta:get_inventory() + local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} + local kvFilterItemNames = {} -- { = side,...} + local OpenPorts = {} -- {side, ...} + + -- collect all filter settings + for idx,slot in ipairs(SlotColors) do + local side = Num2Ascii[idx] + if filter[idx] == true then + local list = inv:get_list(slot) + local filter = invlist_entries_as_list(list) + AddToTbl(kvFilterItemNames, filter, side) + if not next(filter) then + OpenPorts[#OpenPorts + 1] = side + end + end + end + + FilterCache[hash] = { + kvFilterItemNames = kvFilterItemNames, + OpenPorts = OpenPorts, + } +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + + local meta = M(pos) + local inv = meta:get_inventory() + local list = inv:get_list(listname) + local stack_count = stack:get_count() + + if listname == "src" then + if State:get_state(M(pos)) == tubelib.STANDBY then + State:start(pos, meta) + end + return stack_count + end + + local space_left = NUM_FILTER_ELEM - invlist_num_entries(list) + if space_left <= 0 then + return 0 + end + + filter_settings(pos) + return 1 +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + if listname ~= "src" then + filter_settings(pos) + end + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = M(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +-- move items to the output slots +local function distributing(pos, meta) + local player_name = meta:get_string("player_name") + local counter = minetest.deserialize(meta:get_string("item_counter")) or + {red=0, green=0, blue=0, yellow=0} + + -- calculate the filter settings only once + local hash = minetest.hash_node_position(pos) + if FilterCache[hash] == nil then + filter_settings(pos) + end + + -- read data from Cache + local kvFilterItemNames = FilterCache[hash].kvFilterItemNames + local open_ports = table.copy(FilterCache[hash].OpenPorts) + + -- no filter configured? + if not next(kvFilterItemNames) and not next(open_ports) then + State:idle(pos, meta) + return + end + + local busy = false + local inv = meta:get_inventory() + local list = inv:get_list("src") + + -- take one stack from inventory, which fits to one output port + local stack + local start_idx = math.random(1, 8) + for i = start_idx,start_idx+8 do + stack = list[(i % 8) + 1] + if stack:get_count() > 0 and (kvFilterItemNames[stack:get_name()] or next(open_ports)) then + break + end + end + + if stack:get_count() > 0 then + local name = stack:get_name() + local num = stack:get_count() + local second_try = false + -- try configured output ports + for _, side in ipairs(kvFilterItemNames[name] or {}) do -- configured + if tubelib.push_items(pos, side, stack, player_name) then + stack:set_count(0) + local color = Side2Color[side] + counter[color] = counter[color] + num + rearrange_table(kvFilterItemNames[name]) + busy = true + break + end + end + + -- try unconfigured open output ports + if not busy then + local side = random_list_elem(open_ports) + if side then + if tubelib.push_items(pos, side, stack, player_name) then + stack:set_count(0) + local color = Side2Color[side] + counter[color] = counter[color] + num + busy = true + end + end + end + end + inv:set_list("src", list) + + meta:set_string("item_counter", minetest.serialize(counter)) + if busy then + State:keep_running(pos, meta, COUNTDOWN_TICKS, 1) + else + State:idle(pos, meta) + end +end + +-- move items to the output slots +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + distributing(pos, meta) + return State:is_active(meta) + end + return false +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + local meta = M(pos) + local filter = minetest.deserialize(meta:get_string("filter")) + if fields.filter1 ~= nil then + filter[1] = fields.filter1 == "true" + elseif fields.filter2 ~= nil then + filter[2] = fields.filter2 == "true" + elseif fields.filter3 ~= nil then + filter[3] = fields.filter3 == "true" + elseif fields.filter4 ~= nil then + filter[4] = fields.filter4 == "true" + end + meta:set_string("filter", minetest.serialize(filter)) + + filter_settings(pos) + + if fields.state_button ~= nil then + State:state_button_event(pos, fields) + else + meta:set_string("formspec", formspec(State, pos, meta)) + end +end + +-- tubelib command to turn on/off filter channels +local function change_filter_settings(pos, slot, val) + local slots = {["red"] = 1, ["green"] = 2, ["blue"] = 3, ["yellow"] = 4} + local meta = M(pos) + local filter = minetest.deserialize(meta:get_string("filter")) + local num = slots[slot] or 1 + if num >= 1 and num <= 4 then + filter[num] = val == "on" + end + meta:set_string("filter", minetest.serialize(filter)) + + filter_settings(pos) + + meta:set_string("formspec", formspec(State, pos, meta)) + return true +end + +minetest.register_node("tubelib_addons3:distributor", { + description = "HighPerf Distributor", + tiles = { + -- up, down, right, left, back, front + 'tubelib_distributor.png^tubelib_addons3_node_frame.png', + 'tubelib_addons3_chest_bottom.png', + 'tubelib_distributor_yellow.png^tubelib_addons3_node_frame.png', + 'tubelib_distributor_green.png^tubelib_addons3_node_frame.png', + "tubelib_distributor_red.png^tubelib_addons3_node_frame.png", + "tubelib_distributor_blue.png^tubelib_addons3_node_frame.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local number = tubelib.add_node(pos, "tubelib_addons3:distributor") + local filter = {false,false,false,false} + meta:set_string("filter", minetest.serialize(filter)) + State:node_init(pos, number) + meta:set_string("player_name", placer:get_player_name()) + + local inv = meta:get_inventory() + inv:set_size('src', 8) + inv:set_size('yellow', 6) + inv:set_size('green', 6) + inv:set_size('red', 6) + inv:set_size('blue', 6) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + end, + + on_receive_fields = on_receive_fields, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("src") + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib_addons3:distributor_active", { + description = "HighPerf Distributor", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_addons3_distributor_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_addons3_chest_bottom.png', + 'tubelib_distributor_yellow.png^tubelib_addons3_node_frame.png', + 'tubelib_distributor_green.png^tubelib_addons3_node_frame.png', + "tubelib_distributor_red.png^tubelib_addons3_node_frame.png", + "tubelib_distributor_blue.png^tubelib_addons3_node_frame.png", + }, + + on_receive_fields = on_receive_fields, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons3:distributor_defect", { + description = "HighPerf Distributor", + tiles = { + -- up, down, right, left, back, front + 'tubelib_distributor.png^tubelib_addons3_node_frame.png', + 'tubelib_addons3_chest_bottom.png', + 'tubelib_distributor_yellow.png^tubelib_addons3_node_frame.png^tubelib_defect.png', + 'tubelib_distributor_green.png^tubelib_addons3_node_frame.png^tubelib_defect.png', + "tubelib_distributor_red.png^tubelib_addons3_node_frame.png^tubelib_defect.png", + "tubelib_distributor_blue.png^tubelib_addons3_node_frame.png^tubelib_defect.png", + }, + + after_place_node = function(pos, placer) + local meta = M(pos) + local number = tubelib.add_node(pos, "tubelib_addons3:distributor") + local filter = {false,false,false,false} + meta:set_string("filter", minetest.serialize(filter)) + State:node_init(pos, number) + meta:set_string("player_name", placer:get_player_name()) + + local inv = meta:get_inventory() + inv:set_size('src', 8) + inv:set_size('yellow', 6) + inv:set_size('green', 6) + inv:set_size('red', 6) + inv:set_size('blue', 6) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + State:defect(pos, meta) + end, + + on_receive_fields = on_receive_fields, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = M(pos):get_inventory() + return inv:is_empty("src") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons3:distributor", + recipe = { + {"default:tin_ingot", "tubelib:distributor", ""}, + {"tubelib:distributor", "default:gold_ingot", ""}, + {"", "", ""}, + }, +}) + + +tubelib.register_node("tubelib_addons3:distributor", + {"tubelib_addons3:distributor_active", "tubelib_addons3:distributor_defect"}, { + on_pull_item = function(pos, side) + return tubelib.get_item(M(pos), "src") + end, + on_push_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_unpull_item = function(pos, side, item) + return tubelib.put_item(M(pos), "src", item) + end, + on_recv_message = function(pos, topic, payload) + if topic == "filter" then + return change_filter_settings(pos, payload.slot, payload.val) + elseif topic == "counter" then + local meta = minetest.get_meta(pos) + return minetest.deserialize(meta:get_string("item_counter")) or + {red=0, green=0, blue=0, yellow=0} + elseif topic == "clear_counter" then + local meta = minetest.get_meta(pos) + meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0})) + else + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end + end, + + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) diff --git a/mods/techpack/tubelib_addons3/funnel.lua b/mods/techpack/tubelib_addons3/funnel.lua new file mode 100644 index 00000000..c149413a --- /dev/null +++ b/mods/techpack/tubelib_addons3/funnel.lua @@ -0,0 +1,168 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2019 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + funnel.lua + + A high performance funnel + +]]-- + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + minetest.log("action", player:get_player_name().." moves "..stack:get_name().. + " to HighPerf funnel at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + minetest.log("action", player:get_player_name().." takes "..stack:get_name().. + " from HighPerf funnel at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function formspec() + return "size[9,7]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;main;0.5,0;8,2;]".. + "list[current_player;main;0.5,3.3;8,4;]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +local function scan_for_objects(pos, elapsed) + local meta = minetest.get_meta(pos) + for _, object in pairs(minetest.get_objects_inside_radius(pos, 1)) do + local lua_entity = object:get_luaentity() + if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then + local obj_pos = object:getpos() + if lua_entity.itemstring ~= "" and ((obj_pos.y - pos.y) >= 0.4) then + if tubelib.put_item(meta, "main", lua_entity.itemstring) then + lua_entity.itemstring = "" + object:remove() + end + end + + end + end + return true +end + +minetest.register_node("tubelib_addons3:funnel", { + description = "HighPerf Funnel", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons1_funnel_top.png^tubelib_addons3_node_frame4.png', + 'tubelib_addons1_funnel_top.png^tubelib_addons3_node_frame4.png', + 'tubelib_addons1_funnel.png^tubelib_addons3_node_frame4.png', + }, + + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, 8/16, -6/16}, + {-8/16, -8/16, 6/16, 8/16, 8/16, 8/16}, + {-8/16, -8/16, -8/16, -6/16, 8/16, 8/16}, + { 6/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + {-6/16, -8/16, -6/16, 6/16, 4/16, 6/16}, + }, + }, + selection_box = { + type = "fixed", + fixed = {-8/16, -8/16, -8/16, 8/16, 8/16, 8/16}, + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 16) + end, + + after_place_node = function(pos, placer) + tubelib.add_node(pos, "tubelib_addons3:funnel") + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec()) + minetest.get_node_timer(pos):start(1) + end, + + on_timer = scan_for_objects, + on_rotate = screwdriver.disallow, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons3:funnel", + recipe = { + {"default:tin_ingot", "tubelib_addons1:funnel", ""}, + {"tubelib_addons1:funnel", "default:gold_ingot", ""}, + {"", "", ""}, + }, +}) + + +tubelib.register_node("tubelib_addons3:funnel", {}, { + on_pull_stack = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_stack(meta, "main") + end, + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + return tubelib.get_item(meta, "main") + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + + on_recv_message = function(pos, topic, payload) + if topic == "state" then + local meta = minetest.get_meta(pos) + return tubelib.get_inv_state(meta, "main") + else + return "unsupported" + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(1) + end, + +}) + + diff --git a/mods/techpack/tubelib_addons3/init.lua b/mods/techpack/tubelib_addons3/init.lua new file mode 100644 index 00000000..a6d584a1 --- /dev/null +++ b/mods/techpack/tubelib_addons3/init.lua @@ -0,0 +1,18 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + +]]-- + +dofile(minetest.get_modpath("tubelib_addons3") .. '/chest.lua') +dofile(minetest.get_modpath("tubelib_addons3") .. '/pusher.lua') +dofile(minetest.get_modpath("tubelib_addons3") .. '/distributor.lua') +dofile(minetest.get_modpath("tubelib_addons3") .. '/pushing_chest.lua') +dofile(minetest.get_modpath("tubelib_addons3") .. '/teleporter.lua') +dofile(minetest.get_modpath("tubelib_addons3") .. '/funnel.lua') diff --git a/mods/techpack/tubelib_addons3/mod.conf b/mods/techpack/tubelib_addons3/mod.conf new file mode 100644 index 00000000..cd725362 --- /dev/null +++ b/mods/techpack/tubelib_addons3/mod.conf @@ -0,0 +1,3 @@ +name=tubelib_addons3 +description=Tubelib Extension with High Performance nodes +depends=tubelib,tubelib_addons1,default diff --git a/mods/techpack/tubelib_addons3/pusher.lua b/mods/techpack/tubelib_addons3/pusher.lua new file mode 100644 index 00000000..1207377d --- /dev/null +++ b/mods/techpack/tubelib_addons3/pusher.lua @@ -0,0 +1,232 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + pusher.lua + + A high performance pusher + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +local STANDBY_TICKS = 5 +local COUNTDOWN_TICKS = 5 +local CYCLE_TIME = 2 + +local State = tubelib.NodeStates:new({ + node_name_passive = "tubelib_addons3:pusher", + node_name_active = "tubelib_addons3:pusher_active", + node_name_defect = "tubelib_addons3:pusher_defect", + infotext_name = "HighPerf Pusher", + cycle_time = CYCLE_TIME, + standby_ticks = STANDBY_TICKS, + has_item_meter = true, + aging_factor = 50, +}) + +local function pushing(pos, meta) + local player_name = meta:get_string("player_name") + local items = tubelib.pull_stack(pos, "L", player_name) + if items ~= nil then + if tubelib.push_items(pos, "R", items, player_name) == false then + -- place item back + tubelib.unpull_items(pos, "L", items, player_name) + State:blocked(pos, meta) + return + end + State:keep_running(pos, meta, COUNTDOWN_TICKS, 1) + return + end + State:idle(pos, meta) +end + +local function keep_running(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = M(pos) + pushing(pos, meta) + return State:is_active(meta) + end + return false +end + +minetest.register_node("tubelib_addons3:pusher", { + description = "HighPerf Pusher", + tiles = { + -- up, down, right, left, back, front + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_outp.png^tubelib_addons3_node_frame4.png', + 'tubelib_inp.png^tubelib_addons3_node_frame4.png', + "tubelib_pusher1.png^[transformR180]^tubelib_addons3_node_frame4.png^[transformR180]", + "tubelib_pusher1.png^tubelib_addons3_node_frame4.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + local number = tubelib.add_node(pos, "tubelib_addons3:pusher") + State:node_init(pos, number) + end, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + State:start(pos, M(pos)) + end + end, + + on_dig = function(pos, node, player) + State:on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_node("tubelib_addons3:pusher_active", { + description = "HighPerf Pusher", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_outp.png^tubelib_addons3_node_frame4.png', + 'tubelib_inp.png^tubelib_addons3_node_frame4.png', + { + image = "tubelib_addons3_pusher_active.png^[transformR180]", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + }, + + on_rightclick = function(pos, node, clicker) + if not minetest.is_protected(pos, clicker:get_player_name()) then + State:stop(pos, M(pos)) + end + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {crumbly=0, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons3:pusher_defect", { + description = "HighPerf Pusher", + tiles = { + -- up, down, right, left, back, front + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_outp.png^tubelib_addons3_node_frame4.png^tubelib_defect.png', + 'tubelib_inp.png^tubelib_addons3_node_frame4.png^tubelib_defect.png', + "tubelib_pusher1.png^[transformR180]^tubelib_addons3_node_frame4.png^[transformR180]^tubelib_defect.png", + "tubelib_pusher1.png^tubelib_addons3_node_frame4.png^tubelib_defect.png", + }, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("player_name", placer:get_player_name()) + local number = tubelib.add_node(pos, "tubelib_addons3:pusher") + State:node_init(pos, number) + State:defect(pos, meta) + end, + + after_dig_node = function(pos) + tubelib.remove_node(pos) + end, + + on_timer = keep_running, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons3:pusher", + recipe = { + {"default:tin_ingot", "tubelib:pusher", ""}, + {"tubelib:pusher", "default:gold_ingot", ""}, + {"", "", ""}, + }, +}) + +tubelib.register_node("tubelib_addons3:pusher", + {"tubelib_addons3:pusher_active", "tubelib_addons3:pusher_defect"}, { + is_pusher = true, -- is a pulling/pushing node + + on_recv_message = function(pos, topic, payload) + local resp = State:on_receive_message(pos, topic, payload) + if resp then + return resp + else + return "unsupported" + end + end, + on_node_load = function(pos) + State:on_node_load(pos) + end, + on_node_repair = function(pos) + return State:on_node_repair(pos) + end, +}) diff --git a/mods/techpack/tubelib_addons3/pushing_chest.lua b/mods/techpack/tubelib_addons3/pushing_chest.lua new file mode 100644 index 00000000..1ab6b0a9 --- /dev/null +++ b/mods/techpack/tubelib_addons3/pushing_chest.lua @@ -0,0 +1,377 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + pushing_chest.lua + + A high performance pushing chest + +]]-- + +-- tubelib aging feature +local AGING_LEVEL1 = 50 * tubelib.machine_aging_value +local AGING_LEVEL2 = 150 * tubelib.machine_aging_value + +local Cache = {} + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + Cache[minetest.get_meta(pos):get_string("number")] = nil + minetest.log("action", player:get_player_name().." moves "..stack:get_name().. + " to chest at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + Cache[minetest.get_meta(pos):get_string("number")] = nil + minetest.log("action", player:get_player_name().." takes "..stack:get_name().. + " from chest at "..minetest.pos_to_string(pos)) + return stack:get_count() +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + Cache[minetest.get_meta(pos):get_string("number")] = nil + return count +end + +local function keep_the_rest(meta, list, taken) + if taken then + local inv = meta:get_inventory() + local rest = ItemStack(taken:get_name()) + if not inv:contains_item(list, rest) then + inv:add_item(list, rest) + if taken:get_count() > 1 then + taken:set_count(taken:get_count() - 1) + return taken + end + else + return taken + end + end +end + +local function aging(pos, meta) + local cnt = meta:get_int("tubelib_aging") + 1 + meta:set_int("tubelib_aging", cnt) + if cnt > AGING_LEVEL1 and math.random(AGING_LEVEL2) == 1 then + minetest.get_node_timer(pos):stop() + local node = minetest.get_node(pos) + node.name = "tubelib_addons3:pushing_chest_defect" + minetest.swap_node(pos, node) + end +end + + +local function set_state(meta, state) + local number = meta:get_string("number") + meta:set_string("infotext", "HighPerf Pushing Chest "..number..": "..state) + meta:set_string("state", state) +end + +local function configured(pos, item) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local number = meta:get_string("number") + if not Cache[number] then + Cache[number] = {} + for _,items in ipairs(inv:get_list("main")) do + Cache[number][items:get_name()] = true + end + end + return Cache[number][item:get_name()] == true +end + +local function shift_items(pos, elapsed) + if tubelib.data_not_corrupted(pos) then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("shift") then + local number = meta:get_string("number") + local player_name = meta:get_string("player_name") + local offs = meta:get_int("offs") + meta:set_int("offs", offs + 1) + for i = 0,7 do + local idx = ((i + offs) % 8) + 1 + local stack = inv:get_stack("shift", idx) + if stack:get_count() > 0 then + if tubelib.push_items(pos, "R", stack, player_name) then + -- The effort is needed here for the case the + -- pusher pushes into its own chest. + local num = stack:get_count() + stack = inv:get_stack("shift", idx) + stack:take_item(num) + inv:set_stack("shift", idx, stack) + aging(pos, meta) + return true + else + set_state(meta, "blocked") + end + end + end + end + return true + end + return false +end + +local function formspec() + return "size[9,9.2]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;shift;0.5,0;8,1;]".. + "list[context;main;0.5,1.2;8,4;]".. + "image[0.5,0;1,1;tubelib_gui_arrow.png]".. + "image[7.5,0;1,1;tubelib_gui_arrow.png]".. + "list[current_player;main;0.5,5.5;8,4;]".. + "image[0.5,1.2;1,1;tubelib_gui_arrow.png^[transformR270]".. + "listring[context;main]".. + "listring[current_player;main]" +end + +-- necessary function for a quick bugfix, doubles some code from local function "aging" +local function defect(pos, meta) + minetest.get_node_timer(pos):stop() + local node = minetest.get_node(pos) + node.name = "tubelib_addons3:pushing_chest_defect" + minetest.swap_node(pos, node) + return true +end + +-- code duplication of method "NodeStates:on_dig_node" (node_states.lua) +-- (in contrast to (all?) other tubelib nodes that can go defect class "NodeStates" isn't applied here) +function on_dig_node(pos, node, player) + local meta = minetest.get_meta(pos) + local cnt = tonumber(meta:get_string("tubelib_aging")) + if (not cnt or cnt < 1) then + cnt = 1 + end + + local is_defect = (cnt > AGING_LEVEL1) and ( math.random(math.max(1, math.floor(AGING_LEVEL2 / cnt))) == 1 ) + + if is_defect then + defect(pos, meta) -- replace node with defect one + node = minetest.get_node(pos) + end + + + minetest.node_dig(pos, node, player) -- default behaviour (this function is called automatically if on_dig() callback isn't set) + +end + + +minetest.register_node("tubelib_addons3:pushing_chest", { + description = "HighPerf Pushing Chest", + tiles = { + -- up, down, right, left, back, front + { + image = "tubelib_addons3_pusher_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 32, + length = 2.0, + }, + }, + 'tubelib_addons3_chest_bottom.png', + "tubelib_addons3_chest_out.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_side.png", + "tubelib_addons3_chest_front.png", + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 32) + inv:set_size('shift', 8) + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib_addons3:pushing_chest") + meta:set_string("player_name", placer:get_player_name()) + meta:set_string("number", number) + meta:set_string("formspec", formspec()) + set_state(meta, "empty") + minetest.get_node_timer(pos):start(2) + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") and inv:is_empty("shift") + end, + + + + on_dig = function(pos, node, player) + on_dig_node(pos, node, player) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_timer = shift_items, + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("tubelib_addons3:pushing_chest_defect", { + description = "HighPerf Pushing Chest", + tiles = { + -- up, down, right, left, back, front + 'tubelib_pusher1.png^tubelib_addons3_node_frame4.png', + 'tubelib_addons3_chest_bottom.png', + "tubelib_addons3_chest_out.png^tubelib_defect.png", + "tubelib_addons3_chest_side.png^tubelib_defect.png", + "tubelib_addons3_chest_side.png^tubelib_defect.png", + "tubelib_addons3_chest_front.png^tubelib_defect.png", + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('main', 32) + inv:set_size('shift', 8) + end, + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local number = tubelib.add_node(pos, "tubelib_addons3:pushing_chest") + meta:set_string("player_name", placer:get_player_name()) + meta:set_string("number", number) + meta:set_string("formspec", formspec()) + set_state(meta, "empty") + end, + + can_dig = function(pos, player) + if minetest.is_protected(pos, player:get_player_name()) then + return false + end + local inv = minetest.get_meta(pos):get_inventory() + return inv:is_empty("main") and inv:is_empty("shift") + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + tubelib.remove_node(pos) + end, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, + + on_rotate = screwdriver.disallow, + + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons3:pushing_chest", + recipe = { + {"default:tin_ingot", "tubelib_addons3:pusher", ""}, + {"tubelib_addons1:chest", "default:gold_ingot", ""}, + {"", "", ""}, + }, +}) + +tubelib.register_node("tubelib_addons3:pushing_chest", + {"tubelib_addons3:pushing_chest_defect"}, { + on_recv_message = function(pos, topic, payload) + local node = minetest.get_node(pos) + if topic == "state" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:is_empty("main") then + return "empty" + end + return meta:get_string("state") + elseif topic == "aging" then + return minetest.get_meta(pos):get_int("tubelib_aging") + else + return "not supported" + end + end, + on_pull_stack = function(pos, side) + local meta = minetest.get_meta(pos) + local taken = tubelib.get_stack(meta, "main") + return keep_the_rest(meta, "main", taken) + end, + on_pull_item = function(pos, side) + local meta = minetest.get_meta(pos) + local items = tubelib.get_num_items(meta, "main", 2) + if items then + -- return only one + items:set_count(1) + -- don't remove the potentally last item (recipe) + tubelib.put_item(meta, "main", items) + return items + end + end, + on_push_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + if configured(pos, item) then + if tubelib.put_item(meta, "main", item) then + set_state(meta, "loaded") + return true + else + set_state(meta, "full") + return tubelib.put_item(meta, "shift", item) + end + else + return tubelib.put_item(meta, "shift", item) + end + end, + on_unpull_item = function(pos, side, item) + local meta = minetest.get_meta(pos) + return tubelib.put_item(meta, "main", item) + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(2) + end, + on_node_repair = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("tubelib_aging", 0) + meta:set_int("idx", 2) + + meta:set_string("formspec", formspec()) + set_state(meta, "empty") + local node = minetest.get_node(pos) + node.name = "tubelib_addons3:pushing_chest" + minetest.swap_node(pos, node) + minetest.get_node_timer(pos):start(2) + return true + end, +}) diff --git a/mods/techpack/tubelib_addons3/teleporter.lua b/mods/techpack/tubelib_addons3/teleporter.lua new file mode 100644 index 00000000..09aeaa54 --- /dev/null +++ b/mods/techpack/tubelib_addons3/teleporter.lua @@ -0,0 +1,74 @@ +--[[ + + Tubelib Addons 3 + ================ + + Copyright (C) 2017-2018 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + teleporter.lua + + A node, moving items to the peer teleporter node. + +]]-- + +local Tube = tubelib.Tube + +local sFormspec = "size[7.5,3]".. + "field[0.5,1;7,1;channel;Enter channel string;]" .. + "button_exit[2,2;3,1;exit;Save]" + +minetest.register_node("tubelib_addons3:teleporter", { + description = "Tubelib Teleporter", + tiles = { + -- up, down, right, left, back, front + 'tubelib_addons3_chest_bottom.png', + 'tubelib_addons3_chest_bottom.png', + 'tubelib_addons3_chest_bottom.png^tubelib_hole.png', + 'tubelib_addons3_chest_bottom.png^tubelib_addons3_teleporter.png', + 'tubelib_addons3_chest_bottom.png^tubelib_addons3_teleporter.png', + 'tubelib_addons3_chest_bottom.png^tubelib_addons3_teleporter.png', + }, + + after_place_node = function(pos, placer) + tubelib.add_node(pos, "tubelib_addons3:teleporter") + -- determine the tube side + local tube_dir = ((minetest.dir_to_facedir(placer:get_look_dir()) + 1) % 4) + 1 + Tube:prepare_pairing(pos, tube_dir, sFormspec) + Tube:after_place_node(pos, {tube_dir}) + end, + + on_receive_fields = function(pos, formname, fields, player) + if fields.channel ~= nil then + Tube:pairing(pos, fields.channel) + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:stop_pairing(pos, oldmetadata, sFormspec) + local tube_dir = tonumber(oldmetadata.fields.tube_dir or 0) + Tube:after_dig_node(pos, {tube_dir}) + end, + + on_rotate = screwdriver.disallow, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + + +minetest.register_craft({ + output = "tubelib_addons3:teleporter 2", + recipe = { + {"default:gold_ingot", "group:wood", ""}, + {"default:mese_crystal", "default:mese_crystal", "tubelib:tubeS"}, + {"default:gold_ingot", "group:wood", ""}, + }, +}) + +Tube:add_secondary_node_names({"tubelib_addons3:teleporter"}) \ No newline at end of file diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_bottom.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_bottom.png new file mode 100644 index 00000000..4369e368 Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_bottom.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_front.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_front.png new file mode 100644 index 00000000..782d5ef1 Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_front.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_out.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_out.png new file mode 100644 index 00000000..e9077ba1 Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_out.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_side.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_side.png new file mode 100644 index 00000000..4ff4d6f0 Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_chest_side.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_distributor_active.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_distributor_active.png new file mode 100644 index 00000000..9c22a464 Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_distributor_active.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_node_frame.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_node_frame.png new file mode 100644 index 00000000..1e1312e0 Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_node_frame.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_node_frame4.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_node_frame4.png new file mode 100644 index 00000000..70d586a8 Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_node_frame4.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_pusher_active.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_pusher_active.png new file mode 100644 index 00000000..b6342a7c Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_pusher_active.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_stack_chest_front.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_stack_chest_front.png new file mode 100644 index 00000000..0a943d3f Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_stack_chest_front.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_stack_chest_side.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_stack_chest_side.png new file mode 100644 index 00000000..0ad2fc7e Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_stack_chest_side.png differ diff --git a/mods/techpack/tubelib_addons3/textures/tubelib_addons3_teleporter.png b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_teleporter.png new file mode 100644 index 00000000..32901d1a Binary files /dev/null and b/mods/techpack/tubelib_addons3/textures/tubelib_addons3_teleporter.png differ diff --git a/mods/tubelib2/COPYING.txt b/mods/tubelib2/COPYING.txt new file mode 100644 index 00000000..988f481c --- /dev/null +++ b/mods/tubelib2/COPYING.txt @@ -0,0 +1,28 @@ +The tubelib2 mod for Minetest is + +Copyright (C) 2017-2018 Joachim Stolberg + +License of source code +---------------------- + +This mod is free software; you can redistribute and/or +modify it under the terms of the GNU Lesser General Public License version 2.1 or later +published by the Free Software Foundation. + +This mod 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this mod; if not, write to the +Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +Boston, MA 02110-1301, USA. + + +License of media (textures, sounds and documentation) +----------------------------------------------------- + +All textures, sounds and documentation files are licensed under the +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/tubelib2/LICENSE.txt b/mods/tubelib2/LICENSE.txt new file mode 100644 index 00000000..4362b491 --- /dev/null +++ b/mods/tubelib2/LICENSE.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/tubelib2/README.md b/mods/tubelib2/README.md new file mode 100644 index 00000000..90bd7858 --- /dev/null +++ b/mods/tubelib2/README.md @@ -0,0 +1,85 @@ +# Tube Library 2 [tubelib2] + +A library for mods which need connecting tubes / pipes / cables or similar. + +![tubelib2](https://github.com/joe7575/tubelib2/blob/master/screenshot.png) + + +This mod is not useful for its own. It does not even have any nodes. +It only comes with a few test nodes to play around with the tubing algorithm. + +Browse on: ![GitHub](https://github.com/joe7575/tubelib2) + +Download: ![GitHub](https://github.com/joe7575/tubelib2/archive/master.zip) + + +## Description + +Tubelib2 distinguished two kinds of nodes: +- primary nodes are tube like nodes (pipes, cables, ...) +- secondary nodes are all kind of nodes, which can be connected by means of primary nodes + +Tubelib2 specific 6D directions (1 = North, 2 = East, 3 = South, 4 = West, 5 = Down, 6 = Up) + +All 6D dirs are the view from the node to the outer side +Tubes are based on two node types, "angled" and "straight" tubes. + + + +-------+ + / /| +-------+ + / / | / /| + / / + / / | + / / / +-------+ | + +-------+ / | | | + | | / | |/ | + | |/ +-------+| + + +-------+ | |/ + +------+ + + +All other nodes are build by means of axis/rotation variants based on param2 + (paramtype2 == "facedir"). + +The 3 free MSB bits of param2 of tube nodes are used to store the number of connections (0..2). + +The data of the peer head tube are stored in memory 'self.connCache' + +Tubelib2 provides an update mechanism for connected "secondary" nodes. A callback function +func(node, pos, out_dir, peer_pos, peer_in_dir) will be called for every change on the connected tubes. + + + +## Dependencies +default +optional: intllib + + +# License +Copyright (C) 2017-2020 Joachim Stolberg +Code: Licensed under the GNU LGPL version 2.1 or later. + See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt +Textures: CC0 + + +## History +- 2018-10-20 v0.1 * Tested against hyperloop elevator. +- 2018-10-27 v0.2 * Tested against and enhanced for the hyperloop mod. +- 2018-10-27 v0.3 * Further improvements. +- 2018-11-09 v0.4 * on_update function for secondary nodes introduced +- 2018-12-16 v0.5 * meta data removed, memory cache added instead of +- 2018-12-20 v0.6 * intllib support added, max tube length bugfix +- 2019-01-06 v0.7 * API function replace_tube_line added, bug fixed +- 2019-01-11 v0.8 * dir_to_facedir bugfix +- 2019-02-09 v0.9 * storage.lua added, code partly restructured +- 2019-02-17 v1.0 * released +- 2019-03-02 v1.1 * API function 'switch_tube_line' added, secondary node placement bugfix +- 2019-04-18 v1.2 * 'force_to_use_tubes' added +- 2019-05-01 v1.3 * API function 'compatible_node' added +- 2019-05-09 v1.4 * Attribute 'tube_type' added +- 2019-07-12 v1.5 * internal handling of secondary nodes changed +- 2019-10-25 v1.6 * callback 'tubelib2_on_update2' added +- 2020-01-03 v1.7 * max_tube_length bugfix +- 2020-02-02 v1.8 * 'special nodes' as alternative to 'secondary nodes' introduced +- 2020-05-31 v1.9 * Generator function 'get_tube_line' added, storage improvements + + diff --git a/mods/tubelib2/depends.txt b/mods/tubelib2/depends.txt new file mode 100644 index 00000000..9207dab8 --- /dev/null +++ b/mods/tubelib2/depends.txt @@ -0,0 +1,2 @@ +default +intllib? diff --git a/mods/tubelib2/description.txt b/mods/tubelib2/description.txt new file mode 100644 index 00000000..ad312040 --- /dev/null +++ b/mods/tubelib2/description.txt @@ -0,0 +1,2 @@ +A library for mods which need connecting tubes / pipes / cables or similar. + diff --git a/mods/tubelib2/design.txt b/mods/tubelib2/design.txt new file mode 100644 index 00000000..be9dd1b4 --- /dev/null +++ b/mods/tubelib2/design.txt @@ -0,0 +1,70 @@ +View to the north + + + dir1/dir2: axis dir: + 6 + A 1 + | / 0 + +--|-----+ A 1 + / o /| | / + +--------+ | |/ + 4 <----| |o----> 2 4 <-------+-------> 3 + | o | | /| + | / | + / | + | / |/ 2 V + +-/------+ 5 + / | + 3 | + V + 5 + + + +-------+ + / /| +-------+ + / / | / /| + / / + / / | + / / / +-------+ | + +-------+ / | | | + | | / | |/ | + | |/ +-------+| + + +-------+ | |/ + +------+ + + + +------+ + | | + +------+ +---+------+---+ +------+ + |XXXXXX| | | | | | | + |XXXXXX| | | | | | | + +------+ +---+------+---+ +------+ + | | + +------+ +dir1/dir2 1/3 2/4 5/6 +axis/rot 3/0 5/1 1/0 + + +------+ +---+------+ +------+ +------+---+ + |XXXXXX| | | | | | | | | + |XXXXXX| | | | | | | | | + +------+ +---+------+ +------+ +------+---+ + | | | | | | | | + +------+ +------+ +------+ +------+ +dir1/dir2 3/5 4/5 1/5 2/5 +axis/rot 0/0 3/3 2/0 0/3 + + +------+ +------+ +------+ +------+ + | | | | | | | | + +------+ +---+------+ +------+ +------+---+ + |XXXXXX| | | | | | | | | + |XXXXXX| | | | | | | | | + +------+ +---+------+ +------+ +------+---+ +axis/rot 3/6 4/6 1/6 2/6 +dir1/dir2 5/0 3/1 2/2 4/3 + + +------+---+ +---+------+ +------+---+ +---+------+ + | | | | | | |XXXXXX| | | |XXXXXX| + | | | | | | |XXXXXX| | | |XXXXXX| + +------+---+ +---+------+ +------+---+ +---+------+ +dir1/dir2 1/2 1/4 2/3 3/4 +axis/rot 2/3 3/2 1/3 1/1 + + diff --git a/mods/tubelib2/init.lua b/mods/tubelib2/init.lua new file mode 100644 index 00000000..88d44203 --- /dev/null +++ b/mods/tubelib2/init.lua @@ -0,0 +1,12 @@ +tubelib2 = {} + +local MP = minetest.get_modpath("tubelib2") + +-- Load support for intllib. +dofile(MP .. "/intllib.lua") +dofile(MP .. "/internal2.lua") +dofile(MP .. "/internal1.lua") +dofile(MP .. "/tube_api.lua") +dofile(MP .. "/storage.lua") +-- Only for testing/demo purposes +--dofile(MP .. "/tube_test.lua") diff --git a/mods/tubelib2/internal1.lua b/mods/tubelib2/internal1.lua new file mode 100644 index 00000000..43e5e78e --- /dev/null +++ b/mods/tubelib2/internal1.lua @@ -0,0 +1,244 @@ +--[[ + + Tube Library 2 + ============== + + Copyright (C) 2018-2020 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + internal1.lua + + First level functions behind the API + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +-- Load support for intllib. +local MP = minetest.get_modpath("tubelib2") +local I,_ = dofile(MP.."/intllib.lua") + +local Tube = tubelib2.Tube +local Turn180Deg = tubelib2.Turn180Deg +local Dir6dToVector = tubelib2.Dir6dToVector +local tValidNum = {[0] = true, true, true} -- 0..2 are valid + +local function get_pos(pos, dir) + return vector.add(pos, Dir6dToVector[dir or 0]) +end + +local function fdir(self, player) + local pitch = player:get_look_pitch() + if pitch > 1.0 and self.valid_dirs[6] then -- up? + return 6 + elseif pitch < -1.0 and self.valid_dirs[5] then -- down? + return 5 + elseif not self.valid_dirs[1] then + return 6 + else + return minetest.dir_to_facedir(player:get_look_dir()) + 1 + end +end + +local function get_player_data(self, placer, pointed_thing) + if placer and pointed_thing and pointed_thing.type == "node" then + if placer:get_player_control().sneak then + return pointed_thing.under, fdir(self, placer) + else + return nil, fdir(self, placer) + end + end +end + + +-- Used to determine the node side to the tube connection. +-- Function returns the first found dir value +-- to a primary node. +-- Only used by convert.set_pairing() +function Tube:get_primary_dir(pos) + -- Check all valid positions + for dir = 1,6 do + if self:is_primary_node(pos, dir) then + return dir + end + end +end + +-- pos/dir are the pos of the stable secondary node pointing to the head tube node. +function Tube:del_from_cache(pos, dir) + local key = S(pos) + if self.connCache[key] and self.connCache[key][dir] then + local pos2 = self.connCache[key][dir].pos2 + local dir2 = self.connCache[key][dir].dir2 + local key2 = S(pos2) + if self.connCache[key2] and self.connCache[key2][dir2] then + self.connCache[key2][dir2] = nil + end + self.connCache[key][dir] = nil + end +end + +-- pos/dir are the pos of the secondary nodes pointing to the head tube nodes. +function Tube:add_to_cache(pos1, dir1, pos2, dir2) + local key = S(pos1) + if not self.connCache[key] then + self.connCache[key] = {} + end + self.connCache[key][dir1] = {pos2 = pos2, dir2 = dir2} +end + +-- pos/dir are the pos of the secondary nodes pointing to the head tube nodes. +function Tube:update_secondary_node(pos1, dir1, pos2, dir2) + local node,_ = self:get_secondary_node(pos1) + if node then + local ndef = minetest.registered_nodes[node.name] or {} + if ndef.tubelib2_on_update2 then + ndef.tubelib2_on_update2(pos1, dir1, self, node) + elseif ndef.tubelib2_on_update then + ndef.tubelib2_on_update(node, pos1, dir1, pos2, Turn180Deg[dir2]) + elseif self.clbk_update_secondary_node then + self.clbk_update_secondary_node(node, pos1, dir1, pos2, Turn180Deg[dir2]) + end + end +end + +function Tube:infotext(pos1, pos2) + if self.show_infotext then + if pos1 and pos2 then + if vector.equals(pos1, pos2) then + M(pos1):set_string("infotext", I("Not connected!")) + else + M(pos1):set_string("infotext", I("Connected with ")..S(pos2)) + end + end + end +end + +-------------------------------------------------------------------------------------- +-- pairing functions +-------------------------------------------------------------------------------------- + +-- Pairing helper function +function Tube:store_teleport_data(pos, peer_pos) + local meta = M(pos) + meta:set_string("tele_pos", S(peer_pos)) + meta:set_string("channel", nil) + meta:set_string("formspec", nil) + meta:set_string("infotext", I("Paired with ")..S(peer_pos)) + return meta:get_int("tube_dir") +end + +------------------------------------------------------------------------------- +-- update-after/get-dir functions +------------------------------------------------------------------------------- + +function Tube:update_after_place_node(pos, dirs) + -- Check all valid positions + local lRes= {} + dirs = dirs or self.dirs_to_check + for _,dir in ipairs(dirs) do + local npos, d1, d2, num = self:add_tube_dir(pos, dir) + if npos and self.valid_dirs[d1] and self.valid_dirs[d2] and num < 2 then + self.clbk_after_place_tube(self:get_tube_data(npos, d1, d2, num+1)) + lRes[#lRes+1] = dir + end + end + return lRes +end + +function Tube:update_after_dig_node(pos, dirs) + -- Check all valid positions + local lRes= {} + dirs = dirs or self.dirs_to_check + for _,dir in ipairs(dirs) do + local npos, d1, d2, num = self:del_tube_dir(pos, dir) + if npos and self.valid_dirs[d1] and self.valid_dirs[d2] and tValidNum[num] then + self.clbk_after_place_tube(self:get_tube_data(npos, d1, d2, num)) + lRes[#lRes+1] = dir + end + end + return lRes +end + +function Tube:update_after_place_tube(pos, placer, pointed_thing) + local preferred_pos, fdir = get_player_data(self, placer, pointed_thing) + local dir1, dir2, num_tubes = self:determine_tube_dirs(pos, preferred_pos, fdir) + if dir1 == nil then + return false + end + if self.valid_dirs[dir1] and self.valid_dirs[dir2] and tValidNum[num_tubes] then + self.clbk_after_place_tube(self:get_tube_data(pos, dir1, dir2, num_tubes)) + end + + if num_tubes >= 1 then + local npos, d1, d2, num = self:add_tube_dir(pos, dir1) + if npos and self.valid_dirs[d1] and self.valid_dirs[d2] and num < 2 then + self.clbk_after_place_tube(self:get_tube_data(npos, d1, d2, num+1)) + end + end + + if num_tubes >= 2 then + local npos, d1, d2, num = self:add_tube_dir(pos, dir2) + if npos and self.valid_dirs[d1] and self.valid_dirs[d2] and num < 2 then + self.clbk_after_place_tube(self:get_tube_data(npos, d1, d2, num+1)) + end + end + return true, dir1, dir2, num_tubes +end + +function Tube:update_after_dig_tube(pos, param2) + local dir1, dir2 = self:decode_param2(pos, param2) + + local npos, d1, d2, num = self:del_tube_dir(pos, dir1) + if npos and self.valid_dirs[d1] and self.valid_dirs[d2] and tValidNum[num] then + self.clbk_after_place_tube(self:get_tube_data(npos, d1, d2, num)) + else + dir1 = nil + end + + npos, d1, d2, num = self:del_tube_dir(pos, dir2) + if npos and self.valid_dirs[d1] and self.valid_dirs[d2] and tValidNum[num] then + self.clbk_after_place_tube(self:get_tube_data(npos, d1, d2, num)) + else + dir2 = nil + end + + return dir1, dir2 +end + +-- Used by chat commands, when tubes are placed e.g. via WorldEdit +function Tube:replace_nodes(pos1, pos2, dir1, dir2) + self.clbk_after_place_tube(self:get_tube_data(pos1, dir1, dir2, 1)) + local pos = get_pos(pos1, dir1) + while not vector.equals(pos, pos2) do + self.clbk_after_place_tube(self:get_tube_data(pos, dir1, dir2, 2)) + pos = get_pos(pos, dir1) + end + self.clbk_after_place_tube(self:get_tube_data(pos2, dir1, dir2, 1)) +end + +function Tube:switch_nodes(pos, dir, state) + pos = get_pos(pos, dir) + local old_dir = dir + while pos do + local param2 = self:get_primary_node_param2(pos) + if param2 then + local dir1, dir2, num_conn = self:decode_param2(pos, param2) + self.clbk_after_place_tube(self:get_tube_data(pos, dir1, dir2, num_conn, state)) + if dir1 == Turn180Deg[old_dir] then + pos = get_pos(pos, dir2) + old_dir = dir2 + else + pos = get_pos(pos, dir1) + old_dir = dir1 + end + else + break + end + end +end diff --git a/mods/tubelib2/internal2.lua b/mods/tubelib2/internal2.lua new file mode 100644 index 00000000..acee6846 --- /dev/null +++ b/mods/tubelib2/internal2.lua @@ -0,0 +1,421 @@ +--[[ + + Tube Library 2 + ============== + + Copyright (C) 2018-2020 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + internal.lua + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +-- Load support for intllib. +local MP = minetest.get_modpath("tubelib2") +local I,IS = dofile(MP.."/intllib.lua") + + +local Tube = {} + +local Turn180Deg = {[0]=0,3,4,1,2,6,5} + +-- To calculate param2 based on dir6d information +local DirToParam2 = { + -- dir1 / dir2 ==> param2 / type (Angled/Straight) + [12] = {11, "A"}, + [13] = {12, "S"}, + [14] = {14, "A"}, + [15] = { 8, "A"}, + [16] = {10, "A"}, + [23] = { 7, "A"}, + [24] = {21, "S"}, + [25] = { 3, "A"}, + [26] = {19, "A"}, + [34] = { 5, "A"}, + [35] = { 0, "A"}, + [36] = {20, "A"}, + [45] = {15, "A"}, + [46] = {13, "A"}, + [56] = { 4, "S"}, +} + +-- To retrieve dir6d values from the nodes param2 +local Param2ToDir = {} +for k,item in pairs(DirToParam2) do + Param2ToDir[item[1]] = k +end + +-- For neighbour position calculation +local Dir6dToVector = {[0] = + {x=0, y=0, z=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}, + {x=0, y=-1, z=0}, + {x=0, y=1, z=0}, +} + +tubelib2.Tube = Tube +tubelib2.Turn180Deg = Turn180Deg +tubelib2.DirToParam2 = DirToParam2 +tubelib2.Param2ToDir = Param2ToDir +tubelib2.Dir6dToVector = Dir6dToVector + + +-- +-- Tubelib2 Methods +-- + +function Tube:get_node_lvm(pos) + local node = minetest.get_node_or_nil(pos) + if node then + return node + end + local vm = minetest.get_voxel_manip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local param2_data = vm:get_param2_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local idx = area:index(pos.x, pos.y, pos.z) + node = { + name = minetest.get_name_from_content_id(data[idx]), + param2 = param2_data[idx] + } + return node +end + +-- Read param2 from a primary node at the given position. +-- If dir == nil then node_pos = pos +-- Function returns param2, new_pos or nil +function Tube:get_primary_node_param2(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + self.node = self:get_node_lvm(npos) + if self.primary_node_names[self.node.name] then + return self.node.param2, npos + end +end + +-- Check if node at given position is a tube node +-- If dir == nil then node_pos = pos +-- Function returns true/false +function Tube:is_primary_node(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + local node = self:get_node_lvm(npos) + return self.primary_node_names[node.name] +end + +-- Get secondary node at given position +-- If dir == nil then node_pos = pos +-- Function returns node and new_pos or nil +function Tube:get_secondary_node(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + local node = self:get_node_lvm(npos) + if self.secondary_node_names[node.name] then + return node, npos + end +end + +-- Get special registered nodes at given position +-- If dir == nil then node_pos = pos +-- Function returns node and new_pos or nil +function Tube:get_special_node(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + local node = self:get_node_lvm(npos) + if self.special_node_names[node.name] then + return node, npos + end +end + +-- Check if node at given position is a secondary node +-- If dir == nil then node_pos = pos +-- Function returns true/false +function Tube:is_secondary_node(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + local node = self:get_node_lvm(npos) + return self.secondary_node_names[node.name] +end + +-- Check if node at given position is a special node +-- If dir == nil then node_pos = pos +-- Function returns true/false +function Tube:is_special_node(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + local node = self:get_node_lvm(npos) + return self.special_node_names[node.name] +end + +-- Check if node has a connection on the given dir +function Tube:connected(pos, dir) + return self:is_primary_node(pos, dir) or self:is_secondary_node(pos, dir) +end + +function Tube:get_next_tube(pos, dir) + local param2, npos = self:get_primary_node_param2(pos, dir) + if param2 then + local val = Param2ToDir[param2 % 32] or 0 + local dir1, dir2 = math.floor(val / 10), val % 10 + local num_conn = math.floor(param2 / 32) or 0 + if Turn180Deg[dir] == dir1 then + return npos, dir2, num_conn + else + return npos, dir1, num_conn + end + end + return self:get_next_teleport_node(pos, dir) +end + +-- Return param2 and tube type ("A"/"S") +function Tube:encode_param2(dir1, dir2, num_conn) + if dir1 and dir2 and num_conn then + if dir1 > dir2 then + dir1, dir2 = dir2, dir1 + end + local param2, _type = unpack(DirToParam2[dir1 * 10 + dir2] or {0, "S"}) + return (num_conn * 32) + param2, _type + end + return 0, "S" +end + + +-- Return dir1, dir2, num_conn +function Tube:decode_param2(pos, param2) + local val = Param2ToDir[param2 % 32] + if val then + local dir1, dir2 = math.floor(val / 10), val % 10 + local num_conn = math.floor(param2 / 32) + return dir1, dir2, num_conn + end +end + +function Tube:repair_tube(pos, dir) + local param2, npos = self:get_primary_node_param2(pos, dir) + if param2 then + local dir1, dir2 = self:decode_param2(npos, param2) + local param2, tube_type = self:encode_param2(dir1, dir2, 2) + self.clbk_after_place_tube(npos, param2, tube_type, 2) + end +end + +-- Return node next to pos in direction 'dir' +function Tube:get_node(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + return npos, self:get_node_lvm(npos) +end + +-- format and return given data as table +function Tube:get_tube_data(pos, dir1, dir2, num_tubes, state) + local param2, tube_type = self:encode_param2(dir1, dir2, num_tubes) + return pos, param2, tube_type, num_tubes, state +end + +-- Return pos for a primary_node and true if num_conn < 2, else false +function Tube:friendly_primary_node(pos, dir) + local param2, npos = self:get_primary_node_param2(pos, dir) + if param2 then + local _,_,num_conn = self:decode_param2(npos, param2) + -- tube node with max one connection? + return npos, (num_conn or 2) < 2 + end +end + +function Tube:vector_to_dir(v) + if v.y > 0 then + return 6 + elseif v.y < 0 then + return 5 + else + return minetest.dir_to_facedir(v) + 1 + end +end + +-- Check all 6 possible positions for known nodes considering preferred_pos +-- and the players fdir and return dir1, dir2 and the number of tubes to connect to (0..2). +function Tube:determine_tube_dirs(pos, preferred_pos, fdir) + local tbl = {} + local allowed = table.copy(self.valid_dirs) + + -- If the node at players "prefered position" is a tube, + -- then the other side of the new tube shall point to the player. + if preferred_pos then + local _, friendly = self:friendly_primary_node(preferred_pos) + if friendly then + local v = vector.direction(pos, preferred_pos) + local dir1 = self:vector_to_dir(v) + local dir2 = Turn180Deg[fdir] + return dir1, dir2, 1 + end + end + -- Check for primary nodes (tubes) + for dir = 1,6 do + if allowed[dir] then + local npos, friendly = self:friendly_primary_node(pos, dir) + if npos then + if not friendly then + allowed[dir] = false + else + if preferred_pos and vector.equals(npos, preferred_pos) then + preferred_pos = nil + table.insert(tbl, 1, dir) + else + table.insert(tbl, dir) + end + end + end + end + end + + -- If no tube around the pointed pos and player prefers a position, + -- then the new tube shall point to the player. + if #tbl == 0 and preferred_pos and fdir and allowed[Turn180Deg[fdir]] then + tbl[1] = Turn180Deg[fdir] + -- Already 2 dirs found? + elseif #tbl >= 2 then + return tbl[1], tbl[2], 2 + end + + -- Check for secondary nodes (chests and so on) + for dir = 1,6 do + if allowed[dir] then + local _,npos = self:get_secondary_node(pos, dir) + if npos then + if preferred_pos and vector.equals(npos, preferred_pos) then + preferred_pos = nil + table.insert(tbl, 2, dir) + else + table.insert(tbl, dir) + end + end + end + end + + -- player pointed to an unknown node to force the tube orientation? + if preferred_pos and fdir then + if tbl[1] == Turn180Deg[fdir] and allowed[fdir] then + tbl[2] = fdir + elseif allowed[Turn180Deg[fdir]] then + tbl[2] = Turn180Deg[fdir] + end + end + + -- dir1, dir2 still unknown? + if fdir then + if #tbl == 0 and allowed[Turn180Deg[fdir]] then + tbl[1] = Turn180Deg[fdir] + end + if #tbl == 1 and allowed[Turn180Deg[tbl[1]]] then + tbl[2] = Turn180Deg[tbl[1]] + elseif #tbl == 1 and tbl[1] ~= Turn180Deg[fdir] and allowed[Turn180Deg[fdir]] then + tbl[2] = Turn180Deg[fdir] + end + end + + if #tbl >= 2 and tbl[1] ~= tbl[2] then + local num_tubes = (self:connected(pos, tbl[1]) and 1 or 0) + + (self:connected(pos, tbl[2]) and 1 or 0) + return tbl[1], tbl[2], math.min(2, num_tubes) + end +end + +-- Determine a tube side without connection, increment the number of connections +-- and return the new data to be able to update the node: +-- new_pos, dir1, dir2, num_connections (1, 2) +function Tube:add_tube_dir(pos, dir) + local param2, npos = self:get_primary_node_param2(pos, dir) + if param2 then + local d1, d2, num = self:decode_param2(npos, param2) + if not num then return end + -- not already connected to the new tube? + dir = Turn180Deg[dir] + if d1 ~= dir and dir ~= d2 then + if num == 0 then + d1 = dir + elseif num == 1 then + -- determine, which of d1, d2 has already a connection + if self:connected(npos, d1) then + d2 = dir + else + d1 = dir + end + end + end + return npos, d1, d2, num + end +end + +-- Decrement the number of tube connections +-- and return the new data to be able to update the node: +-- new_pos, dir1, dir2, num_connections (0, 1) +function Tube:del_tube_dir(pos, dir) + local param2, npos = self:get_primary_node_param2(pos, dir) + if param2 then + local d1, d2, num = self:decode_param2(npos, param2) + -- check if node is connected to the given pos + dir = Turn180Deg[dir] + if d1 == dir or dir == d2 then + return npos, d1, d2, math.max((num or 1) - 1, 0) + end + end +end + +-- Pairing helper function +function Tube:store_teleport_data(pos, peer_pos) + local meta = M(pos) + meta:set_string("tele_pos", S(peer_pos)) + meta:set_string("channel", nil) + meta:set_string("formspec", nil) + meta:set_string("infotext", I("Connected with ")..S(peer_pos)) + return meta:get_int("tube_dir") +end + +-- Jump over the teleport nodes to the next tube node +function Tube:get_next_teleport_node(pos, dir) + if pos then + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + local meta = M(npos) + local s = meta:get_string("tele_pos") + if s ~= "" then + local tele_pos = P(s) + local tube_dir = M(tele_pos):get_int("tube_dir") + if tube_dir ~= 0 then + return tele_pos, tube_dir + end + end + end +end + +function Tube:dbg_out() + for pos1,item1 in pairs(self.connCache) do + for dir1,item2 in pairs(item1) do + print("pos1="..pos1..", dir1="..dir1..", pos2="..S(item2.pos2)..", dir2="..item2.dir2) + end + end +end + +-- Walk to the end of the tube line and return pos and outdir of both head tube nodes. +-- If no tube is available, return nil +function Tube:walk_tube_line(pos, dir) + local cnt = 0 + if dir then + while cnt <= self.max_tube_length do + local new_pos, new_dir, num = self:get_next_tube(pos, dir) + if not new_pos then break end + if cnt > 0 and num ~= 2 and self:is_primary_node(new_pos, new_dir) then + self:repair_tube(new_pos, new_dir) + end + pos, dir = new_pos, new_dir + cnt = cnt + 1 + end + if cnt > 0 then + return pos, dir, cnt + end + end + return table.copy(pos), dir, 0 +end diff --git a/mods/tubelib2/intllib.lua b/mods/tubelib2/intllib.lua new file mode 100644 index 00000000..6669d720 --- /dev/null +++ b/mods/tubelib2/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/mods/tubelib2/intllib.sh b/mods/tubelib2/intllib.sh new file mode 100755 index 00000000..5b9294fa --- /dev/null +++ b/mods/tubelib2/intllib.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +../intllib/tools/xgettext.sh ./tube_api.lua ./internal1.lua ./internal2.lua \ No newline at end of file diff --git a/mods/tubelib2/locale/de.mo b/mods/tubelib2/locale/de.mo new file mode 100644 index 00000000..c769b79d Binary files /dev/null and b/mods/tubelib2/locale/de.mo differ diff --git a/mods/tubelib2/locale/de.po b/mods/tubelib2/locale/de.po new file mode 100644 index 00000000..b19d36e8 --- /dev/null +++ b/mods/tubelib2/locale/de.po @@ -0,0 +1,45 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-12-22 11:16+0100\n" +"PO-Revision-Date: 2018-12-22 11:19+0100\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.6\n" + +#: tube_api.lua +msgid "Maximum length reached!" +msgstr "Maximale Länge erreicht!" + +#: tube_api.lua +msgid "Pairing is missing" +msgstr "Das Pairing fehlt noch" + +#: tube_api.lua +msgid "Connection to a tube is missing!" +msgstr "Eine Verbindung zu einer Röhre fehlt!" + +#: internal1.lua +msgid "Not connected!" +msgstr "Nicht verbunden!" + +#: internal1.lua internal2.lua +msgid "Connected with " +msgstr "Verbunden mit " + +#: internal1.lua +msgid "Paired with " +msgstr "Gepaart mit " + +#~ msgid "Unconnected" +#~ msgstr "Nicht verbunden" diff --git a/mods/tubelib2/locale/template.pot b/mods/tubelib2/locale/template.pot new file mode 100644 index 00000000..fa6cc337 --- /dev/null +++ b/mods/tubelib2/locale/template.pot @@ -0,0 +1,42 @@ +# 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: 2018-12-22 11:16+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: tube_api.lua +msgid "Maximum length reached!" +msgstr "" + +#: tube_api.lua +msgid "Pairing is missing" +msgstr "" + +#: tube_api.lua +msgid "Connection to a tube is missing!" +msgstr "" + +#: internal1.lua +msgid "Not connected!" +msgstr "" + +#: internal1.lua internal2.lua +msgid "Connected with " +msgstr "" + +#: internal1.lua +msgid "Paired with " +msgstr "" diff --git a/mods/tubelib2/mod.conf b/mods/tubelib2/mod.conf new file mode 100644 index 00000000..a967bf95 --- /dev/null +++ b/mods/tubelib2/mod.conf @@ -0,0 +1 @@ +name=tubelib2 diff --git a/mods/tubelib2/screenshot.png b/mods/tubelib2/screenshot.png new file mode 100644 index 00000000..ed55d8ae Binary files /dev/null and b/mods/tubelib2/screenshot.png differ diff --git a/mods/tubelib2/storage.lua b/mods/tubelib2/storage.lua new file mode 100644 index 00000000..883840c7 --- /dev/null +++ b/mods/tubelib2/storage.lua @@ -0,0 +1,146 @@ +--[[ + + Tube Library 2 + ============== + + Copyright (C) 2017-2020 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + storage.lua + +]]-- + +-- +-- Data maintenance +-- +local MemStore = {} +local storage = minetest.get_mod_storage() + +local function update_mod_storage() + local gametime = minetest.get_gametime() + for k,v in pairs(MemStore) do + if v.used then + v.used = false + v.best_before = gametime + (60 * 30) -- 30 min + storage:set_string(k, minetest.serialize(v)) + elseif v.best_before < gametime then + storage:set_string(k, minetest.serialize(v)) + MemStore[k] = nil -- remove from memory + end + end + -- run every 10 minutes + minetest.after(600, update_mod_storage) +end + +minetest.register_on_shutdown(function() + for k,v in pairs(MemStore) do + storage:set_string(k, minetest.serialize(v)) + end +end) + +minetest.after(600, update_mod_storage) + +local function empty_block(block) + local empty = true + local tbl = minetest.deserialize(block) + for k,v in pairs(tbl) do + if k ~= "used" and k ~= "best_before" then + empty = false + end + end + return empty +end + +minetest.after(1, function() + local tbl = storage:to_table() + for k,v in pairs(tbl.fields) do + if empty_block(v) then + storage:set_string(k, "") + end + end +end) + +-- +-- Local helper functions +-- +local function new_block(block_key) + local data = storage:get_string(block_key) + if data == nil or data == "" then -- TODO: change for v5 + MemStore[block_key] = {} + else + MemStore[block_key] = minetest.deserialize(data) + end + return MemStore[block_key] +end + +local function new_node(block, node_key) + block[node_key] = {} + return block[node_key] +end + +local function unlock(pos) + local block_key = math.floor((pos.z+32768)/16)*4096*4096 + + math.floor((pos.y+32768)/16)*4096 + math.floor((pos.x+32768)/16) + local node_key = (pos.z%16)*16*16 + (pos.y%16)*16 + (pos.x%16) + local block = MemStore[block_key] or new_block(block_key) + block.used = true + return block, node_key +end + +local function keys_to_pos(block_key, node_key) + local f = math.floor + block_key = tonumber(block_key) or 0 + node_key = tonumber(node_key) or 0 + local x = ((f(block_key % 0x1000) * 0x10) - 32768) + (node_key % 0x10) + block_key, node_key = f(block_key / 0x1000), f(node_key / 0x10) + local y = ((f(block_key % 0x1000) * 0x10) - 32768) + (node_key % 0x10) + block_key, node_key = f(block_key / 0x1000), f(node_key / 0x10) + local z = ((f(block_key % 0x1000) * 0x10) - 32768) + (node_key % 0x10) + return {x = x, y = y, z = z} +end + +------------------------------------------------------------------------------- +-- API functions for a node related and high efficient storage table +-- for all kind of node data. +------------------------------------------------------------------------------- + +-- To be called when a node is placed +function tubelib2.init_mem(pos) + local block, node_key = unlock(pos) + return new_node(block, node_key) +end + +-- To get the node data table +function tubelib2.get_mem(pos) + local block, node_key = unlock(pos) + return block[node_key] or new_node(block, node_key) +end + +-- To be called when a node is removed +function tubelib2.del_mem(pos) + local block, node_key = unlock(pos) + block[node_key] = nil +end + +-- Read a value, or return the default value if not available +function tubelib2.get_mem_data(pos, key, default) + return tubelib2.get_mem(pos)[key] or default +end + +function tubelib2.walk_over_all(clbk) + local data = storage:to_table() + for block_key,sblock in pairs(data.fields) do + local block = minetest.deserialize(sblock) + for node_key,mem in pairs(block) do + if mem then + if node_key ~= "used" and node_key ~= "best_before" then + local pos = keys_to_pos(block_key, node_key) + local node = tubelib2.get_node_lvm(pos) + clbk(pos, node, mem) + end + end + end + end +end diff --git a/mods/tubelib2/textures/tubelib2_conn.png b/mods/tubelib2/textures/tubelib2_conn.png new file mode 100644 index 00000000..a2723962 Binary files /dev/null and b/mods/tubelib2/textures/tubelib2_conn.png differ diff --git a/mods/tubelib2/textures/tubelib2_hole.png b/mods/tubelib2/textures/tubelib2_hole.png new file mode 100644 index 00000000..96193dd4 Binary files /dev/null and b/mods/tubelib2/textures/tubelib2_hole.png differ diff --git a/mods/tubelib2/textures/tubelib2_source.png b/mods/tubelib2/textures/tubelib2_source.png new file mode 100644 index 00000000..84944d15 Binary files /dev/null and b/mods/tubelib2/textures/tubelib2_source.png differ diff --git a/mods/tubelib2/textures/tubelib2_tele.png b/mods/tubelib2/textures/tubelib2_tele.png new file mode 100644 index 00000000..fa416bc3 Binary files /dev/null and b/mods/tubelib2/textures/tubelib2_tele.png differ diff --git a/mods/tubelib2/textures/tubelib2_tool.png b/mods/tubelib2/textures/tubelib2_tool.png new file mode 100644 index 00000000..594dc1f1 Binary files /dev/null and b/mods/tubelib2/textures/tubelib2_tool.png differ diff --git a/mods/tubelib2/textures/tubelib2_tube.png b/mods/tubelib2/textures/tubelib2_tube.png new file mode 100644 index 00000000..ee4b142d Binary files /dev/null and b/mods/tubelib2/textures/tubelib2_tube.png differ diff --git a/mods/tubelib2/tube_api.lua b/mods/tubelib2/tube_api.lua new file mode 100644 index 00000000..8a78ba93 --- /dev/null +++ b/mods/tubelib2/tube_api.lua @@ -0,0 +1,419 @@ +--[[ + + Tube Library 2 + ============== + + Copyright (C) 2017-2020 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + tube_api.lua + +]]-- + +-- Version for compatibility checks, see readme.md/history +tubelib2.version = 1.9 + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local M = minetest.get_meta + +-- Load support for intllib. +local MP = minetest.get_modpath("tubelib2") +local I,_ = dofile(MP.."/intllib.lua") + +local Dir2Str = {"north", "east", "south", "west", "down", "up"} + +function tubelib2.dir_to_string(dir) + return Dir2Str[dir] +end + +local function Tbl(list) + local tbl = {} + for _,item in ipairs(list) do + tbl[item] = true + end + return tbl +end + +-- Tubelib2 Class +local Tube = tubelib2.Tube +local Turn180Deg = tubelib2.Turn180Deg +local Dir6dToVector = tubelib2.Dir6dToVector + + +local function get_pos(pos, dir) + return vector.add(pos, Dir6dToVector[dir or 0]) +end +tubelib2.get_pos = get_pos + +function tubelib2.get_node_lvm(pos) + local node = minetest.get_node_or_nil(pos) + if node then + return node + end + local vm = minetest.get_voxel_manip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local param2_data = vm:get_param2_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + local idx = area:index(pos.x, pos.y, pos.z) + node = { + name = minetest.get_name_from_content_id(data[idx]), + param2 = param2_data[idx] + } + return node +end + +local function update1(self, pos, dir) + local fpos,fdir = self:walk_tube_line(pos, dir) + self:infotext(get_pos(pos, dir), fpos) + self:infotext(fpos, get_pos(pos, dir)) + -- Translate pos/dir pointing to the secondary node into + -- spos/sdir of the secondary node pointing to the tube. + if fpos and fdir then + local spos, sdir = get_pos(fpos,fdir), Turn180Deg[fdir] + self:del_from_cache(spos, sdir) + self:add_to_cache(pos, dir, spos, sdir) + self:add_to_cache(spos, sdir, pos, dir) + self:update_secondary_node(pos, dir, spos, sdir) + self:update_secondary_node(spos, sdir, pos, dir) + end +end + +local function update2(self, pos1, dir1, pos2, dir2) + local fpos1,fdir1 = self:walk_tube_line(pos1, dir1) + local fpos2,fdir2 = self:walk_tube_line(pos2, dir2) + if not fdir1 or not fdir2 then -- line to long? + -- reset next tube(s) to head tube(s) again + local param2 = self:encode_param2(dir1, dir2, 2) + self:update_after_dig_tube(pos1, param2) + M(get_pos(pos1, dir1)):set_string("infotext", I("Maximum length reached!")) + M(get_pos(pos1, dir2)):set_string("infotext", I("Maximum length reached!")) + return false + end + self:infotext(fpos1, fpos2) + self:infotext(fpos2, fpos1) + -- Translate fpos/fdir pointing to the secondary node into + -- spos/sdir of the secondary node pointing to the tube. + local spos1, sdir1 = get_pos(fpos1,fdir1), Turn180Deg[fdir1] + local spos2, sdir2 = get_pos(fpos2,fdir2), Turn180Deg[fdir2] + self:del_from_cache(spos1, sdir1) + self:del_from_cache(spos2, sdir2) + self:add_to_cache(spos1, sdir1, spos2, sdir2) + self:add_to_cache(spos2, sdir2, spos1, sdir1) + self:update_secondary_node(spos1, sdir1, spos2, sdir2) + self:update_secondary_node(spos2, sdir2, spos1, sdir1) + return true +end + +local function update3(self, pos, dir1, dir2) + if pos and dir1 and dir2 then + local fpos1,fdir1,cnt1 = self:walk_tube_line(pos, dir1) + local fpos2,fdir2,cnt2 = self:walk_tube_line(pos, dir2) + self:infotext(fpos1, fpos2) + self:infotext(fpos2, fpos1) + -- Translate fpos/fdir pointing to the secondary node into + -- spos/sdir of the secondary node pointing to the tube. + if fpos1 and fpos2 and fdir1 and fdir2 then + local spos1, sdir1 = get_pos(fpos1,fdir1), Turn180Deg[fdir1] + local spos2, sdir2 = get_pos(fpos2,fdir2), Turn180Deg[fdir2] + self:del_from_cache(spos1, sdir1) + self:del_from_cache(spos2, sdir2) + self:add_to_cache(spos1, sdir1, spos2, sdir2) + self:add_to_cache(spos2, sdir2, spos1, sdir1) + self:update_secondary_node(spos1, sdir1, spos2, sdir2) + self:update_secondary_node(spos2, sdir2, spos1, sdir1) + return dir1, dir2, fpos1, fpos2, fdir1, fdir2, cnt1 or 0, cnt2 or 0 + end + return dir1, dir2, pos, pos, dir1, dir2, cnt1 or 0, cnt2 or 0 + end +end + +local function update_secondary_nodes_after_node_placed(self, pos, dirs) + dirs = dirs or self.dirs_to_check + -- check surrounding for secondary nodes + for _,dir in ipairs(dirs) do + local tmp, npos + if self.force_to_use_tubes then + tmp, npos = self:get_special_node(pos, dir) + else + tmp, npos = self:get_secondary_node(pos, dir) + end + if npos then + self:update_secondary_node(npos, Turn180Deg[dir], pos, dir) + self:update_secondary_node(pos, dir, npos, Turn180Deg[dir]) + end + end +end + +local function update_secondary_nodes_after_node_dug(self, pos, dirs) + dirs = dirs or self.dirs_to_check + -- check surrounding for secondary nodes + for _,dir in ipairs(dirs) do + local tmp, npos + if self.force_to_use_tubes then + tmp, npos = self:get_special_node(pos, dir) + else + tmp, npos = self:get_secondary_node(pos, dir) + end + if npos then + self:update_secondary_node(npos, Turn180Deg[dir]) + self:update_secondary_node(pos, dir) + end + end +end + +-- +-- API Functions +-- + +function Tube:new(attr) + local o = { + dirs_to_check = attr.dirs_to_check or {1,2,3,4,5,6}, + max_tube_length = attr.max_tube_length or 1000, + primary_node_names = Tbl(attr.primary_node_names or {}), + secondary_node_names = Tbl(attr.secondary_node_names or {}), + show_infotext = attr.show_infotext or false, + force_to_use_tubes = attr.force_to_use_tubes or false, + clbk_after_place_tube = attr.after_place_tube, + tube_type = attr.tube_type or "unknown", + pairingList = {}, -- teleporting nodes + connCache = {}, -- connection cache {pos1 = {dir1 = {pos2 = pos2, dir2 = dir2},...} + special_node_names = {}, -- use add_special_node_names() to register nodes + } + o.valid_dirs = Tbl(o.dirs_to_check) + setmetatable(o, self) + self.__index = self + return o +end + +-- Register (foreign) tubelib compatible nodes. +function Tube:add_secondary_node_names(names) + for _,name in ipairs(names) do + self.secondary_node_names[name] = true + end +end + +-- Register further nodes, which should be updated after +-- a node/tube is placed/dug +function Tube:add_special_node_names(names) + for _,name in ipairs(names) do + self.special_node_names[name] = true + end +end + +-- Called for each connected node when the tube connection has been changed. +-- func(node, pos, out_dir, peer_pos, peer_in_dir) +function Tube:register_on_tube_update(update_secondary_node) + self.clbk_update_secondary_node = update_secondary_node +end + +function Tube:get_pos(pos, dir) + return vector.add(pos, Dir6dToVector[dir or 0]) +end + +-- To be called after a secondary node is placed. +-- dirs is a list with valid dirs, like: {1,2,3,4} +function Tube:after_place_node(pos, dirs) + -- [s][f]----[n] x + -- s..secondary, f..far, n..near, x..node to be placed + for _,dir in ipairs(self:update_after_place_node(pos, dirs)) do + if pos and dir then + update1(self, pos, dir) + end + end + update_secondary_nodes_after_node_placed(self, pos, dirs) +end + +-- To be called after a tube/primary node is placed. +-- Returns false, if placing is not allowed +function Tube:after_place_tube(pos, placer, pointed_thing) + -- [s1][f1]----[n1] x [n2]-----[f2][s2] + -- s..secondary, f..far, n..near, x..node to be placed + local res,dir1,dir2 = self:update_after_place_tube(pos, placer, pointed_thing) + if res then -- node placed? + return update2(self, pos, dir1, pos, dir2) + end + return res +end + +function Tube:after_dig_node(pos, dirs) + -- [s][f]----[n] x + -- s..secondary, f..far, n..near, x..node to be removed + for _,dir in ipairs(self:update_after_dig_node(pos, dirs)) do + update1(self, pos, dir) + end + update_secondary_nodes_after_node_dug(self, pos, dirs) +end + +-- To be called after a tube/primary node is removed. +function Tube:after_dig_tube(pos, oldnode) + -- [s1][f1]----[n1] x [n2]-----[f2][s2] + -- s..secondary, f..far, n..near, x..node to be removed + + -- update tubes + if oldnode and oldnode.param2 then + local dir1, dir2 = self:update_after_dig_tube(pos, oldnode.param2) + if dir1 then update1(self, pos, dir1) end + if dir2 then update1(self, pos, dir2) end + + -- Update secondary nodes, if right beside + dir1, dir2 = self:decode_param2(pos, oldnode.param2) + local npos1,ndir1 = get_pos(pos, dir1),Turn180Deg[dir1] + local npos2,ndir2 = get_pos(pos, dir2),Turn180Deg[dir2] + self:del_from_cache(npos1,ndir1) + self:update_secondary_node(npos1,ndir1) + self:update_secondary_node(npos2,ndir2) + end +end + + +-- From source node to destination node via tubes. +-- pos is the source node position, dir the output dir +-- The returned pos is the destination position, dir +-- is the direction into the destination node. +function Tube:get_connected_node_pos(pos, dir) + local key = S(pos) + if self.connCache[key] and self.connCache[key][dir] then + local item = self.connCache[key][dir] + return item.pos2, Turn180Deg[item.dir2] + end + local fpos,fdir = self:walk_tube_line(pos, dir) + local spos = get_pos(fpos,fdir) + self:add_to_cache(pos, dir, spos, Turn180Deg[fdir]) + self:add_to_cache(spos, Turn180Deg[fdir], pos, dir) + return spos, fdir +end + +-- Check if node at given position is a tubelib2 compatible node, +-- able to receive and/or deliver items. +-- If dir == nil then node_pos = pos +-- Function returns the result (true/false), new pos, and the node +function Tube:compatible_node(pos, dir) + local npos = vector.add(pos, Dir6dToVector[dir or 0]) + local node = self:get_node_lvm(npos) + return self.secondary_node_names[node.name], npos, node +end + + +-- To be called from a repair tool in the case of a "WorldEdit" or with +-- legacy nodes corrupted tube line. +function Tube:tool_repair_tube(pos) + local param2 = self:get_primary_node_param2(pos) + if param2 then + local dir1, dir2 = self:decode_param2(pos, param2) + return update3(self, pos, dir1, dir2) + end +end + +-- To be called from a repair tool in the case, tube nodes are "unbreakable". +function Tube:tool_remove_tube(pos, sound) + if self:is_primary_node(pos) then + local _,node = self:get_node(pos) + minetest.sound_play({name=sound},{ + pos=pos, + gain=1, + max_hear_distance=5, + loop=false}) + minetest.remove_node(pos) + self:after_dig_tube(pos, node) + return true + end + return false +end + + +function Tube:prepare_pairing(pos, tube_dir, sFormspec) + local meta = M(pos) + if meta:get_int("tube_dir") ~= 0 then -- already prepared? + -- update tube_dir only + meta:set_int("tube_dir", tube_dir) + elseif tube_dir then + meta:set_int("tube_dir", tube_dir) + meta:set_string("channel", nil) + meta:set_string("infotext", I("Pairing is missing")) + meta:set_string("formspec", sFormspec) + else + meta:set_string("infotext", I("Connection to a tube is missing!")) + end +end + +function Tube:pairing(pos, channel) + if self.pairingList[channel] and not vector.equals(pos, self.pairingList[channel]) then + -- store peer position on both nodes + local peer_pos = self.pairingList[channel] + local tube_dir1 = self:store_teleport_data(pos, peer_pos) + local tube_dir2 = self:store_teleport_data(peer_pos, pos) + update2(self, pos, tube_dir1, peer_pos, tube_dir2) + self.pairingList[channel] = nil + return true + else + self.pairingList[channel] = pos + local meta = M(pos) + meta:set_string("channel", channel) + meta:set_string("infotext", I("Pairing is missing").." ("..channel..")") + return false + end +end + +function Tube:stop_pairing(pos, oldmetadata, sFormspec) + -- unpair peer node + if oldmetadata and oldmetadata.fields then + if oldmetadata.fields.tele_pos then + local tele_pos = minetest.string_to_pos(oldmetadata.fields.tele_pos) + local peer_meta = M(tele_pos) + if peer_meta then + self:after_place_node(tele_pos, {peer_meta:get_int("tube_dir")}) + peer_meta:set_string("channel", nil) + peer_meta:set_string("tele_pos", nil) + peer_meta:set_string("formspec", sFormspec) + peer_meta:set_string("infotext", I("Pairing is missing")) + end + elseif oldmetadata.fields.channel then + self.pairingList[oldmetadata.fields.channel] = nil + end + end +end + + +-- Used by chat commands, when tubes are placed e.g. via WorldEdit +function Tube:replace_tube_line(pos1, pos2) + if pos1 and pos2 and not vector.equals(pos1, pos2) then + local check = (((pos1.x == pos2.x) and 1) or 0) + + (((pos1.y == pos2.y) and 1) or 0) + + (((pos1.z == pos2.z) and 1) or 0) + if check == 2 then + local v = vector.direction(pos1, pos2) + local dir1 = self:vector_to_dir(v) + local dir2 = Turn180Deg[dir1] + + self:replace_nodes(pos1, pos2, dir1, dir2) + update3(self, pos1, dir1, dir2) + end + end +end + +-- Used to change the tube nodes texture (e.g. on/off state) +function Tube:switch_tube_line(pos, dir, state) + self:switch_nodes(pos, dir, state) +end + +-- Generator function to iterate over a tube line +-- Returns for each tube: i , pos, node +function Tube:get_tube_line(pos, dir) + if pos and dir then + self.ref = {pos = pos, dir = dir} + return function(self, i) + if i < self.max_tube_length then + local new_pos, new_dir, num = self:get_next_tube(self.ref.pos, self.ref.dir) + if new_pos then + self.ref.pos, self.ref.dir = new_pos, new_dir + i = i + 1 + return i, self.ref.pos, self.node + end + end + end, self, 0 + end +end diff --git a/mods/tubelib2/tube_test.lua b/mods/tubelib2/tube_test.lua new file mode 100644 index 00000000..d6de4528 --- /dev/null +++ b/mods/tubelib2/tube_test.lua @@ -0,0 +1,313 @@ +--[[ + + Tube Library 2 + ============== + + Copyright (C) 2017-2020 Joachim Stolberg + + LGPLv2.1+ + See LICENSE.txt for more information + + tube_test.lua + + THIS FILE IS ONLY FOR TESTING PURPOSES + +]]-- + +-- for lazy programmers +local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P = minetest.string_to_pos +local M = minetest.get_meta + +-- Test tubes + +local Tube = tubelib2.Tube:new({ + -- North, East, South, West, Down, Up + -- dirs_to_check = {1,2,3,4}, -- horizontal only + -- dirs_to_check = {5,6}, -- vertical only + dirs_to_check = {1,2,3,4,5,6}, + max_tube_length = 1000, + show_infotext = true, + primary_node_names = {"tubelib2:tubeS", "tubelib2:tubeA"}, + secondary_node_names = {"default:chest", "default:chest_open", + "tubelib2:source", "tubelib2:junction", "tubelib2:teleporter"}, + after_place_tube = function(pos, param2, tube_type, num_tubes, tbl) + minetest.swap_node(pos, {name = "tubelib2:tube"..tube_type, param2 = param2}) + end, +}) + +Tube:register_on_tube_update(function(node, pos, out_dir, peer_pos, peer_in_dir) + local sdir = tubelib2.dir_to_string(out_dir) + if not peer_pos then + print(S(pos).." to the "..sdir..": Not connected") + elseif Tube:is_secondary_node(peer_pos) then + local node = minetest.get_node(peer_pos) + print(S(pos).." to the "..sdir..": Connected with "..node.name.." at "..S(peer_pos).."/"..peer_in_dir) + else + print(S(pos).." to the "..sdir..": Connected with "..S(peer_pos).."/"..peer_in_dir) + for i, pos, node in Tube:get_tube_line(pos, out_dir) do + print("walk", S(pos), node.name) + end + end +end) + + +minetest.register_node("tubelib2:tubeS", { + description = "Tubelib2 Test tube", + tiles = { -- Top, base, right, left, front, back + "tubelib2_tube.png", + "tubelib2_tube.png", + "tubelib2_tube.png", + "tubelib2_tube.png", + "tubelib2_hole.png", + "tubelib2_hole.png", + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + --local t = minetest.get_us_time() + if not Tube:after_place_tube(pos, placer, pointed_thing) then + minetest.remove_node(pos) + return true + end + --print("place time", minetest.get_us_time() - t) + return false + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", -- important! + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2/8, -2/8, -4/8, 2/8, 2/8, 4/8}, + }, + }, + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {crumbly = 3, cracky = 3, snappy = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("tubelib2:tubeA", { + description = "Tubelib2 Test tube", + tiles = { -- Top, base, right, left, front, back + "tubelib2_tube.png", + "tubelib2_hole.png", + "tubelib2_tube.png", + "tubelib2_tube.png", + "tubelib2_tube.png", + "tubelib2_hole.png", + }, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:after_dig_tube(pos, oldnode, oldmetadata) + end, + + paramtype2 = "facedir", -- important! + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-2/8, -4/8, -2/8, 2/8, 2/8, 2/8}, + {-2/8, -2/8, -4/8, 2/8, 2/8, -2/8}, + }, + }, + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {crumbly = 3, cracky = 3, snappy = 3, not_in_creative_inventory=1}, + sounds = default.node_sound_glass_defaults(), + drop = "tubelib2:tubeS", +}) + +local sFormspec = "size[7.5,3]".. + "field[0.5,1;7,1;channel;Enter channel string;]" .. + "button_exit[2,2;3,1;exit;Save]" + + +minetest.register_node("tubelib2:source", { + description = "Tubelib2 Item Source", + tiles = { + -- up, down, right, left, back, front + 'tubelib2_source.png', + 'tubelib2_source.png', + 'tubelib2_source.png', + 'tubelib2_source.png', + 'tubelib2_source.png', + 'tubelib2_conn.png', + }, + + after_place_node = function(pos, placer) + local tube_dir = ((minetest.dir_to_facedir(placer:get_look_dir()) + 2) % 4) + 1 + M(pos):set_int("tube_dir", tube_dir) + Tube:after_place_node(pos, {tube_dir}) + minetest.get_node_timer(pos):start(2) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local tube_dir = tonumber(oldmetadata.fields.tube_dir or 0) + Tube:after_dig_node(pos, {tube_dir}) + end, + + on_timer = function(pos, elapsed) + local tube_dir = M(pos):get_int("tube_dir") + local dest_pos, dest_dir = Tube:get_connected_node_pos(pos, tube_dir) + print("on_timer: dest_pos="..S(dest_pos).." dest_dir="..dest_dir) + local inv = minetest.get_inventory({type="node", pos=dest_pos}) + local stack = ItemStack("default:dirt") + if inv then + local leftover = inv:add_item("main", stack) + if leftover:get_count() == 0 then + return true + end + end + local node = minetest.get_node(dest_pos) + if node.name == "air" then + minetest.add_item(dest_pos, stack) + else + print("add_item error") + end + return true + end, + + paramtype2 = "facedir", -- important! + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {crumbly = 3, cracky = 3, snappy = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("tubelib2:junction", { + description = "Tubelib2 Junction", + tiles = { + 'tubelib2_conn.png', + }, + + after_place_node = function(pos, placer, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Position "..S(pos)) + Tube:after_place_node(pos) + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:after_dig_node(pos) + end, + + paramtype2 = "facedir", -- important! + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {crumbly = 3, cracky = 3, snappy = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("tubelib2:teleporter", { + description = "Tubelib2 Teleporter", + tiles = { + -- up, down, right, left, back, front + 'tubelib2_tele.png', + 'tubelib2_tele.png', + 'tubelib2_tele.png', + 'tubelib2_tele.png', + 'tubelib2_tele.png', + 'tubelib2_conn.png', + }, + + after_place_node = function(pos, placer) + -- the tube_dir calculation depends on the player look-dir and the hole side of the node + local tube_dir = ((minetest.dir_to_facedir(placer:get_look_dir()) + 2) % 4) + 1 + Tube:prepare_pairing(pos, tube_dir, sFormspec) + Tube:after_place_node(pos, {tube_dir}) + end, + + on_receive_fields = function(pos, formname, fields, player) + if fields.channel ~= nil then + Tube:pairing(pos, fields.channel) + end + end, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + Tube:stop_pairing(pos, oldmetadata, sFormspec) + local tube_dir = tonumber(oldmetadata.fields.tube_dir or 0) + Tube:after_dig_node(pos, {tube_dir}) + end, + + paramtype2 = "facedir", -- important! + on_rotate = screwdriver.disallow, -- important! + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {crumbly = 3, cracky = 3, snappy = 3}, + sounds = default.node_sound_glass_defaults(), +}) + +local function read_param2(pos, player) + local node = minetest.get_node(pos) + local dir1, dir2, num_tubes = Tube:decode_param2(pos, node.param2) + minetest.chat_send_player(player:get_player_name(), "[Tubelib2] pos="..S(pos)..", dir1="..dir1..", dir2="..dir2..", num_tubes="..num_tubes) +end + +local function remove_tube(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.under + if placer:get_player_control().sneak then + read_param2(pos, placer) + else + Tube:tool_remove_tube(pos, "default_break_glass") + end + else + local dir = (minetest.dir_to_facedir(placer:get_look_dir()) % 4) + 1 + minetest.chat_send_player(placer:get_player_name(), + "[Tool Help] dir="..dir.."\n".. + " left: remove node\n".. + " right: repair tube line\n") + end +end + +local function walk(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.under + local dir = (minetest.dir_to_facedir(placer:get_look_dir()) % 4) + 1 + local t = minetest.get_us_time() + local pos1, outdir1, pos2, outdir2, cnt = Tube:walk(pos, dir) + t = minetest.get_us_time() - t + print("time", t) + if pos1 then + local s = "[Tubelib2] pos1="..S(pos1)..", outdir1="..outdir1..", pos2="..S(pos2)..", outdir2="..outdir2..", cnt="..cnt + minetest.chat_send_player(placer:get_player_name(), s) + end + else + local dir = (minetest.dir_to_facedir(placer:get_look_dir()) % 4) + 1 + minetest.chat_send_player(placer:get_player_name(), + "[Tool Help] dir="..dir.."\n".. + " left: remove node\n".. + " right: repair tube line\n") + end +end + +local function debug(itemstack, placer, pointed_thing) + Tube:dbg_out() +end + +-- Tool for tube workers to crack a protected tube line +minetest.register_node("tubelib2:tool", { + description = "Tubelib2 Tool", + inventory_image = "tubelib2_tool.png", + wield_image = "tubelib2_tool.png", + use_texture_alpha = true, + groups = {cracky=1, book=1}, + on_use = remove_tube, + on_place = debug, + node_placement_prediction = "", + stack_max = 1, +}) +