From 9436c7033b099cbedde654a1d9b8edb621a7b13b Mon Sep 17 00:00:00 2001 From: mrkubax10 Date: Sun, 8 Sep 2024 22:27:36 +0200 Subject: [PATCH] Extract power API functions to separate file --- api.lua | 170 ---------------------------------------------- api/common.lua | 36 ++++++++++ api/power.lua | 178 +++++++++++++++++++++++++++++++++++++++++++++++++ init.lua | 5 +- 4 files changed, 218 insertions(+), 171 deletions(-) create mode 100644 api/common.lua create mode 100644 api/power.lua diff --git a/api.lua b/api.lua index e3e9dcc..cf022c4 100644 --- a/api.lua +++ b/api.lua @@ -16,38 +16,6 @@ local S=minetest.get_translator("industrialtest") -industrialtest.api={} -industrialtest.api.maceratorRecipes={} -industrialtest.api.compressorRecipes={} -industrialtest.api.extractorRecipes={} -industrialtest.api.cableFormerRecipes={} -industrialtest.api.geothermalGeneratorFuels={} -industrialtest.api.waterMillFuels={} -industrialtest.api.rotaryMaceratorModifiers={} -industrialtest.api.storageCells={} - -industrialtest.api.lvPowerFlow=600 -industrialtest.api.mvPowerFlow=2400 -industrialtest.api.hvPowerFlow=10200 -industrialtest.api.evPowerFlow=40800 -industrialtest.api.ivPowerFlow=163800 - -industrialtest.internal.clamp=function(num,min,max) - return math.max(math.min(num,max),min) -end - --- \brief Adds power storage to metadata --- \param capacity How much EU item/node can store --- \param flow How much EU can flow in or out item/node per industrialtest.updateDelay --- \param ioConfig Input/Output configuration in following side order: -X, +X, -Y, +Y, -Z, +Z --- a - bidirectional, i - input, o - output --- \returns nil -industrialtest.api.addPowerStorage=function(meta,capacity,flow,ioConfig) - meta:set_int("industrialtest.powerCapacity",capacity) - meta:set_int("industrialtest.powerFlow",flow) - meta:set_int("industrialtest.powerAmount",0) - meta:set_string("industrialtest.ioConfig",ioConfig) -end -- \brief Takes rotated node and side and outputs normalized side that can be used for ioConfig lookups -- \param pos Vector with node position -- \param side Node side. See industrialtest.api.addPowerStorage for possible values @@ -74,42 +42,6 @@ industrialtest.api.normalizeSide=function(pos,side) end return translation[node.param2][side] end --- \brief Checks if metadata contains power storage --- \param meta MetaDataRef which should be checked --- \returns true if metadata contains power storage, false otherwise -industrialtest.api.hasPowerStorage=function(meta) - local values={"industrialtest.powerCapacity","industrialtest.powerFlow","industrialtest.powerAmount","industrialtest.ioConfig"} - for _,value in ipairs(values) do - if not meta:contains(value) then - return false - end - end - return true -end --- \brief Updates itemstack description to show current power storage information, additionally updates item wear bar. --- Function doesn't check if itemstack contains power storage so you should be sure that it does before calling this function --- \param itemstack ItemStack which should be updated --- \returns nil -industrialtest.api.updateItemPowerText=function(itemstack) - local meta=itemstack:get_meta() - local def=minetest.registered_tools[itemstack:get_name()] - local desc=meta:contains("industrialtest.descriptionOverride") and meta:get_string("industrialtest.descriptionOverride") or def.description - meta:set_string("description",S("@1\n@2 / @3 EU",desc,meta:get_int("industrialtest.powerAmount"),meta:get_int("industrialtest.powerCapacity"))) - itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534) -end --- \brief Adds power storage to item depending on it's definition --- \param itemstack ItemStack to which item storage should be added --- \returns true if power storage was successfully added, false otherwise -industrialtest.api.preparePowerStorageItem=function(itemstack) - local meta=itemstack:get_meta() - local def=minetest.registered_tools[itemstack:get_name()] - if industrialtest.api.hasPowerStorage(meta) or not def or not def._industrialtest_powerStorage or not def._industrialtest_powerCapacity or not def._industrialtest_powerFlow then - return false - end - industrialtest.api.addPowerStorage(meta,def._industrialtest_powerCapacity,def._industrialtest_powerFlow,"n/a") - industrialtest.api.updateItemPowerText(itemstack) - return true -end -- \brief Sets uses metadata value depending on item's definition -- \param itemstack ItemStack which should be altered -- \returns true if value was successfully added, false otherwise @@ -228,80 +160,6 @@ industrialtest.api.transferFluidToItem=function(srcItemstack,itemstack,amount) return actualFlow end --- \brief Checks if power storage is fully charged --- \param meta MetaDataRef which should be checked --- \returns true if power storage is fully charged, false otherwise -industrialtest.api.isFullyCharged=function(meta) - return meta:get_int("industrialtest.powerAmount")>=meta:get_int("industrialtest.powerCapacity") -end --- \brief Adds power to power storage. Function doesn't check if meta contains power storage so you must be sure that it does. --- \param meta MetaDataRef to which power should be added --- \param amount Amount of power to add --- \returns How much of power was actually added -industrialtest.api.addPower=function(meta,amount) - local powerAmount=meta:get_int("industrialtest.powerAmount") - local powerCapacity=meta:get_int("industrialtest.powerCapacity") - local prevPowerAmount=powerAmount - powerAmount=industrialtest.internal.clamp(powerAmount+amount,0,powerCapacity) - meta:set_int("industrialtest.powerAmount",powerAmount) - return powerAmount-prevPowerAmount -end --- \brief Adds power to itemstack. Function checks if itemstack has power storage. --- \param itemstack ItemStack to which add power --- \param amount How much power to add --- \returns Amount of power added -industrialtest.api.addPowerToItem=function(itemstack,amount) - local meta=itemstack:get_meta() - if not industrialtest.api.hasPowerStorage(meta) then - return 0 - end - local added=industrialtest.api.addPower(meta,amount) - industrialtest.api.updateItemPowerText(itemstack) - return added -end --- \brief Adds power to destination metadata while subtracting it from source metadata --- \Param srcMeta MetaDataRef from which take power --- \param destMeta MetaDataRef to which add power --- \returns How much of power was actually transferred -industrialtest.api.transferPower=function(srcMeta,destMeta,amount) - local currentFlow=math.min(srcMeta:get_int("industrialtest.powerAmount"),amount) - if currentFlow==0 then - return 0 - end - local actualFlow=industrialtest.api.addPower(destMeta,currentFlow) - srcMeta:set_int("industrialtest.powerAmount",srcMeta:get_int("industrialtest.powerAmount")-actualFlow) - return actualFlow -end --- \brief Adds power to destination itemstack while subtracting it from source metadata --- \param srcMeta MetaDataRef from which take power --- \param itemstack ItemStack to which add power --- \param amount number --- \returns How much of power was actually transferred -industrialtest.api.transferPowerToItem=function(srcMeta,itemstack,amount) - local currentFlow=math.min(srcMeta:get_int("industrialtest.powerAmount"),amount) - if currentFlow==0 then - return 0 - end - local actualFlow=industrialtest.api.addPowerToItem(itemstack,currentFlow) - srcMeta:set_int("industrialtest.powerAmount",srcMeta:get_int("industrialtest.powerAmount")-actualFlow) - return actualFlow -end --- \brief Adds power to destination metadata while subtracting it from source itemstack --- \param srcItemstack ItemStack from which subtract power --- \param meta MetaDataRef to which add power --- \param amount How much power should be transferred --- \returns How much of power was actually transferred -industrialtest.api.transferPowerFromItem=function(srcItemstack,meta,amount) - local srcMeta=srcItemstack:get_meta() - local currentFlow=math.min(srcMeta:get_int("industrialtest.powerAmount"),amount) - if currentFlow==0 then - return 0 - end - local actualFlow=industrialtest.api.addPower(meta,currentFlow) - industrialtest.api.addPowerToItem(srcItemstack,-actualFlow) - return actualFlow -end - -- \brief Transfers power from source node to it's network, if sides is set then power will be only transfered to network connected to that sides -- \param pos Vector with position of source node -- \param (optional) sides table with Vectors @@ -612,34 +470,6 @@ industrialtest.api.getConnections=function(pos,direction) end return result end --- \brief Changes node's power IO config. Function doesn't check if meta actually contains power storage. --- \param meta MetaDataRef of node which power IO config should be changed --- \param side Side number. See industrialtest.api.addPowerStorage to check order. --- \param mode Side mode. See industrialtest.api.addPowerStorage for possible values. --- \returns nil -industrialtest.api.changeIoConfig=function(meta,side,mode) - local ioConfig=meta:get_string("industrialtest.ioConfig") - ioConfig=string.sub(ioConfig,1,side-1)..mode..string.sub(ioConfig,side+1) - meta:set_string("industrialtest.ioConfig",ioConfig) -end --- \brief Checks if provided side is power input --- \param meta MetaDataRef of node --- \param side Side number. See industrialtest.api.addPowerStorage to check order. --- \returns true if provided side is power input, false otherwise -industrialtest.api.isPowerInput=function(meta,side) - local ioConfig=meta:get_string("industrialtest.ioConfig") - local mode=string.sub(ioConfig,side,side) - return (mode=="i" or mode=="a") -end --- \brief Checks if provided side is power output --- \param meta MetaDataRef of node --- \param side Side number. See industrialtest.api.addPowerStorage to check order. --- \returns true if provided side is power output, false otherwise -industrialtest.api.isPowerOutput=function(meta,side) - local ioConfig=meta:get_string("industrialtest.ioConfig") - local mode=string.sub(ioConfig,side,side) - return (mode=="o" or mode=="a") -end -- \brief Registers dust of certain resource -- \param name Technical name of resource -- \param displayName Display name of resource diff --git a/api/common.lua b/api/common.lua new file mode 100644 index 0000000..07d3be5 --- /dev/null +++ b/api/common.lua @@ -0,0 +1,36 @@ +-- IndustrialTest +-- Copyright (C) 2024 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 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 General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +industrialtest.api={} +industrialtest.api.maceratorRecipes={} +industrialtest.api.compressorRecipes={} +industrialtest.api.extractorRecipes={} +industrialtest.api.cableFormerRecipes={} +industrialtest.api.geothermalGeneratorFuels={} +industrialtest.api.waterMillFuels={} +industrialtest.api.rotaryMaceratorModifiers={} +industrialtest.api.storageCells={} + +industrialtest.api.lvPowerFlow=600 +industrialtest.api.mvPowerFlow=2400 +industrialtest.api.hvPowerFlow=10200 +industrialtest.api.evPowerFlow=40800 +industrialtest.api.ivPowerFlow=163800 + +industrialtest.internal.clamp=function(num,min,max) + return math.max(math.min(num,max),min) +end + diff --git a/api/power.lua b/api/power.lua new file mode 100644 index 0000000..fcb105b --- /dev/null +++ b/api/power.lua @@ -0,0 +1,178 @@ +-- IndustrialTest +-- Copyright (C) 2024 mrkubax10 + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 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 General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +-- \brief Adds power storage to metadata +-- \param capacity How much EU item/node can store +-- \param flow How much EU can flow in or out item/node per industrialtest.updateDelay +-- \param ioConfig Input/Output configuration in following side order: -X, +X, -Y, +Y, -Z, +Z +-- a - bidirectional, i - input, o - output +-- \returns nil +function industrialtest.api.addPowerStorage(meta,capacity,flow,ioConfig) + meta:set_int("industrialtest.powerCapacity",capacity) + meta:set_int("industrialtest.powerFlow",flow) + meta:set_int("industrialtest.powerAmount",0) + meta:set_string("industrialtest.ioConfig",ioConfig) +end + +-- \brief Checks if metadata contains power storage +-- \param meta MetaDataRef which should be checked +-- \returns true if metadata contains power storage, false otherwise +function industrialtest.api.hasPowerStorage(meta) + local values={"industrialtest.powerCapacity","industrialtest.powerFlow","industrialtest.powerAmount","industrialtest.ioConfig"} + for _,value in ipairs(values) do + if not meta:contains(value) then + return false + end + end + return true +end + +-- \brief Changes node's power IO config. Function doesn't check if meta actually contains power storage. +-- \param meta MetaDataRef of node which power IO config should be changed +-- \param side Side number. See industrialtest.api.addPowerStorage to check order. +-- \param mode Side mode. See industrialtest.api.addPowerStorage for possible values. +-- \returns nil +function industrialtest.api.changeIoConfig(meta,side,mode) + local ioConfig=meta:get_string("industrialtest.ioConfig") + ioConfig=string.sub(ioConfig,1,side-1)..mode..string.sub(ioConfig,side+1) + meta:set_string("industrialtest.ioConfig",ioConfig) +end + +-- \brief Checks if provided side is power input +-- \param meta MetaDataRef of node +-- \param side Side number. See industrialtest.api.addPowerStorage to check order. +-- \returns true if provided side is power input, false otherwise +function industrialtest.api.isPowerInput(meta,side) + local ioConfig=meta:get_string("industrialtest.ioConfig") + local mode=string.sub(ioConfig,side,side) + return (mode=="i" or mode=="a") +end + +-- \brief Checks if provided side is power output +-- \param meta MetaDataRef of node +-- \param side Side number. See industrialtest.api.addPowerStorage to check order. +-- \returns true if provided side is power output, false otherwise +function industrialtest.api.isPowerOutput(meta,side) + local ioConfig=meta:get_string("industrialtest.ioConfig") + local mode=string.sub(ioConfig,side,side) + return (mode=="o" or mode=="a") +end + +-- \brief Checks if power storage is fully charged +-- \param meta MetaDataRef which should be checked +-- \returns true if power storage is fully charged, false otherwise +function industrialtest.api.isFullyCharged(meta) + return meta:get_int("industrialtest.powerAmount")>=meta:get_int("industrialtest.powerCapacity") +end + +-- \brief Adds power to power storage. Function doesn't check if meta contains power storage so you must be sure that it does. +-- \param meta MetaDataRef to which power should be added +-- \param amount Amount of power to add +-- \returns How much of power was actually added +function industrialtest.api.addPower(meta,amount) + local powerAmount=meta:get_int("industrialtest.powerAmount") + local powerCapacity=meta:get_int("industrialtest.powerCapacity") + local prevPowerAmount=powerAmount + powerAmount=industrialtest.internal.clamp(powerAmount+amount,0,powerCapacity) + meta:set_int("industrialtest.powerAmount",powerAmount) + return powerAmount-prevPowerAmount +end + +-- \brief Adds power to destination metadata while subtracting it from source metadata +-- \Param srcMeta MetaDataRef from which take power +-- \param destMeta MetaDataRef to which add power +-- \returns How much of power was actually transferred +function industrialtest.api.transferPower(srcMeta,destMeta,amount) + local currentFlow=math.min(srcMeta:get_int("industrialtest.powerAmount"),amount) + if currentFlow==0 then + return 0 + end + local actualFlow=industrialtest.api.addPower(destMeta,currentFlow) + srcMeta:set_int("industrialtest.powerAmount",srcMeta:get_int("industrialtest.powerAmount")-actualFlow) + return actualFlow +end + +-- \brief Updates itemstack description to show current power storage information, additionally updates item wear bar. +-- Function doesn't check if itemstack contains power storage so you should be sure that it does before calling this function +-- \param itemstack ItemStack which should be updated +-- \returns nil +function industrialtest.api.updateItemPowerText(itemstack) + local meta=itemstack:get_meta() + local def=minetest.registered_tools[itemstack:get_name()] + local desc=meta:contains("industrialtest.descriptionOverride") and meta:get_string("industrialtest.descriptionOverride") or def.description + meta:set_string("description",S("@1\n@2 / @3 EU",desc,meta:get_int("industrialtest.powerAmount"),meta:get_int("industrialtest.powerCapacity"))) + itemstack:set_wear(65535-meta:get_int("industrialtest.powerAmount")/meta:get_int("industrialtest.powerCapacity")*65534) +end + +-- \brief Adds power storage to item depending on it's definition +-- \param itemstack ItemStack to which item storage should be added +-- \returns true if power storage was successfully added, false otherwise +function industrialtest.api.preparePowerStorageItem(itemstack) + local meta=itemstack:get_meta() + local def=minetest.registered_tools[itemstack:get_name()] + if industrialtest.api.hasPowerStorage(meta) or not def or not def._industrialtest_powerStorage or not def._industrialtest_powerCapacity or not def._industrialtest_powerFlow then + return false + end + industrialtest.api.addPowerStorage(meta,def._industrialtest_powerCapacity,def._industrialtest_powerFlow,"n/a") + industrialtest.api.updateItemPowerText(itemstack) + return true +end + +-- \brief Adds power to itemstack. Function checks if itemstack has power storage. +-- \param itemstack ItemStack to which add power +-- \param amount How much power to add +-- \returns Amount of power added +function industrialtest.api.addPowerToItem(itemstack,amount) + local meta=itemstack:get_meta() + if not industrialtest.api.hasPowerStorage(meta) then + return 0 + end + local added=industrialtest.api.addPower(meta,amount) + industrialtest.api.updateItemPowerText(itemstack) + return added +end + +-- \brief Adds power to destination itemstack while subtracting it from source metadata +-- \param srcMeta MetaDataRef from which take power +-- \param itemstack ItemStack to which add power +-- \param amount number +-- \returns How much of power was actually transferred +function industrialtest.api.transferPowerToItem(srcMeta,itemstack,amount) + local currentFlow=math.min(srcMeta:get_int("industrialtest.powerAmount"),amount) + if currentFlow==0 then + return 0 + end + local actualFlow=industrialtest.api.addPowerToItem(itemstack,currentFlow) + srcMeta:set_int("industrialtest.powerAmount",srcMeta:get_int("industrialtest.powerAmount")-actualFlow) + return actualFlow +end + +-- \brief Adds power to destination metadata while subtracting it from source itemstack +-- \param srcItemstack ItemStack from which subtract power +-- \param meta MetaDataRef to which add power +-- \param amount How much power should be transferred +-- \returns How much of power was actually transferred +function industrialtest.api.transferPowerFromItem(srcItemstack,meta,amount) + local srcMeta=srcItemstack:get_meta() + local currentFlow=math.min(srcMeta:get_int("industrialtest.powerAmount"),amount) + if currentFlow==0 then + return 0 + end + local actualFlow=industrialtest.api.addPower(meta,currentFlow) + industrialtest.api.addPowerToItem(srcItemstack,-actualFlow) + return actualFlow +end + diff --git a/init.lua b/init.lua index 30766cb..5010bdf 100644 --- a/init.lua +++ b/init.lua @@ -29,9 +29,12 @@ industrialtest.random=PseudoRandom(os.time()) -- load other lua files dofile(modpath.."/compatibility.lua") -dofile(modpath.."/api.lua") dofile(modpath.."/minerals.lua") +dofile(modpath.."/api/common.lua") +dofile(modpath.."/api/power.lua") +dofile(modpath.."/api.lua") + dofile(modpath.."/machines/common.lua") dofile(modpath.."/machines/canning_machine.lua") dofile(modpath.."/machines/chargepad.lua")