aboutsummaryrefslogtreecommitdiff
path: root/games/minimal
Commit message (Collapse)AuthorAge
* Add 'content_offset' and 'padding' style properties for buttons (#9661)Hugues Ross2020-05-02
| | | | * Add padding and content_offset style properties to buttons
* Apply a scrollbar's default value to scroll containers (#9699)DS2020-04-18
| | | Fixes #9691.
* Add scroll_container formspec element (redo) (#9101)DS2020-04-13
| | | | | | | | | New formspec elements: - `scroll_container[<X>,<Y>;<W>,<H>;<scrollbar name>;<orientation>;<scroll factor>]` - `scroll_container_end[]` Other elements can be embedded in this element. Scrollbar must be placed manually.
* Formspecs: Add state-selection to style elements (#9378)Hugues Ross2020-04-11
|
* Formspecs: Add starting frame to `animated_image` (#9411)v-rob2020-03-16
|
* Add multiple element selection to `style` and `style_type` (#9380)v-rob2020-03-01
|
* Add animated_image[] formspec element (#9258)Hugues Ross2020-02-15
|
* Add 9-slice background support to button formspec elements (#9290)Hugues Ross2020-01-26
|
* StaticText/EnrichedString: Styling support (#9187)SmallJoker2020-01-22
| | | | | | | | * StaticText/EnrichedString: Styling support * Fix tooltip fg/bgcolor * Fix default color for substr(), add unittests
* Refactor to centralize GUIButton styling/rendering code (#9090)Hugues Ross2019-12-09
|
* Change some rough/inappropriate language in comments (#9061)random-geek2019-10-24
|
* Add 4 missing fallback/default textures (#8845)Wuzzy2019-10-23
| | | Processed using 'optipng -o7 -strip all '
* Add more visual feedback for button states (#8916)Hugues Ross2019-10-12
| | | | | | - Add style properties for overriding the the hovered/pressed state - By default, hovered buttons are a lighter version of the base color - By default, pressed buttons are a darker version of the base color - Add hovered bg image support for image buttons (style property)
* Fix some issues with minetest.clear_craft (#8712)Paul Ouellette2019-08-10
| | | | | | | | | | | * Fix some issues with minetest.clear_craft - Fix memory leak - Fix crafts with an output count not being cleared when clearing by input. - Fix recipe list being reversed when clearing by input. * Add CraftInput::empty()
* Add formspec testing to test mod in minimalrubenwardy2019-08-03
|
* minimal: Move get_craft_result tests to test modPaul Ouellette2019-07-27
|
* minimal: Fix crash due to assertion failANAND2019-05-03
|
* Add disable_repair group to prevent tool repair (#7381)Wuzzy2018-10-16
|
* Minimal: Disable disruptive formspec test by default (#7423)Wuzzy2018-06-14
| | | | | | | | | * Minimal: Explicit log levels * Minimal: Formspec test now disabled by default This is done because the formspec test was disruptive. This test can now be toggled with server command test_formspec first.
* CSM/SSM: Add on_mods_loaded callback (#7411)Loïc Blot2018-06-06
| | | | | * CSM/SSM: Add on_mods_loaded callback
* Minimal: Fix HP change crash (#7344)SmallJoker2018-05-16
|
* MetaDataRef: Add contains() and get() (#7214)rubenwardy2018-04-30
|
* Add player:get_meta(), deprecate player attributes (#7202)rubenwardy2018-04-06
| | | | * Add player:get_meta(), deprecate player attributes
* Load dependencies and description from mod.confAndrew Ward2018-03-28
|
* Add reasons to on_dieplayer and on_hpchangeAndrew Ward2018-03-28
|
* Add minetest.bulk_set_node call + optimize Environment::set_node call (#6958)Loïc Blot2018-01-30
| | | | | | | | | | * Add minetest.bulk_set_node call + experimental mod unittest * Optimize set_node function to prevent triple lookup on contentfeatures Do only one lookup for old, and try to merge old and new lookup if node is same than previous node * Add benchmark function + optimize vector population to have real results
* Fix default item callbacks to work with nil users (#5819)raymoo2017-10-28
| | | | | | | | | * Fix default item callbacks to work with nil users * item.lua: Handle node drops for invalid players The if-condition for the dropping loop is the same as `inv`, which means that the 2nd possible definition of `give_item` is never used. Remove redundant `local _, dropped_item`
* Real global textures (#6105)Vitaliy2017-10-15
| | | | | | | | * Real global textures * Add world-aligned textures * Update minimal to support world-aligned tiles * Update minimal
* Implement mod communication channels (#6351)Loïc Blot2017-09-26
| | | | | | | | | | Implement network communication for channels * Implement ModChannel manager server side to route incoming messages from clients to other clients * Add signal handler switch on client & ModChannelMgr on client to handle channels * Add Lua API bindings + client packet sending + unittests * Implement server message sending * Add callback from received message handler to Lua API using registration method
* Remove nodeupdate completely (#6358)Rui2017-09-01
|
* Add LuaEntity on_death callback (#6177)Loïc Blot2017-07-27
| | | | | | Add LuaEntity on_death callback This fixes #5474
* Minimal: Add river water nodes (#5809)Paramat2017-05-24
| | | Is a base terrain node needed by any core mapgen with sloping rivers.
* Private nodemeta (#5702)sfan52017-05-10
| | | | * Private node metadata that isn't sent to the client
* Player attrs: permits to remove an attribute by setting value to nil (#5716)Loïc Blot2017-05-07
| | | | | | | | | | * Player attrs: permits to remove an attribute by setting value to nil When doing player:set_attribute("attr", nil) remove attribute Also remove a useless check on C++ API part (already done by checkplayer) Fix #5709
* lua: remove core.cause_error call (#5637)Loïc Blot2017-04-22
| | | it was used in minimal to trigger core crash, not very useful
* Fix not being able to damage players in minimal (#5266)red-0012017-02-18
|
* Add particle animation, glowsfan52017-01-18
| | | | | This is implemented by reusing and extending the TileAnimation code for the methods used by particles.
* Add 2D sheet animation for nodessfan52017-01-02
|
* Added "[sheet" to the texture special commands.Luke Puchner-Hardman2017-01-02
| | | | | | | | "[sheet:WxH:X,Y" assumes the base image is a tilesheet with W*H tiles on it and crops to the tile at position X,Y. Basically it works like "[verticalframe" but in 2D. For testing, I combined the four default_chest images into one.
* Minimal game: Use field 'tiles' instead of 'tile_images'Rogier2016-12-24
|
* Mapgen: Various fixes and improvementsparamat2016-01-11
| | | | | | | | | | | | | Lua_api.txt: Document 'minetest.registered_biomes' Minimal: Remove 'mapgen_air' alias Cavegen: Add fallback node for 'mapgen_ice' Dungeongen: Add fallback node for 'mapgen_river_water_source' Mgv5: Remove unnecessary '#include util/directiontables.h' Add missing 'this->'s in makeChunk() Mgv6: Edit empty line formatting Remove leading spaces in makeChunk() Add missing spaces after 'for' and 'if' Mgv7: Edit empty line formatting
* Minimal: Add mapgen alias for airparamat2015-12-30
|
* Fix spelling of noise_thresholdJun Zhang2015-12-06
|
* Fix relief mapping issuesRealBadAngel2015-07-16
|
* Minimal: Remove recently added unnecessary nodesparamat2015-07-14
| | | | Fix 'is ground content' for some nodes
* Simpler patch for saplings trying to grow on unknown nodesShadowNinja2015-06-16
|
* Add list-ringsest312015-06-16
| | | | | | | Adds list-rings, a method to implement item sending between inventories via shift-click. Nice insider feature: a ring consisting of a single inventory list serves as nice clean-up method. Also adds them to minimal game, and the standard inventory. Craft output slots are not supported.
* Don't crash when saplings try to grow on unknown nodesy.st2015-06-15
|
* Minimal: Add snow biome and jungleleaves nodes. Add mapgen aliasesparamat2015-06-12
| | | | Treegen: Remove alias checks from jungletree generation for speed
* Minimal: Edit mapgen aliases. Use blob ore for clay, update other ores. ↵paramat2015-06-09
| | | | Update simple biomes. Cleanup code
>= itemdef.node_box elseif itemdef.drawtype == "fencelike" and not itemdef.selection_box then itemdef.selection_box = { type = "fixed", fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}, } end if itemdef.light_source and itemdef.light_source > core.LIGHT_MAX then itemdef.light_source = core.LIGHT_MAX core.log("warning", "Node 'light_source' value exceeds maximum," .. " limiting to maximum: " ..name) end setmetatable(itemdef, {__index = core.nodedef_default}) core.registered_nodes[itemdef.name] = itemdef elseif itemdef.type == "craft" then setmetatable(itemdef, {__index = core.craftitemdef_default}) core.registered_craftitems[itemdef.name] = itemdef elseif itemdef.type == "tool" then setmetatable(itemdef, {__index = core.tooldef_default}) core.registered_tools[itemdef.name] = itemdef elseif itemdef.type == "none" then setmetatable(itemdef, {__index = core.noneitemdef_default}) else error("Unable to register item: Type is invalid: " .. dump(itemdef)) end -- Flowing liquid uses param2 if itemdef.type == "node" and itemdef.liquidtype == "flowing" then itemdef.paramtype2 = "flowingliquid" end -- BEGIN Legacy stuff if itemdef.cookresult_itemstring ~= nil and itemdef.cookresult_itemstring ~= "" then core.register_craft({ type="cooking", output=itemdef.cookresult_itemstring, recipe=itemdef.name, cooktime=itemdef.furnace_cooktime }) end if itemdef.furnace_burntime ~= nil and itemdef.furnace_burntime >= 0 then core.register_craft({ type="fuel", recipe=itemdef.name, burntime=itemdef.furnace_burntime }) end -- END Legacy stuff itemdef.mod_origin = core.get_current_modname() or "??" -- Disable all further modifications getmetatable(itemdef).__newindex = {} --core.log("Registering item: " .. itemdef.name) core.registered_items[itemdef.name] = itemdef core.registered_aliases[itemdef.name] = nil register_item_raw(itemdef) end function core.unregister_item(name) if not core.registered_items[name] then core.log("warning", "Not unregistering item " ..name.. " because it doesn't exist.") return end -- Erase from registered_* table local type = core.registered_items[name].type if type == "node" then core.registered_nodes[name] = nil elseif type == "craft" then core.registered_craftitems[name] = nil elseif type == "tool" then core.registered_tools[name] = nil end core.registered_items[name] = nil unregister_item_raw(name) end function core.register_node(name, nodedef) nodedef.type = "node" core.register_item(name, nodedef) end function core.register_craftitem(name, craftitemdef) craftitemdef.type = "craft" -- BEGIN Legacy stuff if craftitemdef.inventory_image == nil and craftitemdef.image ~= nil then craftitemdef.inventory_image = craftitemdef.image end -- END Legacy stuff core.register_item(name, craftitemdef) end function core.register_tool(name, tooldef) tooldef.type = "tool" tooldef.stack_max = 1 -- BEGIN Legacy stuff if tooldef.inventory_image == nil and tooldef.image ~= nil then tooldef.inventory_image = tooldef.image end if tooldef.tool_capabilities == nil and (tooldef.full_punch_interval ~= nil or tooldef.basetime ~= nil or tooldef.dt_weight ~= nil or tooldef.dt_crackiness ~= nil or tooldef.dt_crumbliness ~= nil or tooldef.dt_cuttability ~= nil or tooldef.basedurability ~= nil or tooldef.dd_weight ~= nil or tooldef.dd_crackiness ~= nil or tooldef.dd_crumbliness ~= nil or tooldef.dd_cuttability ~= nil) then tooldef.tool_capabilities = { full_punch_interval = tooldef.full_punch_interval, basetime = tooldef.basetime, dt_weight = tooldef.dt_weight, dt_crackiness = tooldef.dt_crackiness, dt_crumbliness = tooldef.dt_crumbliness, dt_cuttability = tooldef.dt_cuttability, basedurability = tooldef.basedurability, dd_weight = tooldef.dd_weight, dd_crackiness = tooldef.dd_crackiness, dd_crumbliness = tooldef.dd_crumbliness, dd_cuttability = tooldef.dd_cuttability, } end -- END Legacy stuff core.register_item(name, tooldef) end function core.register_alias(name, convert_to) if forbidden_item_names[name] then error("Unable to register alias: Name is forbidden: " .. name) end if core.registered_items[name] ~= nil then core.log("warning", "Not registering alias, item with same name" .. " is already defined: " .. name .. " -> " .. convert_to) else --core.log("Registering alias: " .. name .. " -> " .. convert_to) core.registered_aliases[name] = convert_to register_alias_raw(name, convert_to) end end function core.register_alias_force(name, convert_to) if forbidden_item_names[name] then error("Unable to register alias: Name is forbidden: " .. name) end if core.registered_items[name] ~= nil then core.unregister_item(name) core.log("info", "Removed item " ..name.. " while attempting to force add an alias") end --core.log("Registering alias: " .. name .. " -> " .. convert_to) core.registered_aliases[name] = convert_to register_alias_raw(name, convert_to) end function core.on_craft(itemstack, player, old_craft_list, craft_inv) for _, func in ipairs(core.registered_on_crafts) do itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack end return itemstack end function core.craft_predict(itemstack, player, old_craft_list, craft_inv) for _, func in ipairs(core.registered_craft_predicts) do itemstack = func(itemstack, player, old_craft_list, craft_inv) or itemstack end return itemstack end -- Alias the forbidden item names to "" so they can't be -- created via itemstrings (e.g. /give) local name for name in pairs(forbidden_item_names) do core.registered_aliases[name] = "" register_alias_raw(name, "") end -- Deprecated: -- Aliases for core.register_alias (how ironic...) --core.alias_node = core.register_alias --core.alias_tool = core.register_alias --core.alias_craftitem = core.register_alias -- -- Built-in node definitions. Also defined in C. -- core.register_item(":unknown", { type = "none", description = "Unknown Item", inventory_image = "unknown_item.png", on_place = core.item_place, on_secondary_use = core.item_secondary_use, on_drop = core.item_drop, groups = {not_in_creative_inventory=1}, diggable = true, }) core.register_node(":air", { description = "Air (you hacker you!)", inventory_image = "unknown_node.png", wield_image = "unknown_node.png", drawtype = "airlike", paramtype = "light", sunlight_propagates = true, walkable = false, pointable = false, diggable = false, buildable_to = true, floodable = true, air_equivalent = true, drop = "", groups = {not_in_creative_inventory=1}, }) core.register_node(":ignore", { description = "Ignore (you hacker you!)", inventory_image = "unknown_node.png", wield_image = "unknown_node.png", drawtype = "airlike", paramtype = "none", sunlight_propagates = false, walkable = false, pointable = false, diggable = false, buildable_to = true, -- A way to remove accidentally placed ignores air_equivalent = true, drop = "", groups = {not_in_creative_inventory=1}, }) -- The hand (bare definition) core.register_item(":", { type = "none", groups = {not_in_creative_inventory=1}, }) function core.override_item(name, redefinition) if redefinition.name ~= nil then error("Attempt to redefine name of "..name.." to "..dump(redefinition.name), 2) end if redefinition.type ~= nil then error("Attempt to redefine type of "..name.." to "..dump(redefinition.type), 2) end local item = core.registered_items[name] if not item then error("Attempt to override non-existent item "..name, 2) end for k, v in pairs(redefinition) do rawset(item, k, v) end register_item_raw(item) end core.callback_origins = {} function core.run_callbacks(callbacks, mode, ...) assert(type(callbacks) == "table") local cb_len = #callbacks if cb_len == 0 then if mode == 2 or mode == 3 then return true elseif mode == 4 or mode == 5 then return false end end local ret = nil for i = 1, cb_len do local origin = core.callback_origins[callbacks[i]] if origin then core.set_last_run_mod(origin.mod) --print("Running " .. tostring(callbacks[i]) .. -- " (a " .. origin.name .. " callback in " .. origin.mod .. ")") else --print("No data associated with callback") end local cb_ret = callbacks[i](...) if mode == 0 and i == 1 then ret = cb_ret elseif mode == 1 and i == cb_len then ret = cb_ret elseif mode == 2 then if not cb_ret or i == 1 then ret = cb_ret end elseif mode == 3 then if cb_ret then return cb_ret end ret = cb_ret elseif mode == 4 then if (cb_ret and not ret) or i == 1 then ret = cb_ret end elseif mode == 5 and cb_ret then return cb_ret end end return ret end -- -- Callback registration -- local function make_registration() local t = {} local registerfunc = function(func) t[#t + 1] = func core.callback_origins[func] = { mod = core.get_current_modname() or "??", name = debug.getinfo(1, "n").name or "??" } --local origin = core.callback_origins[func] --print(origin.name .. ": " .. origin.mod .. " registering cbk " .. tostring(func)) end return t, registerfunc end local function make_registration_reverse() local t = {} local registerfunc = function(func) table.insert(t, 1, func) core.callback_origins[func] = { mod = core.get_current_modname() or "??", name = debug.getinfo(1, "n").name or "??" } --local origin = core.callback_origins[func] --print(origin.name .. ": " .. origin.mod .. " registering cbk " .. tostring(func)) end return t, registerfunc end local function make_registration_wrap(reg_fn_name, clear_fn_name) local list = {} local orig_reg_fn = core[reg_fn_name] core[reg_fn_name] = function(def) local retval = orig_reg_fn(def) if retval ~= nil then if def.name ~= nil then list[def.name] = def else list[retval] = def end end return retval end local orig_clear_fn = core[clear_fn_name] core[clear_fn_name] = function() for k in pairs(list) do list[k] = nil end return orig_clear_fn() end return list end core.registered_on_player_hpchanges = { modifiers = { }, loggers = { } } function core.registered_on_player_hpchange(player, hp_change) local last = false for i = #core.registered_on_player_hpchanges.modifiers, 1, -1 do local func = core.registered_on_player_hpchanges.modifiers[i] hp_change, last = func(player, hp_change) if type(hp_change) ~= "number" then local debuginfo = debug.getinfo(func) error("The register_on_hp_changes function has to return a number at " .. debuginfo.short_src .. " line " .. debuginfo.linedefined) end if last then break end end for i, func in ipairs(core.registered_on_player_hpchanges.loggers) do func(player, hp_change) end return hp_change end function core.register_on_player_hpchange(func, modifier) if modifier then core.registered_on_player_hpchanges.modifiers[#core.registered_on_player_hpchanges.modifiers + 1] = func else core.registered_on_player_hpchanges.loggers[#core.registered_on_player_hpchanges.loggers + 1] = func end core.callback_origins[func] = { mod = core.get_current_modname() or "??", name = debug.getinfo(1, "n").name or "??" } end core.registered_biomes = make_registration_wrap("register_biome", "clear_registered_biomes") core.registered_ores = make_registration_wrap("register_ore", "clear_registered_ores") core.registered_decorations = make_registration_wrap("register_decoration", "clear_registered_decorations") core.registered_on_chat_messages, core.register_on_chat_message = make_registration() core.registered_globalsteps, core.register_globalstep = make_registration() core.registered_playerevents, core.register_playerevent = make_registration() core.registered_on_shutdown, core.register_on_shutdown = make_registration() core.registered_on_punchnodes, core.register_on_punchnode = make_registration() core.registered_on_placenodes, core.register_on_placenode = make_registration() core.registered_on_dignodes, core.register_on_dignode = make_registration() core.registered_on_generateds, core.register_on_generated = make_registration() core.registered_on_newplayers, core.register_on_newplayer = make_registration() core.registered_on_dieplayers, core.register_on_dieplayer = make_registration() core.registered_on_respawnplayers, core.register_on_respawnplayer = make_registration() core.registered_on_prejoinplayers, core.register_on_prejoinplayer = make_registration() core.registered_on_joinplayers, core.register_on_joinplayer = make_registration() core.registered_on_leaveplayers, core.register_on_leaveplayer = make_registration() core.registered_on_player_receive_fields, core.register_on_player_receive_fields = make_registration_reverse() core.registered_on_cheats, core.register_on_cheat = make_registration() core.registered_on_crafts, core.register_on_craft = make_registration() core.registered_craft_predicts, core.register_craft_predict = make_registration() core.registered_on_protection_violation, core.register_on_protection_violation = make_registration() core.registered_on_item_eats, core.register_on_item_eat = make_registration() core.registered_on_punchplayers, core.register_on_punchplayer = make_registration() -- -- Compatibility for on_mapgen_init() -- core.register_on_mapgen_init = function(func) func(core.get_mapgen_params()) end