DayZ 1.29
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 array<ItemBase> item_piles;
478 float max_stack_size;
479 ItemBase pile;
480
481 item_piles = new array<ItemBase>;
482 max_stack_size = g_Game.ConfigGetInt("cfgVehicles " + item_name + " varStackMax");
483 if( max_stack_size < 1)
484 max_stack_size = g_Game.ConfigGetInt("cfgVehicles " + item_name + " varQuantityMax");
485 if( max_stack_size < 1)
486 max_stack_size = 1;
487
488 int full_piles_count = Math.Floor(quantity/max_stack_size);
489 int rest = quantity - (full_piles_count*max_stack_size);
490
491 for (int i = 0; i < full_piles_count; ++i)
492 {
493 if (floaty_spawn)
494 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
495 else
496 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
497 pile.SetQuantity(max_stack_size);
498 pile.SetHealth(health);
499 item_piles.Insert(pile);
500 }
501
502 if (rest > 0)
503 {
504 if (floaty_spawn)
505 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
506 else
507 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
508 pile.SetQuantity(rest);
509 pile.SetHealth(health);
510 item_piles.Insert(pile);
511 }
512 return item_piles;
513 }
514
516 static array<ItemBase> CreateItemBasePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
517 {
518 array<ItemBase> item_piles;
519 float max_stack_size;
520 ItemBase pile;
521
522 item_piles = new array<ItemBase>;
523 max_stack_size = g_Game.ConfigGetInt("cfgVehicles " + item_name + " varStackMax");
524 if( max_stack_size < 1)
525 max_stack_size = g_Game.ConfigGetInt("cfgVehicles " + item_name + " varQuantityMax");
526 if( max_stack_size < 1)
527 max_stack_size = 1;
528
529 int full_piles_count = Math.Floor(quantity/max_stack_size);
530 int rest = quantity - (full_piles_count*max_stack_size);
531 vector randomizedPos;
532
533 for (int i = 0; i < full_piles_count; ++i)
534 {
535 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
536 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_PLACE_ON_SURFACE));
537 pile.SetQuantity(max_stack_size);
538 pile.SetHealth(health);
539 item_piles.Insert(pile);
540 }
541
542 if (rest > 0)
543 {
544 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
545 pile = ItemBase.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_PLACE_ON_SURFACE));
546 pile.SetQuantity(rest);
547 pile.SetHealth(health);
548 item_piles.Insert(pile);
549 }
550 return item_piles;
551 }
552
553 static array<Magazine> CreateMagazinePiles(string item_name, vector ground_position, float quantity, float health )
554 {
555 array<Magazine> items;
556 float stack_size;
557 Magazine pile;
558
559 items = new array<Magazine>;
560 stack_size = g_Game.ConfigGetInt("cfgMagazines " + item_name + " count");
561
562 int piles_count = Math.Floor(quantity/stack_size);
563 int rest = quantity - (piles_count*stack_size);
564
565 for (int i = 0; i < piles_count; ++i)
566 {
567 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
568 pile.ServerSetAmmoCount(stack_size);
569 items.Insert(pile);
570 }
571 if (rest > 0)
572 {
573 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
574 pile.ServerSetAmmoCount(rest);
575 items.Insert(pile);
576 }
577 return items;
578 }
579
581 static array<Magazine> CreateMagazinePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
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 vector randomizedPos;
593
594 for (int i = 0; i < piles_count; ++i)
595 {
596 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
597 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
598 pile.ServerSetAmmoCount(stack_size);
599 items.Insert(pile);
600 }
601
602 if (rest > 0)
603 {
604 randomizedPos = MiscGameplayFunctions.GetRandomizedPositionVerified(starPos,targetPos,radius,ignoreObjectCollison);
605 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, randomizedPos, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
606 pile.ServerSetAmmoCount(rest);
607 items.Insert(pile);
608 }
609 return items;
610 }
611
612 static array<Magazine> CreateMagazinePilesFromBullet(string bullet_type, vector ground_position, float quantity, float health )
613 {
614 array<Magazine> items;
615 items = new array<Magazine>;
616 float stack_size;
617 Magazine pile;
618 string item_name;
619 if (!g_Game.ConfigGetText("cfgAmmo " + bullet_type + " spawnPileType", item_name))
620 return items;
621
622 stack_size = g_Game.ConfigGetInt("cfgMagazines " + item_name + " count");
623
624 if (stack_size > 0)
625 {
626 int piles_count = Math.Floor(quantity/stack_size);
627 int rest = quantity - (piles_count*stack_size);
628
629 for (int i = 0; i < piles_count; ++i)
630 {
631 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
632 pile.ServerSetAmmoCount(stack_size);
633 items.Insert(pile);
634 }
635
636 if (rest > 0)
637 {
638 pile = Magazine.Cast(g_Game.CreateObjectEx(item_name, ground_position, ECE_PLACE_ON_SURFACE));
639 pile.ServerSetAmmoCount(rest);
640 items.Insert(pile);
641 }
642 }
643 return items;
644 }
645
646 //CreateMagazinePilesDispersed(string item_name, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
647 static array<Magazine> CreateMagazinePilesFromBulletDispersed(string bullet_type, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
648 {
650 Magazine pile;
651 string item_name;
652 if (!g_Game.ConfigGetText("cfgAmmo " + bullet_type + " spawnPileType", item_name))
653 return items;
654
655 items = CreateMagazinePilesDispersed(item_name,starPos,targetPos,radius,quantity,health,ignoreObjectCollison);
656 return items;
657 }
658
659 static int GetHealthLevelForAmmo(string class_name, float health)
660 {
661 float health_normalized = health / 100;
662 string config_path = CFG_WEAPONSPATH + " " + class_name + " DamageSystem" + " GlobalHealth" + " healthLabels";
664 g_Game.ConfigGetFloatArray(config_path, CachedObjectsArrays.ARRAY_FLOAT);
665 for(int i = 0; i < CachedObjectsArrays.ARRAY_FLOAT.Count(); ++i)
666 {
667 if( health_normalized >= CachedObjectsArrays.ARRAY_FLOAT.Get(i) )
668 {
669 return i;
670 }
671 }
672 return -1;
673 }
674
675 static float GetTypeMaxGlobalHealth(string class_name, string health_type = "Health")
676 {
677 float max_health;
678 string cfg_path;
679
680 if ( g_Game.ConfigIsExisting(CFG_VEHICLESPATH+" "+class_name) )
681 {
682 cfg_path = CFG_VEHICLESPATH;
683 }
684 else if ( g_Game.ConfigIsExisting(CFG_WEAPONSPATH+" "+class_name) )
685 {
686 cfg_path = CFG_WEAPONSPATH;
687 }
688 else if ( g_Game.ConfigIsExisting(CFG_MAGAZINESPATH+" "+class_name) )
689 {
690 cfg_path = CFG_MAGAZINESPATH;
691 }
692 cfg_path = cfg_path + " "+class_name+" DamageSystem GlobalHealth " + health_type + " hitpoints";
693 max_health = g_Game.ConfigGetFloat(cfg_path);
694
695 return max_health;
696 }
697
698 static bool GetProjectedCursorPos3d (out vector position, Weapon_Base weapon)
699 {
700 vector usti_hlavne_position = weapon.GetSelectionPositionMS( "usti hlavne" );
701 vector konec_hlavne_position = weapon.GetSelectionPositionMS( "konec hlavne" );
702 vector end_point = weapon.ModelToWorld(usti_hlavne_position);
703 vector begin_point = weapon.ModelToWorld(konec_hlavne_position);
704 vector contact_dir;
705 int contact_component;
706
707 vector aim_point = end_point - begin_point;
708 aim_point = aim_point.Normalized() * PROJECTED_CURSOR_DISTANCE;
709 aim_point = aim_point + end_point;
710
711 if (DayZPhysics.RaycastRV(begin_point, aim_point, position, contact_dir, contact_component, null, null, null, false, false, ObjIntersectFire))
712 return true;
713 return false;
714 }
715
716 static void GetHeadBonePos(notnull PlayerBase player, out vector pos)
717 {
718 // Get position of head for starting trace pos, otherwise use sane default
719 int headBoneIdx = player.GetBoneIndexByName("Head");
720 if ( headBoneIdx == -1 )
721 { pos = player.GetPosition()[1] + 1.6; }
722 else
723 { pos = player.GetBonePositionWS(headBoneIdx); }
724 }
725
726 static vector GetHeadingVector(notnull PlayerBase player)
727 {
728 vector dir = vector.Zero;
729 float headingAngle = GetHeadingAngle(player);
730 dir[0] = Math.Cos(headingAngle + Math.PI_HALF);
731 dir[2] = Math.Sin(headingAngle + Math.PI_HALF);
732
733 return dir.Normalized();
734 }
735
736 static float GetHeadingAngle(notnull DayZPlayerImplement player)
737 {
738 HumanInputController hic = player.GetInputController();
739 float headingAngle = hic.GetHeadingAngle();
740
741 return headingAngle;
742 }
743
744 static float GetEnergyMetabolicSpeed(int movement_speed)
745 {
746 float speed;
747 switch (movement_speed)
748 {
749 case DayZPlayerConstants.MOVEMENTIDX_WALK:
751 break;
752 case DayZPlayerConstants.MOVEMENTIDX_RUN:
754 break;
755 case DayZPlayerConstants.MOVEMENTIDX_SPRINT:
757 break;
758 default:
759 speed = 0;
760 break;
761 }
762
764 return speed;
765 }
766
767 static float GetWaterMetabolicSpeed(int movement_speed)
768 {
769 float speed;
770 switch (movement_speed)
771 {
772 case DayZPlayerConstants.MOVEMENTIDX_WALK:
774 break;
775 case DayZPlayerConstants.MOVEMENTIDX_RUN:
777 break;
778 case DayZPlayerConstants.MOVEMENTIDX_SPRINT:
780 break;
781 default:
782 speed = 0;
783 break;
784 }
785
787 return speed;
788 }
789
790 static string ObtainRestrainItemTargetClassname(notnull EntityAI entity)
791 {
792 return entity.ConfigGetString( "OnRestrainChange");
793 }
794
795 static void TransformRestrainItem(EntityAI current_item, EntityAI tool, PlayerBase player_source, PlayerBase player_target, bool destroy = false)
796 {
797 bool type;
798
799 if ( tool )
800 {
801 //is unrestrain and not struggle
802 type = tool.ConfigGetBool("RestrainUnlockType");
803 }
804 string new_item_name = current_item.ConfigGetString( "OnRestrainChange");
805
806 if ( new_item_name != "" )
807 {
808 if ( player_target )
809 {
810 if (player_target.IsAlive())
811 MiscGameplayFunctions.TurnItemIntoItemEx(player_target, new ReplaceAndDestroyLambdaEx(current_item, new_item_name, player_target, type));
812 else
813 MiscGameplayFunctions.TurnItemIntoItemEx(player_source, new DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(current_item, new_item_name, player_target, type));
814 }
815 else
816 {
817 MiscGameplayFunctions.TurnItemIntoItemEx(player_target, new ReplaceAndDestroyLambdaEx(current_item, new_item_name, player_target, type));
818 }
819 }
820 else
821 {
822 Error("current_item:" +current_item+ ", tool:" +tool +". No value for 'OnRestrainChange' config parameter");
823 }
824 }
825
826 static bool IsValueInRange(float value, float from, float to)
827 {
828 return (value >= from) && (value <= to);
829 }
830
832 static bool IsPlayerOrientedTowardPos(notnull DayZPlayerImplement player, vector target_pos, float cone_angle)
833 {
834 if (player)
835 {
836 vector player_dir = player.GetDirection();
837 vector to_target_dir = target_pos - player.GetPosition();
838
839 player_dir[1] = 0;
840 to_target_dir[1] = 0;
841
842 player_dir.Normalize();
843 to_target_dir.Normalize();
844
845 float cos_fi = vector.Dot(player_dir, to_target_dir);
846 vector cross = player_dir * to_target_dir;
847
848 int dir = Math.Acos(cos_fi) * Math.RAD2DEG;
849
850 if( cross[1] < 0 )
851 dir = -dir;
852
854 if( (dir <= cone_angle && dir >= -cone_angle) || Math.AbsFloat(dir) == 90 )
855 {
856 return true;
857 }
858 }
859
860 return false;
861 }
862
863 static string SanitizeString(string input)
864 {
865 int max_length = 512;
866 string output = input;
867
868 output = output.Substring(0,Math.Clamp(max_length,0,output.Length()));
869 return output;
870 }
871
872 // deprecated - dont use
873 static bool ComplexBuildCollideCheckClient( PlayerBase player, ActionTarget target, ItemBase item, string partName = "" )
874 {
875 return true;
876 }
877
878 static bool ComplexBuildCollideCheckClient( PlayerBase player, ActionTarget target, ItemBase item, int constraction_index )
879 {
880 BaseBuildingBase base_building = BaseBuildingBase.Cast( target.GetObject() );
881 if (base_building)
882 {
883 Construction construction = base_building.GetConstruction();
884 if (construction && BuildCondition( player, target, item, false, constraction_index ))
885 {
886 ConstructionActionData construction_action_data = player.GetConstructionActionData();
887 string partName;
888 if ( item )
889 {
890 partName = construction_action_data.GetBuildPartAtIndex(constraction_index).GetPartName();
891 }
892 else
893 {
894 partName = construction_action_data.GetBuildPartNoToolAtIndex(constraction_index).GetPartName();
895 }
896 bool boo;
897 if (base_building.PerformRoofCheckForBase(partName,player,boo) && boo)
898 return false;
899 if ( player.IsPlacingLocal() || player.IsPlacingServer() )
900 return false;
901
902 /*float distance_root = vector.DistanceSq(target.GetCursorHitPos(), player.GetPosition());
903
904 if (!CfgGameplayHandler.GetDisableDistanceCheck() && distance_root < UAMaxDistances.BASEBUILDING_SHORT)
905 {
906 return false;
907 } */
908 return !construction.IsColliding( partName );
909 }
910 }
911 return false;
912 }
913
914 // deprecated - dont use
915 static bool BuildCondition( PlayerBase player, ActionTarget target, ItemBase item, bool camera_check )
916 {
917 return true;
918 }
919
920 static bool BuildCondition( PlayerBase player, ActionTarget target, ItemBase item, bool camera_check, int constraction_index )
921 {
922 Object targetObject = target.GetObject();
923 if ( targetObject && targetObject.CanUseConstruction() )
924 {
925 BaseBuildingBase base_building = BaseBuildingBase.Cast( targetObject );
926 ConstructionActionData construction_action_data = player.GetConstructionActionData();
927 construction_action_data.SetTarget( targetObject );
928
929 ConstructionPart constrution_part;
930 if ( item )
931 {
932 constrution_part = construction_action_data.GetBuildPartAtIndex(constraction_index);
933 }
934 else
935 {
936 constrution_part = construction_action_data.GetBuildPartNoToolAtIndex(constraction_index);
937 }
938
939 //Debug
940 /*
941 if ( constrution_part )
942 {
943 Construction construction = base_building.GetConstruction();
944 construction.IsColliding( constrution_part.GetPartName() );
945 }
946 */
947
948 if ( constrution_part )
949 {
950 //camera and position checks
951 bool position_check = ( base_building.MustBeBuiltFromOutside() && !base_building.IsPlayerInside(player, constrution_part.GetMainPartName()) ) || ( !base_building.MustBeBuiltFromOutside() && base_building.IsPlayerInside(player, constrution_part.GetMainPartName()) );
952 if ( position_check && !player.GetInputController().CameraIsFreeLook() )
953 {
954 //Camera check (client-only)
955 if ( camera_check )
956 {
957 if ( g_Game && ( !g_Game.IsDedicatedServer() ) )
958 {
959 return !base_building.IsFacingCamera( constrution_part.GetMainPartName() );
960 }
961 }
962
963 return true;
964 }
965 }
966 }
967
968 return false;
969 }
970
971 static void IsUnderRoofFromToCalculation(EntityAI entity, out vector from, out vector to, float height = GameConstants.ROOF_CHECK_RAYCAST_DIST)
972 {
973 vector minMax[2];
974 entity.GetCollisionBox(minMax);
975
976 vector size = Vector(0,0,0);
977 //size[1] = minMax[1][1] - minMax[0][1];
978 float from_override = entity.HeightStartCheckOverride();
979 if (from_override > 0.0)
980 {
981 size[1] = from_override;
982 }
983 else
984 {
985 size[1] = minMax[1][1] - minMax[0][1];
986 }
987
988 from = entity.GetPosition() + size;
989 if ( entity.HeightCheckOverride() > 0 )
990 {
991 to = entity.GetPosition() + Vector(0, entity.HeightCheckOverride(), 0);
992 }
993 else
994 {
995 vector ceiling = "0 0 0";
996 ceiling[1] = height;
997 to = from + ceiling; //+size ??? offset to cast same distance
998 }
999 }
1000
1001 static bool IsUnderRoof(EntityAI entity, float height = GameConstants.ROOF_CHECK_RAYCAST_DIST)
1002 {
1003 return IsUnderRoofEx(entity, height, ObjIntersectIFire);
1004 }
1005
1006 static bool IsUnderRoofEx(EntityAI entity, float height = GameConstants.ROOF_CHECK_RAYCAST_DIST, int geometry = ObjIntersectView)
1007 {
1008 vector from;
1009 vector to;
1010
1011 IsUnderRoofFromToCalculation(entity, from, to, height);
1012
1013 vector contact_pos;
1014 vector contact_dir;
1015 int contact_component;
1016
1017 return DayZPhysics.RaycastRV(from, to, contact_pos, contact_dir, contact_component, NULL, NULL, entity, false, false, geometry,0.25);
1018 }
1019
1020 // cooking equipment effects (get position for steam particle)
1022 {
1023 vector particle_pos;
1024 float steam_offset = 0;
1025
1026 if ( parent )
1027 {
1028 particle_pos = parent.GetPosition();
1029
1030 if ( parent.IsInherited( PortableGasStove ) )
1031 {
1032 steam_offset = 0.2;
1033 }
1034 else if ( parent.IsInherited( FireplaceBase ) )
1035 {
1036 FireplaceBase fireplace = FireplaceBase.Cast( parent );
1037
1038 if ( fireplace.IsBaseFireplace() )
1039 {
1040 steam_offset = 0.8;
1041 }
1042 else if ( fireplace.IsBarrelWithHoles() )
1043 {
1044 steam_offset = 1.1;
1045 }
1046 else if ( fireplace.IsFireplaceIndoor() )
1047 {
1048 steam_offset = 0.45;
1049 }
1050 else if ( fireplace.IsIndoorOven() )
1051 {
1052 steam_offset = 0.9;
1053 }
1054 }
1055 }
1056
1057 particle_pos[1] = particle_pos[1] + steam_offset;
1058
1059 return particle_pos;
1060 }
1061
1062 static vector GetRandomizedPosition(vector targetPos, float radius)
1063 {
1064 int angle = Math.RandomIntInclusive(1,360);
1065 float usedRadius = Math.RandomFloat01() * radius;
1066 vector randomPos = Vector(targetPos[0] + (Math.Cos(angle) * usedRadius), targetPos[1], targetPos[2] + (Math.Sin(angle) * usedRadius));
1067
1068 return randomPos;
1069 }
1070
1071 static vector GetRandomizedPositionVerified(vector startPos, vector targetPos, float radius, Object ignore = null)
1072 {
1073 vector ret = GetRandomizedPosition(targetPos,radius);
1074 RaycastRVParams params = new RaycastRVParams(startPos,ret,ignore);
1075 params.type = ObjIntersectIFire;
1077 array<Object> excluded = new array<Object>;
1078 if (DayZPhysics.RaycastRVProxy(params,results,excluded))
1079 {
1080 ret = results[0].pos;
1081 ret[1] = targetPos[1];
1082 }
1083 return ret;
1084 }
1085
1086 static vector GetRandomizedPositionVerifiedPlayer(Man player, float distance, float radius, Object ignore)
1087 {
1088 vector startPos;
1089 MiscGameplayFunctions.GetHeadBonePos(PlayerBase.Cast(player),startPos);
1090 vector targetPos = player.GetPosition() + (player.GetDirection() * distance);
1091 return GetRandomizedPositionVerified(startPos,targetPos,radius,ignore);
1092 }
1093
1095 {
1096 if (!g_Game.IsServer())
1097 return;
1098 array<EntityAI> items = new array<EntityAI>;
1099 GameInventory ibInventory = ib.GetInventory();
1100 ibInventory.EnumerateInventory(InventoryTraversalType.LEVELORDER, items);
1101
1102 vector direction = ib.GetDirection();
1103 float dot = vector.Dot(direction, vector.Forward);
1104
1105 float angle = Math.Acos(dot);
1106 if (direction[0] < 0)
1107 angle = -angle;
1108
1109 float cos = Math.Cos(angle);
1110 float sin = Math.Sin(angle);
1111
1112 EntityAI item;
1113 int count = items.Count();
1114 for ( int i = 0; i < count; ++i )
1115 {
1116 item = items.Get(i);
1117 if ( item )
1118 ibInventory.DropEntityInBounds(InventoryMode.SERVER, ib, item, halfExtents, angle, cos, sin);
1119 }
1120 }
1121
1122 static void ThrowAllItemsInInventory(notnull EntityAI parent, int flags)
1123 {
1124 vector position = parent.GetPosition();
1125 vector orientation = parent.GetOrientation();
1126 vector rotation_matrix[3];
1127 float direction[4];
1128 vector randomPos;
1129 vector minmax[2];
1130 parent.GetCollisionBox(minmax);
1131
1132 Math3D.YawPitchRollMatrix( orientation, rotation_matrix );
1133 Math3D.MatrixToQuat( rotation_matrix, direction );
1134
1135 //gather entities first
1137 int count, i;
1138 //atts
1139 GameInventory parentInventory = parent.GetInventory();
1140 count = parentInventory.AttachmentCount();
1141 for (i = 0; i < count; ++i)
1142 {
1143 ents.Insert(parentInventory.GetAttachmentFromIndex(i));
1144 }
1145
1146 //cargo
1147 CargoBase parentCargo = parentInventory.GetCargo();
1148 count = parentCargo.GetItemCount();
1149 for (i = 0; i < count; ++i)
1150 {
1151 ents.Insert(parentCargo.GetItem(i));
1152 }
1153
1154 //now throw them all
1155 foreach (EntityAI ent : ents)
1156 {
1157 randomPos = Vector(position[0] + Math.RandomFloat(minmax[0][0], minmax[1][0]),
1158 position[1] + Math.RandomFloat(minmax[0][1], minmax[1][1]),
1159 position[2] + Math.RandomFloat(minmax[0][2], minmax[1][2]));
1160 ThrowEntityFromInventory(ent, randomPos, direction, -GetVelocity(parent), ThrowEntityFlags.NONE);
1161 }
1162 }
1163
1164 static void ThrowEntityFromInventory(notnull EntityAI entity, vector position, float direction[4], vector force, int flags)
1165 {
1166 InventoryMode invMode = InventoryMode.SERVER;
1167 if ( !g_Game.IsMultiplayer() )
1168 invMode = InventoryMode.LOCAL;
1169
1170 ItemBase entityIB;
1171 GameInventory entityInventory = entity.GetInventory();
1172 if (CastTo(entityIB, entity))
1173 {
1175 dst.SetGroundEx(entity, position, direction);
1176
1177 if ( (flags & ThrowEntityFlags.SPLIT) && entityIB.CanBeSplit() )
1178 {
1179 for (int l = 0; l < entityIB.GetQuantity(); ++l)
1180 {
1181 ItemBase new_item = ItemBase.Cast( GameInventory.LocationCreateEntity( dst, entityIB.GetType(), ECE_NONE, RF_DEFAULT ) );
1182
1183 if ( new_item )
1184 {
1185 MiscGameplayFunctions.TransferItemProperties(entityIB, new_item);
1186 entityIB.AddQuantity( -1 );
1187 new_item.SetQuantity( 1 );
1188 new_item.ThrowPhysically(null, force, false);
1189 }
1190 }
1191 }
1192 else
1193 {
1194 float stackable = entityIB.GetTargetQuantityMax();
1195 if ( !(stackable == 0 || stackable >= entityIB.GetQuantity()) )
1196 {
1197 while (entityIB.GetQuantity() > stackable)
1198 {
1200 position[1] = position[1] + 0.1;
1201 spltDst.SetGroundEx(entity, position, direction);
1202
1203 ItemBase splitItem = entityIB.SplitIntoStackMaxToInventoryLocationEx( spltDst );
1204 splitItem.ThrowPhysically(null, force, false);
1205 }
1206 }
1207
1209 entityInventory.GetCurrentInventoryLocation(src);
1210
1211 entityInventory.TakeToDst(invMode, src, dst);
1212 entityIB.ThrowPhysically(null, force, false);
1213 }
1214 }
1215 else
1216 {
1217 entityInventory.DropEntity(invMode, entity.GetHierarchyRoot(), entity);
1218 dBodyApplyImpulse(entity, force);
1219 }
1220 }
1221
1223 {
1224 float wetFactor;
1225 float healthFactor;
1226
1227 float heatIsolation = pItem.GetHeatIsolation();
1228 float itemHealthLabel = pItem.GetHealthLevel();
1229 float itemWetness = pItem.GetWet();
1230
1232 if ( itemWetness >= GameConstants.STATE_DRY && itemWetness < GameConstants.STATE_DAMP )
1233 {
1235 }
1236 else if ( itemWetness >= GameConstants.STATE_DAMP && itemWetness < GameConstants.STATE_WET )
1237 {
1239 }
1240 else if ( itemWetness >= GameConstants.STATE_WET && itemWetness < GameConstants.STATE_SOAKING_WET )
1241 {
1243 }
1244 else if ( itemWetness >= GameConstants.STATE_SOAKING_WET && itemWetness < GameConstants.STATE_DRENCHED )
1245 {
1247 }
1248 else if ( itemWetness >= GameConstants.STATE_DRENCHED )
1249 {
1251 }
1252
1254 switch (itemHealthLabel)
1255 {
1258 break;
1259
1262 break;
1263
1266 break;
1267
1270 break;
1271
1274 break;
1275 }
1276
1278 heatIsolation *= healthFactor;
1279 heatIsolation *= wetFactor;
1280
1281 return heatIsolation;
1282 }
1283
1284 static void FilterObstructingObjects(array<Object> potentiallyObstructingObjects, out array<Object> obstructingObjects)
1285 {
1286 if (!obstructingObjects)
1287 obstructingObjects = new array<Object>;
1288
1289 for ( int i = 0; i < potentiallyObstructingObjects.Count(); ++i )
1290 {
1291 Object obj = potentiallyObstructingObjects[i];
1292 if ( obj && ( obj.CanObstruct() || obj.CanProxyObstruct() ) )
1293 obstructingObjects.Insert(obj);
1294 }
1295 }
1296
1298 {
1299 return obj.IsTransport() || obj.CanUseConstruction();
1300 }
1301
1303 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)
1304 {
1305 array<Object> vicinityObjects= new array<Object>;
1306 vicinityObjects.Copy(objects);
1307
1308 int i = 0;
1309 int j = 0;
1310 int k = 0;
1311 int mCount = vicinityObjects.Count();
1312
1313 if (!filteredObjects)
1314 filteredObjects = new array<Object>();
1315
1316 // Remove objects that are too far from the player anyways
1317 if ( doDistanceCheck )
1318 {
1319 for ( i = vicinityObjects.Count() - 1; i >= 0; --i )
1320 {
1321 Object obj = vicinityObjects[i];
1322 if ( obj && !CanIgnoreDistanceCheck( obj ) && vector.DistanceSq(origin, obj.GetPosition()) > maxDist * maxDist )
1323 vicinityObjects.Remove(i);
1324 }
1325 }
1326
1327 // Sort obstructingObjects to have the furthest one first
1328 array<Object> sortedObstructingObjects = new array<Object>();
1329 array<float> distanceHelper = new array<float>();
1330 array<float> distanceHelperUnsorted = new array<float>();
1331 float distance, dist1, dist2;
1332
1333 for ( i = 0; i < obstructingObjects.Count(); ++i )
1334 {
1335 distance = vector.DistanceSq(obstructingObjects[i].GetWorldPosition(), origin);
1336 distanceHelper.Insert(distance);
1337 }
1338
1339 distanceHelperUnsorted.Copy(distanceHelper);
1340 distanceHelper.Sort();
1341
1342 for ( i = distanceHelper.Count() - 1; i >= 0; --i )
1343 sortedObstructingObjects.Insert(obstructingObjects[distanceHelperUnsorted.Find(distanceHelper[i])]);
1344
1346 array<ref array<Object>> objectGroups = new array<ref array<Object>>();
1347 array<Object> group;
1348
1349 float cos = Math.Cos(90);
1350 float sin = Math.Sin(90);
1351
1352 // Iterate through sorted obstructingObjects
1353 for ( i = 0; i < sortedObstructingObjects.Count(); ++i )
1354 {
1355 Object obstrObj = sortedObstructingObjects[i];
1356 vector worldPos = obstrObj.GetWorldPosition();
1357 vector min, max;
1358 vector minMax[2];
1359 if ( obstrObj.GetCollisionBox(minMax) )
1360 {
1361 min = minMax[0];
1362 max = minMax[1];
1363 max = max * (obstrObj.GetOrientation() * range);
1364
1365 vector center, dx, dy, dz, half;
1366 center = (min + max) * 0.5;
1367 dz = obstrObj.GetOrientation();
1368 dx = vector.RotateAroundZero(dz, vector.Up, cos, sin);
1369 dy = vector.RotateAroundZero(dz, vector.Aside, cos, sin);
1370 half = (max - min) * 0.5;
1371 half = Vector(Math.AbsFloat(half[0]), Math.AbsFloat(half[1]), Math.AbsFloat(half[2]));
1372
1373 group = new array<Object>();
1374
1375 // Group objects within the above box
1376 for ( j = vicinityObjects.Count() - 1; j >= 0; --j )
1377 {
1378 Object vicObj = vicinityObjects[j];
1379 if ( vicObj )
1380 {
1381 vector d = vicObj.GetWorldPosition() - worldPos + center;
1382 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] )
1383 {
1384 group.Insert(vicObj);
1385 vicinityObjects.Remove(j);
1386 }
1387 }
1388 }
1389
1390 if ( group.Count() > 0 )
1391 tempGroups.Insert(group);
1392 }
1393 }
1394
1395 // Go through the objects grouped by obstruction to split them by distance too
1396 for ( i = 0; i < tempGroups.Count(); ++i )
1397 SplitArrayIntoGroupsByDistance(tempGroups[i], objectGroups, distanceDelta);
1398
1399 // Split initial groups by distance
1400 SplitArrayIntoGroupsByDistance(vicinityObjects, objectGroups, distanceDelta);
1401
1402 // Raycast items in groups (previously sample item in group which is not enough, sadly)
1403 IsObjectObstructedCache cache = new IsObjectObstructedCache(origin, mCount);
1404 foreach (array<Object> objectGroup : objectGroups)
1405 {
1406 foreach (Object filteredObject : objectGroup)
1407 {
1408 if (!IsObjectObstructedEx(filteredObject, cache))
1409 filteredObjects.Insert(filteredObject);
1410 }
1411
1412 }
1413
1414 cache.ClearCache();
1415 }
1416
1417 static void SplitArrayIntoGroupsByDistance(array<Object> objects, array<ref array<Object>> objectGroups, float squaredDistanceDelta)
1418 {
1419 array<Object> group;
1420 for ( int i = 0; i < objects.Count(); )
1421 {
1422 Object obj1 = objects[i];
1423 if ( obj1 )
1424 {
1425 group = new array<Object>;
1426 group.Insert(obj1);
1427 for ( int j = objects.Count() - 1; j > i; --j )
1428 {
1429 Object obj2 = objects[j];
1430 if ( obj1 && obj2 )
1431 {
1432 vector start = obj1.GetWorldPosition();
1433 vector end = obj2.GetWorldPosition();
1434
1435 float distance = vector.DistanceSq(start, end);
1436 if ( distance < squaredDistanceDelta )
1437 {
1438 group.Insert(obj2);
1439 objects.Remove(j);
1440 }
1441 }
1442 }
1443 objectGroups.Insert(group);
1444 objects.Remove(i);
1445 continue;
1446 }
1447 ++i;
1448 }
1449 }
1450
1451 static bool IsObjectObstructed(Object object, bool doDistanceCheck = false, vector distanceCheckPos = "0 0 0", float maxDist = 0)
1452 {
1453 vector rayStart;
1454 MiscGameplayFunctions.GetHeadBonePos(PlayerBase.Cast(g_Game.GetPlayer()), rayStart);
1455 IsObjectObstructedCache cache = new IsObjectObstructedCache(rayStart, 1);
1456
1457 return IsObjectObstructedEx(object, cache, doDistanceCheck, distanceCheckPos, maxDist);
1458 }
1459
1460 static bool IsObjectObstructedEx(Object object, IsObjectObstructedCache cache, bool doDistanceCheck = false, vector distanceCheckPos = "0 0 0", float maxDist = 0)
1461 {
1462 if (!object)
1463 return true;
1464
1465 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
1466 if (doDistanceCheck && vector.DistanceSq(player.GetPosition(), distanceCheckPos) > maxDist * maxDist)
1467 return true;
1468
1469 cache.ObjectCenterPos = object.GetCenter();
1470
1471 return IsObjectObstructedFilterEx(object, cache, player);
1472 }
1473
1475 {
1476 if (object.CanProxyObstruct())
1477 {
1478 RaycastRVParams rayInput = new RaycastRVParams(cache.RaycastStart, cache.ObjectCenterPos, player);
1479 DayZPhysics.RaycastRVProxy(rayInput, cache.HitProxyObjects);
1480 if (cache.HitProxyObjects)
1481 {
1482 if (cache.HitProxyObjects.Count() > 0)
1483 {
1484 if (cache.HitProxyObjects[0].hierLevel > 0)
1485 {
1486 // ignores attachments on player
1487 if (!cache.HitProxyObjects[0].parent.IsMan())
1488 {
1489 if (cache.HitProxyObjects[0].parent)
1490 {
1491 EntityAI proxyParent = EntityAI.Cast(cache.HitProxyObjects[0].parent);
1492 GameInventory proxyInventory = proxyParent.GetInventory();
1493 if (proxyInventory && proxyInventory.GetCargo())
1494 return true;
1495 }
1496 }
1497 }
1498 }
1499 }
1500 }
1501 return false;
1502 }
1503
1505 {
1506 for (int m = 0; m < cache.HitObjects.Count(); ++m)
1507 {
1508 Object hit_object = cache.HitObjects.Get(m);
1509
1510 if ( hit_object.CanObstruct() )
1511 return true;
1512
1513 //4.3. ignore item if items are big and heavy >= OBJECT_OBSTRUCTION_WEIGHT
1514 //EntityAI eai;
1515 //if ( Class.CastTo( eai, hit_object ) )
1516 //{
1517 // if ( eai.GetWeight() >= OBJECT_OBSTRUCTION_WEIGHT )
1518 // {
1519 // if ( eai != filtered_object && eai.GetHierarchyRoot() != filtered_object )
1520 // {
1521 // //Print("!!!!!obstacle vaha: " + hit_object);
1522 // is_obstructed = true;
1523 // }
1524 // }
1525 //}
1526 }
1527
1528 return false;
1529 }
1530
1532 static bool IsObjectObstructedFilterEx(Object object, IsObjectObstructedCache cache, PlayerBase player, int geometryTypeOverride = -1)
1533 {
1534 //first proxy geometries
1535 RaycastRVParams rayInput = new RaycastRVParams(cache.RaycastStart, cache.ObjectCenterPos, player);
1536 rayInput.flags = CollisionFlags.ALLOBJECTS;
1537 if (geometryTypeOverride != -1)
1538 rayInput.type = geometryTypeOverride; //default 'ObjIntersectView'
1539 DayZPhysics.RaycastRVProxy(rayInput, cache.HitProxyObjects);
1540 int count;
1541 int i;
1542
1543 if (cache.HitProxyObjects)
1544 {
1545 count = cache.HitProxyObjects.Count();
1546 Object parent;
1547 for (i = 0; i < count; ++i)
1548 {
1549 if (cache.HitProxyObjects[i].hierLevel > 0) //parent has to exist, skipping nullcheck
1550 {
1551 parent = cache.HitProxyObjects[i].parent;
1552 if (parent && !parent.IsMan() && parent.CanProxyObstruct())
1553 {
1554 if (parent != object || (parent == object && object.CanProxyObstructSelf()))
1555 return true;
1556 }
1557 }
1558 }
1559 }
1560
1561 //second, regular raycast
1562 int geometry = ObjIntersectFire; //default for the RV raycast
1563 if (geometryTypeOverride != -1)
1564 geometry = geometryTypeOverride;
1565 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);
1566 count = cache.HitObjects.Count();
1567 for (i = 0; i < count; ++i)
1568 {
1569 if (cache.HitObjects[i].CanObstruct())
1570 return true;
1571 }
1572
1573 return false;
1574 }
1575
1576 //Inflict damage to item based on environmental temperature and surface type
1577 static void DealEvinronmentAdjustedDmg(ItemBase item, PlayerBase player, float baseDamage)
1578 {
1579 string surfaceType;
1580 int liquidType;
1581 float adjustedDamage;
1582
1583 g_Game.SurfaceUnderObject(player, surfaceType, liquidType);
1584 float modifierSurface = Surface.GetParamFloat(surfaceType, "toolDamage"); // toolDamage
1585 if (modifierSurface == 0)
1586 modifierSurface = 1;
1587
1588 if (player.GetInColdArea())
1589 adjustedDamage = baseDamage * (modifierSurface + g_Game.GetMission().GetWorldData().GetColdAreaToolDamageModifier());
1590 else
1591 adjustedDamage = baseDamage * modifierSurface;
1592
1593 DealAbsoluteDmg(item, adjustedDamage);
1594 }
1595
1596 //Inflict absolute damage to item (used on tools when completing actions)
1597 static void DealAbsoluteDmg(ItemBase item, float dmg)
1598 {
1599 item.DecreaseHealth(dmg, false);
1600 }
1601
1602 //Function used to normailze values, enter the used value and the max value (max will become 1)
1603 static float Normalize(int val, int maxVal)
1604 {
1605 if (maxVal == 0)
1606 {
1607 Debug.LogError("Division by 0 is not allowed");
1608 return 0;
1609 }
1610
1611 return val / maxVal;
1612 }
1613
1614 static float Bobbing(float period, float amplitude, float elapsedTime)
1615 {
1616 //Prevent division by 0
1617 if ( period == 0 )
1618 period = 1;
1619
1620 elapsedTime /= period;
1621
1622 float cycle;
1623 cycle += elapsedTime;
1624 cycle = FModulus(cycle, 360);
1625 cycle = Math.Sin(cycle) * amplitude;
1626
1627 return cycle;
1628 }
1629
1630 // DEPRECATED, use Math.ModFloat directly instead
1631 static float FModulus(float x, float y)
1632 {
1633 return Math.ModFloat(x, y);
1634 }
1635
1636 static void RemoveSplint( PlayerBase player )
1637 {
1638 EntityAI entity = player.GetInventory().CreateInInventory("Splint");
1639 if (!entity)
1640 entity = player.SpawnEntityOnGroundOnCursorDir("Splint", 0.5);
1641
1642 EntityAI attachment;
1643 ItemBase new_item = ItemBase.Cast(entity);
1644 Class.CastTo(attachment, player.GetItemOnSlot("Splint_Right"));
1645 if ( attachment && attachment.GetType() == "Splint_Applied" )
1646 {
1647 if (new_item)
1648 {
1649 MiscGameplayFunctions.TransferItemProperties(attachment,new_item);
1650
1651 if (g_Game.IsServer())
1652 {
1653 //Lower health level of splint after use
1654 if (new_item.GetHealthLevel() < 4)
1655 {
1656 int newDmgLevel = new_item.GetHealthLevel() + 1;
1657
1658 float max = new_item.GetMaxHealth("","");
1659
1660 switch ( newDmgLevel )
1661 {
1663 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_BADLY_DAMAGED_VALUE );
1664 break;
1665
1667 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_DAMAGED_VALUE );
1668 break;
1669
1671 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_WORN_VALUE );
1672 break;
1673
1675 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_RUINED_VALUE );
1676 break;
1677
1678 default:
1679 break;
1680 }
1681 }
1682 }
1683 }
1684
1685 attachment.Delete();
1686 }
1687 }
1688
1690 static void TeleportCheck(notnull PlayerBase player, notnull array<ref array<float>> safe_positions)
1691 {
1692 if( player.GetSimulationTimeStamp() < 20 && !player.IsPersistentFlag(PersistentFlag.AREA_PRESENCE) )
1693 {
1694 //simulation time is bellow a threshold, which means the player has recently connected,
1695 //the player does not have the AREA_PRESENCE flag set, which means they were not inside the area when they disconnected,
1696 //that means they just spawned into a contaminated area, lets move them somewhere safe
1697 vector player_pos = player.GetPosition();
1698 vector closest_safe_pos = MiscGameplayFunctions.GetClosestSafePos(player_pos, safe_positions);
1699
1700 if (player_pos!=closest_safe_pos)
1701 {
1702 closest_safe_pos[1] = g_Game.SurfaceY(closest_safe_pos[0], closest_safe_pos[2]);
1703
1704 player.SetPosition( closest_safe_pos );//...so lets teleport them somewhere safe
1705 //DeveloperTeleport.SetPlayerPosition(player, closest_safe_pos);
1706 g_Game.RPCSingleParam(player, ERPCs.RPC_WARNING_TELEPORT, null, true, player.GetIdentity());
1707
1708 PluginAdminLog adminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
1709 if (adminLog)
1710 adminLog.PlayerTeleportedLog(player,player_pos,closest_safe_pos,"Unwillingly spawning in contaminated area.");
1711 }
1712
1713 player.SetPersistentFlag(PersistentFlag.AREA_PRESENCE, false);
1714 }
1715 }
1716
1717 static vector GetClosestSafePos(vector to_pos, notnull array<ref array<float>> positions)
1718 {
1719 vector closest_pos = to_pos;
1720 float smallest_dist = float.MAX;
1721 foreach( array<float> pos:positions)
1722 {
1723 vector vpos = "0 0 0";
1724 vpos[0] = pos[0];
1725 vpos[2] = pos[1];
1726
1727 to_pos[1] = 0;
1728 float dist = vector.DistanceSq(to_pos, vpos);//2d dist sq
1729 if ( dist < smallest_dist)
1730 {
1731 smallest_dist = dist;
1732 closest_pos = vpos;
1733 }
1734 }
1735 return closest_pos;
1736 }
1737
1739 static bool TeleportPlayerToSafeLocation3D(notnull PlayerBase player, vector safePos)
1740 {
1741 vector playerPos = player.GetPosition();
1742 if (playerPos != safePos)
1743 {
1744 player.SetPosition(safePos);
1745 g_Game.RPCSingleParam(player, ERPCs.RPC_WARNING_TELEPORT, null, true, player.GetIdentity());
1746
1747 return true;
1748 }
1749
1750 return false;
1751 }
1752
1753 static void GenerateAINoiseAtPosition(vector position, float lifeTime, NoiseParams noiseParams)
1754 {
1755 if (g_Game.IsServer())
1756 {
1757 NoiseSystem noise = g_Game.GetNoiseSystem();
1758 if (noise)
1759 {
1760 noise.AddNoiseTarget(position, lifeTime, noiseParams, NoiseAIEvaluate.GetNoiseReduction(g_Game.GetWeather()));
1761 }
1762 }
1763 }
1764
1765 static float GetMinValue(array<float> pArray)
1766 {
1767 float minValue = 0.0;
1768 for (int i = 0; i < pArray.Count(); ++i)
1769 {
1770 if (minValue == 0 || pArray.Get(i) < minValue)
1771 {
1772 minValue = pArray.Get(i);
1773 }
1774 }
1775
1776 return minValue;
1777 }
1778
1779 static float GetMaxValue(array<float> pArray)
1780 {
1781 float maxValue = 0.0;
1782 for (int i = 0; i < pArray.Count(); ++i)
1783 {
1784 if (maxValue == 0 || pArray.Get(i) > maxValue)
1785 {
1786 maxValue = pArray.Get(i);
1787 }
1788 }
1789
1790 return maxValue;
1791 }
1792
1793 static string GetItemDisplayName(string type)
1794 {
1795 return g_Game.ConfigGetTextOut("CfgVehicles " + type + " displayName");
1796 }
1797
1798 static bool IsComponentInSelection(array<Selection> pSelection, string pCompName)
1799 {
1800 if (pSelection.Count() == 0 || pCompName.Length() == 0)
1801 {
1802 return false;
1803 }
1804
1805 for (int i = 0; i < pSelection.Count(); ++i)
1806 {
1807 pCompName.ToLower();
1808 if (pSelection[i] && pSelection[i].GetName() == pCompName)
1809 {
1810 return true;
1811 }
1812 }
1813
1814 return false;
1815 }
1816
1817 static int GetComponentIndex(array<Selection> pSelection, string pCompName)
1818 {
1819 if (!MiscGameplayFunctions.IsComponentInSelection(pSelection, pCompName))
1820 {
1821 return INDEX_NOT_FOUND;
1822 }
1823
1824 for (int i = 0; i < pSelection.Count(); ++i)
1825 {
1826 pCompName.ToLower();
1827 if (pSelection[i] && pSelection[i].GetName() == pCompName)
1828 {
1829 return i;
1830 }
1831 }
1832
1833 return INDEX_NOT_FOUND;
1834 }
1835
1836 static void RemoveAllAttachedChildrenByTypename(notnull EntityAI parent, array<typename> listOfTypenames)
1837 {
1838 if (listOfTypenames.Count() > 0)
1839 {
1840 Object child = Object.Cast(parent.GetChildren());
1841 while (child)
1842 {
1843 Object childToRemove = child;
1844 child = Object.Cast(child.GetSibling());
1845
1846 if (childToRemove.IsAnyInherited(listOfTypenames))
1847 {
1848 vector pos = parent.GetPosition();
1849 parent.RemoveChild(childToRemove, false);
1850
1851 vector m4[4];
1853 m4[3] = pos;
1854 childToRemove.SetTransform(m4);
1855 childToRemove.PlaceOnSurface();
1856 }
1857 }
1858 }
1859 }
1860
1861 static void DeleteAttachedChildrenByTypename(notnull EntityAI parent, array<typename> listOfTypenames)
1862 {
1863 if (listOfTypenames.Count() > 0)
1864 {
1865 Object child = Object.Cast(parent.GetChildren());
1866 while (child)
1867 {
1868 Object childToRemove = child;
1869 child = Object.Cast(child.GetSibling());
1870
1871 if (childToRemove.IsAnyInherited(listOfTypenames))
1872 {
1873 parent.RemoveChild(childToRemove, false);
1874 childToRemove.Delete();
1875 }
1876 }
1877 }
1878 }
1879
1881 static void GetAttachedChildren(IEntity parent, array<IEntity> outputObjects)
1882 {
1883 IEntity child = parent.GetChildren();
1884 while (child)
1885 {
1886 outputObjects.Insert(child);
1887 child = child.GetSibling();
1888 }
1889 }
1890
1891 static void SoakItemInsideParentContainingLiquidAboveThreshold(notnull ItemBase item, notnull ItemBase parent, float liquidQuantityThresholdPercentage = 0.05)
1892 {
1893 if (g_Game.IsServer())
1894 {
1895 if (parent.GetLiquidType() != 0 && parent.GetQuantityNormalized() > liquidQuantityThresholdPercentage && !parent.GetIsFrozen())
1896 item.SetWetMax();
1897 }
1898 }
1899
1901 {
1902 float windMin;
1903 float windMax;
1904 g_Game.GetWeather().GetWindMagnitude().GetLimits(windMin, windMax);
1905 float snowfall = g_Game.GetWeather().GetSnowfall().GetActual();
1906 float value = snowfall + g_Game.GetWeather().GetWindMagnitude().GetActual() / windMax;
1907
1908 return value;
1909 }
1910}
1911
1913{
1914 // @NOTE m_Player == target player - i.e. restrained one
1915 void DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy = false)
1916 {
1918 vector mtx[4];
1919 if (old_item)
1920 old_item.GetTransform(mtx);
1921 else
1922 player.GetTransform(mtx);
1923 gnd.SetGround(NULL, mtx);
1924 OverrideNewLocation(gnd);
1925 }
1926
1927 protected override void RemoveOldItemFromLocation()
1928 {
1929 super.RemoveOldItemFromLocation();
1930 m_Player.GetHumanInventory().OnEntityInHandsDestroyed(m_OldLocation);
1931 }
1932}
1933
1934// This was created since IsObjectObstructed is often called multiple times in one frame
1935// 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
1936class IsObjectObstructedCache // Pretending this is a struct
1937{
1938 // Outside data
1941
1942 // Inside data
1948 ref set<Object> HitObjects = new set<Object>;
1949
1950 void IsObjectObstructedCache(vector rayCastStart, int totalObjects)
1951 {
1952 RaycastStart = rayCastStart;
1953 TotalObjects = totalObjects;
1954 }
1955
1956 // Only inside data
1958 {
1959 ObjectCenterPos = "0 0 0";
1960 ObjectContactPos = "0 0 0";
1961 ObjectContactDir = "0 0 0";
1962 ContactComponent = -1;
1963 HitProxyObjects.Clear();
1964 HitObjects.Clear();
1965 }
1966}
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
class LogManager EntityAI
override void OnSuccess(EntityAI new_item)
Определения ActionRestrainTarget.c:221
class ActionTargets ActionTarget
map m_Player
const int ECE_NONE
Определения CentralEconomy.c:7
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
const int ECE_UPDATEPATHGRAPH
Определения CentralEconomy.c:13
const int RF_DEFAULT
Определения CentralEconomy.c:65
const int ECE_CREATEPHYSICS
Определения CentralEconomy.c:16
void Construction(BaseBuildingBase parent)
Определения Construction.c:26
DayZGame g_Game
Определения DayZGame.c:3942
proto native int GetComponentIndex()
Определения ActionTargets.c:135
ERPCs
Определения ERPCs.c:2
bool IsUnderRoof()
Is character under roof (periodically checked - GameConstants.ENVIRO_TICK_ROOF_RC_CHECK)....
Определения Environment.c:305
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:8765
PlayerBase m_Player
Определения MiscGameplayFunctions.c:117
ref array< ref RaycastRVResult > HitProxyObjects
Определения MiscGameplayFunctions.c:1947
static bool CanIgnoreDistanceCheck(Object obj)
Определения MiscGameplayFunctions.c:1297
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:790
TransferInventoryResult
Определения MiscGameplayFunctions.c:203
@ Ok
Определения MiscGameplayFunctions.c:204
@ DroppedSome
Определения MiscGameplayFunctions.c:204
static void GetAttachedChildren(IEntity parent, array< IEntity > outputObjects)
Fills the provided array with all children entities in hierarchy of this entity.
Определения MiscGameplayFunctions.c:1881
static vector GetRandomizedPositionVerifiedPlayer(Man player, float distance, float radius, Object ignore)
Определения MiscGameplayFunctions.c:1086
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:1597
SPLIT
Определения MiscGameplayFunctions.c:218
static void TransferItemVariables(ItemBase source, ItemBase target, bool exclude_quantity=false)
DEPRECATED.
Определения MiscGameplayFunctions.c:339
static float GetCombinedSnowfallWindValue()
Определения MiscGameplayFunctions.c:1900
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:1739
static float Bobbing(float period, float amplitude, float elapsedTime)
Определения MiscGameplayFunctions.c:1614
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:832
int TotalObjects
Определения MiscGameplayFunctions.c:1940
static void RemoveAllAttachedChildrenByTypename(notnull EntityAI parent, array< typename > listOfTypenames)
Определения MiscGameplayFunctions.c:1836
static bool BuildCondition(PlayerBase player, ActionTarget target, ItemBase item, bool camera_check)
Определения MiscGameplayFunctions.c:915
static void TurnItemIntoItemEx(notnull PlayerBase player, ReplaceItemWithNewLambdaBase lambda)
Определения MiscGameplayFunctions.c:459
static bool ComplexBuildCollideCheckClient(PlayerBase player, ActionTarget target, ItemBase item, string partName="")
Определения MiscGameplayFunctions.c:873
static void DropAllItemsInInventoryInBounds(ItemBase ib, vector halfExtents)
Определения MiscGameplayFunctions.c:1094
static vector GetSteamPosition(EntityAI parent)
Определения MiscGameplayFunctions.c:1021
EntityAI m_NewItem
Определения MiscGameplayFunctions.c:166
static void GenerateAINoiseAtPosition(vector position, float lifeTime, NoiseParams noiseParams)
Определения MiscGameplayFunctions.c:1753
vector ObjectContactDir
Определения MiscGameplayFunctions.c:1945
static vector GetRandomizedPosition(vector targetPos, float radius)
Определения MiscGameplayFunctions.c:1062
static void DealEvinronmentAdjustedDmg(ItemBase item, PlayerBase player, float baseDamage)
Определения MiscGameplayFunctions.c:1577
vector ObjectContactPos
Определения MiscGameplayFunctions.c:1944
static array< Magazine > CreateMagazinePilesFromBulletDispersed(string bullet_type, vector starPos, vector targetPos, float radius, float quantity, float health, Object ignoreObjectCollison)
Определения MiscGameplayFunctions.c:647
enum ThrowEntityFlags Truncate(float value, int decimals=2)
truncate float to specified precision
Определения MiscGameplayFunctions.c:216
vector ObjectCenterPos
Определения MiscGameplayFunctions.c:1943
static vector GetClosestSafePos(vector to_pos, notnull array< ref array< float > > positions)
Определения MiscGameplayFunctions.c:1717
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:1303
static int GetHealthLevelForAmmo(string class_name, float health)
Определения MiscGameplayFunctions.c:659
ref set< Object > HitObjects
Определения MiscGameplayFunctions.c:1948
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:1950
static float GetTypeMaxGlobalHealth(string class_name, string health_type="Health")
Определения MiscGameplayFunctions.c:675
static float Normalize(int val, int maxVal)
Определения MiscGameplayFunctions.c:1603
static string TruncateVecToS(vector value, int decimals=2, string delimiter=" ")
Определения MiscGameplayFunctions.c:236
static string TruncateToS(float value, int decimals=2)
truncate float to specified precision, output as string
Определения MiscGameplayFunctions.c:222
static void DeleteAttachedChildrenByTypename(notnull EntityAI parent, array< typename > listOfTypenames)
Определения MiscGameplayFunctions.c:1861
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:1793
static void TransformRestrainItem(EntityAI current_item, EntityAI tool, PlayerBase player_source, PlayerBase player_target, bool destroy=false)
Определения MiscGameplayFunctions.c:795
static vector GetHeadingVector(notnull PlayerBase player)
Определения MiscGameplayFunctions.c:726
static array< Magazine > CreateMagazinePilesFromBullet(string bullet_type, vector ground_position, float quantity, float health)
Определения MiscGameplayFunctions.c:612
static bool IsValueInRange(float value, float from, float to)
Определения MiscGameplayFunctions.c:826
static string SanitizeString(string input)
Определения MiscGameplayFunctions.c:863
static bool IsComponentInSelection(array< Selection > pSelection, string pCompName)
Определения MiscGameplayFunctions.c:1798
static void GetHeadBonePos(notnull PlayerBase player, out vector pos)
Определения MiscGameplayFunctions.c:716
static bool GetProjectedCursorPos3d(out vector position, Weapon_Base weapon)
Определения MiscGameplayFunctions.c:698
static float GetEnergyMetabolicSpeed(int movement_speed)
Определения MiscGameplayFunctions.c:744
static bool IsObjectObstructedFilter(Object object, IsObjectObstructedCache cache, PlayerBase player)
Определения MiscGameplayFunctions.c:1504
static void IsUnderRoofFromToCalculation(EntityAI entity, out vector from, out vector to, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST)
Определения MiscGameplayFunctions.c:971
static float GetHeadingAngle(notnull DayZPlayerImplement player)
Определения MiscGameplayFunctions.c:736
int ContactComponent
Определения MiscGameplayFunctions.c:1946
static bool IsObjectObstructed(Object object, bool doDistanceCheck=false, vector distanceCheckPos="0 0 0", float maxDist=0)
Определения MiscGameplayFunctions.c:1451
static void ThrowEntityFromInventory(notnull EntityAI entity, vector position, float direction[4], vector force, int flags)
Определения MiscGameplayFunctions.c:1164
static void RemoveSplint(PlayerBase player)
Определения MiscGameplayFunctions.c:1636
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:516
static bool IsObjectObstructedProxy(Object object, IsObjectObstructedCache cache, PlayerBase player)
Определения MiscGameplayFunctions.c:1474
static float GetWaterMetabolicSpeed(int movement_speed)
Определения MiscGameplayFunctions.c:767
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:1532
static vector GetRandomizedPositionVerified(vector startPos, vector targetPos, float radius, Object ignore=null)
Определения MiscGameplayFunctions.c:1071
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:1460
static void SplitArrayIntoGroupsByDistance(array< Object > objects, array< ref array< Object > > objectGroups, float squaredDistanceDelta)
Определения MiscGameplayFunctions.c:1417
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:1222
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:581
void ClearCache()
Определения MiscGameplayFunctions.c:1957
static float FModulus(float x, float y)
Определения MiscGameplayFunctions.c:1631
static array< Magazine > CreateMagazinePiles(string item_name, vector ground_position, float quantity, float health)
Определения MiscGameplayFunctions.c:553
static bool IsUnderRoofEx(EntityAI entity, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST, int geometry=ObjIntersectView)
Определения MiscGameplayFunctions.c:1006
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:1690
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:1891
static void ThrowAllItemsInInventory(notnull EntityAI parent, int flags)
Определения MiscGameplayFunctions.c:1122
static void FilterObstructingObjects(array< Object > potentiallyObstructingObjects, out array< Object > obstructingObjects)
Определения MiscGameplayFunctions.c:1284
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:15
class OptionSelectorMultistate extends OptionSelector class_name
PersistentFlag
Определения PersistentFlag.c:6
DebugActionType
Определения PluginDiagMenu.c:7
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:325
float GetMinValue()
Определения StaminaHandler.c:154
float GetMaxValue()
Определения StaminaHandler.c:157
override bool IsPlayerInside(PlayerBase player, string selection)
Определения Fence.c:615
override bool PerformRoofCheckForBase(string partName, PlayerBase player, out bool result)
Определения Watchtower.c:133
override bool MustBeBuiltFromOutside()
Определения ShelterSite.c:88
override bool IsFacingCamera(string selection)
Определения Fence.c:678
Определения 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:384
float GetEnergy()
Energy manager: Returns the amount of stored energy this device has.
Определения ComponentEnergyManager.c:1259
void SetEnergy(float new_energy)
Energy manager: Sets stored energy for this device. It ignores the min/max limit!
Определения ComponentEnergyManager.c:534
bool IsSwitchedOn()
Energy manager: Returns state of the switch. Whenever the device is working or not does not matter....
Определения ComponentEnergyManager.c:897
ConstructionPart GetBuildPartNoToolAtIndex(int idx)
Определения ConstructionActionData.c:193
void SetTarget(Object target)
Определения ConstructionActionData.c:78
ConstructionPart GetBuildPartAtIndex(int idx)
Определения ConstructionActionData.c:184
string GetPartName()
Определения ConstructionPart.c:30
string GetMainPartName()
Определения ConstructionPart.c:35
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:305
Определения 3_Game/DayZ/tools/Debug.c:2
void DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy=false)
Определения MiscGameplayFunctions.c:1915
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:730
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)
Определения PileOfWoodenPlanks.c:88
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
static float GetNoiseReduction(Weather weather)
Определения SensesAIEvaluate.c:18
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 METABOLIC_SPEED_WATER_BASAL
Определения PlayerConstants.c:81
static const float METABOLIC_SPEED_WATER_WALK
Определения PlayerConstants.c:83
static const float METABOLIC_SPEED_ENERGY_JOG
Определения PlayerConstants.c:78
static const float METABOLIC_SPEED_WATER_JOG
Определения PlayerConstants.c:84
static const float METABOLIC_SPEED_ENERGY_WALK
Определения PlayerConstants.c:77
static const float METABOLIC_SPEED_WATER_SPRINT
Определения PlayerConstants.c:85
static const float METABOLIC_SPEED_ENERGY_SPRINT
Определения PlayerConstants.c:79
static const float METABOLIC_SPEED_ENERGY_BASAL
Определения PlayerConstants.c:75
Определения 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:153
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:18
Определения 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:284
static const vector Forward
Определения EnConvert.c:122
static const vector Zero
Определения EnConvert.c:123
proto float Normalize()
Normalizes vector. Returns length.
static vector RotateAroundZero(vector pos, vector axis, float cosAngle, float sinAngle)
Rotate a vector around 0,0,0.
Определения EnConvert.c:490
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
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:643
const float ROOF_CHECK_RAYCAST_DIST
Определения 3_Game/DayZ/constants.c:1014
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
array< string > TStringArray
Определения EnScript.c:712
array< int > TIntArray
Определения EnScript.c:714
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:779
const float ENVIRO_ISOLATION_WETFACTOR_WET
Определения 3_Game/DayZ/constants.c:778
const float ENVIRO_ISOLATION_WETFACTOR_DAMP
Определения 3_Game/DayZ/constants.c:777
const float ENVIRO_ISOLATION_WETFACTOR_DRENCHED
Определения 3_Game/DayZ/constants.c:780
const float ENVIRO_ISOLATION_HEALTHFACTOR_RUINED
Определения 3_Game/DayZ/constants.c:786
const float ENVIRO_ISOLATION_HEALTHFACTOR_DAMAGED
Определения 3_Game/DayZ/constants.c:784
const float ENVIRO_ISOLATION_HEALTHFACTOR_WORN
Определения 3_Game/DayZ/constants.c:783
const float ENVIRO_ISOLATION_WETFACTOR_DRY
impact of item wetness to the heat isolation
Определения 3_Game/DayZ/constants.c:776
const float ENVIRO_ISOLATION_HEALTHFACTOR_PRISTINE
impact of item health (state) to the heat isolation
Определения 3_Game/DayZ/constants.c:782
const float ENVIRO_ISOLATION_HEALTHFACTOR_B_DAMAGED
Определения 3_Game/DayZ/constants.c:785
const float DAMAGE_BADLY_DAMAGED_VALUE
Определения 3_Game/DayZ/constants.c:866
const float DAMAGE_RUINED_VALUE
Определения 3_Game/DayZ/constants.c:867
const float DAMAGE_DAMAGED_VALUE
Определения 3_Game/DayZ/constants.c:865
const float DAMAGE_WORN_VALUE
Определения 3_Game/DayZ/constants.c:864
const int STATE_RUINED
Определения 3_Game/DayZ/constants.c:851
const int STATE_WORN
Определения 3_Game/DayZ/constants.c:854
const int STATE_DAMAGED
Определения 3_Game/DayZ/constants.c:853
const int STATE_BADLY_DAMAGED
Определения 3_Game/DayZ/constants.c:852
const int STATE_PRISTINE
Определения 3_Game/DayZ/constants.c:855
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:631
const float STATE_DRY
Определения 3_Game/DayZ/constants.c:879
const float STATE_DAMP
Определения 3_Game/DayZ/constants.c:878
const float STATE_SOAKING_WET
Определения 3_Game/DayZ/constants.c:876
const float STATE_DRENCHED
Определения 3_Game/DayZ/constants.c:875
const float STATE_WET
Определения 3_Game/DayZ/constants.c:877
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:220
const string CFG_WEAPONSPATH
Определения 3_Game/DayZ/constants.c:221
const string CFG_MAGAZINESPATH
Определения 3_Game/DayZ/constants.c:222
@ 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.
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