diff --git a/README.md b/README.md index 3af7f32486..b7a5e70d90 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ There are so many people to list (sorry). Check out the respective mod directori * [aligator](https://github.com/aligator): Improvement of doors * [ryvnf](https://github.com/ryvnf): Explosion mechanics * MysticTempest: Bugfixes +* [bzoss](https://github.com/bzoss): Brewing Stand * Lots of other people: TO BE WRITTEN (see mod directories for details) #### Mod credits (summary) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 2efe56afc4..27998d170d 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -36,17 +36,8 @@ mobs:register_mob("mobs_mc:ghast", { walk_velocity = 1.6, run_velocity = 3.2, drops = { - {name = mobs_mc.items.gunpowder, - chance = 1, - min = 0, - max = 2,}, - -- TODO: drop tear when it's useful - -- ghast tear replaced with gunpowder - --{name = mobs_mc.items.ghast_tear, - {name = mobs_mc.items.gunpowder, - chance = 1, - min = 0, - max = 1,}, + {name = mobs_mc.items.gunpowder, chance = 1, min = 0, max = 2,}, + {name = mobs_mc.items.ghast_tear, chance = 3,min = 0,max = 1,}, }, animation = { stand_speed = 50, walk_speed = 50, run_speed = 50, diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index ef7b702bde..8c0885636a 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -33,6 +33,7 @@ local rabbit = { drops = { {name = mobs_mc.items.rabbit_raw, chance = 1, min = 0, max = 1}, {name = mobs_mc.items.rabbit_hide, chance = 1, min = 0, max = 1}, + {name = mobs_mc.items.rabbit_foot, chance = 10, min = 0, max = 1}, -- TODO: Drop rabbit's foot when it's useful --{name = mobs_mc.items.rabbit_foot, chance = 10, min = 1, max = 1}, }, diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 0b5f52b6b2..1c339cb96e 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -10,10 +10,8 @@ local inventory_lists = {} local show_armor = minetest.get_modpath("mcl_armor") ~= nil local mod_player = minetest.get_modpath("mcl_player") ~= nil --- TODO: Brewing is disabled. Add brewing (uncommented code) when it is implemented properly - -- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs",--[["brew",]]"matr","misc","all"} +local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} for _, f in pairs(builtin_filter_ids) do inventory_lists[f] = {} end @@ -67,11 +65,10 @@ do table.insert(inventory_lists["mobs"], name) nonmisc = true end - -- TODO: add brew - --if def.groups.brewitem then - --table.insert(inventory_lists["brew"], name) - --nonmisc = true - --end + if def.groups.brewitem then + table.insert(inventory_lists["brew"], name) + nonmisc = true + end if def.groups.craftitem then table.insert(inventory_lists["matr"], name) nonmisc = true @@ -160,7 +157,7 @@ trash:set_size("main", 1) local noffset = {} -- numeric tab offset local offset = {} -- string offset: -local boffset = {} -- +local boffset = {} -- local hoch = {} local filtername = {} local bg = {} @@ -182,6 +179,7 @@ next_noffset("blocks") next_noffset("deco") next_noffset("redstone") next_noffset("rail") +next_noffset("brew") next_noffset("misc") next_noffset("nix", true) @@ -193,7 +191,6 @@ next_noffset("food") next_noffset("tools") next_noffset("combat") next_noffset("mobs") ---next_noffset("brew") -- TODO: add brew next_noffset("matr") next_noffset("inv", true) @@ -206,6 +203,7 @@ hoch["blocks"] = "" hoch["deco"] = "" hoch["redstone"] = "" hoch["rail"] = "" +hoch["brew"] = "" hoch["misc"] = "" hoch["nix"] = "" hoch["default"] = "" @@ -213,7 +211,6 @@ hoch["food"] = "_down" hoch["tools"] = "_down" hoch["combat"] = "_down" hoch["mobs"] = "_down" ---hoch["brew"] = "_down" -- TODO: add brew hoch["matr"] = "_down" hoch["inv"] = "_down" @@ -228,26 +225,26 @@ filtername["food"] = S("Foodstuffs") filtername["tools"] = S("Tools") filtername["combat"] = S("Combat") filtername["mobs"] = S("Mobs") ---filtername["brew"] = S("Brewing") -- TODO: add brew +filtername["brew"] = S("Brewing") filtername["matr"] = S("Materials") filtername["inv"] = S("Survival Inventory") local dark_bg = "crafting_creative_bg_dark.png" local function reset_menu_item_bg() - bg["blocks"] = dark_bg - bg["deco"] = dark_bg - bg["redstone"] = dark_bg - bg["rail"] = dark_bg - bg["misc"] = dark_bg - bg["nix"] = dark_bg - bg["food"] = dark_bg - bg["tools"] = dark_bg - bg["combat"] = dark_bg + bg["blocks"] = dark_bg + bg["deco"] = dark_bg + bg["redstone"] = dark_bg + bg["rail"] = dark_bg + bg["misc"] = dark_bg + bg["nix"] = dark_bg + bg["food"] = dark_bg + bg["tools"] = dark_bg + bg["combat"] = dark_bg bg["mobs"] = dark_bg - --bg["brew"] = dark_bg -- TODO: add brew - bg["matr"] = dark_bg - bg["inv"] = dark_bg + bg["brew"] = dark_bg + bg["matr"] = dark_bg + bg["inv"] = dark_bg bg["default"] = dark_bg end @@ -377,7 +374,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz tools = "mcl_core:axe_iron", combat = "mcl_core:sword_gold", mobs = "mobs_mc:cow", - brew = "mcl_potions:potion_water", + brew = "mcl_potions:dragon_breath", matr = "mcl_core:stick", inv = "mcl_chests:chest", } @@ -388,7 +385,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz else bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" end - return + return "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" .. @@ -428,9 +425,8 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz "tooltip[combat;"..F(filtername["combat"]).."]".. tab(name, "mobs") .. "tooltip[mobs;"..F(filtername["mobs"]).."]".. - -- TODO: Add brew - --tab(name, "brew") .. - --"tooltip[brew;"..F(filtername["brew"]).."]".. + tab(name, "brew") .. + "tooltip[brew;"..F(filtername["brew"]).."]".. tab(name, "matr") .. "tooltip[matr;"..F(filtername["matr"]).."]".. tab(name, "inv") .. @@ -504,12 +500,10 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if players[name].page == "mobs" then return end set_inv_page("mobs",player) page = "mobs" - --[[ TODO: add brew elseif fields.brew then if players[name].page == "brew" then return end set_inv_page("brew",player) page = "brew" - ]] elseif fields.matr then if players[name].page == "matr" then return end set_inv_page("matr",player) diff --git a/mods/HUD/mcl_inventory/depends.txt b/mods/HUD/mcl_inventory/depends.txt index fb454b7d11..cf04c75efd 100644 --- a/mods/HUD/mcl_inventory/depends.txt +++ b/mods/HUD/mcl_inventory/depends.txt @@ -3,3 +3,5 @@ mcl_formspec mcl_player? _mcl_autogroup? mcl_armor? +mcl_brewing? +mcl_potions? diff --git a/mods/ITEMS/mcl_brewing/depends.txt b/mods/ITEMS/mcl_brewing/depends.txt new file mode 100755 index 0000000000..73f7dce829 --- /dev/null +++ b/mods/ITEMS/mcl_brewing/depends.txt @@ -0,0 +1,7 @@ +mcl_init +mcl_formspec +mcl_sounds +mcl_potions +mcl_mobitems +mcl_core? +screwdriver? diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua new file mode 100755 index 0000000000..7d0319d6db --- /dev/null +++ b/mods/ITEMS/mcl_brewing/init.lua @@ -0,0 +1,1062 @@ +local S = minetest.get_translator("mcl_brewing_stand") + +local function active_brewing_formspec(fuel_percent, brew_percent) + + return "size[9,8.75]".. + "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. + -- "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory_active.png]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.75;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.75,9,1).. + "list[current_name;fuel;0.5,1.75;1,1;]".. + mcl_formspec.get_itemslot_bg(0.5,1.75,1,1).."image[0.5,1.75;1,1;mcl_brewing_fuel_bg.png]".. + "list[current_name;input;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;stand;4.5,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(4.5,2.5,1,1).."image[4.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. + "list[context;stand;6,2.8;1,1;1]".. + mcl_formspec.get_itemslot_bg(6,2.8,1,1).."image[6,2.8;1,1;mcl_brewing_bottle_bg.png]".. + "list[context;stand;7.5,2.5;1,1;2]".. + mcl_formspec.get_itemslot_bg(7.5,2.5,1,1).."image[7.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. + + "image[2.7,3.33;1.28,0.41;mcl_brewing_burner.png^[lowpart:".. + (100-fuel_percent)..":mcl_brewing_burner_active.png^[transformR270]".. + + "image[2.76,1.4;1,2.15;mcl_brewing_bubbles.png^[lowpart:".. + (brew_percent)..":mcl_brewing_bubbles_active.png]".. + + "listring[current_player;main]".. + "listring[current_name;fuel]".. + "listring[current_name;input]".. + "listring[context;stand]" +end + +local brewing_formspec = "size[9,8.75]".. + "background[-0.19,-0.25;9.5,9.5;mcl_brewing_inventory.png]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.75;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.75,9,1).. + "list[current_name;fuel;0.5,1.75;1,1;]".. + mcl_formspec.get_itemslot_bg(0.5,1.75,1,1).."image[0.5,1.75;1,1;mcl_brewing_fuel_bg.png]".. + "list[current_name;input;2.75,0.5;1,1;]".. + mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. + "list[context;stand;4.5,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(4.5,2.5,1,1).."image[4.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. + "list[context;stand;6,2.8;1,1;1]".. + mcl_formspec.get_itemslot_bg(6,2.8,1,1).."image[6,2.8;1,1;mcl_brewing_bottle_bg.png]".. + "list[context;stand;7.5,2.5;1,1;2]".. + mcl_formspec.get_itemslot_bg(7.5,2.5,1,1).."image[7.5,2.5;1,1;mcl_brewing_bottle_bg.png]".. + + "image[2.7,3.33;1.28,0.41;mcl_brewing_burner.png^[transformR270]".. + "image[2.76,1.4;1,2.15;mcl_brewing_bubbles.png]".. + + "listring[current_player;main]".. + "listring[current_name;fuel]".. + "listring[current_name;input]".. + "listring[context;stand]" + + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + + +local function brewable(inv) + + local ingredient = inv:get_stack("input",1):get_name() + local stands = {} + local stand_size = inv:get_size("stand") + local was_alchemy = {false,false,false} + + for i=1,stand_size do + + local bottle = inv:get_stack("stand", i):get_name() + + local alchemy = mcl_potions.get_alchemy(ingredient, bottle) + if alchemy then + stands[i] = alchemy + was_alchemy[i] = true + else + stands[i] = bottle + end + + end + -- if any stand holds a new potion, return the list of new potions + for i=1,table.getn(was_alchemy) do + if was_alchemy[i] then return stands end + end + + return false +end + + +local function brewing_stand_timer(pos, elapsed) + -- Inizialize metadata + local meta = minetest.get_meta(pos) + + local fuel_timer = meta:get_float("fuel_timer") or 0 + local BREW_TIME = 20 -- all brews brew the same + local BURN_TIME = BREW_TIME * 10 + + local input_item = meta:get_string("input_item") or "" + local stand_timer = meta:get_float("stand_timer") or 0 + local fuel = meta:get_float("fuel") or 0 + local inv = meta:get_inventory() + + local input_list, stand_list, fuel_list + + local update = true + + while update do + + update = false + + input_list = inv:get_list("input") + stand_list = inv:get_list("stand") + fuel_list = inv:get_list("fuel") + + -- TODO ... fix this. Goal is to reset the process if the stand changes + -- for i=1, inv:get_size("stand", i) do -- reset the process due to change + -- local _name = inv:get_stack("stand", i):get_name() + -- if _name ~= stand_items[i] then + -- stand_timer = 0 + -- stand_items[i] = _name + -- update = true -- need to update the stand with new data + -- return 1 + -- end + -- end + + local brew_output = brewable(inv) + if fuel ~= 0 and brew_output then + + fuel_timer = fuel_timer + elapsed + stand_timer = stand_timer + elapsed + + if fuel_timer >= BURN_TIME then --replace with more fuel + fuel = 0 --force a new fuel grab + fuel_timer = 0 + end + + local d = 0.5 + minetest.add_particlespawner({ + amount = 4, + time = 1, + minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, + maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d}, + minvel = {x=-0.1, y=0, z=-0.1}, + maxvel = {x=0.1, y=0.5, z=0.1}, + minacc = {x=-0.05, y=0, z=-0.05}, + maxacc = {x=0.05, y=.1, z=0.05}, + minexptime = 1, + maxexptime = 2, + minsize = 0.5, + maxsize = 2, + collisiondetection = true, + vertical = false, + texture = "mcl_brewing_bubble_sprite.png", + }) + + -- Replace the stand item with the brew result + if stand_timer >= BREW_TIME then + + local input_count = inv:get_stack("input",1):get_count() + if (input_count-1) ~= 0 then + inv:set_stack("input",1,inv:get_stack("input",1):get_name().." "..(input_count-1)) + else + inv:set_stack("input",1,"") + end + + for i=1, inv:get_size("stand") do + if brew_output[i] then + minetest.sound_play("mcl_brewing_complete", {pos=pos, gain=0.4, max_hear_range=6}, true) + inv:set_stack("stand", i, brew_output[i]) + minetest.sound_play("mcl_potions_bottle_pour", {pos=pos, gain=0.6, max_hear_range=6}, true) + end + end + stand_timer = 0 + update = false -- stop the update if brew is complete + end + + elseif fuel == 0 then --get more fuel from fuel_list + + -- only allow blaze powder fuel + local fuel_name = inv:get_stack("fuel",1):get_name() + local fuel_count = inv:get_stack("fuel",1):get_count() + + if fuel_name == "mcl_mobitems:blaze_powder" then -- Grab another fuel + + if (fuel_count-1) ~= 0 then + inv:set_stack("fuel",1,fuel_name.." "..(fuel_count-1)) + else + inv:set_stack("fuel",1,"") + end + update = true + fuel = 1 + else -- no fuel available + update = false + end + + end + + elapsed = 0 + end + + --update formspec + local formspec = brewing_formspec + + local result = false + + if fuel_timer ~= 0 then + local fuel_percent = math.floor(fuel_timer/BURN_TIME*100 % BURN_TIME) + local brew_percent = math.floor(stand_timer/BREW_TIME*100) + formspec = active_brewing_formspec(fuel_percent, brew_percent*1 % 100) + result = true + else + minetest.get_node_timer(pos):stop() + end + + meta:set_float("fuel_timer", fuel_timer) + meta:set_float("stand_timer", stand_timer) + meta:set_float("fuel", fuel) + -- meta:set_list("stand_items", stand_list) + meta:set_string("formspec", formspec) + + return result +end + + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + + -- Test stack with size 1 because we burn one fuel at a time + local teststack = ItemStack(stack) + teststack:set_count(1) + local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) + if output.time ~= 0 then + -- Only allow to place 1 item if fuel get replaced by recipe. + -- This is the case for lava buckets. + local replace_item = decremented_input.items[1] + if replace_item:is_empty() then + -- For most fuels, just allow to place everything + return stack:get_count() + else + if inv:get_stack(listname, index):get_count() == 0 then + return 1 + else + return 0 + end + end + else + return 0 + end + elseif listname == "input" then + return stack:get_count() + elseif listname == "stand" then + return 0 + end +end + + +-- Drop input items of brewing_stand at pos with metadata meta +local function drop_brewing_stand_items(pos, meta) + + local inv = meta:get_inventory() + + local stack = inv:get_stack("fuel", 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + + local stack = inv:get_stack("input", 1) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + + for i=1, inv:get_size("stand") do + local stack = inv:get_stack("stand", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end +end + + +local on_rotate +if minetest.get_modpath("screwdriver") then + on_rotate = screwdriver.rotate_simple +end + +local doc_string = + S("To use an brewing_stand, rightclick it.").."\n" + S("To brew, place fuel first and/or your ingredient last!") + +local tiles = {"mcl_brewing_top.png", --top + "mcl_brewing_base.png", --bottom + "mcl_brewing_side.png", --right + "mcl_brewing_side.png", --left + "mcl_brewing_side.png", --back + "mcl_brewing_side.png^[transformFX"} --front + +local allow_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end +end + +local on_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local str = "" + for i=1, inv:get_size("stand") do + local stack = inv:get_stack("stand", i) + if not stack:is_empty() then + str = str.."1" + else str = str.."0" + end + end + minetest.swap_node(pos, {name = "mcl_brewing:stand_"..str}) + minetest.get_node_timer(pos):start(1.0) + --some code here to enforce only potions getting placed on stands +end + +local after_dig = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + meta:from_table(oldmetadata) + drop_brewing_stand_items(pos, meta) +end + +local on_destruct = function(pos) + local meta = minetest.get_meta(pos) + drop_brewing_stand_items(pos, meta) +end + +local allow_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end +end + +local on_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local str = "" + for i=1, inv:get_size("stand") do + local stack = inv:get_stack("stand", i) + if not stack:is_empty() then + str = str.."1" + else str = str.."0" + end + end + minetest.swap_node(pos, {name = "mcl_brewing:stand_"..str}) + minetest.get_node_timer(pos):start(1.0) + --some code here to enforce only potions getting placed on stands +end + +minetest.register_node("mcl_brewing:stand_000", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 0, not_in_craft_guide = 0}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + -- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + -- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + -- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + -- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + -- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + -- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + -- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + -- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + -- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + -- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + -- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + -- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_glass_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) +minetest.register_alias("mcl_brewing:stand", "mcl_brewing:stand_000") +minetest.register_node("mcl_brewing:stand_100", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + -- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + -- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + -- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + -- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + -- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + -- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + -- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) +minetest.register_node("mcl_brewing:stand_010", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + -- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + -- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + -- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + -- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + -- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + -- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + -- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) +minetest.register_node("mcl_brewing:stand_001", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + -- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + -- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + -- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + -- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + -- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + -- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + -- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + -- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + -- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + -- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) +minetest.register_node("mcl_brewing:stand_110", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + -- {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + -- {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) +minetest.register_node("mcl_brewing:stand_101", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + -- {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + -- {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + -- {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + -- {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + -- {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) +minetest.register_node("mcl_brewing:stand_011", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + -- {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + -- {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + -- {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + -- {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + -- {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) +minetest.register_node("mcl_brewing:stand_111", { + description = S("Brewing Stand"), + _doc_items_longdesc = S("The stand allows you to brew potions!"), + _doc_items_usagehelp = doc_string, + _tt_help = S("Brew Potions"), + groups = {pickaxey=1, material_stone=1, falling_node=1, crush_after_fall=1, brewitem=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + tiles = tiles, + drop = "mcl_brewing:stand", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + + {-1/16, -5/16, -1/16, 1/16, 8/16, 1/16}, -- heat plume + { 2/16, -8/16, -8/16, 8/16, -6/16, -2/16}, -- base + {-8/16, -8/16, -8/16, -2/16, -6/16, -2/16}, -- base + {-3/16, -8/16, 2/16, 3/16, -6/16, 8/16}, -- base + + {-7/16, -6/16 ,-7/16 , -6/16, 1/16, -6/16 }, -- bottle 1 + {-6/16, -6/16 ,-6/16 , -5/16, 3/16, -5/16 }, -- bottle 1 + {-5/16, -6/16 ,-5/16 , -4/16, 3/16, -4/16 }, -- bottle 1 + {-4/16, -6/16 ,-4/16 , -3/16, 3/16, -3/16 }, -- bottle 1 + {-3/16, -6/16 ,-3/16 , -2/16, 1/16, -2/16 }, -- bottle 1 + + {-5/16, 3/16 ,-5/16 , -4/16, 7/16, -4/16 }, -- line 1 + {-4/16, 6/16 ,-4/16 , -3/16, 8/16, -3/16 }, -- line 1 + {-3/16, 7/16 ,-3/16 , -2/16, 8/16, -2/16 }, -- line 1 + {-2/16, 7/16 ,-2/16 , -1/16, 8/16, -1/16 }, -- line 1 + + + {7/16, -6/16 ,-7/16 , 6/16, 1/16, -6/16 }, -- bottle 2 + {6/16, -6/16 ,-6/16 , 5/16, 3/16, -5/16 }, -- bottle 2 + {5/16, -6/16 ,-5/16 , 4/16, 3/16, -4/16 }, -- bottle 2 + {4/16, -6/16 ,-4/16 , 3/16, 3/16, -3/16 }, -- bottle 2 + {3/16, -6/16 ,-3/16 , 2/16, 1/16, -2/16 }, -- bottle 2 + + {5/16, 3/16 ,-5/16 ,4/16, 7/16, -4/16 }, -- line 2 + {4/16, 6/16 ,-4/16 ,3/16, 8/16, -3/16 }, -- line 2 + {3/16, 7/16 ,-3/16 ,2/16, 8/16, -2/16 }, -- line 2 + {2/16, 7/16 ,-2/16 ,1/16, 8/16, -1/16 }, -- line 2 + + {0/16, -6/16 , 2/16 , 1/16, 1/16, 7/16 }, -- bottle 3 + {0/16, 1/16 , 3/16 , 1/16, 3/16, 6/16 }, -- bottle 3 + + {0/16, 7/16 , 1/16 , 1/16, 8/16, 3/16 }, -- line 3 + {0/16, 6/16 , 3/16 , 1/16, 7/16, 5/16 }, -- line 3 + {0/16, 3/16 , 4/16 , 1/16, 6/16, 5/16 }, -- line 3 + } + }, + sounds = mcl_sounds.node_sound_metal_defaults(), + _mcl_blast_resistance = 1, + _mcl_hardness = 1, + on_destruct = on_destruct, + after_dig_node = after_dig, + allow_metadata_inventory_take = allow_take, + allow_metadata_inventory_put = allow_put, + on_metadata_inventory_put = on_put, + on_metadata_inventory_take = on_take, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("fuel", 1) + inv:set_size("stand", 3) + local form = brewing_formspec + meta:set_string("formspec", form) + end, + + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + end, + + on_timer = brewing_stand_timer, + on_rotate = on_rotate, +}) + +minetest.register_craft({ + output = "mcl_brewing:stand", + recipe = { + { "", "mcl_mobitems:blaze_rod", "" }, + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble" }, + } +}) diff --git a/mods/ITEMS/mcl_brewing/locale/template.txt b/mods/ITEMS/mcl_brewing/locale/template.txt new file mode 100755 index 0000000000..56cf672ac9 --- /dev/null +++ b/mods/ITEMS/mcl_brewing/locale/template.txt @@ -0,0 +1,3 @@ +# textdomain: mcl_brewing +Brewing Stand= +The brewing stand allows the creating of potions for the benefit of various effects. Stay tuned for developments, as you can only view the stand and interact with it, but not create potions. diff --git a/mods/ITEMS/mcl_brewing/mod.conf b/mods/ITEMS/mcl_brewing/mod.conf new file mode 100755 index 0000000000..de164abf92 --- /dev/null +++ b/mods/ITEMS/mcl_brewing/mod.conf @@ -0,0 +1 @@ +name = mcl_brewing diff --git a/mods/ITEMS/mcl_brewing/sounds/mcl_brewing_complete.ogg b/mods/ITEMS/mcl_brewing/sounds/mcl_brewing_complete.ogg new file mode 100644 index 0000000000..1798cb2730 Binary files /dev/null and b/mods/ITEMS/mcl_brewing/sounds/mcl_brewing_complete.ogg differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_base.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_base.png new file mode 100644 index 0000000000..8831ffb9b5 Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_base.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bottle_bg.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bottle_bg.png new file mode 100644 index 0000000000..c0c4fd2be1 Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bottle_bg.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubble_sprite.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubble_sprite.png new file mode 100644 index 0000000000..74447439e4 Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubble_sprite.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles.png new file mode 100644 index 0000000000..780352408f Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles_active.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles_active.png new file mode 100644 index 0000000000..2a367807ac Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_bubbles_active.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner.png new file mode 100644 index 0000000000..e2e8e8afeb Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner_active.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner_active.png new file mode 100644 index 0000000000..93655b6732 Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_burner_active.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_fuel_bg.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_fuel_bg.png new file mode 100755 index 0000000000..fd730958af Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_fuel_bg.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_inventory.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_inventory.png new file mode 100755 index 0000000000..02c9dc44d1 Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_inventory.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_potion_bg.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_potion_bg.png new file mode 100644 index 0000000000..818e41d4b8 Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_potion_bg.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_side.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_side.png new file mode 100644 index 0000000000..057a405e0b Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_side.png differ diff --git a/mods/ITEMS/mcl_brewing/textures/mcl_brewing_top.png b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_top.png new file mode 100644 index 0000000000..81e000053d Binary files /dev/null and b/mods/ITEMS/mcl_brewing/textures/mcl_brewing_top.png differ diff --git a/mods/ITEMS/mcl_core/craftitems.lua b/mods/ITEMS/mcl_core/craftitems.lua index 9dc9d37052..122445095f 100644 --- a/mods/ITEMS/mcl_core/craftitems.lua +++ b/mods/ITEMS/mcl_core/craftitems.lua @@ -121,7 +121,7 @@ minetest.register_craftitem("mcl_core:sugar", { _doc_items_longdesc = S("Sugar comes from sugar canes and is used to make sweet foods."), inventory_image = "mcl_core_sugar.png", stack_max = 64, - groups = { craftitem = 1 }, + groups = { craftitem = 1, brewitem=1 }, }) minetest.register_craftitem("mcl_core:bowl",{ diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index 7791322581..29fc0d6dc9 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -140,7 +140,7 @@ minetest.register_node("mcl_core:lava_flowing", { liquid_range = 3, damage_per_second = 4*2, _mcl_node_death_message = lava_death_messages, - post_effect_color = {a=255, r=208, g=73, b=10}, + post_effect_color = {a=245, r=208, g=73, b=10}, groups = { lava=3, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1}, _mcl_blast_resistance = 100, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode @@ -195,7 +195,7 @@ S("• When lava is directly above water, the water turns into stone."), liquid_range = 3, damage_per_second = 4*2, _mcl_node_death_message = lava_death_messages, - post_effect_color = {a=255, r=208, g=73, b=10}, + post_effect_color = {a=245, r=208, g=73, b=10}, stack_max = 64, groups = { lava=3, liquid=2, destroys_items=1, not_in_creative_inventory=1, dig_by_piston=1}, _mcl_blast_resistance = 100, diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 53eefdad36..aee940931f 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -32,7 +32,7 @@ local fish = function(itemstack, player) local num = 0 local ent = nil local noent = true - + --Check for bobber if so handle. for n = 1, #objs do ent = objs[n]:get_luaentity() @@ -157,7 +157,7 @@ local bobber_on_step = function(self, dtime) epos.y = math.floor(epos.y) local node = minetest.get_node(epos) local def = minetest.registered_nodes[node.name] - + --If we have no player, remove self. if self.player == nil or self.player == "" then self.object:remove() @@ -168,7 +168,7 @@ local bobber_on_step = function(self, dtime) self.object:remove() return end - + --Check if player is nearby if self._tick % 5 == 0 and self.player ~= nil and player ~= nil then --Destroy bobber if item not wielded. @@ -177,7 +177,7 @@ local bobber_on_step = function(self, dtime) self.object:remove() return end - + --Destroy bobber if player is too far away. local objpos = self.object:get_pos() local playerpos = player:get_pos() @@ -200,7 +200,7 @@ local bobber_on_step = function(self, dtime) self.object:remove() return end - + end -- If in water, then bob. if def.liquidtype == "source" and minetest.get_item_group(def.name, "water") ~= 0 then @@ -251,7 +251,7 @@ local bobber_on_step = function(self, dtime) end end end -end +end -- TODO: Destroy when hitting a solid node --if self._lastpos.x~=nil then @@ -273,7 +273,7 @@ minetest.register_on_leaveplayer(function(player) local num = 0 local ent = nil local noent = true - + for n = 1, #objs do ent = objs[n]:get_luaentity() if ent then @@ -292,7 +292,7 @@ minetest.register_on_dieplayer(function(player) local num = 0 local ent = nil local noent = true - + for n = 1, #objs do ent = objs[n]:get_luaentity() if ent then @@ -426,7 +426,6 @@ minetest.register_craftitem("mcl_fishing:pufferfish_raw", { on_place = minetest.item_eat(1), on_secondary_use = minetest.item_eat(1), stack_max = 64, - groups = { food=2, eatable=1 }, + groups = { food=2, eatable=1, brewitem = 1 }, _mcl_saturation = 0.2, }) - diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 3e6aef4853..e2626c6627 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -142,6 +142,7 @@ local drink_milk = function(itemstack, player, pointed_thing) if mcl_hunger.active and (bucket:get_name() ~= "mcl_mobitems:milk_bucket" or minetest.settings:get_bool("creative_mode") == true) then mcl_hunger.stop_poison(player) end + mcl_potions._reset_player_effects(player) return bucket end @@ -168,7 +169,7 @@ minetest.register_craftitem("mcl_mobitems:spider_eye", { wield_image = "mcl_mobitems_spider_eye.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), - groups = { food = 2, eatable = 2 }, + groups = { food = 2, eatable = 2, brewitem = 1 }, _mcl_saturation = 3.2, stack_max = 64, }) @@ -223,7 +224,7 @@ minetest.register_craftitem("mcl_mobitems:ghast_tear", { wield_image = "mcl_mobitems_ghast_tear.png", inventory_image = "mcl_mobitems_ghast_tear.png", -- TODO: Reveal item when it's useful - groups = { brewitem = 1, not_in_creative_inventory = 1 }, + groups = { brewitem = 1, not_in_creative_inventory = 0 }, stack_max = 64, }) @@ -270,7 +271,7 @@ minetest.register_craftitem("mcl_mobitems:rabbit_foot", { wield_image = "mcl_mobitems_rabbit_foot.png", inventory_image = "mcl_mobitems_rabbit_foot.png", -- TODO: Reveal item when it's useful - groups = { brewitem = 1, not_in_creative_inventory = 1 }, + groups = { brewitem = 1, not_in_creative_inventory = 0 }, stack_max = 64, }) @@ -316,7 +317,7 @@ minetest.register_craftitem("mcl_mobitems:gunpowder", { _doc_items_longdesc = doc.sub.items.temp.craftitem, inventory_image = "default_gunpowder.png", stack_max = 64, - groups = { craftitem=1 }, + groups = { craftitem=1, brewitem = 1 }, }) minetest.register_tool("mcl_mobitems:carrot_on_a_stick", { @@ -439,4 +440,3 @@ minetest.register_craft({ {"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}, {"mcl_mobitems:slimeball","mcl_mobitems:slimeball","mcl_mobitems:slimeball",}}, }) - diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index e7612c906f..22d295d5b8 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -229,7 +229,7 @@ minetest.register_craftitem("mcl_nether:glowstone_dust", { _doc_items_longdesc = S("Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting."), inventory_image = "mcl_nether_glowstone_dust.png", stack_max = 64, - groups = { craftitem=1 }, + groups = { craftitem=1, brewitem=1 }, }) minetest.register_craftitem("mcl_nether:quartz", { diff --git a/mods/ITEMS/mcl_nether/nether_wart.lua b/mods/ITEMS/mcl_nether/nether_wart.lua index 7744a1fecf..a408b96c57 100644 --- a/mods/ITEMS/mcl_nether/nether_wart.lua +++ b/mods/ITEMS/mcl_nether/nether_wart.lua @@ -85,7 +85,7 @@ minetest.register_node("mcl_nether:nether_wart", { tiles = {"mcl_nether_nether_wart_stage_2.png"}, wield_image = "mcl_nether_nether_wart_stage_2.png", inventory_image = "mcl_nether_nether_wart_stage_2.png", - selection_box = { + selection_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, 0.45, 0.5} @@ -135,7 +135,7 @@ minetest.register_craftitem("mcl_nether:nether_wart_item", { end end end, - groups = { craftitem = 1 }, + groups = { craftitem = 1, brewitem=1 }, }) local names = {"mcl_nether:nether_wart_0", "mcl_nether:nether_wart_1", "mcl_nether:nether_wart_2"} diff --git a/mods/ITEMS/mcl_potions/depends.txt b/mods/ITEMS/mcl_potions/depends.txt index 8360d8597f..abcf4601da 100644 --- a/mods/ITEMS/mcl_potions/depends.txt +++ b/mods/ITEMS/mcl_potions/depends.txt @@ -1,3 +1,5 @@ mcl_core mcl_farming mcl_mobitems +mcl_fishing +playerphysics diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua new file mode 100644 index 0000000000..aae3975de8 --- /dev/null +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -0,0 +1,676 @@ +local is_invisible = {} +local is_poisoned = {} +local is_regenerating = {} +local is_strong = {} +local is_weak = {} +local is_water_breathing = {} +local is_leaping = {} +local is_swift = {} +local is_cat = {} +local is_fire_proof = {} + + +minetest.register_globalstep(function(dtime) + + -- Check for invisible players + for player, vals in pairs(is_invisible) do + + if is_invisible[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_invisible[player].timer = is_invisible[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#B0B0B0") end + + if is_invisible[player].timer >= is_invisible[player].dur then + mcl_potions.make_invisible(player, false) + is_invisible[player] = nil + end + + elseif not player:get_properties() then + is_invisible[player] = nil + end + + end + + -- Check for poisoned players + for player, vals in pairs(is_poisoned) do + + if is_poisoned[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_poisoned[player].timer = is_poisoned[player].timer + dtime + is_poisoned[player].hit_timer = (is_poisoned[player].hit_timer or 0) + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#225533") end + + if is_poisoned[player].hit_timer >= is_poisoned[player].step then + + if player._cmi_is_mob then + player.health = math.max(player.health - 1, 1) + else + player:set_hp( math.max(player:get_hp() - 1, 1), { type = "punch", from = "potion" }) + end + + is_poisoned[player].hit_timer = 0 + + end + + if is_poisoned[player].timer >= is_poisoned[player].dur then + is_poisoned[player] = nil + end + + elseif not player:get_properties() then + is_poisoned[player] = nil + end + + end + + -- Check for regnerating players + for player, vals in pairs(is_regenerating) do + + if is_regenerating[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_regenerating[player].timer = is_regenerating[player].timer + dtime + is_regenerating[player].heal_timer = (is_regenerating[player].heal_timer or 0) + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#A52BB2") end + + if is_regenerating[player].heal_timer >= is_regenerating[player].step then + player:set_hp(math.min(player:get_properties().hp_max or 20, player:get_hp() + 1)) + is_regenerating[player].heal_timer = 0 + end + + if is_regenerating[player].timer >= is_regenerating[player].dur then + is_regenerating[player] = nil + end + + elseif not player:get_properties() then + is_regenerating[player] = nil + end + + end + + -- Check for water breathing players + for player, vals in pairs(is_water_breathing) do + + if is_water_breathing[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_water_breathing[player].timer = is_water_breathing[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#0000AA") end + + if player:get_breath() then + if player:get_breath() < 10 then player:set_breath(10) end + end + + if is_water_breathing[player].timer >= is_water_breathing[player].dur then + is_water_breathing[player] = nil + end + + elseif not player:get_properties() then + is_water_breathing[player] = nil + end + + end + + -- Check for leaping players + for player, vals in pairs(is_leaping) do + + if is_leaping[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_leaping[player].timer = is_leaping[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#00CC33") end + + if is_leaping[player].timer >= is_leaping[player].dur then + playerphysics.remove_physics_factor(player, "jump", "mcl_potions:leaping") + is_leaping[player] = nil + end + + elseif not player:get_properties() then + is_leaping[player] = nil + end + + end + + -- Check for swift players + for player, vals in pairs(is_swift) do + + if is_swift[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_swift[player].timer = is_swift[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#009999") end + + if is_swift[player].timer >= is_swift[player].dur then + playerphysics.remove_physics_factor(player, "speed", "mcl_potions:swiftness") + is_swift[player] = nil + end + + elseif not player:get_properties() then + is_swift[player] = nil + end + + end + + -- Check for Night Vision equipped players + for player, vals in pairs(is_cat) do + + if is_cat[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_cat[player].timer = is_cat[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#1010AA") end + player:override_day_night_ratio(0.45) + + if is_cat[player].timer >= is_cat[player].dur then + is_cat[player] = nil + end + + elseif not player:get_properties() then + is_cat[player] = nil + end + + end + + -- Check for Fire Proof players + for player, vals in pairs(is_fire_proof) do + + if is_fire_proof[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_fire_proof[player].timer = is_fire_proof[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#E0B050") end + + if is_fire_proof[player].timer >= is_fire_proof[player].dur then + is_fire_proof[player] = nil + end + + elseif not player:get_properties() then + is_fire_proof[player] = nil + end + + end + + -- Check for Weak players + for player, vals in pairs(is_weak) do + + if is_weak[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_weak[player].timer = is_weak[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#7700BB") end + + if is_weak[player].timer >= is_weak[player].dur then + is_weak[player] = nil + end + + elseif not player:get_properties() then + is_weak[player] = nil + end + + end + + -- Check for Strong players + for player, vals in pairs(is_strong) do + + if is_strong[player] and player:get_properties() then + + player = player or player:get_luaentity() + + is_strong[player].timer = is_strong[player].timer + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#7700BB") end + + if is_strong[player].timer >= is_strong[player].dur then + is_strong[player] = nil + end + + elseif not player:get_properties() then + is_strong[player] = nil + end + + end + +end) + + +local is_fire_node = { ["mcl_core:lava_flowing"]=true, + ["mcl_core:lava_source"]=true, + ["mcl_fire:eternal_fire"]=true, + ["mcl_fire:fire"]=true, + ["mcl_nether:magma"]=true, + ["mcl_nether:nether_lava_source"]=true, + ["mcl_nether:nether_lava_flowing"]=true, + ["mcl_nether:nether_lava_source"]=true} + +-- Prevent damage to player with Fire Resistance enabled +minetest.register_on_player_hpchange(function(player, hp_change) + + if is_fire_proof[player] and hp_change < 0 then + -- This is a bit forced, but it assumes damage is taken by fire and avoids it + -- also assumes any change in hp happens between calls to this function + -- it's worth noting that you don't take damage from players in this case... + local player_info = mcl_playerinfo[player:get_player_name()] + + if is_fire_node[player_info.node_head] or is_fire_node[player_info.node_feet] or is_fire_node[player_info.node_stand] then + -- if player:get_breath() == 0 and hp_change == -4 then -- probably drowning + -- return hp_change + -- else + return 0 + -- end + else + return hp_change + end + + else + return hp_change + end + +end, true) + + +-- -- If a player is punched and is a weak player, damage by 2 additional hearts +-- minetest.register_on_player_hpchange(function(player, hp_change) +-- +-- if is_weak[player] and hp_change < 0 then +-- +-- -- prevent weakness from healing the victim +-- return math.min(hp_change - 4, 0) +-- +-- else +-- return hp_change +-- end +-- +-- end, true) + + +function mcl_potions._reset_player_effects(player) + + player = player or player:get_luaentity() + + if is_invisible[player] then + mcl_potions.make_invisible(player, false) + is_invisible[player] = nil + end + + if is_poisoned[player] then + is_poisoned[player] = nil + end + + if is_regenerating[player] then + is_regenerating[player] = nil + end + + if is_strong[player] then + is_strong[player] = nil + end + + if is_weak[player] then + is_weak[player] = nil + end + + if is_water_breathing[player] then + is_water_breathing[player] = nil + end + + if is_leaping[player] then + is_leaping[player] = nil + playerphysics.remove_physics_factor(player, "jump", "mcl_potions:leaping") + end + + if is_swift[player] then + is_swift[player] = nil + playerphysics.remove_physics_factor(player, "speed", "mcl_potions:swiftness") + end + + if is_cat[player] then + is_cat[player] = nil + end + + if is_fire_proof[player] then + is_fire_proof[player] = nil + end + +end + +minetest.register_on_leaveplayer( function(player) mcl_potions._reset_player_effects(player) end) +minetest.register_on_dieplayer( function(player) mcl_potions._reset_player_effects(player) end) + +function mcl_potions.is_obj_hit(self, pos) + + for _,object in pairs(minetest.get_objects_inside_radius(pos, 1.1)) do + + local entity = object:get_luaentity() + + if entity and entity.name ~= self.object:get_luaentity().name then + + if entity._cmi_is_mob then return true end + + elseif object:is_player() then + return true + end + + end + return false +end + + +function mcl_potions.make_invisible(player, toggle) + + if not player then return false end + + if toggle then -- hide player + is_invisible[player].old_size = player:get_properties().visual_size + player:set_properties({visual_size = {x = 0, y = 0}}) + player:set_nametag_attributes({color = {a = 0}}) + else -- show player + player:set_properties({visual_size = is_invisible[player].old_size}) + player:set_nametag_attributes({color = {a = 255}}) + end + +end + +function mcl_potions.poison(player, toggle) + + if not player then return false end + is_poisoned[player:get_player_name()] = toggle + +end + +function mcl_potions.regenerate(player, toggle) + + if not player then return false end + is_regenerating[player:get_player_name()] = toggle + +end + +function mcl_potions._use_potion(item, obj, color) + local d = 0.1 + local pos = obj:get_pos() + minetest.sound_play("mcl_potions_drinking", {pos = pos, max_hear_distance = 6, gain = 1}) + minetest.add_particlespawner({ + amount = 25, + time = 1, + minpos = {x=pos.x-d, y=pos.y+1, z=pos.z-d}, + maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d}, + minvel = {x=-0.1, y=0, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=-0.1, y=0, z=-0.1}, + maxacc = {x=0.1, y=.1, z=0.1}, + minexptime = 1, + maxexptime = 5, + minsize = 0.5, + maxsize = 1, + collisiondetection = true, + vertical = false, + texture = "mcl_potions_sprite.png^[colorize:"..color..":127", + }) +end + + +function mcl_potions._add_spawner(obj, color) + local d = 0.2 + local pos = obj:get_pos() + minetest.add_particlespawner({ + amount = 2, + time = 1, + minpos = {x=pos.x-d, y=pos.y+1, z=pos.z-d}, + maxpos = {x=pos.x+d, y=pos.y+2, z=pos.z+d}, + minvel = {x=-0.1, y=0, z=-0.1}, + maxvel = {x=0.1, y=0.1, z=0.1}, + minacc = {x=-0.1, y=0, z=-0.1}, + maxacc = {x=0.1, y=.1, z=0.1}, + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + collisiondetection = false, + vertical = false, + texture = "mcl_potions_sprite.png^[colorize:"..color..":127", + }) +end + + +local is_zombie = {} + +for i, zombie in ipairs({"husk","zombie","pigman"}) do + is_zombie["mobs_mc:"..zombie] = true + is_zombie["mobs_mc:baby_"..zombie] = true +end + +function mcl_potions.healing_func(player, hp) + + local obj = player:get_luaentity() + + if is_zombie[player:get_entity_name()] then hp = -hp end + + if hp > 0 then + + if obj and obj._cmi_is_mob then + obj.health = math.max(obj.health + hp, obj.hp_max) + else + player:set_hp(math.min(player:get_hp() + hp, player:get_properties().hp_max)) + end + + else + + if obj and obj._cmi_is_mob then + obj.health = obj.health + hp + else + player:set_hp(player:get_hp() + hp, { type = "punch", from = "potion" }) + end + + end + + -- adjust mob health + obj = player:get_luaentity() + if obj and obj._cmi_is_mob then + obj.health = obj.health + hp + end + +end + +function mcl_potions.swiftness_func(player, factor, duration) + + if not player:get_meta() then return false end + + if not is_swift[player] then + + is_swift[player] = {dur = duration, timer = 0} + playerphysics.add_physics_factor(player, "speed", "mcl_potions:swiftness", factor) + + else + + local victim = is_swift[player] + + playerphysics.add_physics_factor(player, "speed", "mcl_potions:swiftness", factor) + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end + +function mcl_potions.leaping_func(player, factor, duration) + + if not player:get_meta() then return false end + + if not is_leaping[player] then + + is_leaping[player] = {dur = duration, timer = 0} + playerphysics.add_physics_factor(player, "jump", "mcl_potions:leaping", factor) + + else + + local victim = is_leaping[player] + + playerphysics.add_physics_factor(player, "jump", "mcl_potions:leaping", factor) + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end + + +function mcl_potions.weakness_func(player, factor, duration) + + if not is_weak[player] then + + is_weak[player] = {dur = duration, timer = 0, factor = factor} + + else + + local victim = is_weak[player] + + victim.factor = factor + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end + + +function mcl_potions.strength_func(player, factor, duration) + + if not is_strong[player] then + + is_strong[player] = {dur = duration, timer = 0, factor = factor} + + else + + local victim = is_strong[player] + + victim.factor = factor + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end + + +function mcl_potions.poison_func(player, factor, duration) + + if not is_poisoned[player] then + + is_poisoned[player] = {step = factor, dur = duration, timer = 0} + + else + + local victim = is_poisoned[player] + + victim.step = math.min(victim.step, factor) + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end +end + + +function mcl_potions.regeneration_func(player, factor, duration) + + if not is_regenerating[player] then + + is_regenerating[player] = {step = factor, dur = duration, timer = 0} + + else + + local victim = is_regenerating[player] + + victim.step = math.min(victim.step, factor) + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end +end + + +function mcl_potions.invisiblility_func(player, duration) + + if not is_invisible[player] then + + is_invisible[player] = {dur = duration, timer = 0} + mcl_potions.make_invisible(player, true) + + else + + local victim = is_invisible[player] + + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end + +function mcl_potions.water_breathing_func(player, duration) + + if not is_water_breathing[player] then + + is_water_breathing[player] = {dur = duration, timer = 0} + + else + + local victim = is_water_breathing[player] + + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end + + +function mcl_potions.fire_resistance_func(player, duration) + + if not is_fire_proof[player] then + + is_fire_proof[player] = {dur = duration, timer = 0} + + else + + local victim = is_fire_proof[player] + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end + + +function mcl_potions.night_vision_func(player, duration) + + if not is_cat[player] then + + is_cat[player] = {dur = duration, timer = 0} + + else + + local victim = is_cat[player] + + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + +end diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 5123d8b741..8ef68a955b 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -1,6 +1,25 @@ local S = minetest.get_translator("mcl_potions") +mcl_potions = {} -local brewhelp = S("Put this item in an item frame for decoration. It's useless otherwise.") +-- duration effects of redstone are a factor of 8/3 +-- duration effects of glowstone are a time factor of 1/2 +-- splash potion duration effects are reduced by a factor of 3/4 + +mcl_potions.DURATION = 180 +mcl_potions.DURATION_PLUS = mcl_potions.DURATION * (8/3) +mcl_potions.DURATION_2 = mcl_potions.DURATION * (1/2) + +mcl_potions.INV_FACTOR = 0.50 +mcl_potions.SPLASH_FACTOR = 0.75 + + +local modpath = minetest.get_modpath("mcl_potions") +dofile(modpath .. "/functions.lua") +dofile(modpath .. "/splash.lua") +dofile(modpath .. "/lingering.lua") +dofile(modpath .. "/potions.lua") + +local brewhelp = S("Try different combinations to create potions.") minetest.register_craftitem("mcl_potions:fermented_spider_eye", { description = S("Fermented Spider Eye"), @@ -8,7 +27,7 @@ minetest.register_craftitem("mcl_potions:fermented_spider_eye", { wield_image = "mcl_potions_spider_eye_fermented.png", inventory_image = "mcl_potions_spider_eye_fermented.png", -- TODO: Reveal item when it's actually useful - groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, + groups = { brewitem = 1, not_in_creative_inventory = 0, not_in_craft_guide = 0 }, stack_max = 64, }) @@ -23,8 +42,8 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { _tt_help = S("Liquid container"), _doc_items_longdesc = S("A glass bottle is used as a container for liquids and can be used to collect water directly."), _doc_items_usagehelp = S("To collect water, it on a cauldron with water (which removes a level of water) or any water source (which removes no water)."), - inventory_image = "mcl_potions_potion_bottle_empty.png", - wield_image = "mcl_potions_potion_bottle_empty.png", + inventory_image = "mcl_potions_potion_bottle.png", + wield_image = "mcl_potions_potion_bottle.png", groups = {brewitem=1}, liquids_pointable = true, on_place = function(itemstack, placer, pointed_thing) @@ -33,7 +52,7 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { local def = minetest.registered_nodes[node.name] -- Call on_rightclick if the pointed node defines it - if placer and not placer :get_player_control().sneak then + if placer and not placer:get_player_control().sneak then if def and def.on_rightclick then return def.on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack end @@ -87,9 +106,9 @@ minetest.register_craftitem("mcl_potions:glass_bottle", { -- place the water potion at a place where's space local water_bottle if river_water then - water_bottle = ItemStack("mcl_potions:potion_river_water") + water_bottle = ItemStack("mcl_potions:river_water") else - water_bottle = ItemStack("mcl_potions:potion_water") + water_bottle = ItemStack("mcl_potions:water") end local inv = placer:get_inventory() if creative then @@ -130,9 +149,11 @@ local potion_image = function(colorstring, opacity) if not opacity then opacity = 127 end - return "mcl_potions_potion_bottle_drinkable.png^(mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity)..")" + return "mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_potion_bottle.png" end + + -- Cauldron fill up rules: -- Adding any water increases the water level by 1, preserving the current water type local cauldron_levels = { @@ -158,7 +179,7 @@ end -- Itemstring of potions is “mcl_potions:potion_” -minetest.register_craftitem("mcl_potions:potion_water", { +minetest.register_craftitem("mcl_potions:water", { description = S("Water Bottle"), _tt_help = S("No effect"), _doc_items_longdesc = S("Water bottles can be used to fill cauldrons. Drinking water has no effect."), @@ -203,7 +224,7 @@ minetest.register_craftitem("mcl_potions:potion_water", { on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), }) -minetest.register_craftitem("mcl_potions:potion_river_water", { +minetest.register_craftitem("mcl_potions:river_water", { description = S("River Water Bottle"), _tt_help = S("No effect"), _doc_items_longdesc = S("River water bottles can be used to fill cauldrons. Drinking it has no effect."), @@ -250,55 +271,11 @@ minetest.register_craftitem("mcl_potions:potion_river_water", { }) - -local how_to_drink = S("Use the “Place” key to drink it.") - -minetest.register_craftitem("mcl_potions:potion_awkward", { - description = S("Awkward Potion"), - _tt_help = S("No effect"), - _doc_items_longdesc = S("This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect."), - _doc_items_usagehelp = how_to_drink, - stack_max = 1, - inventory_image = potion_image("#0000FF"), - wield_image = potion_image("#0000FF"), - -- TODO: Reveal item when it's actually useful - groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1}, - on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), - on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), -}) -minetest.register_craftitem("mcl_potions:potion_mundane", { - description = S("Mundane Potion"), - _tt_help = S("No effect"), - _doc_items_longdesc = S("This potion has a clean taste and is used for brewing more potions. Drinking it has no effect."), - _doc_items_usagehelp = how_to_drink, - stack_max = 1, - inventory_image = potion_image("#0000FF"), - wield_image = potion_image("#0000FF"), - -- TODO: Reveal item when it's actually useful - groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 }, - on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), - on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), -}) -minetest.register_craftitem("mcl_potions:potion_thick", { - description = S("Thick Potion"), - _tt_help = S("No effect"), - _doc_items_longdesc = S("This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect."), - _doc_items_usagehelp = how_to_drink, - stack_max = 1, - inventory_image = potion_image("#0000FF"), - wield_image = potion_image("#0000FF"), - -- TODO: Reveal item when it's actually useful - groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 }, - on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), - on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), -}) - minetest.register_craftitem("mcl_potions:speckled_melon", { description = S("Glistering Melon"), _doc_items_longdesc = S("This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else."), stack_max = 64, - -- TODO: Reveal item when it's actually useful - groups = { brewitem = 1, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, + groups = { brewitem = 1, not_in_creative_inventory = 0, not_in_craft_guide = 1 }, inventory_image = "mcl_potions_melon_speckled.png", }) @@ -311,12 +288,123 @@ minetest.register_craft({ } }) -minetest.register_craftitem("mcl_potions:dragon_breath", { - description = S("Dragon's Breath"), - _doc_items_longdesc = brewhelp, - wield_image = "mcl_potions_dragon_breath.png", - inventory_image = "mcl_potions_dragon_breath.png", - -- TODO: Reveal item when it's actually useful - groups = { brewitem = 1, not_in_creative_inventory = 1 }, - stack_max = 64, -}) + +local water_table = { + ["mcl_nether:nether_wart_item"] = "mcl_potions:awkward", + ["mcl_potions:fermented_spider_eye"] = "mcl_potions:weakness", + ["mcl_potions:speckled_melon"] = "mcl_potions:mundane", + ["mcl_core:sugar"] = "mcl_potions:mundane", + ["mcl_mobitems:magma_cream"] = "mcl_potions:mundane", + ["mcl_mobitems:blaze_powder"] = "mcl_potions:mundane", + ["mesecons:wire_00000000_off"] = "mcl_potions:mundane", + ["mcl_mobitems:ghast_tear"] = "mcl_potions:mundane", + ["mcl_mobitems:spider_eye"] = "mcl_potions:mundane", + ["mcl_mobitems:rabbit_foot"] = "mcl_potions:mundane" +} + +local awkward_table = { + ["mcl_potions:speckled_melon"] = "mcl_potions:healing", + ["mcl_farming:carrot_item_gold"] = "mcl_potions:night_vision", + ["mcl_core:sugar"] = "mcl_potions:swiftness", + ["mcl_mobitems:magma_cream"] = "mcl_potions:fire_resistance", + ["mcl_mobitems:blaze_powder"] = "mcl_potions:strength", + ["mcl_fishing:pufferfish_raw"] = "mcl_potions:water_breathing", + ["mcl_mobitems:ghast_tear"] = "mcl_potions:regeneration", + ["mcl_mobitems:spider_eye"] = "mcl_potions:poison", + ["mcl_mobitems:rabbit_foot"] = "mcl_potions:leaping", +} + +local output_table = { + ["mcl_potions:river_water"] = water_table, + ["mcl_potions:water"] = water_table, + ["mcl_potions:awkward"] = awkward_table, +} + + +local enhancement_table = {} +local extension_table = {} +local potions = {"awkward", "mundane", "thick"} +for i, potion in ipairs({"healing","harming","swiftness","slowness","leaping","poison","regeneration","invisibility","fire_resistance","weakness","strength","water_breathing","night_vision"}) do + + table.insert(potions, potion) + + if potion ~= "invisibility" and potion ~= "night_vision" and potion ~= "weakness" and potion ~= "water_breathing" and potion ~= "fire_resistance" then + enhancement_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_2" + enhancement_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_2_splash" + table.insert(potions, potion.."_2") + end + + if potion ~= "healing" and potion ~= "harming" then + extension_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_plus_splash" + extension_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_plus" + table.insert(potions, potion.."_plus") + end + +end + + +local inversion_table = { + ["mcl_potions:healing"] = "mcl_potions:harming", + ["mcl_potions:healing_2"] = "mcl_potions:harming_2", + ["mcl_potions:swiftness"] = "mcl_potions:slowness", + ["mcl_potions:swiftness_plus"] = "mlc_potions:slowness_plus", + ["mcl_potions:leaping"] = "mcl_potions:slowness", + ["mcl_potions:leaping_plus"] = "mcl_potions:slowness_plus", + ["mcl_potions:night_vision"] = "mcl_potions:invisibility", + ["mcl_potions:night_vision_plus"] = "mcl_potions:invisibility_plus", + ["mcl_potions:poison"] = "mcl_potions:harming", + ["mcl_potions:poison_2"] = "mcl_potions:harming_2", + ["mcl_potions:healing_splash"] = "mcl_potions:harming_splash", + ["mcl_potions:healing_2_splash"] = "mcl_potions:harming_2_splash", + ["mcl_potions:swiftness_splash"] = "mcl_potions:slowness_splash", + ["mcl_potions:swiftness_plus_splash"] = "mlc_potions:slowness_plus_splash", + ["mcl_potions:leaping_splash"] = "mcl_potions:slowness_splash", + ["mcl_potions:leaping_plus_splash"] = "mcl_potions:slowness_plus_splash", + ["mcl_potions:night_vision_splash"] = "mcl_potions:invisibility_splash", + ["mcl_potions:night_vision_plus_splash"] = "mcl_potions:invisibility_plus_splash", + ["mcl_potions:poison_splash"] = "mcl_potions:harming_splash", + ["mcl_potions:poison_2_splash"] = "mcl_potions:harming_2_splash", +} + + +local splash_table = {} +local lingering_table = {} + +for i, potion in ipairs(potions) do + splash_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_splash" + lingering_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_lingering" +end + +for i, potion in ipairs({"awkward", "mundane", "thick", "water", "river_water"}) do + splash_table["mcl_potions:"..potion] = "mcl_potions:"..potion.."_splash" + lingering_table["mcl_potions:"..potion.."_splash"] = "mcl_potions:"..potion.."_lingering" +end + + +local mod_table = { + ["mesecons:wire_00000000_off"] = extension_table, + ["mcl_potions:fermented_spider_eye"] = inversion_table, + ["mcl_nether:glowstone_dust"] = enhancement_table, + ["mcl_mobitems:gunpowder"] = splash_table, + ["mcl_potions:dragon_breath"] = lingering_table, +} + +-- Compare two ingredients for compatable alchemy +function mcl_potions.get_alchemy(ingr, pot) + + if output_table[pot] ~= nil then + local brew_table = output_table[pot] + if brew_table[ingr] ~= nil then + return brew_table[ingr] + end + + elseif mod_table[ingr] ~= nil then + local brew_table = mod_table[ingr] + if brew_table[pot] ~= nil then + return brew_table[pot] + end + + end + + return false +end diff --git a/mods/ITEMS/mcl_potions/lingering.lua b/mods/ITEMS/mcl_potions/lingering.lua new file mode 100644 index 0000000000..1abaa4844c --- /dev/null +++ b/mods/ITEMS/mcl_potions/lingering.lua @@ -0,0 +1,257 @@ +local lingering_image = function(colorstring, opacity) + if not opacity then + opacity = 127 + end + return "mcl_potions_splash_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_splash_bottle.png" +end + + +local lingering_effect_at = {} + +local function add_lingering_effect(pos, color, def) + + lingering_effect_at[pos] = {color = color, timer = 30, def = def} + +end + + +local lingering_timer = 0 +minetest.register_globalstep(function(dtime) + + lingering_timer = lingering_timer + dtime + if lingering_timer >= 1 then + + for pos, vals in pairs(lingering_effect_at) do + + vals.timer = vals.timer - lingering_timer + local d = 4 * (vals.timer / 30.0) + + minetest.add_particlespawner({ + amount = 10 * d^2, + time = 1, + minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, + maxpos = {x=pos.x+d, y=pos.y+1, z=pos.z+d}, + minvel = {x=-0.5, y=0, z=-0.5}, + maxvel = {x=0.5, y=0.5, z=0.5}, + minacc = {x=-0.2, y=0, z=-0.2}, + maxacc = {x=0.2, y=.05, z=0.2}, + minexptime = 1, + maxexptime = 2, + minsize = 2, + maxsize = 4, + collisiondetection = true, + vertical = false, + texture = "mcl_potions_sprite.png^[colorize:"..vals.color..":127", + }) + + for _, obj in pairs(minetest.get_objects_inside_radius(pos, d)) do + + local entity = obj:get_luaentity() + if obj:is_player() or entity._cmi_is_mob then + + vals.def.potion_fun(obj) + vals.timer = vals.timer / 2 + + end + end + + if vals.timer <= 0 then lingering_effect_at[pos] = nil end + + end + lingering_timer = 0 + end +end) + + + +local function register_lingering(name, descr, color, def) + + local id = "mcl_potions:"..name.."_lingering" + minetest.register_craftitem(id, { + description = descr, + inventory_image = lingering_image(color), + groups = {brewitem=1, not_in_creative_inventory=0}, + on_use = function(item, placer, pointed_thing) + local velocity = 10 + local dir = placer:get_look_dir(); + local pos = placer:getpos(); + local obj = minetest.add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying") + obj:setvelocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity}) + obj:setacceleration({x=0, y=-9.8, z=0}) + if not minetest.settings:get_bool("creative_mode") then + item:take_item() + end + return item + end, + stack_max = 1, + }) + + local w = 0.7 + + minetest.register_entity(id.."_flying",{ + textures = {lingering_image(color)}, + hp_max = 1, + visual_size = {x=w/2,y=w/2}, + collisionbox = {0,0,0,0,0,0}, + on_step = function(self, dtime) + local pos = self.object:getpos() + local node = minetest.get_node(pos) + local n = node.name + local d = 4 + if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" or mcl_potions.is_obj_hit(self, pos) then + minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) + add_lingering_effect(pos, color, def) + minetest.add_particlespawner({ + amount = 40, + time = 1, + minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, + maxpos = {x=pos.x+d, y=pos.y+1, z=pos.z+d}, + minvel = {x=-0.5, y=0, z=-0.5}, + maxvel = {x=0.5, y=0.5, z=0.5}, + minacc = {x=-0.2, y=0, z=-0.2}, + maxacc = {x=0.2, y=.05, z=0.2}, + minexptime = 1, + maxexptime = 2, + minsize = 1, + maxsize = 2, + collisiondetection = true, + vertical = false, + texture = "mcl_potions_sprite.png^[colorize:"..color..":127", + }) + self.object:remove() + end + end, + }) +end + +register_lingering("water", "Lingering Potion", "#0000FF", { + potion_fun = function(player) end, +}) + +register_lingering("river_water", "Lingering Potion", "#0000FF", { + potion_fun = function(player) end, +}) + +register_lingering("awkward", "Lingering Awkward Potion", "#0000FF", { + potion_fun = function(player) end, +}) + +register_lingering("mundane", "Lingering Mundane Potion", "#0000FF", { + potion_fun = function(player) end, +}) + +register_lingering("thick", "Lingering Thick Potion", "#0000FF", { + potion_fun = function(player) end, +}) + +register_lingering("healing", "Lingering Healing", "#AA0000", { + potion_fun = function(player) player:set_hp(player:get_hp() + 4*0.5) end, +}) + +register_lingering("healing_2", "Lingering Healing II", "#DD0000", { + potion_fun = function(player, redx) player:set_hp(player:get_hp() + 8*0.5) end, +}) + +register_lingering("harming", "Lingering Harming", "#660099", { + potion_fun = function(player, redx) mcl_potions.healing_func(player, -6*0.5) end, +}) + +register_lingering("harming_2", "Lingering Harming II", "#330066", { + potion_fun = function(player, redx) mcl_potions.healing_func(player, -12*0.5) end, +}) + +register_lingering("leaping", "Lingering Leaping", "#00CC33", { + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, mcl_potions.DURATION*0.25) end +}) + +register_lingering("leaping_2", "Lingering Leaping II", "#00EE33", { + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.4, mcl_potions.DURATION_2*0.25) end +}) + +register_lingering("leaping_plus", "Lingering Leaping +", "#00DD33", { + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, mcl_potions.DURATION_PLUS*0.25) end +}) + +register_lingering("swiftness", "Lingering Swiftness", "#009999", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, mcl_potions.DURATION*0.25) end +}) + +register_lingering("swiftness_2", "Lingering Swiftness II", "#00BBBB", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.4, mcl_potions.DURATION*0.25) end +}) + +register_lingering("swiftness_plus", "Lingering Swiftness +", "#00BBBB", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, mcl_potions.DURATION_PLUS*0.25) end +}) + +register_lingering("slowness", "Lingering Slowness", "#000080", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25) end +}) + +register_lingering("slowness_plus", "Lingering Slowness +", "#000066", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, mcl_potions.DURATION_PLUS*mcl_potions.INV_FACTOR*0.25) end +}) + +register_lingering("slowness_2", "Lingering Slowness IV", "#000066", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.4, 20*0.25) end +}) + +register_lingering("poison", "Lingering Poison", "#335544", { + potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 45*0.25) end +}) + +register_lingering("poison_2", "Lingering Poison II", "#446655", { + potion_fun = function(player, redx) mcl_potions.poison_func(player, 1.2, 21*0.25) end +}) + +register_lingering("poison_plus", "Lingering Poison +", "#557766", { + potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, 90*0.25) end +}) + +register_lingering("regeneration", "Lingering Regeneration", "#A52BB2", { + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 45*0.25) end +}) + +register_lingering("regeneration_2", "Lingering Regeneration II", "#B52CC2", { + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 1.2, 22*0.25) end +}) + +register_lingering("regeneration_plus", "Lingering Regeneration +", "#C53DD3", { + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, 90*0.25) end +}) + +register_lingering("invisibility", "Lingering Invisibility", "#B0B0B0", { + potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, mcl_potions.DURATION*0.25) end +}) + +register_lingering("invisibility_plus", "Lingering Invisibility +", "#A0A0A0", { + potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, mcl_potions.DURATION_PLUS*0.25) end +}) + +register_lingering("weakness", "Lingering Weakness", "#6600AA", { + potion_fun = function(player, redx) mcl_potions.weakness_func(player, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR*0.25) end +}) + +register_lingering("weakness_plus", "Lingering Weakness +", "#7700BB", { + potion_fun = function(player, redx) mcl_potions.weakness_func(player, -4, mcl_potions.DURATION_PLUS*mcl_potions.INV_FACTOR*0.25) end +}) + +register_lingering("fire_resistance", "Lingering Fire Resistance", "#D0A040", { + potion_fun = function(player, redx) mcl_potions.fire_resistance_func(player, mcl_potions.DURATION) end +}) + +register_lingering("fire_resistance_plus", "Lingering Fire Resistance +", "#E0B050", { + potion_fun = function(player, redx) mcl_potions.fire_resistance_func(player, mcl_potions.DURATION_PLUS) end +}) + +register_lingering("strength", "Lingering Strength", "#D444D4", { + potion_fun = function(player, redx) mcl_potions.strength_func(player, 3, mcl_potions.DURATION) end +}) + +register_lingering("strength_2", "Lingering Strength II", "#D444F4", { + potion_fun = function(player, redx) mcl_potions.strength_func(player, 6, smcl_potions.DURATION_2) end +}) + +register_lingering("strength_plus", "Lingering Strength +", "#D444E4", { + potion_fun = function(player, redx) mcl_potions.strength_func(player, 3, mcl_potions.DURATION_PLUS) end +}) diff --git a/mods/ITEMS/mcl_potions/potions.lua b/mods/ITEMS/mcl_potions/potions.lua new file mode 100644 index 0000000000..eaf6fd49cd --- /dev/null +++ b/mods/ITEMS/mcl_potions/potions.lua @@ -0,0 +1,844 @@ +local S = minetest.get_translator("mcl_potions") +local brewhelp = S("Try different combinations to create potions.") + +local potion_image = function(colorstring, opacity) + if not opacity then + opacity = 127 + end + return "mcl_potions_potion_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_potion_bottle.png" +end + +local how_to_drink = S("Use the “Place” key to drink it.") + +minetest.register_craftitem("mcl_potions:awkward", { + description = S("Awkward Potion"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("This potion has an awkward taste and is used for brewing more potions. Drinking it has no effect."), + _doc_items_usagehelp = how_to_drink, + stack_max = 1, + inventory_image = potion_image("#0000FF"), + wield_image = potion_image("#0000FF"), + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1}, + on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), + on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), +}) + +minetest.register_craftitem("mcl_potions:mundane", { + description = S("Mundane Potion"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("This potion has a clean taste and is used for brewing more potions. Drinking it has no effect."), + _doc_items_usagehelp = how_to_drink, + stack_max = 1, + inventory_image = potion_image("#0000FF"), + wield_image = potion_image("#0000FF"), + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=1 }, + on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), + on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), +}) + +minetest.register_craftitem("mcl_potions:thick", { + description = S("Thick Potion"), + _tt_help = S("No effect"), + _doc_items_longdesc = S("This potion has a bitter taste and is used for brewing more potions. Drinking it has no effect."), + _doc_items_usagehelp = how_to_drink, + stack_max = 1, + inventory_image = potion_image("#0000FF"), + wield_image = potion_image("#0000FF"), + groups = {brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + on_place = minetest.item_eat(0, "mcl_potions:glass_bottle"), + on_secondary_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), +}) + + +minetest.register_craftitem("mcl_potions:dragon_breath", { + description = S("Dragon's Breath"), + _doc_items_longdesc = brewhelp, + wield_image = "mcl_potions_dragon_breath.png", + inventory_image = "mcl_potions_dragon_breath.png", + groups = { brewitem = 1, not_in_creative_inventory = 0 }, + stack_max = 1, +}) + + +minetest.register_craftitem("mcl_potions:healing", { + description = S("Healing Potion"), + _tt_help = S("+2 Hearts"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#CC0000"), + inventory_image = potion_image("#CC0000"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, 4) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#CC0000") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, 4) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#CC0000") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:healing_2", { + description = S("Healing Potion II"), + _tt_help = S("+4 Hearts"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#DD0000"), + inventory_image = potion_image("#DD0000"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, 8) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#DD0000") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, 8) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#DD0000") + return itemstack + end, + +}) + +minetest.register_craftitem("mcl_potions:harming", { + description = S("Harming Potion"), + _tt_help = S("-3 Hearts"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#660099"), + inventory_image = potion_image("#660099"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, -6) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#660099") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, -6) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#660099") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:harming_2", { + description = S("Harming Potion II"), + _tt_help = S("-6 Hearts"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#330066"), + inventory_image = potion_image("#330066"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, -12) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#330066") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.healing_func(user, -12) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#330066") + return itemstack + end, +}) + + +minetest.register_craftitem("mcl_potions:night_vision", { + description = S("Night Vision Potion"), + _tt_help = S("3:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#1010AA"), + inventory_image = potion_image("#1010AA"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.night_vision_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#1010AA") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.night_vision_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#1010AA") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:night_vision_plus", { + description = S("Night Vision Potion +"), + _tt_help = S("8:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#2020BA"), + inventory_image = potion_image("#2020BA"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.night_vision_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#2020BA") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.night_vision_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#2020BA") + return itemstack + end, +}) + + +minetest.register_craftitem("mcl_potions:swiftness", { + description = S("Swiftness Potion"), + _tt_help = S("+20% | 3:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#009999"), + inventory_image = potion_image("#009999"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 1.2, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#009999") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 1.2, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#009999") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:swiftness_2", { + description = S("Swiftness Potion II"), + _tt_help = S("+40% | 1:30"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#00BBBB"), + inventory_image = potion_image("#00BBBB"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 1.4, mcl_potions.DURATION_2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00BBBB") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 1.4, mcl_potions.DURATION_2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00BBBB") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:swiftness_plus", { + description = S("Swiftness Potion +"), + _tt_help = S("+20% | 8:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#00AAAA"), + inventory_image = potion_image("#00AAAA"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 1.2, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00AAAA") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 1.2, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00AAAA") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:slowness", { + description = S("Slowness Potion"), + _tt_help = S("-15% | 1:30"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#000080"), + inventory_image = potion_image("#000080"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 0.85, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#000080") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 0.85, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#000080") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:slowness_plus", { + description = S("Slowness Potion +"), + _tt_help = S("-15% | 4:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#000066"), + inventory_image = potion_image("#000066"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 0.85, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#000066") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 0.85, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#000066") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:slowness_2", { + description = S("Slowness Potion IV"), + _tt_help = S("-60% | 0:20"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#000090"), + inventory_image = potion_image("#000090"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 0.40, 20) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#000090") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.swiftness_func(user, 0.40, 20) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#000090") + return itemstack + end, +}) + + +minetest.register_craftitem("mcl_potions:leaping", { + description = S("Leaping Potion"), + _tt_help = S("+50% | 3:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#00CC33"), + inventory_image = potion_image("#00CC33"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.leaping_func(user, 1.5, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00CC33") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.leaping_func(user, 1.5, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00CC33") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:leaping_2", { + description = S("Leaping Potion II"), + _tt_help = S("+125% | 1:30"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#00EE33"), + inventory_image = potion_image("#00EE33"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.leaping_func(user, 2.25, mcl_potions.DURATION_2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00EE33") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.leaping_func(user, 2.25, mcl_potions.DURATION_2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00EE33") + return itemstack + end, +}) + +minetest.register_craftitem("mcl_potions:leaping_plus", { + description = S("Leaping Potion +"), + _tt_help = S("+50% | 8:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#00DD33"), + inventory_image = potion_image("#00DD33"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.leaping_func(user, 1.5, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00DD33") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.leaping_func(user, 1.5, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#00DD33") + return itemstack + end, +}) + + +minetest.register_craftitem("mcl_potions:weakness", { + description = S("Weakness Potion"), + _tt_help = S("-2 hearts per damage | 1:30"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#6600AA"), + inventory_image = potion_image("#6600AA"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#6600AA") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, -4, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#6600AA") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:weakness_plus", { + description = S("Weakness Potion +"), + _tt_help = S("-2 hearts per damage | 4:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#7700BB"), + inventory_image = potion_image("#7700BB"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, -4, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#7700BB") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, -4, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#7700BB") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:strength", { + description = S("Strength Potion"), + _tt_help = S("+1.5 hearts per damage | 3:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#D444D4"), + inventory_image = potion_image("#D444D4"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, 3, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D444D4") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, 3, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D444D4") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:strength_2", { + description = S("Strength Potion II"), + _tt_help = S("+3 hearts per damage | 1:30"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#D444E4"), + inventory_image = potion_image("#D444E4"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, 6, mcl_potions.DURATION_2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D444E4") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, 6, mcl_potions.DURATION_2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D444E4") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:strength_plus", { + description = S("Strength Potion +"), + _tt_help = S("1.5 hearts per damage | 8:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#D444F4"), + inventory_image = potion_image("#D444F4"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, 3, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D444F4") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.weakness_func(user, 3, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D444F4") + return itemstack + end +}) +minetest.register_craftitem("mcl_potions:poison", { + description = S("Poison Potion"), + _tt_help = S("-1/2 Heart / 2.5sec | 0:45"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#225533"), + inventory_image = potion_image("#225533"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.poison_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#225533") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.poison_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#225533") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:poison_2", { + description = S("Poison Potion II"), + _tt_help = S("-1/2 Heart / 1.2sec | 0:21"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#447755"), + inventory_image = potion_image("#447755"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.poison_func(user, 1.2, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#447755") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.poison_func(user, 1.2, mcl_potions.DURATION_2*mcl_potions.INV_FACTOR*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#447755") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:poison_plus", { + description = S("Poison Potion +"), + _tt_help = S("-1/2 Heart / 2.5sec | 1:30"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#336644"), + inventory_image = potion_image("#336644"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.poison_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#336644") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.poison_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#336644") + return itemstack + end +}) + + +minetest.register_craftitem("mcl_potions:regeneration", { + description = S("Regeneration Potion"), + _tt_help = S("+1/2 Heart / 2.5sec | 0:45"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#A52BB2"), + inventory_image = potion_image("#A52BB2"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.regeneration_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR^2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#A52BB2") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.regeneration_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR^2) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#A52BB2") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:regeneration_2", { + description = S("Regeneration Potion II"), + _tt_help = S("+1/2 Heart / 1.2sec | 0:22"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#B52CC2"), + inventory_image = potion_image("#B52CC2"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.regeneration_func(user, 1.2, mcl_potions.DURATION*mcl_potions.INV_FACTOR^3 + 1) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#B52CC2") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.regeneration_func(user, 1.2, mcl_potions.DURATION*mcl_potions.INV_FACTOR^3 + 1) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#B52CC2") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:regeneration_plus", { + description = S("Regeneration Potion +"), + _tt_help = S("+1/2 Heart / 2.5sec | 1:30"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#C53DD3"), + inventory_image = potion_image("#C53DD3"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.regeneration_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#C53DD3") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.regeneration_func(user, 2.5, mcl_potions.DURATION*mcl_potions.INV_FACTOR) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#C53DD3") + return itemstack + end +}) + + +minetest.register_craftitem("mcl_potions:invisibility", { + description = S("Invisibility Potion"), + _tt_help = S("3:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#B0B0B0"), + inventory_image = potion_image("#B0B0B0"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.invisiblility_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#B0B0B0") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.invisiblility_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#B0B0B0") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:invisibility_plus", { + description = S("Invisibility Potion +"), + _tt_help = S("8:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#A0A0A0"), + inventory_image = potion_image("#A0A0A0"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.invisiblility_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#A0A0A0") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.invisiblility_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#A0A0A0") + return itemstack + end +}) + +-- Look into reducing attack on punch +minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) + if puncher:get_attribute("weakness") then + print("Weakness Active") + end +end) + + +minetest.register_craftitem("mcl_potions:water_breathing", { + description = S("Water Breathing Potion"), + _tt_help = S("3:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#0000AA"), + inventory_image = potion_image("#0000AA"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.water_breathing_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#0000AA") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.water_breathing_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#0000AA") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:water_breathing_plus", { + description = S("Water Breathing Potion +"), + _tt_help = S("8:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#0000CC"), + inventory_image = potion_image("#0000CC"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.water_breathing_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#0000CC") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.water_breathing_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#0000CC") + return itemstack + end +}) + + +minetest.register_craftitem("mcl_potions:fire_resistance", { + description = S("Fire Resistance Potion"), + _tt_help = S("3:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#D0A040"), + inventory_image = potion_image("#D0A040"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.fire_resistance_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D0A040") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.fire_resistance_func(user, mcl_potions.DURATION) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#D0A040") + return itemstack + end +}) + +minetest.register_craftitem("mcl_potions:fire_resistance_plus", { + description = S("Fire Resistance Potion +"), + _tt_help = S("8:00"), + _doc_items_longdesc = brewhelp, + wield_image = potion_image("#E0B050"), + inventory_image = potion_image("#E0B050"), + groups = { brewitem=1, food=3, can_eat_when_full=1, not_in_creative_inventory=0 }, + stack_max = 1, + + on_place = function(itemstack, user, pointed_thing) + mcl_potions.fire_resistance_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#E0B050") + return itemstack + end, + + on_secondary_use = function(itemstack, user, pointed_thing) + mcl_potions.fire_resistance_func(user, mcl_potions.DURATION_PLUS) + minetest.do_item_eat(0, "mcl_potions:glass_bottle", itemstack, user, pointed_thing) + mcl_potions._use_potion(itemstack, user, "#E0B050") + return itemstack + end +}) diff --git a/mods/ITEMS/mcl_potions/sounds/mcl_potions_breaking_glass.ogg b/mods/ITEMS/mcl_potions/sounds/mcl_potions_breaking_glass.ogg new file mode 100755 index 0000000000..4cb7b5a0d4 Binary files /dev/null and b/mods/ITEMS/mcl_potions/sounds/mcl_potions_breaking_glass.ogg differ diff --git a/mods/ITEMS/mcl_potions/sounds/mcl_potions_drinking.ogg b/mods/ITEMS/mcl_potions/sounds/mcl_potions_drinking.ogg new file mode 100644 index 0000000000..6e3978d292 Binary files /dev/null and b/mods/ITEMS/mcl_potions/sounds/mcl_potions_drinking.ogg differ diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua new file mode 100644 index 0000000000..483a9a0dc6 --- /dev/null +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -0,0 +1,231 @@ +local splash_image = function(colorstring, opacity) + if not opacity then + opacity = 127 + end + return "mcl_potions_splash_overlay.png^[colorize:"..colorstring..":"..tostring(opacity).."^mcl_potions_splash_bottle.png" +end + + +local function register_splash(name, descr, color, def) + + local id = "mcl_potions:"..name.."_splash" + minetest.register_craftitem(id, { + description = descr, + inventory_image = splash_image(color), + groups = {brewitem=1, not_in_creative_inventory=0}, + on_use = function(item, placer, pointed_thing) + local velocity = 10 + local dir = placer:get_look_dir(); + local pos = placer:get_pos(); + local obj = minetest.add_entity({x=pos.x+dir.x,y=pos.y+2+dir.y,z=pos.z+dir.z}, id.."_flying") + obj:set_velocity({x=dir.x*velocity,y=dir.y*velocity,z=dir.z*velocity}) + obj:set_acceleration({x=0, y=-9.8, z=0}) + if not minetest.settings:get_bool("creative_mode") then + item:take_item() + end + return item + end, + stack_max = 1, + }) + + local w = 0.7 + + minetest.register_entity(id.."_flying",{ + textures = {splash_image(color)}, + hp_max = 1, + visual_size = {x=w/2,y=w/2}, + collisionbox = {0,0,0,0,0,0}, + on_step = function(self, dtime) + local pos = self.object:getpos() + local node = minetest.get_node(pos) + local n = node.name + local d = 2 + local redux_map = {7/8,0.5,0.25} + if n ~= "air" and n ~= "mcl_portals:portal" and n ~= "mcl_portals:portal_end" or mcl_potions.is_obj_hit(self, pos) then + minetest.sound_play("mcl_potions_breaking_glass", {pos = pos, max_hear_distance = 16, gain = 1}) + minetest.add_particlespawner({ + amount = 50, + time = 2, + minpos = {x=pos.x-d, y=pos.y+0.5, z=pos.z-d}, + maxpos = {x=pos.x+d, y=pos.y+d, z=pos.z+d}, + minvel = {x=-1, y=0, z=-1}, + maxvel = {x=1, y=0.5, z=1}, + minacc = {x=-0.5, y=0, z=-0.5}, + maxacc = {x=0.5, y=.2, z=0.5}, + minexptime = 1, + maxexptime = 3, + minsize = 2, + maxsize = 4, + collisiondetection = true, + vertical = false, + texture = "mcl_potions_sprite.png^[colorize:"..color..":127", + }) + self.object:remove() + for _,obj in pairs(minetest.get_objects_inside_radius(pos, 4)) do + + local entity = obj:get_luaentity() + if obj:is_player() or entity._cmi_is_mob then + + local pos2 = obj:get_pos() + local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2)) + if rad > 0 then def.potion_fun(obj, redux_map[rad]) else def.potion_fun(obj, 1) end + + end + end + + end + end, + }) +end + +local splash_DUR = mcl_potions.DURATION*mcl_potions.SPLASH_FACTOR +local splash_DUR_2 = mcl_potions.DURATION_2*mcl_potions.SPLASH_FACTOR +local splash_DUR_pl = mcl_potions.DURATION_PLUS*mcl_potions.SPLASH_FACTOR + +register_splash("water", "Splash Water", "#0000FF", { + potion_fun = function(player, redx) end, +}) + +register_splash("river_water", "Splash River Water", "#0000FF", { + potion_fun = function(player, redx) end, +}) + +register_splash("awkward", "Splash Awkward Potion", "#0000FF", { + potion_fun = function(player, redx) end, +}) + +register_splash("mundane", "Splash Mundane Potion", "#0000FF", { + potion_fun = function(player, redx) end, +}) + +register_splash("thick", "Splash Thick Potion", "#0000FF", { + potion_fun = function(player, redx) end, +}) + +register_splash("healing", "Splash Healing", "#AA0000", { + potion_fun = function(player, redx) mcl_potions.healing_func(player, 3*redx) end, +}) + +register_splash("healing_2", "Splash Healing II", "#DD0000", { + potion_fun = function(player, redx) mcl_potions.healing_func(player, 6*redx) end, +}) + +register_splash("harming", "Splash Harming", "#660099", { + potion_fun = function(player, redx) mcl_potions.healing_func(player, -4*redx) end, +}) + +register_splash("harming_2", "Splash Harming II", "#330066", { + potion_fun = function(player, redx) mcl_potions.healing_func(player, -6*redx) end, +}) + +register_splash("leaping", "Splash Leaping", "#00CC33", { + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, splash_DUR*redx) end +}) + +register_splash("leaping_2", "Splash Leaping II", "#00EE33", { + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.4, splash_DUR_2*redx) end +}) + +register_splash("leaping_plus", "Splash Leaping +", "#00DD33", { + potion_fun = function(player, redx) mcl_potions.leaping_func(player, 1.2, splash_DUR_pl*redx) end +}) + +register_splash("swiftness", "Splash Swiftness", "#009999", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, splash_DUR*redx) end +}) + +register_splash("swiftness_2", "Splash Swiftness II", "#00BBBB", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.4, splash_DUR_2*redx) end +}) + +register_splash("swiftness_plus", "Splash Swiftness +", "#00BBBB", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 1.2, splash_DUR_pl*redx) end +}) + +register_splash("slowness", "Splash Slowness", "#000080", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, splash_DUR*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("slowness_2", "Splash Slowness IV", "#000080", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.4, 20*mcl_potions.SPLASH_FACTOR*redx) end +}) + +register_splash("slowness_plus", "Splash Slowness +", "#000066", { + potion_fun = function(player, redx) mcl_potions.swiftness_func(player, 0.85, splash_DUR_pl*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("poison", "Splash Poison", "#335544", { + potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, splash_DUR*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("poison_2", "Splash Poison II", "#446655", { + potion_fun = function(player, redx) mcl_potions.poison_func(player, 1.2, splash_DUR_2*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("poison_plus", "Splash Poison +", "#557766", { + potion_fun = function(player, redx) mcl_potions.poison_func(player, 2.5, splash_DUR_pl*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("regeneration", "Splash Regeneration", "#A52BB2", { + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, splash_DUR*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("regeneration_2", "Splash Regeneration II", "#B52CC2", { + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 1.2, (splash_DUR_2*mcl_potions.INV_FACTOR + 1)*redx) end +}) + +register_splash("regeneration_plus", "Splash Regeneration +", "#C53DD3", { + potion_fun = function(player, redx) mcl_potions.regeneration_func(player, 2.5, splash_DUR_pl*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("invisibility", "Splash Invisibility", "#B0B0B0", { + potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, splash_DUR*redx) end +}) + +register_splash("invisibility_plus", "Splash Invisibility +", "#A0A0A0", { + potion_fun = function(player, redx) mcl_potions.invisiblility_func(player, splash_DUR_pl*redx) end +}) + +register_splash("weakness", "Splash Weakness", "#6600AA", { + potion_fun = function(player, redx) mcl_potions.weakness_func(player, -4, splash_DUR*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("weakness_plus", "Splash Weakness +", "#7700BB", { + potion_fun = function(player, redx) mcl_potions.weakness_func(player, -4, splash_DUR_pl*mcl_potions.INV_FACTOR*redx) end +}) + +register_splash("strength", "Splash Strength", "#D444D4", { + potion_fun = function(player, redx) mcl_potions.strength_func(player, 3, splash_DUR*redx) end +}) + +register_splash("strength_2", "Splash Strength II", "#D444F4", { + potion_fun = function(player, redx) mcl_potions.strength_func(player, 6, splash_DUR_2*redx) end +}) + +register_splash("strength_plus", "Splash Strength +", "#D444E4", { + potion_fun = function(player, redx) mcl_potions.strength_func(player, 3, splash_DUR_pl*redx) end +}) + +register_splash("water_breathing", "Splash Water Breathing", "#0000AA", { + potion_fun = function(player, redx) mcl_potions.water_breathing_func(player, splash_DUR*redx) end +}) + +register_splash("water_breathing_plus", "Splash Water Breathing +", "#0000CC", { + potion_fun = function(player, redx) mcl_potions.water_breathing_func(player, splash_DUR_pl*redx) end +}) + +register_splash("fire_resistance", "Splash Fire Resistance", "#D0A040", { + potion_fun = function(player, redx) mcl_potions.fire_resistance_func(player, splash_DUR*redx) end +}) + +register_splash("fire_resistance_plus", "Splash Fire Resistance +", "#E0B050", { + potion_fun = function(player, redx) mcl_potions.fire_resistance_func(player, splash_DUR_pl*redx) end +}) + +register_splash("night_vision", "Splash Night Vision", "#1010AA", { + potion_fun = function(player, redx) mcl_potions.night_vision_func(player, splash_DUR*redx) end +}) + +register_splash("night_vision_plus", "Splash Night Vision +", "#2020BA", { + potion_fun = function(player, redx) mcl_potions.night_vision_func(player, splash_DUR_pl*redx) end +}) diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle_drinkable.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle.png similarity index 100% rename from mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle_drinkable.png rename to mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle.png diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle_empty.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle_empty.png deleted file mode 100644 index 66d6424bfd..0000000000 Binary files a/mods/ITEMS/mcl_potions/textures/mcl_potions_potion_bottle_empty.png and /dev/null differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_bottle.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_bottle.png new file mode 100644 index 0000000000..17a69a8b62 Binary files /dev/null and b/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_bottle.png differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_overlay.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_overlay.png new file mode 100644 index 0000000000..9acbce6cda Binary files /dev/null and b/mods/ITEMS/mcl_potions/textures/mcl_potions_splash_overlay.png differ diff --git a/mods/ITEMS/mcl_potions/textures/mcl_potions_sprite.png b/mods/ITEMS/mcl_potions/textures/mcl_potions_sprite.png new file mode 100644 index 0000000000..17391b1fd6 Binary files /dev/null and b/mods/ITEMS/mcl_potions/textures/mcl_potions_sprite.png differ diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index efd39ae607..be0fdf4f40 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -2,9 +2,9 @@ Sprint mod for Minetest by GunshipPenguin To the extent possible under law, the author(s) -have dedicated all copyright and related and neighboring rights +have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is -distributed without any warranty. +distributed without any warranty. ]] --Configuration variables, these are all explained in README.md @@ -29,10 +29,11 @@ minetest.register_on_joinplayer(function(player) players[playerName] = { sprinting = false, - timeOut = 0, + timeOut = 0, shouldSprint = false, lastPos = player:get_pos(), sprintDistance = 0, + fov = 1.0 } end) minetest.register_on_leaveplayer(function(player) @@ -43,10 +44,14 @@ end) local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) local player = minetest.get_player_by_name(playerName) if players[playerName] then - players[playerName]["sprinting"] = sprinting + players[playerName].sprinting = sprinting if sprinting == true then + players[playerName].fov = math.min(players[playerName].fov + 0.05, 1.2) + player:set_fov(players[playerName].fov, true, 0.15) playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) elseif sprinting == false then + players[playerName].fov = math.max(players[playerName].fov - 0.05, 1.0) + player:set_fov(players[playerName].fov, true, 0.15) playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") end return true @@ -68,7 +73,7 @@ minetest.register_globalstep(function(dtime) else players[playerName]["shouldSprint"] = false end - + local playerPos = player:get_pos() --If the player is sprinting, create particles behind and cause exhaustion if playerInfo["sprinting"] == true and gameTime % 0.1 == 0 then @@ -117,7 +122,7 @@ minetest.register_globalstep(function(dtime) elseif players[playerName]["shouldSprint"] == false then setSprinting(playerName, false) end - + end end end)