5680{
5682 {
5683 return true;
5684 }
5685};
5686
5688{
5689
5690};
5691
5692
5693
5695{
5699
5701
5704
5705
5706
5707
5708
5717
5723
5728
5733
5754 protected bool m_IsResultOfSplit
5755
5757
5762
5763
5764
5766
5770
5771
5772
5774
5777
5778
5779
5785
5786
5794
5797
5798
5800
5801
5803
5804
5809
5810
5815
5817
5818
5820
5821
5823 {
5828
5829 if (!
g_Game.IsDedicatedServer())
5830 {
5832 {
5834
5836 {
5838 }
5839 }
5840
5843 }
5844
5845 m_OldLocation = null;
5846
5848 {
5850 }
5851
5852 if (ConfigIsExisting("headSelectionsToHide"))
5853 {
5856 }
5857
5859 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5860 {
5862 }
5863
5865
5866 m_IsResultOfSplit = false;
5867
5869 }
5870
5872 {
5873 super.InitItemVariables();
5874
5880 m_Count = ConfigGetInt(
"count");
5881
5884
5889
5892
5897
5909
5913
5914
5917 if (ConfigIsExisting("canBeSplit"))
5918 {
5921 }
5922
5924 if (ConfigIsExisting("itemBehaviour"))
5926
5927
5930 RegisterNetSyncVariableInt("m_VarLiquidType");
5931 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5932
5933 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5934 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5935 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5936
5937 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5938 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5939 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5940 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5941
5942 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5943 RegisterNetSyncVariableBool("m_IsTakeable");
5944 RegisterNetSyncVariableBool("m_IsHologram");
5945
5948 {
5951 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5952 }
5953
5955
5957 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5959
5961 }
5962
5964 {
5966 }
5967
5969 {
5972 {
5977 }
5978 }
5979
5980 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5981 {
5983 {
5986 }
5987
5989 }
5990
5992 {
5998 }
5999
6001
6003 {
6005
6006 if (!action)
6007 {
6008 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
6009 return;
6010 }
6011
6013 if (!ai)
6014 {
6016 return;
6017 }
6018
6020 if (!action_array)
6021 {
6022 action_array = new array<ActionBase_Basic>;
6024 }
6025 if (LogManager.IsActionLogEnable())
6026 {
6027 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
6028 }
6029
6030 if (action_array.Find(action) != -1)
6031 {
6032 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
6033 }
6034 else
6035 {
6036 action_array.Insert(action);
6037 }
6038 }
6039
6041 {
6042 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6043 ActionBase action = player.GetActionManager().GetAction(actionName);
6046
6047 if (action_array)
6048 {
6049 action_array.RemoveItem(action);
6050 }
6051 }
6052
6053
6054
6056 {
6057 ActionOverrideData overrideData = new ActionOverrideData();
6061
6063 if (!actionMap)
6064 {
6067 }
6068
6069 actionMap.Insert(this.
Type(), overrideData);
6070
6071 }
6072
6074
6076
6077
6079 {
6082
6085
6086 string config_to_search = "CfgVehicles";
6087 string muzzle_owner_config;
6088
6090 {
6091 if (IsInherited(Weapon))
6092 config_to_search = "CfgWeapons";
6093
6094 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6095
6096 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6097
6098 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
6099
6100 if (config_OnFire_subclass_count > 0)
6101 {
6102 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6103
6104 for (int i = 0; i < config_OnFire_subclass_count; i++)
6105 {
6106 string particle_class = "";
6107 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
6108 string config_OnFire_entry = config_OnFire_class + particle_class;
6109 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6110 WPOF_array.Insert(WPOF);
6111 }
6112
6113
6115 }
6116 }
6117
6119 {
6120 config_to_search = "CfgWeapons";
6121 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6122
6123 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6124
6125 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6126
6127 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6128 {
6129 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6130
6131 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6132 {
6133 string particle_class2 = "";
6134 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6135 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6136 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6137 WPOBE_array.Insert(WPOBE);
6138 }
6139
6140
6142 }
6143 }
6144 }
6145
6146
6148 {
6151
6153 {
6154 string config_to_search = "CfgVehicles";
6155
6156 if (IsInherited(Weapon))
6157 config_to_search = "CfgWeapons";
6158
6159 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6160 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6161
6162 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6163 {
6164
6166
6168 {
6170 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6172 return;
6173 }
6174
6177
6178
6179
6180 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6181 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6182
6183 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6184 {
6185 string particle_class = "";
6186 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6187 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6188 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6189
6190 if (entry_type == CT_CLASS)
6191 {
6192 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6193 WPOOH_array.Insert(WPOF);
6194 }
6195 }
6196
6197
6199 }
6200 }
6201 }
6202
6204 {
6206 }
6207
6209 {
6211 {
6213
6216
6219
6220 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6221 }
6222 }
6223
6225 {
6227 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6228
6230 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6231
6233 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6234
6236 {
6238 }
6239 }
6240
6242 {
6244 }
6245
6247 {
6250 else
6252
6254 {
6257 }
6258 else
6259 {
6262
6265 }
6266
6268 }
6269
6271 {
6273 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6274 }
6275
6277 {
6279 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6281 }
6282
6284 {
6286 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6287 }
6288
6290 {
6293
6294 OverheatingParticle OP = new OverheatingParticle();
6299
6301 }
6302
6304 {
6307
6308 return -1;
6309 }
6310
6312 {
6314 {
6317
6318 for (int i = count; i > 0; --i)
6319 {
6320 int id = i - 1;
6323
6326
6327 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6328 {
6329 if (p)
6330 {
6333 }
6334 }
6335 }
6336 }
6337 }
6338
6340 {
6342 {
6344 {
6345 int id = i - 1;
6347
6348 if (OP)
6349 {
6351
6352 if (p)
6353 {
6355 }
6356
6357 delete OP;
6358 }
6359 }
6360
6363 }
6364 }
6365
6368 {
6369 return 0.0;
6370 }
6371
6372
6374 {
6375 return 250;
6376 }
6377
6379 {
6380 return 0;
6381 }
6382
6385 {
6387 return true;
6388
6389 return false;
6390 }
6391
6394 {
6397
6399 {
6401 }
6402 else
6403 {
6404
6406 }
6407
6409 }
6410
6417 {
6418 return -1;
6419 }
6420
6421
6422
6423
6425 {
6427 {
6428 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6429 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6430
6431 if (r_index >= 0)
6432 {
6433 InventoryLocation r_il = new InventoryLocation;
6434 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6435
6436 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6439 {
6440 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6441 }
6443 {
6444 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6445 }
6446
6447 }
6448
6449 player.GetHumanInventory().ClearUserReservedLocation(this);
6450 }
6451
6454 }
6455
6456
6457
6458
6460 {
6461 return ItemBase.m_DebugActionsMask;
6462 }
6463
6465 {
6466 return ItemBase.m_DebugActionsMask & mask;
6467 }
6468
6470 {
6471 ItemBase.m_DebugActionsMask = mask;
6472 }
6473
6475 {
6476 ItemBase.m_DebugActionsMask |= mask;
6477 }
6478
6480 {
6481 ItemBase.m_DebugActionsMask &= ~mask;
6482 }
6483
6485 {
6487 {
6489 }
6490 else
6491 {
6493 }
6494 }
6495
6496
6498 {
6499 if (GetEconomyProfile())
6500 {
6501 float q_max = GetEconomyProfile().GetQuantityMax();
6502 if (q_max > 0)
6503 {
6504 float q_min = GetEconomyProfile().GetQuantityMin();
6505 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6506
6508 {
6509 ComponentEnergyManager comp = GetCompEM();
6511 {
6513 }
6514 }
6516 {
6518
6519 }
6520
6521 }
6522 }
6523 }
6524
6527 {
6528 EntityAI parent = GetHierarchyParent();
6529
6530 if (parent)
6531 {
6532 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6533 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6534 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6535 }
6536 }
6537
6540 {
6541 EntityAI parent = GetHierarchyParent();
6542
6543 if (parent)
6544 {
6545 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6546 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6547 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6548 }
6549 }
6550
6552 {
6553
6554
6555
6556
6558
6560 {
6561 if (ScriptInputUserData.CanStoreInputUserData())
6562 {
6563 ScriptInputUserData ctx = new ScriptInputUserData;
6569 ctx.
Write(use_stack_max);
6572
6574 {
6575 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6576 }
6577 }
6578 }
6579 else if (!
g_Game.IsMultiplayer())
6580 {
6582 }
6583 }
6584
6586 {
6588 }
6589
6591 {
6593 }
6594
6596 {
6598 }
6599
6601 {
6602
6603 return false;
6604 }
6605
6607 {
6608 return false;
6609 }
6610
6614 {
6615 return false;
6616 }
6617
6619 {
6620 return "";
6621 }
6622
6624
6626 {
6627 return false;
6628 }
6629
6631 {
6632 return true;
6633 }
6634
6635
6636
6638 {
6639 return true;
6640 }
6641
6643 {
6644 return true;
6645 }
6646
6648 {
6649 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6651 }
6652
6654 {
6656 }
6657
6659 {
6661 if (!is_being_placed)
6663 SetSynchDirty();
6664 }
6665
6666
6668
6670 {
6672 }
6673
6675 {
6677 }
6678
6680 {
6681 return 1;
6682 }
6683
6685 {
6686 return false;
6687 }
6688
6690 {
6692 SetSynchDirty();
6693 }
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6730 {
6731 super.OnMovedInsideCargo(container);
6732
6733 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6734 }
6735
6736 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6737 {
6738 super.EEItemLocationChanged(oldLoc, newLoc);
6739
6740 PlayerBase newPlayer = null;
6741 PlayerBase oldPlayer = null;
6742
6743 if (newLoc.GetParent())
6744 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6745
6746 if (oldLoc.GetParent())
6747 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6748
6750 {
6751 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6752
6753 if (rIndex >= 0)
6754 {
6755 InventoryLocation rIl = new InventoryLocation;
6756 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6757
6758 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6761 {
6762 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6763 }
6765 {
6767 }
6768
6769 }
6770 }
6771
6773 {
6774 if (newPlayer)
6775 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6776
6777 if (newPlayer == oldPlayer)
6778 {
6779 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6780 {
6782 {
6783 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6784 {
6785 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6786 }
6787 }
6788 else
6789 {
6790 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6791 }
6792 }
6793
6794 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6795 {
6796 int type = oldLoc.GetType();
6798 {
6799 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6800 }
6802 {
6803 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6804 }
6805 }
6806 if (!m_OldLocation)
6807 {
6808 m_OldLocation = new InventoryLocation;
6809 }
6810 m_OldLocation.Copy(oldLoc);
6811 }
6812 else
6813 {
6814 if (m_OldLocation)
6815 {
6816 m_OldLocation.Reset();
6817 }
6818 }
6819
6820 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6821 }
6822 else
6823 {
6824 if (newPlayer)
6825 {
6826 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6827 if (resIndex >= 0)
6828 {
6829 InventoryLocation il = new InventoryLocation;
6830 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6832 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6835 {
6836 il.
GetParent().GetOnReleaseLock().Invoke(it);
6837 }
6839 {
6841 }
6842
6843 }
6844 }
6846 {
6847
6849 }
6850
6851 if (m_OldLocation)
6852 {
6853 m_OldLocation.Reset();
6854 }
6855 }
6856
6858 {
6859 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6860 }
6861
6863 {
6864 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6865 }
6866 }
6867
6868 override void EOnContact(IEntity other, Contact extra)
6869 {
6871 {
6872 int liquidType = -1;
6874 if (impactSpeed > 0.0)
6875 {
6877 #ifndef SERVER
6879 #else
6881 SetSynchDirty();
6882 #endif
6884 }
6885 }
6886
6887 #ifdef SERVER
6888 if (GetCompEM() && GetCompEM().IsPlugged())
6889 {
6890 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6891 GetCompEM().UnplugThis();
6892 }
6893 #endif
6894 }
6895
6897
6899 {
6901 }
6902
6904 {
6905
6906 }
6907
6909 {
6910 super.OnItemLocationChanged(old_owner, new_owner);
6911
6912 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6913 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6914
6915 if (!relatedPlayer && playerNew)
6916 relatedPlayer = playerNew;
6917
6918 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6919 {
6921 if (actionMgr)
6922 {
6923 ActionBase currentAction = actionMgr.GetRunningAction();
6924 if (currentAction)
6926 }
6927 }
6928
6929 Man ownerPlayerOld = null;
6930 Man ownerPlayerNew = null;
6931
6932 if (old_owner)
6933 {
6934 if (old_owner.
IsMan())
6935 {
6936 ownerPlayerOld = Man.Cast(old_owner);
6937 }
6938 else
6939 {
6940 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6941 }
6942 }
6943 else
6944 {
6946 {
6948
6949 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6950 {
6951 GetCompEM().UnplugThis();
6952 }
6953 }
6954 }
6955
6956 if (new_owner)
6957 {
6958 if (new_owner.
IsMan())
6959 {
6960 ownerPlayerNew = Man.Cast(new_owner);
6961 }
6962 else
6963 {
6964 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6965 }
6966 }
6967
6968 if (ownerPlayerOld != ownerPlayerNew)
6969 {
6970 if (ownerPlayerOld)
6971 {
6972 array<EntityAI> subItemsExit = new array<EntityAI>;
6974 for (int i = 0; i < subItemsExit.Count(); i++)
6975 {
6978 }
6979 }
6980
6981 if (ownerPlayerNew)
6982 {
6983 array<EntityAI> subItemsEnter = new array<EntityAI>;
6985 for (int j = 0; j < subItemsEnter.Count(); j++)
6986 {
6989 }
6990 }
6991 }
6992 else if (ownerPlayerNew != null)
6993 {
6994 PlayerBase nplayer;
6995 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6996 {
6997 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6999 for (int k = 0; k < subItemsUpdate.Count(); k++)
7000 {
7002 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
7003 }
7004 }
7005 }
7006
7007 if (old_owner)
7008 old_owner.OnChildItemRemoved(this);
7009 if (new_owner)
7010 new_owner.OnChildItemReceived(this);
7011 }
7012
7013
7015 {
7016 super.EEDelete(parent);
7017 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
7018 if (player)
7019 {
7021
7022 if (player.IsAlive())
7023 {
7024 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
7025 if (r_index >= 0)
7026 {
7027 InventoryLocation r_il = new InventoryLocation;
7028 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
7029
7030 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
7033 {
7034 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
7035 }
7037 {
7038 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
7039 }
7040
7041 }
7042
7043 player.RemoveQuickBarEntityShortcut(this);
7044 }
7045 }
7046 }
7047
7049 {
7050 super.EEKilled(killer);
7051
7054 {
7055 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
7056 {
7057 if (IsMagazine())
7058 {
7059 if (Magazine.Cast(this).GetAmmoCount() > 0)
7060 {
7062 }
7063 }
7064 else
7065 {
7067 }
7068 }
7069 }
7070 }
7071
7073 {
7074 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
7075
7076 super.OnWasAttached(parent, slot_id);
7077
7080
7083 }
7084
7086 {
7087 super.OnWasDetached(parent, slot_id);
7088
7091
7094 }
7095
7097 {
7098 int idx;
7101
7102 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7103 if (inventory_slots.Count() < 1)
7104 {
7105 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7106 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7107 }
7108 else
7109 {
7110 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7111 }
7112
7113 idx = inventory_slots.Find(slot);
7114 if (idx < 0)
7115 return "";
7116
7117 return attach_types.Get(idx);
7118 }
7119
7121 {
7122 int idx = -1;
7123 string slot;
7124
7127
7128 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7129 if (inventory_slots.Count() < 1)
7130 {
7131 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7132 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7133 }
7134 else
7135 {
7136 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7137 if (detach_types.Count() < 1)
7138 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7139 }
7140
7141 for (int i = 0; i < inventory_slots.Count(); i++)
7142 {
7143 slot = inventory_slots.Get(i);
7144 }
7145
7146 if (slot != "")
7147 {
7148 if (detach_types.Count() == 1)
7149 idx = 0;
7150 else
7151 idx = inventory_slots.Find(slot);
7152 }
7153 if (idx < 0)
7154 return "";
7155
7156 return detach_types.Get(idx);
7157 }
7158
7160 {
7161
7163
7164
7165 float min_time = 1;
7166 float max_time = 3;
7167 float delay = Math.RandomFloat(min_time, max_time);
7168
7169 explode_timer.Run(delay, this, "DoAmmoExplosion");
7170 }
7171
7173 {
7174 Magazine magazine = Magazine.Cast(this);
7175 int pop_sounds_count = 6;
7176 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7177
7178
7179 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7180 string sound_name = pop_sounds[ sound_idx ];
7181 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7182
7183
7184 magazine.ServerAddAmmoCount(-1);
7185
7186
7187 float min_temp_to_explode = 100;
7188
7189 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7190 {
7192 }
7193 }
7194
7195
7196 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7197 {
7198 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7199
7200 const int CHANCE_DAMAGE_CARGO = 4;
7201 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7202 const int CHANCE_DAMAGE_NOTHING = 2;
7203
7205 {
7206 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7207 int chances;
7208 int rnd;
7209
7210 if (GetInventory().GetCargo())
7211 {
7212 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7213 rnd = Math.RandomInt(0,chances);
7214
7215 if (rnd < CHANCE_DAMAGE_CARGO)
7216 {
7218 }
7219 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7220 {
7222 }
7223 }
7224 else
7225 {
7226 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7227 rnd = Math.RandomInt(0,chances);
7228
7229 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7230 {
7232 }
7233 }
7234 }
7235 }
7236
7238 {
7239 CargoBase cargo = GetInventory().GetCargo();
7240 if (cargo)
7241 {
7243 if (item_count > 0)
7244 {
7245 int random_pick = Math.RandomInt(0, item_count);
7247 if (!item.IsExplosive())
7248 {
7249 item.AddHealth("","",damage);
7250 return true;
7251 }
7252 }
7253 }
7254 return false;
7255 }
7256
7258 {
7259 GameInventory inventory = GetInventory();
7261 if (attachment_count > 0)
7262 {
7263 int random_pick = Math.RandomInt(0, attachment_count);
7265 if (!attachment.IsExplosive())
7266 {
7267 attachment.AddHealth("","",damage);
7268 return true;
7269 }
7270 }
7271 return false;
7272 }
7273
7275 {
7277 }
7278
7280 {
7282 return GetInventory().CanRemoveEntity();
7283
7284 return false;
7285 }
7286
7288 {
7289
7291 return false;
7292
7293
7295 return false;
7296
7297
7298
7300 if (delta == 0)
7301 return false;
7302
7303
7304 return true;
7305 }
7306
7308 {
7310 {
7311 if (ScriptInputUserData.CanStoreInputUserData())
7312 {
7313 ScriptInputUserData ctx = new ScriptInputUserData;
7318 ctx.
Write(destination_entity);
7322 }
7323 }
7324 else if (!
g_Game.IsMultiplayer())
7325 {
7327 }
7328 }
7329
7331 {
7332 float split_quantity_new;
7336 InventoryLocation loc = new InventoryLocation;
7337
7338 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7339 {
7341 split_quantity_new = stack_max;
7342 else
7344
7346 {
7347 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7348 if (new_item)
7349 {
7350 new_item.SetResultOfSplit(true);
7351 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7353 new_item.
SetQuantity(split_quantity_new,
false,
true);
7354 }
7355 }
7356 }
7357 else if (destination_entity && slot_id == -1)
7358 {
7359 if (quantity > stack_max)
7360 split_quantity_new = stack_max;
7361 else
7362 split_quantity_new = quantity;
7363
7365 {
7366 GameInventory destinationInventory = destination_entity.GetInventory();
7368 {
7371 }
7372
7373 if (new_item)
7374 {
7375 new_item.SetResultOfSplit(true);
7376 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7378 new_item.
SetQuantity(split_quantity_new,
false,
true);
7379 }
7380 }
7381 }
7382 else
7383 {
7384 if (stack_max != 0)
7385 {
7387 {
7389 }
7390
7391 if (split_quantity_new == 0)
7392 {
7393 if (!
g_Game.IsMultiplayer())
7394 player.PhysicalPredictiveDropItem(this);
7395 else
7396 player.ServerDropEntity(this);
7397 return;
7398 }
7399
7401 {
7403
7404 if (new_item)
7405 {
7406 new_item.SetResultOfSplit(true);
7407 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7410 new_item.PlaceOnSurface();
7411 }
7412 }
7413 }
7414 }
7415 }
7416
7418 {
7419 float split_quantity_new;
7423 InventoryLocation loc = new InventoryLocation;
7424
7425 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7426 {
7428 split_quantity_new = stack_max;
7429 else
7431
7433 {
7434 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7435 if (new_item)
7436 {
7437 new_item.SetResultOfSplit(true);
7438 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7440 new_item.
SetQuantity(split_quantity_new,
false,
true);
7441 }
7442 }
7443 }
7444 else if (destination_entity && slot_id == -1)
7445 {
7446 if (quantity > stack_max)
7447 split_quantity_new = stack_max;
7448 else
7449 split_quantity_new = quantity;
7450
7452 {
7453 GameInventory destinationInventory = destination_entity.GetInventory();
7455 {
7458 }
7459
7460 if (new_item)
7461 {
7462 new_item.SetResultOfSplit(true);
7463 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7465 new_item.
SetQuantity(split_quantity_new,
false,
true);
7466 }
7467 }
7468 }
7469 else
7470 {
7471 if (stack_max != 0)
7472 {
7474 {
7476 }
7477
7479 {
7481
7482 if (new_item)
7483 {
7484 new_item.SetResultOfSplit(true);
7485 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7488 new_item.PlaceOnSurface();
7489 }
7490 }
7491 }
7492 }
7493 }
7494
7496 {
7498 {
7499 if (ScriptInputUserData.CanStoreInputUserData())
7500 {
7501 ScriptInputUserData ctx = new ScriptInputUserData;
7506 dst.WriteToContext(ctx);
7508 }
7509 }
7510 else if (!
g_Game.IsMultiplayer())
7511 {
7513 }
7514 }
7515
7517 {
7519 {
7520 if (ScriptInputUserData.CanStoreInputUserData())
7521 {
7522 ScriptInputUserData ctx = new ScriptInputUserData;
7527 ctx.
Write(destination_entity);
7533 }
7534 }
7535 else if (!
g_Game.IsMultiplayer())
7536 {
7538 }
7539 }
7540
7542 {
7544 }
7545
7547 {
7549 float split_quantity_new;
7551 if (dst.IsValid())
7552 {
7553 int slot_id = dst.GetSlot();
7555
7556 if (quantity > stack_max)
7557 split_quantity_new = stack_max;
7558 else
7559 split_quantity_new = quantity;
7560
7562 {
7564
7565 if (new_item)
7566 {
7567 new_item.SetResultOfSplit(true);
7568 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7570 new_item.
SetQuantity(split_quantity_new,
false,
true);
7571 }
7572
7573 return new_item;
7574 }
7575 }
7576
7577 return null;
7578 }
7579
7581 {
7583 float split_quantity_new;
7585 if (destination_entity)
7586 {
7588 if (quantity > stackable)
7589 split_quantity_new = stackable;
7590 else
7591 split_quantity_new = quantity;
7592
7594 {
7595 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7596 if (new_item)
7597 {
7598 new_item.SetResultOfSplit(true);
7599 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7601 new_item.
SetQuantity(split_quantity_new,
false,
true);
7602 }
7603 }
7604 }
7605 }
7606
7608 {
7610 {
7611 if (ScriptInputUserData.CanStoreInputUserData())
7612 {
7613 ScriptInputUserData ctx = new ScriptInputUserData;
7618 ItemBase destination_entity =
this;
7619 ctx.
Write(destination_entity);
7623 }
7624 }
7625 else if (!
g_Game.IsMultiplayer())
7626 {
7628 }
7629 }
7630
7632 {
7634 float split_quantity_new;
7636 if (player)
7637 {
7639 if (quantity > stackable)
7640 split_quantity_new = stackable;
7641 else
7642 split_quantity_new = quantity;
7643
7645 {
7646 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7647 new_item =
ItemBase.Cast(in_hands);
7648 if (new_item)
7649 {
7650 new_item.SetResultOfSplit(true);
7651 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7653 new_item.SetQuantity(split_quantity_new, false, true);
7654 }
7655 }
7656 }
7657 }
7658
7660 {
7662 float split_quantity_new = Math.Floor(quantity * 0.5);
7663
7665 return;
7666
7668
7669 if (new_item)
7670 {
7671 if (new_item.GetQuantityMax() < split_quantity_new)
7672 {
7673 split_quantity_new = new_item.GetQuantityMax();
7674 }
7675
7676 new_item.SetResultOfSplit(true);
7677 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7678
7680 {
7683 }
7684 else
7685 {
7687 new_item.
SetQuantity(split_quantity_new,
false,
true);
7688 }
7689 }
7690 }
7691
7693 {
7695 float split_quantity_new = Math.Floor(quantity / 2);
7696
7698 return;
7699
7700 InventoryLocation invloc = new InventoryLocation;
7702
7704 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7705
7706 if (new_item)
7707 {
7708 if (new_item.GetQuantityMax() < split_quantity_new)
7709 {
7710 split_quantity_new = new_item.GetQuantityMax();
7711 }
7713 {
7716 }
7717 else if (split_quantity_new > 1)
7718 {
7720 new_item.
SetQuantity(split_quantity_new,
false,
true);
7721 }
7722 }
7723 }
7724
7727 {
7728 SetWeightDirty();
7730
7731 if (parent)
7732 parent.OnAttachmentQuantityChangedEx(this, delta);
7733
7735 {
7737 {
7739 }
7741 {
7742 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7744 }
7745 }
7746 }
7747
7750 {
7751
7752 }
7753
7756 {
7758 }
7759
7761 {
7762 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7763
7765 {
7766 if (newLevel == GameConstants.STATE_RUINED)
7767 {
7769 EntityAI parent = GetHierarchyParent();
7770 if (parent && parent.IsFireplace())
7771 {
7772 CargoBase cargo = GetInventory().GetCargo();
7773 if (cargo)
7774 {
7776 {
7778 }
7779 }
7780 }
7781 }
7782
7784 {
7785
7787 return;
7788 }
7789
7790 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7791 {
7793 }
7794 }
7795 }
7796
7797
7799 {
7800 super.OnRightClick();
7801
7803 {
7805 {
7806 if (ScriptInputUserData.CanStoreInputUserData())
7807 {
7808 EntityAI root = GetHierarchyRoot();
7809 Man playerOwner = GetHierarchyRootPlayer();
7810 InventoryLocation dst = new InventoryLocation;
7811
7812
7813 if (!playerOwner && root && root == this)
7814 {
7816 }
7817 else
7818 {
7819
7820 GetInventory().GetCurrentInventoryLocation(dst);
7822 {
7823 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7825 {
7827 }
7828 else
7829 {
7831
7832
7833 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7834 {
7836 }
7837 else
7838 {
7839 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7840 }
7841 }
7842 }
7843 }
7844
7845 ScriptInputUserData ctx = new ScriptInputUserData;
7853 }
7854 }
7855 else if (!
g_Game.IsMultiplayer())
7856 {
7858 }
7859 }
7860 }
7861
7863 {
7864 if (root)
7865 {
7866 vector m4[4];
7867 root.GetTransform(m4);
7868 dst.SetGround(this, m4);
7869 }
7870 else
7871 {
7872 GetInventory().GetCurrentInventoryLocation(dst);
7873 }
7874 }
7875
7876 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7877 {
7878
7879 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7880 return false;
7881
7882 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7883 return false;
7884
7885
7887 return false;
7888
7889
7890 Magazine mag = Magazine.Cast(this);
7891 if (mag)
7892 {
7893 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7894 return false;
7895
7896 if (stack_max_limit)
7897 {
7898 Magazine other_mag = Magazine.Cast(other_item);
7899 if (other_item)
7900 {
7901 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7902 return false;
7903 }
7904
7905 }
7906 }
7907 else
7908 {
7909
7911 return false;
7912
7914 return false;
7915 }
7916
7917 PlayerBase player = null;
7918 if (CastTo(player, GetHierarchyRootPlayer()))
7919 {
7920 if (player.GetInventory().HasAttachment(this))
7921 return false;
7922
7923 if (player.IsItemsToDelete())
7924 return false;
7925 }
7926
7927 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7928 return false;
7929
7930 int slotID;
7932 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7933 return false;
7934
7935 return true;
7936 }
7937
7939 {
7941 }
7942
7944 {
7945 return m_IsResultOfSplit;
7946 }
7947
7949 {
7950 m_IsResultOfSplit = value;
7951 }
7952
7954 {
7956 }
7957
7959 {
7960 float other_item_quantity = other_item.GetQuantity();
7961 float this_free_space;
7962
7964
7966
7967 if (other_item_quantity > this_free_space)
7968 {
7969 return this_free_space;
7970 }
7971 else
7972 {
7973 return other_item_quantity;
7974 }
7975 }
7976
7978 {
7980 }
7981
7983 {
7985 return;
7986
7987 if (!IsMagazine() && other_item)
7988 {
7990 if (quantity_used != 0)
7991 {
7992 float hp1 = GetHealth01("","");
7993 float hp2 = other_item.GetHealth01("","");
7994 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7995 hpResult = hpResult / (
GetQuantity() + quantity_used);
7996
7997 hpResult *= GetMaxHealth();
7998 Math.Round(hpResult);
7999 SetHealth("", "Health", hpResult);
8000
8002 other_item.AddQuantity(-quantity_used);
8003 }
8004 }
8006 }
8007
8009 {
8010 #ifdef SERVER
8011 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
8012 GetHierarchyParent().IncreaseLifetimeUp();
8013 #endif
8014 };
8015
8017 {
8018 PlayerBase p = PlayerBase.Cast(player);
8019
8020 array<int> recipesIds = p.m_Recipes;
8021 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8022 if (moduleRecipesManager)
8023 {
8024 EntityAI itemInHands = player.GetEntityInHands();
8025 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
8026 }
8027
8028 for (int i = 0;i < recipesIds.Count(); i++)
8029 {
8030 int key = recipesIds.Get(i);
8031 string recipeName = moduleRecipesManager.GetRecipeName(key);
8033 }
8034 }
8035
8036
8037 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8038 {
8039 super.GetDebugActions(outputList);
8040
8041
8047
8048
8053
8058
8059
8063
8064
8066 {
8070 }
8071
8074
8075
8079
8081
8082 InventoryLocation loc = new InventoryLocation();
8083 GetInventory().GetCurrentInventoryLocation(loc);
8085 {
8086 if (Gizmo_IsSupported())
8089 }
8090
8092 }
8093
8094
8095
8096
8098 {
8099 super.OnAction(action_id, player, ctx);
8100
8102 {
8103 switch (action_id)
8104 {
8108 return true;
8112 return true;
8113 }
8114 }
8115
8117 {
8118 switch (action_id)
8119 {
8121 Delete();
8122 return true;
8123 }
8124 }
8125
8126 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8127 {
8128 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8129 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8130 PlayerBase p = PlayerBase.Cast(player);
8131 if (
EActions.RECIPES_RANGE_START < 1000)
8132 {
8133 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8134 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8135 }
8136 }
8137 #ifndef SERVER
8138 else if (action_id ==
EActions.WATCH_PLAYER)
8139 {
8140 PluginDeveloper.SetDeveloperItemClientEx(player);
8141 }
8142 #endif
8144 {
8145 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8146 {
8147 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8148 OnDebugButtonPressServer(id + 1);
8149 }
8150
8151 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8152 {
8153 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8155 }
8156
8157 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8158 {
8159 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8161 }
8162
8163 else if (action_id ==
EActions.ADD_QUANTITY)
8164 {
8165 if (IsMagazine())
8166 {
8167 Magazine mag = Magazine.Cast(this);
8168 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8169 }
8170 else
8171 {
8173 }
8174
8175 if (m_EM)
8176 {
8177 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8178 }
8179
8180 }
8181
8182 else if (action_id ==
EActions.REMOVE_QUANTITY)
8183 {
8184 if (IsMagazine())
8185 {
8186 Magazine mag2 = Magazine.Cast(this);
8187 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8188 }
8189 else
8190 {
8192 }
8193 if (m_EM)
8194 {
8195 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8196 }
8197
8198 }
8199
8200 else if (action_id ==
EActions.SET_QUANTITY_0)
8201 {
8203
8204 if (m_EM)
8205 {
8206 m_EM.SetEnergy(0);
8207 }
8208 }
8209
8210 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8211 {
8213
8214 if (m_EM)
8215 {
8216 m_EM.SetEnergy(m_EM.GetEnergyMax());
8217 }
8218 }
8219
8220 else if (action_id ==
EActions.ADD_HEALTH)
8221 {
8222 AddHealth("","",GetMaxHealth("","Health")/5);
8223 }
8224 else if (action_id ==
EActions.REMOVE_HEALTH)
8225 {
8226 AddHealth("","",-GetMaxHealth("","Health")/5);
8227 }
8228 else if (action_id ==
EActions.DESTROY_HEALTH)
8229 {
8230 SetHealth01("","",0);
8231 }
8232 else if (action_id ==
EActions.WATCH_ITEM)
8233 {
8235 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8236 #ifdef DEVELOPER
8237 SetDebugDeveloper_item(this);
8238 #endif
8239 }
8240
8241 else if (action_id ==
EActions.ADD_TEMPERATURE)
8242 {
8243 AddTemperature(20);
8244
8245 }
8246
8247 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8248 {
8249 AddTemperature(-20);
8250
8251 }
8252
8253 else if (action_id ==
EActions.FLIP_FROZEN)
8254 {
8255 SetFrozen(!GetIsFrozen());
8256
8257 }
8258
8259 else if (action_id ==
EActions.ADD_WETNESS)
8260 {
8262
8263 }
8264
8265 else if (action_id ==
EActions.REMOVE_WETNESS)
8266 {
8268
8269 }
8270
8271 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8272 {
8275
8276
8277 }
8278
8279 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8280 {
8283 }
8284
8285 else if (action_id ==
EActions.MAKE_SPECIAL)
8286 {
8287 auto debugParams = DebugSpawnParams.WithPlayer(player);
8288 OnDebugSpawnEx(debugParams);
8289 }
8290
8291 }
8292
8293
8294 return false;
8295 }
8296
8297
8298
8299
8303
8306
8307
8308
8310 {
8311 return false;
8312 }
8313
8314
8316 {
8317 return true;
8318 }
8319
8320
8322 {
8323 return true;
8324 }
8325
8326
8327
8329 {
8330 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8331 return g_Game.ConfigIsExisting(config_path);
8332 }
8333
8336 {
8337 return null;
8338 }
8339
8341 {
8342 return false;
8343 }
8344
8346 {
8347 return false;
8348 }
8349
8353
8354
8356 {
8357 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8358 return module_repairing.CanRepair(this, item_repair_kit);
8359 }
8360
8361
8362 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8363 {
8364 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8365 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8366 }
8367
8368
8370 {
8371
8372
8373
8374
8375
8376
8377
8378
8379 return 1;
8380 }
8381
8382
8383
8385 {
8387 }
8388
8389
8390
8392 {
8394 }
8395
8396
8405 {
8406 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8407
8408 if (player)
8409 {
8410 player.MessageStatus(text);
8411 }
8412 }
8413
8414
8423 {
8424 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8425
8426 if (player)
8427 {
8428 player.MessageAction(text);
8429 }
8430 }
8431
8432
8441 {
8442 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8443
8444 if (player)
8445 {
8446 player.MessageFriendly(text);
8447 }
8448 }
8449
8450
8459 {
8460 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8461
8462 if (player)
8463 {
8464 player.MessageImportant(text);
8465 }
8466 }
8467
8469 {
8470 return true;
8471 }
8472
8473
8474 override bool KindOf(
string tag)
8475 {
8476 bool found = false;
8477 string item_name = this.
GetType();
8479 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8480
8481 int array_size = item_tag_array.Count();
8482 for (int i = 0; i < array_size; i++)
8483 {
8484 if (item_tag_array.Get(i) == tag)
8485 {
8486 found = true;
8487 break;
8488 }
8489 }
8490 return found;
8491 }
8492
8493
8495 {
8496
8497 super.OnRPC(sender, rpc_type,ctx);
8498
8499
8500 switch (rpc_type)
8501 {
8502 #ifndef SERVER
8503 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8504 Param2<bool, string> p = new Param2<bool, string>(false, "");
8505
8507 return;
8508
8509 bool play = p.param1;
8510 string soundSet = p.param2;
8511
8512 if (play)
8513 {
8515 {
8517 {
8519 }
8520 }
8521 else
8522 {
8524 }
8525 }
8526 else
8527 {
8529 }
8530
8531 break;
8532 #endif
8533
8534 }
8535
8537 {
8539 }
8540 }
8541
8542
8543
8544
8546 {
8547 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8548 return plugin.GetID(
name);
8549 }
8550
8552 {
8553 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8554 return plugin.GetName(id);
8555 }
8556
8559 {
8560
8561
8562 int varFlags;
8563 if (!ctx.
Read(varFlags))
8564 return;
8565
8566 if (varFlags & ItemVariableFlags.FLOAT)
8567 {
8569 }
8570 }
8571
8573 {
8574
8575 super.SerializeNumericalVars(floats_out);
8576
8577
8578
8580 {
8582 }
8583
8585 {
8587 }
8588
8590 {
8592 }
8593
8595 {
8600 }
8601
8603 {
8605 }
8606 }
8607
8609 {
8610
8611 super.DeSerializeNumericalVars(floats);
8612
8613
8614 int index = 0;
8615 int mask = Math.Round(floats.Get(index));
8616
8617 index++;
8618
8620 {
8622 {
8624 }
8625 else
8626 {
8627 float quantity = floats.Get(index);
8629 }
8630 index++;
8631 }
8632
8634 {
8635 float wet = floats.Get(index);
8637 index++;
8638 }
8639
8641 {
8642 int liquidtype = Math.Round(floats.Get(index));
8644 index++;
8645 }
8646
8648 {
8650 index++;
8652 index++;
8654 index++;
8656 index++;
8657 }
8658
8660 {
8661 int cleanness = Math.Round(floats.Get(index));
8663 index++;
8664 }
8665 }
8666
8668 {
8669 super.WriteVarsToCTX(ctx);
8670
8671
8673 {
8675 }
8676
8678 {
8680 }
8681
8683 {
8685 }
8686
8688 {
8689 int r,g,b,a;
8695 }
8696
8698 {
8700 }
8701 }
8702
8704 {
8705 if (!super.ReadVarsFromCTX(ctx,version))
8706 return false;
8707
8708 int intValue;
8709 float value;
8710
8711 if (version < 140)
8712 {
8713 if (!ctx.
Read(intValue))
8714 return false;
8715
8716 m_VariablesMask = intValue;
8717 }
8718
8720 {
8721 if (!ctx.
Read(value))
8722 return false;
8723
8725 {
8727 }
8728 else
8729 {
8731 }
8732 }
8733
8734 if (version < 140)
8735 {
8737 {
8738 if (!ctx.
Read(value))
8739 return false;
8740 SetTemperatureDirect(value);
8741 }
8742 }
8743
8745 {
8746 if (!ctx.
Read(value))
8747 return false;
8749 }
8750
8752 {
8753 if (!ctx.
Read(intValue))
8754 return false;
8756 }
8757
8759 {
8760 int r,g,b,a;
8762 return false;
8764 return false;
8766 return false;
8768 return false;
8769
8771 }
8772
8774 {
8775 if (!ctx.
Read(intValue))
8776 return false;
8778 }
8779
8780 if (version >= 138 && version < 140)
8781 {
8783 {
8784 if (!ctx.
Read(intValue))
8785 return false;
8786 SetFrozen(intValue);
8787 }
8788 }
8789
8790 return true;
8791 }
8792
8793
8795 {
8798 {
8800 }
8801
8802 if (!super.OnStoreLoad(ctx, version))
8803 {
8805 return false;
8806 }
8807
8808 if (version >= 114)
8809 {
8810 bool hasQuickBarIndexSaved;
8811
8812 if (!ctx.
Read(hasQuickBarIndexSaved))
8813 {
8815 return false;
8816 }
8817
8818 if (hasQuickBarIndexSaved)
8819 {
8820 int itmQBIndex;
8821
8822
8823 if (!ctx.
Read(itmQBIndex))
8824 {
8826 return false;
8827 }
8828
8829 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8830 if (itmQBIndex != -1 && parentPlayer)
8831 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8832 }
8833 }
8834 else
8835 {
8836
8837 PlayerBase player;
8838 int itemQBIndex;
8839 if (version ==
int.
MAX)
8840 {
8841 if (!ctx.
Read(itemQBIndex))
8842 {
8844 return false;
8845 }
8846 }
8847 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8848 {
8849
8850 if (!ctx.
Read(itemQBIndex))
8851 {
8853 return false;
8854 }
8855 if (itemQBIndex != -1 && player)
8856 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8857 }
8858 }
8859
8860 if (version < 140)
8861 {
8862
8863 if (!LoadVariables(ctx, version))
8864 {
8866 return false;
8867 }
8868 }
8869
8870
8872 {
8874 return false;
8875 }
8876 if (version >= 132)
8877 {
8879 if (raib)
8880 {
8882 {
8884 return false;
8885 }
8886 }
8887 }
8888
8890 return true;
8891 }
8892
8893
8894
8896 {
8897 super.OnStoreSave(ctx);
8898
8899 PlayerBase player;
8900 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8901 {
8903
8904 int itemQBIndex = -1;
8905 itemQBIndex = player.FindQuickBarEntityIndex(this);
8906 ctx.
Write(itemQBIndex);
8907 }
8908 else
8909 {
8911 }
8912
8914
8916 if (raib)
8917 {
8919 }
8920 }
8921
8922
8924 {
8925 super.AfterStoreLoad();
8926
8928 {
8930 }
8931
8933 {
8936 }
8937 }
8938
8940 {
8941 super.EEOnAfterLoad();
8942
8944 {
8946 }
8947
8950 }
8951
8953 {
8954 return false;
8955 }
8956
8957
8958
8960 {
8962 {
8963 #ifdef PLATFORM_CONSOLE
8964
8966 {
8968 if (menu)
8969 {
8971 }
8972 }
8973 #endif
8974 }
8975
8977 {
8980 }
8981
8983 {
8984 SetWeightDirty();
8986 }
8988 {
8991 }
8992
8994 {
8997
9000 }
9002 {
9006 }
9007
9008 super.OnVariablesSynchronized();
9009 }
9010
9011
9012
9014 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
9015 {
9016 if (!IsServerCheck(allow_client))
9017 return false;
9018
9020 return false;
9021
9024
9025 if (value <= (min + 0.001))
9026 value = min;
9027
9028 if (value == min)
9029 {
9030 if (destroy_config)
9031 {
9032 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
9033 if (dstr)
9034 {
9036 this.Delete();
9037 return true;
9038 }
9039 }
9040 else if (destroy_forced)
9041 {
9043 this.Delete();
9044 return true;
9045 }
9046
9048 }
9049
9052
9054 {
9055 EntityAI parent = GetHierarchyRoot();
9056 InventoryLocation iLoc = new InventoryLocation();
9057 GetInventory().GetCurrentInventoryLocation(iLoc);
9059 {
9060 int iLocSlot = iLoc.
GetSlot();
9062 {
9064 }
9066 {
9068 }
9069 }
9070 }
9071
9073 {
9075
9076 if (delta)
9078 }
9079
9081
9082 return false;
9083 }
9084
9085
9087 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9088 {
9090 }
9091
9093 {
9096 }
9097
9099 {
9102 }
9103
9105 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9106 {
9107 float value_clamped = Math.Clamp(value, 0, 1);
9109 SetQuantity(result, destroy_config, destroy_forced);
9110 }
9111
9112
9115 {
9117 }
9118
9120 {
9122 }
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9134 {
9135 int slot = -1;
9136 GameInventory inventory = GetInventory();
9137 if (inventory)
9138 {
9139 InventoryLocation il = new InventoryLocation;
9142 }
9143
9145 }
9146
9148 {
9149 float quantity_max = 0;
9150
9152 {
9153 if (attSlotID != -1)
9154 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9155
9156 if (quantity_max <= 0)
9158 }
9159
9160 if (quantity_max <= 0)
9162
9163 return quantity_max;
9164 }
9165
9167 {
9169 }
9170
9172 {
9174 }
9175
9176
9178 {
9180 }
9181
9183 {
9185 }
9186
9188 {
9190 }
9191
9192
9194 {
9195
9196 float weightEx = GetWeightEx();
9197 float special = GetInventoryAndCargoWeight();
9198 return weightEx - special;
9199 }
9200
9201
9203 {
9205 }
9206
9208 {
9210 {
9211 #ifdef DEVELOPER
9212 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9213 {
9214 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9216 }
9217 #endif
9218
9220 }
9221 else if (HasEnergyManager())
9222 {
9223 #ifdef DEVELOPER
9224 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9225 {
9226 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9227 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9228 }
9229 #endif
9230 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9231 }
9232 else
9233 {
9234 #ifdef DEVELOPER
9235 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9236 {
9237 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9238 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9239 }
9240 #endif
9241 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9242 }
9243 }
9244
9247 {
9248 int item_count = 0;
9250
9251 GameInventory inventory = GetInventory();
9252 CargoBase cargo = inventory.
GetCargo();
9253 if (cargo != NULL)
9254 {
9256 }
9257
9259 for (int i = 0; i < nAttachments; ++i)
9260 {
9262 if (item)
9263 item_count += item.GetNumberOfItems();
9264 }
9265 return item_count;
9266 }
9267
9270 {
9271 float weight = 0;
9272 float wetness = 1;
9273 if (include_wetness)
9276 {
9277 weight = wetness * m_ConfigWeight;
9278 }
9280 {
9281 weight = 1;
9282 }
9283 return weight;
9284 }
9285
9286
9287
9289 {
9290 GameInventory inventory = GetInventory();
9291 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9292 {
9293 array<EntityAI> items = new array<EntityAI>;
9295 for (int i = 0; i < items.Count(); ++i)
9296 {
9298 if (item)
9299 {
9300 g_Game.ObjectDelete(item);
9301 }
9302 }
9303 }
9304 }
9305
9306
9307
9308
9310 {
9311 float energy = 0;
9312 if (HasEnergyManager())
9313 {
9314 energy = GetCompEM().GetEnergy();
9315 }
9316 return energy;
9317 }
9318
9319
9321 {
9322 super.OnEnergyConsumed();
9323
9325 }
9326
9328 {
9329 super.OnEnergyAdded();
9330
9332 }
9333
9334
9336 {
9337 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9338 {
9340 {
9341 float energy_0to1 = GetCompEM().GetEnergy0To1();
9343 }
9344 }
9345 }
9346
9347
9349 {
9350 return ConfigGetFloat("heatIsolation");
9351 }
9352
9354 {
9356 }
9357
9359 {
9360 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9361 if (
g_Game.ConfigIsExisting(paramPath))
9362 return g_Game.ConfigGetFloat(paramPath);
9363
9364 return 0.0;
9365 }
9366
9368 {
9369 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9370 if (
g_Game.ConfigIsExisting(paramPath))
9371 return g_Game.ConfigGetFloat(paramPath);
9372
9373 return 0.0;
9374 }
9375
9376 override void SetWet(
float value,
bool allow_client =
false)
9377 {
9378 if (!IsServerCheck(allow_client))
9379 return;
9380
9383
9385
9386 m_VarWet = Math.Clamp(value, min, max);
9387
9389 {
9392 }
9393 }
9394
9395 override void AddWet(
float value)
9396 {
9398 }
9399
9401 {
9403 }
9404
9406 {
9408 }
9409
9411 {
9413 }
9414
9416 {
9418 }
9419
9421 {
9423 }
9424
9426 {
9429 if (newLevel != oldLevel)
9430 {
9432 }
9433 }
9434
9436 {
9437 SetWeightDirty();
9438 }
9439
9441 {
9442 return GetWetLevelInternal(
m_VarWet);
9443 }
9444
9445
9446
9448 {
9450 }
9451
9453 {
9455 }
9456
9458 {
9460 }
9461
9463 {
9465 }
9466
9467
9468
9470 {
9471 if (ConfigIsExisting("itemModelLength"))
9472 {
9473 return ConfigGetFloat("itemModelLength");
9474 }
9475 return 0;
9476 }
9477
9479 {
9480 if (ConfigIsExisting("itemAttachOffset"))
9481 {
9482 return ConfigGetFloat("itemAttachOffset");
9483 }
9484 return 0;
9485 }
9486
9487 override void SetCleanness(
int value,
bool allow_client =
false)
9488 {
9489 if (!IsServerCheck(allow_client))
9490 return;
9491
9493
9495
9498 }
9499
9501 {
9503 }
9504
9506 {
9507 return true;
9508 }
9509
9510
9511
9512
9514 {
9516 }
9517
9519 {
9521 }
9522
9523
9524
9525
9526 override void SetColor(
int r,
int g,
int b,
int a)
9527 {
9533 }
9535 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9536 {
9541 }
9542
9544 {
9546 }
9547
9550 {
9551 int r,g,b,a;
9553 r = r/255;
9554 g = g/255;
9555 b = b/255;
9556 a = a/255;
9557 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9558 }
9559
9560
9561
9562 override void SetLiquidType(
int value,
bool allow_client =
false)
9563 {
9564 if (!IsServerCheck(allow_client))
9565 return;
9566
9571 }
9572
9574 {
9575 return ConfigGetInt("varLiquidTypeInit");
9576 }
9577
9579 {
9581 }
9582
9584 {
9586 SetFrozen(false);
9587 }
9588
9591 {
9592 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9593 }
9594
9595
9598 {
9599 PlayerBase nplayer;
9600 if (PlayerBase.CastTo(nplayer, player))
9601 {
9603 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9604 }
9605 }
9606
9607
9610 {
9611 PlayerBase nplayer;
9612 if (PlayerBase.CastTo(nplayer,player))
9613 {
9614 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9615 }
9616
9617 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9618
9619 if (HasEnergyManager())
9620 {
9621 GetCompEM().UpdatePlugState();
9622 }
9623 }
9624
9625
9627 {
9628 super.OnPlacementStarted(player);
9629
9631 }
9632
9633 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9634 {
9636 {
9637 m_AdminLog.OnPlacementComplete(player,
this);
9638 }
9639
9640 super.OnPlacementComplete(player, position, orientation);
9641 }
9642
9643
9644
9645
9646
9648 {
9650 {
9651 return true;
9652 }
9653 else
9654 {
9655 return false;
9656 }
9657 }
9658
9659
9661 {
9663 {
9665 }
9666 }
9667
9668
9670 {
9672 }
9673
9675 {
9677 }
9678
9679 override void InsertAgent(
int agent,
float count = 1)
9680 {
9681 if (count < 1)
9682 return;
9683
9685 }
9686
9689 {
9691 }
9692
9693
9695 {
9697 }
9698
9699
9700
9701
9702
9703
9704
9705
9706
9707
9708
9709
9710
9711
9712
9713
9714
9715
9716
9717
9718
9719
9720
9721
9722
9723
9724
9725
9726
9727
9728
9729
9730
9731
9732
9733
9734
9735
9736
9737
9738
9739
9741 {
9743 return false;
9744 return true;
9745 }
9746
9748 {
9749
9751 }
9752
9753
9756 {
9757 super.CheckForRoofLimited(timeTresholdMS);
9758
9759 float time =
g_Game.GetTime();
9760 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9761 {
9762 m_PreviousRoofTestTime = time;
9763 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9764 }
9765 }
9766
9767
9769 {
9771 {
9772 return 0;
9773 }
9774
9775 if (GetInventory().GetAttachmentSlotsCount() != 0)
9776 {
9777 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9778 if (filter)
9779 return filter.GetProtectionLevel(type, false, system);
9780 else
9781 return 0;
9782 }
9783
9784 string subclassPath, entryName;
9785
9786 switch (type)
9787 {
9789 entryName = "biological";
9790 break;
9792 entryName = "chemical";
9793 break;
9794 default:
9795 entryName = "biological";
9796 break;
9797 }
9798
9799 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9800
9801 return g_Game.ConfigGetFloat(subclassPath + entryName);
9802 }
9803
9804
9805
9808 {
9809 if (!IsMagazine())
9811
9813 }
9814
9815
9816
9817
9818
9823 {
9824 return true;
9825 }
9826
9828 {
9830 }
9831
9832
9833
9834
9835
9837 {
9838 if (parent)
9839 {
9840 if (parent.IsInherited(DayZInfected))
9841 return true;
9842
9843 if (!parent.IsRuined())
9844 return true;
9845 }
9846
9847 return true;
9848 }
9849
9851 {
9852 if (!super.CanPutAsAttachment(parent))
9853 {
9854 return false;
9855 }
9856
9857 if (!IsRuined() && !parent.IsRuined())
9858 {
9859 return true;
9860 }
9861
9862 return false;
9863 }
9864
9866 {
9867
9868
9869
9870
9871 return super.CanReceiveItemIntoCargo(item);
9872 }
9873
9875 {
9876
9877
9878
9879
9880 GameInventory attachmentInv = attachment.GetInventory();
9882 {
9883 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9884 return false;
9885 }
9886
9887 InventoryLocation loc = new InventoryLocation();
9888 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9889 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9890 return false;
9891
9892 return super.CanReceiveAttachment(attachment, slotId);
9893 }
9894
9896 {
9897 if (!super.CanReleaseAttachment(attachment))
9898 return false;
9899
9900 return GetInventory().AreChildrenAccessible();
9901 }
9902
9903
9904
9905
9906
9907
9908
9909
9910
9911
9912
9913
9914
9915
9916
9917
9918
9919
9920
9921
9922
9924 {
9925 int id = muzzle_owner.GetMuzzleID();
9926 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9927
9928 if (WPOF_array)
9929 {
9930 for (int i = 0; i < WPOF_array.Count(); i++)
9931 {
9932 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9933
9934 if (WPOF)
9935 {
9936 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9937 }
9938 }
9939 }
9940 }
9941
9942
9944 {
9945 int id = muzzle_owner.GetMuzzleID();
9947
9948 if (WPOBE_array)
9949 {
9950 for (int i = 0; i < WPOBE_array.Count(); i++)
9951 {
9952 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9953
9954 if (WPOBE)
9955 {
9956 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9957 }
9958 }
9959 }
9960 }
9961
9962
9964 {
9965 int id = muzzle_owner.GetMuzzleID();
9966 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9967
9968 if (WPOOH_array)
9969 {
9970 for (int i = 0; i < WPOOH_array.Count(); i++)
9971 {
9972 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9973
9974 if (WPOOH)
9975 {
9976 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9977 }
9978 }
9979 }
9980 }
9981
9982
9984 {
9985 int id = muzzle_owner.GetMuzzleID();
9986 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9987
9988 if (WPOOH_array)
9989 {
9990 for (int i = 0; i < WPOOH_array.Count(); i++)
9991 {
9992 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9993
9994 if (WPOOH)
9995 {
9996 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9997 }
9998 }
9999 }
10000 }
10001
10002
10004 {
10005 int id = muzzle_owner.GetMuzzleID();
10006 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
10007
10008 if (WPOOH_array)
10009 {
10010 for (int i = 0; i < WPOOH_array.Count(); i++)
10011 {
10012 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
10013
10014 if (WPOOH)
10015 {
10016 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
10017 }
10018 }
10019 }
10020 }
10021
10022
10023
10025 {
10027 {
10028 return true;
10029 }
10030
10031 return false;
10032 }
10033
10035 {
10037 {
10038 return true;
10039 }
10040
10041 return false;
10042 }
10043
10045 {
10047 {
10048 return true;
10049 }
10050
10051 return false;
10052 }
10053
10055 {
10056 return false;
10057 }
10058
10061 {
10062 return UATimeSpent.DEFAULT_DEPLOY;
10063 }
10064
10065
10066
10067
10069 {
10071 SetSynchDirty();
10072 }
10073
10075 {
10077 }
10078
10079
10081 {
10082 return false;
10083 }
10084
10087 {
10088 string att_type = "None";
10089
10090 if (ConfigIsExisting("soundAttType"))
10091 {
10092 att_type = ConfigGetString("soundAttType");
10093 }
10094
10096 }
10097
10099 {
10101 }
10102
10103
10104
10105
10106
10112
10114 {
10117
10119 }
10120
10121
10123 {
10125 return;
10126
10128
10131
10134
10135 SoundParameters params = new SoundParameters();
10139 }
10140
10141
10143 {
10145 {
10148
10149 SetSynchDirty();
10150
10153 }
10154 }
10155
10157 {
10159 }
10160
10161
10163 {
10165 return;
10166
10168 SetSynchDirty();
10169
10172 }
10173
10175 {
10178 }
10179
10181 {
10183 }
10184
10185 void OnApply(PlayerBase player);
10186
10188 {
10189 return 1.0;
10190 };
10191
10193 {
10195 }
10196
10198 {
10200 }
10201
10203
10205 {
10206 SetDynamicPhysicsLifeTime(0.01);
10208 }
10209
10211 {
10212 array<string> zone_names = new array<string>;
10213 GetDamageZones(zone_names);
10214 for (int i = 0; i < zone_names.Count(); i++)
10215 {
10216 SetHealthMax(zone_names.Get(i),"Health");
10217 }
10218 SetHealthMax("","Health");
10219 }
10220
10223 {
10224 float global_health = GetHealth01("","Health");
10225 array<string> zones = new array<string>;
10226 GetDamageZones(zones);
10227
10228 for (int i = 0; i < zones.Count(); i++)
10229 {
10230 SetHealth01(zones.Get(i),"Health",global_health);
10231 }
10232 }
10233
10236 {
10237 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10238 }
10239
10241 {
10242 if (!hasRootAsPlayer)
10243 {
10244 if (refParentIB)
10245 {
10246
10247 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10248 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10249
10250 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10251 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10252
10255 }
10256 else
10257 {
10258
10261 }
10262 }
10263 }
10264
10266 {
10268 {
10269 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10270 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10271 {
10272 float heatPermCoef = 1.0;
10274 while (ent)
10275 {
10276 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10277 ent = ent.GetHierarchyParent();
10278 }
10279
10280 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10281 }
10282 }
10283 }
10284
10286 {
10287
10288 EntityAI parent = GetHierarchyParent();
10289 if (!parent)
10290 {
10291 hasParent = false;
10292 hasRootAsPlayer = false;
10293 }
10294 else
10295 {
10296 hasParent = true;
10297 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10298 refParentIB =
ItemBase.Cast(parent);
10299 }
10300 }
10301
10302 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10303 {
10304
10305 }
10306
10308 {
10309
10310 return false;
10311 }
10312
10314 {
10315
10316
10317 return false;
10318 }
10319
10321 {
10322
10323 return false;
10324 }
10325
10328 {
10329 return !GetIsFrozen() &&
IsOpen();
10330 }
10331
10333 {
10334 bool hasParent = false, hasRootAsPlayer = false;
10336
10337 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10338 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10339
10340 if (wwtu || foodDecay)
10341 {
10345
10346 if (processWetness || processTemperature || processDecay)
10347 {
10349
10350 if (processWetness)
10351 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10352
10353 if (processTemperature)
10355
10356 if (processDecay)
10357 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10358 }
10359 }
10360 }
10361
10364 {
10366 }
10367
10369 {
10372
10373 return super.GetTemperatureFreezeThreshold();
10374 }
10375
10377 {
10380
10381 return super.GetTemperatureThawThreshold();
10382 }
10383
10385 {
10388
10389 return super.GetItemOverheatThreshold();
10390 }
10391
10393 {
10395 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10396
10397 return super.GetTemperatureFreezeTime();
10398 }
10399
10401 {
10403 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10404
10405 return super.GetTemperatureThawTime();
10406 }
10407
10412
10414 {
10415 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10416 }
10417
10419 {
10420 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10421 }
10422
10425 {
10427 }
10428
10430 {
10432 }
10433
10435 {
10437 }
10438
10441 {
10442 return null;
10443 }
10444
10447 {
10448 return false;
10449 }
10450
10452 {
10454 {
10457 if (!trg)
10458 {
10460 explosive = this;
10461 }
10462
10463 explosive.PairRemote(trg);
10465
10466 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10467 trg.SetPersistentPairID(persistentID);
10468 explosive.SetPersistentPairID(persistentID);
10469
10470 return true;
10471 }
10472 return false;
10473 }
10474
10477 {
10478 float ret = 1.0;
10481 ret *= GetHealth01();
10482
10483 return ret;
10484 }
10485
10486 #ifdef DEVELOPER
10487 override void SetDebugItem()
10488 {
10489 super.SetDebugItem();
10490 _itemBase = this;
10491 }
10492
10494 {
10495 string text = super.GetDebugText();
10496
10498 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10499
10500 return text;
10501 }
10502 #endif
10503
10505 {
10506 return true;
10507 }
10508
10510
10512
10514 {
10517 }
10518
10519
10527
10543
10544 [
Obsolete(
"Use ItemSoundHandler instead")]
10547 {
10548 if (!
g_Game.IsDedicatedServer())
10549 {
10550 if (ConfigIsExisting("attachSoundSet"))
10551 {
10552 string cfg_path = "";
10553 string soundset = "";
10554 string type_name =
GetType();
10555
10558 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10559 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10560
10561 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10562 {
10563 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10564 {
10565 if (cfg_slot_array[i] == slot_type)
10566 {
10567 soundset = cfg_soundset_array[i];
10568 break;
10569 }
10570 }
10571 }
10572
10573 if (soundset != "")
10574 {
10575 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10577 }
10578 }
10579 }
10580 }
10581
10583}
10584
10586{
10588 if (entity)
10589 {
10590 bool is_item = entity.IsInherited(
ItemBase);
10591 if (is_item && full_quantity)
10592 {
10595 }
10596 }
10597 else
10598 {
10600 return NULL;
10601 }
10602 return entity;
10603}
10604
10606{
10607 if (item)
10608 {
10609 if (health > 0)
10610 item.SetHealth("", "", health);
10611
10612 if (item.CanHaveTemperature())
10613 {
10615 if (item.CanFreeze())
10616 item.SetFrozen(false);
10617 }
10618
10619 if (item.HasEnergyManager())
10620 {
10621 if (quantity >= 0)
10622 {
10623 item.GetCompEM().SetEnergy0To1(quantity);
10624 }
10625 else
10626 {
10628 }
10629 }
10630 else if (item.IsMagazine())
10631 {
10632 Magazine mag = Magazine.Cast(item);
10633 if (quantity >= 0)
10634 {
10635 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10636 }
10637 else
10638 {
10640 }
10641
10642 }
10643 else
10644 {
10645 if (quantity >= 0)
10646 {
10647 item.SetQuantityNormalized(quantity, false);
10648 }
10649 else
10650 {
10652 }
10653
10654 }
10655 }
10656}
10657
10658#ifdef DEVELOPER
10660#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
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 IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
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)
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()
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)
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)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.