5307{
5309 {
5310 return true;
5311 }
5312};
5313
5314
5315
5317{
5321
5323
5326
5327
5328
5329
5330
5339
5345
5350
5355
5376 protected bool m_IsResultOfSplit
5377
5379
5384
5385
5386
5388
5392
5393
5394
5396
5399
5400
5401
5407
5408
5416
5419
5420
5422
5423
5425
5426
5431
5432
5437
5438
5440
5441
5443 {
5448
5449 if (!
GetGame().IsDedicatedServer())
5450 {
5452 {
5454
5456 {
5458 }
5459 }
5460
5463 }
5464
5465 m_OldLocation = null;
5466
5468 {
5470 }
5471
5472 if (ConfigIsExisting("headSelectionsToHide"))
5473 {
5476 }
5477
5479 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5480 {
5482 }
5483
5485
5486 m_IsResultOfSplit = false;
5487
5489 }
5490
5492 {
5493 super.InitItemVariables();
5494
5500 m_Count = ConfigGetInt(
"count");
5501
5504
5509
5512
5517
5529
5533
5534
5537 if (ConfigIsExisting("canBeSplit"))
5538 {
5541 }
5542
5544 if (ConfigIsExisting("itemBehaviour"))
5546
5547
5550 RegisterNetSyncVariableInt("m_VarLiquidType");
5551 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5552
5553 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5554 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5555 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5556
5557 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5558 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5559 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5560 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5561
5562 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5563 RegisterNetSyncVariableBool("m_IsTakeable");
5564 RegisterNetSyncVariableBool("m_IsHologram");
5565
5568 {
5571 }
5572
5574
5576 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5578
5579 }
5580
5582 {
5584 }
5585
5587 {
5590 {
5595 }
5596 }
5597
5598 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5599 {
5601 {
5604 }
5605
5607 }
5608
5610 {
5616 }
5617
5619
5621 {
5623
5624 if (!action)
5625 {
5626 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5627 return;
5628 }
5629
5631 if (!ai)
5632 {
5634 return;
5635 }
5636
5638 if (!action_array)
5639 {
5640 action_array = new array<ActionBase_Basic>;
5642 }
5643 if (LogManager.IsActionLogEnable())
5644 {
5645 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5646 }
5647
5648 if (action_array.Find(action) != -1)
5649 {
5650 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5651 }
5652 else
5653 {
5654 action_array.Insert(action);
5655 }
5656 }
5657
5659 {
5661 ActionBase action = player.GetActionManager().GetAction(actionName);
5664
5665 if (action_array)
5666 {
5667 action_array.RemoveItem(action);
5668 }
5669 }
5670
5671
5672
5674 {
5675 ActionOverrideData overrideData = new ActionOverrideData();
5679
5681 if (!actionMap)
5682 {
5685 }
5686
5687 actionMap.Insert(this.
Type(), overrideData);
5688
5689 }
5690
5692
5694
5695
5697 {
5700
5703
5704 string config_to_search = "CfgVehicles";
5705 string muzzle_owner_config;
5706
5708 {
5709 if (IsInherited(Weapon))
5710 config_to_search = "CfgWeapons";
5711
5712 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5713
5714 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5715
5717
5718 if (config_OnFire_subclass_count > 0)
5719 {
5720 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5721
5722 for (int i = 0; i < config_OnFire_subclass_count; i++)
5723 {
5724 string particle_class = "";
5726 string config_OnFire_entry = config_OnFire_class + particle_class;
5727 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5728 WPOF_array.Insert(WPOF);
5729 }
5730
5731
5733 }
5734 }
5735
5737 {
5738 config_to_search = "CfgWeapons";
5739 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5740
5741 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5742
5744
5745 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5746 {
5747 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5748
5749 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5750 {
5751 string particle_class2 = "";
5753 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5754 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5755 WPOBE_array.Insert(WPOBE);
5756 }
5757
5758
5760 }
5761 }
5762 }
5763
5764
5766 {
5769
5771 {
5772 string config_to_search = "CfgVehicles";
5773
5774 if (IsInherited(Weapon))
5775 config_to_search = "CfgWeapons";
5776
5777 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5778 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5779
5780 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5781 {
5782
5784
5786 {
5788 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5790 return;
5791 }
5792
5795
5796
5797
5799 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5800
5801 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5802 {
5803 string particle_class = "";
5805 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5807
5808 if (entry_type == CT_CLASS)
5809 {
5810 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5811 WPOOH_array.Insert(WPOF);
5812 }
5813 }
5814
5815
5817 }
5818 }
5819 }
5820
5822 {
5824 }
5825
5827 {
5829 {
5831
5834
5837
5838 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5839 }
5840 }
5841
5843 {
5845 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5846
5848 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5849
5851 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5852
5854 {
5856 }
5857 }
5858
5860 {
5862 }
5863
5865 {
5868 else
5870
5872 {
5875 }
5876 else
5877 {
5880
5883 }
5884
5886 }
5887
5889 {
5891 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5892 }
5893
5895 {
5897 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5899 }
5900
5902 {
5904 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5905 }
5906
5908 {
5911
5912 OverheatingParticle OP = new OverheatingParticle();
5917
5919 }
5920
5922 {
5925
5926 return -1;
5927 }
5928
5930 {
5932 {
5935
5936 for (int i = count; i > 0; --i)
5937 {
5938 int id = i - 1;
5941
5944
5945 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5946 {
5947 if (p)
5948 {
5951 }
5952 }
5953 }
5954 }
5955 }
5956
5958 {
5960 {
5962 {
5963 int id = i - 1;
5965
5966 if (OP)
5967 {
5969
5970 if (p)
5971 {
5973 }
5974
5975 delete OP;
5976 }
5977 }
5978
5981 }
5982 }
5983
5986 {
5987 return 0.0;
5988 }
5989
5990
5992 {
5993 return 250;
5994 }
5995
5997 {
5998 return 0;
5999 }
6000
6003 {
6005 return true;
6006
6007 return false;
6008 }
6009
6012 {
6015
6017 {
6019 }
6020 else
6021 {
6022
6024 }
6025
6027 }
6028
6035 {
6036 return -1;
6037 }
6038
6039
6040
6041
6043 {
6045 {
6047 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6048
6049 if (r_index >= 0)
6050 {
6051 InventoryLocation r_il = new InventoryLocation;
6052 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6053
6054 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6057 {
6058 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6059 }
6061 {
6062 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6063 }
6064
6065 }
6066
6067 player.GetHumanInventory().ClearUserReservedLocation(this);
6068 }
6069
6072 }
6073
6074
6075
6076
6078 {
6079 return ItemBase.m_DebugActionsMask;
6080 }
6081
6083 {
6084 return ItemBase.m_DebugActionsMask & mask;
6085 }
6086
6088 {
6089 ItemBase.m_DebugActionsMask = mask;
6090 }
6091
6093 {
6094 ItemBase.m_DebugActionsMask |= mask;
6095 }
6096
6098 {
6099 ItemBase.m_DebugActionsMask &= ~mask;
6100 }
6101
6103 {
6105 {
6107 }
6108 else
6109 {
6111 }
6112 }
6113
6114
6116 {
6117 if (GetEconomyProfile())
6118 {
6119 float q_max = GetEconomyProfile().GetQuantityMax();
6120 if (q_max > 0)
6121 {
6122 float q_min = GetEconomyProfile().GetQuantityMin();
6123 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6124
6126 {
6127 ComponentEnergyManager comp = GetCompEM();
6129 {
6131 }
6132 }
6134 {
6136
6137 }
6138
6139 }
6140 }
6141 }
6142
6145 {
6146 EntityAI parent = GetHierarchyParent();
6147
6148 if (parent)
6149 {
6150 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6151 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6152 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6153 }
6154 }
6155
6158 {
6159 EntityAI parent = GetHierarchyParent();
6160
6161 if (parent)
6162 {
6163 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6164 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6165 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6166 }
6167 }
6168
6170 {
6171
6172
6173
6174
6176
6178 {
6179 if (ScriptInputUserData.CanStoreInputUserData())
6180 {
6181 ScriptInputUserData ctx = new ScriptInputUserData;
6187 ctx.
Write(use_stack_max);
6190
6192 {
6193 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6194 }
6195 }
6196 }
6197 else if (!
GetGame().IsMultiplayer())
6198 {
6200 }
6201 }
6202
6204 {
6206 }
6207
6209 {
6211 }
6212
6214 {
6216 }
6217
6219 {
6220
6221 return false;
6222 }
6223
6225 {
6226 return false;
6227 }
6228
6232 {
6233 return false;
6234 }
6235
6237 {
6238 return "";
6239 }
6240
6242
6244 {
6245 return false;
6246 }
6247
6249 {
6250 return true;
6251 }
6252
6253
6254
6256 {
6257 return true;
6258 }
6259
6261 {
6262 return true;
6263 }
6264
6266 {
6267 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6269 }
6270
6272 {
6274 }
6275
6277 {
6279 if (!is_being_placed)
6281 SetSynchDirty();
6282 }
6283
6284
6286
6288 {
6290 }
6291
6293 {
6295 }
6296
6298 {
6299 return 1;
6300 }
6301
6303 {
6304 return false;
6305 }
6306
6308 {
6310 SetSynchDirty();
6311 }
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6348 {
6349 super.OnMovedInsideCargo(container);
6350
6351 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6352 }
6353
6354 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6355 {
6356 super.EEItemLocationChanged(oldLoc,newLoc);
6357
6358 PlayerBase new_player = null;
6359 PlayerBase old_player = null;
6360
6361 if (newLoc.GetParent())
6362 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6363
6364 if (oldLoc.GetParent())
6365 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6366
6368 {
6369 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6370
6371 if (r_index >= 0)
6372 {
6373 InventoryLocation r_il = new InventoryLocation;
6374 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6375
6376 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6379 {
6380 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6381 }
6383 {
6384 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6385 }
6386
6387 }
6388 }
6389
6391 {
6392 if (new_player)
6393 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6394
6395 if (new_player == old_player)
6396 {
6397
6398 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6399 {
6401 {
6402 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6403 {
6404 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6405 }
6406 }
6407 else
6408 {
6409 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6410 }
6411 }
6412
6413 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6414 {
6415 int type = oldLoc.GetType();
6417 {
6418 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6419 }
6421 {
6422 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6423 }
6424 }
6425 if (!m_OldLocation)
6426 {
6427 m_OldLocation = new InventoryLocation;
6428 }
6429 m_OldLocation.Copy(oldLoc);
6430 }
6431 else
6432 {
6433 if (m_OldLocation)
6434 {
6435 m_OldLocation.Reset();
6436 }
6437 }
6438
6440 }
6441 else
6442 {
6443 if (new_player)
6444 {
6445 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6446 if (res_index >= 0)
6447 {
6448 InventoryLocation il = new InventoryLocation;
6449 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6451 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6454 {
6455 il.
GetParent().GetOnReleaseLock().Invoke(it);
6456 }
6458 {
6460 }
6461
6462 }
6463 }
6465 {
6466
6468 }
6469
6470 if (m_OldLocation)
6471 {
6472 m_OldLocation.Reset();
6473 }
6474 }
6475 }
6476
6477 override void EOnContact(IEntity other, Contact extra)
6478 {
6480 {
6481 int liquidType = -1;
6483 if (impactSpeed > 0.0)
6484 {
6486 #ifndef SERVER
6488 #else
6490 SetSynchDirty();
6491 #endif
6493 }
6494 }
6495
6496 #ifdef SERVER
6497 if (GetCompEM() && GetCompEM().IsPlugged())
6498 {
6499 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6500 GetCompEM().UnplugThis();
6501 }
6502 #endif
6503 }
6504
6506
6508 {
6510 }
6511
6513 {
6514
6515 }
6516
6518 {
6519 super.OnItemLocationChanged(old_owner, new_owner);
6520
6521 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6522 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6523
6524 if (!relatedPlayer && playerNew)
6525 relatedPlayer = playerNew;
6526
6527 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6528 {
6530 if (actionMgr)
6531 {
6532 ActionBase currentAction = actionMgr.GetRunningAction();
6533 if (currentAction)
6535 }
6536 }
6537
6538 Man ownerPlayerOld = null;
6539 Man ownerPlayerNew = null;
6540
6541 if (old_owner)
6542 {
6543 if (old_owner.
IsMan())
6544 {
6545 ownerPlayerOld = Man.Cast(old_owner);
6546 }
6547 else
6548 {
6549 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6550 }
6551 }
6552 else
6553 {
6555 {
6557
6558 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6559 {
6560 GetCompEM().UnplugThis();
6561 }
6562 }
6563 }
6564
6565 if (new_owner)
6566 {
6567 if (new_owner.
IsMan())
6568 {
6569 ownerPlayerNew = Man.Cast(new_owner);
6570 }
6571 else
6572 {
6573 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6574 }
6575 }
6576
6577 if (ownerPlayerOld != ownerPlayerNew)
6578 {
6579 if (ownerPlayerOld)
6580 {
6581 array<EntityAI> subItemsExit = new array<EntityAI>;
6583 for (int i = 0; i < subItemsExit.Count(); i++)
6584 {
6587 }
6588 }
6589
6590 if (ownerPlayerNew)
6591 {
6592 array<EntityAI> subItemsEnter = new array<EntityAI>;
6594 for (int j = 0; j < subItemsEnter.Count(); j++)
6595 {
6598 }
6599 }
6600 }
6601 else if (ownerPlayerNew != null)
6602 {
6603 PlayerBase nplayer;
6604 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6605 {
6606 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6608 for (int k = 0; k < subItemsUpdate.Count(); k++)
6609 {
6611 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6612 }
6613 }
6614 }
6615
6616 if (old_owner)
6617 old_owner.OnChildItemRemoved(this);
6618 if (new_owner)
6619 new_owner.OnChildItemReceived(this);
6620 }
6621
6622
6624 {
6625 super.EEDelete(parent);
6626 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6627 if (player)
6628 {
6630
6631 if (player.IsAlive())
6632 {
6633 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6634 if (r_index >= 0)
6635 {
6636 InventoryLocation r_il = new InventoryLocation;
6637 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6638
6639 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6642 {
6643 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6644 }
6646 {
6647 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6648 }
6649
6650 }
6651
6652 player.RemoveQuickBarEntityShortcut(this);
6653 }
6654 }
6655 }
6656
6658 {
6659 super.EEKilled(killer);
6660
6663 {
6664 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6665 {
6666 if (IsMagazine())
6667 {
6668 if (Magazine.Cast(this).GetAmmoCount() > 0)
6669 {
6671 }
6672 }
6673 else
6674 {
6676 }
6677 }
6678 }
6679 }
6680
6682 {
6683 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6684
6685 super.OnWasAttached(parent, slot_id);
6686
6689
6691 }
6692
6694 {
6695 super.OnWasDetached(parent, slot_id);
6696
6699 }
6700
6702 {
6703 int idx;
6706
6707 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6708 if (inventory_slots.Count() < 1)
6709 {
6710 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6711 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6712 }
6713 else
6714 {
6715 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6716 }
6717
6718 idx = inventory_slots.Find(slot);
6719 if (idx < 0)
6720 return "";
6721
6722 return attach_types.Get(idx);
6723 }
6724
6726 {
6727 int idx = -1;
6728 string slot;
6729
6732
6733 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6734 if (inventory_slots.Count() < 1)
6735 {
6736 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6737 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6738 }
6739 else
6740 {
6741 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6742 if (detach_types.Count() < 1)
6743 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6744 }
6745
6746 for (int i = 0; i < inventory_slots.Count(); i++)
6747 {
6748 slot = inventory_slots.Get(i);
6749 }
6750
6751 if (slot != "")
6752 {
6753 if (detach_types.Count() == 1)
6754 idx = 0;
6755 else
6756 idx = inventory_slots.Find(slot);
6757 }
6758 if (idx < 0)
6759 return "";
6760
6761 return detach_types.Get(idx);
6762 }
6763
6765 {
6766
6768
6769
6770 float min_time = 1;
6771 float max_time = 3;
6772 float delay = Math.RandomFloat(min_time, max_time);
6773
6774 explode_timer.Run(delay, this, "DoAmmoExplosion");
6775 }
6776
6778 {
6779 Magazine magazine = Magazine.Cast(this);
6780 int pop_sounds_count = 6;
6781 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6782
6783
6784 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6785 string sound_name = pop_sounds[ sound_idx ];
6787
6788
6789 magazine.ServerAddAmmoCount(-1);
6790
6791
6792 float min_temp_to_explode = 100;
6793
6794 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
6795 {
6797 }
6798 }
6799
6800
6801 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6802 {
6803 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6804
6805 const int CHANCE_DAMAGE_CARGO = 4;
6806 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6807 const int CHANCE_DAMAGE_NOTHING = 2;
6808
6810 {
6811 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6812 int chances;
6813 int rnd;
6814
6815 if (GetInventory().GetCargo())
6816 {
6817 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6818 rnd = Math.RandomInt(0,chances);
6819
6820 if (rnd < CHANCE_DAMAGE_CARGO)
6821 {
6823 }
6824 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6825 {
6827 }
6828 }
6829 else
6830 {
6831 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6832 rnd = Math.RandomInt(0,chances);
6833
6834 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6835 {
6837 }
6838 }
6839 }
6840 }
6841
6843 {
6844 if (GetInventory().GetCargo())
6845 {
6846 int item_count = GetInventory().GetCargo().GetItemCount();
6847 if (item_count > 0)
6848 {
6849 int random_pick = Math.RandomInt(0, item_count);
6851 if (!item.IsExplosive())
6852 {
6853 item.AddHealth("","",damage);
6854 return true;
6855 }
6856 }
6857 }
6858 return false;
6859 }
6860
6862 {
6863 int attachment_count = GetInventory().AttachmentCount();
6864 if (attachment_count > 0)
6865 {
6866 int random_pick = Math.RandomInt(0, attachment_count);
6867 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6868 if (!attachment.IsExplosive())
6869 {
6870 attachment.AddHealth("","",damage);
6871 return true;
6872 }
6873 }
6874 return false;
6875 }
6876
6878 {
6880 }
6881
6883 {
6885 return GetInventory().CanRemoveEntity();
6886
6887 return false;
6888 }
6889
6891 {
6892
6894 return false;
6895
6896
6898 return false;
6899
6900
6901
6903 if (delta == 0)
6904 return false;
6905
6906
6907 return true;
6908 }
6909
6911 {
6913 {
6914 if (ScriptInputUserData.CanStoreInputUserData())
6915 {
6916 ScriptInputUserData ctx = new ScriptInputUserData;
6921 ctx.
Write(destination_entity);
6925 }
6926 }
6927 else if (!
GetGame().IsMultiplayer())
6928 {
6930 }
6931 }
6932
6934 {
6935 float split_quantity_new;
6939 InventoryLocation loc = new InventoryLocation;
6940
6941 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6942 {
6944 split_quantity_new = stack_max;
6945 else
6947
6949 {
6950 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6951 if (new_item)
6952 {
6953 new_item.SetResultOfSplit(true);
6954 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6956 new_item.
SetQuantity(split_quantity_new,
false,
true);
6957 }
6958 }
6959 }
6960 else if (destination_entity && slot_id == -1)
6961 {
6962 if (quantity > stack_max)
6963 split_quantity_new = stack_max;
6964 else
6965 split_quantity_new = quantity;
6966
6968 {
6970 {
6973 }
6974
6975 if (new_item)
6976 {
6977 new_item.SetResultOfSplit(true);
6978 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6980 new_item.
SetQuantity(split_quantity_new,
false,
true);
6981 }
6982 }
6983 }
6984 else
6985 {
6986 if (stack_max != 0)
6987 {
6989 {
6991 }
6992
6993 if (split_quantity_new == 0)
6994 {
6995 if (!
GetGame().IsMultiplayer())
6996 player.PhysicalPredictiveDropItem(this);
6997 else
6998 player.ServerDropEntity(this);
6999 return;
7000 }
7001
7003 {
7005
7006 if (new_item)
7007 {
7008 new_item.SetResultOfSplit(true);
7009 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7012 new_item.PlaceOnSurface();
7013 }
7014 }
7015 }
7016 }
7017 }
7018
7020 {
7021 float split_quantity_new;
7025 InventoryLocation loc = new InventoryLocation;
7026
7027 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7028 {
7030 split_quantity_new = stack_max;
7031 else
7033
7035 {
7036 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7037 if (new_item)
7038 {
7039 new_item.SetResultOfSplit(true);
7040 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7042 new_item.
SetQuantity(split_quantity_new,
false,
true);
7043 }
7044 }
7045 }
7046 else if (destination_entity && slot_id == -1)
7047 {
7048 if (quantity > stack_max)
7049 split_quantity_new = stack_max;
7050 else
7051 split_quantity_new = quantity;
7052
7054 {
7056 {
7059 }
7060
7061 if (new_item)
7062 {
7063 new_item.SetResultOfSplit(true);
7064 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7066 new_item.
SetQuantity(split_quantity_new,
false,
true);
7067 }
7068 }
7069 }
7070 else
7071 {
7072 if (stack_max != 0)
7073 {
7075 {
7077 }
7078
7080 {
7082
7083 if (new_item)
7084 {
7085 new_item.SetResultOfSplit(true);
7086 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7089 new_item.PlaceOnSurface();
7090 }
7091 }
7092 }
7093 }
7094 }
7095
7097 {
7099 {
7100 if (ScriptInputUserData.CanStoreInputUserData())
7101 {
7102 ScriptInputUserData ctx = new ScriptInputUserData;
7107 dst.WriteToContext(ctx);
7109 }
7110 }
7111 else if (!
GetGame().IsMultiplayer())
7112 {
7114 }
7115 }
7116
7118 {
7120 {
7121 if (ScriptInputUserData.CanStoreInputUserData())
7122 {
7123 ScriptInputUserData ctx = new ScriptInputUserData;
7128 ctx.
Write(destination_entity);
7134 }
7135 }
7136 else if (!
GetGame().IsMultiplayer())
7137 {
7139 }
7140 }
7141
7143 {
7145 }
7146
7148 {
7150 float split_quantity_new;
7152 if (dst.IsValid())
7153 {
7154 int slot_id = dst.GetSlot();
7156
7157 if (quantity > stack_max)
7158 split_quantity_new = stack_max;
7159 else
7160 split_quantity_new = quantity;
7161
7163 {
7165
7166 if (new_item)
7167 {
7168 new_item.SetResultOfSplit(true);
7169 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7171 new_item.
SetQuantity(split_quantity_new,
false,
true);
7172 }
7173
7174 return new_item;
7175 }
7176 }
7177
7178 return null;
7179 }
7180
7182 {
7184 float split_quantity_new;
7186 if (destination_entity)
7187 {
7189 if (quantity > stackable)
7190 split_quantity_new = stackable;
7191 else
7192 split_quantity_new = quantity;
7193
7195 {
7196 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7197 if (new_item)
7198 {
7199 new_item.SetResultOfSplit(true);
7200 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7202 new_item.
SetQuantity(split_quantity_new,
false,
true);
7203 }
7204 }
7205 }
7206 }
7207
7209 {
7211 {
7212 if (ScriptInputUserData.CanStoreInputUserData())
7213 {
7214 ScriptInputUserData ctx = new ScriptInputUserData;
7219 ItemBase destination_entity =
this;
7220 ctx.
Write(destination_entity);
7224 }
7225 }
7226 else if (!
GetGame().IsMultiplayer())
7227 {
7229 }
7230 }
7231
7233 {
7235 float split_quantity_new;
7237 if (player)
7238 {
7240 if (quantity > stackable)
7241 split_quantity_new = stackable;
7242 else
7243 split_quantity_new = quantity;
7244
7246 {
7247 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7248 new_item =
ItemBase.Cast(in_hands);
7249 if (new_item)
7250 {
7251 new_item.SetResultOfSplit(true);
7252 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7254 new_item.SetQuantity(split_quantity_new, false, true);
7255 }
7256 }
7257 }
7258 }
7259
7261 {
7263 float split_quantity_new = Math.Floor(quantity * 0.5);
7264
7266 return;
7267
7269
7270 if (new_item)
7271 {
7272 if (new_item.GetQuantityMax() < split_quantity_new)
7273 {
7274 split_quantity_new = new_item.GetQuantityMax();
7275 }
7276
7277 new_item.SetResultOfSplit(true);
7278 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7279
7281 {
7284 }
7285 else
7286 {
7288 new_item.
SetQuantity(split_quantity_new,
false,
true);
7289 }
7290 }
7291 }
7292
7294 {
7296 float split_quantity_new = Math.Floor(quantity / 2);
7297
7299 return;
7300
7301 InventoryLocation invloc = new InventoryLocation;
7303
7305 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7306
7307 if (new_item)
7308 {
7309 if (new_item.GetQuantityMax() < split_quantity_new)
7310 {
7311 split_quantity_new = new_item.GetQuantityMax();
7312 }
7314 {
7317 }
7318 else if (split_quantity_new > 1)
7319 {
7321 new_item.
SetQuantity(split_quantity_new,
false,
true);
7322 }
7323 }
7324 }
7325
7328 {
7329 SetWeightDirty();
7331
7332 if (parent)
7333 parent.OnAttachmentQuantityChangedEx(this, delta);
7334
7336 {
7338 {
7340 }
7342 {
7343 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7345 }
7346 }
7347
7348 }
7349
7352 {
7353
7354 }
7355
7358 {
7360 }
7361
7363 {
7364 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7365
7367 {
7368 if (newLevel == GameConstants.STATE_RUINED)
7369 {
7371 EntityAI parent = GetHierarchyParent();
7372 if (parent && parent.IsFireplace())
7373 {
7374 CargoBase cargo = GetInventory().GetCargo();
7375 if (cargo)
7376 {
7378 {
7380 }
7381 }
7382 }
7383 }
7384
7386 {
7387
7389 return;
7390 }
7391
7392 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7393 {
7395 }
7396 }
7397 }
7398
7399
7401 {
7402 super.OnRightClick();
7403
7405 {
7407 {
7408 if (ScriptInputUserData.CanStoreInputUserData())
7409 {
7410 EntityAI root = GetHierarchyRoot();
7411 Man playerOwner = GetHierarchyRootPlayer();
7412 InventoryLocation dst = new InventoryLocation;
7413
7414
7415 if (!playerOwner && root && root == this)
7416 {
7418 }
7419 else
7420 {
7421
7422 GetInventory().GetCurrentInventoryLocation(dst);
7424 {
7427 {
7429 }
7430 else
7431 {
7433
7434
7435 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7436 {
7438 }
7439 else
7440 {
7441 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7442 }
7443 }
7444 }
7445 }
7446
7447 ScriptInputUserData ctx = new ScriptInputUserData;
7455 }
7456 }
7457 else if (!
GetGame().IsMultiplayer())
7458 {
7460 }
7461 }
7462 }
7463
7465 {
7466 if (root)
7467 {
7468 vector m4[4];
7469 root.GetTransform(m4);
7470 dst.SetGround(this, m4);
7471 }
7472 else
7473 {
7474 GetInventory().GetCurrentInventoryLocation(dst);
7475 }
7476 }
7477
7478 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7479 {
7480
7481 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7482 return false;
7483
7484 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7485 return false;
7486
7487
7489 return false;
7490
7491
7492 Magazine mag = Magazine.Cast(this);
7493 if (mag)
7494 {
7495 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7496 return false;
7497
7498 if (stack_max_limit)
7499 {
7500 Magazine other_mag = Magazine.Cast(other_item);
7501 if (other_item)
7502 {
7503 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7504 return false;
7505 }
7506
7507 }
7508 }
7509 else
7510 {
7511
7513 return false;
7514
7516 return false;
7517 }
7518
7519 PlayerBase player = null;
7520 if (CastTo(player, GetHierarchyRootPlayer()))
7521 {
7522 if (player.GetInventory().HasAttachment(this))
7523 return false;
7524
7525 if (player.IsItemsToDelete())
7526 return false;
7527 }
7528
7529 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7530 return false;
7531
7532 int slotID;
7534 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7535 return false;
7536
7537 return true;
7538 }
7539
7541 {
7543 }
7544
7546 {
7547 return m_IsResultOfSplit;
7548 }
7549
7551 {
7552 m_IsResultOfSplit = value;
7553 }
7554
7556 {
7558 }
7559
7561 {
7562 float other_item_quantity = other_item.GetQuantity();
7563 float this_free_space;
7564
7566
7568
7569 if (other_item_quantity > this_free_space)
7570 {
7571 return this_free_space;
7572 }
7573 else
7574 {
7575 return other_item_quantity;
7576 }
7577 }
7578
7580 {
7582 }
7583
7585 {
7587 return;
7588
7589 if (!IsMagazine() && other_item)
7590 {
7592 if (quantity_used != 0)
7593 {
7594 float hp1 = GetHealth01("","");
7595 float hp2 = other_item.GetHealth01("","");
7596 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7597 hpResult = hpResult / (
GetQuantity() + quantity_used);
7598
7599 hpResult *= GetMaxHealth();
7600 Math.Round(hpResult);
7601 SetHealth("", "Health", hpResult);
7602
7604 other_item.AddQuantity(-quantity_used);
7605 }
7606 }
7608 }
7609
7611 {
7612 #ifdef SERVER
7613 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7614 GetHierarchyParent().IncreaseLifetimeUp();
7615 #endif
7616 };
7617
7619 {
7620 PlayerBase p = PlayerBase.Cast(player);
7621
7622 array<int> recipesIds = p.m_Recipes;
7623 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7624 if (moduleRecipesManager)
7625 {
7626 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7627 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7628 }
7629
7630 for (int i = 0;i < recipesIds.Count(); i++)
7631 {
7632 int key = recipesIds.Get(i);
7633 string recipeName = moduleRecipesManager.GetRecipeName(key);
7635 }
7636 }
7637
7638
7639 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7640 {
7641 super.GetDebugActions(outputList);
7642
7643
7649
7650
7655
7660
7661
7665
7666
7668 {
7672 }
7673
7676
7677
7681
7683
7684 InventoryLocation loc = new InventoryLocation();
7685 GetInventory().GetCurrentInventoryLocation(loc);
7687 {
7688 if (Gizmo_IsSupported())
7691 }
7692
7694 }
7695
7696
7697
7698
7700 {
7701 super.OnAction(action_id, player, ctx);
7702
7704 {
7705 switch (action_id)
7706 {
7709 return true;
7712 return true;
7713 }
7714 }
7715
7717 {
7718 switch (action_id)
7719 {
7721 Delete();
7722 return true;
7723 }
7724 }
7725
7726 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7727 {
7728 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7729 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7730 PlayerBase p = PlayerBase.Cast(player);
7731 if (
EActions.RECIPES_RANGE_START < 1000)
7732 {
7733 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7734 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7735 }
7736 }
7737 #ifndef SERVER
7738 else if (action_id ==
EActions.WATCH_PLAYER)
7739 {
7740 PluginDeveloper.SetDeveloperItemClientEx(player);
7741 }
7742 #endif
7744 {
7745 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7746 {
7747 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7748 OnDebugButtonPressServer(id + 1);
7749 }
7750
7751 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7752 {
7753 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7755 }
7756
7757 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7758 {
7759 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7761 }
7762
7763 else if (action_id ==
EActions.ADD_QUANTITY)
7764 {
7765 if (IsMagazine())
7766 {
7767 Magazine mag = Magazine.Cast(this);
7768 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7769 }
7770 else
7771 {
7773 }
7774
7775 if (m_EM)
7776 {
7777 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7778 }
7779
7780 }
7781
7782 else if (action_id ==
EActions.REMOVE_QUANTITY)
7783 {
7784 if (IsMagazine())
7785 {
7786 Magazine mag2 = Magazine.Cast(this);
7787 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7788 }
7789 else
7790 {
7792 }
7793 if (m_EM)
7794 {
7795 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7796 }
7797
7798 }
7799
7800 else if (action_id ==
EActions.SET_QUANTITY_0)
7801 {
7803
7804 if (m_EM)
7805 {
7806 m_EM.SetEnergy(0);
7807 }
7808 }
7809
7810 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7811 {
7813
7814 if (m_EM)
7815 {
7816 m_EM.SetEnergy(m_EM.GetEnergyMax());
7817 }
7818 }
7819
7820 else if (action_id ==
EActions.ADD_HEALTH)
7821 {
7822 AddHealth("","",GetMaxHealth("","Health")/5);
7823 }
7824 else if (action_id ==
EActions.REMOVE_HEALTH)
7825 {
7826 AddHealth("","",-GetMaxHealth("","Health")/5);
7827 }
7828 else if (action_id ==
EActions.DESTROY_HEALTH)
7829 {
7830 SetHealth01("","",0);
7831 }
7832 else if (action_id ==
EActions.WATCH_ITEM)
7833 {
7835 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7836 #ifdef DEVELOPER
7837 SetDebugDeveloper_item(this);
7838 #endif
7839 }
7840
7841 else if (action_id ==
EActions.ADD_TEMPERATURE)
7842 {
7843 AddTemperature(20);
7844
7845 }
7846
7847 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7848 {
7849 AddTemperature(-20);
7850
7851 }
7852
7853 else if (action_id ==
EActions.FLIP_FROZEN)
7854 {
7855 SetFrozen(!GetIsFrozen());
7856
7857 }
7858
7859 else if (action_id ==
EActions.ADD_WETNESS)
7860 {
7862
7863 }
7864
7865 else if (action_id ==
EActions.REMOVE_WETNESS)
7866 {
7868
7869 }
7870
7871 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7872 {
7875
7876
7877 }
7878
7879 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7880 {
7883 }
7884
7885 else if (action_id ==
EActions.MAKE_SPECIAL)
7886 {
7887 auto debugParams = DebugSpawnParams.WithPlayer(player);
7888 OnDebugSpawnEx(debugParams);
7889 }
7890
7891 }
7892
7893
7894 return false;
7895 }
7896
7897
7898
7899
7903
7906
7907
7908
7910 {
7911 return false;
7912 }
7913
7914
7916 {
7917 return true;
7918 }
7919
7920
7922 {
7923 return true;
7924 }
7925
7926
7927
7929 {
7930 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7932 }
7933
7936 {
7937 return null;
7938 }
7939
7941 {
7942 return false;
7943 }
7944
7946 {
7947 return false;
7948 }
7949
7953
7954
7956 {
7957 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7958 return module_repairing.CanRepair(this, item_repair_kit);
7959 }
7960
7961
7962 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7963 {
7964 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7965 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7966 }
7967
7968
7970 {
7971
7972
7973
7974
7975
7976
7977
7978
7979 return 1;
7980 }
7981
7982
7983
7985 {
7987 }
7988
7989
7990
7992 {
7994 }
7995
7996
8005 {
8006 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8007
8008 if (player)
8009 {
8010 player.MessageStatus(text);
8011 }
8012 }
8013
8014
8023 {
8024 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8025
8026 if (player)
8027 {
8028 player.MessageAction(text);
8029 }
8030 }
8031
8032
8041 {
8042 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8043
8044 if (player)
8045 {
8046 player.MessageFriendly(text);
8047 }
8048 }
8049
8050
8059 {
8060 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8061
8062 if (player)
8063 {
8064 player.MessageImportant(text);
8065 }
8066 }
8067
8069 {
8070 return true;
8071 }
8072
8073
8074 override bool KindOf(
string tag)
8075 {
8076 bool found = false;
8077 string item_name = this.
GetType();
8080
8081 int array_size = item_tag_array.Count();
8082 for (int i = 0; i < array_size; i++)
8083 {
8084 if (item_tag_array.Get(i) == tag)
8085 {
8086 found = true;
8087 break;
8088 }
8089 }
8090 return found;
8091 }
8092
8093
8095 {
8096
8097 super.OnRPC(sender, rpc_type,ctx);
8098
8099
8100 switch (rpc_type)
8101 {
8102 #ifndef SERVER
8103 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8104 Param2<bool, string> p = new Param2<bool, string>(false, "");
8105
8107 return;
8108
8109 bool play = p.param1;
8110 string soundSet = p.param2;
8111
8112 if (play)
8113 {
8115 {
8117 {
8119 }
8120 }
8121 else
8122 {
8124 }
8125 }
8126 else
8127 {
8129 }
8130
8131 break;
8132 #endif
8133
8134 }
8135
8137 {
8139 }
8140 }
8141
8142
8143
8144
8146 {
8147 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8148 return plugin.GetID(
name);
8149 }
8150
8152 {
8153 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8154 return plugin.GetName(id);
8155 }
8156
8159 {
8160
8161
8162 int varFlags;
8163 if (!ctx.
Read(varFlags))
8164 return;
8165
8166 if (varFlags & ItemVariableFlags.FLOAT)
8167 {
8169 }
8170 }
8171
8173 {
8174
8175 super.SerializeNumericalVars(floats_out);
8176
8177
8178
8180 {
8182 }
8183
8185 {
8187 }
8188
8190 {
8192 }
8193
8195 {
8200 }
8201
8203 {
8205 }
8206 }
8207
8209 {
8210
8211 super.DeSerializeNumericalVars(floats);
8212
8213
8214 int index = 0;
8215 int mask = Math.Round(floats.Get(index));
8216
8217 index++;
8218
8220 {
8222 {
8224 }
8225 else
8226 {
8227 float quantity = floats.Get(index);
8229 }
8230 index++;
8231 }
8232
8234 {
8235 float wet = floats.Get(index);
8237 index++;
8238 }
8239
8241 {
8242 int liquidtype = Math.Round(floats.Get(index));
8244 index++;
8245 }
8246
8248 {
8250 index++;
8252 index++;
8254 index++;
8256 index++;
8257 }
8258
8260 {
8261 int cleanness = Math.Round(floats.Get(index));
8263 index++;
8264 }
8265 }
8266
8268 {
8269 super.WriteVarsToCTX(ctx);
8270
8271
8273 {
8275 }
8276
8278 {
8280 }
8281
8283 {
8285 }
8286
8288 {
8289 int r,g,b,a;
8295 }
8296
8298 {
8300 }
8301 }
8302
8304 {
8305 if (!super.ReadVarsFromCTX(ctx,version))
8306 return false;
8307
8308 int intValue;
8309 float value;
8310
8311 if (version < 140)
8312 {
8313 if (!ctx.
Read(intValue))
8314 return false;
8315
8316 m_VariablesMask = intValue;
8317 }
8318
8320 {
8321 if (!ctx.
Read(value))
8322 return false;
8323
8325 {
8327 }
8328 else
8329 {
8331 }
8332 }
8333
8334 if (version < 140)
8335 {
8337 {
8338 if (!ctx.
Read(value))
8339 return false;
8340 SetTemperatureDirect(value);
8341 }
8342 }
8343
8345 {
8346 if (!ctx.
Read(value))
8347 return false;
8349 }
8350
8352 {
8353 if (!ctx.
Read(intValue))
8354 return false;
8356 }
8357
8359 {
8360 int r,g,b,a;
8362 return false;
8364 return false;
8366 return false;
8368 return false;
8369
8371 }
8372
8374 {
8375 if (!ctx.
Read(intValue))
8376 return false;
8378 }
8379
8380 if (version >= 138 && version < 140)
8381 {
8383 {
8384 if (!ctx.
Read(intValue))
8385 return false;
8386 SetFrozen(intValue);
8387 }
8388 }
8389
8390 return true;
8391 }
8392
8393
8395 {
8398 {
8400 }
8401
8402 if (!super.OnStoreLoad(ctx, version))
8403 {
8405 return false;
8406 }
8407
8408 if (version >= 114)
8409 {
8410 bool hasQuickBarIndexSaved;
8411
8412 if (!ctx.
Read(hasQuickBarIndexSaved))
8413 {
8415 return false;
8416 }
8417
8418 if (hasQuickBarIndexSaved)
8419 {
8420 int itmQBIndex;
8421
8422
8423 if (!ctx.
Read(itmQBIndex))
8424 {
8426 return false;
8427 }
8428
8429 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8430 if (itmQBIndex != -1 && parentPlayer)
8431 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8432 }
8433 }
8434 else
8435 {
8436
8437 PlayerBase player;
8438 int itemQBIndex;
8439 if (version ==
int.
MAX)
8440 {
8441 if (!ctx.
Read(itemQBIndex))
8442 {
8444 return false;
8445 }
8446 }
8447 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8448 {
8449
8450 if (!ctx.
Read(itemQBIndex))
8451 {
8453 return false;
8454 }
8455 if (itemQBIndex != -1 && player)
8456 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8457 }
8458 }
8459
8460 if (version < 140)
8461 {
8462
8463 if (!LoadVariables(ctx, version))
8464 {
8466 return false;
8467 }
8468 }
8469
8470
8472 {
8474 return false;
8475 }
8476 if (version >= 132)
8477 {
8479 if (raib)
8480 {
8482 {
8484 return false;
8485 }
8486 }
8487 }
8488
8490 return true;
8491 }
8492
8493
8494
8496 {
8497 super.OnStoreSave(ctx);
8498
8499 PlayerBase player;
8500 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8501 {
8503
8504 int itemQBIndex = -1;
8505 itemQBIndex = player.FindQuickBarEntityIndex(this);
8506 ctx.
Write(itemQBIndex);
8507 }
8508 else
8509 {
8511 }
8512
8514
8516 if (raib)
8517 {
8519 }
8520 }
8521
8522
8524 {
8525 super.AfterStoreLoad();
8526
8528 {
8530 }
8531
8533 {
8536 }
8537 }
8538
8540 {
8541 super.EEOnAfterLoad();
8542
8544 {
8546 }
8547
8550 }
8551
8553 {
8554 return false;
8555 }
8556
8557
8558
8560 {
8562 {
8563 #ifdef PLATFORM_CONSOLE
8564
8566 {
8568 if (menu)
8569 {
8571 }
8572 }
8573 #endif
8574 }
8575
8577 {
8580 }
8581
8583 {
8584 SetWeightDirty();
8586 }
8588 {
8591 }
8592
8594 {
8597 }
8599 {
8602 }
8603
8604 super.OnVariablesSynchronized();
8605 }
8606
8607
8608
8610 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8611 {
8612 if (!IsServerCheck(allow_client))
8613 return false;
8614
8616 return false;
8617
8620
8621 if (value <= (min + 0.001))
8622 value = min;
8623
8624 if (value == min)
8625 {
8626 if (destroy_config)
8627 {
8628 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8629 if (dstr)
8630 {
8632 this.Delete();
8633 return true;
8634 }
8635 }
8636 else if (destroy_forced)
8637 {
8639 this.Delete();
8640 return true;
8641 }
8642
8644 }
8645
8648
8650 {
8652
8653 if (delta)
8655 }
8656
8658
8659 return false;
8660 }
8661
8662
8664 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8665 {
8667 }
8668
8670 {
8673 }
8674
8676 {
8679 }
8680
8682 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8683 {
8684 float value_clamped = Math.Clamp(value, 0, 1);
8686 SetQuantity(result, destroy_config, destroy_forced);
8687 }
8688
8689
8692 {
8694 }
8695
8697 {
8699 }
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8711 {
8712 int slot = -1;
8713 if (GetInventory())
8714 {
8715 InventoryLocation il = new InventoryLocation;
8716 GetInventory().GetCurrentInventoryLocation(il);
8718 }
8719
8721 }
8722
8724 {
8725 float quantity_max = 0;
8726
8728 {
8729 if (attSlotID != -1)
8730 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8731
8732 if (quantity_max <= 0)
8734 }
8735
8736 if (quantity_max <= 0)
8738
8739 return quantity_max;
8740 }
8741
8743 {
8745 }
8746
8748 {
8750 }
8751
8752
8754 {
8756 }
8757
8759 {
8761 }
8762
8764 {
8766 }
8767
8768
8770 {
8771
8772 float weightEx = GetWeightEx();
8773 float special = GetInventoryAndCargoWeight();
8774 return weightEx - special;
8775 }
8776
8777
8779 {
8781 }
8782
8784 {
8786 {
8787 #ifdef DEVELOPER
8788 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8789 {
8790 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8792 }
8793 #endif
8794
8796 }
8797 else if (HasEnergyManager())
8798 {
8799 #ifdef DEVELOPER
8800 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8801 {
8802 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8803 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8804 }
8805 #endif
8806 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
8807 }
8808 else
8809 {
8810 #ifdef DEVELOPER
8811 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8812 {
8813 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8814 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8815 }
8816 #endif
8817 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
8818 }
8819 }
8820
8823 {
8824 int item_count = 0;
8826
8827 if (GetInventory().GetCargo() != NULL)
8828 {
8829 item_count = GetInventory().GetCargo().GetItemCount();
8830 }
8831
8832 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8833 {
8834 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8835 if (item)
8836 item_count += item.GetNumberOfItems();
8837 }
8838 return item_count;
8839 }
8840
8843 {
8844 float weight = 0;
8845 float wetness = 1;
8846 if (include_wetness)
8849 {
8850 weight = wetness * m_ConfigWeight;
8851 }
8853 {
8854 weight = 1;
8855 }
8856 return weight;
8857 }
8858
8859
8860
8862 {
8863 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8864 {
8865 GameInventory inv = GetInventory();
8866 array<EntityAI> items = new array<EntityAI>;
8868 for (int i = 0; i < items.Count(); i++)
8869 {
8871 if (item)
8872 {
8874 }
8875 }
8876 }
8877 }
8878
8879
8880
8881
8883 {
8884 float energy = 0;
8885 if (HasEnergyManager())
8886 {
8887 energy = GetCompEM().GetEnergy();
8888 }
8889 return energy;
8890 }
8891
8892
8894 {
8895 super.OnEnergyConsumed();
8896
8898 }
8899
8901 {
8902 super.OnEnergyAdded();
8903
8905 }
8906
8907
8909 {
8910 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8911 {
8913 {
8914 float energy_0to1 = GetCompEM().GetEnergy0To1();
8916 }
8917 }
8918 }
8919
8920
8922 {
8923 return ConfigGetFloat("heatIsolation");
8924 }
8925
8927 {
8929 }
8930
8932 {
8933 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8934 if (
GetGame().ConfigIsExisting(paramPath))
8936
8937 return 0.0;
8938 }
8939
8941 {
8942 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8943 if (
GetGame().ConfigIsExisting(paramPath))
8945
8946 return 0.0;
8947 }
8948
8949 override void SetWet(
float value,
bool allow_client =
false)
8950 {
8951 if (!IsServerCheck(allow_client))
8952 return;
8953
8956
8958
8959 m_VarWet = Math.Clamp(value, min, max);
8960
8962 {
8965 }
8966 }
8967
8968 override void AddWet(
float value)
8969 {
8971 }
8972
8974 {
8976 }
8977
8979 {
8981 }
8982
8984 {
8986 }
8987
8989 {
8991 }
8992
8994 {
8996 }
8997
8999 {
9002 if (newLevel != oldLevel)
9003 {
9005 }
9006 }
9007
9009 {
9010 SetWeightDirty();
9011 }
9012
9014 {
9015 return GetWetLevelInternal(
m_VarWet);
9016 }
9017
9018
9019
9021 {
9023 }
9024
9026 {
9028 }
9029
9031 {
9033 }
9034
9036 {
9038 }
9039
9040
9041
9043 {
9044 if (ConfigIsExisting("itemModelLength"))
9045 {
9046 return ConfigGetFloat("itemModelLength");
9047 }
9048 return 0;
9049 }
9050
9052 {
9053 if (ConfigIsExisting("itemAttachOffset"))
9054 {
9055 return ConfigGetFloat("itemAttachOffset");
9056 }
9057 return 0;
9058 }
9059
9060 override void SetCleanness(
int value,
bool allow_client =
false)
9061 {
9062 if (!IsServerCheck(allow_client))
9063 return;
9064
9066
9068
9071 }
9072
9074 {
9076 }
9077
9079 {
9080 return true;
9081 }
9082
9083
9084
9085
9087 {
9089 }
9090
9092 {
9094 }
9095
9096
9097
9098
9099 override void SetColor(
int r,
int g,
int b,
int a)
9100 {
9106 }
9108 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9109 {
9114 }
9115
9117 {
9119 }
9120
9123 {
9124 int r,g,b,a;
9126 r = r/255;
9127 g = g/255;
9128 b = b/255;
9129 a = a/255;
9130 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9131 }
9132
9133
9134
9135 override void SetLiquidType(
int value,
bool allow_client =
false)
9136 {
9137 if (!IsServerCheck(allow_client))
9138 return;
9139
9144 }
9145
9147 {
9148 return ConfigGetInt("varLiquidTypeInit");
9149 }
9150
9152 {
9154 }
9155
9157 {
9159 SetFrozen(false);
9160 }
9161
9164 {
9165 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9166 }
9167
9168
9171 {
9172 PlayerBase nplayer;
9173 if (PlayerBase.CastTo(nplayer, player))
9174 {
9176
9177 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9178 }
9179 }
9180
9181
9184 {
9185 PlayerBase nplayer;
9186 if (PlayerBase.CastTo(nplayer,player))
9187 {
9188
9189 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9190
9191 }
9192
9193
9194 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9195
9196
9197 if (HasEnergyManager())
9198 {
9199 GetCompEM().UpdatePlugState();
9200 }
9201 }
9202
9203
9205 {
9206 super.OnPlacementStarted(player);
9207
9209 }
9210
9211 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9212 {
9214 {
9215 m_AdminLog.OnPlacementComplete(player,
this);
9216 }
9217
9218 super.OnPlacementComplete(player, position, orientation);
9219 }
9220
9221
9222
9223
9224
9226 {
9228 {
9229 return true;
9230 }
9231 else
9232 {
9233 return false;
9234 }
9235 }
9236
9237
9239 {
9241 {
9243 }
9244 }
9245
9246
9248 {
9250 }
9251
9253 {
9255 }
9256
9257 override void InsertAgent(
int agent,
float count = 1)
9258 {
9259 if (count < 1)
9260 return;
9261
9263 }
9264
9267 {
9269 }
9270
9271
9273 {
9275 }
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9319 {
9321 return false;
9322 return true;
9323 }
9324
9326 {
9327
9329 }
9330
9331
9334 {
9335 super.CheckForRoofLimited(timeTresholdMS);
9336
9338 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9339 {
9340 m_PreviousRoofTestTime = time;
9341 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9342 }
9343 }
9344
9345
9347 {
9349 {
9350 return 0;
9351 }
9352
9353 if (GetInventory().GetAttachmentSlotsCount() != 0)
9354 {
9355 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9356 if (filter)
9357 return filter.GetProtectionLevel(type, false, system);
9358 else
9359 return 0;
9360 }
9361
9362 string subclassPath, entryName;
9363
9364 switch (type)
9365 {
9367 entryName = "biological";
9368 break;
9370 entryName = "chemical";
9371 break;
9372 default:
9373 entryName = "biological";
9374 break;
9375 }
9376
9377 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9378
9380 }
9381
9382
9383
9386 {
9387 if (!IsMagazine())
9389
9391 }
9392
9393
9394
9395
9396
9401 {
9402 return true;
9403 }
9404
9406 {
9408 }
9409
9410
9411
9412
9413
9415 {
9416 if (parent)
9417 {
9418 if (parent.IsInherited(DayZInfected))
9419 return true;
9420
9421 if (!parent.IsRuined())
9422 return true;
9423 }
9424
9425 return true;
9426 }
9427
9429 {
9430 if (!super.CanPutAsAttachment(parent))
9431 {
9432 return false;
9433 }
9434
9435 if (!IsRuined() && !parent.IsRuined())
9436 {
9437 return true;
9438 }
9439
9440 return false;
9441 }
9442
9444 {
9445
9446
9447
9448
9449 return super.CanReceiveItemIntoCargo(item);
9450 }
9451
9453 {
9454
9455
9456
9457
9458 GameInventory attachmentInv = attachment.GetInventory();
9460 {
9461 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9462 return false;
9463 }
9464
9465 InventoryLocation loc = new InventoryLocation();
9466 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9467 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9468 return false;
9469
9470 return super.CanReceiveAttachment(attachment, slotId);
9471 }
9472
9474 {
9475 if (!super.CanReleaseAttachment(attachment))
9476 return false;
9477
9478 return GetInventory().AreChildrenAccessible();
9479 }
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9502 {
9503 int id = muzzle_owner.GetMuzzleID();
9504 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9505
9506 if (WPOF_array)
9507 {
9508 for (int i = 0; i < WPOF_array.Count(); i++)
9509 {
9510 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9511
9512 if (WPOF)
9513 {
9514 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9515 }
9516 }
9517 }
9518 }
9519
9520
9522 {
9523 int id = muzzle_owner.GetMuzzleID();
9525
9526 if (WPOBE_array)
9527 {
9528 for (int i = 0; i < WPOBE_array.Count(); i++)
9529 {
9530 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9531
9532 if (WPOBE)
9533 {
9534 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9535 }
9536 }
9537 }
9538 }
9539
9540
9542 {
9543 int id = muzzle_owner.GetMuzzleID();
9544 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9545
9546 if (WPOOH_array)
9547 {
9548 for (int i = 0; i < WPOOH_array.Count(); i++)
9549 {
9550 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9551
9552 if (WPOOH)
9553 {
9554 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9555 }
9556 }
9557 }
9558 }
9559
9560
9562 {
9563 int id = muzzle_owner.GetMuzzleID();
9564 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9565
9566 if (WPOOH_array)
9567 {
9568 for (int i = 0; i < WPOOH_array.Count(); i++)
9569 {
9570 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9571
9572 if (WPOOH)
9573 {
9574 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9575 }
9576 }
9577 }
9578 }
9579
9580
9582 {
9583 int id = muzzle_owner.GetMuzzleID();
9584 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9585
9586 if (WPOOH_array)
9587 {
9588 for (int i = 0; i < WPOOH_array.Count(); i++)
9589 {
9590 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9591
9592 if (WPOOH)
9593 {
9594 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9595 }
9596 }
9597 }
9598 }
9599
9600
9601
9603 {
9605 {
9606 return true;
9607 }
9608
9609 return false;
9610 }
9611
9613 {
9615 {
9616 return true;
9617 }
9618
9619 return false;
9620 }
9621
9623 {
9625 {
9626 return true;
9627 }
9628
9629 return false;
9630 }
9631
9633 {
9634 return false;
9635 }
9636
9639 {
9640 return UATimeSpent.DEFAULT_DEPLOY;
9641 }
9642
9643
9644
9645
9647 {
9649 SetSynchDirty();
9650 }
9651
9653 {
9655 }
9656
9657
9659 {
9660 return false;
9661 }
9662
9665 {
9666 string att_type = "None";
9667
9668 if (ConfigIsExisting("soundAttType"))
9669 {
9670 att_type = ConfigGetString("soundAttType");
9671 }
9672
9674 }
9675
9677 {
9679 }
9680
9681
9682
9683
9684
9690
9692 {
9695
9697 }
9698
9699
9701 {
9703 return;
9704
9706
9709
9712
9713 SoundParameters params = new SoundParameters();
9717 }
9718
9719
9721 {
9723 return;
9724
9726 SetSynchDirty();
9727
9730 }
9731
9732
9734 {
9736 return;
9737
9739 SetSynchDirty();
9740
9743 }
9744
9746 {
9748 }
9749
9751 {
9753 }
9754
9757 {
9758 if (!
GetGame().IsDedicatedServer())
9759 {
9760 if (ConfigIsExisting("attachSoundSet"))
9761 {
9762 string cfg_path = "";
9763 string soundset = "";
9765
9768 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9769 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9770
9771 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9772 {
9773 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9774 {
9775 if (cfg_slot_array[i] == slot_type)
9776 {
9777 soundset = cfg_soundset_array[i];
9778 break;
9779 }
9780 }
9781 }
9782
9783 if (soundset != "")
9784 {
9785 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9787 }
9788 }
9789 }
9790 }
9791
9793 {
9794
9795 }
9796
9797 void OnApply(PlayerBase player);
9798
9800 {
9801 return 1.0;
9802 };
9803
9805 {
9807 }
9808
9810 {
9812 }
9813
9815
9817 {
9818 SetDynamicPhysicsLifeTime(0.01);
9820 }
9821
9823 {
9824 array<string> zone_names = new array<string>;
9825 GetDamageZones(zone_names);
9826 for (int i = 0; i < zone_names.Count(); i++)
9827 {
9828 SetHealthMax(zone_names.Get(i),"Health");
9829 }
9830 SetHealthMax("","Health");
9831 }
9832
9835 {
9836 float global_health = GetHealth01("","Health");
9837 array<string> zones = new array<string>;
9838 GetDamageZones(zones);
9839
9840 for (int i = 0; i < zones.Count(); i++)
9841 {
9842 SetHealth01(zones.Get(i),"Health",global_health);
9843 }
9844 }
9845
9848 {
9849 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9850 }
9851
9853 {
9854 if (!hasRootAsPlayer)
9855 {
9856 if (refParentIB)
9857 {
9858
9859 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9860 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9861
9862 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9863 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9864
9867 }
9868 else
9869 {
9870
9873 }
9874 }
9875 }
9876
9878 {
9880 {
9881 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9882 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
9883 {
9884 float heatPermCoef = 1.0;
9886 while (ent)
9887 {
9888 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9889 ent = ent.GetHierarchyParent();
9890 }
9891
9892 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9893 }
9894 }
9895 }
9896
9898 {
9899
9900 EntityAI parent = GetHierarchyParent();
9901 if (!parent)
9902 {
9903 hasParent = false;
9904 hasRootAsPlayer = false;
9905 }
9906 else
9907 {
9908 hasParent = true;
9909 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9910 refParentIB =
ItemBase.Cast(parent);
9911 }
9912 }
9913
9914 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9915 {
9916
9917 }
9918
9920 {
9921
9922 return false;
9923 }
9924
9926 {
9927
9928
9929 return false;
9930 }
9931
9933 {
9934
9935 return false;
9936 }
9937
9940 {
9941 return !GetIsFrozen() &&
IsOpen();
9942 }
9943
9945 {
9946 bool hasParent = false, hasRootAsPlayer = false;
9948
9949 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9950 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9951
9952 if (wwtu || foodDecay)
9953 {
9957
9958 if (processWetness || processTemperature || processDecay)
9959 {
9961
9962 if (processWetness)
9963 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9964
9965 if (processTemperature)
9967
9968 if (processDecay)
9969 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9970 }
9971 }
9972 }
9973
9976 {
9978 }
9979
9981 {
9984
9985 return super.GetTemperatureFreezeThreshold();
9986 }
9987
9989 {
9992
9993 return super.GetTemperatureThawThreshold();
9994 }
9995
9997 {
10000
10001 return super.GetItemOverheatThreshold();
10002 }
10003
10005 {
10007 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10008
10009 return super.GetTemperatureFreezeTime();
10010 }
10011
10013 {
10015 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10016
10017 return super.GetTemperatureThawTime();
10018 }
10019
10024
10026 {
10027 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10028 }
10029
10031 {
10032 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10033 }
10034
10037 {
10039 }
10040
10042 {
10044 }
10045
10047 {
10049 }
10050
10053 {
10054 return null;
10055 }
10056
10059 {
10060 return false;
10061 }
10062
10064 {
10066 {
10069 if (!trg)
10070 {
10072 explosive = this;
10073 }
10074
10075 explosive.PairRemote(trg);
10077
10078 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10079 trg.SetPersistentPairID(persistentID);
10080 explosive.SetPersistentPairID(persistentID);
10081
10082 return true;
10083 }
10084 return false;
10085 }
10086
10089 {
10090 float ret = 1.0;
10093 ret *= GetHealth01();
10094
10095 return ret;
10096 }
10097
10098 #ifdef DEVELOPER
10099 override void SetDebugItem()
10100 {
10101 super.SetDebugItem();
10102 _itemBase = this;
10103 }
10104
10106 {
10107 string text = super.GetDebugText();
10108
10110 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10111
10112 return text;
10113 }
10114 #endif
10115
10117 {
10118 return true;
10119 }
10120
10122
10124
10126 {
10129 }
10130
10131
10139
10155}
10156
10158{
10160 if (entity)
10161 {
10162 bool is_item = entity.IsInherited(
ItemBase);
10163 if (is_item && full_quantity)
10164 {
10167 }
10168 }
10169 else
10170 {
10172 return NULL;
10173 }
10174 return entity;
10175}
10176
10178{
10179 if (item)
10180 {
10181 if (health > 0)
10182 item.SetHealth("", "", health);
10183
10184 if (item.CanHaveTemperature())
10185 {
10187 if (item.CanFreeze())
10188 item.SetFrozen(false);
10189 }
10190
10191 if (item.HasEnergyManager())
10192 {
10193 if (quantity >= 0)
10194 {
10195 item.GetCompEM().SetEnergy0To1(quantity);
10196 }
10197 else
10198 {
10200 }
10201 }
10202 else if (item.IsMagazine())
10203 {
10204 Magazine mag = Magazine.Cast(item);
10205 if (quantity >= 0)
10206 {
10207 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10208 }
10209 else
10210 {
10212 }
10213
10214 }
10215 else
10216 {
10217 if (quantity >= 0)
10218 {
10219 item.SetQuantityNormalized(quantity, false);
10220 }
10221 else
10222 {
10224 }
10225
10226 }
10227 }
10228}
10229
10230#ifdef DEVELOPER
10232#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, 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)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
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.