5399{
5401 {
5402 return true;
5403 }
5404};
5405
5406
5407
5409{
5413
5415
5418
5419
5420
5421
5422
5431
5437
5442
5447
5468 protected bool m_IsResultOfSplit
5469
5471
5476
5477
5478
5480
5484
5485
5486
5488
5491
5492
5493
5499
5500
5508
5511
5512
5514
5515
5517
5518
5523
5524
5529
5530
5532
5533
5535 {
5540
5541 if (!
GetGame().IsDedicatedServer())
5542 {
5544 {
5546
5548 {
5550 }
5551 }
5552
5555 }
5556
5557 m_OldLocation = null;
5558
5560 {
5562 }
5563
5564 if (ConfigIsExisting("headSelectionsToHide"))
5565 {
5568 }
5569
5571 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5572 {
5574 }
5575
5577
5578 m_IsResultOfSplit = false;
5579
5581 }
5582
5584 {
5585 super.InitItemVariables();
5586
5592 m_Count = ConfigGetInt(
"count");
5593
5596
5601
5604
5609
5621
5625
5626
5629 if (ConfigIsExisting("canBeSplit"))
5630 {
5633 }
5634
5636 if (ConfigIsExisting("itemBehaviour"))
5638
5639
5642 RegisterNetSyncVariableInt("m_VarLiquidType");
5643 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5644
5645 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5646 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5647 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5648
5649 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5650 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5651 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5652 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5653
5654 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5655 RegisterNetSyncVariableBool("m_IsTakeable");
5656 RegisterNetSyncVariableBool("m_IsHologram");
5657
5660 {
5663 }
5664
5666
5668 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5670
5671 }
5672
5674 {
5676 }
5677
5679 {
5682 {
5687 }
5688 }
5689
5690 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5691 {
5693 {
5696 }
5697
5699 }
5700
5702 {
5708 }
5709
5711
5713 {
5715
5716 if (!action)
5717 {
5718 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5719 return;
5720 }
5721
5723 if (!ai)
5724 {
5726 return;
5727 }
5728
5730 if (!action_array)
5731 {
5732 action_array = new array<ActionBase_Basic>;
5734 }
5735 if (LogManager.IsActionLogEnable())
5736 {
5737 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5738 }
5739
5740 if (action_array.Find(action) != -1)
5741 {
5742 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5743 }
5744 else
5745 {
5746 action_array.Insert(action);
5747 }
5748 }
5749
5751 {
5753 ActionBase action = player.GetActionManager().GetAction(actionName);
5756
5757 if (action_array)
5758 {
5759 action_array.RemoveItem(action);
5760 }
5761 }
5762
5763
5764
5766 {
5767 ActionOverrideData overrideData = new ActionOverrideData();
5771
5773 if (!actionMap)
5774 {
5777 }
5778
5779 actionMap.Insert(this.
Type(), overrideData);
5780
5781 }
5782
5784
5786
5787
5789 {
5792
5795
5796 string config_to_search = "CfgVehicles";
5797 string muzzle_owner_config;
5798
5800 {
5801 if (IsInherited(Weapon))
5802 config_to_search = "CfgWeapons";
5803
5804 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5805
5806 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5807
5809
5810 if (config_OnFire_subclass_count > 0)
5811 {
5812 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5813
5814 for (int i = 0; i < config_OnFire_subclass_count; i++)
5815 {
5816 string particle_class = "";
5818 string config_OnFire_entry = config_OnFire_class + particle_class;
5819 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5820 WPOF_array.Insert(WPOF);
5821 }
5822
5823
5825 }
5826 }
5827
5829 {
5830 config_to_search = "CfgWeapons";
5831 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5832
5833 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5834
5836
5837 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5838 {
5839 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5840
5841 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5842 {
5843 string particle_class2 = "";
5845 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5846 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5847 WPOBE_array.Insert(WPOBE);
5848 }
5849
5850
5852 }
5853 }
5854 }
5855
5856
5858 {
5861
5863 {
5864 string config_to_search = "CfgVehicles";
5865
5866 if (IsInherited(Weapon))
5867 config_to_search = "CfgWeapons";
5868
5869 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5870 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5871
5872 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5873 {
5874
5876
5878 {
5880 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5882 return;
5883 }
5884
5887
5888
5889
5891 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5892
5893 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5894 {
5895 string particle_class = "";
5897 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5899
5900 if (entry_type == CT_CLASS)
5901 {
5902 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5903 WPOOH_array.Insert(WPOF);
5904 }
5905 }
5906
5907
5909 }
5910 }
5911 }
5912
5914 {
5916 }
5917
5919 {
5921 {
5923
5926
5929
5930 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5931 }
5932 }
5933
5935 {
5937 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5938
5940 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5941
5943 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5944
5946 {
5948 }
5949 }
5950
5952 {
5954 }
5955
5957 {
5960 else
5962
5964 {
5967 }
5968 else
5969 {
5972
5975 }
5976
5978 }
5979
5981 {
5983 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5984 }
5985
5987 {
5989 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5991 }
5992
5994 {
5996 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5997 }
5998
6000 {
6003
6004 OverheatingParticle OP = new OverheatingParticle();
6009
6011 }
6012
6014 {
6017
6018 return -1;
6019 }
6020
6022 {
6024 {
6027
6028 for (int i = count; i > 0; --i)
6029 {
6030 int id = i - 1;
6033
6036
6037 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6038 {
6039 if (p)
6040 {
6043 }
6044 }
6045 }
6046 }
6047 }
6048
6050 {
6052 {
6054 {
6055 int id = i - 1;
6057
6058 if (OP)
6059 {
6061
6062 if (p)
6063 {
6065 }
6066
6067 delete OP;
6068 }
6069 }
6070
6073 }
6074 }
6075
6078 {
6079 return 0.0;
6080 }
6081
6082
6084 {
6085 return 250;
6086 }
6087
6089 {
6090 return 0;
6091 }
6092
6095 {
6097 return true;
6098
6099 return false;
6100 }
6101
6104 {
6107
6109 {
6111 }
6112 else
6113 {
6114
6116 }
6117
6119 }
6120
6127 {
6128 return -1;
6129 }
6130
6131
6132
6133
6135 {
6137 {
6139 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6140
6141 if (r_index >= 0)
6142 {
6143 InventoryLocation r_il = new InventoryLocation;
6144 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6145
6146 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6149 {
6150 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6151 }
6153 {
6154 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6155 }
6156
6157 }
6158
6159 player.GetHumanInventory().ClearUserReservedLocation(this);
6160 }
6161
6164 }
6165
6166
6167
6168
6170 {
6171 return ItemBase.m_DebugActionsMask;
6172 }
6173
6175 {
6176 return ItemBase.m_DebugActionsMask & mask;
6177 }
6178
6180 {
6181 ItemBase.m_DebugActionsMask = mask;
6182 }
6183
6185 {
6186 ItemBase.m_DebugActionsMask |= mask;
6187 }
6188
6190 {
6191 ItemBase.m_DebugActionsMask &= ~mask;
6192 }
6193
6195 {
6197 {
6199 }
6200 else
6201 {
6203 }
6204 }
6205
6206
6208 {
6209 if (GetEconomyProfile())
6210 {
6211 float q_max = GetEconomyProfile().GetQuantityMax();
6212 if (q_max > 0)
6213 {
6214 float q_min = GetEconomyProfile().GetQuantityMin();
6215 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6216
6218 {
6219 ComponentEnergyManager comp = GetCompEM();
6221 {
6223 }
6224 }
6226 {
6228
6229 }
6230
6231 }
6232 }
6233 }
6234
6237 {
6238 EntityAI parent = GetHierarchyParent();
6239
6240 if (parent)
6241 {
6242 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6243 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6244 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6245 }
6246 }
6247
6250 {
6251 EntityAI parent = GetHierarchyParent();
6252
6253 if (parent)
6254 {
6255 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6256 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6257 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6258 }
6259 }
6260
6262 {
6263
6264
6265
6266
6268
6270 {
6271 if (ScriptInputUserData.CanStoreInputUserData())
6272 {
6273 ScriptInputUserData ctx = new ScriptInputUserData;
6279 ctx.
Write(use_stack_max);
6282
6284 {
6285 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6286 }
6287 }
6288 }
6289 else if (!
GetGame().IsMultiplayer())
6290 {
6292 }
6293 }
6294
6296 {
6298 }
6299
6301 {
6303 }
6304
6306 {
6308 }
6309
6311 {
6312
6313 return false;
6314 }
6315
6317 {
6318 return false;
6319 }
6320
6324 {
6325 return false;
6326 }
6327
6329 {
6330 return "";
6331 }
6332
6334
6336 {
6337 return false;
6338 }
6339
6341 {
6342 return true;
6343 }
6344
6345
6346
6348 {
6349 return true;
6350 }
6351
6353 {
6354 return true;
6355 }
6356
6358 {
6359 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6361 }
6362
6364 {
6366 }
6367
6369 {
6371 if (!is_being_placed)
6373 SetSynchDirty();
6374 }
6375
6376
6378
6380 {
6382 }
6383
6385 {
6387 }
6388
6390 {
6391 return 1;
6392 }
6393
6395 {
6396 return false;
6397 }
6398
6400 {
6402 SetSynchDirty();
6403 }
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6431
6432
6433
6434
6435
6436
6437
6438
6440 {
6441 super.OnMovedInsideCargo(container);
6442
6443 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6444 }
6445
6446 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6447 {
6448 super.EEItemLocationChanged(oldLoc,newLoc);
6449
6450 PlayerBase new_player = null;
6451 PlayerBase old_player = null;
6452
6453 if (newLoc.GetParent())
6454 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6455
6456 if (oldLoc.GetParent())
6457 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6458
6460 {
6461 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6462
6463 if (r_index >= 0)
6464 {
6465 InventoryLocation r_il = new InventoryLocation;
6466 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6467
6468 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6471 {
6472 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6473 }
6475 {
6476 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6477 }
6478
6479 }
6480 }
6481
6483 {
6484 if (new_player)
6485 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6486
6487 if (new_player == old_player)
6488 {
6489
6490 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6491 {
6493 {
6494 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6495 {
6496 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6497 }
6498 }
6499 else
6500 {
6501 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6502 }
6503 }
6504
6505 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6506 {
6507 int type = oldLoc.GetType();
6509 {
6510 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6511 }
6513 {
6514 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6515 }
6516 }
6517 if (!m_OldLocation)
6518 {
6519 m_OldLocation = new InventoryLocation;
6520 }
6521 m_OldLocation.Copy(oldLoc);
6522 }
6523 else
6524 {
6525 if (m_OldLocation)
6526 {
6527 m_OldLocation.Reset();
6528 }
6529 }
6530
6532 }
6533 else
6534 {
6535 if (new_player)
6536 {
6537 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6538 if (res_index >= 0)
6539 {
6540 InventoryLocation il = new InventoryLocation;
6541 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6543 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6546 {
6547 il.
GetParent().GetOnReleaseLock().Invoke(it);
6548 }
6550 {
6552 }
6553
6554 }
6555 }
6557 {
6558
6560 }
6561
6562 if (m_OldLocation)
6563 {
6564 m_OldLocation.Reset();
6565 }
6566 }
6567 }
6568
6569 override void EOnContact(IEntity other, Contact extra)
6570 {
6572 {
6573 int liquidType = -1;
6575 if (impactSpeed > 0.0)
6576 {
6578 #ifndef SERVER
6580 #else
6582 SetSynchDirty();
6583 #endif
6585 }
6586 }
6587
6588 #ifdef SERVER
6589 if (GetCompEM() && GetCompEM().IsPlugged())
6590 {
6591 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6592 GetCompEM().UnplugThis();
6593 }
6594 #endif
6595 }
6596
6598
6600 {
6602 }
6603
6605 {
6606
6607 }
6608
6610 {
6611 super.OnItemLocationChanged(old_owner, new_owner);
6612
6613 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6614 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6615
6616 if (!relatedPlayer && playerNew)
6617 relatedPlayer = playerNew;
6618
6619 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6620 {
6622 if (actionMgr)
6623 {
6624 ActionBase currentAction = actionMgr.GetRunningAction();
6625 if (currentAction)
6627 }
6628 }
6629
6630 Man ownerPlayerOld = null;
6631 Man ownerPlayerNew = null;
6632
6633 if (old_owner)
6634 {
6635 if (old_owner.
IsMan())
6636 {
6637 ownerPlayerOld = Man.Cast(old_owner);
6638 }
6639 else
6640 {
6641 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6642 }
6643 }
6644 else
6645 {
6647 {
6649
6650 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6651 {
6652 GetCompEM().UnplugThis();
6653 }
6654 }
6655 }
6656
6657 if (new_owner)
6658 {
6659 if (new_owner.
IsMan())
6660 {
6661 ownerPlayerNew = Man.Cast(new_owner);
6662 }
6663 else
6664 {
6665 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6666 }
6667 }
6668
6669 if (ownerPlayerOld != ownerPlayerNew)
6670 {
6671 if (ownerPlayerOld)
6672 {
6673 array<EntityAI> subItemsExit = new array<EntityAI>;
6675 for (int i = 0; i < subItemsExit.Count(); i++)
6676 {
6679 }
6680 }
6681
6682 if (ownerPlayerNew)
6683 {
6684 array<EntityAI> subItemsEnter = new array<EntityAI>;
6686 for (int j = 0; j < subItemsEnter.Count(); j++)
6687 {
6690 }
6691 }
6692 }
6693 else if (ownerPlayerNew != null)
6694 {
6695 PlayerBase nplayer;
6696 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6697 {
6698 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6700 for (int k = 0; k < subItemsUpdate.Count(); k++)
6701 {
6703 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6704 }
6705 }
6706 }
6707
6708 if (old_owner)
6709 old_owner.OnChildItemRemoved(this);
6710 if (new_owner)
6711 new_owner.OnChildItemReceived(this);
6712 }
6713
6714
6716 {
6717 super.EEDelete(parent);
6718 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6719 if (player)
6720 {
6722
6723 if (player.IsAlive())
6724 {
6725 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6726 if (r_index >= 0)
6727 {
6728 InventoryLocation r_il = new InventoryLocation;
6729 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6730
6731 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6734 {
6735 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6736 }
6738 {
6739 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6740 }
6741
6742 }
6743
6744 player.RemoveQuickBarEntityShortcut(this);
6745 }
6746 }
6747 }
6748
6750 {
6751 super.EEKilled(killer);
6752
6755 {
6756 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6757 {
6758 if (IsMagazine())
6759 {
6760 if (Magazine.Cast(this).GetAmmoCount() > 0)
6761 {
6763 }
6764 }
6765 else
6766 {
6768 }
6769 }
6770 }
6771 }
6772
6774 {
6775 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6776
6777 super.OnWasAttached(parent, slot_id);
6778
6781
6783 }
6784
6786 {
6787 super.OnWasDetached(parent, slot_id);
6788
6791 }
6792
6794 {
6795 int idx;
6798
6799 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6800 if (inventory_slots.Count() < 1)
6801 {
6802 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6803 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6804 }
6805 else
6806 {
6807 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6808 }
6809
6810 idx = inventory_slots.Find(slot);
6811 if (idx < 0)
6812 return "";
6813
6814 return attach_types.Get(idx);
6815 }
6816
6818 {
6819 int idx = -1;
6820 string slot;
6821
6824
6825 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6826 if (inventory_slots.Count() < 1)
6827 {
6828 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6829 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6830 }
6831 else
6832 {
6833 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6834 if (detach_types.Count() < 1)
6835 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6836 }
6837
6838 for (int i = 0; i < inventory_slots.Count(); i++)
6839 {
6840 slot = inventory_slots.Get(i);
6841 }
6842
6843 if (slot != "")
6844 {
6845 if (detach_types.Count() == 1)
6846 idx = 0;
6847 else
6848 idx = inventory_slots.Find(slot);
6849 }
6850 if (idx < 0)
6851 return "";
6852
6853 return detach_types.Get(idx);
6854 }
6855
6857 {
6858
6860
6861
6862 float min_time = 1;
6863 float max_time = 3;
6864 float delay = Math.RandomFloat(min_time, max_time);
6865
6866 explode_timer.Run(delay, this, "DoAmmoExplosion");
6867 }
6868
6870 {
6871 Magazine magazine = Magazine.Cast(this);
6872 int pop_sounds_count = 6;
6873 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6874
6875
6876 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6877 string sound_name = pop_sounds[ sound_idx ];
6879
6880
6881 magazine.ServerAddAmmoCount(-1);
6882
6883
6884 float min_temp_to_explode = 100;
6885
6886 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6887 {
6889 }
6890 }
6891
6892
6893 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6894 {
6895 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6896
6897 const int CHANCE_DAMAGE_CARGO = 4;
6898 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6899 const int CHANCE_DAMAGE_NOTHING = 2;
6900
6902 {
6903 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6904 int chances;
6905 int rnd;
6906
6907 if (GetInventory().GetCargo())
6908 {
6909 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6910 rnd = Math.RandomInt(0,chances);
6911
6912 if (rnd < CHANCE_DAMAGE_CARGO)
6913 {
6915 }
6916 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6917 {
6919 }
6920 }
6921 else
6922 {
6923 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6924 rnd = Math.RandomInt(0,chances);
6925
6926 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6927 {
6929 }
6930 }
6931 }
6932 }
6933
6935 {
6936 if (GetInventory().GetCargo())
6937 {
6938 int item_count = GetInventory().GetCargo().GetItemCount();
6939 if (item_count > 0)
6940 {
6941 int random_pick = Math.RandomInt(0, item_count);
6943 if (!item.IsExplosive())
6944 {
6945 item.AddHealth("","",damage);
6946 return true;
6947 }
6948 }
6949 }
6950 return false;
6951 }
6952
6954 {
6955 int attachment_count = GetInventory().AttachmentCount();
6956 if (attachment_count > 0)
6957 {
6958 int random_pick = Math.RandomInt(0, attachment_count);
6959 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6960 if (!attachment.IsExplosive())
6961 {
6962 attachment.AddHealth("","",damage);
6963 return true;
6964 }
6965 }
6966 return false;
6967 }
6968
6970 {
6972 }
6973
6975 {
6977 return GetInventory().CanRemoveEntity();
6978
6979 return false;
6980 }
6981
6983 {
6985 return;
6986
6988 {
6989 if (ScriptInputUserData.CanStoreInputUserData())
6990 {
6991 ScriptInputUserData ctx = new ScriptInputUserData;
6996 ctx.
Write(destination_entity);
7000 }
7001 }
7002 else if (!
GetGame().IsMultiplayer())
7003 {
7005 }
7006 }
7007
7009 {
7011 return;
7012
7013 float split_quantity_new;
7017 InventoryLocation loc = new InventoryLocation;
7018
7019 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7020 {
7022 split_quantity_new = stack_max;
7023 else
7025
7026 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7027 if (new_item)
7028 {
7029 new_item.SetResultOfSplit(true);
7030 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7032 new_item.SetQuantity(split_quantity_new);
7033 }
7034 }
7035 else if (destination_entity && slot_id == -1)
7036 {
7037 if (quantity > stack_max)
7038 split_quantity_new = stack_max;
7039 else
7040 split_quantity_new = quantity;
7041
7043 {
7046 }
7047
7048 if (new_item)
7049 {
7050 new_item.SetResultOfSplit(true);
7051 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7053 new_item.SetQuantity(split_quantity_new);
7054 }
7055 }
7056 else
7057 {
7058 if (stack_max != 0)
7059 {
7061 {
7063 }
7064
7065 if (split_quantity_new == 0)
7066 {
7067 if (!
GetGame().IsMultiplayer())
7068 player.PhysicalPredictiveDropItem(this);
7069 else
7070 player.ServerDropEntity(this);
7071 return;
7072 }
7073
7075
7076 if (new_item)
7077 {
7078 new_item.SetResultOfSplit(true);
7079 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7081 new_item.SetQuantity(stack_max);
7082 new_item.PlaceOnSurface();
7083 }
7084 }
7085 }
7086 }
7087
7089 {
7091 return;
7092
7093 float split_quantity_new;
7097 InventoryLocation loc = new InventoryLocation;
7098
7099 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7100 {
7102 split_quantity_new = stack_max;
7103 else
7105
7106 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7107 if (new_item)
7108 {
7109 new_item.SetResultOfSplit(true);
7110 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7112 new_item.SetQuantity(split_quantity_new);
7113 }
7114 }
7115 else if (destination_entity && slot_id == -1)
7116 {
7117 if (quantity > stack_max)
7118 split_quantity_new = stack_max;
7119 else
7120 split_quantity_new = quantity;
7121
7123 {
7126 }
7127
7128 if (new_item)
7129 {
7130 new_item.SetResultOfSplit(true);
7131 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7133 new_item.SetQuantity(split_quantity_new);
7134 }
7135 }
7136 else
7137 {
7138 if (stack_max != 0)
7139 {
7141 {
7143 }
7144
7146
7147 if (new_item)
7148 {
7149 new_item.SetResultOfSplit(true);
7150 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7152 new_item.SetQuantity(stack_max);
7153 new_item.PlaceOnSurface();
7154 }
7155 }
7156 }
7157 }
7158
7160 {
7162 return;
7163
7165 {
7166 if (ScriptInputUserData.CanStoreInputUserData())
7167 {
7168 ScriptInputUserData ctx = new ScriptInputUserData;
7173 dst.WriteToContext(ctx);
7175 }
7176 }
7177 else if (!
GetGame().IsMultiplayer())
7178 {
7180 }
7181 }
7182
7184 {
7186 return;
7187
7189 {
7190 if (ScriptInputUserData.CanStoreInputUserData())
7191 {
7192 ScriptInputUserData ctx = new ScriptInputUserData;
7197 ctx.
Write(destination_entity);
7203 }
7204 }
7205 else if (!
GetGame().IsMultiplayer())
7206 {
7208 }
7209 }
7210
7212 {
7214 }
7215
7217 {
7219 return this;
7220
7222 float split_quantity_new;
7224 if (dst.IsValid())
7225 {
7226 int slot_id = dst.GetSlot();
7228
7229 if (quantity > stack_max)
7230 split_quantity_new = stack_max;
7231 else
7232 split_quantity_new = quantity;
7233
7235
7236 if (new_item)
7237 {
7238 new_item.SetResultOfSplit(true);
7239 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7242 }
7243
7244 return new_item;
7245 }
7246
7247 return null;
7248 }
7249
7251 {
7253 return;
7254
7256 float split_quantity_new;
7258 if (destination_entity)
7259 {
7261 if (quantity > stackable)
7262 split_quantity_new = stackable;
7263 else
7264 split_quantity_new = quantity;
7265
7266 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7267 if (new_item)
7268 {
7269 new_item.SetResultOfSplit(true);
7270 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7272 new_item.SetQuantity(split_quantity_new);
7273 }
7274 }
7275 }
7276
7278 {
7280 return;
7281
7283 {
7284 if (ScriptInputUserData.CanStoreInputUserData())
7285 {
7286 ScriptInputUserData ctx = new ScriptInputUserData;
7291 ItemBase destination_entity =
this;
7292 ctx.
Write(destination_entity);
7296 }
7297 }
7298 else if (!
GetGame().IsMultiplayer())
7299 {
7301 }
7302 }
7303
7305 {
7307 return;
7308
7310 float split_quantity_new;
7312 if (player)
7313 {
7315 if (quantity > stackable)
7316 split_quantity_new = stackable;
7317 else
7318 split_quantity_new = quantity;
7319
7320 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7321 new_item =
ItemBase.Cast(in_hands);
7322 if (new_item)
7323 {
7324 new_item.SetResultOfSplit(true);
7325 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7327 new_item.SetQuantity(split_quantity_new);
7328 }
7329 }
7330 }
7331
7333 {
7335 return;
7336
7338 float split_quantity_new = Math.Floor(quantity * 0.5);
7339
7341
7342 if (new_item)
7343 {
7344 if (new_item.GetQuantityMax() < split_quantity_new)
7345 {
7346 split_quantity_new = new_item.GetQuantityMax();
7347 }
7348
7349 new_item.SetResultOfSplit(true);
7350 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7351
7353 {
7356 }
7357 else
7358 {
7361 }
7362 }
7363 }
7364
7366 {
7368 return;
7369
7371 float split_quantity_new = Math.Floor(quantity / 2);
7372
7373 InventoryLocation invloc = new InventoryLocation;
7375
7377 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7378
7379 if (new_item)
7380 {
7381 if (new_item.GetQuantityMax() < split_quantity_new)
7382 {
7383 split_quantity_new = new_item.GetQuantityMax();
7384 }
7386 {
7389 }
7390 else
7391 {
7394 }
7395 }
7396 }
7397
7400 {
7401 SetWeightDirty();
7403
7404 if (parent)
7405 parent.OnAttachmentQuantityChangedEx(this, delta);
7406
7408 {
7410 {
7412 }
7414 {
7415 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7417 }
7418 }
7419
7420 }
7421
7424 {
7425
7426 }
7427
7430 {
7432 }
7433
7435 {
7436 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7437
7439 {
7440 if (newLevel == GameConstants.STATE_RUINED)
7441 {
7443 EntityAI parent = GetHierarchyParent();
7444 if (parent && parent.IsFireplace())
7445 {
7446 CargoBase cargo = GetInventory().GetCargo();
7447 if (cargo)
7448 {
7450 {
7452 }
7453 }
7454 }
7455 }
7456
7458 {
7459
7461 return;
7462 }
7463
7464 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7465 {
7467 }
7468 }
7469 }
7470
7471
7473 {
7474 super.OnRightClick();
7475
7477 {
7479 {
7480 if (ScriptInputUserData.CanStoreInputUserData())
7481 {
7482 vector m4[4];
7484
7485 EntityAI root = GetHierarchyRoot();
7486
7487 InventoryLocation dst = new InventoryLocation;
7489 {
7490 if (root)
7491 {
7492 root.GetTransform(m4);
7494 }
7495 else
7496 GetInventory().GetCurrentInventoryLocation(dst);
7497 }
7498 else
7499 {
7501
7502
7503 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7504 {
7505 if (root)
7506 {
7507 root.GetTransform(m4);
7509 }
7510 else
7511 GetInventory().GetCurrentInventoryLocation(dst);
7512 }
7513 else
7514 {
7515 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7516 }
7517 }
7518
7519 ScriptInputUserData ctx = new ScriptInputUserData;
7527 }
7528 }
7529 else if (!
GetGame().IsMultiplayer())
7530 {
7532 }
7533 }
7534 }
7535
7536 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7537 {
7538
7539 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7540 return false;
7541
7542 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7543 return false;
7544
7545
7547 return false;
7548
7549
7550 Magazine mag = Magazine.Cast(this);
7551 if (mag)
7552 {
7553 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7554 return false;
7555
7556 if (stack_max_limit)
7557 {
7558 Magazine other_mag = Magazine.Cast(other_item);
7559 if (other_item)
7560 {
7561 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7562 return false;
7563 }
7564
7565 }
7566 }
7567 else
7568 {
7569
7571 return false;
7572
7574 return false;
7575 }
7576
7577 PlayerBase player = null;
7578 if (CastTo(player, GetHierarchyRootPlayer()))
7579 {
7580 if (player.GetInventory().HasAttachment(this))
7581 return false;
7582
7583 if (player.IsItemsToDelete())
7584 return false;
7585 }
7586
7587 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7588 return false;
7589
7590 int slotID;
7592 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7593 return false;
7594
7595 return true;
7596 }
7597
7599 {
7601 }
7602
7604 {
7605 return m_IsResultOfSplit;
7606 }
7607
7609 {
7610 m_IsResultOfSplit = value;
7611 }
7612
7614 {
7616 }
7617
7619 {
7620 float other_item_quantity = other_item.GetQuantity();
7621 float this_free_space;
7622
7624
7626
7627 if (other_item_quantity > this_free_space)
7628 {
7629 return this_free_space;
7630 }
7631 else
7632 {
7633 return other_item_quantity;
7634 }
7635 }
7636
7638 {
7640 }
7641
7643 {
7645 return;
7646
7647 if (!IsMagazine() && other_item)
7648 {
7650 if (quantity_used != 0)
7651 {
7652 float hp1 = GetHealth01("","");
7653 float hp2 = other_item.GetHealth01("","");
7654 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7655 hpResult = hpResult / (
GetQuantity() + quantity_used);
7656
7657 hpResult *= GetMaxHealth();
7658 Math.Round(hpResult);
7659 SetHealth("", "Health", hpResult);
7660
7662 other_item.AddQuantity(-quantity_used);
7663 }
7664 }
7666 }
7667
7669 {
7670 #ifdef SERVER
7671 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7672 GetHierarchyParent().IncreaseLifetimeUp();
7673 #endif
7674 };
7675
7677 {
7678 PlayerBase p = PlayerBase.Cast(player);
7679
7680 array<int> recipesIds = p.m_Recipes;
7681 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7682 if (moduleRecipesManager)
7683 {
7684 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7685 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7686 }
7687
7688 for (int i = 0;i < recipesIds.Count(); i++)
7689 {
7690 int key = recipesIds.Get(i);
7691 string recipeName = moduleRecipesManager.GetRecipeName(key);
7693 }
7694 }
7695
7696
7697 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7698 {
7699 super.GetDebugActions(outputList);
7700
7701
7706
7707
7711
7715
7716
7719
7720
7722 {
7725 }
7726
7728
7731
7735 }
7736
7737
7738
7739
7741 {
7742 super.OnAction(action_id, player, ctx);
7743 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7744 {
7745 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7746 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7747 PlayerBase p = PlayerBase.Cast(player);
7748 if (
EActions.RECIPES_RANGE_START < 1000)
7749 {
7750 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7751 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7752 }
7753 }
7754 #ifndef SERVER
7755 else if (action_id ==
EActions.WATCH_PLAYER)
7756 {
7757 PluginDeveloper.SetDeveloperItemClientEx(player);
7758 }
7759 #endif
7761 {
7762 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7763 {
7764 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7765 OnDebugButtonPressServer(id + 1);
7766 }
7767
7768 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7769 {
7770 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7772 }
7773
7774 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7775 {
7776 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7778 }
7779
7780 else if (action_id ==
EActions.ADD_QUANTITY)
7781 {
7782 if (IsMagazine())
7783 {
7784 Magazine mag = Magazine.Cast(this);
7785 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7786 }
7787 else
7788 {
7790 }
7791
7792 if (m_EM)
7793 {
7794 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7795 }
7796
7797 }
7798
7799 else if (action_id ==
EActions.REMOVE_QUANTITY)
7800 {
7801 if (IsMagazine())
7802 {
7803 Magazine mag2 = Magazine.Cast(this);
7804 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7805 }
7806 else
7807 {
7809 }
7810 if (m_EM)
7811 {
7812 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7813 }
7814
7815 }
7816
7817 else if (action_id ==
EActions.SET_QUANTITY_0)
7818 {
7820
7821 if (m_EM)
7822 {
7823 m_EM.SetEnergy(0);
7824 }
7825 }
7826
7827 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7828 {
7830
7831 if (m_EM)
7832 {
7833 m_EM.SetEnergy(m_EM.GetEnergyMax());
7834 }
7835 }
7836
7837 else if (action_id ==
EActions.ADD_HEALTH)
7838 {
7839 AddHealth("","",GetMaxHealth("","Health")/5);
7840 }
7841 else if (action_id ==
EActions.REMOVE_HEALTH)
7842 {
7843 AddHealth("","",-GetMaxHealth("","Health")/5);
7844 }
7845 else if (action_id ==
EActions.DESTROY_HEALTH)
7846 {
7847 SetHealth01("","",0);
7848 }
7849 else if (action_id ==
EActions.WATCH_ITEM)
7850 {
7852 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7853 #ifdef DEVELOPER
7854 SetDebugDeveloper_item(this);
7855 #endif
7856 }
7857
7858 else if (action_id ==
EActions.ADD_TEMPERATURE)
7859 {
7860 AddTemperature(20);
7861
7862 }
7863
7864 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7865 {
7866 AddTemperature(-20);
7867
7868 }
7869
7870 else if (action_id ==
EActions.FLIP_FROZEN)
7871 {
7872 SetFrozen(!GetIsFrozen());
7873
7874 }
7875
7876 else if (action_id ==
EActions.ADD_WETNESS)
7877 {
7879
7880 }
7881
7882 else if (action_id ==
EActions.REMOVE_WETNESS)
7883 {
7885
7886 }
7887
7888 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7889 {
7892
7893
7894 }
7895
7896 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7897 {
7900 }
7901
7902 else if (action_id ==
EActions.MAKE_SPECIAL)
7903 {
7904 auto debugParams = DebugSpawnParams.WithPlayer(player);
7905 OnDebugSpawnEx(debugParams);
7906 }
7907
7908 else if (action_id ==
EActions.DELETE)
7909 {
7910 Delete();
7911 }
7912
7913 }
7914
7915
7916 return false;
7917 }
7918
7919
7920
7921
7925
7928
7929
7930
7932 {
7933 return false;
7934 }
7935
7936
7938 {
7939 return true;
7940 }
7941
7942
7944 {
7945 return true;
7946 }
7947
7948
7949
7951 {
7952 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7954 }
7955
7958 {
7959 return null;
7960 }
7961
7963 {
7964 return false;
7965 }
7966
7968 {
7969 return false;
7970 }
7971
7975
7976
7978 {
7979 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7980 return module_repairing.CanRepair(this, item_repair_kit);
7981 }
7982
7983
7984 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7985 {
7986 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7987 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7988 }
7989
7990
7992 {
7993
7994
7995
7996
7997
7998
7999
8000
8001 return 1;
8002 }
8003
8004
8005
8007 {
8009 }
8010
8011
8012
8014 {
8016 }
8017
8018
8027 {
8028 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8029
8030 if (player)
8031 {
8032 player.MessageStatus(text);
8033 }
8034 }
8035
8036
8045 {
8046 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8047
8048 if (player)
8049 {
8050 player.MessageAction(text);
8051 }
8052 }
8053
8054
8063 {
8064 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8065
8066 if (player)
8067 {
8068 player.MessageFriendly(text);
8069 }
8070 }
8071
8072
8081 {
8082 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8083
8084 if (player)
8085 {
8086 player.MessageImportant(text);
8087 }
8088 }
8089
8091 {
8092 return true;
8093 }
8094
8095
8096 override bool KindOf(
string tag)
8097 {
8098 bool found = false;
8099 string item_name = this.
GetType();
8102
8103 int array_size = item_tag_array.Count();
8104 for (int i = 0; i < array_size; i++)
8105 {
8106 if (item_tag_array.Get(i) == tag)
8107 {
8108 found = true;
8109 break;
8110 }
8111 }
8112 return found;
8113 }
8114
8115
8117 {
8118
8119 super.OnRPC(sender, rpc_type,ctx);
8120
8121
8122 switch (rpc_type)
8123 {
8124 #ifndef SERVER
8125 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8126 Param2<bool, string> p = new Param2<bool, string>(false, "");
8127
8129 return;
8130
8131 bool play = p.param1;
8132 string soundSet = p.param2;
8133
8134 if (play)
8135 {
8137 {
8139 {
8141 }
8142 }
8143 else
8144 {
8146 }
8147 }
8148 else
8149 {
8151 }
8152
8153 break;
8154 #endif
8155
8156 }
8157
8159 {
8161 }
8162 }
8163
8164
8165
8166
8168 {
8169 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8170 return plugin.GetID(
name);
8171 }
8172
8174 {
8175 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8176 return plugin.GetName(id);
8177 }
8178
8181 {
8182
8183
8184 int varFlags;
8185 if (!ctx.
Read(varFlags))
8186 return;
8187
8188 if (varFlags & ItemVariableFlags.FLOAT)
8189 {
8191 }
8192 }
8193
8195 {
8196
8197 super.SerializeNumericalVars(floats_out);
8198
8199
8200
8202 {
8204 }
8205
8207 {
8209 }
8210
8212 {
8214 }
8215
8217 {
8222 }
8223
8225 {
8227 }
8228 }
8229
8231 {
8232
8233 super.DeSerializeNumericalVars(floats);
8234
8235
8236 int index = 0;
8237 int mask = Math.Round(floats.Get(index));
8238
8239 index++;
8240
8242 {
8244 {
8246 }
8247 else
8248 {
8249 float quantity = floats.Get(index);
8251 }
8252 index++;
8253 }
8254
8256 {
8257 float wet = floats.Get(index);
8259 index++;
8260 }
8261
8263 {
8264 int liquidtype = Math.Round(floats.Get(index));
8266 index++;
8267 }
8268
8270 {
8272 index++;
8274 index++;
8276 index++;
8278 index++;
8279 }
8280
8282 {
8283 int cleanness = Math.Round(floats.Get(index));
8285 index++;
8286 }
8287 }
8288
8290 {
8291 super.WriteVarsToCTX(ctx);
8292
8293
8295 {
8297 }
8298
8300 {
8302 }
8303
8305 {
8307 }
8308
8310 {
8311 int r,g,b,a;
8317 }
8318
8320 {
8322 }
8323 }
8324
8326 {
8327 if (!super.ReadVarsFromCTX(ctx,version))
8328 return false;
8329
8330 int intValue;
8331 float value;
8332
8333 if (version < 140)
8334 {
8335 if (!ctx.
Read(intValue))
8336 return false;
8337
8338 m_VariablesMask = intValue;
8339 }
8340
8342 {
8343 if (!ctx.
Read(value))
8344 return false;
8345
8347 {
8349 }
8350 else
8351 {
8353 }
8354 }
8355
8356 if (version < 140)
8357 {
8359 {
8360 if (!ctx.
Read(value))
8361 return false;
8362 SetTemperatureDirect(value);
8363 }
8364 }
8365
8367 {
8368 if (!ctx.
Read(value))
8369 return false;
8371 }
8372
8374 {
8375 if (!ctx.
Read(intValue))
8376 return false;
8378 }
8379
8381 {
8382 int r,g,b,a;
8384 return false;
8386 return false;
8388 return false;
8390 return false;
8391
8393 }
8394
8396 {
8397 if (!ctx.
Read(intValue))
8398 return false;
8400 }
8401
8402 if (version >= 138 && version < 140)
8403 {
8405 {
8406 if (!ctx.
Read(intValue))
8407 return false;
8408 SetFrozen(intValue);
8409 }
8410 }
8411
8412 return true;
8413 }
8414
8415
8417 {
8420 {
8422 }
8423
8424 if (!super.OnStoreLoad(ctx, version))
8425 {
8427 return false;
8428 }
8429
8430 if (version >= 114)
8431 {
8432 bool hasQuickBarIndexSaved;
8433
8434 if (!ctx.
Read(hasQuickBarIndexSaved))
8435 {
8437 return false;
8438 }
8439
8440 if (hasQuickBarIndexSaved)
8441 {
8442 int itmQBIndex;
8443
8444
8445 if (!ctx.
Read(itmQBIndex))
8446 {
8448 return false;
8449 }
8450
8451 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8452 if (itmQBIndex != -1 && parentPlayer)
8453 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8454 }
8455 }
8456 else
8457 {
8458
8459 PlayerBase player;
8460 int itemQBIndex;
8461 if (version ==
int.
MAX)
8462 {
8463 if (!ctx.
Read(itemQBIndex))
8464 {
8466 return false;
8467 }
8468 }
8469 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8470 {
8471
8472 if (!ctx.
Read(itemQBIndex))
8473 {
8475 return false;
8476 }
8477 if (itemQBIndex != -1 && player)
8478 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8479 }
8480 }
8481
8482 if (version < 140)
8483 {
8484
8485 if (!LoadVariables(ctx, version))
8486 {
8488 return false;
8489 }
8490 }
8491
8492
8494 {
8496 return false;
8497 }
8498 if (version >= 132)
8499 {
8501 if (raib)
8502 {
8504 {
8506 return false;
8507 }
8508 }
8509 }
8510
8512 return true;
8513 }
8514
8515
8516
8518 {
8519 super.OnStoreSave(ctx);
8520
8521 PlayerBase player;
8522 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8523 {
8525
8526 int itemQBIndex = -1;
8527 itemQBIndex = player.FindQuickBarEntityIndex(this);
8528 ctx.
Write(itemQBIndex);
8529 }
8530 else
8531 {
8533 }
8534
8536
8538 if (raib)
8539 {
8541 }
8542 }
8543
8544
8546 {
8547 super.AfterStoreLoad();
8548
8550 {
8552 }
8553
8555 {
8558 }
8559 }
8560
8562 {
8563 super.EEOnAfterLoad();
8564
8566 {
8568 }
8569
8572 }
8573
8575 {
8576 return false;
8577 }
8578
8579
8580
8582 {
8584 {
8585 #ifdef PLATFORM_CONSOLE
8586
8588 {
8590 if (menu)
8591 {
8593 }
8594 }
8595 #endif
8596 }
8597
8599 {
8602 }
8603
8605 {
8606 SetWeightDirty();
8608 }
8610 {
8613 }
8614
8616 {
8619 }
8621 {
8624 }
8625
8626 super.OnVariablesSynchronized();
8627 }
8628
8629
8630
8632 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8633 {
8634 if (!IsServerCheck(allow_client))
8635 return false;
8636
8638 return false;
8639
8642
8643 if (value <= (min + 0.001))
8644 value = min;
8645
8646 if (value == min)
8647 {
8648 if (destroy_config)
8649 {
8650 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8651 if (dstr)
8652 {
8654 this.Delete();
8655 return true;
8656 }
8657 }
8658 else if (destroy_forced)
8659 {
8661 this.Delete();
8662 return true;
8663 }
8664
8666 }
8667
8670
8672 {
8674
8675 if (delta)
8677 }
8678
8680
8681 return false;
8682 }
8683
8684
8686 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8687 {
8689 }
8690
8692 {
8695 }
8696
8698 {
8701 }
8702
8705 {
8706 float value_clamped = Math.Clamp(value, 0, 1);
8708 SetQuantity(result, destroy_config, destroy_forced);
8709 }
8710
8711
8714 {
8716 }
8717
8719 {
8721 }
8722
8723
8724
8725
8726
8727
8728
8729
8730
8731
8733 {
8734 int slot = -1;
8735 if (GetInventory())
8736 {
8737 InventoryLocation il = new InventoryLocation;
8738 GetInventory().GetCurrentInventoryLocation(il);
8740 }
8741
8743 }
8744
8746 {
8747 float quantity_max = 0;
8748
8750 {
8751 if (attSlotID != -1)
8752 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8753
8754 if (quantity_max <= 0)
8756 }
8757
8758 if (quantity_max <= 0)
8760
8761 return quantity_max;
8762 }
8763
8765 {
8767 }
8768
8770 {
8772 }
8773
8774
8776 {
8778 }
8779
8781 {
8783 }
8784
8786 {
8788 }
8789
8790
8792 {
8793
8794 float weightEx = GetWeightEx();
8795 float special = GetInventoryAndCargoWeight();
8796 return weightEx - special;
8797 }
8798
8799
8801 {
8803 }
8804
8806 {
8808 {
8809 #ifdef DEVELOPER
8810 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8811 {
8812 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8814 }
8815 #endif
8816
8818 }
8819 else if (HasEnergyManager())
8820 {
8821 #ifdef DEVELOPER
8822 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8823 {
8824 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8825 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8826 }
8827 #endif
8828 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8829 }
8830 else
8831 {
8832 #ifdef DEVELOPER
8833 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8834 {
8835 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8836 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8837 }
8838 #endif
8839 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8840 }
8841 }
8842
8845 {
8846 int item_count = 0;
8848
8849 if (GetInventory().GetCargo() != NULL)
8850 {
8851 item_count = GetInventory().GetCargo().GetItemCount();
8852 }
8853
8854 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8855 {
8856 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8857 if (item)
8858 item_count += item.GetNumberOfItems();
8859 }
8860 return item_count;
8861 }
8862
8865 {
8866 float weight = 0;
8867 float wetness = 1;
8868 if (include_wetness)
8871 {
8872 weight = wetness * m_ConfigWeight;
8873 }
8875 {
8876 weight = 1;
8877 }
8878 return weight;
8879 }
8880
8881
8882
8884 {
8885 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8886 {
8887 GameInventory inv = GetInventory();
8888 array<EntityAI> items = new array<EntityAI>;
8890 for (int i = 0; i < items.Count(); i++)
8891 {
8893 if (item)
8894 {
8896 }
8897 }
8898 }
8899 }
8900
8901
8902
8903
8905 {
8906 float energy = 0;
8907 if (HasEnergyManager())
8908 {
8909 energy = GetCompEM().GetEnergy();
8910 }
8911 return energy;
8912 }
8913
8914
8916 {
8917 super.OnEnergyConsumed();
8918
8920 }
8921
8923 {
8924 super.OnEnergyAdded();
8925
8927 }
8928
8929
8931 {
8932 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8933 {
8935 {
8936 float energy_0to1 = GetCompEM().GetEnergy0To1();
8938 }
8939 }
8940 }
8941
8942
8944 {
8945 return ConfigGetFloat("heatIsolation");
8946 }
8947
8949 {
8951 }
8952
8954 {
8955 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8956 if (
GetGame().ConfigIsExisting(paramPath))
8958
8959 return 0.0;
8960 }
8961
8963 {
8964 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8965 if (
GetGame().ConfigIsExisting(paramPath))
8967
8968 return 0.0;
8969 }
8970
8971 override void SetWet(
float value,
bool allow_client =
false)
8972 {
8973 if (!IsServerCheck(allow_client))
8974 return;
8975
8978
8980
8981 m_VarWet = Math.Clamp(value, min, max);
8982
8984 {
8987 }
8988 }
8989
8990 override void AddWet(
float value)
8991 {
8993 }
8994
8996 {
8998 }
8999
9001 {
9003 }
9004
9006 {
9008 }
9009
9011 {
9013 }
9014
9016 {
9018 }
9019
9021 {
9024 if (newLevel != oldLevel)
9025 {
9027 }
9028 }
9029
9031 {
9032 SetWeightDirty();
9033 }
9034
9036 {
9037 return GetWetLevelInternal(
m_VarWet);
9038 }
9039
9040
9041
9043 {
9045 }
9046
9048 {
9050 }
9051
9053 {
9055 }
9056
9058 {
9060 }
9061
9062
9063
9065 {
9066 if (ConfigIsExisting("itemModelLength"))
9067 {
9068 return ConfigGetFloat("itemModelLength");
9069 }
9070 return 0;
9071 }
9072
9074 {
9075 if (ConfigIsExisting("itemAttachOffset"))
9076 {
9077 return ConfigGetFloat("itemAttachOffset");
9078 }
9079 return 0;
9080 }
9081
9082 override void SetCleanness(
int value,
bool allow_client =
false)
9083 {
9084 if (!IsServerCheck(allow_client))
9085 return;
9086
9088
9090
9093 }
9094
9096 {
9098 }
9099
9101 {
9102 return true;
9103 }
9104
9105
9106
9107
9109 {
9111 }
9112
9114 {
9116 }
9117
9118
9119
9120
9121 override void SetColor(
int r,
int g,
int b,
int a)
9122 {
9128 }
9130 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9131 {
9136 }
9137
9139 {
9141 }
9142
9145 {
9146 int r,g,b,a;
9148 r = r/255;
9149 g = g/255;
9150 b = b/255;
9151 a = a/255;
9152 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9153 }
9154
9155
9156
9157 override void SetLiquidType(
int value,
bool allow_client =
false)
9158 {
9159 if (!IsServerCheck(allow_client))
9160 return;
9161
9166 }
9167
9169 {
9170 return ConfigGetInt("varLiquidTypeInit");
9171 }
9172
9174 {
9176 }
9177
9179 {
9181 SetFrozen(false);
9182 }
9183
9186 {
9187 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9188 }
9189
9190
9193 {
9194 PlayerBase nplayer;
9195 if (PlayerBase.CastTo(nplayer, player))
9196 {
9198
9199 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9200 }
9201 }
9202
9203
9206 {
9207 PlayerBase nplayer;
9208 if (PlayerBase.CastTo(nplayer,player))
9209 {
9210
9211 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9212
9213 }
9214
9215
9216 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9217
9218
9219 if (HasEnergyManager())
9220 {
9221 GetCompEM().UpdatePlugState();
9222 }
9223 }
9224
9225
9227 {
9228 super.OnPlacementStarted(player);
9229
9231 }
9232
9233 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9234 {
9236 {
9237 m_AdminLog.OnPlacementComplete(player,
this);
9238 }
9239
9240 super.OnPlacementComplete(player, position, orientation);
9241 }
9242
9243
9244
9245
9246
9248 {
9250 {
9251 return true;
9252 }
9253 else
9254 {
9255 return false;
9256 }
9257 }
9258
9259
9261 {
9263 {
9265 }
9266 }
9267
9268
9270 {
9272 }
9273
9275 {
9277 }
9278
9279 override void InsertAgent(
int agent,
float count = 1)
9280 {
9281 if (count < 1)
9282 return;
9283
9285 }
9286
9289 {
9291 }
9292
9293
9295 {
9297 }
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9341 {
9343 return false;
9344 return true;
9345 }
9346
9348 {
9349
9351 }
9352
9353
9356 {
9357 super.CheckForRoofLimited(timeTresholdMS);
9358
9360 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9361 {
9362 m_PreviousRoofTestTime = time;
9363 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9364 }
9365 }
9366
9367
9369 {
9371 {
9372 return 0;
9373 }
9374
9375 if (GetInventory().GetAttachmentSlotsCount() != 0)
9376 {
9377 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9378 if (filter)
9379 return filter.GetProtectionLevel(type, false, system);
9380 else
9381 return 0;
9382 }
9383
9384 string subclassPath, entryName;
9385
9386 switch (type)
9387 {
9389 entryName = "biological";
9390 break;
9392 entryName = "chemical";
9393 break;
9394 default:
9395 entryName = "biological";
9396 break;
9397 }
9398
9399 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9400
9402 }
9403
9404
9405
9408 {
9409 if (!IsMagazine())
9411
9413 }
9414
9415
9416
9417
9418
9423 {
9424 return true;
9425 }
9426
9428 {
9430 }
9431
9432
9433
9434
9435
9437 {
9438 if (parent)
9439 {
9440 if (parent.IsInherited(DayZInfected))
9441 return true;
9442
9443 if (!parent.IsRuined())
9444 return true;
9445 }
9446
9447 return true;
9448 }
9449
9451 {
9452 if (!super.CanPutAsAttachment(parent))
9453 {
9454 return false;
9455 }
9456
9457 if (!IsRuined() && !parent.IsRuined())
9458 {
9459 return true;
9460 }
9461
9462 return false;
9463 }
9464
9466 {
9467
9468
9469
9470
9471 return super.CanReceiveItemIntoCargo(item);
9472 }
9473
9475 {
9476
9477
9478
9479
9480 GameInventory attachmentInv = attachment.GetInventory();
9482 {
9483 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9484 return false;
9485 }
9486
9487 InventoryLocation loc = new InventoryLocation();
9488 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9489 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9490 return false;
9491
9492 return super.CanReceiveAttachment(attachment, slotId);
9493 }
9494
9496 {
9497 if (!super.CanReleaseAttachment(attachment))
9498 return false;
9499
9500 return GetInventory().AreChildrenAccessible();
9501 }
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9524 {
9525 int id = muzzle_owner.GetMuzzleID();
9526 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9527
9528 if (WPOF_array)
9529 {
9530 for (int i = 0; i < WPOF_array.Count(); i++)
9531 {
9532 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9533
9534 if (WPOF)
9535 {
9536 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9537 }
9538 }
9539 }
9540 }
9541
9542
9544 {
9545 int id = muzzle_owner.GetMuzzleID();
9547
9548 if (WPOBE_array)
9549 {
9550 for (int i = 0; i < WPOBE_array.Count(); i++)
9551 {
9552 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9553
9554 if (WPOBE)
9555 {
9556 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9557 }
9558 }
9559 }
9560 }
9561
9562
9564 {
9565 int id = muzzle_owner.GetMuzzleID();
9566 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9567
9568 if (WPOOH_array)
9569 {
9570 for (int i = 0; i < WPOOH_array.Count(); i++)
9571 {
9572 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9573
9574 if (WPOOH)
9575 {
9576 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9577 }
9578 }
9579 }
9580 }
9581
9582
9584 {
9585 int id = muzzle_owner.GetMuzzleID();
9586 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9587
9588 if (WPOOH_array)
9589 {
9590 for (int i = 0; i < WPOOH_array.Count(); i++)
9591 {
9592 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9593
9594 if (WPOOH)
9595 {
9596 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9597 }
9598 }
9599 }
9600 }
9601
9602
9604 {
9605 int id = muzzle_owner.GetMuzzleID();
9606 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9607
9608 if (WPOOH_array)
9609 {
9610 for (int i = 0; i < WPOOH_array.Count(); i++)
9611 {
9612 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9613
9614 if (WPOOH)
9615 {
9616 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9617 }
9618 }
9619 }
9620 }
9621
9622
9623
9625 {
9627 {
9628 return true;
9629 }
9630
9631 return false;
9632 }
9633
9635 {
9637 {
9638 return true;
9639 }
9640
9641 return false;
9642 }
9643
9645 {
9647 {
9648 return true;
9649 }
9650
9651 return false;
9652 }
9653
9655 {
9656 return false;
9657 }
9658
9661 {
9662 return UATimeSpent.DEFAULT_DEPLOY;
9663 }
9664
9665
9666
9667
9669 {
9671 SetSynchDirty();
9672 }
9673
9675 {
9677 }
9678
9679
9681 {
9682 return false;
9683 }
9684
9687 {
9688 string att_type = "None";
9689
9690 if (ConfigIsExisting("soundAttType"))
9691 {
9692 att_type = ConfigGetString("soundAttType");
9693 }
9694
9696 }
9697
9699 {
9701 }
9702
9703
9704
9705
9706
9710
9712 {
9715
9717 }
9718
9719
9721 {
9723 return;
9724
9726
9729
9732
9733 SoundParameters params = new SoundParameters();
9737 }
9738
9739
9741 {
9743 return;
9744
9746 SetSynchDirty();
9747
9750 }
9751
9752
9754 {
9756 return;
9757
9759 SetSynchDirty();
9760
9763 }
9764
9766 {
9768 }
9769
9771 {
9773 }
9774
9777 {
9778 if (!
GetGame().IsDedicatedServer())
9779 {
9780 if (ConfigIsExisting("attachSoundSet"))
9781 {
9782 string cfg_path = "";
9783 string soundset = "";
9785
9788 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9789 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9790
9791 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9792 {
9793 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9794 {
9795 if (cfg_slot_array[i] == slot_type)
9796 {
9797 soundset = cfg_soundset_array[i];
9798 break;
9799 }
9800 }
9801 }
9802
9803 if (soundset != "")
9804 {
9805 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9807 }
9808 }
9809 }
9810 }
9811
9813 {
9814
9815 }
9816
9817 void OnApply(PlayerBase player);
9818
9820 {
9821 return 1.0;
9822 };
9823
9825 {
9827 }
9828
9830 {
9832 }
9833
9835
9837 {
9838 SetDynamicPhysicsLifeTime(0.01);
9840 }
9841
9843 {
9844 array<string> zone_names = new array<string>;
9845 GetDamageZones(zone_names);
9846 for (int i = 0; i < zone_names.Count(); i++)
9847 {
9848 SetHealthMax(zone_names.Get(i),"Health");
9849 }
9850 SetHealthMax("","Health");
9851 }
9852
9855 {
9856 float global_health = GetHealth01("","Health");
9857 array<string> zones = new array<string>;
9858 GetDamageZones(zones);
9859
9860 for (int i = 0; i < zones.Count(); i++)
9861 {
9862 SetHealth01(zones.Get(i),"Health",global_health);
9863 }
9864 }
9865
9868 {
9869 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9870 }
9871
9873 {
9874 if (!hasRootAsPlayer)
9875 {
9876 if (refParentIB)
9877 {
9878
9879 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9880 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9881
9882 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9883 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9884
9887 }
9888 else
9889 {
9890
9893 }
9894 }
9895 }
9896
9898 {
9900 {
9901 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9902 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9903 {
9904 float heatPermCoef = 1.0;
9906 while (ent)
9907 {
9908 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9909 ent = ent.GetHierarchyParent();
9910 }
9911
9912 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9913 }
9914 }
9915 }
9916
9918 {
9919
9920 EntityAI parent = GetHierarchyParent();
9921 if (!parent)
9922 {
9923 hasParent = false;
9924 hasRootAsPlayer = false;
9925 }
9926 else
9927 {
9928 hasParent = true;
9929 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9930 refParentIB =
ItemBase.Cast(parent);
9931 }
9932 }
9933
9934 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9935 {
9936
9937 }
9938
9940 {
9941
9942 return false;
9943 }
9944
9946 {
9947
9948
9949 return false;
9950 }
9951
9953 {
9954
9955 return false;
9956 }
9957
9960 {
9961 return !GetIsFrozen() &&
IsOpen();
9962 }
9963
9965 {
9966 bool hasParent = false, hasRootAsPlayer = false;
9968
9969 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9970 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9971
9972 if (wwtu || foodDecay)
9973 {
9977
9978 if (processWetness || processTemperature || processDecay)
9979 {
9981
9982 if (processWetness)
9983 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9984
9985 if (processTemperature)
9987
9988 if (processDecay)
9989 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9990 }
9991 }
9992 }
9993
9996 {
9998 }
9999
10001 {
10004
10005 return super.GetTemperatureFreezeThreshold();
10006 }
10007
10009 {
10012
10013 return super.GetTemperatureThawThreshold();
10014 }
10015
10017 {
10020
10021 return super.GetItemOverheatThreshold();
10022 }
10023
10025 {
10027 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10028
10029 return super.GetTemperatureFreezeTime();
10030 }
10031
10033 {
10035 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10036
10037 return super.GetTemperatureThawTime();
10038 }
10039
10044
10046 {
10047 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10048 }
10049
10051 {
10052 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10053 }
10054
10057 {
10059 }
10060
10062 {
10064 }
10065
10067 {
10069 }
10070
10073 {
10074 return null;
10075 }
10076
10079 {
10080 return false;
10081 }
10082
10084 {
10086 {
10089 if (!trg)
10090 {
10092 explosive = this;
10093 }
10094
10095 explosive.PairRemote(trg);
10097
10098 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10099 trg.SetPersistentPairID(persistentID);
10100 explosive.SetPersistentPairID(persistentID);
10101
10102 return true;
10103 }
10104 return false;
10105 }
10106
10109 {
10110 float ret = 1.0;
10113 ret *= GetHealth01();
10114
10115 return ret;
10116 }
10117
10118 #ifdef DEVELOPER
10119 override void SetDebugItem()
10120 {
10121 super.SetDebugItem();
10122 _itemBase = this;
10123 }
10124
10126 {
10127 string text = super.GetDebugText();
10128
10130 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10131
10132 return text;
10133 }
10134 #endif
10135
10137 {
10138 return true;
10139 }
10140
10142
10144
10146 {
10149 }
10150
10151
10159
10175}
10176
10178{
10180 if (entity)
10181 {
10182 bool is_item = entity.IsInherited(
ItemBase);
10183 if (is_item && full_quantity)
10184 {
10187 }
10188 }
10189 else
10190 {
10192 return NULL;
10193 }
10194 return entity;
10195}
10196
10198{
10199 if (item)
10200 {
10201 if (health > 0)
10202 item.SetHealth("", "", health);
10203
10204 if (item.CanHaveTemperature())
10205 {
10207 if (item.CanFreeze())
10208 item.SetFrozen(false);
10209 }
10210
10211 if (item.HasEnergyManager())
10212 {
10213 if (quantity >= 0)
10214 {
10215 item.GetCompEM().SetEnergy0To1(quantity);
10216 }
10217 else
10218 {
10220 }
10221 }
10222 else if (item.IsMagazine())
10223 {
10224 Magazine mag = Magazine.Cast(item);
10225 if (quantity >= 0)
10226 {
10227 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10228 }
10229 else
10230 {
10232 }
10233
10234 }
10235 else
10236 {
10237 if (quantity >= 0)
10238 {
10239 item.SetQuantityNormalized(quantity, false);
10240 }
10241 else
10242 {
10244 }
10245
10246 }
10247 }
10248}
10249
10250#ifdef DEVELOPER
10252#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
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 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...
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)
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)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
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()
override int GetLiquidType()
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)
void Open()
Implementations only.
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 EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
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 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 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
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
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 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 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.