DayZ 1.27
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 GetGame().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();
180 }
181 override protected void UndoRemoveNetworkObjectInfo ()
182 {
183 super.UndoRemoveNetworkObjectInfo();
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);
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 (GetGame().IsServer() || !GetGame().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);
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 ( GetGame().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(GetGame().CreateObjectEx(item_name, ground_position, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
495 else
496 pile = ItemBase.Cast(GetGame().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(GetGame().CreateObjectEx(item_name, ground_position, ECE_CREATEPHYSICS|ECE_UPDATEPATHGRAPH));
506 else
507 pile = ItemBase.Cast(GetGame().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(GetGame().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(GetGame().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(GetGame().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(GetGame().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(GetGame().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(GetGame().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(GetGame().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(GetGame().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";
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 ( GetGame().ConfigIsExisting(CFG_VEHICLESPATH+" "+class_name) )
681 {
682 cfg_path = CFG_VEHICLESPATH;
683 }
684 else if ( GetGame().ConfigIsExisting(CFG_WEAPONSPATH+" "+class_name) )
685 {
686 cfg_path = CFG_WEAPONSPATH;
687 }
688 else if ( GetGame().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 = GetGame().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 ( GetGame() && ( !GetGame().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 (!GetGame().IsServer())
1097 return;
1098 array<EntityAI> items = new array<EntityAI>;
1099 ib.GetInventory().EnumerateInventory(InventoryTraversalType.LEVELORDER, items);
1100
1101 vector direction = ib.GetDirection();
1102 float dot = vector.Dot(direction, vector.Forward);
1103
1104 float angle = Math.Acos(dot);
1105 if (direction[0] < 0)
1106 angle = -angle;
1107
1108 float cos = Math.Cos(angle);
1109 float sin = Math.Sin(angle);
1110
1111 EntityAI item;
1112 int count = items.Count();
1113 for ( int i = 0; i < count; ++i )
1114 {
1115 item = items.Get(i);
1116 if ( item )
1117 ib.GetInventory().DropEntityInBounds(InventoryMode.SERVER, ib, item, halfExtents, angle, cos, sin);
1118 }
1119 }
1120
1121 static void ThrowAllItemsInInventory(notnull EntityAI parent, int flags)
1122 {
1123 vector position = parent.GetPosition();
1124 vector orientation = parent.GetOrientation();
1125 vector rotation_matrix[3];
1126 float direction[4];
1127
1128 vector minmax[2];
1129 parent.GetCollisionBox(minmax);
1130
1131 Math3D.YawPitchRollMatrix( orientation, rotation_matrix );
1132 Math3D.MatrixToQuat( rotation_matrix, direction );
1133
1134 vector randomPos;
1135 for ( int i = 0; i < parent.GetInventory().AttachmentCount(); ++i )
1136 {
1137 randomPos = Vector(position[0] + Math.RandomFloat(minmax[0][0], minmax[1][0]),
1138 position[1] + Math.RandomFloat(minmax[0][1], minmax[1][1]),
1139 position[2] + Math.RandomFloat(minmax[0][2], minmax[1][2]));
1140
1141 ThrowEntityFromInventory(parent.GetInventory().GetAttachmentFromIndex( i ), randomPos, direction, -GetVelocity(parent), ThrowEntityFlags.NONE);
1142 }
1143
1144 for ( int j = 0; j < parent.GetInventory().GetCargo().GetItemCount(); ++j )
1145 {
1146 randomPos = Vector(position[0] + Math.RandomFloat(minmax[0][0], minmax[1][0]),
1147 position[1] + Math.RandomFloat(minmax[0][1], minmax[1][1]),
1148 position[2] + Math.RandomFloat(minmax[0][2], minmax[1][2]));
1149
1150 ThrowEntityFromInventory(parent.GetInventory().GetCargo().GetItem( j ), randomPos, direction, -GetVelocity(parent), ThrowEntityFlags.NONE);
1151 }
1152 }
1153
1154 static void ThrowEntityFromInventory(notnull EntityAI entity, vector position, float direction[4], vector force, int flags)
1155 {
1156 InventoryMode invMode = InventoryMode.SERVER;
1157 if ( !GetGame().IsMultiplayer() )
1158 invMode = InventoryMode.LOCAL;
1159
1160 ItemBase entityIB;
1161 if (CastTo(entityIB, entity))
1162 {
1164 dst.SetGroundEx(entity, position, direction);
1165
1166 if ( (flags & ThrowEntityFlags.SPLIT) && entityIB.CanBeSplit() )
1167 {
1168 for (int l = 0; l < entityIB.GetQuantity(); ++l)
1169 {
1170 ItemBase new_item = ItemBase.Cast( GameInventory.LocationCreateEntity( dst, entityIB.GetType(), ECE_NONE, RF_DEFAULT ) );
1171
1172 if ( new_item )
1173 {
1174 MiscGameplayFunctions.TransferItemProperties(entityIB, new_item);
1175 entityIB.AddQuantity( -1 );
1176 new_item.SetQuantity( 1 );
1177 new_item.ThrowPhysically(null, force, false);
1178 }
1179 }
1180 }
1181 else
1182 {
1183 float stackable = entityIB.GetTargetQuantityMax();
1184 if ( !(stackable == 0 || stackable >= entityIB.GetQuantity()) )
1185 {
1186 while (entityIB.GetQuantity() > stackable)
1187 {
1189 position[1] = position[1] + 0.1;
1190 spltDst.SetGroundEx(entity, position, direction);
1191
1192 ItemBase splitItem = entityIB.SplitIntoStackMaxToInventoryLocationEx( spltDst );
1193 splitItem.ThrowPhysically(null, force, false);
1194 }
1195 }
1196
1198 entity.GetInventory().GetCurrentInventoryLocation(src);
1199
1200 entity.GetInventory().TakeToDst(invMode, src, dst);
1201 entityIB.ThrowPhysically(null, force, false);
1202 }
1203 }
1204 else
1205 {
1206 entity.GetInventory().DropEntity(invMode, entity.GetHierarchyRoot(), entity);
1207 dBodyApplyImpulse(entity, force);
1208 }
1209 }
1210
1212 {
1213 float wetFactor;
1214 float healthFactor;
1215
1216 float heatIsolation = pItem.GetHeatIsolation();
1217 float itemHealthLabel = pItem.GetHealthLevel();
1218 float itemWetness = pItem.GetWet();
1219
1221 if ( itemWetness >= GameConstants.STATE_DRY && itemWetness < GameConstants.STATE_DAMP )
1222 {
1224 }
1225 else if ( itemWetness >= GameConstants.STATE_DAMP && itemWetness < GameConstants.STATE_WET )
1226 {
1228 }
1229 else if ( itemWetness >= GameConstants.STATE_WET && itemWetness < GameConstants.STATE_SOAKING_WET )
1230 {
1232 }
1233 else if ( itemWetness >= GameConstants.STATE_SOAKING_WET && itemWetness < GameConstants.STATE_DRENCHED )
1234 {
1236 }
1237 else if ( itemWetness >= GameConstants.STATE_DRENCHED )
1238 {
1240 }
1241
1243 switch (itemHealthLabel)
1244 {
1247 break;
1248
1251 break;
1252
1255 break;
1256
1259 break;
1260
1263 break;
1264 }
1265
1267 heatIsolation *= healthFactor;
1268 heatIsolation *= wetFactor;
1269
1270 return heatIsolation;
1271 }
1272
1273 static void FilterObstructingObjects(array<Object> potentiallyObstructingObjects, out array<Object> obstructingObjects)
1274 {
1275 if (!obstructingObjects)
1276 obstructingObjects = new array<Object>;
1277
1278 for ( int i = 0; i < potentiallyObstructingObjects.Count(); ++i )
1279 {
1280 Object obj = potentiallyObstructingObjects[i];
1281 if ( obj && ( obj.CanObstruct() || obj.CanProxyObstruct() ) )
1282 obstructingObjects.Insert(obj);
1283 }
1284 }
1285
1287 {
1288 return obj.IsTransport() || obj.CanUseConstruction();
1289 }
1290
1292 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)
1293 {
1294 array<Object> vicinityObjects= new array<Object>;
1295 vicinityObjects.Copy(objects);
1296
1297 int i = 0;
1298 int j = 0;
1299 int k = 0;
1300 int mCount = vicinityObjects.Count();
1301
1302 if (!filteredObjects)
1303 filteredObjects = new array<Object>;
1304
1305 // Remove objects that are too far from the player anyways
1306 if ( doDistanceCheck )
1307 {
1308 for ( i = vicinityObjects.Count() - 1; i >= 0; --i )
1309 {
1310 Object obj = vicinityObjects[i];
1311 if ( obj && !CanIgnoreDistanceCheck( obj ) && vector.DistanceSq(origin, obj.GetPosition()) > maxDist * maxDist )
1312 vicinityObjects.Remove(i);
1313 }
1314 }
1315
1316 // Sort obstructingObjects to have the furthest one first
1317 array<Object> sortedObstructingObjects = new array<Object>;
1318 array<float> distanceHelper = new array<float>;
1319 array<float> distanceHelperUnsorted = new array<float>;
1320 float distance, dist1, dist2;
1321
1322 for ( i = 0; i < obstructingObjects.Count(); ++i )
1323 {
1324 distance = vector.DistanceSq(obstructingObjects[i].GetWorldPosition(), origin);
1325 distanceHelper.Insert(distance);
1326 }
1327
1328 distanceHelperUnsorted.Copy(distanceHelper);
1329 distanceHelper.Sort();
1330
1331 for ( i = distanceHelper.Count() - 1; i >= 0; --i )
1332 sortedObstructingObjects.Insert(obstructingObjects[distanceHelperUnsorted.Find(distanceHelper[i])]);
1333
1336 array<Object> group;
1337
1338 float cos = Math.Cos(90);
1339 float sin = Math.Sin(90);
1340
1341 // Iterate through sorted obstructingObjects
1342 for ( i = 0; i < sortedObstructingObjects.Count(); ++i )
1343 {
1344 Object obstrObj = sortedObstructingObjects[i];
1345 vector worldPos = obstrObj.GetWorldPosition();
1346 vector min, max;
1347 vector minMax[2];
1348 if ( obstrObj.GetCollisionBox(minMax) )
1349 {
1350 min = minMax[0];
1351 max = minMax[1];
1352 max = max * (obstrObj.GetOrientation() * range);
1353
1354 vector center, dx, dy, dz, half;
1355 center = (min + max) * 0.5;
1356 dz = obstrObj.GetOrientation();
1357 dx = vector.RotateAroundZero(dz, vector.Up, cos, sin);
1358 dy = vector.RotateAroundZero(dz, vector.Aside, cos, sin);
1359 half = (max - min) * 0.5;
1360 half = Vector(Math.AbsFloat(half[0]), Math.AbsFloat(half[1]), Math.AbsFloat(half[2]));
1361
1362 group = new array<Object>;
1363
1364 // Group objects within the above box
1365 for ( j = vicinityObjects.Count() - 1; j >= 0; --j )
1366 {
1367 Object vicObj = vicinityObjects[j];
1368 if ( vicObj )
1369 {
1370 vector d = vicObj.GetWorldPosition() - worldPos + center;
1371 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] )
1372 {
1373 group.Insert(vicObj);
1374 vicinityObjects.Remove(j);
1375 }
1376 }
1377 }
1378
1379 if ( group.Count() > 0 )
1380 tempGroups.Insert(group);
1381 }
1382 }
1383
1384 // Go through the objects grouped by obstruction to split them by distance too
1385 for ( i = 0; i < tempGroups.Count(); ++i )
1386 SplitArrayIntoGroupsByDistance(tempGroups[i], objectGroups, distanceDelta);
1387
1388 // Split initial groups by distance
1389 SplitArrayIntoGroupsByDistance(vicinityObjects, objectGroups, distanceDelta);
1390
1391 // Raycast accordingly to groups
1392 IsObjectObstructedCache cache = new IsObjectObstructedCache(origin, mCount);
1393 for ( i = 0; i < objectGroups.Count(); ++i )
1394 {
1395 array<Object> objectGroup = objectGroups[i];
1396 Object sampleObject = objectGroup[0];
1397
1398 if ( !IsObjectObstructedEx(sampleObject, cache) )
1399 filteredObjects.InsertAll(objectGroup);
1400
1401 cache.ClearCache();
1402 }
1403 }
1404
1405 static void SplitArrayIntoGroupsByDistance(array<Object> objects, array<ref array<Object>> objectGroups, float squaredDistanceDelta)
1406 {
1407 array<Object> group;
1408 for ( int i = 0; i < objects.Count(); )
1409 {
1410 Object obj1 = objects[i];
1411 if ( obj1 )
1412 {
1413 group = new array<Object>;
1414 group.Insert(obj1);
1415 for ( int j = objects.Count() - 1; j > i; --j )
1416 {
1417 Object obj2 = objects[j];
1418 if ( obj1 && obj2 )
1419 {
1420 vector start = obj1.GetWorldPosition();
1421 vector end = obj2.GetWorldPosition();
1422
1423 float distance = vector.DistanceSq(start, end);
1424 if ( distance < squaredDistanceDelta )
1425 {
1426 group.Insert(obj2);
1427 objects.Remove(j);
1428 }
1429 }
1430 }
1431 objectGroups.Insert(group);
1432 objects.Remove(i);
1433 continue;
1434 }
1435 ++i;
1436 }
1437 }
1438
1439 static bool IsObjectObstructed(Object object, bool doDistanceCheck = false, vector distanceCheckPos = "0 0 0", float maxDist = 0)
1440 {
1441 vector rayStart;
1442 MiscGameplayFunctions.GetHeadBonePos(PlayerBase.Cast(GetGame().GetPlayer()), rayStart);
1443 IsObjectObstructedCache cache = new IsObjectObstructedCache(rayStart, 1);
1444
1445 return IsObjectObstructedEx(object, cache, doDistanceCheck, distanceCheckPos, maxDist);
1446 }
1447
1448 static bool IsObjectObstructedEx(Object object, IsObjectObstructedCache cache, bool doDistanceCheck = false, vector distanceCheckPos = "0 0 0", float maxDist = 0)
1449 {
1450 if (!object)
1451 return true;
1452
1453 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
1454 if (doDistanceCheck && vector.DistanceSq(player.GetPosition(), distanceCheckPos) > maxDist * maxDist)
1455 return true;
1456
1457 cache.ObjectCenterPos = object.GetCenter();
1458
1459 return IsObjectObstructedFilterEx(object, cache, player);
1460 }
1461
1463 {
1464 if (object.CanProxyObstruct())
1465 {
1466 RaycastRVParams rayInput = new RaycastRVParams(cache.RaycastStart, cache.ObjectCenterPos, player);
1467 DayZPhysics.RaycastRVProxy(rayInput, cache.HitProxyObjects);
1468 if (cache.HitProxyObjects)
1469 {
1470 if (cache.HitProxyObjects.Count() > 0)
1471 {
1472 if (cache.HitProxyObjects[0].hierLevel > 0)
1473 {
1474 // ignores attachments on player
1475 if (!cache.HitProxyObjects[0].parent.IsMan())
1476 {
1477 if (cache.HitProxyObjects[0].parent)
1478 {
1479 EntityAI proxyParent = EntityAI.Cast(cache.HitProxyObjects[0].parent);
1480 if (proxyParent.GetInventory() && proxyParent.GetInventory().GetCargo())
1481 return true;
1482 }
1483 }
1484 }
1485 }
1486 }
1487 }
1488 return false;
1489 }
1490
1492 {
1493 for (int m = 0; m < cache.HitObjects.Count(); ++m)
1494 {
1495 Object hit_object = cache.HitObjects.Get(m);
1496
1497 if ( hit_object.CanObstruct() )
1498 return true;
1499
1500 //4.3. ignore item if items are big and heavy >= OBJECT_OBSTRUCTION_WEIGHT
1501 //EntityAI eai;
1502 //if ( Class.CastTo( eai, hit_object ) )
1503 //{
1504 // if ( eai.GetWeight() >= OBJECT_OBSTRUCTION_WEIGHT )
1505 // {
1506 // if ( eai != filtered_object && eai.GetHierarchyRoot() != filtered_object )
1507 // {
1508 // //Print("!!!!!obstacle vaha: " + hit_object);
1509 // is_obstructed = true;
1510 // }
1511 // }
1512 //}
1513 }
1514
1515 return false;
1516 }
1517
1519 static bool IsObjectObstructedFilterEx(Object object, IsObjectObstructedCache cache, PlayerBase player, int geometryTypeOverride = -1)
1520 {
1521 //first proxy geometries
1522 RaycastRVParams rayInput = new RaycastRVParams(cache.RaycastStart, cache.ObjectCenterPos, player);
1523 rayInput.flags = CollisionFlags.ALLOBJECTS;
1524 if (geometryTypeOverride != -1)
1525 rayInput.type = geometryTypeOverride; //default 'ObjIntersectView'
1526 DayZPhysics.RaycastRVProxy(rayInput, cache.HitProxyObjects);
1527 int count;
1528 int i;
1529
1530 if (cache.HitProxyObjects)
1531 {
1532 count = cache.HitProxyObjects.Count();
1533 Object parent;
1534 for (i = 0; i < count; ++i)
1535 {
1536 if (cache.HitProxyObjects[i].hierLevel > 0) //parent has to exist, skipping nullcheck
1537 {
1538 parent = cache.HitProxyObjects[i].parent;
1539 if (parent && !parent.IsMan() && parent.CanProxyObstruct())
1540 {
1541 if (parent != object || (parent == object && object.CanProxyObstructSelf()))
1542 return true;
1543 }
1544 }
1545 }
1546 }
1547
1548 //second, regular raycast
1549 int geometry = ObjIntersectFire; //default for the RV raycast
1550 if (geometryTypeOverride != -1)
1551 geometry = geometryTypeOverride;
1552 DayZPhysics.RaycastRV(cache.RaycastStart, cache.ObjectCenterPos, cache.ObjectContactPos, cache.ObjectContactDir, cache.ContactComponent, cache.HitObjects, object, GetGame().GetPlayer(), false, false, geometry, 0.0, CollisionFlags.ALLOBJECTS);
1553 count = cache.HitObjects.Count();
1554 for (i = 0; i < count; ++i)
1555 {
1556 if (cache.HitObjects[i].CanObstruct())
1557 return true;
1558 }
1559
1560 return false;
1561 }
1562
1563 //Inflict damage to item based on environmental temperature and surface type
1564 static void DealEvinronmentAdjustedDmg(ItemBase item, PlayerBase player, float baseDamage)
1565 {
1566 string surfaceType;
1567 int liquidType;
1568 float adjustedDamage;
1569
1570 GetGame().SurfaceUnderObject(player, surfaceType, liquidType);
1571 float modifierSurface = Surface.GetParamFloat(surfaceType, "toolDamage"); // toolDamage
1572 if (modifierSurface == 0)
1573 modifierSurface = 1;
1574
1575 if (player.GetInColdArea())
1576 adjustedDamage = baseDamage * (modifierSurface + GetGame().GetMission().GetWorldData().GetColdAreaToolDamageModifier();
1577 else
1578 adjustedDamage = baseDamage * modifierSurface;
1579
1580 DealAbsoluteDmg(item, adjustedDamage);
1581 }
1582
1583 //Inflict absolute damage to item (used on tools when completing actions)
1584 static void DealAbsoluteDmg(ItemBase item, float dmg)
1585 {
1586 item.DecreaseHealth(dmg, false);
1587 }
1588
1589 //Function used to normailze values, enter the used value and the max value (max will become 1)
1590 static float Normalize(int val, int maxVal)
1591 {
1592 if (maxVal == 0)
1593 {
1594 Debug.LogError("Division by 0 is not allowed");
1595 return 0;
1596 }
1597
1598 return val / maxVal;
1599 }
1600
1601 static float Bobbing(float period, float amplitude, float elapsedTime)
1602 {
1603 //Prevent division by 0
1604 if ( period == 0 )
1605 period = 1;
1606
1607 elapsedTime /= period;
1608
1609 float cycle;
1610 cycle += elapsedTime;
1611 cycle = FModulus(cycle, 360);
1612 cycle = Math.Sin(cycle) * amplitude;
1613
1614 return cycle;
1615 }
1616
1617 // DEPRECATED, use Math.ModFloat directly instead
1618 static float FModulus(float x, float y)
1619 {
1620 return Math.ModFloat(x, y);
1621 }
1622
1623 static void RemoveSplint( PlayerBase player )
1624 {
1625 EntityAI entity = player.GetInventory().CreateInInventory("Splint");
1626 if (!entity)
1627 entity = player.SpawnEntityOnGroundOnCursorDir("Splint", 0.5);
1628
1629 EntityAI attachment;
1630 ItemBase new_item = ItemBase.Cast(entity);
1631 Class.CastTo(attachment, player.GetItemOnSlot("Splint_Right"));
1632 if ( attachment && attachment.GetType() == "Splint_Applied" )
1633 {
1634 if (new_item)
1635 {
1636 MiscGameplayFunctions.TransferItemProperties(attachment,new_item);
1637
1638 if (GetGame().IsServer())
1639 {
1640 //Lower health level of splint after use
1641 if (new_item.GetHealthLevel() < 4)
1642 {
1643 int newDmgLevel = new_item.GetHealthLevel() + 1;
1644
1645 float max = new_item.GetMaxHealth("","");
1646
1647 switch ( newDmgLevel )
1648 {
1650 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_BADLY_DAMAGED_VALUE );
1651 break;
1652
1654 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_DAMAGED_VALUE );
1655 break;
1656
1658 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_WORN_VALUE );
1659 break;
1660
1662 new_item.SetHealth( "", "", max * GameConstants.DAMAGE_RUINED_VALUE );
1663 break;
1664
1665 default:
1666 break;
1667 }
1668 }
1669 }
1670 }
1671
1672 attachment.Delete();
1673 }
1674 }
1675
1677 static void TeleportCheck(notnull PlayerBase player, notnull array<ref array<float>> safe_positions)
1678 {
1679 if( player.GetSimulationTimeStamp() < 20 && !player.IsPersistentFlag(PersistentFlag.AREA_PRESENCE) )
1680 {
1681 //simulation time is bellow a threshold, which means the player has recently connected,
1682 //the player does not have the AREA_PRESENCE flag set, which means they were not inside the area when they disconnected,
1683 //that means they just spawned into a contaminated area, lets move them somewhere safe
1684 vector player_pos = player.GetPosition();
1685 vector closest_safe_pos = MiscGameplayFunctions.GetClosestSafePos(player_pos, safe_positions);
1686
1687 if (player_pos!=closest_safe_pos)
1688 {
1689 closest_safe_pos[1] = GetGame().SurfaceY(closest_safe_pos[0], closest_safe_pos[2]);
1690
1691 player.SetPosition( closest_safe_pos );//...so lets teleport them somewhere safe
1692 //DeveloperTeleport.SetPlayerPosition(player, closest_safe_pos);
1693 GetGame().RPCSingleParam(player, ERPCs.RPC_WARNING_TELEPORT, null, true, player.GetIdentity());
1694
1695 PluginAdminLog adminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
1696 if (adminLog)
1697 adminLog.PlayerTeleportedLog(player,player_pos,closest_safe_pos,"Unwillingly spawning in contaminated area.");
1698 }
1699
1700 player.SetPersistentFlag(PersistentFlag.AREA_PRESENCE, false);
1701 }
1702 }
1703
1704 static vector GetClosestSafePos(vector to_pos, notnull array<ref array<float>> positions)
1705 {
1706 vector closest_pos = to_pos;
1707 float smallest_dist = float.MAX;
1708 foreach( array<float> pos:positions)
1709 {
1710 vector vpos = "0 0 0";
1711 vpos[0] = pos[0];
1712 vpos[2] = pos[1];
1713
1714 to_pos[1] = 0;
1715 float dist = vector.DistanceSq(to_pos, vpos);//2d dist sq
1716 if ( dist < smallest_dist)
1717 {
1718 smallest_dist = dist;
1719 closest_pos = vpos;
1720 }
1721 }
1722 return closest_pos;
1723 }
1724
1726 static bool TeleportPlayerToSafeLocation3D(notnull PlayerBase player, vector safePos)
1727 {
1728 vector playerPos = player.GetPosition();
1729 if (playerPos != safePos)
1730 {
1731 player.SetPosition(safePos);
1732 GetGame().RPCSingleParam(player, ERPCs.RPC_WARNING_TELEPORT, null, true, player.GetIdentity());
1733
1734 return true;
1735 }
1736
1737 return false;
1738 }
1739
1740 static void GenerateAINoiseAtPosition(vector position, float lifeTime, NoiseParams noiseParams)
1741 {
1742 if (GetGame().IsServer())
1743 {
1745 if (noise)
1746 {
1747 noise.AddNoiseTarget(position, lifeTime, noiseParams, NoiseAIEvaluate.GetNoiseReduction(GetGame().GetWeather()));
1748 }
1749 }
1750 }
1751
1752 static float GetMinValue(array<float> pArray)
1753 {
1754 float minValue = 0.0;
1755 for (int i = 0; i < pArray.Count(); ++i)
1756 {
1757 if (minValue == 0 || pArray.Get(i) < minValue)
1758 {
1759 minValue = pArray.Get(i);
1760 }
1761 }
1762
1763 return minValue;
1764 }
1765
1766 static float GetMaxValue(array<float> pArray)
1767 {
1768 float maxValue = 0.0;
1769 for (int i = 0; i < pArray.Count(); ++i)
1770 {
1771 if (maxValue == 0 || pArray.Get(i) > maxValue)
1772 {
1773 maxValue = pArray.Get(i);
1774 }
1775 }
1776
1777 return maxValue;
1778 }
1779
1780 static string GetItemDisplayName(string type)
1781 {
1782 return GetGame().ConfigGetTextOut("CfgVehicles " + type + " displayName");
1783 }
1784
1785 static bool IsComponentInSelection(array<Selection> pSelection, string pCompName)
1786 {
1787 if (pSelection.Count() == 0 || pCompName.Length() == 0)
1788 {
1789 return false;
1790 }
1791
1792 for (int i = 0; i < pSelection.Count(); ++i)
1793 {
1794 pCompName.ToLower();
1795 if (pSelection[i] && pSelection[i].GetName() == pCompName)
1796 {
1797 return true;
1798 }
1799 }
1800
1801 return false;
1802 }
1803
1804 static int GetComponentIndex(array<Selection> pSelection, string pCompName)
1805 {
1806 if (!MiscGameplayFunctions.IsComponentInSelection(pSelection, pCompName))
1807 {
1808 return INDEX_NOT_FOUND;
1809 }
1810
1811 for (int i = 0; i < pSelection.Count(); ++i)
1812 {
1813 pCompName.ToLower();
1814 if (pSelection[i] && pSelection[i].GetName() == pCompName)
1815 {
1816 return i;
1817 }
1818 }
1819
1820 return INDEX_NOT_FOUND;
1821 }
1822
1823 static void RemoveAllAttachedChildrenByTypename(notnull EntityAI parent, array<typename> listOfTypenames)
1824 {
1825 if (listOfTypenames.Count() > 0)
1826 {
1827 Object child = Object.Cast(parent.GetChildren());
1828 while (child)
1829 {
1830 Object childToRemove = child;
1831 child = Object.Cast(child.GetSibling());
1832
1833 if (childToRemove.IsAnyInherited(listOfTypenames))
1834 {
1835 vector pos = parent.GetPosition();
1836 parent.RemoveChild(childToRemove, false);
1837
1838 vector m4[4];
1840 m4[3] = pos;
1841 childToRemove.SetTransform(m4);
1842 childToRemove.PlaceOnSurface();
1843 }
1844 }
1845 }
1846 }
1847
1848 static void DeleteAttachedChildrenByTypename(notnull EntityAI parent, array<typename> listOfTypenames)
1849 {
1850 if (listOfTypenames.Count() > 0)
1851 {
1852 Object child = Object.Cast(parent.GetChildren());
1853 while (child)
1854 {
1855 Object childToRemove = child;
1856 child = Object.Cast(child.GetSibling());
1857
1858 if (childToRemove.IsAnyInherited(listOfTypenames))
1859 {
1860 parent.RemoveChild(childToRemove, false);
1861 childToRemove.Delete();
1862 }
1863 }
1864 }
1865 }
1866
1868 static void GetAttachedChildren(IEntity parent, array<IEntity> outputObjects)
1869 {
1870 IEntity child = parent.GetChildren();
1871 while (child)
1872 {
1873 outputObjects.Insert(child);
1874 child = child.GetSibling();
1875 }
1876 }
1877
1878 static void SoakItemInsideParentContainingLiquidAboveThreshold(notnull ItemBase item, notnull ItemBase parent, float liquidQuantityThresholdPercentage = 0.05)
1879 {
1880 if (g_Game.IsServer())
1881 {
1882 if (parent.GetLiquidType() != 0 && parent.GetQuantityNormalized() > liquidQuantityThresholdPercentage && !parent.GetIsFrozen())
1883 item.SetWetMax();
1884 }
1885 }
1886
1888 {
1889 float windMin;
1890 float windMax;
1891 g_Game.GetWeather().GetWindMagnitude().GetLimits(windMin, windMax);
1892 float snowfall = g_Game.GetWeather().GetSnowfall().GetActual();
1893 float value = snowfall + g_Game.GetWeather().GetWindMagnitude().GetActual() / windMax;
1894
1895 return value;
1896 }
1897}
1898
1900{
1901 // @NOTE m_Player == target player - i.e. restrained one
1902 void DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy = false)
1903 {
1905 vector mtx[4];
1906 if (old_item)
1907 old_item.GetTransform(mtx);
1908 else
1909 player.GetTransform(mtx);
1910 gnd.SetGround(NULL, mtx);
1911 OverrideNewLocation(gnd);
1912 }
1913
1914 protected override void RemoveOldItemFromLocation()
1915 {
1916 super.RemoveOldItemFromLocation();
1917 m_Player.GetHumanInventory().OnEntityInHandsDestroyed(m_OldLocation);
1918 }
1919}
1920
1921// This was created since IsObjectObstructed is often called multiple times in one frame
1922// 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
1923class IsObjectObstructedCache // Pretending this is a struct
1924{
1925 // Outside data
1928
1929 // Inside data
1935 ref set<Object> HitObjects = new set<Object>;
1936
1937 void IsObjectObstructedCache(vector rayCastStart, int totalObjects)
1938 {
1939 RaycastStart = rayCastStart;
1940 TotalObjects = totalObjects;
1941 }
1942
1943 // Only inside data
1945 {
1946 ObjectCenterPos = "0 0 0";
1947 ObjectContactPos = "0 0 0";
1948 ObjectContactDir = "0 0 0";
1949 ContactComponent = -1;
1950 HitProxyObjects.Clear();
1951 HitObjects.Clear();
1952 }
1953}
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Определения Inventory.c:22
class LogManager EntityAI
override void OnSuccess(EntityAI new_item)
Определения ActionRestrainTarget.c:221
class ActionTargets ActionTarget
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:3868
proto native int GetComponentIndex()
Определения ActionTargets.c:135
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:8518
PlayerBase m_Player
Определения MiscGameplayFunctions.c:117
ref array< ref RaycastRVResult > HitProxyObjects
Определения MiscGameplayFunctions.c:1934
static bool CanIgnoreDistanceCheck(Object obj)
Определения MiscGameplayFunctions.c:1286
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:1868
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:1584
SPLIT
Определения MiscGameplayFunctions.c:218
static void TransferItemVariables(ItemBase source, ItemBase target, bool exclude_quantity=false)
DEPRECATED.
Определения MiscGameplayFunctions.c:339
static float GetCombinedSnowfallWindValue()
Определения MiscGameplayFunctions.c:1887
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:1726
static float Bobbing(float period, float amplitude, float elapsedTime)
Определения MiscGameplayFunctions.c:1601
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:1927
static void RemoveAllAttachedChildrenByTypename(notnull EntityAI parent, array< typename > listOfTypenames)
Определения MiscGameplayFunctions.c:1823
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:1740
vector ObjectContactDir
Определения MiscGameplayFunctions.c:1932
static vector GetRandomizedPosition(vector targetPos, float radius)
Определения MiscGameplayFunctions.c:1062
static void DealEvinronmentAdjustedDmg(ItemBase item, PlayerBase player, float baseDamage)
Определения MiscGameplayFunctions.c:1564
vector ObjectContactPos
Определения MiscGameplayFunctions.c:1931
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:1930
static vector GetClosestSafePos(vector to_pos, notnull array< ref array< float > > positions)
Определения MiscGameplayFunctions.c:1704
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:1292
static int GetHealthLevelForAmmo(string class_name, float health)
Определения MiscGameplayFunctions.c:659
ref set< Object > HitObjects
Определения MiscGameplayFunctions.c:1935
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:1937
static float GetTypeMaxGlobalHealth(string class_name, string health_type="Health")
Определения MiscGameplayFunctions.c:675
static float Normalize(int val, int maxVal)
Определения MiscGameplayFunctions.c:1590
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:1848
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:1780
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:1785
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:1491
static void IsUnderRoofFromToCalculation(EntityAI entity, out vector from, out vector to, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST)
Определения MiscGameplayFunctions.c:971
static bool IsUnderRoof(EntityAI entity, float height=GameConstants.ROOF_CHECK_RAYCAST_DIST)
Определения MiscGameplayFunctions.c:1001
static float GetHeadingAngle(notnull DayZPlayerImplement player)
Определения MiscGameplayFunctions.c:736
int ContactComponent
Определения MiscGameplayFunctions.c:1933
static bool IsObjectObstructed(Object object, bool doDistanceCheck=false, vector distanceCheckPos="0 0 0", float maxDist=0)
Определения MiscGameplayFunctions.c:1439
static void ThrowEntityFromInventory(notnull EntityAI entity, vector position, float direction[4], vector force, int flags)
Определения MiscGameplayFunctions.c:1154
static void RemoveSplint(PlayerBase player)
Определения MiscGameplayFunctions.c:1623
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:1462
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:1519
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:1448
static void SplitArrayIntoGroupsByDistance(array< Object > objects, array< ref array< Object > > objectGroups, float squaredDistanceDelta)
Определения MiscGameplayFunctions.c:1405
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:1211
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:1944
static float FModulus(float x, float y)
Определения MiscGameplayFunctions.c:1618
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:1677
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:1878
static void ThrowAllItemsInInventory(notnull EntityAI parent, int flags)
Определения MiscGameplayFunctions.c:1121
static void FilterObstructingObjects(array< Object > potentiallyObstructingObjects, out array< Object > obstructingObjects)
Определения MiscGameplayFunctions.c:1273
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
PlayerBase GetPlayer()
Определения ModifierBase.c:51
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:316
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
proto native NoiseSystem GetNoiseSystem()
proto native float SurfaceY(float x, float z)
proto native float ConfigGetFloat(string path)
Get float value from config on path.
proto native void RPCSingleParam(Object target, int rpc_type, Param param, bool guaranteed, PlayerIdentity recipient=null)
see CGame.RPC
string ConfigGetTextOut(string path)
Get string value from config on path.
Определения Game.c:463
proto native void RemoteObjectTreeDelete(Object obj)
RemoteObjectDelete - deletes only remote object (unregisters from network). do not use if not sure wh...
proto void SurfaceUnderObject(notnull Object object, out string type, out int liquidType)
proto native void RemoteObjectTreeCreate(Object obj)
RemoteObjectCreate - postponed registration of network object (and creation of remote object)....
proto native void ConfigGetFloatArray(string path, out TFloatArray values)
Get array of floats from config on path.
proto native Mission GetMission()
static ref TFloatArray ARRAY_FLOAT
Определения UtilityClasses.c:50
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:375
float GetEnergy()
Energy manager: Returns the amount of stored energy this device has.
Определения ComponentEnergyManager.c:1214
void SetEnergy(float new_energy)
Energy manager: Sets stored energy for this device. It ignores the min/max limit!
Определения ComponentEnergyManager.c:525
bool IsSwitchedOn()
Energy manager: Returns state of the switch. Whenever the device is working or not does not matter....
Определения ComponentEnergyManager.c:866
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.
Определения Debug.c:245
Определения Debug.c:2
void DestroyItemInCorpsesHandsAndCreateNewOnGndLambda(EntityAI old_item, string new_item_type, PlayerBase player, bool destroy=false)
Определения MiscGameplayFunctions.c:1902
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
Определения Building.c:6
override bool IsBaseFireplace()
Определения BarrelHoles_ColorBase.c:54
override bool IsIndoorOven()
Определения OvenIndoor.c:159
override bool IsBarrelWithHoles()
Определения BarrelHoles_ColorBase.c:133
Определения constants.c:659
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...
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
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/....
script counterpart to engine's class Inventory
Определения Inventory.c:79
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:29
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
Определения InventoryItem.c:731
Определения EnMath3D.c:28
Определения EnMath.c:7
WorldData GetWorldData()
Определения gameplay.c:743
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:204
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:185
void RemoveNetworkObjectInfo()
Step C. - remove network part of the object @NOTE this operation does not delete the object,...
Определения ReplaceItemWithNewLambdaBase.c:107
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
float GetColdAreaToolDamageModifier()
Определения WorldData.c:262
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
const float MAX
Определения EnConvert.c:99
const float LOWEST
Определения EnConvert.c:100
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:108
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
Определения EnConvert.c:271
static const vector Forward
Определения EnConvert.c:109
static const vector Zero
Определения EnConvert.c:110
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:477
static const vector Up
Определения EnConvert.c:107
Определения EnConvert.c:106
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
proto native CGame GetGame()
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
CollisionFlags
Определения EnDebug.c:141
const float PROJECTED_CURSOR_DISTANCE
Определения constants.c:638
const float ROOF_CHECK_RAYCAST_DIST
Определения constants.c:1009
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
array< string > TStringArray
Определения EnScript.c:685
array< int > TIntArray
Определения EnScript.c:687
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
Определения constants.c:774
const float ENVIRO_ISOLATION_WETFACTOR_WET
Определения constants.c:773
const float ENVIRO_ISOLATION_WETFACTOR_DAMP
Определения constants.c:772
const float ENVIRO_ISOLATION_WETFACTOR_DRENCHED
Определения constants.c:775
const float ENVIRO_ISOLATION_HEALTHFACTOR_RUINED
Определения constants.c:781
const float ENVIRO_ISOLATION_HEALTHFACTOR_DAMAGED
Определения constants.c:779
const float ENVIRO_ISOLATION_HEALTHFACTOR_WORN
Определения constants.c:778
const float ENVIRO_ISOLATION_WETFACTOR_DRY
impact of item wetness to the heat isolation
Определения constants.c:771
const float ENVIRO_ISOLATION_HEALTHFACTOR_PRISTINE
impact of item health (state) to the heat isolation
Определения constants.c:777
const float ENVIRO_ISOLATION_HEALTHFACTOR_B_DAMAGED
Определения constants.c:780
const float DAMAGE_BADLY_DAMAGED_VALUE
Определения constants.c:861
const float DAMAGE_RUINED_VALUE
Определения constants.c:862
const float DAMAGE_DAMAGED_VALUE
Определения constants.c:860
const float DAMAGE_WORN_VALUE
Определения constants.c:859
const int STATE_RUINED
Определения constants.c:846
const int STATE_WORN
Определения constants.c:849
const int STATE_DAMAGED
Определения constants.c:848
const int STATE_BADLY_DAMAGED
Определения constants.c:847
const int STATE_PRISTINE
Определения constants.c:850
const int VARIABLE_QUANTITY
Определения constants.c:626
const float STATE_DRY
Определения constants.c:874
const float STATE_DAMP
Определения constants.c:873
const float STATE_SOAKING_WET
Определения constants.c:871
const float STATE_DRENCHED
Определения constants.c:870
const float STATE_WET
Определения constants.c:872
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
Определения constants.c:220
const string CFG_WEAPONSPATH
Определения constants.c:221
const string CFG_MAGAZINESPATH
Определения constants.c:222
@ NONE
No flags.
Определения EnProfiler.c:11
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