Dayz Build 1.29.163047, Scripts Rev. 123548
Dayz Code Explorer by Zeroy
Loading...
Searching...
No Matches
liquid.c
Go to the documentation of this file.
1//extendable!
3{
8 float m_TemperatureLiquidThawThreshold = float.LOWEST;
9 float m_TemperatureLiquidBoilThreshold = Cooking.LIQUID_BOILING_POINT;
11
13
14 void LiquidInfo(string className, NutritionalProfile profile)
15 {
16 m_NutriProfile = profile;
17 Init(className);
18 }
19
20 protected void Init(string className)
21 {
22 string path = "cfgLiquidDefinitions " + className;
23 m_LiquidClassName = className;
24 g_Game.ConfigGetTextRaw(string.Format("%1 displayName", path), m_LiquidDisplayName);
25 g_Game.FormatRawConfigStringKeys(m_LiquidDisplayName);
26 m_LiquidType = g_Game.ConfigGetInt(string.Format("%1 type", path));
27 if (g_Game.ConfigIsExisting(string.Format("%1 liquidFreezeThreshold", path)))
28 m_TemperatureLiquidFreezeThreshold = g_Game.ConfigGetFloat(string.Format("%1 liquidFreezeThreshold", path));
29 if (g_Game.ConfigIsExisting(string.Format("%1 liquidThawThreshold", path)))
30 m_TemperatureLiquidThawThreshold = g_Game.ConfigGetFloat(string.Format("%1 liquidThawThreshold", path));
31 if (g_Game.ConfigIsExisting(string.Format("%1 liquidBoilingThreshold", path)))
32 m_TemperatureLiquidBoilThreshold = g_Game.ConfigGetFloat(string.Format("%1 liquidBoilingThreshold", path));
33 m_Flammability = g_Game.ConfigGetFloat(string.Format("%1 flammability", path));
34 }
35}
36
37class Liquid
38{
43 static bool m_Init = InitAllLiquids();
44
45 static string GetLiquidClassname(int liquid_type)
46 {
47 LiquidInfo info = m_LiquidInfosByType.Get(liquid_type);
48 if (info)
49 {
50 return info.m_LiquidClassName;
51 }
52
53 return "";
54 }
55
56 static bool InitAllLiquids()
57 {
58 if (!g_Game)
59 return false;
60
61 string cfg_classname = "cfgLiquidDefinitions";
62 string property_value = "NULL_PROPERTY";
63 int cfg_item_count = g_Game.ConfigGetChildrenCount(cfg_classname);
64
65 for (int i = 0; i < cfg_item_count; i++)
66 {
67 string liquid_class_name;
68 g_Game.ConfigGetChildName(cfg_classname, i, liquid_class_name);
69 string liquid_full_path = string.Format("%1 %2",cfg_classname, liquid_class_name);
70 int config_liquid_type = g_Game.ConfigGetInt(string.Format("%1 type", liquid_full_path));
71
72 NutritionalProfile profile = SetUpNutritionalProfile(config_liquid_type, liquid_class_name);
73 LiquidInfo info = new LiquidInfo(liquid_class_name, profile);
74 m_LiquidInfosByType.Insert(config_liquid_type, info);
75 m_LiquidInfosByName.Insert(liquid_class_name, info);
76
77 //legacy stuff
78 m_AllLiquidsByType.Insert(config_liquid_type, profile);
79 m_AllLiquidsByName.Insert(liquid_class_name, profile);
80 }
81 return true;
82 }
83
84 //---------------------------------------------------------------------------------------------------------
85 static void Transfer(ItemBase source_ent, ItemBase target_ent, float quantity = -1)
86 {
87 if (!Liquid.CanTransfer(source_ent, target_ent))
88 return;
89
90 float source_quantity = source_ent.GetQuantity();
91 float target_quantity = target_ent.GetQuantity();
92 float targetCfgWeight = target_ent.m_ConfigWeight;
93 int source_liquid_type = source_ent.GetLiquidType();
94
95 float available_capacity = target_ent.GetQuantityMax() - target_quantity;
96 float quantity_to_transfer;
97 //transfers all
98 if (quantity == -1)
99 {
100 quantity_to_transfer = Math.Clamp(source_quantity,0,available_capacity);
101 }
102 //transfers exact ammount
103 else
104 {
105 quantity_to_transfer = Math.Clamp(Math.Min(source_quantity,quantity),0,available_capacity);
106 }
107
108 PluginTransmissionAgents m_mta = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
109 m_mta.TransmitAgents(source_ent, target_ent, AGT_TRANSFER_COPY);
110
111 source_ent.AddQuantity(-quantity_to_transfer);
112
113 float retultTemp = (source_ent.GetTemperature() * quantity_to_transfer + target_ent.GetTemperature() * (targetCfgWeight + target_quantity)) / (targetCfgWeight + target_quantity + quantity_to_transfer);
114 target_ent.SetTemperature(retultTemp);
115
116 AffectContainerOnTransfer(target_ent,source_liquid_type,quantity_to_transfer,source_ent.GetTemperature());
117
118 Liquid.FillContainer(target_ent,source_liquid_type,quantity_to_transfer);
119 }
120
121 static bool CanTransfer(ItemBase source_ent, ItemBase target_ent)
122 {
123 if (!source_ent || !target_ent)
124 return false;
125
126 Barrel_ColorBase barrelTarget = Barrel_ColorBase.Cast(target_ent);
127 Barrel_ColorBase barrelSource = Barrel_ColorBase.Cast(source_ent);
128 if ((barrelTarget && !barrelTarget.IsOpen()) || (barrelSource && !barrelSource.IsOpen()))
129 {
130 return false;
131 }
132
133 if (source_ent.GetIsFrozen())
134 {
135 return false;
136 }
137
138 float source_quantity = source_ent.GetQuantity();
139 if (source_quantity <= 0)
140 {
141 //Debug.Log("source has no quantity", "LiquidTransfer");
142 return false;//if there is nothing to transfer
143 }
144
145 int source_liquid_type = source_ent.GetLiquidType();
146 if (source_liquid_type < 1)
147 {
148 //Debug.Log("source has some quantity, but does not have a valid liquidType set, liquidType = "+ToString(source_liquid_type), "LiquidTransfer");
149 return false;//if source is not a container
150 }
151
152 if (!CanFillContainer(target_ent,source_liquid_type))
153 {
154 return false;
155 }
156
157 return true;
158 }
159
160 static void FillContainer(ItemBase container, int liquid_type, float amount)
161 {
162 if (!CanFillContainer(container,liquid_type))
163 {
164 return;
165 }
166 //filling
167 container.SetLiquidType(liquid_type);
168 container.AddQuantity(amount);
169 }
170
172 static void FillContainerEnviro(ItemBase container, int liquid_type, float amount, bool inject_agents = true)
173 {
174 float containerCfgWeight = container.m_ConfigWeight;
175 float retultTemp = (GetLiquidTypeEnviroTemperature(liquid_type) * amount + container.GetTemperature() * (containerCfgWeight + container.GetQuantity())) / (container.GetQuantity() + containerCfgWeight + amount);
176 container.SetTemperature(retultTemp);
177 AffectContainerOnFill(container,liquid_type,amount);
178
179 FillContainer(container, TranslateLiquidType(liquid_type), amount);
180
181 if (inject_agents)
182 {
183 PluginTransmissionAgents plugin = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
184 int agtSource;
185 switch (liquid_type)
186 {
190 agtSource = AGT_WATER_POND;
191 break;
192 case LIQUID_SNOW:
193 agtSource = AGT_SNOW;
194 break;
195 case LIQUID_HOTWATER:
196 agtSource = AGT_WATER_HOT_SPRING;
197 break;
198 default:
199 agtSource = AGT_NONE;
200 break;
201 }
202
203 plugin.TransmitAgents(NULL, container, agtSource, amount);
204 }
205 }
206
208 static void AffectContainerOnFill(ItemBase container, int liquid_type, float amount)
209 {
210 container.AffectLiquidContainerOnFill(liquid_type,amount);
211 }
212
213 static void AffectContainerOnTransfer(ItemBase container, int liquidType, float amount, float sourceLiquidTransfer)
214 {
215 container.AffectLiquidContainerOnTransfer(liquidType,amount,sourceLiquidTransfer);
216 }
217
218 static bool IsLiquidDrinkWater(int liquidType)
219 {
220 if (liquidType & (LIQUID_GROUP_DRINKWATER))
221 return true;
222 return false;
223 }
224
226 static int TranslateLiquidType(int liquidType)
227 {
228 if (IsLiquidDrinkWater(liquidType))
229 return LIQUID_WATER;
230 else
231 return liquidType;
232 }
233
234 static bool CanFillContainer(ItemBase container, int liquid_type, bool ignore_fullness_check = false)
235 {
236 if (!container)
237 return false;
238
239 bool is_container_full = container.IsFullQuantity();
240
241 if (is_container_full && !ignore_fullness_check)
242 {
243 //Debug.Log("container is full", "LiquidTransfer");
244 return false;
245
246 }
247 int container_mask = container.GetLiquidContainerMask();
248
249 if (container_mask == 0)
250 {
251 //Debug.Log("target is not a container", "LiquidTransfer");
252 return false;//if the target liquidContainerType is set to 0
253 }
254
255 if ((liquid_type & container_mask) == 0)
256 {
257 //Debug.Log("target liquidContainerType does not support this liquid type", "LiquidTransfer");
258 return false;
259 }
260
261 float container_quantity = container.GetQuantity();
262
263 int container_liquid_type = container.GetLiquidType();
264
265 if (container_quantity > 0 && container_liquid_type != liquid_type)
266 {
267 //Debug.Log("target is not empty AND is of different liquid type than liquid_type added in", "LiquidTransfer");
268 return false;
269 }
270 return true;
271 }
272
274
277 static float GetLiquidTypeEnviroTemperature(int liquidType)
278 {
279 float ret = g_Game.GetMission().GetWorldData().GetLiquidTypeEnviroTemperature(liquidType);
280 //ret = Math.Max(ret,GetLiquidFreezeThreshold(liquidType));
281
282 return ret;
283 }
284
285 private static string GetLiquidConfigProperty(int liquid_type, string property_name, bool is_nutrition_property = false)
286 {
287 string cfg_classname = "cfgLiquidDefinitions";
288 string property_value = "NULL_PROPERTY";
289 if (!g_Game)
290 return property_value;
291
292 int cfg_item_count = g_Game.ConfigGetChildrenCount(cfg_classname);
293
294 for (int i = 0; i < cfg_item_count; i++)
295 {
296 string liquid_class_name;
297 g_Game.ConfigGetChildName(cfg_classname, i, liquid_class_name);
298 string liquid_full_path = string.Format("%1 %2", cfg_classname, liquid_class_name);
299 int config_liquid_type = g_Game.ConfigGetInt(string.Format("%1 type", liquid_full_path));
300
301 if (config_liquid_type == liquid_type)// found the specific class, now lets extract the values
302 {
303 if (!is_nutrition_property)
304 {
305 g_Game.ConfigGetText(string.Format("%1 %2", liquid_full_path, property_name), property_value);
306 return property_value;
307 }
308 else
309 {
310 g_Game.ConfigGetText(string.Format("%1 Nutrition %2", liquid_full_path, property_name), property_value);
311 return property_value;
312 }
313 }
314 }
315 return property_value;
316 }
317
319 {
320 LiquidInfo info = m_LiquidInfosByType.Get(liquid_type);
321 if (info && info.m_NutriProfile)
322 return info.m_NutriProfile;
323
324 return null;
325 }
326
328 {
330 if (info && info.m_NutriProfile)
331 return info.m_NutriProfile;
332
333 return null;
334 }
335
336 static NutritionalProfile SetUpNutritionalProfile(int liquid_type, string liquid_class_name)
337 {
339 profile.m_Energy = Liquid.GetLiquidConfigProperty(liquid_type, "energy", true).ToFloat();
340 profile.m_NutritionalIndex = Liquid.GetLiquidConfigProperty(liquid_type, "nutritionalIndex", true).ToFloat();
341 profile.m_FullnessIndex = Liquid.GetLiquidConfigProperty(liquid_type, "fullnessIndex", true).ToFloat();
342 profile.m_WaterContent = Liquid.GetLiquidConfigProperty(liquid_type, "water", true).ToFloat();
343 profile.m_Toxicity = Liquid.GetLiquidConfigProperty(liquid_type, "toxicity", true).ToFloat();
344 profile.m_Agents = Liquid.GetLiquidConfigProperty(liquid_type, "agents", true).ToInt();
345 profile.m_Digestibility = Liquid.GetLiquidConfigProperty(liquid_type, "digestibility", true).ToFloat();
346 profile.m_AgentsPerDigest = Liquid.GetLiquidConfigProperty(liquid_type, "agentsPerDigest", true).ToFloat();
347
348 profile.MarkAsLiquid(liquid_type, liquid_class_name);
349 return profile;
350 }
351
352 static int GetAgents(int liquid_type)
353 {
354 return m_LiquidInfosByType.Get(liquid_type).m_NutriProfile.GetAgents();
355 }
356
357 static int GetAgentsPerDigest(int liquidType)
358 {
359 return m_LiquidInfosByType.Get(liquidType).m_NutriProfile.m_AgentsPerDigest;
360 }
361
362 static float GetToxicity(int liquid_type)
363 {
364 return m_LiquidInfosByType.Get(liquid_type).m_NutriProfile.GetToxicity();
365 }
366
367 static float GetWaterContent(int liquid_type)
368 {
369 return m_LiquidInfosByType.Get(liquid_type).m_NutriProfile.GetWaterContent();
370 }
371
372 static float GetEnergy(int liquid_type)
373 {
374 return m_LiquidInfosByType.Get(liquid_type).m_NutriProfile.GetEnergy();
375 }
376
377 static float GetNutritionalIndex(int liquid_type)
378 {
379 return m_LiquidInfosByType.Get(liquid_type).m_NutriProfile.GetNutritionalIndex();
380 }
381
382 static string GetDisplayName(int liquid_type)
383 {
384 return m_LiquidInfosByType.Get(liquid_type).m_LiquidDisplayName;
385 }
386
387 static float GetFlammability(int liquid_type)
388 {
389 return m_LiquidInfosByType.Get(liquid_type).m_Flammability;
390 }
391
392 static float GetFullness(int liquid_type)
393 {
394 return m_LiquidInfosByType.Get(liquid_type).m_NutriProfile.GetFullnessIndex();
395 }
396
397 static float GetDigestibility(int liquid_type)
398 {
399 return m_LiquidInfosByType.Get(liquid_type).m_NutriProfile.GetDigestibility();
400 }
401
402 static float GetFreezeThreshold(int liquid_type)
403 {
404 return m_LiquidInfosByType.Get(liquid_type).m_TemperatureLiquidFreezeThreshold;
405 }
406
407 static float GetThawThreshold(int liquid_type)
408 {
409 return m_LiquidInfosByType.Get(liquid_type).m_TemperatureLiquidThawThreshold;
410 }
411
412 static float GetBoilThreshold(int liquid_type)
413 {
414 return m_LiquidInfosByType.Get(liquid_type).m_TemperatureLiquidBoilThreshold;
415 }
416
418//deprecated methods below
420 static string GetName(int liquid_type)
421 {
422 return Liquid.GetLiquidConfigProperty(liquid_type, "name");
423 }
424};
override bool IsOpen()
void LiquidInfo(string className, NutritionalProfile profile)
Definition liquid.c:14
string m_LiquidClassName
Definition liquid.c:4
ref NutritionalProfile m_NutriProfile
Definition liquid.c:12
int m_LiquidType
Definition liquid.c:6
float m_Flammability
Definition liquid.c:10
float m_TemperatureLiquidThawThreshold
Definition liquid.c:8
void Init(string className)
Definition liquid.c:20
string m_LiquidDisplayName
Definition liquid.c:5
float m_TemperatureLiquidFreezeThreshold
Definition liquid.c:7
float m_TemperatureLiquidBoilThreshold
Definition liquid.c:9
Definition enmath.c:7
void MarkAsLiquid(int liquid_type, string classname)
DayZGame g_Game
Definition dayzgame.c:3942
override Widget Init()
Definition dayzgame.c:127
static float GetAgentsPerDigest(ItemBase item, string className="", int foodStage=0)
const int AGT_NONE
Definition constants.c:499
const int AGT_TRANSFER_COPY
Definition constants.c:503
const int AGT_WATER_HOT_SPRING
Definition constants.c:513
const int AGT_WATER_POND
Definition constants.c:505
const int AGT_SNOW
Definition constants.c:511
const int LIQUID_STILLWATER
Definition constants.c:555
const int LIQUID_HOTWATER
Definition constants.c:556
const int LIQUID_GROUP_DRINKWATER
Definition constants.c:559
const int LIQUID_FRESHWATER
Definition constants.c:554
const int LIQUID_WATER
Definition constants.c:544
const int LIQUID_RIVERWATER
Definition constants.c:545
const int LIQUID_SNOW
Definition constants.c:552
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float Min(float x, float y)
Returns smaller of two given values.
proto native owned string GetName()
Test name getter. Strictly for UI porposes!
float GetEnergy()
Definition itembase.c:8525
override int GetAgents()
Definition itembase.c:8910
static bool InitAllLiquids()
Definition liquid.c:56
static ref map< string, ref LiquidInfo > m_LiquidInfosByName
Definition liquid.c:42
class LiquidInfo m_AllLiquidsByType
static float GetToxicity(int liquid_type)
Definition liquid.c:362
static float GetDigestibility(int liquid_type)
Definition liquid.c:397
static ref map< int, ref LiquidInfo > m_LiquidInfosByType
Definition liquid.c:41
static NutritionalProfile GetNutritionalProfileByType(int liquid_type)
Definition liquid.c:318
static void FillContainerEnviro(ItemBase container, int liquid_type, float amount, bool inject_agents=true)
Filled from any enviro source (fuel feed, pond, snow...).
Definition liquid.c:172
static float GetNutritionalIndex(int liquid_type)
Definition liquid.c:377
static float GetFullness(int liquid_type)
Definition liquid.c:392
static bool m_Init
Definition liquid.c:43
static bool CanFillContainer(ItemBase container, int liquid_type, bool ignore_fullness_check=false)
Definition liquid.c:234
static string GetLiquidClassname(int liquid_type)
Definition liquid.c:45
static void AffectContainerOnTransfer(ItemBase container, int liquidType, float amount, float sourceLiquidTransfer)
Definition liquid.c:213
static NutritionalProfile SetUpNutritionalProfile(int liquid_type, string liquid_class_name)
Definition liquid.c:336
static string GetLiquidConfigProperty(int liquid_type, string property_name, bool is_nutrition_property=false)
Definition liquid.c:285
static float GetFreezeThreshold(int liquid_type)
Definition liquid.c:402
static float GetFlammability(int liquid_type)
Definition liquid.c:387
static bool CanTransfer(ItemBase source_ent, ItemBase target_ent)
Definition liquid.c:121
static float GetBoilThreshold(int liquid_type)
Definition liquid.c:412
static float GetThawThreshold(int liquid_type)
Definition liquid.c:407
static void Transfer(ItemBase source_ent, ItemBase target_ent, float quantity=-1)
Definition liquid.c:85
static bool IsLiquidDrinkWater(int liquidType)
Definition liquid.c:218
static int TranslateLiquidType(int liquidType)
Translates 'administrative' liquid types into liquid types with valid config class.
Definition liquid.c:226
static NutritionalProfile GetNutritionalProfileByName(string class_name)
Definition liquid.c:327
static void FillContainer(ItemBase container, int liquid_type, float amount)
Definition liquid.c:160
static float GetLiquidTypeEnviroTemperature(int liquidType)
Gets liquid temperature from the enviroment.
Definition liquid.c:277
static ref map< string, ref NutritionalProfile > m_AllLiquidsByName
Definition liquid.c:40
static string GetDisplayName(int liquid_type)
Definition liquid.c:382
static void AffectContainerOnFill(ItemBase container, int liquid_type, float amount)
from enviro source
Definition liquid.c:208
static float GetWaterContent(int liquid_type)
Definition liquid.c:367
class OptionSelectorMultistate extends OptionSelector class_name
PluginBase GetPlugin(typename plugin_type)