diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..2b80fce --- /dev/null +++ b/.travis.yml @@ -0,0 +1,12 @@ +language: generic +sudo: false +addons: + apt: + packages: + - luarocks +before_install: + - luarocks install --local luacheck +script: +- $HOME/.luarocks/bin/luacheck --no-color mods/ +notifications: + email: true \ No newline at end of file diff --git a/blends/CharacterCubic.blend b/blends/CharacterCubic.blend new file mode 100644 index 0000000..6701ed4 Binary files /dev/null and b/blends/CharacterCubic.blend differ diff --git a/blends/character.blend b/blends/character.blend deleted file mode 100644 index fee24cd..0000000 Binary files a/blends/character.blend and /dev/null differ diff --git a/blends/character1.blend b/blends/character1.blend deleted file mode 100644 index 8e49af2..0000000 Binary files a/blends/character1.blend and /dev/null differ diff --git a/blends/character2.blend b/blends/character2.blend deleted file mode 100644 index 689e356..0000000 Binary files a/blends/character2.blend and /dev/null differ diff --git a/blends/combat.blend b/blends/combat.blend new file mode 100644 index 0000000..600416e Binary files /dev/null and b/blends/combat.blend differ diff --git a/blends/combat_high_tree_model.blend b/blends/combat_high_tree_model.blend new file mode 100644 index 0000000..9423751 Binary files /dev/null and b/blends/combat_high_tree_model.blend differ diff --git a/blends/combat_low_plant.blend b/blends/combat_low_plant.blend new file mode 100644 index 0000000..cd3059a Binary files /dev/null and b/blends/combat_low_plant.blend differ diff --git a/mods/atmos/init.lua b/mods/atmos/init.lua index 495752a..f4bbb63 100644 --- a/mods/atmos/init.lua +++ b/mods/atmos/init.lua @@ -12,15 +12,7 @@ minetest.register_chatcommand("weather", { return false, "You are not allowed to control the weather, you scrub. \n \n This incident WILL be reported." end - atmos.current_weather = 0 + param - - --local player = minetest.get_player_by_name(name) - - --player:set_sky("#000000", "skybox", {"core_glass.png", "core_glass.png", "core_glass.png", "core_glass.png", "core_glass.png", "core_glass.png"}, false, true) - - --player:override_day_night_ratio(0) - - --atmos.set_skybox(player) + atmos.current_weather = 0 + param -- somehow it performs tonumber() on it's own? return true, "Current weather updated." end, diff --git a/mods/combat/init.lua b/mods/combat/init.lua new file mode 100644 index 0000000..9063f55 --- /dev/null +++ b/mods/combat/init.lua @@ -0,0 +1,140 @@ +local battlefields = {} + +local active_battlefields = {} + +local function create_battlefield(name, top, side, bottom) + battlefields[name] = { + visual = "mesh", + mesh = "battlefield.x", + textures = { + top .. "^core_darken_circle.png", + side .. "^core_darken.png^core_darken_circle.png", + bottom .. "^core_darken.png^core_darken.png^core_darken_circle.png" + }, + visual_size = {x=10, y=10}, + physical = true, + collisionbox = {-7.5, -0.5, -8.5, 8.5, 0.5, 7.5}, + selectionbox = {-7.5, -0.5, -8.5, 8.5, 0.5, 7.5}, + } + + minetest.register_entity("combat:battlefield_" .. name, battlefields[name]) +end + +local high_tree = { + visual = "mesh", + mesh = "combat_high_tree_model.b3d", + visual_size = {x=10, y=10}, + use_texture_alpha = true, +} + +minetest.register_entity("combat:tree_cover", high_tree) + +local low_plant = { + visual = "mesh", + mesh = "combat_low_plant.b3d", + backface_culling = false, + visual_size = {x=10, y=10}, +} + +minetest.register_entity("combat:plant_cover", low_plant) + +local function battlefield_generator(battle_id, biome) -- battle_id refers entirely to the name of the person or creature that initiated the round + local natural_low + local natural_high + local low_chance = 0 + local high_chance = 0 + + if biome == "plains" then + natural_low = "core_long_grass_2.png" + low_chance = 7 + natural_high = "non_acacia" + high_chance = 30 + end + + active_battlefields[battle_id] = {} + active_battlefields[battle_id].biome = biome + + for x=1, 16 do + active_battlefields[battle_id][x] = {} -- fucks given. 0 + for y=1, 16 do + active_battlefields[battle_id][x][y] = {} + + active_battlefields[battle_id][x][y].model = "air" + active_battlefields[battle_id][x][y].texture = "air" + + if math.random(1, low_chance) == 2 then + active_battlefields[battle_id][x][y].model = "combat:plant_cover" + active_battlefields[battle_id][x][y].texture = natural_low + end + + if math.random(1, high_chance) == 2 then + active_battlefields[battle_id][x][y].model = "combat:tree_cover" + if natural_high == "non_acacia" then + local randr = math.random(1, 3) + if randr == 1 then + active_battlefields[battle_id][x][y].texture = "combat_oak.png" + elseif randr == 2 then + active_battlefields[battle_id][x][y].texture = "combat_birch.png" + else + active_battlefields[battle_id][x][y].texture = "combat_cherry.png" + end + end + end + + + end + end + +end + +local function destroy_battlefield(pos) + +end + +local function render_battlefield(battle_id, pos) + -- todo, destroy old map here when done or re-rendering instead of abusing /clearobjects + + -- we want nice round numbers not shitty floating points + local px = math.floor(pos.x) + local py = math.floor(pos.y) + local pz = math.floor(pos.z) + + minetest.add_entity({x=px, y=py, z=pz}, "combat:battlefield_" .. active_battlefields[battle_id].biome) + + for x=1, 16 do -- offset entity positions by uh -8 on x, and y * -1 + for y=1, 16 do + if active_battlefields[battle_id][x][y].model ~= "air" then + minetest.add_entity({x=(px - 8) + x, y=py, z=(pz - 9) + y}, active_battlefields[battle_id][x][y].model) + local texel = minetest.get_objects_inside_radius({x=(px - 8) + x, y=py, z=(pz - 9) + y}, 0.05) + texel[1]:set_properties({ + textures = { + active_battlefields[battle_id][x][y].texture + } + }) + texel[1]:set_yaw((90*(math.pi/180))*math.random(1,4)) + end + end + end + +end + +create_battlefield("plains", "core_grass.png", "core_dirt.png^core_grass_side.png", "core_dirt.png") + +minetest.register_chatcommand("test_battle", { + + description = "generates a test battlefield", + param = "lol k", + func = function(name, param) + + battlefield_generator(name .. "_testing", "plains") + + local player = minetest.get_player_by_name(name) + + local pos = player:get_pos() + + render_battlefield(name .. "_testing", pos) + + return true, "Battlefield generated." + end, + +}) \ No newline at end of file diff --git a/mods/combat/logic.txt b/mods/combat/logic.txt new file mode 100644 index 0000000..b56e0bf --- /dev/null +++ b/mods/combat/logic.txt @@ -0,0 +1,39 @@ +I'm writing this so I can get things logically sorted when working through this monster of a component: + +Initiate Battlefield with objects low and high. +Dispatch entities to render on the battlefield. +Invite players that are partied with the user. +Wait until party invites expire (30 sec or 2 minutes) +Grab player skin data (and render this to the models) + Make an API for wardrobe to return this information? +Hide any player nametags. +Randomly choose attacking order except for the first person to start it. + +Battle loop: + +Build the new HUD elements that are restricted to combat only. + Check for player inputs here, do not move the player. + Allow the player to use two camera modes, free mode, and over the shoulder. + Display options that can be used. + Check for unlocked skills and hide locked ones. (They can view it in their codex later.) + If choosing to attack a target, a HUD element shows the player to attack. AoE attacks uses an entity renderer. + The AoE and freeform targeter will point at the square, and have your players head visible over the top of it. + Users in stealth are NOT shown on the HUD. + If melee, an AP cost is shown to move in range of the target. +Wait for all connected players to perform their actions, any disconnected players are considered dead. +Perform skills and player movements in the order defined at init. + Players move first, then perform the skills. + Skills must check for in cover, but AP will still be consumed when moving. + Skills also check for dodge percentages and any active stealth users. AP will also still be consumed when performing these. + Untargeted AoE attacks will hit any users that are actively using stealth and dodging. + Cycle through the turns until nobody is left player wise. + AI entities in PvE will always attack last, even if they initiate the battle. + AIs attacks will always be in a random order, unlike players. + AIs also have to perform the same skill checks as players do. + If an attack hits, damage processing occurs here: + Resistances to light, dark, radiation, fire, ice, biological, electrical, plasma, laser and physical are done here. + Buffs and passives are added onto base resistances last. + Players taking damage will emit a hit noise, and display HP lost over their heads. + Players or AI that are killed will be removed from the battle immediately. + If partied players are the only ones surviving, then end the battle, and grant XP to the survivors and end the battle loop. +Return to battle loop start: \ No newline at end of file diff --git a/mods/combat/models/battlefield.x b/mods/combat/models/battlefield.x new file mode 100644 index 0000000..5b18ec5 --- /dev/null +++ b/mods/combat/models/battlefield.x @@ -0,0 +1,123 @@ +xof 0303txt 0032 + +Frame Root { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000,-0.000000, 1.000000, 0.000000, + 0.000000, 1.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000;; + } + Frame Cube { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 1.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000;; + } + Mesh { // Cube mesh + 24; + 8.500001; 7.500000;-0.500000;, + 8.500001;-8.500000;-0.500000;, + -7.500001;-8.499998;-0.500000;, + -7.499997; 7.500003;-0.500000;, + 8.500004; 7.499996; 0.500000;, + -7.499999; 7.500001; 0.500000;, + -7.500003;-8.499997; 0.500000;, + 8.499995;-8.500005; 0.500000;, + 8.500001; 7.500000;-0.500000;, + 8.500004; 7.499996; 0.500000;, + 8.499995;-8.500005; 0.500000;, + 8.500001;-8.500000;-0.500000;, + 8.500001;-8.500000;-0.500000;, + 8.499995;-8.500005; 0.500000;, + -7.500003;-8.499997; 0.500000;, + -7.500001;-8.499998;-0.500000;, + -7.500001;-8.499998;-0.500000;, + -7.500003;-8.499997; 0.500000;, + -7.499999; 7.500001; 0.500000;, + -7.499997; 7.500003;-0.500000;, + 8.500004; 7.499996; 0.500000;, + 8.500001; 7.500000;-0.500000;, + -7.499997; 7.500003;-0.500000;, + -7.499999; 7.500001; 0.500000;; + 6; + 4;3,2,1,0;, + 4;7,6,5,4;, + 4;11,10,9,8;, + 4;15,14,13,12;, + 4;19,18,17,16;, + 4;23,22,21,20;; + MeshNormals { // Cube normals + 6; + 0.000000; 0.000000;-1.000000;, + 0.000000;-0.000000; 1.000000;, + 1.000000;-0.000000; 0.000001;, + -0.000000;-1.000000;-0.000002;, + -1.000000; 0.000000;-0.000002;, + 0.000000; 1.000000; 0.000003;; + 6; + 4;0,0,0,0;, + 4;1,1,1,1;, + 4;2,2,2,2;, + 4;3,3,3,3;, + 4;4,4,4,4;, + 4;5,5,5,5;; + } // End of Cube normals + MeshTextureCoords { // Cube UV coordinates + 24; + -7.500000;-7.500000;, + -7.500000; 8.500000;, + 8.500000; 8.500000;, + 8.500000;-7.500000;, + 8.000000;-8.000000;, + -8.000000;-8.000000;, + -8.000000; 8.000000;, + 8.000000; 8.000000;, + 8.937500; 1.000000;, + 8.937500; 0.000000;, + -7.062500; 0.000000;, + -7.062500; 1.000000;, + 9.000000; 1.000000;, + 9.000000; 0.000000;, + -7.000000; 0.000000;, + -7.000000; 1.000000;, + 9.000000; 1.000000;, + 9.000000; 0.000000;, + -7.000000; 0.000000;, + -7.000000; 1.000000;, + -7.062500; 0.000000;, + -7.062500; 1.000000;, + 8.937500; 1.000000;, + 8.937500; 0.000000;; + } // End of Cube UV coordinates + MeshMaterialList { // Cube material list + 3; + 6; + 2, + 0, + 1, + 1, + 1, + 1; + Material Top { + 0.640000; 0.640000; 0.640000; 1.000000;; + 96.078431; + 0.500000; 0.500000; 0.500000;; + 0.000000; 0.000000; 0.000000;; + } + Material Side { + 0.640000; 0.640000; 0.640000; 1.000000;; + 96.078431; + 0.500000; 0.500000; 0.500000;; + 0.000000; 0.000000; 0.000000;; + } + Material Bottom { + 0.640000; 0.640000; 0.640000; 1.000000;; + 96.078431; + 0.500000; 0.500000; 0.500000;; + 0.000000; 0.000000; 0.000000;; + } + } // End of Cube material list + } // End of Cube mesh + } // End of Cube +} // End of Root diff --git a/mods/combat/models/combat_high_tree_model.b3d b/mods/combat/models/combat_high_tree_model.b3d new file mode 100644 index 0000000..4719930 Binary files /dev/null and b/mods/combat/models/combat_high_tree_model.b3d differ diff --git a/mods/combat/models/combat_low_plant.b3d b/mods/combat/models/combat_low_plant.b3d new file mode 100644 index 0000000..faac770 Binary files /dev/null and b/mods/combat/models/combat_low_plant.b3d differ diff --git a/mods/combat/textures/combat_acacia.png b/mods/combat/textures/combat_acacia.png new file mode 100644 index 0000000..f225cd9 Binary files /dev/null and b/mods/combat/textures/combat_acacia.png differ diff --git a/mods/combat/textures/combat_birch.png b/mods/combat/textures/combat_birch.png new file mode 100644 index 0000000..56886af Binary files /dev/null and b/mods/combat/textures/combat_birch.png differ diff --git a/mods/combat/textures/combat_cherry.png b/mods/combat/textures/combat_cherry.png new file mode 100644 index 0000000..5be835f Binary files /dev/null and b/mods/combat/textures/combat_cherry.png differ diff --git a/mods/combat/textures/combat_oak.png b/mods/combat/textures/combat_oak.png new file mode 100644 index 0000000..7251ada Binary files /dev/null and b/mods/combat/textures/combat_oak.png differ diff --git a/mods/combat/textures/combat_pine.png b/mods/combat/textures/combat_pine.png new file mode 100644 index 0000000..f609373 Binary files /dev/null and b/mods/combat/textures/combat_pine.png differ diff --git a/mods/core/init.lua b/mods/core/init.lua index 425de8b..20df159 100644 --- a/mods/core/init.lua +++ b/mods/core/init.lua @@ -98,12 +98,11 @@ minetest.register_on_newplayer(give_initial_stuff.give) local mob = { visual = "mesh", - mesh = "entity.x", + mesh = "lmao.b3d", + use_texture_alpha = true, textures = { - }, - visual_size = {x=1, y=1}, - anim_type = 1, + visual_size = {x=10, y=10}, } local mob_anim = {} @@ -129,7 +128,7 @@ function mob:on_rightclick(clicker) end - self.object:set_animation(mob_anim[self.anim_type], 30, 0, false) + --self.object:set_animation(mob_anim[self.anim_type], 30, 0, false) end minetest.register_entity("core:tester", mob) diff --git a/mods/core/textures/core_darken.png b/mods/core/textures/core_darken.png new file mode 100644 index 0000000..299a965 Binary files /dev/null and b/mods/core/textures/core_darken.png differ diff --git a/mods/core/textures/core_darken_circle.png b/mods/core/textures/core_darken_circle.png new file mode 100644 index 0000000..c6a01d5 Binary files /dev/null and b/mods/core/textures/core_darken_circle.png differ diff --git a/mods/wardrobe/init.lua b/mods/wardrobe/init.lua index e18eb78..ad7d627 100644 --- a/mods/wardrobe/init.lua +++ b/mods/wardrobe/init.lua @@ -1108,7 +1108,7 @@ function wardrobe.load_user_data(player) print ("[Wardrobe] " .. pname .. " has a 64x32 type skin!") - elseif w / h == 1 then -- this is a square 64x64 type skin; + else -- this is a square 64x64 type skin; wardrobe.player_skin_size[pname] = 64 diff --git a/mods/wiki/LICENSE.md b/mods/wiki/LICENSE.md deleted file mode 100644 index 9f2b419..0000000 --- a/mods/wiki/LICENSE.md +++ /dev/null @@ -1,25 +0,0 @@ - -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/wiki/README.md b/mods/wiki/README.md deleted file mode 100644 index 6bc3d94..0000000 --- a/mods/wiki/README.md +++ /dev/null @@ -1,27 +0,0 @@ - -Wiki Mod -======== - -Another random mod by me. - -This mod provides a "Wiki" block. You can create and edit wiki pages with it. - -The pages are saved as `/wiki/`. All spaces in the page -name are converted to underscores, and all other characters not in -`[A-Za-z0-9-]` are converted to hex notation `%XX`. - -The text can contain hyperlinks in the form of `[link text]` to other pages. -Such links are added at the right of the form. - -You can craft a "Wiki block" by putting 9 bookshelves in the crafting grid. - -Only players with the `wiki` priv can create/edit pages. - - -## Installing - -Install by following the instructions in the [Installing mods][install] -article on the Minetest wiki, then add `wiki` to the `secure.trusted_mods` -setting in `minetest.conf`. - -[install]: https://wiki.minetest.net/Installing_mods diff --git a/mods/wiki/bower.json b/mods/wiki/bower.json deleted file mode 100644 index 43e7771..0000000 --- a/mods/wiki/bower.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "wiki", - "description": "Online collaborative documentation browser.", - "keywords": [ - "wiki", - "doc", - "documentation", - "browser" - ], - "homepage": "https://github.com/kaeza/minetest-wiki.git", - "screenshots": [ - "https://dl.dropboxusercontent.com/u/100008207/minetest/mods/Kaeza-minetest-wiki.jpg" - ], - "authors": [ - "Diego Martínez " - ], - "license": "BSD 2-Clause" -} diff --git a/mods/wiki/depends.txt b/mods/wiki/depends.txt deleted file mode 100644 index f5bd37c..0000000 --- a/mods/wiki/depends.txt +++ /dev/null @@ -1 +0,0 @@ -core diff --git a/mods/wiki/description.txt b/mods/wiki/description.txt deleted file mode 100644 index eb51ebb..0000000 --- a/mods/wiki/description.txt +++ /dev/null @@ -1 +0,0 @@ -This mod provides a "Wiki" block. You can create and edit wiki pages with it. diff --git a/mods/wiki/init.lua b/mods/wiki/init.lua deleted file mode 100644 index 97ae93b..0000000 --- a/mods/wiki/init.lua +++ /dev/null @@ -1,19 +0,0 @@ - -local MODPATH = minetest.get_modpath("wiki") - -wikilib = { } - -local ie = minetest.request_insecure_environment() -assert(ie, "you must allow `wiki` in `secure.trusted_mods`") - -local private = { } - -private.open = ie.io.open -private.mkdir = ie.core.mkdir - -loadfile(MODPATH.."/strfile.lua")(private) -loadfile(MODPATH.."/wikilib.lua")(private) -loadfile(MODPATH.."/internal.lua")(private) -loadfile(MODPATH.."/plugins.lua")(private) - -loadfile(MODPATH.."/plugin_forum.lua")(private) diff --git a/mods/wiki/internal.lua b/mods/wiki/internal.lua deleted file mode 100644 index 09f5e05..0000000 --- a/mods/wiki/internal.lua +++ /dev/null @@ -1,164 +0,0 @@ - -wikilib.internal_pages = { ----------------------------------------------------------------- ----------------------------------------------------------------- -[".Intro"] = [[ -Thank you for using the Wiki Mod. - -This is a mod that allows one to edit pages via a block. You -can use it to document interesting places in a server, to provide -a place to post griefing reports, or any kind of text you want. - -To create a new page, enter the name in the field at the top of the -form, then click "Go". If the page already exists, it's contents will -be displayed. Edit the page as you see fit, then click on "Save" to -write the changes to disk. - -Please note that page names starting with a dot ('.') are reserved -for internal topics such as this one. Users cannot edit/create such -pages from the mod interface. - -See also: - * [.Tags] - * [.License] - * [.Help Index] -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".Tags"] = [[ -The wiki supports some special tags. - -You can place hyperlinks to other pages in the Wiki, by surrounding -text in square brackets (for example, [.Intro]). Such links will -appear at the bottom of the form. - -See also: - * [.Intro] -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".License"] = [[ - -Copyright (c) 2013, Diego Martínez -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - - * Go to [.Intro]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".NotFound_Internal"] = [[ -The specified internal page cannot be found. You may want to: - - * Back to [Main]. - * Go to [.Intro]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".NotFound"] = [[ -This page does not exist yet. - - * Back to [Main]. - * Go to [.Help Index]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".BadPageName"] = [[ -The page name you entered is wrong. See [.Page Names] for more info. - - * Back to [Main]. - * Go to [.Help Index]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".Forbidden"] = [[ -You have not enough privileges to view this page. - - * Back to [Main]. - * Go to [.Help Index]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".Help Index"] = [[ - * [.Intro] - * [.Plugins] - * [.Page Names] - * [.User Pages] - - * Back to [Main]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".Page Names"] = [[ -Page names must be in any of the following formats: - - Display global page . - : - Display page from your user space. must be a number between - 0 and 9. See [.User Pages] for more info. - : - This is equivalent to ":0" (shows your private page). - :: - Display page "Page Name" from the specified user's space. Note that page - number 0 is never accessible this way, even if you specify yourself as - . - - * Back to [.Help Index]. - * Back to [Main]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".User Pages"] = [[ -Users can have up to 10 pages in their "user space", numbered 0-9. These pages -are accessed through the special page names ":", and "::". Page 0 -is your private page. This page is not accessible to anyone but you. You can -use it to write down secret locations, etc. - - * Back to [.Help Index]. - * Back to [Main]. -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".My Pages"] = [[ - * Profile: [:profile] - * Private page: [:0] - * Pages: [:1] [:2] [:3] [:4] [:5] [:6] [:7] [:8] [:9] -]], ----------------------------------------------------------------- ----------------------------------------------------------------- -[".Plugins"] = function() - local page = "Installed Plugins:\n\n" - for _,plugin in ipairs(wikilib.registered_plugins) do - page = page.." * "..plugin.description.."\n" - end - page = (page - .. "\n" - .. " * Back to [.Help Index].\n" - .. " * Back to [Main].\n" - ) - return page -end, ----------------------------------------------------------------- ----------------------------------------------------------------- -} diff --git a/mods/wiki/mod.conf b/mods/wiki/mod.conf deleted file mode 100644 index b234aa2..0000000 --- a/mods/wiki/mod.conf +++ /dev/null @@ -1 +0,0 @@ -name = wiki diff --git a/mods/wiki/plugin_forum.lua b/mods/wiki/plugin_forum.lua deleted file mode 100644 index e8eae29..0000000 --- a/mods/wiki/plugin_forum.lua +++ /dev/null @@ -1,147 +0,0 @@ - -local private = ... - -local BASEPATH = wikilib.paths.plugins.."/ml" - -private.mkdir(BASEPATH) - -local ML_DB_FILE = BASEPATH.."/posts.dat" - -local posts = { } - -local function load_posts() - local f = private.open(ML_DB_FILE, "r") - if not f then return false end - local list = { } - local post = { text="" } - for line in f:lines() do - if line:len() == 0 then - if post.who and post.date then - table.insert(list, post) - post = { text="" } - end - elseif line:sub(1, 5) == "From:" then - post.who = line:sub(6):trim() - elseif line:sub(1, 5) == "Date:" then - post.date = line:sub(6):trim() - else - post.text = post.text..line.."\n" - end - end - if post.who and post.date then - table.insert(list, post) - post = { text="" } - end - f:close() - posts = list - return true -end - -local function save_posts() - local f = private.open(ML_DB_FILE, "w") - if not f then return false end - for _, post in ipairs(posts) do - f:write("From: "..post.who.."\n") - f:write("Date: "..post.date.."\n") - for _, line in ipairs(post.text:split("\n")) do - if line:len() == 0 then - f:write(" \n") - elseif (line:sub(1, 5) == "From:") - or (line:sub(1, 5) == "Date:") then - f:write(" "..line.."\n") - else - f:write(line.."\n") - end - end - f:write("\n") - end - f:close() - return true -end - -local player_states = { } - -local BACKLOG = 5 - -local function get_player_state(name) - if not player_states[name] then - player_states[name] = { } - end - return player_states[name] -end - -local SEP = ("-"):rep(64) - -wikilib.register_plugin({ - regex = "^/ml/.*", - description = "Mailing List [/ml/recent]", - load_page = function(entry, player) --> text, allow_save - local state = get_player_state(player) - local what = entry:match("^/ml/(.*)") - if not what then - what = "recent" - end - what = what:lower() - if what == "recent" then - local text = "Recent Posts:\n\n"..SEP.."\n" - for i = #posts - BACKLOG, #posts do - local p = posts[i] - if p then - local nl = ((p.text:sub(-1) == "\n") and "" or "\n") - text = (text - .. "[/ml/"..i.."] \n" - .. "From: "..p.who.."\n" - .. "Date: "..p.date.."\n" - .. p.text..nl - .. SEP.."\n" - ) - end - end - text = text.."\n * [/ml/Post] a new message" - text = text.."\n * Back to [Main]" - return text, false - elseif what:match("[0-9]+") then - local n = tonumber(what) - local text - if posts[n] then - local nl = ((posts[n].text:sub(-1) == "\n") and "" or "\n") - text = ("Post #"..n.."\n" - .. "From: "..posts[n].who.." [:"..posts[n].who..":profile]\n" - .. "Date: "..posts[n].date.."\n" - .. posts[n].text..nl - .. "\n" - ) - else - text = "No such post.\n\n" - end - text = text.."\n * [/ml/Post] a new message" - text = text.."\n * View [/ml/Recent] messages" - text = text.."\n * Back to [Main]" - return text, false - elseif what == "post" then - return "Subject:\n\n", true - end - return "Wrong request.", false - end, - save_page = function(entry, player, text) --> bool - local state = get_player_state(player) - local what = entry:match("^/ml/(.*)") - if not what then - what = "post" - end - what = what:lower() - if what == "post" then - posts[#posts + 1] = { - who = player, - date = os.date("%Y-%m-%d %H:%M:%S"), - text = text, - } - save_posts() - return "/ml/recent" - end - return true - end, -}) - - -load_posts() diff --git a/mods/wiki/plugins.lua b/mods/wiki/plugins.lua deleted file mode 100644 index 50113ef..0000000 --- a/mods/wiki/plugins.lua +++ /dev/null @@ -1,36 +0,0 @@ - ---[[ -plugindef = { - regex = "^/foo/bar/.*", - description = "My Awesome Plugin", - ^ Can contain links - load_page = func(entry, player), - ^ Must return text, allow_save - save_page = func(entry, player), - ^ Must return bool -} -]] - -local plugin_defs = { } - -function wikilib.register_plugin(def) - plugin_defs[#plugin_defs + 1] = def -end - -local function do_handle(what, entry, player, text) - for _,pi in ipairs(plugin_defs) do - if entry:match(pi.regex) then - return pi[what](entry, player, text) - end - end -end - -function wikilib.plugin_handle_load(entry, player) - return do_handle("load_page", entry, player) -end - -function wikilib.plugin_handle_save(entry, player, text) - return do_handle("save_page", entry, player, text) -end - -wikilib.registered_plugins = plugin_defs diff --git a/mods/wiki/screenshot.png b/mods/wiki/screenshot.png deleted file mode 100644 index 4cca352..0000000 Binary files a/mods/wiki/screenshot.png and /dev/null differ diff --git a/mods/wiki/strfile.lua b/mods/wiki/strfile.lua deleted file mode 100644 index b21e0e3..0000000 --- a/mods/wiki/strfile.lua +++ /dev/null @@ -1,28 +0,0 @@ - -strfile = { } - -function strfile.open(s) - return { - _buf = s, - _pos = 1, - _readline = function(self) - if self._pos == nil then - return nil - end - local nl = self._buf:find("\n", self._pos, true) - local line - if nl then - line = self._buf:sub(self._pos, nl - 1) - nl = nl + 1 - else - line = self._buf:sub(self._pos) - end - self._pos = nl - return line - end, - lines = function(self) - return self._readline, self, true - end, - close = function(self) end, - } -end diff --git a/mods/wiki/textures/wiki_wiki_front.png b/mods/wiki/textures/wiki_wiki_front.png deleted file mode 100644 index be945d9..0000000 Binary files a/mods/wiki/textures/wiki_wiki_front.png and /dev/null differ diff --git a/mods/wiki/wikilib.lua b/mods/wiki/wikilib.lua deleted file mode 100644 index 9e193db..0000000 --- a/mods/wiki/wikilib.lua +++ /dev/null @@ -1,248 +0,0 @@ - -local private = ... - -local WP = minetest.get_worldpath().."/wiki" - -wikilib.paths = { } -wikilib.paths.root = WP -wikilib.paths.pages = WP.."/pages" -wikilib.paths.plugins = WP.."/plugins" -wikilib.paths.users = WP.."/users" - -local WIKI_FORMNAME = "wiki:wiki" - -private.mkdir(WP) -private.mkdir(wikilib.paths.pages) -private.mkdir(wikilib.paths.plugins) -private.mkdir(wikilib.paths.users) - -local function name_to_filename(name) - - name = name:gsub("[^A-Za-z0-9-]", function(c) - if c == " " then - return "_" - else - return ("%%%02X"):format(c:byte(1)) - end - end) - return name:lower() - -end -wikilib.name_to_filename = name_to_filename - -local function get_page_path(name, player) --> path, is_file, allow_save - - local allow_save = minetest.check_player_privs(player, {wiki=true}) - - if name:sub(1, 1) == "." then - local text = wikilib.internal_pages[name] or wikilib.internal_pages[".NotFound_Internal"] - if type(text) == "function" then - text = text(player) - end - return text, false, false - elseif name:sub(1, 1) == ":" then - if name:match("^:[0-9]?$") then - local n = tonumber(name:sub(2,2)) or 0 - path = "users/"..player.."/page"..n - private.mkdir(wikilib.paths.users.."/"..player) - elseif name == ":profile" then - path = "users/"..player.."/profile" - private.mkdir(wikilib.paths.users.."/"..player) - elseif name:match("^:.-:[0-9]$") then - local user, n = name:match("^:(.-):([0-9])$") - if user:find("..[/\\]") then - return wikilib.internal_pages[".BadPageName"], false, false - end - if (n == "0") and (not minetest.check_player_privs(player, {wiki_admin=true})) then - return wikilib.internal_pages[".Forbidden"], false, false - end - path = "users/"..user.."/page"..n - private.mkdir(WP.."/users/"..user) - allow_save = false - elseif name:match("^:.-:profile$") then - local user = name:match("^:(.-):.*$") - if user:find("..[/\\]") then - return wikilib.internal_pages[".BadPageName"], false, false - end - path = "users/"..user.."/profile" - private.mkdir(WP.."/users/"..user) - allow_save = false - else - return wikilib.internal_pages[".BadPageName"], false, false - end - else - path = "pages/"..name_to_filename(name) - end - - return WP.."/"..path, true, allow_save - -end - -local function find_links(lines) --> links - local links = { } - local links_n = 0 - for _,line in ipairs(lines) do - for link in line:gmatch("%[(.-)%]") do - links_n = links_n + 1 - links[links_n] = link - end - end - return links -end - -local function load_page(name, player) --> text, links, allow_save - local text, allow_save = wikilib.plugin_handle_load(name, player) - if text then - return text, find_links(text:split("\n")), allow_save - end - local path, is_file, allow_save = get_page_path(name, player) - local f - if is_file then - f = private.open(path) - if not f then - f = strfile.open(wikilib.internal_pages[".NotFound"]) - end - else - f = strfile.open(path) - end - local lines = { } - local lines_n = 0 - for line in f:lines() do - lines_n = lines_n + 1 - lines[lines_n] = line - end - f:close() - local text = table.concat(lines, "\n") - local links = find_links(lines) - return text, links, allow_save -end - -local function save_page(name, player, text) - - local ok = wikilib.plugin_handle_save(name, player, text) - if ok then return ok end - - local path, is_file, allow_save = get_page_path(name, player) - - if (not is_file) or (not allow_save) then return end - - local f = private.open(path, "w") - if not f then return end - - f:write(text) - - f:close() - -end - -local esc = minetest.formspec_escape - -function wikilib.get_wiki_page_formspec(player, name) - - if name == "" then name = "Main" end - - local text, links, allow_save = load_page(name, player) - - local buttons, nbuttons = { }, 0 - local bx, by = 12, 1.1 - - for i, link in ipairs(links) do - if i%15 == 0 then - bx = bx + 2 - by = 1.1 - end - link = esc(link) - nbuttons = nbuttons + 1 - buttons[nbuttons] = (("button[%f,%f;2.1,0.5;page_%s;%s]") - :format(bx, by, link, link)) - by = by + 0.65 - end - buttons = table.concat(buttons) - - local toolbar = (allow_save - and "button[-.1,9.2;2.4,1;save;Save]" - or "label[0,9;You are not authorized to edit this page.]") - - return ("size[16,10]" - .. "label[-0.1,0;Page]" - .. "field[1.5,0.1;13,1;page;;"..esc(name).."]" - .. "button[14,0;1,0.5;go;Go]" - .. "button_exit[15,0;1,0.5;close;X]" - .. "textarea[0.2,1.1;12,9;text;"..esc(name)..";"..esc(text).."]" - .. buttons - .. toolbar - ) - -end - -function wikilib.show_wiki_page(player, name) - local fs = wikilib.get_wiki_page_formspec(player, name) - minetest.show_formspec(player, WIKI_FORMNAME, fs) -end - -minetest.register_node("wiki:wiki", { - description = "Wiki", - tiles = { - "core_mese_old.png" - }, - groups = { choppy=3, oddly_breakable_by_hand=2, flammable=3 }, - sounds = mcore.sound_wood, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Wiki") - end, - on_rightclick = function(pos, node, clicker, itemstack) - if clicker then - wikilib.show_wiki_page(clicker:get_player_name(), "Main") - end - end, -}) - -minetest.register_privilege("wiki", { - description = "Allow editing wiki pages in the global space", - give_to_singleplayer = false, -}) - -minetest.register_privilege("wiki_admin", { - description = "Allow editing wiki pages in any space", - give_to_singleplayer = false, -}) - -local BS = "default:bookshelf" -local BSL = { BS, BS, BS } -minetest.register_craft({ - output = "wiki:wiki", - recipe = { BSL, BSL, BSL }, -}) - -function wikilib.handle_formspec(player, formname, fields) - if (not formname) or (formname ~= WIKI_FORMNAME) then return end - if fields.quit or fields.close then return end - local plname = player:get_player_name() - if fields.save then - local r = save_page(fields.page, plname, fields.text) - if type(r) == "string" then - wikilib.show_wiki_page(plname, r) - else - wikilib.show_wiki_page(plname, fields.page) - end - return true - elseif fields.go then - wikilib.show_wiki_page(plname, fields.page) - return true - else - for k in pairs(fields) do - if type(k) == "string" then - local name = k:match("^page_(.*)") - if name then - wikilib.show_wiki_page(plname, name) - return true - end - end - end - end -end - -minetest.register_on_player_receive_fields(function(player, formname, fields) - wikilib.handle_formspec(player, formname, fields) -end)