DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
MiscGameplayFunctions.c
См. документацию.
2{
8
9 void TurnItemIntoItemLambda (EntityAI old_item, string new_item_type, PlayerBase player)
10 {
12 }
13
14 void SetTransferParams(bool transfer_agents = true, bool transfer_variables = true, bool transfer_health = true, bool exclude_quantity = false, float quantity_override = -1)
15 {
16 m_TransferAgents = transfer_agents;
17 m_TransferVariables = transfer_variables;
18 m_TransferHealth = transfer_health;
19 m_ExcludeQuantity = exclude_quantity;
20 m_quantity_override = quantity_override;
21 }
22
23 override void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
24 {
25 super.CopyOldPropertiesToNew(old_item, new_item);
26
27 if (new_item)
28 {
29 MiscGameplayFunctions.TransferItemProperties(old_item, new_item, m_TransferAgents, m_TransferVariables, m_TransferHealth, m_ExcludeQuantity);
30 MiscGameplayFunctions.TransferInventory(old_item, new_item, m_Player);
31
32 //quantity override
33 if (ItemBase.Cast(new_item) && m_quantity_override != -1)
34 {
37 }
38 }
39 else
40 {
41 Debug.LogError("TurnItemIntoItemLambda: failed to create new item","static");
42 }
43 }
44
46 override void VerifyItemTypeBySlotType ()
47 {
48 if (m_NewLocation.GetType() == InventoryLocationType.ATTACHMENT && m_OldItem.ConfigIsExisting("ChangeIntoOnAttach"))
49 {
50 string str;
51 int idx = -1;
52 TStringArray inventory_slots = new TStringArray;
53 TIntArray inventory_slots_idx = new TIntArray;
54 TStringArray attach_types = new TStringArray;
55
56 m_OldItem.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
57 if (inventory_slots.Count() < 1) //is string
58 {
59 inventory_slots_idx.Insert(InventorySlots.GetSlotIdFromString(m_OldItem.ConfigGetString("ChangeInventorySlot")));
60 attach_types.Insert(m_OldItem.ConfigGetString("ChangeIntoOnAttach"));
61 }
62 else //is array
63 {
64 inventory_slots_idx.Clear();
65 for (int i = 0; i < inventory_slots.Count(); ++i)
66 {
67 inventory_slots_idx.Insert(InventorySlots.GetSlotIdFromString(inventory_slots.Get(i)));
68 }
69 m_OldItem.ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
70 }
71
72 idx = m_NewLocation.GetSlot();
73 str = attach_types.Get(inventory_slots_idx.Find(idx));
74 if (str != "")
75 {
76 m_NewItemType = str;
77 }
78 }
79 }
80
81 override void OnSuccess (EntityAI new_item)
82 {
83 super.OnSuccess(new_item);
84 if( m_Player )
85 {
86 m_Player.GetItemAccessor().OnItemInHandsChanged();
87 }
88 }
89};
90
91class TurnItemIntoItemLambdaAnimSysNotifyLambda extends TurnItemIntoItemLambda
92{
93 override void OnSuccess (EntityAI new_item)
94 {
95 super.OnSuccess(new_item);
96 if( m_Player )
97 {
98 m_Player.GetItemAccessor().OnItemInHandsChanged();
99 }
100 }
101}
102
103class TurnItemIntoItemLambdaRestrainLambda extends TurnItemIntoItemLambdaAnimSysNotifyLambda
104{
105 override void OnSuccess (EntityAI new_item)
106 {
107 super.OnSuccess(new_item);
108 m_Player.SetRestrained(true);
109 }
110}
111
116{
118
119 void DropEquipAndDestroyRootLambda (EntityAI old_item, string new_item_type, PlayerBase player)
120 {
121 m_Player = player;
122 }
123
124 override void CopyOldPropertiesToNew (notnull EntityAI old_item, EntityAI new_item)
125 {
126 super.CopyOldPropertiesToNew(old_item, new_item);
127
128 InventoryLocation understash_src = m_NewLocation; // m_NewLocation is a backup of original old_item's src before the operation started
129
130 array<EntityAI> children = new array<EntityAI>;
131 old_item.GetInventory().EnumerateInventory(InventoryTraversalType.LEVELORDER, children);
132 int count = children.Count();
133 for (int i = 0; i < count; ++i)
134 {
135 EntityAI child = children.Get(i);
136 if (child)
137 {
138 InventoryLocation child_src = new InventoryLocation;
139 child.GetInventory().GetCurrentInventoryLocation(child_src);
140
141 InventoryLocation child_dst = new InventoryLocation;
142 //@TODO: modify _dst with place on gnd?
143
144 vector m4[4];
146
148 GameInventory.PrepareDropEntityPos(old_item, child, m4, false, -1);
149
150 child_dst.SetGround(child,m4);
151
152 m_Player.LocalTakeToDst(child_src, child_dst);
153
154 g_Game.RemoteObjectTreeCreate(child); // this forces server to send CreateVehicle Message to client. This is needed for preserving the appearance of network operations on client (so that DeleteObject(old) arrives before CreateVehicle(new)). @NOTE: this does not delete the object on server, only it's network representation.
155 }
156 }
157 }
158}
159
160/**@class MoveEquipToExistingItemAndDestroyOldRootLambda
161 * @brief this one is a also bit special: it moves all items to already existing item and destroys the ex-root of the hierarchy
162 **/
164{
167
168 void MoveEquipToExistingItemAndDestroyOldRootLambda (EntityAI old_item, string new_item_type, PlayerBase player, EntityAI new_item)
169 {
170 m_Player = player;
171 m_NewItem = new_item;
172 if (new_item_type != string.Empty)
173 Error("MoveEquipAndDestroyRootLambda expects new_item_type to be empty");
174 }
175
176 override protected void RemoveNetworkObjectInfo ()
177 {
178 super.RemoveNetworkObjectInfo();
179 g_Game.RemoteObjectTreeDelete(m_NewItem);
180 }
181 override protected void UndoRemoveNetworkObjectInfo ()
182 {
183 super.UndoRemoveNetworkObjectInfo();
184 g_Game.RemoteObjectTreeCreate(m_NewItem);
185 }
186
187 override void CopyOldPropertiesToNew (notnull EntityAI old_item, EntityAI new_item)
188 {
189 // @NOTE: new_item is NULL, this lambda does not create new entity
190 super.CopyOldPropertiesToNew(old_item, new_item);
191
192 MiscGameplayFunctions.TransferInventory(old_item, m_NewItem, m_Player);
193 }
194
195 override protected void CreateNetworkObjectInfo (EntityAI new_item)
196 {
197 super.CreateNetworkObjectInfo(new_item);
198 g_Game.RemoteObjectTreeCreate(m_NewItem);
199 }
200};
201
206
208{
209 NONE = 0,
210 SPLIT = 1, //< Splits the item when it has quantity, recommended to use when called on an attachment
211}
212
213class MiscGameplayFunctions
214{
216 static float Truncate(float value, int decimals = 2)
218 int multiplier = Math.Pow(10,decimals);
219 return Math.Clamp(Math.Floor(value * multiplier),float.LOWEST, float.MAX) / multiplier;
220 }
222 static string TruncateToS(float value, int decimals = 2)
223 {
224 return Truncate(value, decimals).ToString();
225 }
226
227 static vector TruncateVec(vector value, int decimals = 2)
228 {
229 int multiplier = Math.Pow(10,decimals);
230 float v1 = Math.Clamp(Math.Floor(value[0] * multiplier),float.LOWEST, float.MAX) / multiplier;
231 float v2 = Math.Clamp(Math.Floor(value[1] * multiplier),float.LOWEST, float.MAX) / multiplier;
232 float v3 = Math.Clamp(Math.Floor(value[2] * multiplier),float.LOWEST, float.MAX) / multiplier;
233 return Vector(v1,v2,v3);
234 }
235
236 static string TruncateVecToS(vector value,int decimals = 2, string delimiter = " ")
237 {
238 return MiscGameplayFunctions.TruncateToS(value[0],decimals) + delimiter + MiscGameplayFunctions.TruncateToS(value[1],decimals) +delimiter + MiscGameplayFunctions.TruncateToS(value[2],decimals);
239 }
240
241 static string GetColorString(float r, float g, float b, float a)
242 {
243 return string.Format("#(argb,8,8,3)color(%1,CO)", string.Format("%1,%2,%3,%4", r, g, b, a));
244 }
245
247 static string ValueToBar(float value, string bar = "[----------]", string mark = "x")
248 {
249 int length = bar.Length() - 2;
250 float index = Math.Lerp(0,length, value);
251 index = Math.Round(index);
252 index = Math.Clamp(index,0,length);
253
254 return InsertAtPos(bar,mark,index);
255 }
256
258 static string InsertAtPos(string base, string insert, int pos)
259 {
260 int length_first = pos+1;
261 int length_base = base.Length();
262 int length_second = length_base - length_first;
263 string first = base.Substring(0,length_first);
264 string second = base.Substring(pos+1,length_second);
265 return first + insert + second;
266 }
267
269 static void TransferItemProperties(EntityAI source, notnull EntityAI target, bool transfer_agents = true, bool transfer_variables = true, bool transfer_health = true, bool exclude_quantity = false)
270 {
271 ItemBase target_ib = ItemBase.Cast(target);
272
273 if (transfer_agents && target_ib)
274 target_ib.TransferAgents(source.GetAgents());
275
276 if (transfer_variables)
277 MiscGameplayFunctions.TransferEntityVariables(source, target, exclude_quantity);
278
279 if (g_Game.IsServer() || !g_Game.IsMultiplayer())
280 {
281 if (transfer_health)
282 {
283 TransferEntityHealth(source,target,{"Health"});
284 }
285 }
286 }
287
288 static void TransferEntityVariables(EntityAI source, EntityAI target, bool exclude_quantity = false)
289 {
290 if (exclude_quantity)
291 {
292 int maskOriginal = source.m_VariablesMask;
293 source.RemoveItemVariable(VARIABLE_QUANTITY);
294 target.TransferVariablesFloat(source.GetVariablesFloat());
295 source.m_VariablesMask = maskOriginal;
296 }
297 else
298 {
299 target.TransferVariablesFloat(source.GetVariablesFloat());
300 }
301
302 if (source.IsMagazine() && target.IsMagazine())
303 {
304 Magazine source_mag = Magazine.Cast(source);
305 Magazine target_mag = Magazine.Cast(target);
306
307 target_mag.ServerSetAmmoCount(source_mag.GetAmmoCount());
308 }
309
310 if (source.IsWeapon() && target.IsWeapon())
311 {
312 Weapon_Base source_wpn = Weapon_Base.Cast(source);
313 Weapon_Base target_wpn = Weapon_Base.Cast(target);
314
315 target_wpn.CopyWeaponStateFrom(source_wpn);
316 }
317
318 if (source.HasEnergyManager() && target.HasEnergyManager())
319 {
320 ComponentEnergyManager ems = source.GetCompEM();
321 ComponentEnergyManager emt = target.GetCompEM();
322
323 emt.SetEnergy(ems.GetEnergy());
324
325 if (ems.IsSwitchedOn())
326 emt.SwitchOn();
327 }
328
329 Edible_Base source_edb = Edible_Base.Cast(source);
330 Edible_Base target_edb = Edible_Base.Cast(target);
331 if (Class.CastTo(source_edb,source) && Class.CastTo(target_edb,target))
332 {
333 if (source_edb.CanDecay() && target_edb.CanDecay())
334 target_edb.TransferFoodStage(source_edb);
335 }
336 }
337
339 static void TransferItemVariables(ItemBase source, ItemBase target, bool exclude_quantity = false)
340 {
341 TransferEntityVariables(source,target,exclude_quantity);
342 }
343
345 {
347
348 array<EntityAI> children = new array<EntityAI>;
349 sourceItem.GetInventory().EnumerateInventory(InventoryTraversalType.LEVELORDER, children);
350 int count = children.Count();
351 for (int i = 0; i < count; ++i)
352 {
353 EntityAI child = children.Get(i);
354 if (child)
355 {
356 InventoryLocation child_src = new InventoryLocation;
357 child.GetInventory().GetCurrentInventoryLocation( child_src );
358
359 InventoryLocation child_dst = new InventoryLocation;
360 child_dst.Copy( child_src );
361 child_dst.SetParent( targetItem );
362
363 bool drop = false;
364
365 if (GameInventory.LocationCanAddEntity(child_dst))
366 {
367 // try to move it to the same exact place in dst
368 targetItem.GetInventory().TakeToDst(InventoryMode.LOCAL, child_src, child_dst);
369 }
370 else
371 {
372 drop = true; // or drop otherwise
373 }
374
375 if (drop)
376 {
377 player.LocalDropEntity(child);
378 g_Game.RemoteObjectTreeCreate(child);
379 result = TransferInventoryResult.DroppedSome;
380 }
381 }
382 }
383 return result;
384 }
385
386 static void TransferEntityHealth(EntityAI source, EntityAI target, array<string> healthTypes = null, bool transferZoneDamage = true)
387 {
388 array<string> HPTypes = new array<string>;
389 if (!healthTypes || healthTypes.Count() == 0)
390 HPTypes.Insert("Health");
391 else
392 HPTypes.Copy(healthTypes);
393
394 if (transferZoneDamage)
395 {
396 TStringArray zonesSrc = new TStringArray;
397 TStringArray zonesTgt = new TStringArray;
398 source.GetDamageZones(zonesSrc);
399 target.GetDamageZones(zonesTgt);
400
401 foreach (string zone : zonesSrc)
402 {
403 if (zonesTgt.Find(zone) == -1)
404 continue;
405
406 foreach (string health : HPTypes)
407 {
408 target.SetHealth01(zone,health,source.GetHealth01(zone,health));
409 }
410 }
411 }
412
413 foreach (string gHealth : HPTypes)
414 {
415 target.SetHealth01("",gHealth,source.GetHealth01("",gHealth)); //global health last
416 }
417 }
418
420 {
421 if ( ItemBase.GetDebugActionsMask() & DebugActionType.UNLIMITED_AMMO )
422 {
423 Magazine magazine;
424 if ( g_Game.IsServer() )
425 {
426 magazine = weapon.GetMagazine(weapon.GetCurrentMuzzle());
427
428 if (magazine)
429 {
430 if (magazine.GetAmmoCount() <= 5)
431 {
432 magazine.ServerSetAmmoMax();
433 }
434 }
435 }
436 else
437 {
438 magazine = weapon.GetMagazine(weapon.GetCurrentMuzzle());
439
440 if (magazine)
441 {
442 if (magazine.GetAmmoCount() <= 5)
443 {
444 magazine.LocalSetAmmoMax();
445 }
446 }
447
448 }
449 }
450 }
451
452
453
454 static void TurnItemIntoItem (notnull ItemBase old_item, string new_item_type, notnull PlayerBase player)
455 {
456 TurnItemIntoItemEx(player, new TurnItemIntoItemLambda(old_item, new_item_type, player));
457 }
458
459 static void TurnItemIntoItemEx (notnull PlayerBase player, ReplaceItemWithNewLambdaBase lambda)
460 {
461 player.ServerReplaceItemWithNew(lambda);
462 }
463
464 static void TurnItemInHandsIntoItem (notnull ItemBase old_item, string new_item_type, notnull PlayerBase player)
465 {
466 TurnItemInHandsIntoItemEx(player, new TurnItemIntoItemLambda(old_item, new_item_type, player));
467 }
468
470 {
471 player.ServerReplaceItemInHandsWithNew(lambda);
472 }
473
475 static array<ItemBase> CreateItemBasePiles(string item_name, vector ground_position, float quantity, float health, bool floaty_spawn = false)
476 {
477 return CreateItemBasePilesEx(item_name, ground_position, quantity, health, floaty_spawn);
478 }
479
480 static array<ItemBase> CreateItemBasePilesEx(string itemName, vector groundPosition, float quantity, float health, bool floatySpawn = false, bool throwAfterSpawn = false)
481 {
482 array<ItemBase> itemPiles;
483 float maxStackSize;
484 ItemBase pile;
485
486 itemPiles = new array<ItemBase>;
487 maxStackSize = g_Game.ConfigGetInt("cfgVehicles " + itemName + " varStackMax");
488 if( maxStackSize < 1)
489 maxStackSize = g_Game.ConfigGetInt("cfgVehicles " + itemName + " varQuantityMax");
490 if( maxStackSize < 1)
491 maxStackSize = 1;
492
493 int fullPilesCount = Math.Floor(quantity/maxStackSize);
494 int rest = quantity - (fullPilesCount * maxStackSize);
495
496 for (int i = 0; i < fullPilesCount; ++i)
497 {
498 if (floatySpawn)
499 {
500 pile = ItemBase.Cast(g_Game.CreateObjectEx(itemName, groundPosition, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
501 }
502 else
503 {
504 pile = ItemBase.Cast(g_Game.CreateObjectEx(itemName, groundPosition, ECE_PLACE_ON_SURFACE));
505 }
506
507 pile.SetQuantity(maxStackSize);
508 pile.SetHealth(health);
509
510 if (throwAfterSpawn)
511 {
512 pile.ThrowPhysically(null, vector.Zero);
513 }
514
515 itemPiles.Insert(pile);
516 }
517
518 if (rest > 0)
519 {
520 if (floatySpawn)
521 {
522 pile = ItemBase.Cast(g_Game.CreateObjectEx(itemName, groundPosition, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
523 }
524 else
525 {
526 pile = ItemBase.Cast(g_Game.CreateObjectEx(itemName, groundPosition, ECE_PLACE_ON_SURFACE));
527 }
528
529 pile.SetQuantity(rest);
530 pile.SetHealth(health);
531
532 if (throwAfterSpawn)
533 {
534 pile.ThrowPhysically(null, vector.Zero);
535 }
536
537 itemPiles.Insert(pile);
538 }
539
540 return itemPiles;
541 }
542
544 static array<ItemBase> CreateItemBasePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
545 {
546 array<ItemBase> item_piles;
547 float max_stack_size;
548 ItemBase pile;
549
550 item_piles = new array<ItemBase>;
551 max_stack_size = g_Game.ConfigGetInt("cfgVehicles " + item_name + " varStackMax");
552 if( max_stack_size < 1)
553 max_stack_size = g_Game.ConfigGetInt("cfgVehicles " + item_name + " varQuantityMax");
554 if( max_stack_size < 1)
555 max_stack_size = 1;
556
557 int full_piles_count = Math.Floor(quantity/max_stack_size);
558 int rest = quantity - (full_piles_count*max_stack_size);
559 vector randomizedPos;
560
561 for (int i = 0; i < full_piles_count; ++i)
562 {
563 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
564 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_PLACE_ON_SURFACE));
565 pile.SetQuantity(max_stack_size);
566 pile.SetHealth(health);
567 item_piles.Insert(pile);
568 }
569
570 if (rest > 0)
571 {
572 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
573 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_PLACE_ON_SURFACE));
574 pile.SetQuantity(rest);
575 pile.SetHealth(health);
576 item_piles.Insert(pile);
577 }
578 return item_piles;
579 }
580
581 static array<Magazine> CreateMagazinePiles(string item_name, vector ground_position, float quantity, float health )
582 {
583 array<Magazine> items;
584 float stack_size;
585 Magazine pile;
586
587 items = new array<Magazine>;
588 stack_size = g_Game.ConfigGetInt("cfgMagazines " + item_name + " count");
589
590 int piles_count = Math.Floor(quantity/stack_size);
591 int rest = quantity - (piles_count*stack_size);
592
593 for (int i = 0; i < piles_count; ++i)
594 {
595 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
596 pile.ServerSetAmmoCount(stack_size);
597 items.Insert(pile);
598 }
599 if (rest > 0)
600 {
601 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
602 pile.ServerSetAmmoCount(rest);
603 items.Insert(pile);
604 }
605 return items;
606 }
607
609 static array<Magazine> CreateMagazinePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
610 {
611 array<Magazine> items;
612 float stack_size;
613 Magazine pile;
614
615 items = new array<Magazine>;
616 stack_size = g_Game.ConfigGetInt("cfgMagazines " + item_name + " count");
617
618 int piles_count = Math.Floor(quantity/stack_size);
619 int rest = quantity - (piles_count*stack_size);
620 vector randomizedPos;
621
622 for (int i = 0; i < piles_count; ++i)
623 {
624 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
625 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
626 pile.ServerSetAmmoCount(stack_size);
627 items.Insert(pile);
628 }
629
630 if (rest > 0)
631 {
632 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
633 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
634 pile.ServerSetAmmoCount(rest);
635 items.Insert(pile);
636 }
637 return items;
638 }
639
640 static array<Magazine> CreateMagazinePilesFromBullet(string bullet_type, vector ground_position, float quantity, float health )
641 {
642 array<Magazine> items;
643 items = new array<Magazine>;
644 float stack_size;
645 Magazine pile;
646 string item_name;
647 if (!g_Game.ConfigGetText("cfgAmmo " + bullet_type + " spawnPileType", item_name))
648 return items;
649
650 stack_size = g_Game.ConfigGetInt("cfgMagazines " + item_name + " count");
651
652 if (stack_size > 0)
653 {
654 int piles_count = Math.Floor(quantity/stack_size);
655 int rest = quantity - (piles_count*stack_size);
656
657 for (int i = 0; i < piles_count; ++i)
658 {
659 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
660 pile.ServerSetAmmoCount(stack_size);
661 items.Insert(pile);
662 }
663
664 if (rest > 0)
665 {
666 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
667 pile.ServerSetAmmoCount(rest);
668 items.Insert(pile);
669 }
670 }
671 return items;
672 }
673
674 //CreateMagazinePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
675 static array<Magazine> CreateMagazinePilesFromBulletDispersed(string bullet_type, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
676 {
678 Magazine pile;
679 string item_name;
680 if (!g_Game.ConfigGetText("cfgAmmo " + bullet_type + " spawnPileType", item_name))
681 return items;
682
683 items = CreateMagazinePilesDispersed(item_name,starPos,targetPos,radius,quantity,health,ignoreObjectCollison);
684 return items;
685 }
686
687 static int GetHealthLevelForAmmo(string class_name, float health)
688 {
689 float health_normalized = health / 100;
690 string config_path = CFG_WEAPONSPATH + " " + class_name + " DamageSystem" + " GlobalHealth" + " healthLabels";
692 g_Game.ConfigGetFloatArray(config_path, CachedObjectsArrays.ARRAY_FLOAT);
693 for(int i = 0; i < CachedObjectsArrays.ARRAY_FLOAT.Count(); ++i)
694 {
695 if( health_normalized >= CachedObjectsArrays.ARRAY_FLOAT.Get(i) )
696 {
697 return i;
698 }
699 }
700 return -1;
701 }
702
703 static float GetTypeMaxGlobalHealth(string class_name, string health_type = "Health")
704 {
705 float max_health;
706 string cfg_path;
707
708 if ( g_Game.ConfigIsExisting(CFG_VEHICLESPATH+" "+class_name) )
709 {
710 cfg_path = CFG_VEHICLESPATH;
711 }
712 else if ( g_Game.ConfigIsExisting(CFG_WEAPONSPATH+" "+class_name) )
713 {
714 cfg_path = CFG_WEAPONSPATH;
715 }
716 else if ( g_Game.ConfigIsExisting(CFG_MAGAZINESPATH+" "+class_name) )
717 {
718 cfg_path = CFG_MAGAZINESPATH;
719 }
720 cfg_path = cfg_path + " "+class_name+" DamageSystem GlobalHealth " + health_type + " hitpoints";
721 max_health = g_Game.ConfigGetFloat(cfg_path);
722
723 return max_health;
724 }
725
727 {
728 vector usti_hlavne_position = weapon.GetSelectionPositionMS( "usti hlavne" );
729 vector konec_hlavne_position = weapon.GetSelectionPositionMS( "konec hlavne" );
730 vector end_point = weapon.ModelToWorld(usti_hlavne_position);
731 vector begin_point = weapon.ModelToWorld(konec_hlavne_position);
732 vector contact_dir;
733 int contact_component;
734
735 vector aim_point = end_point - begin_point;
736 aim_point = aim_point.Normalized() * PROJECTED_CURSOR_DISTANCE;
737 aim_point = aim_point + end_point;
738
739 if (DayZPhysics.RaycastRV(begin_point, aim_point, position, contact_dir, contact_component, null, null, null, false, false, ObjIntersectFire))
740 return true;
741 return false;
742 }
743
744 static void GetHeadBonePos(notnull PlayerBase player, out vector pos)
745 {
746 // Get position of head for starting trace pos, otherwise use sane default
747 int headBoneIdx = player.GetBoneIndexByName("Head");
748 if ( headBoneIdx == -1 )
749 { pos = player.GetPosition()[1] + 1.6; }
750 else
751 { pos = player.GetBonePositionWS(headBoneIdx); }
752 }
753
759 static float GetPlayerHeadHeight(notnull PlayerBase player)
760 {
761 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_ERECT|DayZPlayerConstants.STANCEMASK_RAISEDERECT))
763 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_CROUCH|DayZPlayerConstants.STANCEMASK_RAISEDCROUCH))
765 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_PRONE|DayZPlayerConstants.STANCEMASK_RAISEDPRONE))
767
769 }
770
777 {
778 float headHeight = GetPlayerHeadHeight(player);
779 vector playerPosition = player.GetPosition();
780 vector headPosition = Vector(
781 playerPosition[0],
782 playerPosition[1] + headHeight,
783 playerPosition[2],
784 );
785
786 return headPosition;
787 }
788
789 static vector GetHeadingVector(notnull PlayerBase player)
790 {
791 vector dir = vector.Zero;
792 float headingAngle = GetHeadingAngle(player);
793 dir[0] = Math.Cos(headingAngle + Math.PI_HALF);
794 dir[2] = Math.Sin(headingAngle + Math.PI_HALF);
795
796 return dir.Normalized();
797 }
798
799 static float GetHeadingAngle(notnull DayZPlayerImplement player)
800 {
801 HumanInputController hic = player.GetInputController();
802 float headingAngle = hic.GetHeadingAngle();
803
804 return headingAngle;
805 }
806
807 static float GetEnergyMetabolicSpeed(int movement_speed)
808 {
809 float speed;
810 switch (movement_speed)
811 {
812 case DayZPlayerConstants.MOVEMENTIDX_WALK:
814 break;
815 case DayZPlayerConstants.MOVEMENTIDX_RUN:
817 break;
818 case DayZPlayerConstants.MOVEMENTIDX_SPRINT:
820 break;
821 default:
822 speed = 0;
823 break;
824 }
825
827 return speed;
828 }
829
830 static float GetWaterMetabolicSpeed(int movement_speed)
831 {
832 float speed;
833 switch (movement_speed)
834 {
835 case DayZPlayerConstants.MOVEMENTIDX_WALK:
837 break;
838 case DayZPlayerConstants.MOVEMENTIDX_RUN:
840 break;
841 case DayZPlayerConstants.MOVEMENTIDX_SPRINT:
843 break;
844 default:
845 speed = 0;
846 break;
847 }
848
850 return speed;
851 }
852
853 static string ObtainRestrainItemTargetClassname(notnull EntityAI entity)
854 {
855 return entity.ConfigGetString( "OnRestrainChange");
856 }
857
858 static void TransformRestrainItem(EntityAI current_item, EntityAI tool, PlayerBase player_source, PlayerBase player_target, bool destroy = false)
859 {
860 bool type;
861
862 if ( tool )
863 {
864 //is unrestrain and not struggle
865 type = tool.ConfigGetBool("RestrainUnlockType");
866 }
867 string new_item_name = current_item.ConfigGetString( "OnRestrainChange");
868
869 if ( new_item_name != "" )
870 {
871 if ( player_target )
872 {
873 if (!player_target.IsAlive() || destroy)
874 {
875 MiscGameplayFunctions.TurnItemIntoItemEx(player_source, new DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(current_item, new_item_name, player_target, type));
876 }
877 else
878 {
879 MiscGameplayFunctions.TurnItemIntoItemEx(player_target, new ReplaceAndDestroyLambdaEx(current_item, new_item_name, player_target, type));
880 }
881 }
882 else
883 {
884 MiscGameplayFunctions.TurnItemIntoItemEx(player_target, new ReplaceAndDestroyLambdaEx(current_item, new_item_name, player_target, type));
885 }
886 }
887 else
888 {
889 Error("current_item:" +current_item+ ", tool:" +tool +". No value for 'OnRestrainChange' config parameter");
890 }
891 }
892
893 static bool IsValueInRange(float value, float from, float to)
894 {
895 return (value >= from) && (value <= to);
896 }
897
899 static bool IsPlayerOrientedTowardPos(notnull DayZPlayerImplement player, vector target_pos, float cone_angle)
900 {
901 if (player)
902 {
903 vector player_dir = player.GetDirection();
904 vector to_target_dir = target_pos - player.GetPosition();
905
906 player_dir[1] = 0;
907 to_target_dir[1] = 0;
908
909 player_dir.Normalize();
910 to_target_dir.Normalize();
911
912 float cos_fi = vector.Dot(player_dir, to_target_dir);
913 vector cross = player_dir * to_target_dir;
914
915 int dir = Math.Acos(cos_fi) * Math.RAD2DEG;
916
917 if( cross[1] < 0 )
918 dir = -dir;
919
921 if( (dir <= cone_angle && dir >= -cone_angle) || Math.AbsFloat(dir) == 90 )
922 {
923 return true;
924 }
925 }
926
927 return false;
928 }
929
930 static string SanitizeString(string input)
931 {
932 int max_length = 512;
933 string output = input;
934
935 output = output.Substring(0,Math.Clamp(max_length,0,output.Length()));
936 return output;
937 }
938
942 static bool MemPointDirectionalCheck(PlayerBase player, EntityAI targetEnt, string memPointStartName, string memPointEndName, float toleranceAngle = Math.PI_HALF)
943 {
944 if (player && targetEnt && memPointEndName != "" && targetEnt.MemoryPointExists(memPointEndName) && memPointStartName != "" && targetEnt.MemoryPointExists(memPointStartName))
945 {
946 vector memPointEndPos = targetEnt.ModelToWorld(targetEnt.GetMemoryPointPos(memPointEndName));
947 vector memPointStartPos = targetEnt.ModelToWorld(targetEnt.GetMemoryPointPos(memPointStartName));
948 vector playerPosition = player.GetPosition();
949 vector playerHeadPos = MiscGameplayFunctions.GetPlayerHeadPosition(player);
950 vector playerDir = vector.Direction(playerHeadPos, memPointStartPos);
951 playerDir.Normalize();
952 vector memDir = vector.Direction(memPointStartPos, memPointEndPos);
953 memDir.Normalize();
954
955 /*
956 vector dbgPos = playerPosition;
957 Debug.DrawArrow(dbgPos, dbgPos + playerDir, 0.15, COLOR_YELLOW);
958 Debug.DrawArrow(memPointStartPos, memPointStartPos + memDir, 0.15, COLOR_GREEN);
959
960 Debug.DrawSphere(memPointStartPos, 0.05, COLOR_YELLOW, ShapeFlags.TRANSP|ShapeFlags.NOOUTLINE);
961 Debug.DrawSphere(dbgPos, 0.05, COLOR_RED, ShapeFlags.TRANSP|ShapeFlags.NOOUTLINE);
962 */
963
964 return GenericDirectionalCheck(playerDir, memDir, toleranceAngle);
965 }
966
967 return true;
968 }
969
971 static bool GenericDirectionalCheck(vector dir1, vector dir2, float toleranceAngle)
972 {
973 float angleRad = Math.Acos(dir1 * dir2);
974
975 //Print(angleRad);
976 //Print("result: " + (angleRad > toleranceAngle));
977
978 return angleRad > toleranceAngle;
979 }
980
981 static bool ComplexBuildCollideCheckClient( PlayerBase player, ActionTarget target, ItemBase item, int constraction_index )
982 {
983 EntityAI ent;
984 if (Class.CastTo(ent,target.GetObject()) && ent.CanUseConstruction())
985 {
986 ConstructionBase construction = ConstructionBase.Cast(ent.GetConstructionBasic());
987 ConstructionActionData constructionActionData = player.GetConstructionActionData();
988 if (construction && BuildCondition(player, target, item, false, constraction_index))
989 {
990 string partName;
991 if (item)
992 {
993 partName = constructionActionData.GetBuildPartAtIndex(constraction_index).GetPartName();
994 }
995
996 BaseBuildingBase baseBuilding;
997 if (Class.CastTo(baseBuilding,ent))
998 {
999 bool boo;
1000 if (baseBuilding.PerformRoofCheckForBase(partName,player,boo) && boo)
1001 return false;
1002 }
1003
1004 if (player.IsPlacingLocal() || player.IsPlacingServer())
1005 return false;
1006
1007 CollisionCheckData checkData = new CollisionCheckData;
1008 checkData.m_PartName = partName;
1009
1010 return !construction.IsCollidingEx(checkData);
1011 }
1012 }
1013 return false;
1014 }
1015
1016 static bool BuildCondition( PlayerBase player, ActionTarget target, ItemBase item, bool camera_check, int constraction_index )
1017 {
1018 EntityAI ent = EntityAI.Cast(target.GetObject());
1019 if (ent && ent.CanUseConstruction())
1020 {
1021 ConstructionActionData constructionActionData = player.GetConstructionActionData();
1022 constructionActionData.SetTarget(ent);
1023
1024 ConstructionPart part;
1025 if (item)
1026 {
1027 part = constructionActionData.GetBuildPartAtIndex(constraction_index);
1028 }
1029 else
1030 {
1031 part = constructionActionData.GetBuildPartHandsGenericAtIndex(constraction_index);
1032 }
1033
1034 if (part)
1035 {
1036 //camera and position checks
1037
1038 BaseBuildingBase baseBuilding;
1039 if (Class.CastTo(baseBuilding,ent) && baseBuilding.MustBeBuiltFromOutside() && baseBuilding.IsPlayerInsideEx(player, part.GetMainPartName()))
1040 return false;
1041
1042 //Camera check (client-only)
1043 if (camera_check && !GetGame().IsDedicatedServer())
1044 {
1045 if (ent.IsFacingCamera(part.GetMainPartName()))
1046 return false;
1047 }
1048
1049 return !player.GetInputController().CameraIsFreeLook();
1050 }
1051 }
1052
1053 return false;
1054 }
1055
1056 static void IsUnderRoofFromToCalculation(EntityAI entity, out vector from, out vector to, float height = GameConstants.ROOF_CHECK_RAYCAST_DIST)
1057 {
1058 vector minMax[2];
1059 entity.GetCollisionBox(minMax);
1060
1061 vector size = Vector(0,0,0);
1062 //size[1] = minMax[1][1] - minMax[0][1];
1063 float from_override = entity.HeightStartCheckOverride();
1064 if (from_override > 0.0)
1065 {
1066 size[1] = from_override;
1067 }
1068 else
1069 {
1070 size[1] = minMax[1][1] - minMax[0][1];
1071 }
1072
1073 from = entity.GetPosition() + size;
1074 if ( entity.HeightCheckOverride() > 0 )
1075 {
1076 to = entity.GetPosition() + Vector(0, entity.HeightCheckOverride(), 0);
1077 }
1078 else
1079 {
1080 vector ceiling = "0 0 0";
1081 ceiling[1] = height;
1082 to = from + ceiling; //+size ??? offset to cast same distance
1083 }
1084 }
1085
1086 static bool IsUnderRoof(EntityAI entity, float height = GameConstants.ROOF_CHECK_RAYCAST_DIST)
1087 {
1088 return IsUnderRoofEx(entity, height, ObjIntersectIFire);
1089 }
1090
1091 static bool IsUnderRoofEx(EntityAI entity, float height = GameConstants.ROOF_CHECK_RAYCAST_DIST, int geometry = ObjIntersectView)
1092 {
1093 vector from;
1094 vector to;
1095
1096 IsUnderRoofFromToCalculation(entity, from, to, height);
1097
1098 vector contact_pos;
1099 vector contact_dir;
1100 int contact_component;
1101
1102 return DayZPhysics.RaycastRV(from, to, contact_pos, contact_dir, contact_component, NULL, NULL, entity, false, false, geometry,0.25);
1103 }
1104
1105 static bool IsUnder(EntityAI entity, array<typename> excludedTypes, out Object hitObj, float height = GameConstants.ROOF_CHECK_RAYCAST_DIST, int geometry = ObjIntersectIFire)
1106 {
1107 vector from;
1108 vector to;
1109
1110 IsUnderRoofFromToCalculation(entity, from, to, height);
1111
1112 vector contactPos;
1113 vector contactDir;
1114 int contactComponent;
1115 set<Object> objects = new set<Object>;
1116
1117 if (DayZPhysics.RaycastRV(from, to, contactPos, contactDir, contactComponent, objects, NULL, entity, false, false, geometry, 0.25))
1118 {
1119 for (int i = 0; i < objects.Count(); ++i)
1120 {
1121 Object obj = objects.Get(i);
1122 if (!obj)
1123 continue;
1124
1125 if (excludedTypes && excludedTypes.Count())
1126 {
1127 foreach (typename excludedType: excludedTypes)
1128 {
1129 if (obj.IsInherited(excludedType))
1130 return false;
1131 }
1132 }
1133
1134 hitObj = obj;
1135 return true;
1136 }
1137 }
1138
1139 return false;
1140 }
1141
1142 // cooking equipment effects (get position for steam particle)
1144 {
1145 vector particle_pos;
1146 float steam_offset = 0;
1147
1148 if ( parent )
1149 {
1150 particle_pos = parent.GetPosition();
1151
1152 if ( parent.IsInherited( PortableGasStove ) )
1153 {
1154 steam_offset = 0.2;
1155 }
1156 else if ( parent.IsInherited( FireplaceBase ) )
1157 {
1158 FireplaceBase fireplace = FireplaceBase.Cast( parent );
1159
1160 if ( fireplace.IsBaseFireplace() )
1161 {
1162 steam_offset = 0.8;
1163 }
1164 else if ( fireplace.IsBarrelWithHoles() )
1165 {
1166 steam_offset = 1.1;
1167 }
1168 else if ( fireplace.IsFireplaceIndoor() )
1169 {
1170 steam_offset = 0.45;
1171 }
1172 else if ( fireplace.IsIndoorOven() )
1173 {
1174 steam_offset = 0.9;
1175 }
1176 }
1177 }
1178
1179 particle_pos[1] = particle_pos[1] + steam_offset;
1180
1181 return particle_pos;
1182 }
1183
1184 static vector GetRandomizedPosition(vector targetPos, float radius)
1185 {
1186 int angle = Math.RandomIntInclusive(1,360);
1187 float usedRadius = Math.RandomFloat01() * radius;
1188 vector randomPos = Vector(targetPos[0] + (Math.Cos(angle) * usedRadius), targetPos[1], targetPos[2] + (Math.Sin(angle) * usedRadius));
1189
1190 return randomPos;
1191 }
1192
1193 static vector GetRandomizedPositionVerified(vector startPos, vector targetPos, float radius, Object ignore = null)
1194 {
1195 vector ret = GetRandomizedPosition(targetPos,radius);
1196 RaycastRVParams params = new RaycastRVParams(startPos,ret,ignore);
1197 params.type = ObjIntersectIFire;
1199 array<Object> excluded = new array<Object>;
1200 if (DayZPhysics.RaycastRVProxy(params,results,excluded))
1201 {
1202 ret = results[0].pos;
1203 ret[1] = targetPos[1];
1204 }
1205 return ret;
1206 }
1207
1208 static vector GetRandomizedPositionVerifiedPlayer(Man player, float distance, float radius, Object ignore)
1209 {
1210 vector playerPosition = player.GetPosition();
1211 vector playerHeadPos = MiscGameplayFunctions.GetPlayerHeadPosition(PlayerBase.Cast(player));
1212 vector targetPos = playerPosition + (player.GetDirection() * distance);
1213 return GetRandomizedPositionVerified(playerHeadPos, targetPos, radius, ignore);
1214 }
1215
1217 {
1218 if (!g_Game.IsServer())
1219 return;
1220 array<EntityAI> items = new array<EntityAI>;
1221 GameInventory ibInventory = ib.GetInventory();
1222 ibInventory.EnumerateInventory(InventoryTraversalType.LEVELORDER, items);
1223
1224 vector direction = ib.GetDirection();
1225 float dot = vector.Dot(direction, vector.Forward);
1226
1227 float angle = Math.Acos(dot);
1228 if (direction[0] < 0)
1229 angle = -angle;
1230
1231 float cos = Math.Cos(angle);
1232 float sin = Math.Sin(angle);
1233
1234 EntityAI item;
1235 int count = items.Count();
1236 for ( int i = 0; i < count; ++i )
1237 {
1238 item = items.Get(i);
1239 if ( item )
1240 ibInventory.DropEntityInBounds(InventoryMode.SERVER, ib, item, halfExtents, angle, cos, sin);
1241 }
1242 }
1243
1244 static void ThrowAllItemsInInventory(notnull EntityAI parent, int flags)
1245 {
1246 ThrowAllItemsInInventoryEx(parent, flags, -GetVelocity(parent));
1247 }
1248
1249 static void ThrowAllItemsInInventoryEx(notnull EntityAI parent, int flags, vector force)
1250 {
1251 vector position = parent.GetPosition();
1252 vector orientation = parent.GetOrientation();
1253 vector rotation_matrix[3];
1254 float direction[4];
1255 vector randomPos;
1256 vector minmax[2];
1257 parent.GetCollisionBox(minmax);
1258
1259 Math3D.YawPitchRollMatrix( orientation, rotation_matrix );
1260 Math3D.MatrixToQuat( rotation_matrix, direction );
1261
1262 //gather entities first
1264 int count, i;
1265 //atts
1266 GameInventory parentInventory = parent.GetInventory();
1267 if (parentInventory)
1268 {
1269 count = parentInventory.AttachmentCount();
1270 for (i = 0; i < count; ++i)
1271 {
1272 ents.Insert(parentInventory.GetAttachmentFromIndex(i));
1273 }
1274 }
1275
1276 //cargo
1277 CargoBase parentCargo = parentInventory.GetCargo();
1278 if (parentCargo)
1279 {
1280 count = parentCargo.GetItemCount();
1281 for (i = 0; i < count; ++i)
1282 {
1283 ents.Insert(parentCargo.GetItem(i));
1284 }
1285 }
1286
1287 //now throw them all
1288 foreach (EntityAI ent : ents)
1289 {
1290 randomPos = Vector(position[0] + Math.RandomFloat(minmax[0][0], minmax[1][0]),
1291 position[1] + Math.RandomFloat(minmax[0][1], minmax[1][1]),
1292 position[2] + Math.RandomFloat(minmax[0][2], minmax[1][2]));
1293 ThrowEntityFromInventory(ent, randomPos, direction, force, ThrowEntityFlags.NONE);
1294 }
1295 }
1296
1297 static void ThrowEntityFromInventory(notnull EntityAI entity, vector position, float direction[4], vector force, int flags)
1298 {
1299 InventoryMode invMode = InventoryMode.SERVER;
1300 if ( !g_Game.IsMultiplayer() )
1301 invMode = InventoryMode.LOCAL;
1302
1303 ItemBase entityIB;
1304 GameInventory entityInventory = entity.GetInventory();
1305 if (CastTo(entityIB, entity))
1306 {
1308 dst.SetGroundEx(entity, position, direction);
1309
1310 if ( (flags & ThrowEntityFlags.SPLIT) && entityIB.CanBeSplit() )
1311 {
1312 for (int l = 0; l < entityIB.GetQuantity(); ++l)
1313 {
1314 ItemBase new_item = ItemBase.Cast( GameInventory.LocationCreateEntity( dst, entityIB.GetType(), ECE_NONE, RF_DEFAULT ) );
1315
1316 if ( new_item )
1317 {
1318 MiscGameplayFunctions.TransferItemProperties(entityIB, new_item);
1319 entityIB.AddQuantity( -1 );
1320 new_item.SetQuantity( 1 );
1321 new_item.ThrowPhysically(null, force, false);
1322 }
1323 }
1324 }
1325 else
1326 {
1327 float stackable = entityIB.GetTargetQuantityMax();
1328 if ( !(stackable == 0 || stackable >= entityIB.GetQuantity()) )
1329 {
1330 while (entityIB.GetQuantity() > stackable)
1331 {
1333 position[1] = position[1] + 0.1;
1334 spltDst.SetGroundEx(entity, position, direction);
1335
1336 ItemBase splitItem = entityIB.SplitIntoStackMaxToInventoryLocationEx( spltDst );
1337 splitItem.ThrowPhysically(null, force, false);
1338 }
1339 }
1340
1342 entityInventory.GetCurrentInventoryLocation(src);
1343
1344 entityInventory.TakeToDst(invMode, src, dst);
1345 entityIB.ThrowPhysically(null, force, false);
1346 }
1347 }
1348 else
1349 {
1350 entityInventory.DropEntity(invMode, entity.GetHierarchyRoot(), entity);
1351 dBodyApplyImpulse(entity, force);
1352 }
1353 }
1354
1356 {
1357 float wetFactor;
1358 float healthFactor;
1359
1360 float heatIsolation = pItem.GetHeatIsolation();
1361 float itemHealthLabel = pItem.GetHealthLevel();
1362 float itemWetness = pItem.GetWet();
1363
1365 if ( itemWetness >= GameConstants.STATE_DRY && itemWetness < GameConstants.STATE_DAMP )
1366 {
1368 }
1369 else if ( itemWetness >= GameConstants.STATE_DAMP && itemWetness < GameConstants.STATE_WET )
1370 {
1372 }
1373 else if ( itemWetness >= GameConstants.STATE_WET && itemWetness < GameConstants.STATE_SOAKING_WET )
1374 {
1376 }
1377 else if ( itemWetness >= GameConstants.STATE_SOAKING_WET && itemWetness < GameConstants.STATE_DRENCHED )
1378 {
1380 }
1381 else if ( itemWetness >= GameConstants.STATE_DRENCHED )
1382 {
1384 }
1385
1387 switch (itemHealthLabel)
1388 {
1391 break;
1392
1395 break;
1396
1399 break;
1400
1403 break;
1404
1407 break;
1408 }
1409
1411 heatIsolation *= healthFactor;
1412 heatIsolation *= wetFactor;
1413
1414 return heatIsolation;
1415 }
1416
1417 static void FilterObstructingObjects(array<Object> potentiallyObstructingObjects, out array<Object> obstructingObjects)
1418 {
1419 if (!obstructingObjects)
1420 obstructingObjects = new array<Object>;
1421
1422 for ( int i = 0; i < potentiallyObstructingObjects.Count(); ++i )
1423 {
1424 Object obj = potentiallyObstructingObjects[i];
1425 if ( obj && ( obj.CanObstruct() || obj.CanProxyObstruct() ) )
1426 obstructingObjects.Insert(obj);
1427 }
1428 }
1429
1431 {
1432 return obj.IsTransport() || obj.CanUseConstruction();
1433 }
1434
1436 static void FilterObstructedObjectsByGrouping(vector origin, float range, float distanceDelta, array<Object> objects, array<Object> obstructingObjects, out array<Object> filteredObjects, bool doDistanceCheck = false, bool checkIfDistanceCanBeIgnored = false, float maxDist = 0)
1437 {
1438 array<Object> vicinityObjects= new array<Object>;
1439 vicinityObjects.Copy(objects);
1440
1441 int i = 0;
1442 int j = 0;
1443 int k = 0;
1444 int mCount = vicinityObjects.Count();
1445
1446 if (!filteredObjects)
1447 filteredObjects = new array<Object>();
1448
1449 // Remove objects that are too far from the player anyways
1450 if ( doDistanceCheck )
1451 {
1452 for ( i = vicinityObjects.Count() - 1; i >= 0; --i )
1453 {
1454 Object obj = vicinityObjects[i];
1455 if ( obj && !CanIgnoreDistanceCheck( obj ) && vector.DistanceSq(origin, obj.GetPosition()) > maxDist * maxDist )
1456 vicinityObjects.Remove(i);
1457 }
1458 }
1459
1460 // Sort obstructingObjects to have the furthest one first
1461 array<Object> sortedObstructingObjects = new array<Object>();
1462 array<float> distanceHelper = new array<float>();
1463 array<float> distanceHelperUnsorted = new array<float>();
1464 float distance, dist1, dist2;
1465
1466 for ( i = 0; i < obstructingObjects.Count(); ++i )
1467 {
1468 distance = vector.DistanceSq(obstructingObjects[i].GetWorldPosition(), origin);
1469 distanceHelper.Insert(distance);
1470 }
1471
1472 distanceHelperUnsorted.Copy(distanceHelper);
1473 distanceHelper.Sort();
1474
1475 for ( i = distanceHelper.Count() - 1; i >= 0; --i )
1476 sortedObstructingObjects.Insert(obstructingObjects[distanceHelperUnsorted.Find(distanceHelper[i])]);
1477
1479 array<ref array<Object>> objectGroups = new array<ref array<Object>>();
1480 array<Object> group;
1481
1482 float cos = Math.Cos(90);
1483 float sin = Math.Sin(90);
1484
1485 // Iterate through sorted obstructingObjects
1486 for ( i = 0; i < sortedObstructingObjects.Count(); ++i )
1487 {
1488 Object obstrObj = sortedObstructingObjects[i];
1489 vector worldPos = obstrObj.GetWorldPosition();
1490 vector min, max;
1491 vector minMax[2];
1492 if ( obstrObj.GetCollisionBox(minMax) )
1493 {
1494 min = minMax[0];
1495 max = minMax[1];
1496 max = max * (obstrObj.GetOrientation() * range);
1497
1498 vector center, dx, dy, dz, half;
1499 center = (min + max) * 0.5;
1500 dz = obstrObj.GetOrientation();
1501 dx = vector.RotateAroundZero(dz, vector.Up, cos, sin);
1502 dy = vector.RotateAroundZero(dz, vector.Aside, cos, sin);
1503 half = (max - min) * 0.5;
1504 half = Vector(Math.AbsFloat(half[0]), Math.AbsFloat(half[1]), Math.AbsFloat(half[2]));
1505
1506 group = new array<Object>();
1507
1508 // Group objects within the above box
1509 for ( j = vicinityObjects.Count() - 1; j >= 0; --j )
1510 {
1511 Object vicObj = vicinityObjects[j];
1512 if ( vicObj )
1513 {
1514 vector d = vicObj.GetWorldPosition() - worldPos + center;
1515 if ( Math.AbsFloat(vector.Dot(d, dx)) <= half[0] && Math.AbsFloat(vector.Dot(d, dy)) <= half[1] && Math.AbsFloat(vector.Dot(d, dz)) <= half[2] )
1516 {
1517 group.Insert(vicObj);
1518 vicinityObjects.Remove(j);
1519 }
1520 }
1521 }
1522
1523 if ( group.Count() > 0 )
1524 tempGroups.Insert(group);
1525 }
1526 }
1527
1528 // Go through the objects grouped by obstruction to split them by distance too
1529 for ( i = 0; i < tempGroups.Count(); ++i )
1530 SplitArrayIntoGroupsByDistance(tempGroups[i], objectGroups, distanceDelta);
1531
1532 // Split initial groups by distance
1533 SplitArrayIntoGroupsByDistance(vicinityObjects, objectGroups, distanceDelta);
1534
1535 // Raycast items in groups (previously sample item in group which is not enough, sadly)
1536 IsObjectObstructedCache cache = new IsObjectObstructedCache(origin, mCount);
1537 foreach (array<Object> objectGroup : objectGroups)
1538 {
1539 foreach (Object filteredObject : objectGroup)
1540 {
1541 if (!IsObjectObstructedEx(filteredObject, cache))
1542 filteredObjects.Insert(filteredObject);
1543 }
1544
1545 }
1546
1547 cache.ClearCache();
1548 }
1549
1550 static void SplitArrayIntoGroupsByDistance(array<Object> objects, array<ref array<Object>> objectGroups, float squaredDistanceDelta)
1551 {
1552 array<Object> group;
1553 for ( int i = 0; i < objects.Count(); )
1554 {
1555 Object obj1 = objects[i];
1556 if ( obj1 )
1557 {
1558 group = new array<Object>;
1559 group.Insert(obj1);
1560 for ( int j = objects.Count() - 1; j > i; --j )
1561 {
1562 Object obj2 = objects[j];
1563 if ( obj1 && obj2 )
1564 {
1565 vector start = obj1.GetWorldPosition();
1566 vector end = obj2.GetWorldPosition();
1567
1568 float distance = vector.DistanceSq(start, end);
1569 if ( distance < squaredDistanceDelta )
1570 {
1571 group.Insert(obj2);
1572 objects.Remove(j);
1573 }
1574 }
1575 }
1576 objectGroups.Insert(group);
1577 objects.Remove(i);
1578 continue;
1579 }
1580 ++i;
1581 }
1582 }
1583
1584 static bool IsObjectObstructed(Object object, bool doDistanceCheck = false, vector distanceCheckPos = "0 0 0", float maxDist = 0)
1585 {
1586 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
1587 vector rayStart = MiscGameplayFunctions.GetPlayerHeadPosition(player);
1588 IsObjectObstructedCache cache = new IsObjectObstructedCache(rayStart, 1);
1589
1590 return IsObjectObstructedEx(object, cache, doDistanceCheck, distanceCheckPos, maxDist);
1591 }
1592
1593 static bool IsObjectObstructedEx(Object object, IsObjectObstructedCache cache, bool doDistanceCheck = false, vector distanceCheckPos = "0 0 0", float maxDist = 0)
1594 {
1595 if (!object)
1596 return true;
1597
1598 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
1599 if (doDistanceCheck && vector.DistanceSq(player.GetPosition(), distanceCheckPos) > maxDist * maxDist)
1600 return true;
1601
1602 cache.ObjectCenterPos = object.GetCenter();
1603
1604 return IsObjectObstructedFilterEx(object, cache, player);
1605 }
1606
1608 {
1609 if (object.CanProxyObstruct())
1610 {
1611 RaycastRVParams rayInput = new RaycastRVParams(cache.RaycastStart, cache.ObjectCenterPos, player);
1612 DayZPhysics.RaycastRVProxy(rayInput, cache.HitProxyObjects);
1613 if (cache.HitProxyObjects)
1614 {
1615 if (cache.HitProxyObjects.Count() > 0)
1616 {
1617 if (cache.HitProxyObjects[0].hierLevel > 0)
1618 {
1619 // ignores attachments on player
1620 if (!cache.HitProxyObjects[0].parent.IsMan())
1621 {
1622 if (cache.HitProxyObjects[0].parent)
1623 {
1624 EntityAI proxyParent = EntityAI.Cast(cache.HitProxyObjects[0].parent);
1625 GameInventory proxyInventory = proxyParent.GetInventory();
1626 if (proxyInventory && proxyInventory.GetCargo())
1627 return true;
1628 }
1629 }
1630 }
1631 }
1632 }
1633 }
1634 return false;
1635 }
1636
1638 {
1639 for (int m = 0; m < cache.HitObjects.Count(); ++m)
1640 {
1641 Object hit_object = cache.HitObjects.Get(m);
1642
1643 if ( hit_object.CanObstruct() )
1644 return true;
1645
1646 //4.3. ignore item if items are big and heavy >= OBJECT_OBSTRUCTION_WEIGHT
1647 //EntityAI eai;
1648 //if ( Class.CastTo( eai, hit_object ) )
1649 //{
1650 // if ( eai.GetWeight() >= OBJECT_OBSTRUCTION_WEIGHT )
1651 // {
1652 // if ( eai != filtered_object && eai.GetHierarchyRoot() != filtered_object )
1653 // {
1654 // //Print("!!!!!obstacle vaha: " + hit_object);
1655 // is_obstructed = true;
1656 // }
1657 // }
1658 //}
1659 }
1660
1661 return false;
1662 }
1663
1665 static bool IsObjectObstructedFilterEx(Object object, IsObjectObstructedCache cache, PlayerBase player, int geometryTypeOverride = -1)
1666 {
1667 //first proxy geometries
1668 RaycastRVParams rayInput = new RaycastRVParams(cache.RaycastStart, cache.ObjectCenterPos, player);
1669 rayInput.flags = CollisionFlags.NEARESTCONTACT;
1670 if (geometryTypeOverride != -1)
1671 rayInput.type = geometryTypeOverride; //default 'ObjIntersectView'
1672 DayZPhysics.RaycastRVProxy(rayInput, cache.HitProxyObjects);
1673 int count;
1674 int i;
1675
1676 if (cache.HitProxyObjects)
1677 {
1678 count = cache.HitProxyObjects.Count();
1679 Object parent;
1680 for (i = 0; i < count; ++i)
1681 {
1682 if (cache.HitProxyObjects[i].hierLevel > 0) //parent has to exist, skipping nullcheck
1683 {
1684 parent = cache.HitProxyObjects[i].parent;
1685 if (parent && !parent.IsMan() && parent.CanProxyObstruct())
1686 {
1687 if (parent != object || (parent == object && object.CanProxyObstructSelf()))
1688 return true;
1689 }
1690 }
1691 }
1692 }
1693
1694 //second, regular raycast
1695 int geometry = ObjIntersectFire; //default for the RV raycast
1696 if (geometryTypeOverride != -1)
1697 geometry = geometryTypeOverride;
1698 DayZPhysics.RaycastRV(cache.RaycastStart, cache.ObjectCenterPos, cache.ObjectContactPos, cache.ObjectContactDir, cache.ContactComponent, cache.HitObjects, object, g_Game.GetPlayer(), false, false, geometry, 0.0, CollisionFlags.ALLOBJECTS);
1699 count = cache.HitObjects.Count();
1700 for (i = 0; i < count; ++i)
1701 {
1702 if (cache.HitObjects[i].CanObstruct())
1703 return true;
1704 }
1705
1706 return false;
1707 }
1708
1709 //Inflict damage to item based on environmental temperature and surface type
1710 static void DealEvinronmentAdjustedDmg(ItemBase item, PlayerBase player, float baseDamage)
1711 {
1712 string surfaceType;
1713 int liquidType;
1714 float adjustedDamage;
1715
1716 g_Game.SurfaceUnderObject(player, surfaceType, liquidType);
1717 float modifierSurface = Surface.GetParamFloat(surfaceType, "toolDamage"); // toolDamage
1718 if (modifierSurface == 0)
1719 modifierSurface = 1;
1720
1721 if (player.GetInColdArea())
1722 adjustedDamage = baseDamage * (modifierSurface + g_Game.GetMission().GetWorldData().GetColdAreaToolDamageModifier());
1723 else
1724 adjustedDamage = baseDamage * modifierSurface;
1725
1726 DealAbsoluteDmg(item, adjustedDamage);
1727 }
1728
1729 //Inflict absolute damage to item (used on tools when completing actions)
1730 static void DealAbsoluteDmg(ItemBase item, float dmg)
1731 {
1732 item.DecreaseHealth(dmg, false);
1733 }
1734
1735 //Function used to normailze values, enter the used value and the max value (max will become 1)
1736 static float Normalize(int val, int maxVal)
1737 {
1738 if (maxVal == 0)
1739 {
1740 Debug.LogError("Division by 0 is not allowed");
1741 return 0;
1742 }
1743
1744 return val / maxVal;
1745 }
1746
1747 static float Bobbing(float period, float amplitude, float elapsedTime)
1748 {
1749 //Prevent division by 0
1750 if ( period == 0 )
1751 period = 1;
1752
1753 elapsedTime /= period;
1754
1755 float cycle;
1756 cycle += elapsedTime;
1757 cycle = FModulus(cycle, 360);
1758 cycle = Math.Sin(cycle) * amplitude;
1759
1760 return cycle;
1761 }
1762
1763 // DEPRECATED, use Math.ModFloat directly instead
1764 static float FModulus(float x, float y)
1765 {
1766 return Math.ModFloat(x, y);
1767 }
1768
1769 static void RemoveSplint( PlayerBase player )
1770 {
1771 EntityAI entity = player.GetInventory().CreateInInventory("Splint");
1772 if (!entity)
1773 entity = player.SpawnEntityOnGroundOnCursorDir("Splint", 0.5);
1774
1775 EntityAI attachment;
1776 ItemBase new_item = ItemBase.Cast(entity);
1777 Class.CastTo(attachment, player.GetItemOnSlot("Splint_Right"));
1778 if ( attachment && attachment.GetType() == "Splint_Applied" )
1779 {
1780 if (new_item)
1781 {
1782 MiscGameplayFunctions.TransferItemProperties(attachment,new_item);
1783
1784 if (g_Game.IsServer())
1785 {
1786 //Lower health level of splint after use
1787 if (new_item.GetHealthLevel() < 4)
1788 {
1789 int newDmgLevel = new_item.GetHealthLevel() + 1;
1790
1791 float max = new_item.GetMaxHealth("","");
1792
1793 switch ( newDmgLevel )
1794 {
1796 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_BADLY_DAMAGED_VALUE );
1797 break;
1798
1800 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_DAMAGED_VALUE );
1801 break;
1802
1804 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_WORN_VALUE );
1805 break;
1806
1808 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_RUINED_VALUE );
1809 break;
1810
1811 default:
1812 break;
1813 }
1814 }
1815 }
1816 }
1817
1818 attachment.Delete();
1819 }
1820 }
1821
1823 static void TeleportCheck(notnull PlayerBase player, notnull array<ref array<float>> safe_positions)
1824 {
1825 if( player.GetSimulationTimeStamp() < 20 && !player.IsPersistentFlag(PersistentFlag.AREA_PRESENCE) )
1826 {
1827 //simulation time is bellow a threshold, which means the player has recently connected,
1828 //the player does not have the AREA_PRESENCE flag set, which means they were not inside the area when they disconnected,
1829 //that means they just spawned into a contaminated area, lets move them somewhere safe
1830 vector player_pos = player.GetPosition();
1831 vector closest_safe_pos = MiscGameplayFunctions.GetClosestSafePos(player_pos, safe_positions);
1832
1833 if (player_pos!=closest_safe_pos)
1834 {
1835 closest_safe_pos[1] = g_Game.SurfaceY(closest_safe_pos[0], closest_safe_pos[2]);
1836
1837 player.SetPosition( closest_safe_pos );//...so lets teleport them somewhere safe
1838 //DeveloperTeleport.SetPlayerPosition(player, closest_safe_pos);
1839 g_Game.RPCSingleParam(player, ERPCs.RPC_WARNING_TELEPORT, null, true, player.GetIdentity());
1840
1841 PluginAdminLog adminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
1842 if (adminLog)
1843 adminLog.PlayerTeleportedLog(player,player_pos,closest_safe_pos,"Unwillingly spawning in contaminated area.");
1844 }
1845
1846 player.SetPersistentFlag(PersistentFlag.AREA_PRESENCE, false);
1847 }
1848 }
1849
1850 static vector GetClosestSafePos(vector to_pos, notnull array<ref array<float>> positions)
1851 {
1852 vector closest_pos = to_pos;
1853 float smallest_dist = float.MAX;
1854 foreach( array<float> pos:positions)
1855 {
1856 vector vpos = "0 0 0";
1857 vpos[0] = pos[0];
1858 vpos[2] = pos[1];
1859
1860 to_pos[1] = 0;
1861 float dist = vector.DistanceSq(to_pos, vpos);//2d dist sq
1862 if ( dist < smallest_dist)
1863 {
1864 smallest_dist = dist;
1865 closest_pos = vpos;
1866 }
1867 }
1868 return closest_pos;
1869 }
1870
1872 static bool TeleportPlayerToSafeLocation3D(notnull PlayerBase player, vector safePos)
1873 {
1874 vector playerPos = player.GetPosition();
1875 if (playerPos != safePos)
1876 {
1877 player.SetPosition(safePos);
1878 g_Game.RPCSingleParam(player, ERPCs.RPC_WARNING_TELEPORT, null, true, player.GetIdentity());
1879
1880 return true;
1881 }
1882
1883 return false;
1884 }
1885
1886 static void GenerateAINoiseAtPositionEx(notnull Object source, float lifeTime, NoiseParams noiseParams)
1887 {
1888 if (g_Game.IsServer())
1889 {
1890 NoiseSystem noise = g_Game.GetNoiseSystem();
1891 if (noise)
1892 {
1893 noise.AddNoiseTarget(source.GetPosition(), lifeTime, noiseParams);
1894 }
1895 }
1896 }
1897
1898 static float GetMinValue(array<float> pArray)
1899 {
1900 float minValue = 0.0;
1901 for (int i = 0; i < pArray.Count(); ++i)
1902 {
1903 if (minValue == 0 || pArray.Get(i) < minValue)
1904 {
1905 minValue = pArray.Get(i);
1906 }
1907 }
1908
1909 return minValue;
1910 }
1911
1912 static float GetMaxValue(array<float> pArray)
1913 {
1914 float maxValue = 0.0;
1915 for (int i = 0; i < pArray.Count(); ++i)
1916 {
1917 if (maxValue == 0 || pArray.Get(i) > maxValue)
1918 {
1919 maxValue = pArray.Get(i);
1920 }
1921 }
1922
1923 return maxValue;
1924 }
1925
1926 static string GetItemDisplayName(string type)
1927 {
1928 return g_Game.ConfigGetTextOut("CfgVehicles " + type + " displayName");
1929 }
1930
1931 static bool IsComponentInSelection(array<Selection> pSelection, string pCompName)
1932 {
1933 if (pSelection.Count() == 0 || pCompName.Length() == 0)
1934 {
1935 return false;
1936 }
1937
1938 for (int i = 0; i < pSelection.Count(); ++i)
1939 {
1940 pCompName.ToLower();
1941 if (pSelection[i] && pSelection[i].GetName() == pCompName)
1942 {
1943 return true;
1944 }
1945 }
1946
1947 return false;
1948 }
1949
1950 static int GetComponentIndex(array<Selection> pSelection, string pCompName)
1951 {
1952 if (!MiscGameplayFunctions.IsComponentInSelection(pSelection, pCompName))
1953 {
1954 return INDEX_NOT_FOUND;
1955 }
1956
1957 for (int i = 0; i < pSelection.Count(); ++i)
1958 {
1959 pCompName.ToLower();
1960 if (pSelection[i] && pSelection[i].GetName() == pCompName)
1961 {
1962 return i;
1963 }
1964 }
1965
1966 return INDEX_NOT_FOUND;
1967 }
1968
1969 static void RemoveAllAttachedChildrenByTypename(notnull EntityAI parent, array<typename> listOfTypenames)
1970 {
1971 if (listOfTypenames.Count() > 0)
1972 {
1973 Object child = Object.Cast(parent.GetChildren());
1974 while (child)
1975 {
1976 Object childToRemove = child;
1977 child = Object.Cast(child.GetSibling());
1978
1979 if (childToRemove.IsAnyInherited(listOfTypenames))
1980 {
1981 vector pos = parent.GetPosition();
1982 parent.RemoveChild(childToRemove, false);
1983
1984 vector m4[4];
1986 m4[3] = pos;
1987 childToRemove.SetTransform(m4);
1988 childToRemove.PlaceOnSurface();
1989 }
1990 }
1991 }
1992 }
1993
1994 static void DeleteAttachedChildrenByTypename(notnull EntityAI parent, array<typename> listOfTypenames)
1995 {
1996 if (listOfTypenames.Count() > 0)
1997 {
1998 Object child = Object.Cast(parent.GetChildren());
1999 while (child)
2000 {
2001 Object childToRemove = child;
2002 child = Object.Cast(child.GetSibling());
2003
2004 if (childToRemove.IsAnyInherited(listOfTypenames))
2005 {
2006 parent.RemoveChild(childToRemove, false);
2007 childToRemove.Delete();
2008 }
2009 }
2010 }
2011 }
2012
2014 static void GetAttachedChildren(IEntity parent, array<IEntity> outputObjects)
2015 {
2016 IEntity child = parent.GetChildren();
2017 while (child)
2018 {
2019 outputObjects.Insert(child);
2020 child = child.GetSibling();
2021 }
2022 }
2023
2024 static void SoakItemInsideParentContainingLiquidAboveThreshold(notnull ItemBase item, notnull ItemBase parent, float liquidQuantityThresholdPercentage = 0.05)
2025 {
2026 if (g_Game.IsServer())
2027 {
2028 if (parent.GetLiquidType() != 0 && parent.GetQuantityNormalized() > liquidQuantityThresholdPercentage && !parent.GetIsFrozen())
2029 item.SetWetMax();
2030 }
2031 }
2032
2034 {
2035 float windMin;
2036 float windMax;
2037 g_Game.GetWeather().GetWindMagnitude().GetLimits(windMin, windMax);
2038 float snowfall = g_Game.GetWeather().GetSnowfall().GetActual();
2039 float value = snowfall + g_Game.GetWeather().GetWindMagnitude().GetActual() / windMax;
2040
2041 return value;
2042 }
2043
2044 static bool ComponentIdxContainsSelection(Object obj, int compIdx, string selName)
2045 {
2046 array<string> compNames = new array<string>;
2047 obj.GetActionComponentNameList(compIdx, compNames);
2048 foreach (string selection : compNames)
2049 {
2050 if (selection.Contains(selName))
2051 return true;
2052 }
2053
2054 return false;
2055 }
2056
2058 // deprecated - do not use
2060 [Obsolete("Obsolete collision checking method, use the other 'ComplexBuildCollideCheckClient'")]
2061 static bool ComplexBuildCollideCheckClient( PlayerBase player, ActionTarget target, ItemBase item, string partName = "" )
2062 {
2063 return true;
2064 }
2065
2066 [Obsolete("Obsolete collision checking method, use the other 'BuildCondition'")]
2067 static bool BuildCondition( PlayerBase player, ActionTarget target, ItemBase item, bool camera_check )
2068 {
2069 return true;
2070 }
2071
2072 [Obsolete("Use MiscGameplayFunctions.GenerateAINoiseAtPositionEx instead!")]
2073 static void GenerateAINoiseAtPosition(vector position, float lifeTime, NoiseParams noiseParams)
2074 {
2075 if (GetGame().IsServer())
2076 {
2077 NoiseSystem noise = GetGame().GetNoiseSystem();
2078 if (noise)
2079 {
2080 noise.AddNoiseTarget(position, lifeTime, noiseParams);
2081 }
2082 }
2083 }
2084}
2085
2087{
2088 // @NOTE m_Player == target player - i.e. restrained one
2089 void DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy = false)
2090 {
2092 vector mtx[4];
2093 if (old_item)
2094 old_item.GetTransform(mtx);
2095 else
2096 player.GetTransform(mtx);
2097 gnd.SetGround(NULL, mtx);
2098 OverrideNewLocation(gnd);
2099 }
2100
2101 protected override void RemoveOldItemFromLocation()
2102 {
2103 super.RemoveOldItemFromLocation();
2104 m_Player.GetHumanInventory().OnEntityInHandsDestroyed(m_OldLocation);
2105 }
2106}
2107
2108// This was created since IsObjectObstructed is often called multiple times in one frame
2109// And apparently it seems that keeping this data in one struct seems to be more efficient than creating the variables dozens of times per frame
2110class IsObjectObstructedCache // Pretending this is a struct
2111{
2112 // Outside data
2115
2116 // Inside data
2122 ref set<Object> HitObjects = new set<Object>;
2123
2124 void IsObjectObstructedCache(vector rayCastStart, int totalObjects)
2125 {
2126 RaycastStart = rayCastStart;
2127 TotalObjects = totalObjects;
2128 }
2129
2130 // Only inside data
2132 {
2133 ObjectCenterPos = "0 0 0";
2134 ObjectContactPos = "0 0 0";
2135 ObjectContactDir = "0 0 0";
2136 ContactComponent = -1;
2137 HitProxyObjects.Clear();
2138 HitObjects.Clear();
2139 }
2140}
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
class LogManager EntityAI
override void OnSuccess(EntityAI new_item)
Определения ActionRestrainTarget.c:221
void ActionTarget(Object object, Object parent, int componentIndex, vector cursorHitPos, float utility, string surfaceName="")
Определения ActionTargets.c:125
const int ECE_NONE
Определения CentralEconomy.c:7
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:38
const int ECE_UPDATEPATHGRAPH
Определения CentralEconomy.c:13
const int RF_DEFAULT
Определения CentralEconomy.c:66
const int ECE_CREATEPHYSICS
Определения CentralEconomy.c:17
void ConstructionBase(EntityAI parent)
Определения ConstructionBase.c:58
void CollisionCheckData()
Определения ConstructionBase.c:1923
DayZGame g_Game
Определения DayZGame.c:4074
proto native int GetComponentIndex()
Определения ActionTargets.c:159
vector position
Определения DustKickupEffects.c:20
vector orientation
Определения DustKickupEffects.c:21
ERPCs
Определения ERPCs.c:2
DayZPlayer m_Player
Определения Hand_Events.c:42
Empty
Определения Hand_States.c:14
Icon x
Icon y
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:3854
PlayerBase m_Player
Определения MiscGameplayFunctions.c:117
ref array< ref RaycastRVResult > HitProxyObjects
Определения MiscGameplayFunctions.c:2121
static bool CanIgnoreDistanceCheck(Object obj)
Определения MiscGameplayFunctions.c:1430
DestroyItemInCorpsesHandsAndCreateNewOnGndLambda RaycastStart
static void TransferEntityVariables(EntityAI source, EntityAI target, bool exclude_quantity=false)
Определения MiscGameplayFunctions.c:288
static vector TruncateVec(vector value, int decimals=2)
truncate float to specified precision
Определения MiscGameplayFunctions.c:227
static string ObtainRestrainItemTargetClassname(notnull EntityAI entity)
Определения MiscGameplayFunctions.c:853
TransferInventoryResult
Определения MiscGameplayFunctions.c:203
@ Ok
Определения MiscGameplayFunctions.c:204
@ DroppedSome
Определения MiscGameplayFunctions.c:204
static bool GenericDirectionalCheck(vector dir1, vector dir2, float toleranceAngle)
just compares the angle
Определения MiscGameplayFunctions.c:971
static void GetAttachedChildren(IEntity parent, array< IEntity > outputObjects)
Fills the provided array with all children entities in hierarchy of this entity.
Определения MiscGameplayFunctions.c:2014
static vector GetRandomizedPositionVerifiedPlayer(Man player, float distance, float radius, Object ignore)
Определения MiscGameplayFunctions.c:1208
static void TransferEntityHealth(EntityAI source, EntityAI target, array< string > healthTypes=null, bool transferZoneDamage=true)
Определения MiscGameplayFunctions.c:386
static void DealAbsoluteDmg(ItemBase item, float dmg)
Определения MiscGameplayFunctions.c:1730
SPLIT
Определения MiscGameplayFunctions.c:218
static void TransferItemVariables(ItemBase source, ItemBase target, bool exclude_quantity=false)
DEPRECATED.
Определения MiscGameplayFunctions.c:339
static float GetCombinedSnowfallWindValue()
Определения MiscGameplayFunctions.c:2033
static bool TeleportPlayerToSafeLocation3D(notnull PlayerBase player, vector safePos)
'stupider' teleport method, does not touch flag management. Applies Y from the position as well!
Определения MiscGameplayFunctions.c:1872
static float Bobbing(float period, float amplitude, float elapsedTime)
Определения MiscGameplayFunctions.c:1747
static bool MemPointDirectionalCheck(PlayerBase player, EntityAI targetEnt, string memPointStartName, string memPointEndName, float toleranceAngle=Math.PI_HALF)
Определения MiscGameplayFunctions.c:942
ThrowEntityFlags
Определения MiscGameplayFunctions.c:208
static bool IsPlayerOrientedTowardPos(notnull DayZPlayerImplement player, vector target_pos, float cone_angle)
Check if player direction(based on cone of defined angle) is oriented to target position.
Определения MiscGameplayFunctions.c:899
int TotalObjects
Определения MiscGameplayFunctions.c:2114
static void RemoveAllAttachedChildrenByTypename(notnull EntityAI parent, array< typename > listOfTypenames)
Определения MiscGameplayFunctions.c:1969
static void TurnItemIntoItemEx(notnull PlayerBase player, ReplaceItemWithNewLambdaBase lambda)
Определения MiscGameplayFunctions.c:459
static void DropAllItemsInInventoryInBounds(ItemBase ib, vector halfExtents)
Определения MiscGameplayFunctions.c:1216
static vector GetSteamPosition(EntityAI parent)
Определения MiscGameplayFunctions.c:1143
EntityAI m_NewItem
Определения MiscGameplayFunctions.c:166
static void GenerateAINoiseAtPosition(vector position, float lifeTime, NoiseParams noiseParams)
Определения MiscGameplayFunctions.c:2073
vector ObjectContactDir
Определения MiscGameplayFunctions.c:2119
static vector GetRandomizedPosition(vector targetPos, float radius)
Определения MiscGameplayFunctions.c:1184
static void DealEvinronmentAdjustedDmg(ItemBase item, PlayerBase player, float baseDamage)
Определения MiscGameplayFunctions.c:1710
vector ObjectContactPos
Определения MiscGameplayFunctions.c:2118
static array< Magazine > CreateMagazinePilesFromBulletDispersed(string bullet_type, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
Определения MiscGameplayFunctions.c:675
static array< ItemBase > CreateItemBasePilesEx(string itemName, vector groundPosition, float quantity, float health, bool floatySpawn=false, bool throwAfterSpawn=false)
Определения MiscGameplayFunctions.c:480
enum ThrowEntityFlags Truncate(float value, int decimals=2)
truncate float to specified precision
Определения MiscGameplayFunctions.c:216
vector ObjectCenterPos
Определения MiscGameplayFunctions.c:2117
static vector GetClosestSafePos(vector to_pos, notnull array< ref array< float > > positions)
Определения MiscGameplayFunctions.c:1850
static void FilterObstructedObjectsByGrouping(vector origin, float range, float distanceDelta, array< Object > objects, array< Object > obstructingObjects, out array< Object > filteredObjects, bool doDistanceCheck=false, bool checkIfDistanceCanBeIgnored=false, float maxDist=0)
group objects that are close to each other together
Определения MiscGameplayFunctions.c:1436
static int GetHealthLevelForAmmo(string class_name, float health)
Определения MiscGameplayFunctions.c:687
ref set< Object > HitObjects
Определения MiscGameplayFunctions.c:2122
void MoveEquipToExistingItemAndDestroyOldRootLambda(EntityAI old_item, string new_item_type, PlayerBase player, EntityAI new_item)
Определения MiscGameplayFunctions.c:168
static void TurnItemInHandsIntoItem(notnull ItemBase old_item, string new_item_type, notnull PlayerBase player)
Определения MiscGameplayFunctions.c:464
void IsObjectObstructedCache(vector rayCastStart, int totalObjects)
Определения MiscGameplayFunctions.c:2124
static float GetTypeMaxGlobalHealth(string class_name, string health_type="Health")
Определения MiscGameplayFunctions.c:703
static float Normalize(int val, int maxVal)
Определения MiscGameplayFunctions.c:1736
static string TruncateVecToS(vector value, int decimals=2, string delimiter=" ")
Определения MiscGameplayFunctions.c:236
static float GetPlayerHeadHeight(notnull PlayerBase player)
Returns approximated height(from terrain) of head in WS which takes the player's stance into account ...
Определения MiscGameplayFunctions.c:759
static string TruncateToS(float value, int decimals=2)
truncate float to specified precision, output as string
Определения MiscGameplayFunctions.c:222
static void GenerateAINoiseAtPositionEx(notnull Object source, float lifeTime, NoiseParams noiseParams)
Определения MiscGameplayFunctions.c:1886
static void DeleteAttachedChildrenByTypename(notnull EntityAI parent, array< typename > listOfTypenames)
Определения MiscGameplayFunctions.c:1994
static bool BuildCondition(PlayerBase player, ActionTarget target, ItemBase item, bool camera_check, int constraction_index)
Определения MiscGameplayFunctions.c:1016
static void TurnItemInHandsIntoItemEx(notnull PlayerBase player, ReplaceItemWithNewLambdaBase lambda)
Определения MiscGameplayFunctions.c:469
static TransferInventoryResult TransferInventory(EntityAI sourceItem, EntityAI targetItem, PlayerBase player)
Определения MiscGameplayFunctions.c:344
static string GetItemDisplayName(string type)
Определения MiscGameplayFunctions.c:1926
static void TransformRestrainItem(EntityAI current_item, EntityAI tool, PlayerBase player_source, PlayerBase player_target, bool destroy=false)
Определения MiscGameplayFunctions.c:858
static vector GetHeadingVector(notnull PlayerBase player)
Определения MiscGameplayFunctions.c:789
static array< Magazine > CreateMagazinePilesFromBullet(string bullet_type, vector ground_position, float quantity, float health)
Определения MiscGameplayFunctions.c:640
static bool IsValueInRange(float value, float from, float to)
Определения MiscGameplayFunctions.c:893
static string SanitizeString(string input)
Определения MiscGameplayFunctions.c:930
static bool IsComponentInSelection(array< Selection > pSelection, string pCompName)
Определения MiscGameplayFunctions.c:1931
static void GetHeadBonePos(notnull PlayerBase player, out vector pos)
Определения MiscGameplayFunctions.c:744
static bool GetProjectedCursorPos3d(out vector position, Weapon_Base weapon)
Определения MiscGameplayFunctions.c:726
static float GetEnergyMetabolicSpeed(int movement_speed)
Определения MiscGameplayFunctions.c:807
static bool IsObjectObstructedFilter(Object object, IsObjectObstructedCache cache, PlayerBase player)
Определения MiscGameplayFunctions.c:1637
static bool ComplexBuildCollideCheckClient(PlayerBase player, ActionTarget target, ItemBase item, int constraction_index)
Определения MiscGameplayFunctions.c:981
static void IsUnderRoofFromToCalculation(EntityAI entity, out vector from, out vector to, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST)
Определения MiscGameplayFunctions.c:1056
static bool IsUnderRoof(EntityAI entity, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST)
Определения MiscGameplayFunctions.c:1086
static vector GetPlayerHeadPosition(notnull PlayerBase player)
Returns approximated position of head in WS which takes the player's stance into account Preferred me...
Определения MiscGameplayFunctions.c:776
static bool ComponentIdxContainsSelection(Object obj, int compIdx, string selName)
Определения MiscGameplayFunctions.c:2044
static float GetHeadingAngle(notnull DayZPlayerImplement player)
Определения MiscGameplayFunctions.c:799
int ContactComponent
Определения MiscGameplayFunctions.c:2120
static bool IsObjectObstructed(Object object, bool doDistanceCheck=false, vector distanceCheckPos="0 0 0", float maxDist=0)
Определения MiscGameplayFunctions.c:1584
static void ThrowEntityFromInventory(notnull EntityAI entity, vector position, float direction[4], vector force, int flags)
Определения MiscGameplayFunctions.c:1297
static void RemoveSplint(PlayerBase player)
Определения MiscGameplayFunctions.c:1769
static array< ItemBase > CreateItemBasePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
creation method using raycast-dispersed positioning; ECE_TRACE not used as a result
Определения MiscGameplayFunctions.c:544
static bool IsObjectObstructedProxy(Object object, IsObjectObstructedCache cache, PlayerBase player)
Определения MiscGameplayFunctions.c:1607
static float GetWaterMetabolicSpeed(int movement_speed)
Определения MiscGameplayFunctions.c:830
static bool IsObjectObstructedFilterEx(Object object, IsObjectObstructedCache cache, PlayerBase player, int geometryTypeOverride=-1)
groups 'RaycastRVProxy' and 'RaycastRV' approaches into one method, allowes for comprehensive geometr...
Определения MiscGameplayFunctions.c:1665
static bool IsUnder(EntityAI entity, array< typename > excludedTypes, out Object hitObj, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST, int geometry=ObjIntersectIFire)
Определения MiscGameplayFunctions.c:1105
static void ThrowAllItemsInInventoryEx(notnull EntityAI parent, int flags, vector force)
Определения MiscGameplayFunctions.c:1249
static vector GetRandomizedPositionVerified(vector startPos, vector targetPos, float radius, Object ignore=null)
Определения MiscGameplayFunctions.c:1193
static void UnlimitedAmmoDebugCheck(Weapon_Base weapon)
Определения MiscGameplayFunctions.c:419
static string ValueToBar(float value, string bar="[----------]", string mark="x")
Produces ACII "progress bar" based on an 0..1 'value' input.
Определения MiscGameplayFunctions.c:247
static bool IsObjectObstructedEx(Object object, IsObjectObstructedCache cache, bool doDistanceCheck=false, vector distanceCheckPos="0 0 0", float maxDist=0)
Определения MiscGameplayFunctions.c:1593
static void SplitArrayIntoGroupsByDistance(array< Object > objects, array< ref array< Object > > objectGroups, float squaredDistanceDelta)
Определения MiscGameplayFunctions.c:1550
static string InsertAtPos(string base, string insert, int pos)
Insert 'insert' behind index 'pos' of the 'base' string.
Определения MiscGameplayFunctions.c:258
static void TransferItemProperties(EntityAI source, notnull EntityAI target, bool transfer_agents=true, bool transfer_variables=true, bool transfer_health=true, bool exclude_quantity=false)
will transform variables, agents and other local scripted properties as well as any relevant non-scri...
Определения MiscGameplayFunctions.c:269
static float GetCurrentItemHeatIsolation(ItemBase pItem)
Определения MiscGameplayFunctions.c:1355
static array< Magazine > CreateMagazinePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
creation method using raycast-dispersed positioning; ECE_TRACE not used as a result
Определения MiscGameplayFunctions.c:609
void ClearCache()
Определения MiscGameplayFunctions.c:2131
static float FModulus(float x, float y)
Определения MiscGameplayFunctions.c:1764
static array< Magazine > CreateMagazinePiles(string item_name, vector ground_position, float quantity, float health)
Определения MiscGameplayFunctions.c:581
static bool IsUnderRoofEx(EntityAI entity, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST, int geometry=ObjIntersectView)
Определения MiscGameplayFunctions.c:1091
static void TeleportCheck(notnull PlayerBase player, notnull array< ref array< float > > safe_positions)
checks if we should teleport the player to a safe location and if so, performs the teleportation
Определения MiscGameplayFunctions.c:1823
static void TurnItemIntoItem(notnull ItemBase old_item, string new_item_type, notnull PlayerBase player)
Определения MiscGameplayFunctions.c:454
static void SoakItemInsideParentContainingLiquidAboveThreshold(notnull ItemBase item, notnull ItemBase parent, float liquidQuantityThresholdPercentage=0.05)
Определения MiscGameplayFunctions.c:2024
static void ThrowAllItemsInInventory(notnull EntityAI parent, int flags)
Определения MiscGameplayFunctions.c:1244
static void FilterObstructingObjects(array< Object > potentiallyObstructingObjects, out array< Object > obstructingObjects)
Определения MiscGameplayFunctions.c:1417
static array< ItemBase > CreateItemBasePiles(string item_name, vector ground_position, float quantity, float health, bool floaty_spawn=false)
Spawns multiple piles of stackable ItemBase objects on ground (intended for generic use)
Определения MiscGameplayFunctions.c:475
class NoiseSystem NoiseParams()
Определения Noise.c:18
class OptionSelectorMultistate extends OptionSelector class_name
PersistentFlag
Определения PersistentFlag.c:6
DebugActionType
Определения PluginDiagMenu.c:7
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:326
float GetMinValue()
Определения StaminaHandler.c:154
float GetMaxValue()
Определения StaminaHandler.c:157
override bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения Watchtower.c:138
override bool MustBeBuiltFromOutside()
Определения ShelterSite.c:80
Определения Fence.c:2
static ref TFloatArray ARRAY_FLOAT
Определения UtilityClasses.c:50
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
represents base for cargo storage for entities
Определения Cargo.c:7
Super root of all classes in Enforce script.
Определения EnScript.c:11
void SwitchOn()
Energy manager: Switches ON the device so it starts doing its work if it has enough energy.
Определения ComponentEnergyManager.c:371
float GetEnergy()
Energy manager: Returns the amount of stored energy this device has.
Определения ComponentEnergyManager.c:1246
void SetEnergy(float new_energy)
Energy manager: Sets stored energy for this device. It ignores the min/max limit!
Определения ComponentEnergyManager.c:521
bool IsSwitchedOn()
Energy manager: Returns state of the switch. Whenever the device is working or not does not matter....
Определения ComponentEnergyManager.c:884
ConstructionPart GetBuildPartHandsGenericAtIndex(int idx)
Определения ConstructionActionData.c:364
void SetTarget(Object target)
Определения ConstructionActionData.c:111
ConstructionPart GetBuildPartAtIndex(int idx)
Определения ConstructionActionData.c:346
string GetPartName()
Определения ConstructionPart.c:198
string GetMainPartName()
Определения ConstructionPart.c:203
Instanced construction part data classes for dynamic data, statics now stored on EntityType level in ...
Определения ConstructionPart.c:4
static proto bool RaycastRV(vector begPos, vector endPos, out vector contactPos, out vector contactDir, out int contactComponent, set< Object > results=NULL, Object with=NULL, Object ignore=NULL, bool sorted=false, bool ground_only=false, int iType=ObjIntersectView, float radius=0.0, CollisionFlags flags=CollisionFlags.NEARESTCONTACT)
Raycasts world by given parameters.
static proto bool RaycastRVProxy(notnull RaycastRVParams in, out notnull array< ref RaycastRVResult > results, array< Object > excluded=null)
Определения DayZPhysics.c:124
Определения ManBase.c:2
static void LogError(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message as error message.
Определения 3_Game/DayZ/tools/Debug.c:318
Определения 3_Game/DayZ/tools/Debug.c:2
void DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy=false)
Определения MiscGameplayFunctions.c:2089
override void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
Определения MiscGameplayFunctions.c:124
void DropEquipAndDestroyRootLambda(EntityAI old_item, string new_item_type, PlayerBase player)
Определения MiscGameplayFunctions.c:119
override bool CanDecay()
Определения Edible_Base.c:734
void TransferFoodStage(notnull Edible_Base source)
Определения Edible_Base.c:619
Определения Edible_Base.c:2
override bool IsBaseFireplace()
Определения BarrelHoles_ColorBase.c:54
override bool IsIndoorOven()
Определения OvenIndoor.c:159
override bool IsBarrelWithHoles()
Определения BarrelHoles_ColorBase.c:133
proto native EntityAI GetAttachmentFromIndex(int index)
static proto native bool PrepareDropEntityPos(EntityAI owner, notnull EntityAI item, out vector mat[4], bool useValuesInMatrix=false, int conflictCheckDepth=-1)
Finds a transformation for the item to be dropped to If the initial transforation overlaps with anoth...
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
bool TakeToDst(InventoryMode mode, notnull InventoryLocation src, notnull InventoryLocation dst)
move src to dst
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
static proto native bool LocationCanAddEntity(notnull InventoryLocation inv_loc)
queries if the entity contained in inv_loc.m_item can be added to ground/attachment/cargo/hands/....
bool DropEntityInBounds(InventoryMode mode, EntityAI owner, notnull EntityAI item, vector halfExtents, float angle, float cosAngle, float sinAngle)
bool DropEntity(InventoryMode mode, EntityAI owner, notnull EntityAI item)
script counterpart to engine's class Inventory
proto native float GetHeadingAngle()
returns main heading angle (in radians) -PI .. PI (this is world Y angle player is actualy pointing t...
Определения human.c:18
Определения EnEntity.c:165
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
proto native void SetParent(notnull EntityAI parent)
proto native InventoryLocation Copy(notnull InventoryLocation rhs)
copies location data to another location
proto native void SetGroundEx(EntityAI e, vector pos, float dir[4])
sets current inventory location type to Ground with transformation mat
InventoryLocation.
Определения InventoryLocation.c:30
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
provides access to slot configuration
Определения InventorySlots.c:6
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfBricks.c:64
override bool CanBeSplit()
Определения Rag.c:34
Определения EnMath3D.c:28
Определения EnMath.c:7
this one is a also bit special: it moves all items to already existing item and destroys the ex-root ...
Определения MiscGameplayFunctions.c:116
proto void AddNoiseTarget(vector pos, float lifetime, NoiseParams noise_params, float external_strength_multiplier=1.0)
Will make a noise at that position which the AI will "see" for the duration of 'lifetime'.
Определения Noise.c:2
Определения ObjectTyped.c:2
Определения PlayerBaseClient.c:2
static const float HEAD_HEIGHT_CROUCH
Определения PlayerConstants.c:14
static const float METABOLIC_SPEED_WATER_BASAL
Определения PlayerConstants.c:82
static const float HEAD_HEIGHT_ERECT
[seconds]
Определения PlayerConstants.c:13
static const float METABOLIC_SPEED_WATER_WALK
Определения PlayerConstants.c:84
static const float METABOLIC_SPEED_ENERGY_JOG
Определения PlayerConstants.c:79
static const float HEAD_HEIGHT_PRONE
Определения PlayerConstants.c:15
static const float METABOLIC_SPEED_WATER_JOG
Определения PlayerConstants.c:85
static const float METABOLIC_SPEED_ENERGY_WALK
Определения PlayerConstants.c:78
static const float METABOLIC_SPEED_WATER_SPRINT
Определения PlayerConstants.c:86
static const float METABOLIC_SPEED_ENERGY_SPRINT
Определения PlayerConstants.c:80
static const float METABOLIC_SPEED_ENERGY_BASAL
Определения PlayerConstants.c:76
Определения PlayerConstants.c:2
int type
Определения DayZPhysics.c:73
CollisionFlags flags
Определения DayZPhysics.c:63
Определения DayZPhysics.c:50
void ReplaceAndDestroyLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy=false)
Определения ActionUnrestrainTarget.c:152
override void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
Определения MiscGameplayFunctions.c:23
override void VerifyItemTypeBySlotType()
if attaching from att.slot to att.slot, skips the change to "ground" version. Allows for correct prop...
Определения MiscGameplayFunctions.c:46
void TurnItemIntoItemLambda(EntityAI old_item, string new_item_type, PlayerBase player)
Определения MiscGameplayFunctions.c:9
float m_quantity_override
Определения MiscGameplayFunctions.c:7
bool m_TransferVariables
Определения MiscGameplayFunctions.c:4
void SetTransferParams(bool transfer_agents=true, bool transfer_variables=true, bool transfer_health=true, bool exclude_quantity=false, float quantity_override=-1)
Определения MiscGameplayFunctions.c:14
void ReplaceItemWithNewLambda(EntityAI old_item, string new_item_type, PlayerBase player)
Определения ReplaceItemWithNewLambda.c:9
override void OnSuccess(EntityAI new_item)
Определения MiscGameplayFunctions.c:81
PlayerBase m_Player
Определения ReplaceItemWithNewLambda.c:6
void ReplaceItemWithNewLambdaBase(EntityAI old_item, string new_item_type)
Определения ReplaceItemWithNewLambdaBase.c:13
void CreateNetworkObjectInfo(EntityAI new_item)
Step G. - create NetworkObjectInfo for new item.
Определения ReplaceItemWithNewLambdaBase.c:212
ref InventoryLocation m_NewLocation
Определения ReplaceItemWithNewLambdaBase.c:9
void CopyOldPropertiesToNew(notnull EntityAI old_item, EntityAI new_item)
Step E. copy properties from old object to the created one.
Определения ReplaceItemWithNewLambdaBase.c:193
void RemoveNetworkObjectInfo()
Step C. - remove network part of the object @NOTE this operation does not delete the object,...
Определения ReplaceItemWithNewLambdaBase.c:115
base class for transformation operations (creating one item from another)
Определения ReplaceItemWithNewLambdaBase.c:5
static float GetParamFloat(string surface_name, string param_name)
Определения Surface.c:8
Определения Surface.c:2
override void OnSuccess(EntityAI new_item)
Определения MiscGameplayFunctions.c:93
shorthand
Определения BoltActionRifle_Base.c:6
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
const float MAX
Определения EnConvert.c:112
const float LOWEST
Определения EnConvert.c:113
proto vector Normalized()
return normalized vector (keeps orginal vector untouched)
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
static const vector Aside
Определения EnConvert.c:121
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
Определения EnConvert.c:305
static const vector Forward
Определения EnConvert.c:122
static const vector Zero
Определения EnConvert.c:123
proto float Normalize()
Normalizes vector. Returns length.
static vector Direction(vector p1, vector p2)
Returns direction vector from point p1 to point p2.
Определения EnConvert.c:254
static vector RotateAroundZero(vector pos, vector axis, float cosAngle, float sinAngle)
Rotate a vector around 0,0,0.
Определения EnConvert.c:511
static const vector Up
Определения EnConvert.c:120
Определения EnConvert.c:119
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
const int INDEX_NOT_FOUND
Определения gameplay.c:13
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
DayZGame GetGame()
Определения gameplay.c:636
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
CollisionFlags
Определения EnDebug.c:141
const float PROJECTED_CURSOR_DISTANCE
Определения 3_Game/DayZ/constants.c:677
const float ROOF_CHECK_RAYCAST_DIST
Определения 3_Game/DayZ/constants.c:1072
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
array< int > TIntArray
Определения EnScript.c:733
class array< Class T > TStringArray
void Obsolete(string msg="")
Определения EnScript.c:371
proto native IEntity GetSibling()
Returns pointer to next child Entity on the same hierarchy.
proto native IEntity GetChildren()
Returns pointer to first child Entity in hierarchy.
const float ENVIRO_ISOLATION_WETFACTOR_SOAKED
Определения 3_Game/DayZ/constants.c:824
const float ENVIRO_ISOLATION_WETFACTOR_WET
Определения 3_Game/DayZ/constants.c:823
const float ENVIRO_ISOLATION_WETFACTOR_DAMP
Определения 3_Game/DayZ/constants.c:822
const float ENVIRO_ISOLATION_WETFACTOR_DRENCHED
Определения 3_Game/DayZ/constants.c:825
const float ENVIRO_ISOLATION_HEALTHFACTOR_RUINED
Определения 3_Game/DayZ/constants.c:831
const float ENVIRO_ISOLATION_HEALTHFACTOR_DAMAGED
Определения 3_Game/DayZ/constants.c:829
const float ENVIRO_ISOLATION_HEALTHFACTOR_WORN
Определения 3_Game/DayZ/constants.c:828
const float ENVIRO_ISOLATION_WETFACTOR_DRY
impact of item wetness to the heat isolation
Определения 3_Game/DayZ/constants.c:821
const float ENVIRO_ISOLATION_HEALTHFACTOR_PRISTINE
impact of item health (state) to the heat isolation
Определения 3_Game/DayZ/constants.c:827
const float ENVIRO_ISOLATION_HEALTHFACTOR_B_DAMAGED
Определения 3_Game/DayZ/constants.c:830
const float DAMAGE_BADLY_DAMAGED_VALUE
Определения 3_Game/DayZ/constants.c:924
const float DAMAGE_RUINED_VALUE
Определения 3_Game/DayZ/constants.c:925
const float DAMAGE_DAMAGED_VALUE
Определения 3_Game/DayZ/constants.c:923
const float DAMAGE_WORN_VALUE
Определения 3_Game/DayZ/constants.c:922
const int STATE_RUINED
Определения 3_Game/DayZ/constants.c:909
const int STATE_WORN
Определения 3_Game/DayZ/constants.c:912
const int STATE_DAMAGED
Определения 3_Game/DayZ/constants.c:911
const int STATE_BADLY_DAMAGED
Определения 3_Game/DayZ/constants.c:910
const int STATE_PRISTINE
Определения 3_Game/DayZ/constants.c:913
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:665
const float STATE_DRY
Определения 3_Game/DayZ/constants.c:937
const float STATE_DAMP
Определения 3_Game/DayZ/constants.c:936
const float STATE_SOAKING_WET
Определения 3_Game/DayZ/constants.c:934
const float STATE_DRENCHED
Определения 3_Game/DayZ/constants.c:933
const float STATE_WET
Определения 3_Game/DayZ/constants.c:935
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
static proto void MatrixToQuat(vector mat[3], out float d[4])
Converts rotation matrix to quaternion.
static proto void YawPitchRollMatrix(vector ang, out vector mat[3])
Creates rotation matrix from angles.
static void MatrixIdentity4(out vector mat[4])
Creates identity matrix.
Определения EnMath3D.c:256
static float RandomFloat01()
Returns a random float number between and min [inclusive] and max [inclusive].
Определения EnMath.c:126
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Floor(float f)
Returns floor of value.
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.
static const float PI_HALF
Определения EnMath.c:14
static proto float ModFloat(float x, float y)
Returns the floating-point remainder of x/y rounded towards zero.
static proto float Acos(float c)
Returns angle in radians from cosinus.
static proto float Cos(float angle)
Returns cosinus of angle in radians.
static proto float Round(float f)
Returns mathematical round of value.
static proto float RandomFloat(float min, float max)
Returns a random float number between and min[inclusive] and max[exclusive].
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 Sin(float angle)
Returns sinus of angle in radians.
static proto float Pow(float v, float power)
Return power of v ^ power.
static const float RAD2DEG
Определения EnMath.c:16
static proto float AbsFloat(float f)
Returns absolute value.
static int RandomIntInclusive(int min, int max)
Returns a random int number between and min [inclusive] and max [inclusive].
Определения EnMath.c:54
const string CFG_VEHICLESPATH
Определения 3_Game/DayZ/constants.c:228
const string CFG_WEAPONSPATH
Определения 3_Game/DayZ/constants.c:229
const string CFG_MAGAZINESPATH
Определения 3_Game/DayZ/constants.c:230
@ NONE
body is not in simulation, nor in collision world
Определения SimulationState.c:15
proto native vector GetVelocity(notnull IEntity ent)
Returns linear velocity.
proto void dBodyApplyImpulse(notnull IEntity body, vector impulse)
Applies impuls on a rigidbody (origin)
proto native int Length()
Returns length of string.
proto string Get(int index)
Gets n-th character from string.
static proto string ToString(void var, bool type=false, bool name=false, bool quotes=true)
Return string representation of variable.
proto string Substring(int start, int len)
Substring of 'str' from 'start' position 'len' number of characters.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
proto int ToLower()
Changes string to lowercase. Returns length.
proto native owned string GetName()
Test name getter. Strictly for UI porposes!
Определения SyncedValue.c:119