5544{
5546 {
5547 return true;
5548 }
5549};
5550
5551
5552
5554{
5558
5560
5563
5564
5565
5566
5567
5576
5582
5587
5592
5613 protected bool m_IsResultOfSplit
5614
5616
5621
5622
5623
5625
5629
5630
5631
5633
5636
5637
5638
5644
5645
5653
5656
5657
5659
5660
5662
5663
5668
5669
5674
5675
5677
5678
5680 {
5685
5686 if (!
GetGame().IsDedicatedServer())
5687 {
5689 {
5691
5693 {
5695 }
5696 }
5697
5700 }
5701
5702 m_OldLocation = null;
5703
5705 {
5707 }
5708
5709 if (ConfigIsExisting("headSelectionsToHide"))
5710 {
5713 }
5714
5716 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5717 {
5719 }
5720
5722
5723 m_IsResultOfSplit = false;
5724
5726 }
5727
5729 {
5730 super.InitItemVariables();
5731
5737 m_Count = ConfigGetInt(
"count");
5738
5741
5746
5749
5754
5766
5770
5771
5774 if (ConfigIsExisting("canBeSplit"))
5775 {
5778 }
5779
5781 if (ConfigIsExisting("itemBehaviour"))
5783
5784
5787 RegisterNetSyncVariableInt("m_VarLiquidType");
5788 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5789
5790 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5791 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5792 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5793
5794 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5795 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5796 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5797 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5798
5799 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5800 RegisterNetSyncVariableBool("m_IsTakeable");
5801 RegisterNetSyncVariableBool("m_IsHologram");
5802
5805 {
5808 }
5809
5811
5813 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5815
5816 }
5817
5819 {
5821 }
5822
5824 {
5827 {
5832 }
5833 }
5834
5835 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5836 {
5838 {
5841 }
5842
5844 }
5845
5847 {
5853 }
5854
5856
5858 {
5860
5861 if (!action)
5862 {
5863 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5864 return;
5865 }
5866
5868 if (!ai)
5869 {
5871 return;
5872 }
5873
5875 if (!action_array)
5876 {
5877 action_array = new array<ActionBase_Basic>;
5879 }
5880 if (LogManager.IsActionLogEnable())
5881 {
5882 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5883 }
5884
5885 if (action_array.Find(action) != -1)
5886 {
5887 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5888 }
5889 else
5890 {
5891 action_array.Insert(action);
5892 }
5893 }
5894
5896 {
5898 ActionBase action = player.GetActionManager().GetAction(actionName);
5901
5902 if (action_array)
5903 {
5904 action_array.RemoveItem(action);
5905 }
5906 }
5907
5908
5909
5911 {
5912 ActionOverrideData overrideData = new ActionOverrideData();
5916
5918 if (!actionMap)
5919 {
5922 }
5923
5924 actionMap.Insert(this.
Type(), overrideData);
5925
5926 }
5927
5929
5931
5932
5934 {
5937
5940
5941 string config_to_search = "CfgVehicles";
5942 string muzzle_owner_config;
5943
5945 {
5946 if (IsInherited(Weapon))
5947 config_to_search = "CfgWeapons";
5948
5949 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5950
5951 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5952
5954
5955 if (config_OnFire_subclass_count > 0)
5956 {
5957 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5958
5959 for (int i = 0; i < config_OnFire_subclass_count; i++)
5960 {
5961 string particle_class = "";
5963 string config_OnFire_entry = config_OnFire_class + particle_class;
5964 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5965 WPOF_array.Insert(WPOF);
5966 }
5967
5968
5970 }
5971 }
5972
5974 {
5975 config_to_search = "CfgWeapons";
5976 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5977
5978 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5979
5981
5982 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5983 {
5984 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5985
5986 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5987 {
5988 string particle_class2 = "";
5990 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5991 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5992 WPOBE_array.Insert(WPOBE);
5993 }
5994
5995
5997 }
5998 }
5999 }
6000
6001
6003 {
6006
6008 {
6009 string config_to_search = "CfgVehicles";
6010
6011 if (IsInherited(Weapon))
6012 config_to_search = "CfgWeapons";
6013
6014 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6015 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6016
6017 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
6018 {
6019
6021
6023 {
6025 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6027 return;
6028 }
6029
6032
6033
6034
6036 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6037
6038 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6039 {
6040 string particle_class = "";
6042 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6044
6045 if (entry_type == CT_CLASS)
6046 {
6047 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6048 WPOOH_array.Insert(WPOF);
6049 }
6050 }
6051
6052
6054 }
6055 }
6056 }
6057
6059 {
6061 }
6062
6064 {
6066 {
6068
6071
6074
6075 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6076 }
6077 }
6078
6080 {
6082 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6083
6085 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6086
6088 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6089
6091 {
6093 }
6094 }
6095
6097 {
6099 }
6100
6102 {
6105 else
6107
6109 {
6112 }
6113 else
6114 {
6117
6120 }
6121
6123 }
6124
6126 {
6128 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6129 }
6130
6132 {
6134 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6136 }
6137
6139 {
6141 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6142 }
6143
6145 {
6148
6149 OverheatingParticle OP = new OverheatingParticle();
6154
6156 }
6157
6159 {
6162
6163 return -1;
6164 }
6165
6167 {
6169 {
6172
6173 for (int i = count; i > 0; --i)
6174 {
6175 int id = i - 1;
6178
6181
6182 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6183 {
6184 if (p)
6185 {
6188 }
6189 }
6190 }
6191 }
6192 }
6193
6195 {
6197 {
6199 {
6200 int id = i - 1;
6202
6203 if (OP)
6204 {
6206
6207 if (p)
6208 {
6210 }
6211
6212 delete OP;
6213 }
6214 }
6215
6218 }
6219 }
6220
6223 {
6224 return 0.0;
6225 }
6226
6227
6229 {
6230 return 250;
6231 }
6232
6234 {
6235 return 0;
6236 }
6237
6240 {
6242 return true;
6243
6244 return false;
6245 }
6246
6249 {
6252
6254 {
6256 }
6257 else
6258 {
6259
6261 }
6262
6264 }
6265
6272 {
6273 return -1;
6274 }
6275
6276
6277
6278
6280 {
6282 {
6284 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6285
6286 if (r_index >= 0)
6287 {
6288 InventoryLocation r_il = new InventoryLocation;
6289 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6290
6291 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6294 {
6295 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6296 }
6298 {
6299 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6300 }
6301
6302 }
6303
6304 player.GetHumanInventory().ClearUserReservedLocation(this);
6305 }
6306
6309 }
6310
6311
6312
6313
6315 {
6316 return ItemBase.m_DebugActionsMask;
6317 }
6318
6320 {
6321 return ItemBase.m_DebugActionsMask & mask;
6322 }
6323
6325 {
6326 ItemBase.m_DebugActionsMask = mask;
6327 }
6328
6330 {
6331 ItemBase.m_DebugActionsMask |= mask;
6332 }
6333
6335 {
6336 ItemBase.m_DebugActionsMask &= ~mask;
6337 }
6338
6340 {
6342 {
6344 }
6345 else
6346 {
6348 }
6349 }
6350
6351
6353 {
6354 if (GetEconomyProfile())
6355 {
6356 float q_max = GetEconomyProfile().GetQuantityMax();
6357 if (q_max > 0)
6358 {
6359 float q_min = GetEconomyProfile().GetQuantityMin();
6360 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6361
6363 {
6364 ComponentEnergyManager comp = GetCompEM();
6366 {
6368 }
6369 }
6371 {
6373
6374 }
6375
6376 }
6377 }
6378 }
6379
6382 {
6383 EntityAI parent = GetHierarchyParent();
6384
6385 if (parent)
6386 {
6387 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6388 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6389 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6390 }
6391 }
6392
6395 {
6396 EntityAI parent = GetHierarchyParent();
6397
6398 if (parent)
6399 {
6400 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6401 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6402 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6403 }
6404 }
6405
6407 {
6408
6409
6410
6411
6413
6415 {
6416 if (ScriptInputUserData.CanStoreInputUserData())
6417 {
6418 ScriptInputUserData ctx = new ScriptInputUserData;
6424 ctx.
Write(use_stack_max);
6427
6429 {
6430 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6431 }
6432 }
6433 }
6434 else if (!
GetGame().IsMultiplayer())
6435 {
6437 }
6438 }
6439
6441 {
6443 }
6444
6446 {
6448 }
6449
6451 {
6453 }
6454
6456 {
6457
6458 return false;
6459 }
6460
6462 {
6463 return false;
6464 }
6465
6469 {
6470 return false;
6471 }
6472
6474 {
6475 return "";
6476 }
6477
6479
6481 {
6482 return false;
6483 }
6484
6486 {
6487 return true;
6488 }
6489
6490
6491
6493 {
6494 return true;
6495 }
6496
6498 {
6499 return true;
6500 }
6501
6503 {
6504 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6506 }
6507
6509 {
6511 }
6512
6514 {
6516 if (!is_being_placed)
6518 SetSynchDirty();
6519 }
6520
6521
6523
6525 {
6527 }
6528
6530 {
6532 }
6533
6535 {
6536 return 1;
6537 }
6538
6540 {
6541 return false;
6542 }
6543
6545 {
6547 SetSynchDirty();
6548 }
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578
6579
6580
6581
6582
6583
6585 {
6586 super.OnMovedInsideCargo(container);
6587
6588 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6589 }
6590
6591 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6592 {
6593 super.EEItemLocationChanged(oldLoc,newLoc);
6594
6595 PlayerBase new_player = null;
6596 PlayerBase old_player = null;
6597
6598 if (newLoc.GetParent())
6599 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6600
6601 if (oldLoc.GetParent())
6602 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6603
6605 {
6606 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6607
6608 if (r_index >= 0)
6609 {
6610 InventoryLocation r_il = new InventoryLocation;
6611 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6612
6613 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6616 {
6617 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6618 }
6620 {
6621 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6622 }
6623
6624 }
6625 }
6626
6628 {
6629 if (new_player)
6630 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6631
6632 if (new_player == old_player)
6633 {
6634
6635 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6636 {
6638 {
6639 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6640 {
6641 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6642 }
6643 }
6644 else
6645 {
6646 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6647 }
6648 }
6649
6650 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6651 {
6652 int type = oldLoc.GetType();
6654 {
6655 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6656 }
6658 {
6659 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6660 }
6661 }
6662 if (!m_OldLocation)
6663 {
6664 m_OldLocation = new InventoryLocation;
6665 }
6666 m_OldLocation.Copy(oldLoc);
6667 }
6668 else
6669 {
6670 if (m_OldLocation)
6671 {
6672 m_OldLocation.Reset();
6673 }
6674 }
6675
6677 }
6678 else
6679 {
6680 if (new_player)
6681 {
6682 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6683 if (res_index >= 0)
6684 {
6685 InventoryLocation il = new InventoryLocation;
6686 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6688 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6691 {
6692 il.
GetParent().GetOnReleaseLock().Invoke(it);
6693 }
6695 {
6697 }
6698
6699 }
6700 }
6702 {
6703
6705 }
6706
6707 if (m_OldLocation)
6708 {
6709 m_OldLocation.Reset();
6710 }
6711 }
6712 }
6713
6714 override void EOnContact(IEntity other, Contact extra)
6715 {
6717 {
6718 int liquidType = -1;
6720 if (impactSpeed > 0.0)
6721 {
6723 #ifndef SERVER
6725 #else
6727 SetSynchDirty();
6728 #endif
6730 }
6731 }
6732
6733 #ifdef SERVER
6734 if (GetCompEM() && GetCompEM().IsPlugged())
6735 {
6736 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6737 GetCompEM().UnplugThis();
6738 }
6739 #endif
6740 }
6741
6743
6745 {
6747 }
6748
6750 {
6751
6752 }
6753
6755 {
6756 super.OnItemLocationChanged(old_owner, new_owner);
6757
6758 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6759 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6760
6761 if (!relatedPlayer && playerNew)
6762 relatedPlayer = playerNew;
6763
6764 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6765 {
6767 if (actionMgr)
6768 {
6769 ActionBase currentAction = actionMgr.GetRunningAction();
6770 if (currentAction)
6772 }
6773 }
6774
6775 Man ownerPlayerOld = null;
6776 Man ownerPlayerNew = null;
6777
6778 if (old_owner)
6779 {
6780 if (old_owner.
IsMan())
6781 {
6782 ownerPlayerOld = Man.Cast(old_owner);
6783 }
6784 else
6785 {
6786 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6787 }
6788 }
6789 else
6790 {
6792 {
6794
6795 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6796 {
6797 GetCompEM().UnplugThis();
6798 }
6799 }
6800 }
6801
6802 if (new_owner)
6803 {
6804 if (new_owner.
IsMan())
6805 {
6806 ownerPlayerNew = Man.Cast(new_owner);
6807 }
6808 else
6809 {
6810 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6811 }
6812 }
6813
6814 if (ownerPlayerOld != ownerPlayerNew)
6815 {
6816 if (ownerPlayerOld)
6817 {
6818 array<EntityAI> subItemsExit = new array<EntityAI>;
6820 for (int i = 0; i < subItemsExit.Count(); i++)
6821 {
6824 }
6825 }
6826
6827 if (ownerPlayerNew)
6828 {
6829 array<EntityAI> subItemsEnter = new array<EntityAI>;
6831 for (int j = 0; j < subItemsEnter.Count(); j++)
6832 {
6835 }
6836 }
6837 }
6838 else if (ownerPlayerNew != null)
6839 {
6840 PlayerBase nplayer;
6841 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6842 {
6843 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6845 for (int k = 0; k < subItemsUpdate.Count(); k++)
6846 {
6848 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6849 }
6850 }
6851 }
6852
6853 if (old_owner)
6854 old_owner.OnChildItemRemoved(this);
6855 if (new_owner)
6856 new_owner.OnChildItemReceived(this);
6857 }
6858
6859
6861 {
6862 super.EEDelete(parent);
6863 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6864 if (player)
6865 {
6867
6868 if (player.IsAlive())
6869 {
6870 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6871 if (r_index >= 0)
6872 {
6873 InventoryLocation r_il = new InventoryLocation;
6874 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6875
6876 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6879 {
6880 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6881 }
6883 {
6884 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6885 }
6886
6887 }
6888
6889 player.RemoveQuickBarEntityShortcut(this);
6890 }
6891 }
6892 }
6893
6895 {
6896 super.EEKilled(killer);
6897
6900 {
6901 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6902 {
6903 if (IsMagazine())
6904 {
6905 if (Magazine.Cast(this).GetAmmoCount() > 0)
6906 {
6908 }
6909 }
6910 else
6911 {
6913 }
6914 }
6915 }
6916 }
6917
6919 {
6920 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6921
6922 super.OnWasAttached(parent, slot_id);
6923
6926
6928 }
6929
6931 {
6932 super.OnWasDetached(parent, slot_id);
6933
6936 }
6937
6939 {
6940 int idx;
6943
6944 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6945 if (inventory_slots.Count() < 1)
6946 {
6947 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6948 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6949 }
6950 else
6951 {
6952 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6953 }
6954
6955 idx = inventory_slots.Find(slot);
6956 if (idx < 0)
6957 return "";
6958
6959 return attach_types.Get(idx);
6960 }
6961
6963 {
6964 int idx = -1;
6965 string slot;
6966
6969
6970 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6971 if (inventory_slots.Count() < 1)
6972 {
6973 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6974 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6975 }
6976 else
6977 {
6978 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6979 if (detach_types.Count() < 1)
6980 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6981 }
6982
6983 for (int i = 0; i < inventory_slots.Count(); i++)
6984 {
6985 slot = inventory_slots.Get(i);
6986 }
6987
6988 if (slot != "")
6989 {
6990 if (detach_types.Count() == 1)
6991 idx = 0;
6992 else
6993 idx = inventory_slots.Find(slot);
6994 }
6995 if (idx < 0)
6996 return "";
6997
6998 return detach_types.Get(idx);
6999 }
7000
7002 {
7003
7005
7006
7007 float min_time = 1;
7008 float max_time = 3;
7009 float delay = Math.RandomFloat(min_time, max_time);
7010
7011 explode_timer.Run(delay, this, "DoAmmoExplosion");
7012 }
7013
7015 {
7016 Magazine magazine = Magazine.Cast(this);
7017 int pop_sounds_count = 6;
7018 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7019
7020
7021 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7022 string sound_name = pop_sounds[ sound_idx ];
7024
7025
7026 magazine.ServerAddAmmoCount(-1);
7027
7028
7029 float min_temp_to_explode = 100;
7030
7031 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7032 {
7034 }
7035 }
7036
7037
7038 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7039 {
7040 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7041
7042 const int CHANCE_DAMAGE_CARGO = 4;
7043 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7044 const int CHANCE_DAMAGE_NOTHING = 2;
7045
7047 {
7048 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7049 int chances;
7050 int rnd;
7051
7052 if (GetInventory().GetCargo())
7053 {
7054 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7055 rnd = Math.RandomInt(0,chances);
7056
7057 if (rnd < CHANCE_DAMAGE_CARGO)
7058 {
7060 }
7061 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7062 {
7064 }
7065 }
7066 else
7067 {
7068 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7069 rnd = Math.RandomInt(0,chances);
7070
7071 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7072 {
7074 }
7075 }
7076 }
7077 }
7078
7080 {
7081 if (GetInventory().GetCargo())
7082 {
7083 int item_count = GetInventory().GetCargo().GetItemCount();
7084 if (item_count > 0)
7085 {
7086 int random_pick = Math.RandomInt(0, item_count);
7088 if (!item.IsExplosive())
7089 {
7090 item.AddHealth("","",damage);
7091 return true;
7092 }
7093 }
7094 }
7095 return false;
7096 }
7097
7099 {
7100 int attachment_count = GetInventory().AttachmentCount();
7101 if (attachment_count > 0)
7102 {
7103 int random_pick = Math.RandomInt(0, attachment_count);
7104 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
7105 if (!attachment.IsExplosive())
7106 {
7107 attachment.AddHealth("","",damage);
7108 return true;
7109 }
7110 }
7111 return false;
7112 }
7113
7115 {
7117 }
7118
7120 {
7122 return GetInventory().CanRemoveEntity();
7123
7124 return false;
7125 }
7126
7128 {
7129
7131 return false;
7132
7133
7135 return false;
7136
7137
7138
7140 if (delta == 0)
7141 return false;
7142
7143
7144 return true;
7145 }
7146
7148 {
7150 {
7151 if (ScriptInputUserData.CanStoreInputUserData())
7152 {
7153 ScriptInputUserData ctx = new ScriptInputUserData;
7158 ctx.
Write(destination_entity);
7162 }
7163 }
7164 else if (!
GetGame().IsMultiplayer())
7165 {
7167 }
7168 }
7169
7171 {
7172 float split_quantity_new;
7176 InventoryLocation loc = new InventoryLocation;
7177
7178 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7179 {
7181 split_quantity_new = stack_max;
7182 else
7184
7186 {
7187 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7188 if (new_item)
7189 {
7190 new_item.SetResultOfSplit(true);
7191 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7193 new_item.
SetQuantity(split_quantity_new,
false,
true);
7194 }
7195 }
7196 }
7197 else if (destination_entity && slot_id == -1)
7198 {
7199 if (quantity > stack_max)
7200 split_quantity_new = stack_max;
7201 else
7202 split_quantity_new = quantity;
7203
7205 {
7207 {
7210 }
7211
7212 if (new_item)
7213 {
7214 new_item.SetResultOfSplit(true);
7215 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7217 new_item.
SetQuantity(split_quantity_new,
false,
true);
7218 }
7219 }
7220 }
7221 else
7222 {
7223 if (stack_max != 0)
7224 {
7226 {
7228 }
7229
7230 if (split_quantity_new == 0)
7231 {
7232 if (!
GetGame().IsMultiplayer())
7233 player.PhysicalPredictiveDropItem(this);
7234 else
7235 player.ServerDropEntity(this);
7236 return;
7237 }
7238
7240 {
7242
7243 if (new_item)
7244 {
7245 new_item.SetResultOfSplit(true);
7246 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7249 new_item.PlaceOnSurface();
7250 }
7251 }
7252 }
7253 }
7254 }
7255
7257 {
7258 float split_quantity_new;
7262 InventoryLocation loc = new InventoryLocation;
7263
7264 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7265 {
7267 split_quantity_new = stack_max;
7268 else
7270
7272 {
7273 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7274 if (new_item)
7275 {
7276 new_item.SetResultOfSplit(true);
7277 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7279 new_item.
SetQuantity(split_quantity_new,
false,
true);
7280 }
7281 }
7282 }
7283 else if (destination_entity && slot_id == -1)
7284 {
7285 if (quantity > stack_max)
7286 split_quantity_new = stack_max;
7287 else
7288 split_quantity_new = quantity;
7289
7291 {
7293 {
7296 }
7297
7298 if (new_item)
7299 {
7300 new_item.SetResultOfSplit(true);
7301 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7303 new_item.
SetQuantity(split_quantity_new,
false,
true);
7304 }
7305 }
7306 }
7307 else
7308 {
7309 if (stack_max != 0)
7310 {
7312 {
7314 }
7315
7317 {
7319
7320 if (new_item)
7321 {
7322 new_item.SetResultOfSplit(true);
7323 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7326 new_item.PlaceOnSurface();
7327 }
7328 }
7329 }
7330 }
7331 }
7332
7334 {
7336 {
7337 if (ScriptInputUserData.CanStoreInputUserData())
7338 {
7339 ScriptInputUserData ctx = new ScriptInputUserData;
7344 dst.WriteToContext(ctx);
7346 }
7347 }
7348 else if (!
GetGame().IsMultiplayer())
7349 {
7351 }
7352 }
7353
7355 {
7357 {
7358 if (ScriptInputUserData.CanStoreInputUserData())
7359 {
7360 ScriptInputUserData ctx = new ScriptInputUserData;
7365 ctx.
Write(destination_entity);
7371 }
7372 }
7373 else if (!
GetGame().IsMultiplayer())
7374 {
7376 }
7377 }
7378
7380 {
7382 }
7383
7385 {
7387 float split_quantity_new;
7389 if (dst.IsValid())
7390 {
7391 int slot_id = dst.GetSlot();
7393
7394 if (quantity > stack_max)
7395 split_quantity_new = stack_max;
7396 else
7397 split_quantity_new = quantity;
7398
7400 {
7402
7403 if (new_item)
7404 {
7405 new_item.SetResultOfSplit(true);
7406 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7408 new_item.
SetQuantity(split_quantity_new,
false,
true);
7409 }
7410
7411 return new_item;
7412 }
7413 }
7414
7415 return null;
7416 }
7417
7419 {
7421 float split_quantity_new;
7423 if (destination_entity)
7424 {
7426 if (quantity > stackable)
7427 split_quantity_new = stackable;
7428 else
7429 split_quantity_new = quantity;
7430
7432 {
7433 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7434 if (new_item)
7435 {
7436 new_item.SetResultOfSplit(true);
7437 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7439 new_item.
SetQuantity(split_quantity_new,
false,
true);
7440 }
7441 }
7442 }
7443 }
7444
7446 {
7448 {
7449 if (ScriptInputUserData.CanStoreInputUserData())
7450 {
7451 ScriptInputUserData ctx = new ScriptInputUserData;
7456 ItemBase destination_entity =
this;
7457 ctx.
Write(destination_entity);
7461 }
7462 }
7463 else if (!
GetGame().IsMultiplayer())
7464 {
7466 }
7467 }
7468
7470 {
7472 float split_quantity_new;
7474 if (player)
7475 {
7477 if (quantity > stackable)
7478 split_quantity_new = stackable;
7479 else
7480 split_quantity_new = quantity;
7481
7483 {
7484 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7485 new_item =
ItemBase.Cast(in_hands);
7486 if (new_item)
7487 {
7488 new_item.SetResultOfSplit(true);
7489 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7491 new_item.SetQuantity(split_quantity_new, false, true);
7492 }
7493 }
7494 }
7495 }
7496
7498 {
7500 float split_quantity_new = Math.Floor(quantity * 0.5);
7501
7503 return;
7504
7506
7507 if (new_item)
7508 {
7509 if (new_item.GetQuantityMax() < split_quantity_new)
7510 {
7511 split_quantity_new = new_item.GetQuantityMax();
7512 }
7513
7514 new_item.SetResultOfSplit(true);
7515 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7516
7518 {
7521 }
7522 else
7523 {
7525 new_item.
SetQuantity(split_quantity_new,
false,
true);
7526 }
7527 }
7528 }
7529
7531 {
7533 float split_quantity_new = Math.Floor(quantity / 2);
7534
7536 return;
7537
7538 InventoryLocation invloc = new InventoryLocation;
7540
7542 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7543
7544 if (new_item)
7545 {
7546 if (new_item.GetQuantityMax() < split_quantity_new)
7547 {
7548 split_quantity_new = new_item.GetQuantityMax();
7549 }
7551 {
7554 }
7555 else if (split_quantity_new > 1)
7556 {
7558 new_item.
SetQuantity(split_quantity_new,
false,
true);
7559 }
7560 }
7561 }
7562
7565 {
7566 SetWeightDirty();
7568
7569 if (parent)
7570 parent.OnAttachmentQuantityChangedEx(this, delta);
7571
7573 {
7575 {
7577 }
7579 {
7580 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7582 }
7583 }
7584
7585 }
7586
7589 {
7590
7591 }
7592
7595 {
7597 }
7598
7600 {
7601 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7602
7604 {
7605 if (newLevel == GameConstants.STATE_RUINED)
7606 {
7608 EntityAI parent = GetHierarchyParent();
7609 if (parent && parent.IsFireplace())
7610 {
7611 CargoBase cargo = GetInventory().GetCargo();
7612 if (cargo)
7613 {
7615 {
7617 }
7618 }
7619 }
7620 }
7621
7623 {
7624
7626 return;
7627 }
7628
7629 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7630 {
7632 }
7633 }
7634 }
7635
7636
7638 {
7639 super.OnRightClick();
7640
7642 {
7644 {
7645 if (ScriptInputUserData.CanStoreInputUserData())
7646 {
7647 EntityAI root = GetHierarchyRoot();
7648 Man playerOwner = GetHierarchyRootPlayer();
7649 InventoryLocation dst = new InventoryLocation;
7650
7651
7652 if (!playerOwner && root && root == this)
7653 {
7655 }
7656 else
7657 {
7658
7659 GetInventory().GetCurrentInventoryLocation(dst);
7661 {
7664 {
7666 }
7667 else
7668 {
7670
7671
7672 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7673 {
7675 }
7676 else
7677 {
7678 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7679 }
7680 }
7681 }
7682 }
7683
7684 ScriptInputUserData ctx = new ScriptInputUserData;
7692 }
7693 }
7694 else if (!
GetGame().IsMultiplayer())
7695 {
7697 }
7698 }
7699 }
7700
7702 {
7703 if (root)
7704 {
7705 vector m4[4];
7706 root.GetTransform(m4);
7707 dst.SetGround(this, m4);
7708 }
7709 else
7710 {
7711 GetInventory().GetCurrentInventoryLocation(dst);
7712 }
7713 }
7714
7715 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7716 {
7717
7718 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7719 return false;
7720
7721 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7722 return false;
7723
7724
7726 return false;
7727
7728
7729 Magazine mag = Magazine.Cast(this);
7730 if (mag)
7731 {
7732 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7733 return false;
7734
7735 if (stack_max_limit)
7736 {
7737 Magazine other_mag = Magazine.Cast(other_item);
7738 if (other_item)
7739 {
7740 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7741 return false;
7742 }
7743
7744 }
7745 }
7746 else
7747 {
7748
7750 return false;
7751
7753 return false;
7754 }
7755
7756 PlayerBase player = null;
7757 if (CastTo(player, GetHierarchyRootPlayer()))
7758 {
7759 if (player.GetInventory().HasAttachment(this))
7760 return false;
7761
7762 if (player.IsItemsToDelete())
7763 return false;
7764 }
7765
7766 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7767 return false;
7768
7769 int slotID;
7771 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7772 return false;
7773
7774 return true;
7775 }
7776
7778 {
7780 }
7781
7783 {
7784 return m_IsResultOfSplit;
7785 }
7786
7788 {
7789 m_IsResultOfSplit = value;
7790 }
7791
7793 {
7795 }
7796
7798 {
7799 float other_item_quantity = other_item.GetQuantity();
7800 float this_free_space;
7801
7803
7805
7806 if (other_item_quantity > this_free_space)
7807 {
7808 return this_free_space;
7809 }
7810 else
7811 {
7812 return other_item_quantity;
7813 }
7814 }
7815
7817 {
7819 }
7820
7822 {
7824 return;
7825
7826 if (!IsMagazine() && other_item)
7827 {
7829 if (quantity_used != 0)
7830 {
7831 float hp1 = GetHealth01("","");
7832 float hp2 = other_item.GetHealth01("","");
7833 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7834 hpResult = hpResult / (
GetQuantity() + quantity_used);
7835
7836 hpResult *= GetMaxHealth();
7837 Math.Round(hpResult);
7838 SetHealth("", "Health", hpResult);
7839
7841 other_item.AddQuantity(-quantity_used);
7842 }
7843 }
7845 }
7846
7848 {
7849 #ifdef SERVER
7850 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7851 GetHierarchyParent().IncreaseLifetimeUp();
7852 #endif
7853 };
7854
7856 {
7857 PlayerBase p = PlayerBase.Cast(player);
7858
7859 array<int> recipesIds = p.m_Recipes;
7860 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7861 if (moduleRecipesManager)
7862 {
7863 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7864 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7865 }
7866
7867 for (int i = 0;i < recipesIds.Count(); i++)
7868 {
7869 int key = recipesIds.Get(i);
7870 string recipeName = moduleRecipesManager.GetRecipeName(key);
7872 }
7873 }
7874
7875
7876 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7877 {
7878 super.GetDebugActions(outputList);
7879
7880
7886
7887
7892
7897
7898
7902
7903
7905 {
7909 }
7910
7913
7914
7918
7920
7921 InventoryLocation loc = new InventoryLocation();
7922 GetInventory().GetCurrentInventoryLocation(loc);
7924 {
7925 if (Gizmo_IsSupported())
7928 }
7929
7931 }
7932
7933
7934
7935
7937 {
7938 super.OnAction(action_id, player, ctx);
7939
7941 {
7942 switch (action_id)
7943 {
7946 return true;
7949 return true;
7950 }
7951 }
7952
7954 {
7955 switch (action_id)
7956 {
7958 Delete();
7959 return true;
7960 }
7961 }
7962
7963 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7964 {
7965 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7966 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7967 PlayerBase p = PlayerBase.Cast(player);
7968 if (
EActions.RECIPES_RANGE_START < 1000)
7969 {
7970 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7971 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7972 }
7973 }
7974 #ifndef SERVER
7975 else if (action_id ==
EActions.WATCH_PLAYER)
7976 {
7977 PluginDeveloper.SetDeveloperItemClientEx(player);
7978 }
7979 #endif
7981 {
7982 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7983 {
7984 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7985 OnDebugButtonPressServer(id + 1);
7986 }
7987
7988 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7989 {
7990 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7992 }
7993
7994 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7995 {
7996 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7998 }
7999
8000 else if (action_id ==
EActions.ADD_QUANTITY)
8001 {
8002 if (IsMagazine())
8003 {
8004 Magazine mag = Magazine.Cast(this);
8005 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8006 }
8007 else
8008 {
8010 }
8011
8012 if (m_EM)
8013 {
8014 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8015 }
8016
8017 }
8018
8019 else if (action_id ==
EActions.REMOVE_QUANTITY)
8020 {
8021 if (IsMagazine())
8022 {
8023 Magazine mag2 = Magazine.Cast(this);
8024 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8025 }
8026 else
8027 {
8029 }
8030 if (m_EM)
8031 {
8032 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8033 }
8034
8035 }
8036
8037 else if (action_id ==
EActions.SET_QUANTITY_0)
8038 {
8040
8041 if (m_EM)
8042 {
8043 m_EM.SetEnergy(0);
8044 }
8045 }
8046
8047 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8048 {
8050
8051 if (m_EM)
8052 {
8053 m_EM.SetEnergy(m_EM.GetEnergyMax());
8054 }
8055 }
8056
8057 else if (action_id ==
EActions.ADD_HEALTH)
8058 {
8059 AddHealth("","",GetMaxHealth("","Health")/5);
8060 }
8061 else if (action_id ==
EActions.REMOVE_HEALTH)
8062 {
8063 AddHealth("","",-GetMaxHealth("","Health")/5);
8064 }
8065 else if (action_id ==
EActions.DESTROY_HEALTH)
8066 {
8067 SetHealth01("","",0);
8068 }
8069 else if (action_id ==
EActions.WATCH_ITEM)
8070 {
8072 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8073 #ifdef DEVELOPER
8074 SetDebugDeveloper_item(this);
8075 #endif
8076 }
8077
8078 else if (action_id ==
EActions.ADD_TEMPERATURE)
8079 {
8080 AddTemperature(20);
8081
8082 }
8083
8084 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8085 {
8086 AddTemperature(-20);
8087
8088 }
8089
8090 else if (action_id ==
EActions.FLIP_FROZEN)
8091 {
8092 SetFrozen(!GetIsFrozen());
8093
8094 }
8095
8096 else if (action_id ==
EActions.ADD_WETNESS)
8097 {
8099
8100 }
8101
8102 else if (action_id ==
EActions.REMOVE_WETNESS)
8103 {
8105
8106 }
8107
8108 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8109 {
8112
8113
8114 }
8115
8116 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8117 {
8120 }
8121
8122 else if (action_id ==
EActions.MAKE_SPECIAL)
8123 {
8124 auto debugParams = DebugSpawnParams.WithPlayer(player);
8125 OnDebugSpawnEx(debugParams);
8126 }
8127
8128 }
8129
8130
8131 return false;
8132 }
8133
8134
8135
8136
8140
8143
8144
8145
8147 {
8148 return false;
8149 }
8150
8151
8153 {
8154 return true;
8155 }
8156
8157
8159 {
8160 return true;
8161 }
8162
8163
8164
8166 {
8167 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8169 }
8170
8173 {
8174 return null;
8175 }
8176
8178 {
8179 return false;
8180 }
8181
8183 {
8184 return false;
8185 }
8186
8190
8191
8193 {
8194 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8195 return module_repairing.CanRepair(this, item_repair_kit);
8196 }
8197
8198
8199 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8200 {
8201 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8202 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8203 }
8204
8205
8207 {
8208
8209
8210
8211
8212
8213
8214
8215
8216 return 1;
8217 }
8218
8219
8220
8222 {
8224 }
8225
8226
8227
8229 {
8231 }
8232
8233
8242 {
8243 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8244
8245 if (player)
8246 {
8247 player.MessageStatus(text);
8248 }
8249 }
8250
8251
8260 {
8261 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8262
8263 if (player)
8264 {
8265 player.MessageAction(text);
8266 }
8267 }
8268
8269
8278 {
8279 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8280
8281 if (player)
8282 {
8283 player.MessageFriendly(text);
8284 }
8285 }
8286
8287
8296 {
8297 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8298
8299 if (player)
8300 {
8301 player.MessageImportant(text);
8302 }
8303 }
8304
8306 {
8307 return true;
8308 }
8309
8310
8311 override bool KindOf(
string tag)
8312 {
8313 bool found = false;
8314 string item_name = this.
GetType();
8317
8318 int array_size = item_tag_array.Count();
8319 for (int i = 0; i < array_size; i++)
8320 {
8321 if (item_tag_array.Get(i) == tag)
8322 {
8323 found = true;
8324 break;
8325 }
8326 }
8327 return found;
8328 }
8329
8330
8332 {
8333
8334 super.OnRPC(sender, rpc_type,ctx);
8335
8336
8337 switch (rpc_type)
8338 {
8339 #ifndef SERVER
8340 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8341 Param2<bool, string> p = new Param2<bool, string>(false, "");
8342
8344 return;
8345
8346 bool play = p.param1;
8347 string soundSet = p.param2;
8348
8349 if (play)
8350 {
8352 {
8354 {
8356 }
8357 }
8358 else
8359 {
8361 }
8362 }
8363 else
8364 {
8366 }
8367
8368 break;
8369 #endif
8370
8371 }
8372
8374 {
8376 }
8377 }
8378
8379
8380
8381
8383 {
8384 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8385 return plugin.GetID(
name);
8386 }
8387
8389 {
8390 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8391 return plugin.GetName(id);
8392 }
8393
8396 {
8397
8398
8399 int varFlags;
8400 if (!ctx.
Read(varFlags))
8401 return;
8402
8403 if (varFlags & ItemVariableFlags.FLOAT)
8404 {
8406 }
8407 }
8408
8410 {
8411
8412 super.SerializeNumericalVars(floats_out);
8413
8414
8415
8417 {
8419 }
8420
8422 {
8424 }
8425
8427 {
8429 }
8430
8432 {
8437 }
8438
8440 {
8442 }
8443 }
8444
8446 {
8447
8448 super.DeSerializeNumericalVars(floats);
8449
8450
8451 int index = 0;
8452 int mask = Math.Round(floats.Get(index));
8453
8454 index++;
8455
8457 {
8459 {
8461 }
8462 else
8463 {
8464 float quantity = floats.Get(index);
8466 }
8467 index++;
8468 }
8469
8471 {
8472 float wet = floats.Get(index);
8474 index++;
8475 }
8476
8478 {
8479 int liquidtype = Math.Round(floats.Get(index));
8481 index++;
8482 }
8483
8485 {
8487 index++;
8489 index++;
8491 index++;
8493 index++;
8494 }
8495
8497 {
8498 int cleanness = Math.Round(floats.Get(index));
8500 index++;
8501 }
8502 }
8503
8505 {
8506 super.WriteVarsToCTX(ctx);
8507
8508
8510 {
8512 }
8513
8515 {
8517 }
8518
8520 {
8522 }
8523
8525 {
8526 int r,g,b,a;
8532 }
8533
8535 {
8537 }
8538 }
8539
8541 {
8542 if (!super.ReadVarsFromCTX(ctx,version))
8543 return false;
8544
8545 int intValue;
8546 float value;
8547
8548 if (version < 140)
8549 {
8550 if (!ctx.
Read(intValue))
8551 return false;
8552
8553 m_VariablesMask = intValue;
8554 }
8555
8557 {
8558 if (!ctx.
Read(value))
8559 return false;
8560
8562 {
8564 }
8565 else
8566 {
8568 }
8569 }
8570
8571 if (version < 140)
8572 {
8574 {
8575 if (!ctx.
Read(value))
8576 return false;
8577 SetTemperatureDirect(value);
8578 }
8579 }
8580
8582 {
8583 if (!ctx.
Read(value))
8584 return false;
8586 }
8587
8589 {
8590 if (!ctx.
Read(intValue))
8591 return false;
8593 }
8594
8596 {
8597 int r,g,b,a;
8599 return false;
8601 return false;
8603 return false;
8605 return false;
8606
8608 }
8609
8611 {
8612 if (!ctx.
Read(intValue))
8613 return false;
8615 }
8616
8617 if (version >= 138 && version < 140)
8618 {
8620 {
8621 if (!ctx.
Read(intValue))
8622 return false;
8623 SetFrozen(intValue);
8624 }
8625 }
8626
8627 return true;
8628 }
8629
8630
8632 {
8635 {
8637 }
8638
8639 if (!super.OnStoreLoad(ctx, version))
8640 {
8642 return false;
8643 }
8644
8645 if (version >= 114)
8646 {
8647 bool hasQuickBarIndexSaved;
8648
8649 if (!ctx.
Read(hasQuickBarIndexSaved))
8650 {
8652 return false;
8653 }
8654
8655 if (hasQuickBarIndexSaved)
8656 {
8657 int itmQBIndex;
8658
8659
8660 if (!ctx.
Read(itmQBIndex))
8661 {
8663 return false;
8664 }
8665
8666 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8667 if (itmQBIndex != -1 && parentPlayer)
8668 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8669 }
8670 }
8671 else
8672 {
8673
8674 PlayerBase player;
8675 int itemQBIndex;
8676 if (version ==
int.
MAX)
8677 {
8678 if (!ctx.
Read(itemQBIndex))
8679 {
8681 return false;
8682 }
8683 }
8684 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8685 {
8686
8687 if (!ctx.
Read(itemQBIndex))
8688 {
8690 return false;
8691 }
8692 if (itemQBIndex != -1 && player)
8693 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8694 }
8695 }
8696
8697 if (version < 140)
8698 {
8699
8700 if (!LoadVariables(ctx, version))
8701 {
8703 return false;
8704 }
8705 }
8706
8707
8709 {
8711 return false;
8712 }
8713 if (version >= 132)
8714 {
8716 if (raib)
8717 {
8719 {
8721 return false;
8722 }
8723 }
8724 }
8725
8727 return true;
8728 }
8729
8730
8731
8733 {
8734 super.OnStoreSave(ctx);
8735
8736 PlayerBase player;
8737 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8738 {
8740
8741 int itemQBIndex = -1;
8742 itemQBIndex = player.FindQuickBarEntityIndex(this);
8743 ctx.
Write(itemQBIndex);
8744 }
8745 else
8746 {
8748 }
8749
8751
8753 if (raib)
8754 {
8756 }
8757 }
8758
8759
8761 {
8762 super.AfterStoreLoad();
8763
8765 {
8767 }
8768
8770 {
8773 }
8774 }
8775
8777 {
8778 super.EEOnAfterLoad();
8779
8781 {
8783 }
8784
8787 }
8788
8790 {
8791 return false;
8792 }
8793
8794
8795
8797 {
8799 {
8800 #ifdef PLATFORM_CONSOLE
8801
8803 {
8805 if (menu)
8806 {
8808 }
8809 }
8810 #endif
8811 }
8812
8814 {
8817 }
8818
8820 {
8821 SetWeightDirty();
8823 }
8825 {
8828 }
8829
8831 {
8834 }
8836 {
8839 }
8840
8841 super.OnVariablesSynchronized();
8842 }
8843
8844
8845
8847 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8848 {
8849 if (!IsServerCheck(allow_client))
8850 return false;
8851
8853 return false;
8854
8857
8858 if (value <= (min + 0.001))
8859 value = min;
8860
8861 if (value == min)
8862 {
8863 if (destroy_config)
8864 {
8865 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8866 if (dstr)
8867 {
8869 this.Delete();
8870 return true;
8871 }
8872 }
8873 else if (destroy_forced)
8874 {
8876 this.Delete();
8877 return true;
8878 }
8879
8881 }
8882
8885
8887 {
8889
8890 if (delta)
8892 }
8893
8895
8896 return false;
8897 }
8898
8899
8901 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8902 {
8904 }
8905
8907 {
8910 }
8911
8913 {
8916 }
8917
8919 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8920 {
8921 float value_clamped = Math.Clamp(value, 0, 1);
8923 SetQuantity(result, destroy_config, destroy_forced);
8924 }
8925
8926
8929 {
8931 }
8932
8934 {
8936 }
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8948 {
8949 int slot = -1;
8950 if (GetInventory())
8951 {
8952 InventoryLocation il = new InventoryLocation;
8953 GetInventory().GetCurrentInventoryLocation(il);
8955 }
8956
8958 }
8959
8961 {
8962 float quantity_max = 0;
8963
8965 {
8966 if (attSlotID != -1)
8967 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8968
8969 if (quantity_max <= 0)
8971 }
8972
8973 if (quantity_max <= 0)
8975
8976 return quantity_max;
8977 }
8978
8980 {
8982 }
8983
8985 {
8987 }
8988
8989
8991 {
8993 }
8994
8996 {
8998 }
8999
9001 {
9003 }
9004
9005
9007 {
9008
9009 float weightEx = GetWeightEx();
9010 float special = GetInventoryAndCargoWeight();
9011 return weightEx - special;
9012 }
9013
9014
9016 {
9018 }
9019
9021 {
9023 {
9024 #ifdef DEVELOPER
9025 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9026 {
9027 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9029 }
9030 #endif
9031
9033 }
9034 else if (HasEnergyManager())
9035 {
9036 #ifdef DEVELOPER
9037 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9038 {
9039 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9040 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9041 }
9042 #endif
9043 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9044 }
9045 else
9046 {
9047 #ifdef DEVELOPER
9048 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9049 {
9050 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9051 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9052 }
9053 #endif
9054 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9055 }
9056 }
9057
9060 {
9061 int item_count = 0;
9063
9064 if (GetInventory().GetCargo() != NULL)
9065 {
9066 item_count = GetInventory().GetCargo().GetItemCount();
9067 }
9068
9069 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
9070 {
9071 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
9072 if (item)
9073 item_count += item.GetNumberOfItems();
9074 }
9075 return item_count;
9076 }
9077
9080 {
9081 float weight = 0;
9082 float wetness = 1;
9083 if (include_wetness)
9086 {
9087 weight = wetness * m_ConfigWeight;
9088 }
9090 {
9091 weight = 1;
9092 }
9093 return weight;
9094 }
9095
9096
9097
9099 {
9100 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
9101 {
9102 GameInventory inv = GetInventory();
9103 array<EntityAI> items = new array<EntityAI>;
9105 for (int i = 0; i < items.Count(); i++)
9106 {
9108 if (item)
9109 {
9111 }
9112 }
9113 }
9114 }
9115
9116
9117
9118
9120 {
9121 float energy = 0;
9122 if (HasEnergyManager())
9123 {
9124 energy = GetCompEM().GetEnergy();
9125 }
9126 return energy;
9127 }
9128
9129
9131 {
9132 super.OnEnergyConsumed();
9133
9135 }
9136
9138 {
9139 super.OnEnergyAdded();
9140
9142 }
9143
9144
9146 {
9147 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9148 {
9150 {
9151 float energy_0to1 = GetCompEM().GetEnergy0To1();
9153 }
9154 }
9155 }
9156
9157
9159 {
9160 return ConfigGetFloat("heatIsolation");
9161 }
9162
9164 {
9166 }
9167
9169 {
9170 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9171 if (
GetGame().ConfigIsExisting(paramPath))
9173
9174 return 0.0;
9175 }
9176
9178 {
9179 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9180 if (
GetGame().ConfigIsExisting(paramPath))
9182
9183 return 0.0;
9184 }
9185
9186 override void SetWet(
float value,
bool allow_client =
false)
9187 {
9188 if (!IsServerCheck(allow_client))
9189 return;
9190
9193
9195
9196 m_VarWet = Math.Clamp(value, min, max);
9197
9199 {
9202 }
9203 }
9204
9205 override void AddWet(
float value)
9206 {
9208 }
9209
9211 {
9213 }
9214
9216 {
9218 }
9219
9221 {
9223 }
9224
9226 {
9228 }
9229
9231 {
9233 }
9234
9236 {
9239 if (newLevel != oldLevel)
9240 {
9242 }
9243 }
9244
9246 {
9247 SetWeightDirty();
9248 }
9249
9251 {
9252 return GetWetLevelInternal(
m_VarWet);
9253 }
9254
9255
9256
9258 {
9260 }
9261
9263 {
9265 }
9266
9268 {
9270 }
9271
9273 {
9275 }
9276
9277
9278
9280 {
9281 if (ConfigIsExisting("itemModelLength"))
9282 {
9283 return ConfigGetFloat("itemModelLength");
9284 }
9285 return 0;
9286 }
9287
9289 {
9290 if (ConfigIsExisting("itemAttachOffset"))
9291 {
9292 return ConfigGetFloat("itemAttachOffset");
9293 }
9294 return 0;
9295 }
9296
9297 override void SetCleanness(
int value,
bool allow_client =
false)
9298 {
9299 if (!IsServerCheck(allow_client))
9300 return;
9301
9303
9305
9308 }
9309
9311 {
9313 }
9314
9316 {
9317 return true;
9318 }
9319
9320
9321
9322
9324 {
9326 }
9327
9329 {
9331 }
9332
9333
9334
9335
9336 override void SetColor(
int r,
int g,
int b,
int a)
9337 {
9343 }
9345 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9346 {
9351 }
9352
9354 {
9356 }
9357
9360 {
9361 int r,g,b,a;
9363 r = r/255;
9364 g = g/255;
9365 b = b/255;
9366 a = a/255;
9367 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9368 }
9369
9370
9371
9372 override void SetLiquidType(
int value,
bool allow_client =
false)
9373 {
9374 if (!IsServerCheck(allow_client))
9375 return;
9376
9381 }
9382
9384 {
9385 return ConfigGetInt("varLiquidTypeInit");
9386 }
9387
9389 {
9391 }
9392
9394 {
9396 SetFrozen(false);
9397 }
9398
9401 {
9402 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9403 }
9404
9405
9408 {
9409 PlayerBase nplayer;
9410 if (PlayerBase.CastTo(nplayer, player))
9411 {
9413
9414 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9415 }
9416 }
9417
9418
9421 {
9422 PlayerBase nplayer;
9423 if (PlayerBase.CastTo(nplayer,player))
9424 {
9425
9426 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9427
9428 }
9429
9430
9431 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9432
9433
9434 if (HasEnergyManager())
9435 {
9436 GetCompEM().UpdatePlugState();
9437 }
9438 }
9439
9440
9442 {
9443 super.OnPlacementStarted(player);
9444
9446 }
9447
9448 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9449 {
9451 {
9452 m_AdminLog.OnPlacementComplete(player,
this);
9453 }
9454
9455 super.OnPlacementComplete(player, position, orientation);
9456 }
9457
9458
9459
9460
9461
9463 {
9465 {
9466 return true;
9467 }
9468 else
9469 {
9470 return false;
9471 }
9472 }
9473
9474
9476 {
9478 {
9480 }
9481 }
9482
9483
9485 {
9487 }
9488
9490 {
9492 }
9493
9494 override void InsertAgent(
int agent,
float count = 1)
9495 {
9496 if (count < 1)
9497 return;
9498
9500 }
9501
9504 {
9506 }
9507
9508
9510 {
9512 }
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9556 {
9558 return false;
9559 return true;
9560 }
9561
9563 {
9564
9566 }
9567
9568
9571 {
9572 super.CheckForRoofLimited(timeTresholdMS);
9573
9575 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9576 {
9577 m_PreviousRoofTestTime = time;
9578 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9579 }
9580 }
9581
9582
9584 {
9586 {
9587 return 0;
9588 }
9589
9590 if (GetInventory().GetAttachmentSlotsCount() != 0)
9591 {
9592 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9593 if (filter)
9594 return filter.GetProtectionLevel(type, false, system);
9595 else
9596 return 0;
9597 }
9598
9599 string subclassPath, entryName;
9600
9601 switch (type)
9602 {
9604 entryName = "biological";
9605 break;
9607 entryName = "chemical";
9608 break;
9609 default:
9610 entryName = "biological";
9611 break;
9612 }
9613
9614 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9615
9617 }
9618
9619
9620
9623 {
9624 if (!IsMagazine())
9626
9628 }
9629
9630
9631
9632
9633
9638 {
9639 return true;
9640 }
9641
9643 {
9645 }
9646
9647
9648
9649
9650
9652 {
9653 if (parent)
9654 {
9655 if (parent.IsInherited(DayZInfected))
9656 return true;
9657
9658 if (!parent.IsRuined())
9659 return true;
9660 }
9661
9662 return true;
9663 }
9664
9666 {
9667 if (!super.CanPutAsAttachment(parent))
9668 {
9669 return false;
9670 }
9671
9672 if (!IsRuined() && !parent.IsRuined())
9673 {
9674 return true;
9675 }
9676
9677 return false;
9678 }
9679
9681 {
9682
9683
9684
9685
9686 return super.CanReceiveItemIntoCargo(item);
9687 }
9688
9690 {
9691
9692
9693
9694
9695 GameInventory attachmentInv = attachment.GetInventory();
9697 {
9698 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9699 return false;
9700 }
9701
9702 InventoryLocation loc = new InventoryLocation();
9703 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9704 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9705 return false;
9706
9707 return super.CanReceiveAttachment(attachment, slotId);
9708 }
9709
9711 {
9712 if (!super.CanReleaseAttachment(attachment))
9713 return false;
9714
9715 return GetInventory().AreChildrenAccessible();
9716 }
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9739 {
9740 int id = muzzle_owner.GetMuzzleID();
9741 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9742
9743 if (WPOF_array)
9744 {
9745 for (int i = 0; i < WPOF_array.Count(); i++)
9746 {
9747 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9748
9749 if (WPOF)
9750 {
9751 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9752 }
9753 }
9754 }
9755 }
9756
9757
9759 {
9760 int id = muzzle_owner.GetMuzzleID();
9762
9763 if (WPOBE_array)
9764 {
9765 for (int i = 0; i < WPOBE_array.Count(); i++)
9766 {
9767 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9768
9769 if (WPOBE)
9770 {
9771 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9772 }
9773 }
9774 }
9775 }
9776
9777
9779 {
9780 int id = muzzle_owner.GetMuzzleID();
9781 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9782
9783 if (WPOOH_array)
9784 {
9785 for (int i = 0; i < WPOOH_array.Count(); i++)
9786 {
9787 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9788
9789 if (WPOOH)
9790 {
9791 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9792 }
9793 }
9794 }
9795 }
9796
9797
9799 {
9800 int id = muzzle_owner.GetMuzzleID();
9801 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9802
9803 if (WPOOH_array)
9804 {
9805 for (int i = 0; i < WPOOH_array.Count(); i++)
9806 {
9807 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9808
9809 if (WPOOH)
9810 {
9811 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9812 }
9813 }
9814 }
9815 }
9816
9817
9819 {
9820 int id = muzzle_owner.GetMuzzleID();
9821 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9822
9823 if (WPOOH_array)
9824 {
9825 for (int i = 0; i < WPOOH_array.Count(); i++)
9826 {
9827 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9828
9829 if (WPOOH)
9830 {
9831 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9832 }
9833 }
9834 }
9835 }
9836
9837
9838
9840 {
9842 {
9843 return true;
9844 }
9845
9846 return false;
9847 }
9848
9850 {
9852 {
9853 return true;
9854 }
9855
9856 return false;
9857 }
9858
9860 {
9862 {
9863 return true;
9864 }
9865
9866 return false;
9867 }
9868
9870 {
9871 return false;
9872 }
9873
9876 {
9877 return UATimeSpent.DEFAULT_DEPLOY;
9878 }
9879
9880
9881
9882
9884 {
9886 SetSynchDirty();
9887 }
9888
9890 {
9892 }
9893
9894
9896 {
9897 return false;
9898 }
9899
9902 {
9903 string att_type = "None";
9904
9905 if (ConfigIsExisting("soundAttType"))
9906 {
9907 att_type = ConfigGetString("soundAttType");
9908 }
9909
9911 }
9912
9914 {
9916 }
9917
9918
9919
9920
9921
9927
9929 {
9932
9934 }
9935
9936
9938 {
9940 return;
9941
9943
9946
9949
9950 SoundParameters params = new SoundParameters();
9954 }
9955
9956
9958 {
9960 return;
9961
9963 SetSynchDirty();
9964
9967 }
9968
9969
9971 {
9973 return;
9974
9976 SetSynchDirty();
9977
9980 }
9981
9983 {
9985 }
9986
9988 {
9990 }
9991
9994 {
9995 if (!
GetGame().IsDedicatedServer())
9996 {
9997 if (ConfigIsExisting("attachSoundSet"))
9998 {
9999 string cfg_path = "";
10000 string soundset = "";
10001 string type_name =
GetType();
10002
10005 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10006 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10007
10008 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10009 {
10010 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10011 {
10012 if (cfg_slot_array[i] == slot_type)
10013 {
10014 soundset = cfg_soundset_array[i];
10015 break;
10016 }
10017 }
10018 }
10019
10020 if (soundset != "")
10021 {
10022 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10024 }
10025 }
10026 }
10027 }
10028
10030 {
10031
10032 }
10033
10034 void OnApply(PlayerBase player);
10035
10037 {
10038 return 1.0;
10039 };
10040
10042 {
10044 }
10045
10047 {
10049 }
10050
10052
10054 {
10055 SetDynamicPhysicsLifeTime(0.01);
10057 }
10058
10060 {
10061 array<string> zone_names = new array<string>;
10062 GetDamageZones(zone_names);
10063 for (int i = 0; i < zone_names.Count(); i++)
10064 {
10065 SetHealthMax(zone_names.Get(i),"Health");
10066 }
10067 SetHealthMax("","Health");
10068 }
10069
10072 {
10073 float global_health = GetHealth01("","Health");
10074 array<string> zones = new array<string>;
10075 GetDamageZones(zones);
10076
10077 for (int i = 0; i < zones.Count(); i++)
10078 {
10079 SetHealth01(zones.Get(i),"Health",global_health);
10080 }
10081 }
10082
10085 {
10086 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10087 }
10088
10090 {
10091 if (!hasRootAsPlayer)
10092 {
10093 if (refParentIB)
10094 {
10095
10096 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10097 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10098
10099 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10100 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10101
10104 }
10105 else
10106 {
10107
10110 }
10111 }
10112 }
10113
10115 {
10117 {
10118 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10119 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10120 {
10121 float heatPermCoef = 1.0;
10123 while (ent)
10124 {
10125 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10126 ent = ent.GetHierarchyParent();
10127 }
10128
10129 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10130 }
10131 }
10132 }
10133
10135 {
10136
10137 EntityAI parent = GetHierarchyParent();
10138 if (!parent)
10139 {
10140 hasParent = false;
10141 hasRootAsPlayer = false;
10142 }
10143 else
10144 {
10145 hasParent = true;
10146 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10147 refParentIB =
ItemBase.Cast(parent);
10148 }
10149 }
10150
10151 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10152 {
10153
10154 }
10155
10157 {
10158
10159 return false;
10160 }
10161
10163 {
10164
10165
10166 return false;
10167 }
10168
10170 {
10171
10172 return false;
10173 }
10174
10177 {
10178 return !GetIsFrozen() &&
IsOpen();
10179 }
10180
10182 {
10183 bool hasParent = false, hasRootAsPlayer = false;
10185
10186 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10187 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10188
10189 if (wwtu || foodDecay)
10190 {
10194
10195 if (processWetness || processTemperature || processDecay)
10196 {
10198
10199 if (processWetness)
10200 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10201
10202 if (processTemperature)
10204
10205 if (processDecay)
10206 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10207 }
10208 }
10209 }
10210
10213 {
10215 }
10216
10218 {
10221
10222 return super.GetTemperatureFreezeThreshold();
10223 }
10224
10226 {
10229
10230 return super.GetTemperatureThawThreshold();
10231 }
10232
10234 {
10237
10238 return super.GetItemOverheatThreshold();
10239 }
10240
10242 {
10244 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10245
10246 return super.GetTemperatureFreezeTime();
10247 }
10248
10250 {
10252 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10253
10254 return super.GetTemperatureThawTime();
10255 }
10256
10261
10263 {
10264 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10265 }
10266
10268 {
10269 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10270 }
10271
10274 {
10276 }
10277
10279 {
10281 }
10282
10284 {
10286 }
10287
10290 {
10291 return null;
10292 }
10293
10296 {
10297 return false;
10298 }
10299
10301 {
10303 {
10306 if (!trg)
10307 {
10309 explosive = this;
10310 }
10311
10312 explosive.PairRemote(trg);
10314
10315 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10316 trg.SetPersistentPairID(persistentID);
10317 explosive.SetPersistentPairID(persistentID);
10318
10319 return true;
10320 }
10321 return false;
10322 }
10323
10326 {
10327 float ret = 1.0;
10330 ret *= GetHealth01();
10331
10332 return ret;
10333 }
10334
10335 #ifdef DEVELOPER
10336 override void SetDebugItem()
10337 {
10338 super.SetDebugItem();
10339 _itemBase = this;
10340 }
10341
10343 {
10344 string text = super.GetDebugText();
10345
10347 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10348
10349 return text;
10350 }
10351 #endif
10352
10354 {
10355 return true;
10356 }
10357
10359
10361
10363 {
10366 }
10367
10368
10376
10392}
10393
10395{
10397 if (entity)
10398 {
10399 bool is_item = entity.IsInherited(
ItemBase);
10400 if (is_item && full_quantity)
10401 {
10404 }
10405 }
10406 else
10407 {
10409 return NULL;
10410 }
10411 return entity;
10412}
10413
10415{
10416 if (item)
10417 {
10418 if (health > 0)
10419 item.SetHealth("", "", health);
10420
10421 if (item.CanHaveTemperature())
10422 {
10424 if (item.CanFreeze())
10425 item.SetFrozen(false);
10426 }
10427
10428 if (item.HasEnergyManager())
10429 {
10430 if (quantity >= 0)
10431 {
10432 item.GetCompEM().SetEnergy0To1(quantity);
10433 }
10434 else
10435 {
10437 }
10438 }
10439 else if (item.IsMagazine())
10440 {
10441 Magazine mag = Magazine.Cast(item);
10442 if (quantity >= 0)
10443 {
10444 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10445 }
10446 else
10447 {
10449 }
10450
10451 }
10452 else
10453 {
10454 if (quantity >= 0)
10455 {
10456 item.SetQuantityNormalized(quantity, false);
10457 }
10458 else
10459 {
10461 }
10462
10463 }
10464 }
10465}
10466
10467#ifdef DEVELOPER
10469#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.