forked from Mirrors/openclonk
Liquid Pipe System Update
parent
b585d25295
commit
79d44490b6
|
@ -1,6 +1,6 @@
|
|||
/*--
|
||||
Metal Barrel
|
||||
Author: Ringwaul
|
||||
Author: Ringwaul, ST-DDT
|
||||
|
||||
A sturdier barrel that can transport lava or acid.
|
||||
--*/
|
||||
|
@ -16,14 +16,16 @@ local debug;
|
|||
protected func Initialize()
|
||||
{
|
||||
iVolume = 0;
|
||||
debug=0;
|
||||
debug = 0;
|
||||
}
|
||||
|
||||
private func Hit()
|
||||
{
|
||||
Sound("Clonk");
|
||||
if(iVolume >= 1) {
|
||||
if(GBackLiquid(0,7) && GetMaterial(0,7) != szLiquid) return 0;
|
||||
if (iVolume >= 1)
|
||||
{
|
||||
if (GBackLiquid(0, 7) && GetMaterial(0, 7) != szLiquid)
|
||||
return 0;
|
||||
EmptyBarrel(GetR());
|
||||
Sound("Splash1");
|
||||
}
|
||||
|
@ -32,27 +34,34 @@ private func Hit()
|
|||
private func FillWithLiquid()
|
||||
{
|
||||
var mat = GetMaterial();
|
||||
|
||||
if(mat == Material("Water"))
|
||||
|
||||
if (mat == Material("Water"))
|
||||
{
|
||||
FillBarrel(MaterialName(mat));
|
||||
SetMeshMaterial("MB_Water");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(mat == Material("Acid"))
|
||||
|
||||
if (mat == Material("Acid"))
|
||||
{
|
||||
FillBarrel(MaterialName(mat));
|
||||
SetMeshMaterial("MB_Acid");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if(mat == Material("Lava") || mat == Material("DuroLava"))
|
||||
|
||||
if (mat == Material("Lava") || mat == Material("DuroLava"))
|
||||
{
|
||||
FillBarrel(MaterialName(mat));
|
||||
SetMeshMaterial("MB_Lava");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (mat == Material("Oil"))
|
||||
{
|
||||
FillBarrel(MaterialName(mat));
|
||||
SetMeshMaterial("MB_Oil");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
private func OriginalTex()
|
||||
|
@ -60,6 +69,25 @@ private func OriginalTex()
|
|||
SetMeshMaterial("MetalBarrel");
|
||||
}
|
||||
|
||||
public func IsBarrelForMaterial(string sznMaterial)
|
||||
{
|
||||
if ((iVolume > 0) && (WildcardMatch(szLiquid,sznMaterial)))
|
||||
return true;
|
||||
if (WildcardMatch("Water", sznMaterial))
|
||||
return true;
|
||||
if (WildcardMatch("Acid", sznMaterial))
|
||||
return true;
|
||||
if (WildcardMatch("Lava", sznMaterial))
|
||||
return true;
|
||||
if (WildcardMatch("DuroLava", sznMaterial))
|
||||
return true;
|
||||
if (WildcardMatch("Oil", sznMaterial))
|
||||
return true;
|
||||
//if (GetMaterialVal("Density","Material",Material(szMaterial)))
|
||||
// return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
local Collectible = 1;
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*--
|
||||
Wooden Barrel
|
||||
Author: Ringwaul
|
||||
Author: Ringwaul, ST-DDT
|
||||
|
||||
The barrel is used to transport liquids
|
||||
--*/
|
||||
|
@ -10,21 +10,32 @@ local iVolume;
|
|||
|
||||
local debug;
|
||||
|
||||
public func GetCarryMode(clonk) { return CARRY_BothHands; }
|
||||
public func GetCarryTransform(clonk) { return Trans_Translate(-1000,-800,0); }
|
||||
public func GetCarryPhase() { return 900; }
|
||||
public func GetCarryMode(clonk)
|
||||
{
|
||||
return CARRY_BothHands;
|
||||
}
|
||||
public func GetCarryTransform(clonk)
|
||||
{
|
||||
return Trans_Translate(-1000, -800, 0);
|
||||
}
|
||||
public func GetCarryPhase()
|
||||
{
|
||||
return 900;
|
||||
}
|
||||
|
||||
protected func Initialize()
|
||||
{
|
||||
iVolume = 0;
|
||||
debug=0;
|
||||
debug = 0;
|
||||
}
|
||||
|
||||
private func Hit()
|
||||
{
|
||||
Sound("WoodHit");
|
||||
if(iVolume >= 1) {
|
||||
if(GBackLiquid(0,3) && GetMaterial(0,3) != szLiquid) return 0;
|
||||
if (iVolume >= 1)
|
||||
{
|
||||
if (GBackLiquid(0, 3) && GetMaterial(0, 3) != szLiquid)
|
||||
return 0;
|
||||
EmptyBarrel(GetR());
|
||||
Sound("Splash1");
|
||||
}
|
||||
|
@ -34,31 +45,34 @@ private func Check()
|
|||
{
|
||||
//Fills Barrel with specified liquid from if submerged
|
||||
var iSource = 3;
|
||||
|
||||
if(GBackLiquid(0,iSource))
|
||||
|
||||
if (GBackLiquid(0, iSource))
|
||||
{
|
||||
FillWithLiquid();
|
||||
}
|
||||
|
||||
if(iVolume == 0) {
|
||||
|
||||
if (iVolume == 0)
|
||||
{
|
||||
SetGraphics();
|
||||
szLiquid=nil;
|
||||
szLiquid = nil;
|
||||
}
|
||||
|
||||
|
||||
//Value. Base value is 10.
|
||||
if(iVolume == 0) SetProperty("Value", 10);
|
||||
if (iVolume == 0)
|
||||
SetProperty("Value", 10);
|
||||
//if(szLiquid == Oil) SetProperty("Value", 10 + (iVolume / 15)); //No oil in current build
|
||||
|
||||
|
||||
//Debug/Testing Purposes
|
||||
if(debug == 1) Message("Volume:|%d|Liquid:|%s", iVolume, szLiquid);
|
||||
if (debug == 1)
|
||||
Message("Volume:|%d|Liquid:|%s", iVolume, szLiquid);
|
||||
}
|
||||
|
||||
//over-ridden with metal barrel
|
||||
private func FillWithLiquid()
|
||||
{
|
||||
var mat = GetMaterial();
|
||||
|
||||
if(mat == Material("Water"))
|
||||
|
||||
if (mat == Material("Water"))
|
||||
{
|
||||
FillBarrel(MaterialName(mat));
|
||||
SetMeshMaterial("Barrel_Water");
|
||||
|
@ -67,13 +81,14 @@ private func FillWithLiquid()
|
|||
|
||||
private func FillBarrel(string szMat)
|
||||
{
|
||||
var iCapacity = 300;
|
||||
var iCapacity = BarrelMaxFillLevel();
|
||||
var intake = 3;
|
||||
|
||||
if(iVolume >= 1 && szMat != szLiquid) return 0;
|
||||
while(iVolume != iCapacity && GetMaterial(0,intake) == Material(szMat))
|
||||
if (iVolume >= 1 && szMat != szLiquid)
|
||||
return 0;
|
||||
while (iVolume != iCapacity && GetMaterial(0, intake) == Material(szMat))
|
||||
{
|
||||
ExtractLiquid(0,intake);
|
||||
ExtractLiquid(0, intake);
|
||||
iVolume = ++iVolume;
|
||||
}
|
||||
szLiquid = szMat;
|
||||
|
@ -81,9 +96,11 @@ private func FillBarrel(string szMat)
|
|||
|
||||
private func EmptyBarrel(int iAngle, int iStrength)
|
||||
{
|
||||
if(!iAngle) iAngle = 0;
|
||||
if(!iStrength) iStrength = 30;
|
||||
CastPXS(szLiquid, iVolume,iStrength,0,0,iAngle,30);
|
||||
if (!iAngle)
|
||||
iAngle = 0;
|
||||
if (!iStrength)
|
||||
iStrength = 30;
|
||||
CastPXS(szLiquid, iVolume, iStrength, 0, 0, iAngle, 30);
|
||||
iVolume = 0;
|
||||
OriginalTex();
|
||||
}
|
||||
|
@ -96,21 +113,104 @@ private func OriginalTex()
|
|||
|
||||
public func ControlUse(object clonk, int iX, int iY)
|
||||
{
|
||||
var AimAngle=Angle(0,0, iX, iY);
|
||||
if(iVolume >= 1)
|
||||
var AimAngle = Angle(0, 0, iX, iY);
|
||||
if (iVolume >= 1)
|
||||
{
|
||||
EmptyBarrel(AimAngle,50);
|
||||
if( iX > 1) Contained()->SetDir(1);
|
||||
if( iX < -1 ) Contained()->SetDir(0);
|
||||
EmptyBarrel(AimAngle, 50);
|
||||
if (iX > 1)
|
||||
Contained()->SetDir(1);
|
||||
if (iX < -1)
|
||||
Contained()->SetDir(0);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
public func IsToolProduct() { return true; }
|
||||
|
||||
func Definition(def) {
|
||||
SetProperty("PictureTransformation",Trans_Mul(Trans_Translate(0,1000,0), Trans_Rotate(-40,1,0,0), Trans_Rotate(20,0,0,1)), def);
|
||||
public func Definition(proplist def)
|
||||
{
|
||||
SetProperty("PictureTransformation", Trans_Mul(Trans_Translate(0, 1000, 0), Trans_Rotate(-40, 1, 0, 0), Trans_Rotate(20, 0, 0, 1)), def);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public func BarrelMaxFillLevel()
|
||||
{
|
||||
return 300;
|
||||
}
|
||||
|
||||
public func GetFillLevel()
|
||||
{
|
||||
return iVolume;
|
||||
}
|
||||
|
||||
public func IsBarrel()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public func BarrelIsEmpty()
|
||||
{
|
||||
return iVolume == 0;
|
||||
}
|
||||
|
||||
public func BarrelIsFull()
|
||||
{
|
||||
return iVolume == BarrelMaxFillLevel();
|
||||
}
|
||||
|
||||
//returns the contained liquid
|
||||
public func GetBarrelMaterial()
|
||||
{
|
||||
if (iVolume == 0)
|
||||
return "";
|
||||
return szLiquid;
|
||||
}
|
||||
|
||||
public func IsBarrelForMaterial(string sznMaterial)
|
||||
{
|
||||
return WildcardMatch("Water",sznMaterial);
|
||||
}
|
||||
|
||||
/**
|
||||
Extract liquid from barrel
|
||||
@param sznMaterial: Material to extract; Wildcardsupport
|
||||
@param inMaxAmount: Max Amount of Material being extracted
|
||||
@param pnTarget: Object which extracts the liquid
|
||||
@return [irMaterial,irAmount]
|
||||
-irMaterial: Material being extracted
|
||||
-irAmount: Amount being extracted
|
||||
*/
|
||||
public func GetLiquid(string sznMaterial, int inMaxAmount, object pnTarget)
|
||||
{
|
||||
//Wrong material?
|
||||
if (!WildcardMatch(szLiquid, sznMaterial))
|
||||
inMaxAmount = 0;
|
||||
inMaxAmount = Min(inMaxAmount, iVolume);
|
||||
iVolume -= inMaxAmount;
|
||||
return [szLiquid, inMaxAmount];
|
||||
}
|
||||
|
||||
/**
|
||||
Insert liquid to barrel
|
||||
@param sznMaterial: Material to insert
|
||||
@param inMaxAmount: Max Amount of Material being inserted
|
||||
@param pnSource: Object which inserts the liquid
|
||||
@return inAmount: The inserted amount
|
||||
*/
|
||||
public func PutLiquid(string sznMaterial, int inMaxAmount, object pnSource)
|
||||
{
|
||||
//Wrong material?
|
||||
if (sznMaterial != szLiquid)
|
||||
if (iVolume>0)
|
||||
return 0;
|
||||
else if (IsBarrelForMaterial(sznMaterial))
|
||||
szLiquid=sznMaterial;
|
||||
inMaxAmount = BoundBy(BarrelMaxFillLevel() - iVolume, 0, inMaxAmount);
|
||||
iVolume += inMaxAmount;
|
||||
return inMaxAmount;
|
||||
}
|
||||
|
||||
local Collectible = 1;
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
/*-- Pipe line --*/
|
||||
|
||||
//Author: ST-DDT
|
||||
|
||||
protected func Initialize()
|
||||
{
|
||||
SetAction("Connect");
|
||||
SetVertexXY(0, GetX(), GetY());
|
||||
SetVertexXY(1, GetX(), GetY());
|
||||
SetProperty("LineColors", [RGB(80,80,120), RGB(80,80,120)]);
|
||||
SetProperty("LineColors", [RGB(80, 80, 120), RGB(80, 80, 120)]);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -34,7 +36,7 @@ public func GetConnectedObject(object obj)
|
|||
protected func LineBreak(bool no_msg)
|
||||
{
|
||||
Sound("LineBreak");
|
||||
if (!no_msg)
|
||||
if (!no_msg)
|
||||
BreakMessage();
|
||||
return;
|
||||
}
|
||||
|
@ -42,9 +44,9 @@ protected func LineBreak(bool no_msg)
|
|||
private func BreakMessage()
|
||||
{
|
||||
var line_end = GetActionTarget(0);
|
||||
if (line_end->GetID() != Pipe)
|
||||
if (line_end->GetID() != Pipe)
|
||||
line_end = GetActionTarget(1);
|
||||
|
||||
|
||||
line_end->Message("$TxtPipeBroke$");
|
||||
return;
|
||||
}
|
||||
|
@ -54,9 +56,56 @@ local ActMap = {
|
|||
Prototype = Action,
|
||||
Name = "Connect",
|
||||
Procedure = DFA_CONNECT,
|
||||
NextAction = "Connect",
|
||||
},
|
||||
NextAction = "Connect"
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
Extract liquid from barrel
|
||||
@param sznMaterial: Material to extract; Wildcardsupport
|
||||
@param inMaxAmount: Max Amount of Material being extracted
|
||||
@param pnTarget: Object which extracts the liquid
|
||||
@return [irMaterial,irAmount]
|
||||
-irMaterial: Material being extracted
|
||||
-irAmount: Amount being extracted
|
||||
*/
|
||||
public func GetLiquid(string sznMaterial, int inMaxAmount, object pnTarget, bool bWildcard)
|
||||
{
|
||||
var pConnected = GetConnectedObject(pnTarget);
|
||||
if (!pConnected)
|
||||
return ["", 0];
|
||||
var aMat = pConnected->~LiquidOutput(sznMaterial, inMaxAmount, pnTarget, this, bWildcard);
|
||||
//Bad script? Not needed.
|
||||
if (GetType(aMat) != C4V_Array)
|
||||
return [-1, 0];
|
||||
//Verify data
|
||||
if ((aMat[0] == "") || (GetLength(aMat) == 1))
|
||||
aMat[1] = 0;
|
||||
//Nothing is nothing
|
||||
if (aMat[1] <= 0)
|
||||
{
|
||||
aMat[0] = "";
|
||||
aMat[1] = 0;
|
||||
} //Bad script end
|
||||
return aMat;
|
||||
}
|
||||
|
||||
/**
|
||||
Insert liquid to barrel
|
||||
@param sznMaterial: Material to insert
|
||||
@param inMaxAmount: Max Amount of Material being inserted
|
||||
@param pnSource: Object which inserts the liquid
|
||||
@return inAmount: The inserted amount
|
||||
*/
|
||||
public func PutLiquid(string sznMaterial, int inMaxAmount, object pnSource)
|
||||
{
|
||||
var pConnected = GetConnectedObject(pnSource);
|
||||
if (!pConnected)
|
||||
return 0;
|
||||
if (sznMaterial == "")
|
||||
return 0;
|
||||
return BoundBy(pConnected->~LiquidInput(sznMaterial, inMaxAmount, pnSource, this), 0, inMaxAmount);
|
||||
}
|
||||
|
||||
local Name = "$Name$";
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
/*-- Pipe --*/
|
||||
|
||||
//Author: ST-DDT
|
||||
|
||||
protected func Hit()
|
||||
{
|
||||
Sound("RockHit?");
|
||||
|
@ -14,12 +16,12 @@ protected func ControlUse(object clonk, int x, int y)
|
|||
{
|
||||
// Is this already connected to a liquid pump?
|
||||
if (FindObject(Find_PipeLine()))
|
||||
return false;
|
||||
return false;
|
||||
// Only use if clonk is walking.
|
||||
if (!clonk->IsWalking())
|
||||
return true;
|
||||
// Clonk should stand still.
|
||||
clonk->SetComDir(COMD_Stop);
|
||||
clonk->SetComDir(COMD_Stop);
|
||||
// Is there an object which accepts power lines?
|
||||
var liquid_pump = FindObject(Find_AtPoint(), Find_Func("IsLiquidPump"));
|
||||
// No liquid pump, display message.
|
||||
|
@ -63,6 +65,58 @@ private func Find_PipeLine(object obj)
|
|||
return [C4FO_Func, "IsConnectedTo", obj];
|
||||
}
|
||||
|
||||
/**
|
||||
Extract liquid from this
|
||||
@param sznMaterial: Material to extract
|
||||
@param inMaxAmount: Max Amount of Material being extracted
|
||||
@param pnPump: Object which extracts the liquid
|
||||
@param pnPipe: Pipe which extracts the liquid (connected to pnPump)
|
||||
@param bnWildcard: Usefull to extract random liquids; use '*' for sznMaterial for all Materials
|
||||
@return [irMaterial,irAmount]
|
||||
-irMaterial: Material being extracted
|
||||
-irAmount: Amount being extracted
|
||||
*/
|
||||
public func LiquidOutput(string sznMaterial, int inMaxAmount, object pnPump, object pnPipe, bool bnWildcard)
|
||||
{
|
||||
var itMaterial;
|
||||
//Search liquid to pump
|
||||
if (bnWildcard)
|
||||
{
|
||||
itMaterial = GetMaterial();
|
||||
//nothing?
|
||||
if (itMaterial == -1)
|
||||
return ["", 0];
|
||||
//no liquid?
|
||||
if (GetMaterialVal("Density", "Material", itMaterial) != 25)
|
||||
return ["", 0];
|
||||
//wrong liquid?
|
||||
if (!WildcardMatch(MaterialName(itMaterial),sznMaterial))
|
||||
return ["", 0];
|
||||
sznMaterial = MaterialName(itMaterial);
|
||||
}
|
||||
else
|
||||
itMaterial = Material(sznMaterial);
|
||||
if (GetMaterial() != itMaterial)
|
||||
return ["", 0];
|
||||
var itFound = ExtractMaterialAmount(0, 0, itMaterial, 5);
|
||||
return [sznMaterial, itFound];
|
||||
}
|
||||
|
||||
/**
|
||||
Insert liquid to this
|
||||
@param sznMaterial: Material to insert
|
||||
@param inMaxAmount: Max Amount of Material being inserted
|
||||
@param pnPump: Object which inserts the liquid
|
||||
@param pnPipe: Pipe which inserts the liquid (connected to pnPump)
|
||||
@return irAmount: The inserted amount
|
||||
*/
|
||||
public func LiquidInput(string sznMaterial, int inMaxAmount, object pnPump, object pnPipe)
|
||||
{
|
||||
var i=Max(0,inMaxAmount),itMaterial=Material(sznMaterial);
|
||||
while (i--) InsertMaterial(itMaterial);
|
||||
return inMaxAmount;
|
||||
}
|
||||
|
||||
local Name = "$Name$";
|
||||
local Description = "$Description$";
|
||||
local Collectible = 1;
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
[DefCore]
|
||||
id=Libary_BarrelFiller
|
||||
Version=5,2,0,1
|
||||
Category=C4D_StaticBack
|
Binary file not shown.
After Width: | Height: | Size: 142 B |
|
@ -0,0 +1,73 @@
|
|||
/* --- BarrelFiller --- */
|
||||
|
||||
/*
|
||||
Author: ST-DDT
|
||||
Import this to allow the structures to
|
||||
-fill liquids which has been pumped into the building into barrels
|
||||
-extract liquids from barrels and pump it somewhere else
|
||||
*/
|
||||
|
||||
/**
|
||||
Extract liquid from this
|
||||
@param sznMaterial: Material to extract
|
||||
@param inMaxAmount: Max Amount of Material being extracted
|
||||
@param pnPump: Object which extracts the liquid
|
||||
@param pnPipe: Pipe which extracts the liquid (connected to pnPump)
|
||||
@param bnWildcard: Usefull to extract random liquids; use '*' for sznMaterial for all Materials
|
||||
@return [irMaterial,irAmount]
|
||||
-irMaterial: Material being extracted
|
||||
-irAmount: Amount being extracted
|
||||
*/
|
||||
public func LiquidOutput(string sznMaterial, int inMaxAmount, object pnPump, object pnPipe, bool bnWildcard)
|
||||
{
|
||||
//Search liquid to pump
|
||||
if (bnWildcard)
|
||||
{
|
||||
var ptBarrel = FindObject(Find_Container(this), Find_Func("IsBarrel"), Find_Func("IsBarrelForMaterial", sznMaterial), Find_Not(Find_Func("BarrelIsEmpty")));
|
||||
var sztMaterial="";
|
||||
if (ptBarrel)
|
||||
sztMaterial = ptBarrel->GetBarrelMaterial();
|
||||
//Nothing to pump
|
||||
if (sztMaterial == "")
|
||||
return ["", 0];
|
||||
sznMaterial = sztMaterial;
|
||||
}
|
||||
var itFound = 0;
|
||||
for (var ptBarrel in FindObjects(Find_Container(this), Find_Func("IsBarrel"), Find_Func("IsBarrelForMaterial", sznMaterial), Find_Not(Find_Func("BarrelIsEmpty"))))
|
||||
{
|
||||
var atFound = ptBarrel->GetLiquid(sznMaterial, inMaxAmount - itFound, this);
|
||||
//Crazy stuff happend?
|
||||
itFound += BoundBy(atFound[1], 0, inMaxAmount - itFound);
|
||||
if (itFound == inMaxAmount)
|
||||
break;
|
||||
}
|
||||
return [sznMaterial, itFound];
|
||||
}
|
||||
|
||||
/**
|
||||
Insert liquid to this
|
||||
@param sznMaterial: Material to insert
|
||||
@param inMaxAmount: Max Amount of Material being inserted
|
||||
@param pnPump: Object which inserts the liquid
|
||||
@param pnPipe: Pipe which inserts the liquid (connected to pnPump)
|
||||
@return irAmount: The inserted amount
|
||||
*/
|
||||
public func LiquidInput(string sznMaterial, int inMaxAmount, object pnPump, object pnPipe)
|
||||
{
|
||||
var itAmount = inMaxAmount;
|
||||
//Fill liquids into already existing barrels
|
||||
for (var ptBarrel in FindObjects(Find_Container(this), Find_Func("IsBarrel"), Find_Func("IsContainerForMaterial", sznMaterial), Find_Not(Find_Func("BarrelIsEmpty")), Find_Not(Find_Func("BarrelIsFull"))))
|
||||
{
|
||||
itAmount -= BoundBy(ptBarrel->PutLiquid(sznMaterial, itAmount, this), 0, itAmount);
|
||||
if (!itAmount)
|
||||
return inMaxAmount;
|
||||
}
|
||||
//Fill liquids into empty barrels
|
||||
for (var ptBarrel in FindObjects(Find_Container(this), Find_Func("IsBarrel"), Find_Func("IsContainerForMaterial", sznMaterial), Find_Func("BarrelIsEmpty")))
|
||||
{
|
||||
itAmount -= BoundBy(ptBarrel->PutLiquid(sznMaterial, itAmount, this), 0, itAmount);
|
||||
if (!itAmount)
|
||||
return inMaxAmount;
|
||||
}
|
||||
return inMaxAmount - itAmount;
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
[DefCore]
|
||||
id=Libary_Tank
|
||||
Version=5,2,0,1
|
||||
Category=C4D_StaticBack
|
Binary file not shown.
After Width: | Height: | Size: 142 B |
|
@ -0,0 +1,61 @@
|
|||
/* --- Tank --- */
|
||||
|
||||
/*
|
||||
Author: ST-DDT
|
||||
Import this to allow the structures to
|
||||
-fill liquids which has been pumped into the building into the internal contained
|
||||
-extract liquids from internal contained and pump it somewhere else
|
||||
*/
|
||||
|
||||
local szLiquid;
|
||||
local iLiquidAmount;
|
||||
|
||||
public func MaxFillLevel()
|
||||
{
|
||||
return 5000;
|
||||
}
|
||||
|
||||
/**
|
||||
Extract liquid from this
|
||||
@param sznMaterial: Material to extract
|
||||
@param inMaxAmount: Max Amount of Material being extracted
|
||||
@param pnPump: Object which extracts the liquid
|
||||
@param pnPipe: Pipe which extracts the liquid (connected to pnPump)
|
||||
@param bnWildcard: Usefull to extract random liquids; use '*' for sznMaterial for all Materials
|
||||
@return [irMaterial,irAmount]
|
||||
-irMaterial: Material being extracted
|
||||
-irAmount: Amount being extracted
|
||||
*/
|
||||
public func LiquidOutput(string sznMaterial, int inMaxAmount, object pnPump, object pnPipe, bool bnWildcard)
|
||||
{
|
||||
//Search liquid to pump
|
||||
if (bnWildcard)
|
||||
{
|
||||
if (WildcardMatch(szLiquid, sznMaterial))
|
||||
sznMaterial = szLiquid;
|
||||
}
|
||||
//Wrong material?
|
||||
if (szLiquid != sznMaterial)
|
||||
return ["", 0];
|
||||
inMaxAmount = Min(inMaxAmount, iLiquidAmount);
|
||||
iLiquidAmount -= inMaxAmount;
|
||||
return [szLiquid, inMaxAmount];
|
||||
}
|
||||
|
||||
/**
|
||||
Insert liquid to this
|
||||
@param sznMaterial: Material to insert
|
||||
@param inMaxAmount: Max Amount of Material being inserted
|
||||
@param pnPump: Object which inserts the liquid
|
||||
@param pnPipe: Pipe which inserts the liquid (connected to pnPump)
|
||||
@return irAmount: The inserted amount
|
||||
*/
|
||||
public func LiquidInput(string sznMaterial, int inMaxAmount, object pnPump, object pnPipe)
|
||||
{
|
||||
//wrong material?
|
||||
if (szLiquid != sznMaterial)
|
||||
return 0;
|
||||
inMaxAmount = Min(MaxFillLevel() - iLiquidAmount, inMaxAmount);
|
||||
iLiquidAmount += inMaxAmount;
|
||||
return inMaxAmount;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/*--
|
||||
Pump
|
||||
Author: Maikel
|
||||
Author: Maikel, ST-DDT
|
||||
|
||||
Pumps liquids using drain and source pipes.
|
||||
--*/
|
||||
|
@ -42,6 +42,8 @@ protected func OnWaitStart()
|
|||
return;
|
||||
}
|
||||
|
||||
local aMaterials=["", 0]; //contained liquids
|
||||
|
||||
protected func Pumping()
|
||||
{
|
||||
// Only proceed if there is enough power available.
|
||||
|
@ -50,22 +52,26 @@ protected func Pumping()
|
|||
// Pump liquids.
|
||||
if (!source_pipe)
|
||||
return SetAction("Wait");
|
||||
var source = source_pipe->GetConnectedObject(this);
|
||||
// Extract liquid at source location.
|
||||
// TODO: Maybe bubble a little.
|
||||
var mat = source->ExtractLiquid();
|
||||
if (mat == -1)
|
||||
return;
|
||||
// Insert liquid at drain location.
|
||||
// If there is no drain pipe insert at pump.
|
||||
if (!drain_pipe)
|
||||
return InsertMaterial(mat);
|
||||
var drain = drain_pipe->GetConnectedObject(this);
|
||||
if (!drain)
|
||||
return InsertMaterial(mat);
|
||||
// TODO: Account for pumping into buildings.
|
||||
drain->InsertMaterial(mat);
|
||||
return;
|
||||
//IsEmpty?
|
||||
if ((aMaterials[1] == 0) || (aMaterials[0] == ""))
|
||||
{
|
||||
//Get new Materials
|
||||
aMaterials = source_pipe->GetLiquid("*", 5, this, true);
|
||||
//No Material to pump?
|
||||
if ((aMaterials[0] == "") || (aMaterials[1] == 0))
|
||||
return;
|
||||
}
|
||||
if (drain_pipe)
|
||||
aMaterials[1] -= BoundBy(drain_pipe->PutLiquid(aMaterials[0], aMaterials[1], this), 0, aMaterials[1]);
|
||||
else
|
||||
{
|
||||
var i = Max(0, aMaterials[1]), itMaterial = Material(aMaterials[0]);
|
||||
while (i--)
|
||||
InsertMaterial(itMaterial);
|
||||
aMaterials = ["", 0];
|
||||
}
|
||||
//maybe add the possebility to empty pump (invaild mats?)
|
||||
return;
|
||||
}
|
||||
|
||||
// Returns whether the pump can pump some liquid.
|
||||
|
@ -99,7 +105,7 @@ local ActMap = {
|
|||
Hgt = 32,
|
||||
NextAction = "Pump",
|
||||
StartCall = "OnPumpStart",
|
||||
PhaseCall = "Pumping",
|
||||
PhaseCall = "Pumping"
|
||||
},
|
||||
Wait = {
|
||||
Prototype = Action,
|
||||
|
@ -112,6 +118,6 @@ local ActMap = {
|
|||
Wdt = 28,
|
||||
Hgt = 32,
|
||||
NextAction = "Wait",
|
||||
StartCall = "OnWaitStart",
|
||||
},
|
||||
StartCall = "OnWaitStart"
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue