Library: Tank

Drain and source pipes can be connected to the tank
liquid_container
Mark 2016-02-03 06:58:41 +01:00
parent 11e7536b19
commit 65bc68af3e
4 changed files with 262 additions and 53 deletions

View File

@ -1,4 +1,4 @@
[DefCore]
id=Libary_Tank
id=Library_Tank
Version=6,0
Category=C4D_StaticBack

View File

@ -1,5 +1,7 @@
/* --- Tank --- */
#include Libary_LiquidContainer
/*
Author: ST-DDT
Import this to allow the structures to
@ -7,73 +9,254 @@ Import this to allow the structures to
-extract liquids from internal contained and pump it somewhere else
*/
local szLiquid;
local iLiquidAmount;
static const LIBRARY_TANK_Menu_Action_Add_Drain = "adddrain";
static const LIBRARY_TANK_Menu_Action_Add_Source = "addsource";
static const LIBRARY_TANK_Menu_Action_Cut_Drain = "cutdrain";
static const LIBRARY_TANK_Menu_Action_Cut_Source = "cutsource";
static const LIBRARY_TANK_Menu_Action_Description = "description";
public func MaxFillLevel()
///**
//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;
//}
local lib_tank; // proplist for local variables
func Construction()
{
return 5000;
lib_tank = {
drain_pipe = nil,
source_pipe = nil,
custom_entry =
{
Right = "100%", Bottom = "2em",
BackgroundColor = {Std = 0, OnHover = 0x50ff0000},
image = {Right = "2em"},
text = {Left = "2em"}
},
};
_inherited(...);
}
/**
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)
public func GetInteractionMenus(object clonk)
{
//Search liquid to pump
if (bnWildcard)
var menus = _inherited() ?? [];
if (CanConnectPipe())
{
if (WildcardMatch(szLiquid, sznMaterial))
sznMaterial = szLiquid;
var pipe_menu =
{
title = "$MenuPipeControl$",
entries_callback = this.GetPipeControlMenuEntries,
callback = "OnPipeControl",
callback_hover = "OnPipeControlHover",
callback_target = this,
BackgroundColor = RGB(0, 50, 50),
Priority = 30
};
PushBack(menus, pipe_menu);
}
//Wrong material?
if (szLiquid != sznMaterial)
return ["", 0];
inMaxAmount = Min(inMaxAmount, iLiquidAmount);
iLiquidAmount -= inMaxAmount;
return [szLiquid, inMaxAmount];
return menus;
}
/**
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)
func CanConnectPipe(){ return this->CanConnectSourcePipe() || this->CanConnectDrainPipe();}
func CanConnectDrainPipe(){ return false;}
func CanConnectSourcePipe(){ return false;}
func QueryConnectDrainPipe()
{
//wrong material?
if (szLiquid != sznMaterial)
return 0;
inMaxAmount = Min(MaxFillLevel() - iLiquidAmount, inMaxAmount);
iLiquidAmount += inMaxAmount;
return inMaxAmount;
return !this->CanConnectDrainPipe() || GetDrainPipe();
}
// Set tank liquid type and amount directly
public func SetLiquid(string szNewLiquid, int iNewLiquidAmount)
func QueryConnectSourcePipe()
{
szLiquid = szNewLiquid;
iLiquidAmount = iNewLiquidAmount;
return true;
return !this->CanConnectSourcePipe() || GetSourcePipe();
}
// Scenario saving of liquid fill levels
// Untested. This library is not used. Plus it's called "Libary_Tank" o_O
public func SaveScenarioObject(props)
func GetDrainPipe(){ return lib_tank.drain_pipe;}
func GetSourcePipe(){ return lib_tank.source_pipe;}
func SetDrainPipe(object drain_pipe)
{
if (!inherited(props, ...)) return false;
if (szLiquid) props->AddCall("Tank", this, "SetLiquid", Format("%v", szLiquid), iLiquidAmount);
return true;
if (!this->CanConnectDrainPipe()) FatalError("This object cannot have a drain pipe!");
lib_tank.drain_pipe = drain_pipe;
return lib_tank.drain_pipe;
}
func SetSourcePipe(object source_pipe)
{
if (!this->CanConnectSourcePipe()) FatalError("This object cannot have a source pipe!");
lib_tank.source_pipe = source_pipe;
return lib_tank.source_pipe;
}
public func GetPipeControlMenuEntries(object clonk)
{
var menu_entries = [];
// Add info message about pipe control.
PushBack(menu_entries, {symbol = this, extra_data = LIBRARY_TANK_Menu_Action_Description,
custom =
{
Prototype = lib_tank.custom_entry,
Bottom = "1.2em",
Priority = -1,
BackgroundColor = RGB(25, 100, 100),
text = {Prototype = lib_tank.custom_entry.text, Text = "$MsgPipeControl$"},
image = {Prototype = lib_tank.custom_entry.image, Symbol = Pipe}
}});
var index = 0;
if (GetSourcePipe())
PushBack(menu_entries, GetTankMenuEntry(Icon_Cancel, "$MsgCutSource$", ++index, LIBRARY_TANK_Menu_Action_Cut_Source));
for (var pipe in FindSourcePipes(clonk))
{
PushBack(menu_entries, GetTankMenuEntry(pipe, "$MsgConnectSource$", ++index, LIBRARY_TANK_Menu_Action_Add_Source));
}
if (GetDrainPipe())
PushBack(menu_entries, GetTankMenuEntry(Icon_Cancel, "$MsgCutDrain$", ++index, LIBRARY_TANK_Menu_Action_Cut_Drain));
for (var pipe in FindDrainPipes(clonk))
{
PushBack(menu_entries, GetTankMenuEntry(pipe, "$MsgConnectDrain$", ++index, LIBRARY_TANK_Menu_Action_Add_Drain));
}
//var entry_source_pipe = GetSourceMenuEntry(clonk);
//var entry_drain_pipe = GetDrainMenuEntry(clonk);
//if (entry_source_pipe) PushBack(menu_entries, entry_source_pipe);
//if (entry_drain_pipe) PushBack(menu_entries, entry_drain_pipe);
return menu_entries;
}
func FindSourcePipes(object container)
{
return FindObjects(Find_ID(Pipe), Find_Container(container), Find_Func("CanConnectAsSourcePipe"));
}
func FindDrainPipes(object container)
{
return FindObjects(Find_ID(Pipe), Find_Container(container), Find_Func("CanConnectAsDrainPipe"));
}
func GetTankMenuEntry(symbol, string text, int priority, extra_data)
{
return {symbol = symbol, extra_data = extra_data,
custom =
{
Prototype = lib_tank.custom_entry,
Priority = priority,
text = {Prototype = lib_tank.custom_entry.text, Text = text},
image = {Prototype = lib_tank.custom_entry.image, Symbol = symbol}
}};
}
public func OnPipeControlHover(id symbol, string action, desc_menu_target, menu_id)
{
var text = "";
if (action == LIBRARY_TANK_Menu_Action_Add_Drain) text = "$DescConnectDrain$";
else if (action == LIBRARY_TANK_Menu_Action_Cut_Drain) text = "$DescCutDrain$";
else if (action == LIBRARY_TANK_Menu_Action_Add_Source) text = "$DescConnectSource$";
else if (action == LIBRARY_TANK_Menu_Action_Cut_Source) text = "$DescCutSource$";
else if (action == LIBRARY_TANK_Menu_Action_Description) text = this.Description;
GuiUpdateText(text, menu_id, 1, desc_menu_target);
}
public func OnPipeControl(symbol_or_object, string action, bool alt)
{
if (action == LIBRARY_TANK_Menu_Action_Add_Source)
this->DoConnectSourcePipe(symbol_or_object);
else if (action == LIBRARY_TANK_Menu_Action_Cut_Source)
this->DoCutSourcePipe();
else if (action == LIBRARY_TANK_Menu_Action_Add_Drain)
this->DoConnectDrainPipe(symbol_or_object);
else if (action == LIBRARY_TANK_Menu_Action_Cut_Drain)
this->DoCutDrainPipe();
UpdateInteractionMenus(this.GetPipeControlMenuEntries);
}
func DoConnectSourcePipe(object pipe)
{
pipe->ConnectTo(pipe->Contained(), this, PIPE_STATE_Source);
}
func DoConnectDrainPipe(object pipe)
{
pipe->ConnectTo(pipe->Contained(), this, PIPE_STATE_Drain);
}
func DoCutSourcePipe()
{
DoCutPipe(GetSourcePipe());
}
func DoCutDrainPipe()
{
DoCutPipe(GetDrainPipe());
}
func DoCutPipe(object pipe)
{
if (pipe)
{
var pipe_kit = pipe->GetPipeKit();
pipe_kit->CutConnection(this);
}
}

View File

@ -0,0 +1,13 @@
MenuPipeControl=Leitungen
MsgPipeControl=TODO
MsgConnectSource=Zufluss anschließen
MsgConnectDrain=Abfluss anschließen
DescConnectSource=Schließt ein Zuflussrohr an.
DescConnectDrain=Schließt ein Abflussrohr an.
MsgCutSource=Zufluss trennen
MsgCutDrain=Abfluss trennen
DescCutSource=Entfernt das Zuflussrohr. Die Pumpe kann dann nicht mehr pumpen.
DescCutDrain=Entfernt das Abflussrohr. Es wird dann direkt zur Pumpe gepumpt.

View File

@ -0,0 +1,13 @@
MenuPipeControl=Pump Control
MsgPipeControl=TODO
MsgConnectSource=Connect source
MsgConnectDrain=Connect drain
DescConnectSource=Connects a source pipe.
DescConnectDrain=Connects a drain pipe.
MsgCutSource=Cut off source
MsgCutDrain=Cut off drain
DescCutSource=Removes the source pipe.
DescCutDrain=Removes the drain pipe.