local cbox = {{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}} local cboard_box = {{-0.5, -0.5, 0.45, 1.5, 0.5, 0.5}} local chair_box = {{-0.4, -0.5, -0.2, 0.4, 0.2, 0.4}, {-0.4, 0, 0.3, 0.4, 0.7, 0.4}} local desk_box = {{-0.5, -0.5, -0.25, 0.5, 0.4, 0.5}} local schair_box = {{-0.3, -0.5, -0.3, 0.3, 0, 0.3}} local tdesk_box = {{-0.5, -0.5, -0.5, 1.5, 0.5, 0.5}} local fe_box = {{-0.2, -0.5, 0.2, 0.2, 0.2, 0.5}} local fel_box = {{-0.3, -0.5, 0.1, 0.3, 0.5, 0.5}} local book_box = {{-0.5, -0.5, 0, 0.5, 0.5, 0.5}} local poster_box = {{-0.3, -0.5, 0.48, 0.3, 0.5, 0.5}} local clock_box = {{-0.4, -0.4, 0.4, 0.4, 0.4, 0.5}} local bell_box = {{-0.3, -0.3, 0.4, 0.3, 0.3, 0.5}} local map_box = {{-0.5, -0.5, 0.48, 1.5, 0.5, 0.5}} local lockers_box = {{-0.5, -0.5, 0, 0.5, 1.5, 0.5}} local exit_box = {{-0.25, 0.1, -0.1, 0.25, 0.5, 0.1}} local light_box = {{-0.5, 0.48, -0.3, 0.5, 0.5, 0.3}} local trash_box = {{-0.3, -0.5, -0.3, 0.3, 0.1, 0.3}} local ceiling_box = {{-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}} local window_box = {{-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}} local door_box = {{-0.5, -0.5, -0.1, 0.5, 1.5, 0.1}} local door2_box = {{-0.5, -0.5, 0, -0.3, 1.5, 1}} local fountain_box = {{-0.3, -0.1, 0, 0.3, 0.5, 0.5}} local bookshelf_box = {{-0.5, -0.5, 0, 0.5, 0.5, 0.5}} local book_box = {{-0.3, -0.5, -0.3, 0.3, -0.3, 0.3}} local book2_box = {{-0.4, -0.5, -0.3, 0.2, -0.4, 0.3}} local nodes = {--name, description, texture, model, selection_box/collision_box {"chalkboard", "Chaulkboard", "chalkboard", "chalkboard", cboard_box}, {"chair", "Chair", "chair", "chair", chair_box}, {"school_desk_chair", "School Desk Chair", "school_desk_chair", "school_desk_chair", schair_box}, {"school_desk_chair2", "School Desk Chair 2", "school_desk_chair2", "school_desk_chair", schair_box}, {"school_desk", "School Desk", "school_desk", "school_desk", desk_box}, {"reception", "Reception", "reception", "reception", tdesk_box}, {"teacher_desk", "Teacher Desk", "teacher_desk", "teacher_desk", tdesk_box}, {"fire_extinguisher", "Fire Extinguisher", "fire_extinguisher", "fire_extinguisher", fe_box}, {"fire_extinguisher_large", "Large Fire Extinguisher", "fire_extinguisher", "fire_extinguisher_large", fel_box}, {"bookshelf", "Bookshelf", "bookshelf", "bookshelf", bookshelf_box}, {"poster1", "Poster 1", "poster1", "poster", poster_box}, {"poster2", "Poster 2", "poster2", "poster", poster_box}, {"poster3", "Poster 3", "poster3", "poster", poster_box}, {"poster4", "Poster 4", "poster4", "poster", poster_box}, {"clock", "Clock", "clock", "clock", clock_box}, {"fire_bell", "Fire Bell", "fire_bell", "fire_bell", bell_box}, {"map", "Map", "map", "map", map_box}, {"lockers", "Lockers", "lockers", "lockers", lockers_box}, {"exit_sign", "Exit Sign", "exit", "exit", exit_box}, {"light", "Light", "light", "light", light_box}, {"trash_can", "Trash Can", "trash_can", "trash_can", trash_box}, {"ceiling", "Ceiling/Floor", "ceiling", "ceiling", ceiling_box}, {"bookshelf_full_1", "Bookshelf", "bookshelf_full_1", "bookshelf_full_1", bookshelf_box}, {"bookshelf_full_2", "Bookshelf", "bookshelf_full_2", "bookshelf_full_2", bookshelf_box}, {"bookshelf_full_3", "Bookshelf", "bookshelf_full_3", "bookshelf_full_3", bookshelf_box}, {"window", "Window", "window", "window", window_box}, {"door", "Door", "door", "door", door_box}, {"door2", "Door", "door", "door2", door2_box}, {"fountain", "Fountain", "fountain", "fountain", fountain_box}, {"book_open", "Open Book", "book_open", "book_open", book_box}, {"book_closed", "Closed Book", "book_closed", "book_closed", book2_box}, } for i in ipairs(nodes) do local nam = nodes[i][1] local des = nodes[i][2] local img = nodes[i][3] local mod = nodes[i][4] local box = nodes[i][5] core.register_node("myschool:"..nam,{ description = des, tiles = {"myschool_"..img..".png"}, drawtype = "mesh", mesh = "myschool_"..mod..".obj", paramtype = "light", paramtype2 = "facedir", groups = {cracky = 1, choppy = 1, oddly_breakable_by_hand = 1}, selection_box = { type = "fixed", fixed = box }, collision_box = { type = "fixed", fixed = box }, }) if core.get_modpath("lucky_block") then lucky_block:add_blocks({ {"dro", {"myschool:"..nam}, 2}, }) end end minetest.override_item("myschool:exit_sign",{ light_source = 3,}) minetest.override_item("myschool:light",{ light_source = 14,}) minetest.override_item("myschool:window",{ use_texture_alpha = "blend",}) minetest.override_item("myschool:door",{ on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) core.set_node(pos,{name="myschool:door2", param2 = node.param2}) end}) minetest.override_item("myschool:door2",{ groups = {cracky = 1, choppy = 1, oddly_breakable_by_hand = 1, not_in_creative_inventory=1}, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) core.set_node(pos,{name="myschool:door", param2 = node.param2}) end}) -- Hilfsfunktion: Klick von oben prüfen local function top_face(pointed_thing) if not pointed_thing then return false end return pointed_thing.above.y > pointed_thing.under.y end -- Sitz-Logik: Alle Stühle nutzen die exakt gleiche Position local function myschool_sit(pos, node, clicker, pointed_thing) if not top_face(pointed_thing) then return end local player_name = clicker:get_player_name() -- Einfacher Toggle: Wenn man bereits sitzt (egal wo), steht man auf. if default.player_attached[player_name] then clicker:set_physics_override({ speed = 1, jump = 1, gravity = 1 }) clicker:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0}) -- Auf den Boden vor/auf den Stuhl setzen clicker:set_pos({x = pos.x, y = pos.y - 0.5, z = pos.z}) default.player_attached[player_name] = false default.player_set_animation(clicker, "stand", 30) else -- Hinsetzen -- 1. Physik zuerst auf 0, um das "Gleiten" zu verhindern clicker:set_physics_override({ speed = 0, jump = 0, gravity = 0 }) -- 2. Kamera-Höhe anpassen clicker:set_eye_offset({x=0, y=-7, z=2}, {x=0, y=0, z=0}) -- 3. Teleport exakt in die Mitte (pos) clicker:set_pos({x = pos.x, y = pos.y, z = pos.z}) default.player_attached[player_name] = true default.player_set_animation(clicker, "sit", 30) -- Rotation basierend auf facedir local yaw = 0 if node.param2 == 0 then yaw = 3.15 elseif node.param2 == 1 then yaw = 7.9 elseif node.param2 == 2 then yaw = 6.28 elseif node.param2 == 3 then yaw = 4.75 end clicker:set_look_yaw(yaw) end end -- --- OVERRIDES --- -- 1. Alle Stuhl-Typen (Chair, Desk Chair 1 & 2) local chairs = {"myschool:chair", "myschool:school_desk_chair", "myschool:school_desk_chair2"} for _, name in ipairs(chairs) do minetest.override_item(name, { on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) myschool_sit(pos, node, clicker, pointed_thing) end, }) end -- 2. Lockers (Spinde) mit 3x3 Inventar minetest.override_item("myschool:lockers", { on_construct = function(pos) local meta = minetest.get_meta(pos) meta:get_inventory():set_size("main", 3 * 3) meta:set_string("infotext", "Locker") end, on_rightclick = function(pos, node, clicker) local name = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z local fs = "size[8,9]" .. "list[" .. name .. ";main;2.5,0.5;3,3;]" .. "list[current_player;main;0,4.85;8,4;]" .. "listring[" .. name .. ";main]listring[current_player;main]" minetest.show_formspec(clicker:get_player_name(), "myschool:locker_fs", fs) end, can_dig = function(pos, player) return minetest.get_meta(pos):get_inventory():is_empty("main") end, }) -- 3. Trash Can (Mülleimer) minetest.override_item("myschool:trash_can", { on_construct = function(pos) local meta = minetest.get_meta(pos) meta:get_inventory():set_size("trash", 1) meta:set_string("infotext", "Trash Can") end, on_rightclick = function(pos, node, clicker) local name = "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z local fs = "size[8,5]label[3.5,0;Trash Bin]" .. "list[" .. name .. ";trash;3.5,0.5;1,1;]" .. "list[current_player;main;0,1.5;8,4;]" minetest.show_formspec(clicker:get_player_name(), "myschool:trash_fs", fs) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) if listname == "trash" then minetest.get_meta(pos):get_inventory():set_stack(listname, index, nil) minetest.sound_play("default_dig_crumbly", {pos = pos, gain = 0.5}) end end, }) -- 4. Ceiling lässt kein Licht durch minetest.override_item("myschool:ceiling", { paramtype = "none", sunlight_propagates = false, })