Initial commit
This commit is contained in:
commit
34fe189a3c
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright © 2018 Evert "Diamond" Prants <evert@lunasqu.ee>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the “Software”), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
1143
README.html
Normal file
1143
README.html
Normal file
File diff suppressed because one or more lines are too long
62
README.md
Normal file
62
README.md
Normal file
@ -0,0 +1,62 @@
|
||||
# Universal Fluid API
|
||||
This API adds support for `fluid_buffers` inside nodes. This means that nodes can contain fluid.
|
||||
|
||||
## How to Use
|
||||
1. Add the node to the `fluid_container` group.
|
||||
2. Add the following to the node defintion:
|
||||
```
|
||||
fluid_buffers = {
|
||||
buffer_name = {
|
||||
capacity = 2000,
|
||||
accepts = {"default:water_source", "group:water_source"}, -- you can also set this to true to accept any fluid!
|
||||
drainable = true,
|
||||
},
|
||||
}
|
||||
```
|
||||
3. Set the appropriate metadata.
|
||||
|
||||
* **buffer_name_fluid** = `string` - Source node of the fluid.
|
||||
* **buffer_name_fluid_storage** = `int` - How much fluid there is in this buffer.
|
||||
|
||||
## API
|
||||
All numbers are in **milli-buckets** (1 bucket = 1000 mB).
|
||||
|
||||
* `fluid_lib.get_node_buffers(pos)`
|
||||
* Returns all the fluid buffers present inside a node.
|
||||
|
||||
* `fluid_lib.get_buffer_data(pos, buffer)`
|
||||
* Returns all the information about this buffer.
|
||||
```
|
||||
{
|
||||
fluid = fluid source block,
|
||||
amount = amount of fluid,
|
||||
accepts = list of accepted fluids,
|
||||
capacity = capacity of the buffer,
|
||||
drainable = is this buffer drainable,
|
||||
}
|
||||
```
|
||||
|
||||
* `fluid_lib.buffer_accepts_fluid(pos, buffer, fluid)`
|
||||
* Returns `true` if `fluid` can go inside the `buffer` at `pos`.
|
||||
|
||||
* `fluid_lib.can_insert_into_buffer(pos, buffer, fluid, count)`
|
||||
* Returns the amount of `fluid` that can go inside the `buffer` at `pos`. If all of it fits, it returns `count`.
|
||||
|
||||
* `fluid_lib.insert_into_buffer(pos, buffer, fluid, count)`
|
||||
* Actually does the inserting.
|
||||
|
||||
* `fluid_lib.can_take_from_buffer(pos, buffer, count)`
|
||||
* Returns the amount of `fluid` that can be taken from the `buffer` at `pos`.
|
||||
|
||||
* `fluid_lib.take_from_buffer(pos, buffer, count)`
|
||||
* Actually takes the fluid. On success, returns the source block that was taken and how much was actually taken.
|
||||
|
||||
* `bucket.register_liquid(source, flowing, itemname, inventory_image, name, groups, force_renew)`
|
||||
* Works exactly the same as the default `bucket` mod, except it adds callbacks to insert/take fluid from nodes.
|
||||
* `inventory_image` can be a **ColorString**.
|
||||
|
||||
## License
|
||||
### bucket
|
||||
See [bucket/license.txt](bucket/license.txt)
|
||||
### fluid_lib
|
||||
See [LICENSE](LICENSE)
|
18
bucket/README.md
Normal file
18
bucket/README.md
Normal file
@ -0,0 +1,18 @@
|
||||
bucket
|
||||
=========================
|
||||
This is an addition to the Minetest Game `bucket` mod that implements the `fluid_lib` API seamlessly.
|
||||
See license.txt for original license information.
|
||||
|
||||
Authors of source code
|
||||
----------------------
|
||||
Kahrl <kahrl@gmx.net> (LGPL 2.1)
|
||||
|
||||
celeron55, Perttu Ahola <celeron55@gmail.com> (LGPL 2.1)
|
||||
|
||||
Various Minetest developers and contributors (LGPL 2.1)
|
||||
|
||||
Modified by Evert "Diamond" Prants <evert@lunasqu.ee> (MIT)
|
||||
|
||||
Authors of media (textures)
|
||||
---------------------------
|
||||
ElementW (CC BY-SA 3.0)
|
1
bucket/depends.txt
Normal file
1
bucket/depends.txt
Normal file
@ -0,0 +1 @@
|
||||
default,fluid_lib
|
288
bucket/init.lua
Normal file
288
bucket/init.lua
Normal file
@ -0,0 +1,288 @@
|
||||
-- Minetest 0.4 mod: bucket
|
||||
-- See README.md for licensing and other information.
|
||||
|
||||
minetest.register_alias("bucket", "bucket:bucket_empty")
|
||||
minetest.register_alias("bucket_water", "bucket:bucket_water")
|
||||
minetest.register_alias("bucket_lava", "bucket:bucket_lava")
|
||||
|
||||
minetest.register_craft({
|
||||
output = 'bucket:bucket_empty 1',
|
||||
recipe = {
|
||||
{'default:steel_ingot', '', 'default:steel_ingot'},
|
||||
{'', 'default:steel_ingot', ''},
|
||||
}
|
||||
})
|
||||
|
||||
bucket = {}
|
||||
bucket.liquids = {}
|
||||
|
||||
local function check_protection(pos, name, text)
|
||||
if minetest.is_protected(pos, name) then
|
||||
minetest.log("action", (name ~= "" and name or "A mod")
|
||||
.. " tried to " .. text
|
||||
.. " at protected position "
|
||||
.. minetest.pos_to_string(pos)
|
||||
.. " with a bucket")
|
||||
minetest.record_protection_violation(pos, name)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Register a new liquid
|
||||
-- source = name of the source node
|
||||
-- flowing = name of the flowing node
|
||||
-- itemname = name of the new bucket item (or nil if liquid is not takeable)
|
||||
-- inventory_image = texture of the new bucket item (ignored if itemname == nil)
|
||||
-- name = text description of the bucket item
|
||||
-- groups = (optional) groups of the bucket item, for example {water_bucket = 1}
|
||||
-- force_renew = (optional) bool. Force the liquid source to renew if it has a
|
||||
-- source neighbour, even if defined as 'liquid_renewable = false'.
|
||||
-- Needed to avoid creating holes in sloping rivers.
|
||||
-- This function can be called from any mod (that depends on bucket).
|
||||
function bucket.register_liquid(source, flowing, itemname, inventory_image, name,
|
||||
groups, force_renew)
|
||||
bucket.liquids[source] = {
|
||||
source = source,
|
||||
flowing = flowing,
|
||||
itemname = itemname,
|
||||
force_renew = force_renew,
|
||||
}
|
||||
bucket.liquids[flowing] = bucket.liquids[source]
|
||||
|
||||
if itemname ~= nil then
|
||||
-- Create an image using a color
|
||||
if inventory_image:match("^#") then
|
||||
inventory_image = "bucket.png^(bucket_mask.png^[multiply:".. inventory_image ..")"
|
||||
end
|
||||
|
||||
minetest.register_craftitem(itemname, {
|
||||
description = name,
|
||||
inventory_image = inventory_image,
|
||||
stack_max = 1,
|
||||
liquids_pointable = true,
|
||||
groups = groups,
|
||||
|
||||
on_place = function(itemstack, user, pointed_thing)
|
||||
-- Must be pointing to node
|
||||
if pointed_thing.type ~= "node" then
|
||||
return
|
||||
end
|
||||
|
||||
local node = minetest.get_node_or_nil(pointed_thing.under)
|
||||
local ndef = node and minetest.registered_nodes[node.name]
|
||||
|
||||
-- Call on_rightclick if the pointed node defines it
|
||||
if ndef and ndef.on_rightclick and
|
||||
not (user and user:is_player() and
|
||||
user:get_player_control().sneak) then
|
||||
return ndef.on_rightclick(
|
||||
pointed_thing.under,
|
||||
node, user,
|
||||
itemstack)
|
||||
end
|
||||
|
||||
local lpos
|
||||
|
||||
-- Check if pointing to a buildable node
|
||||
if ndef and ndef.buildable_to then
|
||||
-- buildable; replace the node
|
||||
lpos = pointed_thing.under
|
||||
else
|
||||
-- not buildable to; place the liquid above
|
||||
-- check if the node above can be replaced
|
||||
|
||||
lpos = pointed_thing.above
|
||||
node = minetest.get_node_or_nil(lpos)
|
||||
local above_ndef = node and minetest.registered_nodes[node.name]
|
||||
|
||||
if not above_ndef or not above_ndef.buildable_to then
|
||||
-- do not remove the bucket with the liquid
|
||||
return itemstack
|
||||
end
|
||||
end
|
||||
|
||||
if check_protection(lpos, user
|
||||
and user:get_player_name()
|
||||
or "", "place "..source) then
|
||||
return
|
||||
end
|
||||
|
||||
-- Fill any fluid buffers if present
|
||||
local place = true
|
||||
if ndef.fluid_buffers then
|
||||
local buffers = fluid_lib.get_node_buffers(lpos)
|
||||
for buffer in pairs(buffers) do
|
||||
if fluid_lib.can_insert_into_buffer(lpos, buffer, source, 1000) == 1000 then
|
||||
fluid_lib.insert_into_buffer(lpos, buffer, source, 1000)
|
||||
place = false
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if place then
|
||||
minetest.set_node(lpos, {name = source})
|
||||
end
|
||||
|
||||
return ItemStack("bucket:bucket_empty")
|
||||
end
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_craftitem("bucket:bucket_empty", {
|
||||
description = "Empty Bucket",
|
||||
inventory_image = "bucket.png",
|
||||
stack_max = 99,
|
||||
liquids_pointable = true,
|
||||
groups = {bucket_empty = 1},
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type == "object" then
|
||||
pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil)
|
||||
return user:get_wielded_item()
|
||||
elseif pointed_thing.type ~= "node" then
|
||||
-- do nothing if it's neither object nor node
|
||||
return
|
||||
end
|
||||
-- Check if pointing to a liquid source
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
local liquiddef = bucket.liquids[node.name]
|
||||
local item_count = user:get_wielded_item():get_count()
|
||||
|
||||
if liquiddef ~= nil
|
||||
and liquiddef.itemname ~= nil
|
||||
and node.name == liquiddef.source then
|
||||
if check_protection(pointed_thing.under,
|
||||
user:get_player_name(),
|
||||
"take ".. node.name) then
|
||||
return
|
||||
end
|
||||
|
||||
-- default set to return filled bucket
|
||||
local giving_back = liquiddef.itemname
|
||||
|
||||
-- check if holding more than 1 empty bucket
|
||||
if item_count > 1 then
|
||||
|
||||
-- if space in inventory add filled bucked, otherwise drop as item
|
||||
local inv = user:get_inventory()
|
||||
if inv:room_for_item("main", {name=liquiddef.itemname}) then
|
||||
inv:add_item("main", liquiddef.itemname)
|
||||
else
|
||||
local pos = user:getpos()
|
||||
pos.y = math.floor(pos.y + 0.5)
|
||||
minetest.add_item(pos, liquiddef.itemname)
|
||||
end
|
||||
|
||||
-- set to return empty buckets minus 1
|
||||
giving_back = "bucket:bucket_empty "..tostring(item_count-1)
|
||||
|
||||
end
|
||||
|
||||
-- force_renew requires a source neighbour
|
||||
local source_neighbor = false
|
||||
if liquiddef.force_renew then
|
||||
source_neighbor =
|
||||
minetest.find_node_near(pointed_thing.under, 1, liquiddef.source)
|
||||
end
|
||||
if not (source_neighbor and liquiddef.force_renew) then
|
||||
minetest.add_node(pointed_thing.under, {name = "air"})
|
||||
end
|
||||
|
||||
return ItemStack(giving_back)
|
||||
else
|
||||
-- non-liquid nodes will have their on_punch triggered
|
||||
local node_def = minetest.registered_nodes[node.name]
|
||||
if node_def then
|
||||
node_def.on_punch(pointed_thing.under, node, user, pointed_thing)
|
||||
end
|
||||
return user:get_wielded_item()
|
||||
end
|
||||
end,
|
||||
on_place = function(itemstack, user, pointed_thing)
|
||||
-- Must be pointing to node
|
||||
if pointed_thing.type ~= "node" then
|
||||
return
|
||||
end
|
||||
|
||||
local lpos = pointed_thing.under
|
||||
local node = minetest.get_node_or_nil(lpos)
|
||||
local ndef = node and minetest.registered_nodes[node.name]
|
||||
|
||||
-- Call on_rightclick if the pointed node defines it
|
||||
if ndef and ndef.on_rightclick and
|
||||
not (user and user:is_player() and
|
||||
user:get_player_control().sneak) then
|
||||
return ndef.on_rightclick(
|
||||
lpos,
|
||||
node, user,
|
||||
itemstack)
|
||||
end
|
||||
|
||||
if check_protection(lpos, user
|
||||
and user:get_player_name()
|
||||
or "", "take "..source) then
|
||||
return
|
||||
end
|
||||
|
||||
itemstack = ItemStack("bucket:bucket_empty")
|
||||
|
||||
-- Remove fluid from buffers if present
|
||||
if ndef.fluid_buffers then
|
||||
local buffers = fluid_lib.get_node_buffers(lpos)
|
||||
for buffer in pairs(buffers) do
|
||||
if fluid_lib.can_take_from_buffer(lpos, buffer, 1000) == 1000 then
|
||||
local fluid = fluid_lib.take_from_buffer(lpos, buffer, 1000)
|
||||
if bucket.liquids[fluid] then
|
||||
itemstack = ItemStack(bucket.liquids[fluid].itemname)
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return itemstack
|
||||
end
|
||||
})
|
||||
|
||||
bucket.register_liquid(
|
||||
"default:water_source",
|
||||
"default:water_flowing",
|
||||
"bucket:bucket_water",
|
||||
"bucket_water.png",
|
||||
"Water Bucket",
|
||||
{water_bucket = 1}
|
||||
)
|
||||
|
||||
-- River water source is 'liquid_renewable = false' to avoid horizontal spread
|
||||
-- of water sources in sloping rivers that can cause water to overflow
|
||||
-- riverbanks and cause floods.
|
||||
-- River water source is instead made renewable by the 'force renew' option
|
||||
-- used here.
|
||||
|
||||
bucket.register_liquid(
|
||||
"default:river_water_source",
|
||||
"default:river_water_flowing",
|
||||
"bucket:bucket_river_water",
|
||||
"bucket_river_water.png",
|
||||
"River Water Bucket",
|
||||
{water_bucket = 1},
|
||||
true
|
||||
)
|
||||
|
||||
bucket.register_liquid(
|
||||
"default:lava_source",
|
||||
"default:lava_flowing",
|
||||
"bucket:bucket_lava",
|
||||
"bucket_lava.png",
|
||||
"Lava Bucket"
|
||||
)
|
||||
|
||||
minetest.register_craft({
|
||||
type = "fuel",
|
||||
recipe = "bucket:bucket_lava",
|
||||
burntime = 60,
|
||||
replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
|
||||
})
|
||||
|
51
bucket/license.txt
Normal file
51
bucket/license.txt
Normal file
@ -0,0 +1,51 @@
|
||||
License of source code
|
||||
----------------------
|
||||
|
||||
GNU Lesser General Public License, version 2.1
|
||||
Copyright (C) 2011-2016 Kahrl <kahrl@gmx.net>
|
||||
Copyright (C) 2011-2016 celeron55, Perttu Ahola <celeron55@gmail.com>
|
||||
Copyright (C) 2011-2016 Various Minetest developers and contributors
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it under the terms
|
||||
of the GNU Lesser General Public License as published by the Free Software Foundation;
|
||||
either version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
See the GNU Lesser General Public License for more details:
|
||||
https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
|
||||
|
||||
|
||||
Licenses of media (textures)
|
||||
----------------------------
|
||||
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)
|
||||
Copyright (C) 2015-2016 ElementW
|
||||
|
||||
You are free to:
|
||||
Share — copy and redistribute the material in any medium or format.
|
||||
Adapt — remix, transform, and build upon the material for any purpose, even commercially.
|
||||
The licensor cannot revoke these freedoms as long as you follow the license terms.
|
||||
|
||||
Under the following terms:
|
||||
|
||||
Attribution — You must give appropriate credit, provide a link to the license, and
|
||||
indicate if changes were made. You may do so in any reasonable manner, but not in any way
|
||||
that suggests the licensor endorses you or your use.
|
||||
|
||||
ShareAlike — If you remix, transform, or build upon the material, you must distribute
|
||||
your contributions under the same license as the original.
|
||||
|
||||
No additional restrictions — You may not apply legal terms or technological measures that
|
||||
legally restrict others from doing anything the license permits.
|
||||
|
||||
Notices:
|
||||
|
||||
You do not have to comply with the license for elements of the material in the public
|
||||
domain or where your use is permitted by an applicable exception or limitation.
|
||||
No warranties are given. The license may not give you all of the permissions necessary
|
||||
for your intended use. For example, other rights such as publicity, privacy, or moral
|
||||
rights may limit how you use the material.
|
||||
|
||||
For more details:
|
||||
http://creativecommons.org/licenses/by-sa/3.0/
|
2
bucket/mod.conf
Normal file
2
bucket/mod.conf
Normal file
@ -0,0 +1,2 @@
|
||||
name = bucket
|
||||
depends = default,fluid_lib
|
BIN
bucket/textures/bucket.png
Executable file
BIN
bucket/textures/bucket.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 205 B |
BIN
bucket/textures/bucket_lava.png
Normal file
BIN
bucket/textures/bucket_lava.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 221 B |
BIN
bucket/textures/bucket_mask.png
Normal file
BIN
bucket/textures/bucket_mask.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.0 KiB |
BIN
bucket/textures/bucket_river_water.png
Normal file
BIN
bucket/textures/bucket_river_water.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 221 B |
BIN
bucket/textures/bucket_water.png
Normal file
BIN
bucket/textures/bucket_water.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 221 B |
135
fluid_lib/buffer.lua
Normal file
135
fluid_lib/buffer.lua
Normal file
@ -0,0 +1,135 @@
|
||||
-- Fluid buffer support functions.
|
||||
|
||||
local function node_data(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
local nodedef = minetest.registered_nodes[node.name]
|
||||
return node, nodedef
|
||||
end
|
||||
|
||||
function fluid_lib.get_node_buffers(pos)
|
||||
local node, nodedef = node_data(pos)
|
||||
if not nodedef['fluid_buffers'] then
|
||||
return nil
|
||||
end
|
||||
|
||||
return nodedef['fluid_buffers']
|
||||
end
|
||||
|
||||
function fluid_lib.get_buffer_data(pos, buffer)
|
||||
local node, nodedef = node_data(pos)
|
||||
local buffers = fluid_lib.get_node_buffers(pos)
|
||||
|
||||
if not buffers[buffer] then
|
||||
return nil
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local fluid = meta:get_string(buffer .. "_fluid")
|
||||
local amount = meta:get_int(buffer .. "_fluid_storage")
|
||||
local capacity = buffers[buffer].capacity
|
||||
local accepts = buffers[buffer].accepts
|
||||
local drainable = buffers[buffer].drainable or true
|
||||
|
||||
return {
|
||||
fluid = fluid,
|
||||
amount = amount,
|
||||
accepts = accepts,
|
||||
capacity = capacity,
|
||||
drainable = drainable,
|
||||
}
|
||||
end
|
||||
|
||||
function fluid_lib.buffer_accepts_fluid(pos, buffer, fluid)
|
||||
local bfdata = fluid_lib.get_buffer_data(pos, buffer)
|
||||
if not bfdata then return false end
|
||||
|
||||
if bfdata.accepts == true or bfdata.accepts == fluid then
|
||||
return true
|
||||
end
|
||||
|
||||
if bfdata.fluid ~= "" and bfdata.fluid ~= fluid then
|
||||
return false
|
||||
end
|
||||
|
||||
if type(bfdata.accepts) ~= "table" then
|
||||
bfdata.accepts = { bfdata.accepts }
|
||||
end
|
||||
|
||||
for _,pf in pairs(bfdata.accepts) do
|
||||
if pf == fluid then
|
||||
return true
|
||||
elseif pf:match("^group") and ele.helpers.get_item_group(fluid, pf:gsub("group:", "")) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
||||
|
||||
function fluid_lib.can_insert_into_buffer(pos, buffer, fluid, count)
|
||||
local bfdata = fluid_lib.get_buffer_data(pos, buffer)
|
||||
if not bfdata then return 0 end
|
||||
if bfdata.fluid ~= fluid and bfdata.fluid ~= "" then return 0 end
|
||||
|
||||
local can_put = 0
|
||||
if bfdata.amount + count > bfdata.capacity then
|
||||
can_put = bfdata.capacity - bfdata.amount
|
||||
else
|
||||
can_put = count
|
||||
end
|
||||
|
||||
return can_put
|
||||
end
|
||||
|
||||
function fluid_lib.insert_into_buffer(pos, buffer, fluid, count)
|
||||
local bfdata = fluid_lib.get_buffer_data(pos, buffer)
|
||||
if not bfdata then return nil end
|
||||
if bfdata.fluid ~= fluid and bfdata.fluid ~= "" then return nil end
|
||||
|
||||
local can_put = fluid_lib.can_insert_into_buffer(pos, buffer, fluid, count)
|
||||
|
||||
if can_put == 0 then return count end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int(buffer .. "_fluid_storage", bfdata.amount + can_put)
|
||||
meta:set_string(buffer .. "_fluid", fluid)
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
function fluid_lib.can_take_from_buffer(pos, buffer, count)
|
||||
local bfdata = fluid_lib.get_buffer_data(pos, buffer)
|
||||
if not bfdata or not bfdata.drainable then return 0 end
|
||||
|
||||
local amount = bfdata.amount
|
||||
local take_count = 0
|
||||
|
||||
if amount < count then
|
||||
take_count = amount
|
||||
else
|
||||
take_count = count
|
||||
end
|
||||
|
||||
return take_count
|
||||
end
|
||||
|
||||
function fluid_lib.take_from_buffer(pos, buffer, count)
|
||||
local bfdata = fluid_lib.get_buffer_data(pos, buffer)
|
||||
if not bfdata then return nil end
|
||||
|
||||
local fluid = bfdata.fluid
|
||||
local amount = bfdata.amount
|
||||
|
||||
local take_count = fluid_lib.can_take_from_buffer(pos, buffer, count)
|
||||
|
||||
local new_storage = amount - take_count
|
||||
if new_storage == 0 then
|
||||
fluid = ""
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int(buffer .. "_fluid_storage", new_storage)
|
||||
meta:set_string(buffer .. "_fluid", fluid)
|
||||
|
||||
return bfdata.fluid, take_count
|
||||
end
|
12
fluid_lib/init.lua
Normal file
12
fluid_lib/init.lua
Normal file
@ -0,0 +1,12 @@
|
||||
-- Universal Fluid API implementation
|
||||
-- Copyright (c) 2018 Evert "Diamond" Prants <evert@lunasqu.ee>
|
||||
|
||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
||||
|
||||
fluid_lib = rawget(_G, "fluid_lib") or {}
|
||||
fluid_lib.modpath = modpath
|
||||
|
||||
fluid_lib.unit = "mB"
|
||||
fluid_lib.unit_description = "milli-bucket"
|
||||
|
||||
dofile(modpath.."/buffer.lua")
|
1
fluid_lib/mod.conf
Normal file
1
fluid_lib/mod.conf
Normal file
@ -0,0 +1 @@
|
||||
name = fluid_lib
|
0
modpack.txt
Normal file
0
modpack.txt
Normal file
Loading…
Reference in New Issue
Block a user