5466{
5468 {
5469 return true;
5470 }
5471};
5472
5473
5474
5476{
5480
5482
5485
5486
5487
5488
5489
5498
5504
5509
5514
5535 protected bool m_IsResultOfSplit
5536
5538
5543
5544
5545
5547
5551
5552
5553
5555
5558
5559
5560
5566
5567
5575
5578
5579
5581
5582
5584
5585
5590
5591
5596
5597
5599
5600
5602 {
5607
5608 if (!
GetGame().IsDedicatedServer())
5609 {
5611 {
5613
5615 {
5617 }
5618 }
5619
5622 }
5623
5624 m_OldLocation = null;
5625
5627 {
5629 }
5630
5631 if (ConfigIsExisting("headSelectionsToHide"))
5632 {
5635 }
5636
5638 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5639 {
5641 }
5642
5644
5645 m_IsResultOfSplit = false;
5646
5648 }
5649
5651 {
5652 super.InitItemVariables();
5653
5659 m_Count = ConfigGetInt(
"count");
5660
5663
5668
5671
5676
5688
5692
5693
5696 if (ConfigIsExisting("canBeSplit"))
5697 {
5700 }
5701
5703 if (ConfigIsExisting("itemBehaviour"))
5705
5706
5709 RegisterNetSyncVariableInt("m_VarLiquidType");
5710 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5711
5712 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5713 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5714 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5715
5716 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5717 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5718 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5719 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5720
5721 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5722 RegisterNetSyncVariableBool("m_IsTakeable");
5723 RegisterNetSyncVariableBool("m_IsHologram");
5724
5727 {
5730 }
5731
5733
5735 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5737
5738 }
5739
5741 {
5743 }
5744
5746 {
5749 {
5754 }
5755 }
5756
5757 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5758 {
5760 {
5763 }
5764
5766 }
5767
5769 {
5775 }
5776
5778
5780 {
5782
5783 if (!action)
5784 {
5785 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5786 return;
5787 }
5788
5790 if (!ai)
5791 {
5793 return;
5794 }
5795
5797 if (!action_array)
5798 {
5799 action_array = new array<ActionBase_Basic>;
5801 }
5802 if (LogManager.IsActionLogEnable())
5803 {
5804 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5805 }
5806
5807 if (action_array.Find(action) != -1)
5808 {
5809 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5810 }
5811 else
5812 {
5813 action_array.Insert(action);
5814 }
5815 }
5816
5818 {
5820 ActionBase action = player.GetActionManager().GetAction(actionName);
5823
5824 if (action_array)
5825 {
5826 action_array.RemoveItem(action);
5827 }
5828 }
5829
5830
5831
5833 {
5834 ActionOverrideData overrideData = new ActionOverrideData();
5838
5840 if (!actionMap)
5841 {
5844 }
5845
5846 actionMap.Insert(this.
Type(), overrideData);
5847
5848 }
5849
5851
5853
5854
5856 {
5859
5862
5863 string config_to_search = "CfgVehicles";
5864 string muzzle_owner_config;
5865
5867 {
5868 if (IsInherited(Weapon))
5869 config_to_search = "CfgWeapons";
5870
5871 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5872
5873 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5874
5876
5877 if (config_OnFire_subclass_count > 0)
5878 {
5879 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5880
5881 for (int i = 0; i < config_OnFire_subclass_count; i++)
5882 {
5883 string particle_class = "";
5885 string config_OnFire_entry = config_OnFire_class + particle_class;
5886 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5887 WPOF_array.Insert(WPOF);
5888 }
5889
5890
5892 }
5893 }
5894
5896 {
5897 config_to_search = "CfgWeapons";
5898 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5899
5900 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5901
5903
5904 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5905 {
5906 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5907
5908 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5909 {
5910 string particle_class2 = "";
5912 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5913 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5914 WPOBE_array.Insert(WPOBE);
5915 }
5916
5917
5919 }
5920 }
5921 }
5922
5923
5925 {
5928
5930 {
5931 string config_to_search = "CfgVehicles";
5932
5933 if (IsInherited(Weapon))
5934 config_to_search = "CfgWeapons";
5935
5936 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5937 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5938
5939 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5940 {
5941
5943
5945 {
5947 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5949 return;
5950 }
5951
5954
5955
5956
5958 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5959
5960 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5961 {
5962 string particle_class = "";
5964 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5966
5967 if (entry_type == CT_CLASS)
5968 {
5969 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5970 WPOOH_array.Insert(WPOF);
5971 }
5972 }
5973
5974
5976 }
5977 }
5978 }
5979
5981 {
5983 }
5984
5986 {
5988 {
5990
5993
5996
5997 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5998 }
5999 }
6000
6002 {
6004 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6005
6007 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6008
6010 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6011
6013 {
6015 }
6016 }
6017
6019 {
6021 }
6022
6024 {
6027 else
6029
6031 {
6034 }
6035 else
6036 {
6039
6042 }
6043
6045 }
6046
6048 {
6050 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6051 }
6052
6054 {
6056 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6058 }
6059
6061 {
6063 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6064 }
6065
6067 {
6070
6071 OverheatingParticle OP = new OverheatingParticle();
6076
6078 }
6079
6081 {
6084
6085 return -1;
6086 }
6087
6089 {
6091 {
6094
6095 for (int i = count; i > 0; --i)
6096 {
6097 int id = i - 1;
6100
6103
6104 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6105 {
6106 if (p)
6107 {
6110 }
6111 }
6112 }
6113 }
6114 }
6115
6117 {
6119 {
6121 {
6122 int id = i - 1;
6124
6125 if (OP)
6126 {
6128
6129 if (p)
6130 {
6132 }
6133
6134 delete OP;
6135 }
6136 }
6137
6140 }
6141 }
6142
6145 {
6146 return 0.0;
6147 }
6148
6149
6151 {
6152 return 250;
6153 }
6154
6156 {
6157 return 0;
6158 }
6159
6162 {
6164 return true;
6165
6166 return false;
6167 }
6168
6171 {
6174
6176 {
6178 }
6179 else
6180 {
6181
6183 }
6184
6186 }
6187
6194 {
6195 return -1;
6196 }
6197
6198
6199
6200
6202 {
6204 {
6206 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6207
6208 if (r_index >= 0)
6209 {
6210 InventoryLocation r_il = new InventoryLocation;
6211 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6212
6213 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6216 {
6217 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6218 }
6220 {
6221 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6222 }
6223
6224 }
6225
6226 player.GetHumanInventory().ClearUserReservedLocation(this);
6227 }
6228
6231 }
6232
6233
6234
6235
6237 {
6238 return ItemBase.m_DebugActionsMask;
6239 }
6240
6242 {
6243 return ItemBase.m_DebugActionsMask & mask;
6244 }
6245
6247 {
6248 ItemBase.m_DebugActionsMask = mask;
6249 }
6250
6252 {
6253 ItemBase.m_DebugActionsMask |= mask;
6254 }
6255
6257 {
6258 ItemBase.m_DebugActionsMask &= ~mask;
6259 }
6260
6262 {
6264 {
6266 }
6267 else
6268 {
6270 }
6271 }
6272
6273
6275 {
6276 if (GetEconomyProfile())
6277 {
6278 float q_max = GetEconomyProfile().GetQuantityMax();
6279 if (q_max > 0)
6280 {
6281 float q_min = GetEconomyProfile().GetQuantityMin();
6282 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6283
6285 {
6286 ComponentEnergyManager comp = GetCompEM();
6288 {
6290 }
6291 }
6293 {
6295
6296 }
6297
6298 }
6299 }
6300 }
6301
6304 {
6305 EntityAI parent = GetHierarchyParent();
6306
6307 if (parent)
6308 {
6309 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6310 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6311 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6312 }
6313 }
6314
6317 {
6318 EntityAI parent = GetHierarchyParent();
6319
6320 if (parent)
6321 {
6322 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6323 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6324 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6325 }
6326 }
6327
6329 {
6330
6331
6332
6333
6335
6337 {
6338 if (ScriptInputUserData.CanStoreInputUserData())
6339 {
6340 ScriptInputUserData ctx = new ScriptInputUserData;
6346 ctx.
Write(use_stack_max);
6349
6351 {
6352 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6353 }
6354 }
6355 }
6356 else if (!
GetGame().IsMultiplayer())
6357 {
6359 }
6360 }
6361
6363 {
6365 }
6366
6368 {
6370 }
6371
6373 {
6375 }
6376
6378 {
6379
6380 return false;
6381 }
6382
6384 {
6385 return false;
6386 }
6387
6391 {
6392 return false;
6393 }
6394
6396 {
6397 return "";
6398 }
6399
6401
6403 {
6404 return false;
6405 }
6406
6408 {
6409 return true;
6410 }
6411
6412
6413
6415 {
6416 return true;
6417 }
6418
6420 {
6421 return true;
6422 }
6423
6425 {
6426 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6428 }
6429
6431 {
6433 }
6434
6436 {
6438 if (!is_being_placed)
6440 SetSynchDirty();
6441 }
6442
6443
6445
6447 {
6449 }
6450
6452 {
6454 }
6455
6457 {
6458 return 1;
6459 }
6460
6462 {
6463 return false;
6464 }
6465
6467 {
6469 SetSynchDirty();
6470 }
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6494
6495
6496
6497
6498
6499
6500
6501
6502
6503
6504
6505
6507 {
6508 super.OnMovedInsideCargo(container);
6509
6510 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6511 }
6512
6513 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6514 {
6515 super.EEItemLocationChanged(oldLoc,newLoc);
6516
6517 PlayerBase new_player = null;
6518 PlayerBase old_player = null;
6519
6520 if (newLoc.GetParent())
6521 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6522
6523 if (oldLoc.GetParent())
6524 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6525
6527 {
6528 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6529
6530 if (r_index >= 0)
6531 {
6532 InventoryLocation r_il = new InventoryLocation;
6533 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6534
6535 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6538 {
6539 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6540 }
6542 {
6543 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6544 }
6545
6546 }
6547 }
6548
6550 {
6551 if (new_player)
6552 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6553
6554 if (new_player == old_player)
6555 {
6556
6557 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6558 {
6560 {
6561 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6562 {
6563 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6564 }
6565 }
6566 else
6567 {
6568 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6569 }
6570 }
6571
6572 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6573 {
6574 int type = oldLoc.GetType();
6576 {
6577 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6578 }
6580 {
6581 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6582 }
6583 }
6584 if (!m_OldLocation)
6585 {
6586 m_OldLocation = new InventoryLocation;
6587 }
6588 m_OldLocation.Copy(oldLoc);
6589 }
6590 else
6591 {
6592 if (m_OldLocation)
6593 {
6594 m_OldLocation.Reset();
6595 }
6596 }
6597
6599 }
6600 else
6601 {
6602 if (new_player)
6603 {
6604 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6605 if (res_index >= 0)
6606 {
6607 InventoryLocation il = new InventoryLocation;
6608 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6610 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6613 {
6614 il.
GetParent().GetOnReleaseLock().Invoke(it);
6615 }
6617 {
6619 }
6620
6621 }
6622 }
6624 {
6625
6627 }
6628
6629 if (m_OldLocation)
6630 {
6631 m_OldLocation.Reset();
6632 }
6633 }
6634 }
6635
6636 override void EOnContact(IEntity other, Contact extra)
6637 {
6639 {
6640 int liquidType = -1;
6642 if (impactSpeed > 0.0)
6643 {
6645 #ifndef SERVER
6647 #else
6649 SetSynchDirty();
6650 #endif
6652 }
6653 }
6654
6655 #ifdef SERVER
6656 if (GetCompEM() && GetCompEM().IsPlugged())
6657 {
6658 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6659 GetCompEM().UnplugThis();
6660 }
6661 #endif
6662 }
6663
6665
6667 {
6669 }
6670
6672 {
6673
6674 }
6675
6677 {
6678 super.OnItemLocationChanged(old_owner, new_owner);
6679
6680 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6681 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6682
6683 if (!relatedPlayer && playerNew)
6684 relatedPlayer = playerNew;
6685
6686 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6687 {
6689 if (actionMgr)
6690 {
6691 ActionBase currentAction = actionMgr.GetRunningAction();
6692 if (currentAction)
6694 }
6695 }
6696
6697 Man ownerPlayerOld = null;
6698 Man ownerPlayerNew = null;
6699
6700 if (old_owner)
6701 {
6702 if (old_owner.
IsMan())
6703 {
6704 ownerPlayerOld = Man.Cast(old_owner);
6705 }
6706 else
6707 {
6708 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6709 }
6710 }
6711 else
6712 {
6714 {
6716
6717 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6718 {
6719 GetCompEM().UnplugThis();
6720 }
6721 }
6722 }
6723
6724 if (new_owner)
6725 {
6726 if (new_owner.
IsMan())
6727 {
6728 ownerPlayerNew = Man.Cast(new_owner);
6729 }
6730 else
6731 {
6732 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6733 }
6734 }
6735
6736 if (ownerPlayerOld != ownerPlayerNew)
6737 {
6738 if (ownerPlayerOld)
6739 {
6740 array<EntityAI> subItemsExit = new array<EntityAI>;
6742 for (int i = 0; i < subItemsExit.Count(); i++)
6743 {
6746 }
6747 }
6748
6749 if (ownerPlayerNew)
6750 {
6751 array<EntityAI> subItemsEnter = new array<EntityAI>;
6753 for (int j = 0; j < subItemsEnter.Count(); j++)
6754 {
6757 }
6758 }
6759 }
6760 else if (ownerPlayerNew != null)
6761 {
6762 PlayerBase nplayer;
6763 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6764 {
6765 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6767 for (int k = 0; k < subItemsUpdate.Count(); k++)
6768 {
6770 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6771 }
6772 }
6773 }
6774
6775 if (old_owner)
6776 old_owner.OnChildItemRemoved(this);
6777 if (new_owner)
6778 new_owner.OnChildItemReceived(this);
6779 }
6780
6781
6783 {
6784 super.EEDelete(parent);
6785 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6786 if (player)
6787 {
6789
6790 if (player.IsAlive())
6791 {
6792 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6793 if (r_index >= 0)
6794 {
6795 InventoryLocation r_il = new InventoryLocation;
6796 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6797
6798 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6801 {
6802 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6803 }
6805 {
6806 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6807 }
6808
6809 }
6810
6811 player.RemoveQuickBarEntityShortcut(this);
6812 }
6813 }
6814 }
6815
6817 {
6818 super.EEKilled(killer);
6819
6822 {
6823 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6824 {
6825 if (IsMagazine())
6826 {
6827 if (Magazine.Cast(this).GetAmmoCount() > 0)
6828 {
6830 }
6831 }
6832 else
6833 {
6835 }
6836 }
6837 }
6838 }
6839
6841 {
6842 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6843
6844 super.OnWasAttached(parent, slot_id);
6845
6848
6850 }
6851
6853 {
6854 super.OnWasDetached(parent, slot_id);
6855
6858 }
6859
6861 {
6862 int idx;
6865
6866 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6867 if (inventory_slots.Count() < 1)
6868 {
6869 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6870 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6871 }
6872 else
6873 {
6874 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6875 }
6876
6877 idx = inventory_slots.Find(slot);
6878 if (idx < 0)
6879 return "";
6880
6881 return attach_types.Get(idx);
6882 }
6883
6885 {
6886 int idx = -1;
6887 string slot;
6888
6891
6892 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6893 if (inventory_slots.Count() < 1)
6894 {
6895 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6896 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6897 }
6898 else
6899 {
6900 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6901 if (detach_types.Count() < 1)
6902 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6903 }
6904
6905 for (int i = 0; i < inventory_slots.Count(); i++)
6906 {
6907 slot = inventory_slots.Get(i);
6908 }
6909
6910 if (slot != "")
6911 {
6912 if (detach_types.Count() == 1)
6913 idx = 0;
6914 else
6915 idx = inventory_slots.Find(slot);
6916 }
6917 if (idx < 0)
6918 return "";
6919
6920 return detach_types.Get(idx);
6921 }
6922
6924 {
6925
6927
6928
6929 float min_time = 1;
6930 float max_time = 3;
6931 float delay = Math.RandomFloat(min_time, max_time);
6932
6933 explode_timer.Run(delay, this, "DoAmmoExplosion");
6934 }
6935
6937 {
6938 Magazine magazine = Magazine.Cast(this);
6939 int pop_sounds_count = 6;
6940 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6941
6942
6943 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6944 string sound_name = pop_sounds[ sound_idx ];
6946
6947
6948 magazine.ServerAddAmmoCount(-1);
6949
6950
6951 float min_temp_to_explode = 100;
6952
6953 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6954 {
6956 }
6957 }
6958
6959
6960 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6961 {
6962 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6963
6964 const int CHANCE_DAMAGE_CARGO = 4;
6965 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6966 const int CHANCE_DAMAGE_NOTHING = 2;
6967
6969 {
6970 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6971 int chances;
6972 int rnd;
6973
6974 if (GetInventory().GetCargo())
6975 {
6976 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6977 rnd = Math.RandomInt(0,chances);
6978
6979 if (rnd < CHANCE_DAMAGE_CARGO)
6980 {
6982 }
6983 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6984 {
6986 }
6987 }
6988 else
6989 {
6990 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6991 rnd = Math.RandomInt(0,chances);
6992
6993 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6994 {
6996 }
6997 }
6998 }
6999 }
7000
7002 {
7003 if (GetInventory().GetCargo())
7004 {
7005 int item_count = GetInventory().GetCargo().GetItemCount();
7006 if (item_count > 0)
7007 {
7008 int random_pick = Math.RandomInt(0, item_count);
7010 if (!item.IsExplosive())
7011 {
7012 item.AddHealth("","",damage);
7013 return true;
7014 }
7015 }
7016 }
7017 return false;
7018 }
7019
7021 {
7022 int attachment_count = GetInventory().AttachmentCount();
7023 if (attachment_count > 0)
7024 {
7025 int random_pick = Math.RandomInt(0, attachment_count);
7026 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7027 if (!attachment.IsExplosive())
7028 {
7029 attachment.AddHealth("","",damage);
7030 return true;
7031 }
7032 }
7033 return false;
7034 }
7035
7037 {
7039 }
7040
7042 {
7044 return GetInventory().CanRemoveEntity();
7045
7046 return false;
7047 }
7048
7050 {
7052 return;
7053
7055 {
7056 if (ScriptInputUserData.CanStoreInputUserData())
7057 {
7058 ScriptInputUserData ctx = new ScriptInputUserData;
7063 ctx.
Write(destination_entity);
7067 }
7068 }
7069 else if (!
GetGame().IsMultiplayer())
7070 {
7072 }
7073 }
7074
7076 {
7078 return;
7079
7080 float split_quantity_new;
7084 InventoryLocation loc = new InventoryLocation;
7085
7086 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7087 {
7089 split_quantity_new = stack_max;
7090 else
7092
7093 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7094 if (new_item)
7095 {
7096 new_item.SetResultOfSplit(true);
7097 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7099 new_item.SetQuantity(split_quantity_new);
7100 }
7101 }
7102 else if (destination_entity && slot_id == -1)
7103 {
7104 if (quantity > stack_max)
7105 split_quantity_new = stack_max;
7106 else
7107 split_quantity_new = quantity;
7108
7110 {
7113 }
7114
7115 if (new_item)
7116 {
7117 new_item.SetResultOfSplit(true);
7118 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7120 new_item.SetQuantity(split_quantity_new);
7121 }
7122 }
7123 else
7124 {
7125 if (stack_max != 0)
7126 {
7128 {
7130 }
7131
7132 if (split_quantity_new == 0)
7133 {
7134 if (!
GetGame().IsMultiplayer())
7135 player.PhysicalPredictiveDropItem(this);
7136 else
7137 player.ServerDropEntity(this);
7138 return;
7139 }
7140
7142
7143 if (new_item)
7144 {
7145 new_item.SetResultOfSplit(true);
7146 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7148 new_item.SetQuantity(stack_max);
7149 new_item.PlaceOnSurface();
7150 }
7151 }
7152 }
7153 }
7154
7156 {
7158 return;
7159
7160 float split_quantity_new;
7164 InventoryLocation loc = new InventoryLocation;
7165
7166 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7167 {
7169 split_quantity_new = stack_max;
7170 else
7172
7173 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7174 if (new_item)
7175 {
7176 new_item.SetResultOfSplit(true);
7177 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7179 new_item.SetQuantity(split_quantity_new);
7180 }
7181 }
7182 else if (destination_entity && slot_id == -1)
7183 {
7184 if (quantity > stack_max)
7185 split_quantity_new = stack_max;
7186 else
7187 split_quantity_new = quantity;
7188
7190 {
7193 }
7194
7195 if (new_item)
7196 {
7197 new_item.SetResultOfSplit(true);
7198 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7200 new_item.SetQuantity(split_quantity_new);
7201 }
7202 }
7203 else
7204 {
7205 if (stack_max != 0)
7206 {
7208 {
7210 }
7211
7213
7214 if (new_item)
7215 {
7216 new_item.SetResultOfSplit(true);
7217 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7219 new_item.SetQuantity(stack_max);
7220 new_item.PlaceOnSurface();
7221 }
7222 }
7223 }
7224 }
7225
7227 {
7229 return;
7230
7232 {
7233 if (ScriptInputUserData.CanStoreInputUserData())
7234 {
7235 ScriptInputUserData ctx = new ScriptInputUserData;
7240 dst.WriteToContext(ctx);
7242 }
7243 }
7244 else if (!
GetGame().IsMultiplayer())
7245 {
7247 }
7248 }
7249
7251 {
7253 return;
7254
7256 {
7257 if (ScriptInputUserData.CanStoreInputUserData())
7258 {
7259 ScriptInputUserData ctx = new ScriptInputUserData;
7264 ctx.
Write(destination_entity);
7270 }
7271 }
7272 else if (!
GetGame().IsMultiplayer())
7273 {
7275 }
7276 }
7277
7279 {
7281 }
7282
7284 {
7286 return this;
7287
7289 float split_quantity_new;
7291 if (dst.IsValid())
7292 {
7293 int slot_id = dst.GetSlot();
7295
7296 if (quantity > stack_max)
7297 split_quantity_new = stack_max;
7298 else
7299 split_quantity_new = quantity;
7300
7302
7303 if (new_item)
7304 {
7305 new_item.SetResultOfSplit(true);
7306 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7309 }
7310
7311 return new_item;
7312 }
7313
7314 return null;
7315 }
7316
7318 {
7320 return;
7321
7323 float split_quantity_new;
7325 if (destination_entity)
7326 {
7328 if (quantity > stackable)
7329 split_quantity_new = stackable;
7330 else
7331 split_quantity_new = quantity;
7332
7333 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7334 if (new_item)
7335 {
7336 new_item.SetResultOfSplit(true);
7337 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7339 new_item.SetQuantity(split_quantity_new);
7340 }
7341 }
7342 }
7343
7345 {
7347 return;
7348
7350 {
7351 if (ScriptInputUserData.CanStoreInputUserData())
7352 {
7353 ScriptInputUserData ctx = new ScriptInputUserData;
7358 ItemBase destination_entity =
this;
7359 ctx.
Write(destination_entity);
7363 }
7364 }
7365 else if (!
GetGame().IsMultiplayer())
7366 {
7368 }
7369 }
7370
7372 {
7374 return;
7375
7377 float split_quantity_new;
7379 if (player)
7380 {
7382 if (quantity > stackable)
7383 split_quantity_new = stackable;
7384 else
7385 split_quantity_new = quantity;
7386
7387 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7388 new_item =
ItemBase.Cast(in_hands);
7389 if (new_item)
7390 {
7391 new_item.SetResultOfSplit(true);
7392 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7394 new_item.SetQuantity(split_quantity_new);
7395 }
7396 }
7397 }
7398
7400 {
7402 return;
7403
7405 float split_quantity_new = Math.Floor(quantity * 0.5);
7406
7408
7409 if (new_item)
7410 {
7411 if (new_item.GetQuantityMax() < split_quantity_new)
7412 {
7413 split_quantity_new = new_item.GetQuantityMax();
7414 }
7415
7416 new_item.SetResultOfSplit(true);
7417 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7418
7420 {
7423 }
7424 else
7425 {
7428 }
7429 }
7430 }
7431
7433 {
7435 return;
7436
7438 float split_quantity_new = Math.Floor(quantity / 2);
7439
7440 InventoryLocation invloc = new InventoryLocation;
7442
7444 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7445
7446 if (new_item)
7447 {
7448 if (new_item.GetQuantityMax() < split_quantity_new)
7449 {
7450 split_quantity_new = new_item.GetQuantityMax();
7451 }
7453 {
7456 }
7457 else
7458 {
7461 }
7462 }
7463 }
7464
7467 {
7468 SetWeightDirty();
7470
7471 if (parent)
7472 parent.OnAttachmentQuantityChangedEx(this, delta);
7473
7475 {
7477 {
7479 }
7481 {
7482 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7484 }
7485 }
7486
7487 }
7488
7491 {
7492
7493 }
7494
7497 {
7499 }
7500
7502 {
7503 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7504
7506 {
7507 if (newLevel == GameConstants.STATE_RUINED)
7508 {
7510 EntityAI parent = GetHierarchyParent();
7511 if (parent && parent.IsFireplace())
7512 {
7513 CargoBase cargo = GetInventory().GetCargo();
7514 if (cargo)
7515 {
7517 {
7519 }
7520 }
7521 }
7522 }
7523
7525 {
7526
7528 return;
7529 }
7530
7531 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7532 {
7534 }
7535 }
7536 }
7537
7538
7540 {
7541 super.OnRightClick();
7542
7544 {
7546 {
7547 if (ScriptInputUserData.CanStoreInputUserData())
7548 {
7549 vector m4[4];
7551
7552 EntityAI root = GetHierarchyRoot();
7553
7554 InventoryLocation dst = new InventoryLocation;
7556 {
7557 if (root)
7558 {
7559 root.GetTransform(m4);
7561 }
7562 else
7563 GetInventory().GetCurrentInventoryLocation(dst);
7564 }
7565 else
7566 {
7568
7569
7570 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7571 {
7572 if (root)
7573 {
7574 root.GetTransform(m4);
7576 }
7577 else
7578 GetInventory().GetCurrentInventoryLocation(dst);
7579 }
7580 else
7581 {
7582 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7583 }
7584 }
7585
7586 ScriptInputUserData ctx = new ScriptInputUserData;
7594 }
7595 }
7596 else if (!
GetGame().IsMultiplayer())
7597 {
7599 }
7600 }
7601 }
7602
7603 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7604 {
7605
7606 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7607 return false;
7608
7609 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7610 return false;
7611
7612
7614 return false;
7615
7616
7617 Magazine mag = Magazine.Cast(this);
7618 if (mag)
7619 {
7620 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7621 return false;
7622
7623 if (stack_max_limit)
7624 {
7625 Magazine other_mag = Magazine.Cast(other_item);
7626 if (other_item)
7627 {
7628 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7629 return false;
7630 }
7631
7632 }
7633 }
7634 else
7635 {
7636
7638 return false;
7639
7641 return false;
7642 }
7643
7644 PlayerBase player = null;
7645 if (CastTo(player, GetHierarchyRootPlayer()))
7646 {
7647 if (player.GetInventory().HasAttachment(this))
7648 return false;
7649
7650 if (player.IsItemsToDelete())
7651 return false;
7652 }
7653
7654 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7655 return false;
7656
7657 int slotID;
7659 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7660 return false;
7661
7662 return true;
7663 }
7664
7666 {
7668 }
7669
7671 {
7672 return m_IsResultOfSplit;
7673 }
7674
7676 {
7677 m_IsResultOfSplit = value;
7678 }
7679
7681 {
7683 }
7684
7686 {
7687 float other_item_quantity = other_item.GetQuantity();
7688 float this_free_space;
7689
7691
7693
7694 if (other_item_quantity > this_free_space)
7695 {
7696 return this_free_space;
7697 }
7698 else
7699 {
7700 return other_item_quantity;
7701 }
7702 }
7703
7705 {
7707 }
7708
7710 {
7712 return;
7713
7714 if (!IsMagazine() && other_item)
7715 {
7717 if (quantity_used != 0)
7718 {
7719 float hp1 = GetHealth01("","");
7720 float hp2 = other_item.GetHealth01("","");
7721 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7722 hpResult = hpResult / (
GetQuantity() + quantity_used);
7723
7724 hpResult *= GetMaxHealth();
7725 Math.Round(hpResult);
7726 SetHealth("", "Health", hpResult);
7727
7729 other_item.AddQuantity(-quantity_used);
7730 }
7731 }
7733 }
7734
7736 {
7737 #ifdef SERVER
7738 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7739 GetHierarchyParent().IncreaseLifetimeUp();
7740 #endif
7741 };
7742
7744 {
7745 PlayerBase p = PlayerBase.Cast(player);
7746
7747 array<int> recipesIds = p.m_Recipes;
7748 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7749 if (moduleRecipesManager)
7750 {
7751 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7752 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7753 }
7754
7755 for (int i = 0;i < recipesIds.Count(); i++)
7756 {
7757 int key = recipesIds.Get(i);
7758 string recipeName = moduleRecipesManager.GetRecipeName(key);
7760 }
7761 }
7762
7763
7764 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7765 {
7766 super.GetDebugActions(outputList);
7767
7768
7773
7774
7778
7782
7783
7786
7787
7789 {
7792 }
7793
7795
7798
7802 }
7803
7804
7805
7806
7808 {
7809 super.OnAction(action_id, player, ctx);
7810 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7811 {
7812 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7813 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7814 PlayerBase p = PlayerBase.Cast(player);
7815 if (
EActions.RECIPES_RANGE_START < 1000)
7816 {
7817 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7818 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7819 }
7820 }
7821 #ifndef SERVER
7822 else if (action_id ==
EActions.WATCH_PLAYER)
7823 {
7824 PluginDeveloper.SetDeveloperItemClientEx(player);
7825 }
7826 #endif
7828 {
7829 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7830 {
7831 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7832 OnDebugButtonPressServer(id + 1);
7833 }
7834
7835 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7836 {
7837 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7839 }
7840
7841 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7842 {
7843 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7845 }
7846
7847 else if (action_id ==
EActions.ADD_QUANTITY)
7848 {
7849 if (IsMagazine())
7850 {
7851 Magazine mag = Magazine.Cast(this);
7852 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7853 }
7854 else
7855 {
7857 }
7858
7859 if (m_EM)
7860 {
7861 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7862 }
7863
7864 }
7865
7866 else if (action_id ==
EActions.REMOVE_QUANTITY)
7867 {
7868 if (IsMagazine())
7869 {
7870 Magazine mag2 = Magazine.Cast(this);
7871 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7872 }
7873 else
7874 {
7876 }
7877 if (m_EM)
7878 {
7879 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7880 }
7881
7882 }
7883
7884 else if (action_id ==
EActions.SET_QUANTITY_0)
7885 {
7887
7888 if (m_EM)
7889 {
7890 m_EM.SetEnergy(0);
7891 }
7892 }
7893
7894 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7895 {
7897
7898 if (m_EM)
7899 {
7900 m_EM.SetEnergy(m_EM.GetEnergyMax());
7901 }
7902 }
7903
7904 else if (action_id ==
EActions.ADD_HEALTH)
7905 {
7906 AddHealth("","",GetMaxHealth("","Health")/5);
7907 }
7908 else if (action_id ==
EActions.REMOVE_HEALTH)
7909 {
7910 AddHealth("","",-GetMaxHealth("","Health")/5);
7911 }
7912 else if (action_id ==
EActions.DESTROY_HEALTH)
7913 {
7914 SetHealth01("","",0);
7915 }
7916 else if (action_id ==
EActions.WATCH_ITEM)
7917 {
7919 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7920 #ifdef DEVELOPER
7921 SetDebugDeveloper_item(this);
7922 #endif
7923 }
7924
7925 else if (action_id ==
EActions.ADD_TEMPERATURE)
7926 {
7927 AddTemperature(20);
7928
7929 }
7930
7931 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7932 {
7933 AddTemperature(-20);
7934
7935 }
7936
7937 else if (action_id ==
EActions.FLIP_FROZEN)
7938 {
7939 SetFrozen(!GetIsFrozen());
7940
7941 }
7942
7943 else if (action_id ==
EActions.ADD_WETNESS)
7944 {
7946
7947 }
7948
7949 else if (action_id ==
EActions.REMOVE_WETNESS)
7950 {
7952
7953 }
7954
7955 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7956 {
7959
7960
7961 }
7962
7963 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7964 {
7967 }
7968
7969 else if (action_id ==
EActions.MAKE_SPECIAL)
7970 {
7971 auto debugParams = DebugSpawnParams.WithPlayer(player);
7972 OnDebugSpawnEx(debugParams);
7973 }
7974
7975 else if (action_id ==
EActions.DELETE)
7976 {
7977 Delete();
7978 }
7979
7980 }
7981
7982
7983 return false;
7984 }
7985
7986
7987
7988
7992
7995
7996
7997
7999 {
8000 return false;
8001 }
8002
8003
8005 {
8006 return true;
8007 }
8008
8009
8011 {
8012 return true;
8013 }
8014
8015
8016
8018 {
8019 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8021 }
8022
8025 {
8026 return null;
8027 }
8028
8030 {
8031 return false;
8032 }
8033
8035 {
8036 return false;
8037 }
8038
8042
8043
8045 {
8046 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8047 return module_repairing.CanRepair(this, item_repair_kit);
8048 }
8049
8050
8051 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8052 {
8053 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8054 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8055 }
8056
8057
8059 {
8060
8061
8062
8063
8064
8065
8066
8067
8068 return 1;
8069 }
8070
8071
8072
8074 {
8076 }
8077
8078
8079
8081 {
8083 }
8084
8085
8094 {
8095 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8096
8097 if (player)
8098 {
8099 player.MessageStatus(text);
8100 }
8101 }
8102
8103
8112 {
8113 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8114
8115 if (player)
8116 {
8117 player.MessageAction(text);
8118 }
8119 }
8120
8121
8130 {
8131 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8132
8133 if (player)
8134 {
8135 player.MessageFriendly(text);
8136 }
8137 }
8138
8139
8148 {
8149 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8150
8151 if (player)
8152 {
8153 player.MessageImportant(text);
8154 }
8155 }
8156
8158 {
8159 return true;
8160 }
8161
8162
8163 override bool KindOf(
string tag)
8164 {
8165 bool found = false;
8166 string item_name = this.
GetType();
8169
8170 int array_size = item_tag_array.Count();
8171 for (int i = 0; i < array_size; i++)
8172 {
8173 if (item_tag_array.Get(i) == tag)
8174 {
8175 found = true;
8176 break;
8177 }
8178 }
8179 return found;
8180 }
8181
8182
8184 {
8185
8186 super.OnRPC(sender, rpc_type,ctx);
8187
8188
8189 switch (rpc_type)
8190 {
8191 #ifndef SERVER
8192 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8193 Param2<bool, string> p = new Param2<bool, string>(false, "");
8194
8196 return;
8197
8198 bool play = p.param1;
8199 string soundSet = p.param2;
8200
8201 if (play)
8202 {
8204 {
8206 {
8208 }
8209 }
8210 else
8211 {
8213 }
8214 }
8215 else
8216 {
8218 }
8219
8220 break;
8221 #endif
8222
8223 }
8224
8226 {
8228 }
8229 }
8230
8231
8232
8233
8235 {
8236 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8237 return plugin.GetID(
name);
8238 }
8239
8241 {
8242 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8243 return plugin.GetName(id);
8244 }
8245
8248 {
8249
8250
8251 int varFlags;
8252 if (!ctx.
Read(varFlags))
8253 return;
8254
8255 if (varFlags & ItemVariableFlags.FLOAT)
8256 {
8258 }
8259 }
8260
8262 {
8263
8264 super.SerializeNumericalVars(floats_out);
8265
8266
8267
8269 {
8271 }
8272
8274 {
8276 }
8277
8279 {
8281 }
8282
8284 {
8289 }
8290
8292 {
8294 }
8295 }
8296
8298 {
8299
8300 super.DeSerializeNumericalVars(floats);
8301
8302
8303 int index = 0;
8304 int mask = Math.Round(floats.Get(index));
8305
8306 index++;
8307
8309 {
8311 {
8313 }
8314 else
8315 {
8316 float quantity = floats.Get(index);
8318 }
8319 index++;
8320 }
8321
8323 {
8324 float wet = floats.Get(index);
8326 index++;
8327 }
8328
8330 {
8331 int liquidtype = Math.Round(floats.Get(index));
8333 index++;
8334 }
8335
8337 {
8339 index++;
8341 index++;
8343 index++;
8345 index++;
8346 }
8347
8349 {
8350 int cleanness = Math.Round(floats.Get(index));
8352 index++;
8353 }
8354 }
8355
8357 {
8358 super.WriteVarsToCTX(ctx);
8359
8360
8362 {
8364 }
8365
8367 {
8369 }
8370
8372 {
8374 }
8375
8377 {
8378 int r,g,b,a;
8384 }
8385
8387 {
8389 }
8390 }
8391
8393 {
8394 if (!super.ReadVarsFromCTX(ctx,version))
8395 return false;
8396
8397 int intValue;
8398 float value;
8399
8400 if (version < 140)
8401 {
8402 if (!ctx.
Read(intValue))
8403 return false;
8404
8405 m_VariablesMask = intValue;
8406 }
8407
8409 {
8410 if (!ctx.
Read(value))
8411 return false;
8412
8414 {
8416 }
8417 else
8418 {
8420 }
8421 }
8422
8423 if (version < 140)
8424 {
8426 {
8427 if (!ctx.
Read(value))
8428 return false;
8429 SetTemperatureDirect(value);
8430 }
8431 }
8432
8434 {
8435 if (!ctx.
Read(value))
8436 return false;
8438 }
8439
8441 {
8442 if (!ctx.
Read(intValue))
8443 return false;
8445 }
8446
8448 {
8449 int r,g,b,a;
8451 return false;
8453 return false;
8455 return false;
8457 return false;
8458
8460 }
8461
8463 {
8464 if (!ctx.
Read(intValue))
8465 return false;
8467 }
8468
8469 if (version >= 138 && version < 140)
8470 {
8472 {
8473 if (!ctx.
Read(intValue))
8474 return false;
8475 SetFrozen(intValue);
8476 }
8477 }
8478
8479 return true;
8480 }
8481
8482
8484 {
8487 {
8489 }
8490
8491 if (!super.OnStoreLoad(ctx, version))
8492 {
8494 return false;
8495 }
8496
8497 if (version >= 114)
8498 {
8499 bool hasQuickBarIndexSaved;
8500
8501 if (!ctx.
Read(hasQuickBarIndexSaved))
8502 {
8504 return false;
8505 }
8506
8507 if (hasQuickBarIndexSaved)
8508 {
8509 int itmQBIndex;
8510
8511
8512 if (!ctx.
Read(itmQBIndex))
8513 {
8515 return false;
8516 }
8517
8518 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8519 if (itmQBIndex != -1 && parentPlayer)
8520 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8521 }
8522 }
8523 else
8524 {
8525
8526 PlayerBase player;
8527 int itemQBIndex;
8528 if (version ==
int.
MAX)
8529 {
8530 if (!ctx.
Read(itemQBIndex))
8531 {
8533 return false;
8534 }
8535 }
8536 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8537 {
8538
8539 if (!ctx.
Read(itemQBIndex))
8540 {
8542 return false;
8543 }
8544 if (itemQBIndex != -1 && player)
8545 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8546 }
8547 }
8548
8549 if (version < 140)
8550 {
8551
8552 if (!LoadVariables(ctx, version))
8553 {
8555 return false;
8556 }
8557 }
8558
8559
8561 {
8563 return false;
8564 }
8565 if (version >= 132)
8566 {
8568 if (raib)
8569 {
8571 {
8573 return false;
8574 }
8575 }
8576 }
8577
8579 return true;
8580 }
8581
8582
8583
8585 {
8586 super.OnStoreSave(ctx);
8587
8588 PlayerBase player;
8589 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8590 {
8592
8593 int itemQBIndex = -1;
8594 itemQBIndex = player.FindQuickBarEntityIndex(this);
8595 ctx.
Write(itemQBIndex);
8596 }
8597 else
8598 {
8600 }
8601
8603
8605 if (raib)
8606 {
8608 }
8609 }
8610
8611
8613 {
8614 super.AfterStoreLoad();
8615
8617 {
8619 }
8620
8622 {
8625 }
8626 }
8627
8629 {
8630 super.EEOnAfterLoad();
8631
8633 {
8635 }
8636
8639 }
8640
8642 {
8643 return false;
8644 }
8645
8646
8647
8649 {
8651 {
8652 #ifdef PLATFORM_CONSOLE
8653
8655 {
8657 if (menu)
8658 {
8660 }
8661 }
8662 #endif
8663 }
8664
8666 {
8669 }
8670
8672 {
8673 SetWeightDirty();
8675 }
8677 {
8680 }
8681
8683 {
8686 }
8688 {
8691 }
8692
8693 super.OnVariablesSynchronized();
8694 }
8695
8696
8697
8699 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8700 {
8701 if (!IsServerCheck(allow_client))
8702 return false;
8703
8705 return false;
8706
8709
8710 if (value <= (min + 0.001))
8711 value = min;
8712
8713 if (value == min)
8714 {
8715 if (destroy_config)
8716 {
8717 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8718 if (dstr)
8719 {
8721 this.Delete();
8722 return true;
8723 }
8724 }
8725 else if (destroy_forced)
8726 {
8728 this.Delete();
8729 return true;
8730 }
8731
8733 }
8734
8737
8739 {
8741
8742 if (delta)
8744 }
8745
8747
8748 return false;
8749 }
8750
8751
8753 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8754 {
8756 }
8757
8759 {
8762 }
8763
8765 {
8768 }
8769
8772 {
8773 float value_clamped = Math.Clamp(value, 0, 1);
8775 SetQuantity(result, destroy_config, destroy_forced);
8776 }
8777
8778
8781 {
8783 }
8784
8786 {
8788 }
8789
8790
8791
8792
8793
8794
8795
8796
8797
8798
8800 {
8801 int slot = -1;
8802 if (GetInventory())
8803 {
8804 InventoryLocation il = new InventoryLocation;
8805 GetInventory().GetCurrentInventoryLocation(il);
8807 }
8808
8810 }
8811
8813 {
8814 float quantity_max = 0;
8815
8817 {
8818 if (attSlotID != -1)
8819 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8820
8821 if (quantity_max <= 0)
8823 }
8824
8825 if (quantity_max <= 0)
8827
8828 return quantity_max;
8829 }
8830
8832 {
8834 }
8835
8837 {
8839 }
8840
8841
8843 {
8845 }
8846
8848 {
8850 }
8851
8853 {
8855 }
8856
8857
8859 {
8860
8861 float weightEx = GetWeightEx();
8862 float special = GetInventoryAndCargoWeight();
8863 return weightEx - special;
8864 }
8865
8866
8868 {
8870 }
8871
8873 {
8875 {
8876 #ifdef DEVELOPER
8877 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8878 {
8879 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8881 }
8882 #endif
8883
8885 }
8886 else if (HasEnergyManager())
8887 {
8888 #ifdef DEVELOPER
8889 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8890 {
8891 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8892 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8893 }
8894 #endif
8895 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8896 }
8897 else
8898 {
8899 #ifdef DEVELOPER
8900 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8901 {
8902 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8903 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8904 }
8905 #endif
8906 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8907 }
8908 }
8909
8912 {
8913 int item_count = 0;
8915
8916 if (GetInventory().GetCargo() != NULL)
8917 {
8918 item_count = GetInventory().GetCargo().GetItemCount();
8919 }
8920
8921 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8922 {
8923 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8924 if (item)
8925 item_count += item.GetNumberOfItems();
8926 }
8927 return item_count;
8928 }
8929
8932 {
8933 float weight = 0;
8934 float wetness = 1;
8935 if (include_wetness)
8938 {
8939 weight = wetness * m_ConfigWeight;
8940 }
8942 {
8943 weight = 1;
8944 }
8945 return weight;
8946 }
8947
8948
8949
8951 {
8952 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8953 {
8954 GameInventory inv = GetInventory();
8955 array<EntityAI> items = new array<EntityAI>;
8957 for (int i = 0; i < items.Count(); i++)
8958 {
8960 if (item)
8961 {
8963 }
8964 }
8965 }
8966 }
8967
8968
8969
8970
8972 {
8973 float energy = 0;
8974 if (HasEnergyManager())
8975 {
8976 energy = GetCompEM().GetEnergy();
8977 }
8978 return energy;
8979 }
8980
8981
8983 {
8984 super.OnEnergyConsumed();
8985
8987 }
8988
8990 {
8991 super.OnEnergyAdded();
8992
8994 }
8995
8996
8998 {
8999 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9000 {
9002 {
9003 float energy_0to1 = GetCompEM().GetEnergy0To1();
9005 }
9006 }
9007 }
9008
9009
9011 {
9012 return ConfigGetFloat("heatIsolation");
9013 }
9014
9016 {
9018 }
9019
9021 {
9022 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9023 if (
GetGame().ConfigIsExisting(paramPath))
9025
9026 return 0.0;
9027 }
9028
9030 {
9031 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9032 if (
GetGame().ConfigIsExisting(paramPath))
9034
9035 return 0.0;
9036 }
9037
9038 override void SetWet(
float value,
bool allow_client =
false)
9039 {
9040 if (!IsServerCheck(allow_client))
9041 return;
9042
9045
9047
9048 m_VarWet = Math.Clamp(value, min, max);
9049
9051 {
9054 }
9055 }
9056
9057 override void AddWet(
float value)
9058 {
9060 }
9061
9063 {
9065 }
9066
9068 {
9070 }
9071
9073 {
9075 }
9076
9078 {
9080 }
9081
9083 {
9085 }
9086
9088 {
9091 if (newLevel != oldLevel)
9092 {
9094 }
9095 }
9096
9098 {
9099 SetWeightDirty();
9100 }
9101
9103 {
9104 return GetWetLevelInternal(
m_VarWet);
9105 }
9106
9107
9108
9110 {
9112 }
9113
9115 {
9117 }
9118
9120 {
9122 }
9123
9125 {
9127 }
9128
9129
9130
9132 {
9133 if (ConfigIsExisting("itemModelLength"))
9134 {
9135 return ConfigGetFloat("itemModelLength");
9136 }
9137 return 0;
9138 }
9139
9141 {
9142 if (ConfigIsExisting("itemAttachOffset"))
9143 {
9144 return ConfigGetFloat("itemAttachOffset");
9145 }
9146 return 0;
9147 }
9148
9149 override void SetCleanness(
int value,
bool allow_client =
false)
9150 {
9151 if (!IsServerCheck(allow_client))
9152 return;
9153
9155
9157
9160 }
9161
9163 {
9165 }
9166
9168 {
9169 return true;
9170 }
9171
9172
9173
9174
9176 {
9178 }
9179
9181 {
9183 }
9184
9185
9186
9187
9188 override void SetColor(
int r,
int g,
int b,
int a)
9189 {
9195 }
9197 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9198 {
9203 }
9204
9206 {
9208 }
9209
9212 {
9213 int r,g,b,a;
9215 r = r/255;
9216 g = g/255;
9217 b = b/255;
9218 a = a/255;
9219 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9220 }
9221
9222
9223
9224 override void SetLiquidType(
int value,
bool allow_client =
false)
9225 {
9226 if (!IsServerCheck(allow_client))
9227 return;
9228
9233 }
9234
9236 {
9237 return ConfigGetInt("varLiquidTypeInit");
9238 }
9239
9241 {
9243 }
9244
9246 {
9248 SetFrozen(false);
9249 }
9250
9253 {
9254 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9255 }
9256
9257
9260 {
9261 PlayerBase nplayer;
9262 if (PlayerBase.CastTo(nplayer, player))
9263 {
9265
9266 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9267 }
9268 }
9269
9270
9273 {
9274 PlayerBase nplayer;
9275 if (PlayerBase.CastTo(nplayer,player))
9276 {
9277
9278 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9279
9280 }
9281
9282
9283 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9284
9285
9286 if (HasEnergyManager())
9287 {
9288 GetCompEM().UpdatePlugState();
9289 }
9290 }
9291
9292
9294 {
9295 super.OnPlacementStarted(player);
9296
9298 }
9299
9300 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9301 {
9303 {
9304 m_AdminLog.OnPlacementComplete(player,
this);
9305 }
9306
9307 super.OnPlacementComplete(player, position, orientation);
9308 }
9309
9310
9311
9312
9313
9315 {
9317 {
9318 return true;
9319 }
9320 else
9321 {
9322 return false;
9323 }
9324 }
9325
9326
9328 {
9330 {
9332 }
9333 }
9334
9335
9337 {
9339 }
9340
9342 {
9344 }
9345
9346 override void InsertAgent(
int agent,
float count = 1)
9347 {
9348 if (count < 1)
9349 return;
9350
9352 }
9353
9356 {
9358 }
9359
9360
9362 {
9364 }
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9408 {
9410 return false;
9411 return true;
9412 }
9413
9415 {
9416
9418 }
9419
9420
9423 {
9424 super.CheckForRoofLimited(timeTresholdMS);
9425
9427 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9428 {
9429 m_PreviousRoofTestTime = time;
9430 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9431 }
9432 }
9433
9434
9436 {
9438 {
9439 return 0;
9440 }
9441
9442 if (GetInventory().GetAttachmentSlotsCount() != 0)
9443 {
9444 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9445 if (filter)
9446 return filter.GetProtectionLevel(type, false, system);
9447 else
9448 return 0;
9449 }
9450
9451 string subclassPath, entryName;
9452
9453 switch (type)
9454 {
9456 entryName = "biological";
9457 break;
9459 entryName = "chemical";
9460 break;
9461 default:
9462 entryName = "biological";
9463 break;
9464 }
9465
9466 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9467
9469 }
9470
9471
9472
9475 {
9476 if (!IsMagazine())
9478
9480 }
9481
9482
9483
9484
9485
9490 {
9491 return true;
9492 }
9493
9495 {
9497 }
9498
9499
9500
9501
9502
9504 {
9505 if (parent)
9506 {
9507 if (parent.IsInherited(DayZInfected))
9508 return true;
9509
9510 if (!parent.IsRuined())
9511 return true;
9512 }
9513
9514 return true;
9515 }
9516
9518 {
9519 if (!super.CanPutAsAttachment(parent))
9520 {
9521 return false;
9522 }
9523
9524 if (!IsRuined() && !parent.IsRuined())
9525 {
9526 return true;
9527 }
9528
9529 return false;
9530 }
9531
9533 {
9534
9535
9536
9537
9538 return super.CanReceiveItemIntoCargo(item);
9539 }
9540
9542 {
9543
9544
9545
9546
9547 GameInventory attachmentInv = attachment.GetInventory();
9549 {
9550 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9551 return false;
9552 }
9553
9554 InventoryLocation loc = new InventoryLocation();
9555 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9556 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9557 return false;
9558
9559 return super.CanReceiveAttachment(attachment, slotId);
9560 }
9561
9563 {
9564 if (!super.CanReleaseAttachment(attachment))
9565 return false;
9566
9567 return GetInventory().AreChildrenAccessible();
9568 }
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9584
9585
9586
9587
9588
9589
9591 {
9592 int id = muzzle_owner.GetMuzzleID();
9593 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9594
9595 if (WPOF_array)
9596 {
9597 for (int i = 0; i < WPOF_array.Count(); i++)
9598 {
9599 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9600
9601 if (WPOF)
9602 {
9603 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9604 }
9605 }
9606 }
9607 }
9608
9609
9611 {
9612 int id = muzzle_owner.GetMuzzleID();
9614
9615 if (WPOBE_array)
9616 {
9617 for (int i = 0; i < WPOBE_array.Count(); i++)
9618 {
9619 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9620
9621 if (WPOBE)
9622 {
9623 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9624 }
9625 }
9626 }
9627 }
9628
9629
9631 {
9632 int id = muzzle_owner.GetMuzzleID();
9633 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9634
9635 if (WPOOH_array)
9636 {
9637 for (int i = 0; i < WPOOH_array.Count(); i++)
9638 {
9639 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9640
9641 if (WPOOH)
9642 {
9643 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9644 }
9645 }
9646 }
9647 }
9648
9649
9651 {
9652 int id = muzzle_owner.GetMuzzleID();
9653 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9654
9655 if (WPOOH_array)
9656 {
9657 for (int i = 0; i < WPOOH_array.Count(); i++)
9658 {
9659 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9660
9661 if (WPOOH)
9662 {
9663 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9664 }
9665 }
9666 }
9667 }
9668
9669
9671 {
9672 int id = muzzle_owner.GetMuzzleID();
9673 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9674
9675 if (WPOOH_array)
9676 {
9677 for (int i = 0; i < WPOOH_array.Count(); i++)
9678 {
9679 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9680
9681 if (WPOOH)
9682 {
9683 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9684 }
9685 }
9686 }
9687 }
9688
9689
9690
9692 {
9694 {
9695 return true;
9696 }
9697
9698 return false;
9699 }
9700
9702 {
9704 {
9705 return true;
9706 }
9707
9708 return false;
9709 }
9710
9712 {
9714 {
9715 return true;
9716 }
9717
9718 return false;
9719 }
9720
9722 {
9723 return false;
9724 }
9725
9728 {
9729 return UATimeSpent.DEFAULT_DEPLOY;
9730 }
9731
9732
9733
9734
9736 {
9738 SetSynchDirty();
9739 }
9740
9742 {
9744 }
9745
9746
9748 {
9749 return false;
9750 }
9751
9754 {
9755 string att_type = "None";
9756
9757 if (ConfigIsExisting("soundAttType"))
9758 {
9759 att_type = ConfigGetString("soundAttType");
9760 }
9761
9763 }
9764
9766 {
9768 }
9769
9770
9771
9772
9773
9777
9779 {
9782
9784 }
9785
9786
9788 {
9790 return;
9791
9793
9796
9799
9800 SoundParameters params = new SoundParameters();
9804 }
9805
9806
9808 {
9810 return;
9811
9813 SetSynchDirty();
9814
9817 }
9818
9819
9821 {
9823 return;
9824
9826 SetSynchDirty();
9827
9830 }
9831
9833 {
9835 }
9836
9838 {
9840 }
9841
9844 {
9845 if (!
GetGame().IsDedicatedServer())
9846 {
9847 if (ConfigIsExisting("attachSoundSet"))
9848 {
9849 string cfg_path = "";
9850 string soundset = "";
9852
9855 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9856 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9857
9858 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9859 {
9860 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9861 {
9862 if (cfg_slot_array[i] == slot_type)
9863 {
9864 soundset = cfg_soundset_array[i];
9865 break;
9866 }
9867 }
9868 }
9869
9870 if (soundset != "")
9871 {
9872 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9874 }
9875 }
9876 }
9877 }
9878
9880 {
9881
9882 }
9883
9884 void OnApply(PlayerBase player);
9885
9887 {
9888 return 1.0;
9889 };
9890
9892 {
9894 }
9895
9897 {
9899 }
9900
9902
9904 {
9905 SetDynamicPhysicsLifeTime(0.01);
9907 }
9908
9910 {
9911 array<string> zone_names = new array<string>;
9912 GetDamageZones(zone_names);
9913 for (int i = 0; i < zone_names.Count(); i++)
9914 {
9915 SetHealthMax(zone_names.Get(i),"Health");
9916 }
9917 SetHealthMax("","Health");
9918 }
9919
9922 {
9923 float global_health = GetHealth01("","Health");
9924 array<string> zones = new array<string>;
9925 GetDamageZones(zones);
9926
9927 for (int i = 0; i < zones.Count(); i++)
9928 {
9929 SetHealth01(zones.Get(i),"Health",global_health);
9930 }
9931 }
9932
9935 {
9936 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9937 }
9938
9940 {
9941 if (!hasRootAsPlayer)
9942 {
9943 if (refParentIB)
9944 {
9945
9946 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9947 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9948
9949 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9950 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9951
9954 }
9955 else
9956 {
9957
9960 }
9961 }
9962 }
9963
9965 {
9967 {
9968 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9969 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9970 {
9971 float heatPermCoef = 1.0;
9973 while (ent)
9974 {
9975 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9976 ent = ent.GetHierarchyParent();
9977 }
9978
9979 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9980 }
9981 }
9982 }
9983
9985 {
9986
9987 EntityAI parent = GetHierarchyParent();
9988 if (!parent)
9989 {
9990 hasParent = false;
9991 hasRootAsPlayer = false;
9992 }
9993 else
9994 {
9995 hasParent = true;
9996 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9997 refParentIB =
ItemBase.Cast(parent);
9998 }
9999 }
10000
10001 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10002 {
10003
10004 }
10005
10007 {
10008
10009 return false;
10010 }
10011
10013 {
10014
10015
10016 return false;
10017 }
10018
10020 {
10021
10022 return false;
10023 }
10024
10027 {
10028 return !GetIsFrozen() &&
IsOpen();
10029 }
10030
10032 {
10033 bool hasParent = false, hasRootAsPlayer = false;
10035
10036 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10037 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10038
10039 if (wwtu || foodDecay)
10040 {
10044
10045 if (processWetness || processTemperature || processDecay)
10046 {
10048
10049 if (processWetness)
10050 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10051
10052 if (processTemperature)
10054
10055 if (processDecay)
10056 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10057 }
10058 }
10059 }
10060
10063 {
10065 }
10066
10068 {
10071
10072 return super.GetTemperatureFreezeThreshold();
10073 }
10074
10076 {
10079
10080 return super.GetTemperatureThawThreshold();
10081 }
10082
10084 {
10087
10088 return super.GetItemOverheatThreshold();
10089 }
10090
10092 {
10094 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10095
10096 return super.GetTemperatureFreezeTime();
10097 }
10098
10100 {
10102 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10103
10104 return super.GetTemperatureThawTime();
10105 }
10106
10111
10113 {
10114 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10115 }
10116
10118 {
10119 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10120 }
10121
10124 {
10126 }
10127
10129 {
10131 }
10132
10134 {
10136 }
10137
10140 {
10141 return null;
10142 }
10143
10146 {
10147 return false;
10148 }
10149
10151 {
10153 {
10156 if (!trg)
10157 {
10159 explosive = this;
10160 }
10161
10162 explosive.PairRemote(trg);
10164
10165 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10166 trg.SetPersistentPairID(persistentID);
10167 explosive.SetPersistentPairID(persistentID);
10168
10169 return true;
10170 }
10171 return false;
10172 }
10173
10176 {
10177 float ret = 1.0;
10180 ret *= GetHealth01();
10181
10182 return ret;
10183 }
10184
10185 #ifdef DEVELOPER
10186 override void SetDebugItem()
10187 {
10188 super.SetDebugItem();
10189 _itemBase = this;
10190 }
10191
10193 {
10194 string text = super.GetDebugText();
10195
10197 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10198
10199 return text;
10200 }
10201 #endif
10202
10204 {
10205 return true;
10206 }
10207
10209
10211
10213 {
10216 }
10217
10218
10226
10242}
10243
10245{
10247 if (entity)
10248 {
10249 bool is_item = entity.IsInherited(
ItemBase);
10250 if (is_item && full_quantity)
10251 {
10254 }
10255 }
10256 else
10257 {
10259 return NULL;
10260 }
10261 return entity;
10262}
10263
10265{
10266 if (item)
10267 {
10268 if (health > 0)
10269 item.SetHealth("", "", health);
10270
10271 if (item.CanHaveTemperature())
10272 {
10274 if (item.CanFreeze())
10275 item.SetFrozen(false);
10276 }
10277
10278 if (item.HasEnergyManager())
10279 {
10280 if (quantity >= 0)
10281 {
10282 item.GetCompEM().SetEnergy0To1(quantity);
10283 }
10284 else
10285 {
10287 }
10288 }
10289 else if (item.IsMagazine())
10290 {
10291 Magazine mag = Magazine.Cast(item);
10292 if (quantity >= 0)
10293 {
10294 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10295 }
10296 else
10297 {
10299 }
10300
10301 }
10302 else
10303 {
10304 if (quantity >= 0)
10305 {
10306 item.SetQuantityNormalized(quantity, false);
10307 }
10308 else
10309 {
10311 }
10312
10313 }
10314 }
10315}
10316
10317#ifdef DEVELOPER
10319#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.