Infection chance while/after using this item, originally used for wound infection after bandaging, params 'system' and 'param' can allow usage by other systems as well.
5588{
5590 {
5591 return true;
5592 }
5593};
5594
5596{
5597
5598};
5599
5600
5601
5603{
5607
5609
5612
5613
5614
5615
5616
5625
5631
5636
5641
5662 protected bool m_IsResultOfSplit
5663
5665
5670
5671
5672
5674
5678
5679
5680
5682
5685
5686
5687
5693
5694
5702
5705
5706
5708
5709
5711
5712
5717
5718
5723
5725
5726
5728
5729
5731 {
5736
5737 if (!
g_Game.IsDedicatedServer())
5738 {
5740 {
5742
5744 {
5746 }
5747 }
5748
5751 }
5752
5753 m_OldLocation = null;
5754
5756 {
5758 }
5759
5760 if (ConfigIsExisting("headSelectionsToHide"))
5761 {
5764 }
5765
5767 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5768 {
5770 }
5771
5773
5774 m_IsResultOfSplit = false;
5775
5777 }
5778
5780 {
5781 super.InitItemVariables();
5782
5788 m_Count = ConfigGetInt(
"count");
5789
5792
5797
5800
5805
5817
5821
5822
5825 if (ConfigIsExisting("canBeSplit"))
5826 {
5829 }
5830
5832 if (ConfigIsExisting("itemBehaviour"))
5834
5835
5838 RegisterNetSyncVariableInt("m_VarLiquidType");
5839 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5840
5841 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5842 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5843 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5844
5845 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5846 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5847 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5848 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5849
5850 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5851 RegisterNetSyncVariableBool("m_IsTakeable");
5852 RegisterNetSyncVariableBool("m_IsHologram");
5853
5856 {
5859 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5860 }
5861
5863
5865 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5867
5869 }
5870
5872 {
5874 }
5875
5877 {
5880 {
5885 }
5886 }
5887
5888 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5889 {
5891 {
5894 }
5895
5897 }
5898
5900 {
5906 }
5907
5909
5911 {
5913
5914 if (!action)
5915 {
5916 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5917 return;
5918 }
5919
5921 if (!ai)
5922 {
5924 return;
5925 }
5926
5928 if (!action_array)
5929 {
5930 action_array = new array<ActionBase_Basic>;
5932 }
5933 if (LogManager.IsActionLogEnable())
5934 {
5935 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5936 }
5937
5938 if (action_array.Find(action) != -1)
5939 {
5940 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5941 }
5942 else
5943 {
5944 action_array.Insert(action);
5945 }
5946 }
5947
5949 {
5950 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5951 ActionBase action = player.GetActionManager().GetAction(actionName);
5954
5955 if (action_array)
5956 {
5957 action_array.RemoveItem(action);
5958 }
5959 }
5960
5961
5962
5964 {
5965 ActionOverrideData overrideData = new ActionOverrideData();
5969
5971 if (!actionMap)
5972 {
5975 }
5976
5977 actionMap.Insert(this.
Type(), overrideData);
5978
5979 }
5980
5982
5984
5985
5987 {
5990
5993
5994 string config_to_search = "CfgVehicles";
5995 string muzzle_owner_config;
5996
5998 {
5999 if (IsInherited(Weapon))
6000 config_to_search = "CfgWeapons";
6001
6002 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6003
6004 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
6005
6006 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
6007
6008 if (config_OnFire_subclass_count > 0)
6009 {
6010 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
6011
6012 for (int i = 0; i < config_OnFire_subclass_count; i++)
6013 {
6014 string particle_class = "";
6015 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
6016 string config_OnFire_entry = config_OnFire_class + particle_class;
6017 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
6018 WPOF_array.Insert(WPOF);
6019 }
6020
6021
6023 }
6024 }
6025
6027 {
6028 config_to_search = "CfgWeapons";
6029 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6030
6031 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
6032
6033 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
6034
6035 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
6036 {
6037 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
6038
6039 for (i = 0; i < config_OnBulletCasingEject_count; i++)
6040 {
6041 string particle_class2 = "";
6042 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
6043 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
6044 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
6045 WPOBE_array.Insert(WPOBE);
6046 }
6047
6048
6050 }
6051 }
6052 }
6053
6054
6056 {
6059
6061 {
6062 string config_to_search = "CfgVehicles";
6063
6064 if (IsInherited(Weapon))
6065 config_to_search = "CfgWeapons";
6066
6067 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6068 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6069
6070 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6071 {
6072
6074
6076 {
6078 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6080 return;
6081 }
6082
6085
6086
6087
6088 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6089 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6090
6091 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6092 {
6093 string particle_class = "";
6094 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6095 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6096 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6097
6098 if (entry_type == CT_CLASS)
6099 {
6100 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6101 WPOOH_array.Insert(WPOF);
6102 }
6103 }
6104
6105
6107 }
6108 }
6109 }
6110
6112 {
6114 }
6115
6117 {
6119 {
6121
6124
6127
6128 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6129 }
6130 }
6131
6133 {
6135 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6136
6138 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6139
6141 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6142
6144 {
6146 }
6147 }
6148
6150 {
6152 }
6153
6155 {
6158 else
6160
6162 {
6165 }
6166 else
6167 {
6170
6173 }
6174
6176 }
6177
6179 {
6181 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6182 }
6183
6185 {
6187 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6189 }
6190
6192 {
6194 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6195 }
6196
6198 {
6201
6202 OverheatingParticle OP = new OverheatingParticle();
6207
6209 }
6210
6212 {
6215
6216 return -1;
6217 }
6218
6220 {
6222 {
6225
6226 for (int i = count; i > 0; --i)
6227 {
6228 int id = i - 1;
6231
6234
6235 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6236 {
6237 if (p)
6238 {
6241 }
6242 }
6243 }
6244 }
6245 }
6246
6248 {
6250 {
6252 {
6253 int id = i - 1;
6255
6256 if (OP)
6257 {
6259
6260 if (p)
6261 {
6263 }
6264
6265 delete OP;
6266 }
6267 }
6268
6271 }
6272 }
6273
6276 {
6277 return 0.0;
6278 }
6279
6280
6282 {
6283 return 250;
6284 }
6285
6287 {
6288 return 0;
6289 }
6290
6293 {
6295 return true;
6296
6297 return false;
6298 }
6299
6302 {
6305
6307 {
6309 }
6310 else
6311 {
6312
6314 }
6315
6317 }
6318
6325 {
6326 return -1;
6327 }
6328
6329
6330
6331
6333 {
6335 {
6336 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6337 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6338
6339 if (r_index >= 0)
6340 {
6341 InventoryLocation r_il = new InventoryLocation;
6342 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6343
6344 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6347 {
6348 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6349 }
6351 {
6352 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6353 }
6354
6355 }
6356
6357 player.GetHumanInventory().ClearUserReservedLocation(this);
6358 }
6359
6362 }
6363
6364
6365
6366
6368 {
6369 return ItemBase.m_DebugActionsMask;
6370 }
6371
6373 {
6374 return ItemBase.m_DebugActionsMask & mask;
6375 }
6376
6378 {
6379 ItemBase.m_DebugActionsMask = mask;
6380 }
6381
6383 {
6384 ItemBase.m_DebugActionsMask |= mask;
6385 }
6386
6388 {
6389 ItemBase.m_DebugActionsMask &= ~mask;
6390 }
6391
6393 {
6395 {
6397 }
6398 else
6399 {
6401 }
6402 }
6403
6404
6406 {
6407 if (GetEconomyProfile())
6408 {
6409 float q_max = GetEconomyProfile().GetQuantityMax();
6410 if (q_max > 0)
6411 {
6412 float q_min = GetEconomyProfile().GetQuantityMin();
6413 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6414
6416 {
6417 ComponentEnergyManager comp = GetCompEM();
6419 {
6421 }
6422 }
6424 {
6426
6427 }
6428
6429 }
6430 }
6431 }
6432
6435 {
6436 EntityAI parent = GetHierarchyParent();
6437
6438 if (parent)
6439 {
6440 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6441 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6442 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6443 }
6444 }
6445
6448 {
6449 EntityAI parent = GetHierarchyParent();
6450
6451 if (parent)
6452 {
6453 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6454 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6455 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6456 }
6457 }
6458
6460 {
6461
6462
6463
6464
6466
6468 {
6469 if (ScriptInputUserData.CanStoreInputUserData())
6470 {
6471 ScriptInputUserData ctx = new ScriptInputUserData;
6477 ctx.
Write(use_stack_max);
6480
6482 {
6483 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6484 }
6485 }
6486 }
6487 else if (!
g_Game.IsMultiplayer())
6488 {
6490 }
6491 }
6492
6494 {
6496 }
6497
6499 {
6501 }
6502
6504 {
6506 }
6507
6509 {
6510
6511 return false;
6512 }
6513
6515 {
6516 return false;
6517 }
6518
6522 {
6523 return false;
6524 }
6525
6527 {
6528 return "";
6529 }
6530
6532
6534 {
6535 return false;
6536 }
6537
6539 {
6540 return true;
6541 }
6542
6543
6544
6546 {
6547 return true;
6548 }
6549
6551 {
6552 return true;
6553 }
6554
6556 {
6557 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6559 }
6560
6562 {
6564 }
6565
6567 {
6569 if (!is_being_placed)
6571 SetSynchDirty();
6572 }
6573
6574
6576
6578 {
6580 }
6581
6583 {
6585 }
6586
6588 {
6589 return 1;
6590 }
6591
6593 {
6594 return false;
6595 }
6596
6598 {
6600 SetSynchDirty();
6601 }
6602
6603
6604
6605
6606
6607
6608
6609
6610
6611
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630
6631
6632
6633
6634
6635
6636
6638 {
6639 super.OnMovedInsideCargo(container);
6640
6641 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6642 }
6643
6644 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6645 {
6646 super.EEItemLocationChanged(oldLoc, newLoc);
6647
6648 PlayerBase newPlayer = null;
6649 PlayerBase oldPlayer = null;
6650
6651 if (newLoc.GetParent())
6652 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6653
6654 if (oldLoc.GetParent())
6655 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6656
6658 {
6659 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6660
6661 if (rIndex >= 0)
6662 {
6663 InventoryLocation rIl = new InventoryLocation;
6664 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6665
6666 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6669 {
6670 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6671 }
6673 {
6675 }
6676
6677 }
6678 }
6679
6681 {
6682 if (newPlayer)
6683 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6684
6685 if (newPlayer == oldPlayer)
6686 {
6687 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6688 {
6690 {
6691 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6692 {
6693 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6694 }
6695 }
6696 else
6697 {
6698 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6699 }
6700 }
6701
6702 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6703 {
6704 int type = oldLoc.GetType();
6706 {
6707 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6708 }
6710 {
6711 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6712 }
6713 }
6714 if (!m_OldLocation)
6715 {
6716 m_OldLocation = new InventoryLocation;
6717 }
6718 m_OldLocation.Copy(oldLoc);
6719 }
6720 else
6721 {
6722 if (m_OldLocation)
6723 {
6724 m_OldLocation.Reset();
6725 }
6726 }
6727
6728 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6729 }
6730 else
6731 {
6732 if (newPlayer)
6733 {
6734 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6735 if (resIndex >= 0)
6736 {
6737 InventoryLocation il = new InventoryLocation;
6738 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6740 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6743 {
6744 il.
GetParent().GetOnReleaseLock().Invoke(it);
6745 }
6747 {
6749 }
6750
6751 }
6752 }
6754 {
6755
6757 }
6758
6759 if (m_OldLocation)
6760 {
6761 m_OldLocation.Reset();
6762 }
6763 }
6764
6766 {
6767 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6768 }
6769
6771 {
6772 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6773 }
6774 }
6775
6776 override void EOnContact(IEntity other, Contact extra)
6777 {
6779 {
6780 int liquidType = -1;
6782 if (impactSpeed > 0.0)
6783 {
6785 #ifndef SERVER
6787 #else
6789 SetSynchDirty();
6790 #endif
6792 }
6793 }
6794
6795 #ifdef SERVER
6796 if (GetCompEM() && GetCompEM().IsPlugged())
6797 {
6798 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6799 GetCompEM().UnplugThis();
6800 }
6801 #endif
6802 }
6803
6805
6807 {
6809 }
6810
6812 {
6813
6814 }
6815
6817 {
6818 super.OnItemLocationChanged(old_owner, new_owner);
6819
6820 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6821 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6822
6823 if (!relatedPlayer && playerNew)
6824 relatedPlayer = playerNew;
6825
6826 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6827 {
6829 if (actionMgr)
6830 {
6831 ActionBase currentAction = actionMgr.GetRunningAction();
6832 if (currentAction)
6834 }
6835 }
6836
6837 Man ownerPlayerOld = null;
6838 Man ownerPlayerNew = null;
6839
6840 if (old_owner)
6841 {
6842 if (old_owner.
IsMan())
6843 {
6844 ownerPlayerOld = Man.Cast(old_owner);
6845 }
6846 else
6847 {
6848 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6849 }
6850 }
6851 else
6852 {
6854 {
6856
6857 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6858 {
6859 GetCompEM().UnplugThis();
6860 }
6861 }
6862 }
6863
6864 if (new_owner)
6865 {
6866 if (new_owner.
IsMan())
6867 {
6868 ownerPlayerNew = Man.Cast(new_owner);
6869 }
6870 else
6871 {
6872 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6873 }
6874 }
6875
6876 if (ownerPlayerOld != ownerPlayerNew)
6877 {
6878 if (ownerPlayerOld)
6879 {
6880 array<EntityAI> subItemsExit = new array<EntityAI>;
6882 for (int i = 0; i < subItemsExit.Count(); i++)
6883 {
6886 }
6887 }
6888
6889 if (ownerPlayerNew)
6890 {
6891 array<EntityAI> subItemsEnter = new array<EntityAI>;
6893 for (int j = 0; j < subItemsEnter.Count(); j++)
6894 {
6897 }
6898 }
6899 }
6900 else if (ownerPlayerNew != null)
6901 {
6902 PlayerBase nplayer;
6903 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6904 {
6905 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6907 for (int k = 0; k < subItemsUpdate.Count(); k++)
6908 {
6910 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6911 }
6912 }
6913 }
6914
6915 if (old_owner)
6916 old_owner.OnChildItemRemoved(this);
6917 if (new_owner)
6918 new_owner.OnChildItemReceived(this);
6919 }
6920
6921
6923 {
6924 super.EEDelete(parent);
6925 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6926 if (player)
6927 {
6929
6930 if (player.IsAlive())
6931 {
6932 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6933 if (r_index >= 0)
6934 {
6935 InventoryLocation r_il = new InventoryLocation;
6936 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6937
6938 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6941 {
6942 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6943 }
6945 {
6946 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6947 }
6948
6949 }
6950
6951 player.RemoveQuickBarEntityShortcut(this);
6952 }
6953 }
6954 }
6955
6957 {
6958 super.EEKilled(killer);
6959
6962 {
6963 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6964 {
6965 if (IsMagazine())
6966 {
6967 if (Magazine.Cast(this).GetAmmoCount() > 0)
6968 {
6970 }
6971 }
6972 else
6973 {
6975 }
6976 }
6977 }
6978 }
6979
6981 {
6982 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6983
6984 super.OnWasAttached(parent, slot_id);
6985
6988
6991 }
6992
6994 {
6995 super.OnWasDetached(parent, slot_id);
6996
6999
7002 }
7003
7005 {
7006 int idx;
7009
7010 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7011 if (inventory_slots.Count() < 1)
7012 {
7013 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
7014 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
7015 }
7016 else
7017 {
7018 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
7019 }
7020
7021 idx = inventory_slots.Find(slot);
7022 if (idx < 0)
7023 return "";
7024
7025 return attach_types.Get(idx);
7026 }
7027
7029 {
7030 int idx = -1;
7031 string slot;
7032
7035
7036 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
7037 if (inventory_slots.Count() < 1)
7038 {
7039 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
7040 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7041 }
7042 else
7043 {
7044 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
7045 if (detach_types.Count() < 1)
7046 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
7047 }
7048
7049 for (int i = 0; i < inventory_slots.Count(); i++)
7050 {
7051 slot = inventory_slots.Get(i);
7052 }
7053
7054 if (slot != "")
7055 {
7056 if (detach_types.Count() == 1)
7057 idx = 0;
7058 else
7059 idx = inventory_slots.Find(slot);
7060 }
7061 if (idx < 0)
7062 return "";
7063
7064 return detach_types.Get(idx);
7065 }
7066
7068 {
7069
7071
7072
7073 float min_time = 1;
7074 float max_time = 3;
7075 float delay = Math.RandomFloat(min_time, max_time);
7076
7077 explode_timer.Run(delay, this, "DoAmmoExplosion");
7078 }
7079
7081 {
7082 Magazine magazine = Magazine.Cast(this);
7083 int pop_sounds_count = 6;
7084 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7085
7086
7087 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7088 string sound_name = pop_sounds[ sound_idx ];
7089 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7090
7091
7092 magazine.ServerAddAmmoCount(-1);
7093
7094
7095 float min_temp_to_explode = 100;
7096
7097 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7098 {
7100 }
7101 }
7102
7103
7104 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7105 {
7106 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7107
7108 const int CHANCE_DAMAGE_CARGO = 4;
7109 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7110 const int CHANCE_DAMAGE_NOTHING = 2;
7111
7113 {
7114 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7115 int chances;
7116 int rnd;
7117
7118 if (GetInventory().GetCargo())
7119 {
7120 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7121 rnd = Math.RandomInt(0,chances);
7122
7123 if (rnd < CHANCE_DAMAGE_CARGO)
7124 {
7126 }
7127 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7128 {
7130 }
7131 }
7132 else
7133 {
7134 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7135 rnd = Math.RandomInt(0,chances);
7136
7137 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7138 {
7140 }
7141 }
7142 }
7143 }
7144
7146 {
7147 CargoBase cargo = GetInventory().GetCargo();
7148 if (cargo)
7149 {
7151 if (item_count > 0)
7152 {
7153 int random_pick = Math.RandomInt(0, item_count);
7155 if (!item.IsExplosive())
7156 {
7157 item.AddHealth("","",damage);
7158 return true;
7159 }
7160 }
7161 }
7162 return false;
7163 }
7164
7166 {
7167 GameInventory inventory = GetInventory();
7169 if (attachment_count > 0)
7170 {
7171 int random_pick = Math.RandomInt(0, attachment_count);
7173 if (!attachment.IsExplosive())
7174 {
7175 attachment.AddHealth("","",damage);
7176 return true;
7177 }
7178 }
7179 return false;
7180 }
7181
7183 {
7185 }
7186
7188 {
7190 return GetInventory().CanRemoveEntity();
7191
7192 return false;
7193 }
7194
7196 {
7197
7199 return false;
7200
7201
7203 return false;
7204
7205
7206
7208 if (delta == 0)
7209 return false;
7210
7211
7212 return true;
7213 }
7214
7216 {
7218 {
7219 if (ScriptInputUserData.CanStoreInputUserData())
7220 {
7221 ScriptInputUserData ctx = new ScriptInputUserData;
7226 ctx.
Write(destination_entity);
7230 }
7231 }
7232 else if (!
g_Game.IsMultiplayer())
7233 {
7235 }
7236 }
7237
7239 {
7240 float split_quantity_new;
7244 InventoryLocation loc = new InventoryLocation;
7245
7246 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7247 {
7249 split_quantity_new = stack_max;
7250 else
7252
7254 {
7255 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7256 if (new_item)
7257 {
7258 new_item.SetResultOfSplit(true);
7259 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7261 new_item.
SetQuantity(split_quantity_new,
false,
true);
7262 }
7263 }
7264 }
7265 else if (destination_entity && slot_id == -1)
7266 {
7267 if (quantity > stack_max)
7268 split_quantity_new = stack_max;
7269 else
7270 split_quantity_new = quantity;
7271
7273 {
7274 GameInventory destinationInventory = destination_entity.GetInventory();
7276 {
7279 }
7280
7281 if (new_item)
7282 {
7283 new_item.SetResultOfSplit(true);
7284 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7286 new_item.
SetQuantity(split_quantity_new,
false,
true);
7287 }
7288 }
7289 }
7290 else
7291 {
7292 if (stack_max != 0)
7293 {
7295 {
7297 }
7298
7299 if (split_quantity_new == 0)
7300 {
7301 if (!
g_Game.IsMultiplayer())
7302 player.PhysicalPredictiveDropItem(this);
7303 else
7304 player.ServerDropEntity(this);
7305 return;
7306 }
7307
7309 {
7311
7312 if (new_item)
7313 {
7314 new_item.SetResultOfSplit(true);
7315 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7318 new_item.PlaceOnSurface();
7319 }
7320 }
7321 }
7322 }
7323 }
7324
7326 {
7327 float split_quantity_new;
7331 InventoryLocation loc = new InventoryLocation;
7332
7333 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7334 {
7336 split_quantity_new = stack_max;
7337 else
7339
7341 {
7342 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7343 if (new_item)
7344 {
7345 new_item.SetResultOfSplit(true);
7346 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7348 new_item.
SetQuantity(split_quantity_new,
false,
true);
7349 }
7350 }
7351 }
7352 else if (destination_entity && slot_id == -1)
7353 {
7354 if (quantity > stack_max)
7355 split_quantity_new = stack_max;
7356 else
7357 split_quantity_new = quantity;
7358
7360 {
7361 GameInventory destinationInventory = destination_entity.GetInventory();
7363 {
7366 }
7367
7368 if (new_item)
7369 {
7370 new_item.SetResultOfSplit(true);
7371 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7373 new_item.
SetQuantity(split_quantity_new,
false,
true);
7374 }
7375 }
7376 }
7377 else
7378 {
7379 if (stack_max != 0)
7380 {
7382 {
7384 }
7385
7387 {
7389
7390 if (new_item)
7391 {
7392 new_item.SetResultOfSplit(true);
7393 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7396 new_item.PlaceOnSurface();
7397 }
7398 }
7399 }
7400 }
7401 }
7402
7404 {
7406 {
7407 if (ScriptInputUserData.CanStoreInputUserData())
7408 {
7409 ScriptInputUserData ctx = new ScriptInputUserData;
7414 dst.WriteToContext(ctx);
7416 }
7417 }
7418 else if (!
g_Game.IsMultiplayer())
7419 {
7421 }
7422 }
7423
7425 {
7427 {
7428 if (ScriptInputUserData.CanStoreInputUserData())
7429 {
7430 ScriptInputUserData ctx = new ScriptInputUserData;
7435 ctx.
Write(destination_entity);
7441 }
7442 }
7443 else if (!
g_Game.IsMultiplayer())
7444 {
7446 }
7447 }
7448
7450 {
7452 }
7453
7455 {
7457 float split_quantity_new;
7459 if (dst.IsValid())
7460 {
7461 int slot_id = dst.GetSlot();
7463
7464 if (quantity > stack_max)
7465 split_quantity_new = stack_max;
7466 else
7467 split_quantity_new = quantity;
7468
7470 {
7472
7473 if (new_item)
7474 {
7475 new_item.SetResultOfSplit(true);
7476 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7478 new_item.
SetQuantity(split_quantity_new,
false,
true);
7479 }
7480
7481 return new_item;
7482 }
7483 }
7484
7485 return null;
7486 }
7487
7489 {
7491 float split_quantity_new;
7493 if (destination_entity)
7494 {
7496 if (quantity > stackable)
7497 split_quantity_new = stackable;
7498 else
7499 split_quantity_new = quantity;
7500
7502 {
7503 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7504 if (new_item)
7505 {
7506 new_item.SetResultOfSplit(true);
7507 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7509 new_item.
SetQuantity(split_quantity_new,
false,
true);
7510 }
7511 }
7512 }
7513 }
7514
7516 {
7518 {
7519 if (ScriptInputUserData.CanStoreInputUserData())
7520 {
7521 ScriptInputUserData ctx = new ScriptInputUserData;
7526 ItemBase destination_entity =
this;
7527 ctx.
Write(destination_entity);
7531 }
7532 }
7533 else if (!
g_Game.IsMultiplayer())
7534 {
7536 }
7537 }
7538
7540 {
7542 float split_quantity_new;
7544 if (player)
7545 {
7547 if (quantity > stackable)
7548 split_quantity_new = stackable;
7549 else
7550 split_quantity_new = quantity;
7551
7553 {
7554 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7555 new_item =
ItemBase.Cast(in_hands);
7556 if (new_item)
7557 {
7558 new_item.SetResultOfSplit(true);
7559 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7561 new_item.SetQuantity(split_quantity_new, false, true);
7562 }
7563 }
7564 }
7565 }
7566
7568 {
7570 float split_quantity_new = Math.Floor(quantity * 0.5);
7571
7573 return;
7574
7576
7577 if (new_item)
7578 {
7579 if (new_item.GetQuantityMax() < split_quantity_new)
7580 {
7581 split_quantity_new = new_item.GetQuantityMax();
7582 }
7583
7584 new_item.SetResultOfSplit(true);
7585 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7586
7588 {
7591 }
7592 else
7593 {
7595 new_item.
SetQuantity(split_quantity_new,
false,
true);
7596 }
7597 }
7598 }
7599
7601 {
7603 float split_quantity_new = Math.Floor(quantity / 2);
7604
7606 return;
7607
7608 InventoryLocation invloc = new InventoryLocation;
7610
7612 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7613
7614 if (new_item)
7615 {
7616 if (new_item.GetQuantityMax() < split_quantity_new)
7617 {
7618 split_quantity_new = new_item.GetQuantityMax();
7619 }
7621 {
7624 }
7625 else if (split_quantity_new > 1)
7626 {
7628 new_item.
SetQuantity(split_quantity_new,
false,
true);
7629 }
7630 }
7631 }
7632
7635 {
7636 SetWeightDirty();
7638
7639 if (parent)
7640 parent.OnAttachmentQuantityChangedEx(this, delta);
7641
7643 {
7645 {
7647 }
7649 {
7650 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7652 }
7653 }
7654 }
7655
7658 {
7659
7660 }
7661
7664 {
7666 }
7667
7669 {
7670 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7671
7673 {
7674 if (newLevel == GameConstants.STATE_RUINED)
7675 {
7677 EntityAI parent = GetHierarchyParent();
7678 if (parent && parent.IsFireplace())
7679 {
7680 CargoBase cargo = GetInventory().GetCargo();
7681 if (cargo)
7682 {
7684 {
7686 }
7687 }
7688 }
7689 }
7690
7692 {
7693
7695 return;
7696 }
7697
7698 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7699 {
7701 }
7702 }
7703 }
7704
7705
7707 {
7708 super.OnRightClick();
7709
7711 {
7713 {
7714 if (ScriptInputUserData.CanStoreInputUserData())
7715 {
7716 EntityAI root = GetHierarchyRoot();
7717 Man playerOwner = GetHierarchyRootPlayer();
7718 InventoryLocation dst = new InventoryLocation;
7719
7720
7721 if (!playerOwner && root && root == this)
7722 {
7724 }
7725 else
7726 {
7727
7728 GetInventory().GetCurrentInventoryLocation(dst);
7730 {
7731 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7733 {
7735 }
7736 else
7737 {
7739
7740
7741 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7742 {
7744 }
7745 else
7746 {
7747 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7748 }
7749 }
7750 }
7751 }
7752
7753 ScriptInputUserData ctx = new ScriptInputUserData;
7761 }
7762 }
7763 else if (!
g_Game.IsMultiplayer())
7764 {
7766 }
7767 }
7768 }
7769
7771 {
7772 if (root)
7773 {
7774 vector m4[4];
7775 root.GetTransform(m4);
7776 dst.SetGround(this, m4);
7777 }
7778 else
7779 {
7780 GetInventory().GetCurrentInventoryLocation(dst);
7781 }
7782 }
7783
7784 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7785 {
7786
7787 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7788 return false;
7789
7790 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7791 return false;
7792
7793
7795 return false;
7796
7797
7798 Magazine mag = Magazine.Cast(this);
7799 if (mag)
7800 {
7801 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7802 return false;
7803
7804 if (stack_max_limit)
7805 {
7806 Magazine other_mag = Magazine.Cast(other_item);
7807 if (other_item)
7808 {
7809 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7810 return false;
7811 }
7812
7813 }
7814 }
7815 else
7816 {
7817
7819 return false;
7820
7822 return false;
7823 }
7824
7825 PlayerBase player = null;
7826 if (CastTo(player, GetHierarchyRootPlayer()))
7827 {
7828 if (player.GetInventory().HasAttachment(this))
7829 return false;
7830
7831 if (player.IsItemsToDelete())
7832 return false;
7833 }
7834
7835 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7836 return false;
7837
7838 int slotID;
7840 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7841 return false;
7842
7843 return true;
7844 }
7845
7847 {
7849 }
7850
7852 {
7853 return m_IsResultOfSplit;
7854 }
7855
7857 {
7858 m_IsResultOfSplit = value;
7859 }
7860
7862 {
7864 }
7865
7867 {
7868 float other_item_quantity = other_item.GetQuantity();
7869 float this_free_space;
7870
7872
7874
7875 if (other_item_quantity > this_free_space)
7876 {
7877 return this_free_space;
7878 }
7879 else
7880 {
7881 return other_item_quantity;
7882 }
7883 }
7884
7886 {
7888 }
7889
7891 {
7893 return;
7894
7895 if (!IsMagazine() && other_item)
7896 {
7898 if (quantity_used != 0)
7899 {
7900 float hp1 = GetHealth01("","");
7901 float hp2 = other_item.GetHealth01("","");
7902 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7903 hpResult = hpResult / (
GetQuantity() + quantity_used);
7904
7905 hpResult *= GetMaxHealth();
7906 Math.Round(hpResult);
7907 SetHealth("", "Health", hpResult);
7908
7910 other_item.AddQuantity(-quantity_used);
7911 }
7912 }
7914 }
7915
7917 {
7918 #ifdef SERVER
7919 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7920 GetHierarchyParent().IncreaseLifetimeUp();
7921 #endif
7922 };
7923
7925 {
7926 PlayerBase p = PlayerBase.Cast(player);
7927
7928 array<int> recipesIds = p.m_Recipes;
7929 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7930 if (moduleRecipesManager)
7931 {
7932 EntityAI itemInHands = player.GetEntityInHands();
7933 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7934 }
7935
7936 for (int i = 0;i < recipesIds.Count(); i++)
7937 {
7938 int key = recipesIds.Get(i);
7939 string recipeName = moduleRecipesManager.GetRecipeName(key);
7941 }
7942 }
7943
7944
7945 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7946 {
7947 super.GetDebugActions(outputList);
7948
7949
7955
7956
7961
7966
7967
7971
7972
7974 {
7978 }
7979
7982
7983
7987
7989
7990 InventoryLocation loc = new InventoryLocation();
7991 GetInventory().GetCurrentInventoryLocation(loc);
7993 {
7994 if (Gizmo_IsSupported())
7997 }
7998
8000 }
8001
8002
8003
8004
8006 {
8007 super.OnAction(action_id, player, ctx);
8008
8010 {
8011 switch (action_id)
8012 {
8016 return true;
8020 return true;
8021 }
8022 }
8023
8025 {
8026 switch (action_id)
8027 {
8029 Delete();
8030 return true;
8031 }
8032 }
8033
8034 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
8035 {
8036 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
8037 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
8038 PlayerBase p = PlayerBase.Cast(player);
8039 if (
EActions.RECIPES_RANGE_START < 1000)
8040 {
8041 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
8042 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
8043 }
8044 }
8045 #ifndef SERVER
8046 else if (action_id ==
EActions.WATCH_PLAYER)
8047 {
8048 PluginDeveloper.SetDeveloperItemClientEx(player);
8049 }
8050 #endif
8052 {
8053 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
8054 {
8055 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8056 OnDebugButtonPressServer(id + 1);
8057 }
8058
8059 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8060 {
8061 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8063 }
8064
8065 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8066 {
8067 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8069 }
8070
8071 else if (action_id ==
EActions.ADD_QUANTITY)
8072 {
8073 if (IsMagazine())
8074 {
8075 Magazine mag = Magazine.Cast(this);
8076 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8077 }
8078 else
8079 {
8081 }
8082
8083 if (m_EM)
8084 {
8085 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8086 }
8087
8088 }
8089
8090 else if (action_id ==
EActions.REMOVE_QUANTITY)
8091 {
8092 if (IsMagazine())
8093 {
8094 Magazine mag2 = Magazine.Cast(this);
8095 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8096 }
8097 else
8098 {
8100 }
8101 if (m_EM)
8102 {
8103 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8104 }
8105
8106 }
8107
8108 else if (action_id ==
EActions.SET_QUANTITY_0)
8109 {
8111
8112 if (m_EM)
8113 {
8114 m_EM.SetEnergy(0);
8115 }
8116 }
8117
8118 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8119 {
8121
8122 if (m_EM)
8123 {
8124 m_EM.SetEnergy(m_EM.GetEnergyMax());
8125 }
8126 }
8127
8128 else if (action_id ==
EActions.ADD_HEALTH)
8129 {
8130 AddHealth("","",GetMaxHealth("","Health")/5);
8131 }
8132 else if (action_id ==
EActions.REMOVE_HEALTH)
8133 {
8134 AddHealth("","",-GetMaxHealth("","Health")/5);
8135 }
8136 else if (action_id ==
EActions.DESTROY_HEALTH)
8137 {
8138 SetHealth01("","",0);
8139 }
8140 else if (action_id ==
EActions.WATCH_ITEM)
8141 {
8143 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8144 #ifdef DEVELOPER
8145 SetDebugDeveloper_item(this);
8146 #endif
8147 }
8148
8149 else if (action_id ==
EActions.ADD_TEMPERATURE)
8150 {
8151 AddTemperature(20);
8152
8153 }
8154
8155 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8156 {
8157 AddTemperature(-20);
8158
8159 }
8160
8161 else if (action_id ==
EActions.FLIP_FROZEN)
8162 {
8163 SetFrozen(!GetIsFrozen());
8164
8165 }
8166
8167 else if (action_id ==
EActions.ADD_WETNESS)
8168 {
8170
8171 }
8172
8173 else if (action_id ==
EActions.REMOVE_WETNESS)
8174 {
8176
8177 }
8178
8179 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8180 {
8183
8184
8185 }
8186
8187 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8188 {
8191 }
8192
8193 else if (action_id ==
EActions.MAKE_SPECIAL)
8194 {
8195 auto debugParams = DebugSpawnParams.WithPlayer(player);
8196 OnDebugSpawnEx(debugParams);
8197 }
8198
8199 }
8200
8201
8202 return false;
8203 }
8204
8205
8206
8207
8211
8214
8215
8216
8218 {
8219 return false;
8220 }
8221
8222
8224 {
8225 return true;
8226 }
8227
8228
8230 {
8231 return true;
8232 }
8233
8234
8235
8237 {
8238 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8239 return g_Game.ConfigIsExisting(config_path);
8240 }
8241
8244 {
8245 return null;
8246 }
8247
8249 {
8250 return false;
8251 }
8252
8254 {
8255 return false;
8256 }
8257
8261
8262
8264 {
8265 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8266 return module_repairing.CanRepair(this, item_repair_kit);
8267 }
8268
8269
8270 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8271 {
8272 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8273 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8274 }
8275
8276
8278 {
8279
8280
8281
8282
8283
8284
8285
8286
8287 return 1;
8288 }
8289
8290
8291
8293 {
8295 }
8296
8297
8298
8300 {
8302 }
8303
8304
8313 {
8314 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8315
8316 if (player)
8317 {
8318 player.MessageStatus(text);
8319 }
8320 }
8321
8322
8331 {
8332 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8333
8334 if (player)
8335 {
8336 player.MessageAction(text);
8337 }
8338 }
8339
8340
8349 {
8350 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8351
8352 if (player)
8353 {
8354 player.MessageFriendly(text);
8355 }
8356 }
8357
8358
8367 {
8368 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8369
8370 if (player)
8371 {
8372 player.MessageImportant(text);
8373 }
8374 }
8375
8377 {
8378 return true;
8379 }
8380
8381
8382 override bool KindOf(
string tag)
8383 {
8384 bool found = false;
8385 string item_name = this.
GetType();
8387 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8388
8389 int array_size = item_tag_array.Count();
8390 for (int i = 0; i < array_size; i++)
8391 {
8392 if (item_tag_array.Get(i) == tag)
8393 {
8394 found = true;
8395 break;
8396 }
8397 }
8398 return found;
8399 }
8400
8401
8403 {
8404
8405 super.OnRPC(sender, rpc_type,ctx);
8406
8407
8408 switch (rpc_type)
8409 {
8410 #ifndef SERVER
8411 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8412 Param2<bool, string> p = new Param2<bool, string>(false, "");
8413
8415 return;
8416
8417 bool play = p.param1;
8418 string soundSet = p.param2;
8419
8420 if (play)
8421 {
8423 {
8425 {
8427 }
8428 }
8429 else
8430 {
8432 }
8433 }
8434 else
8435 {
8437 }
8438
8439 break;
8440 #endif
8441
8442 }
8443
8445 {
8447 }
8448 }
8449
8450
8451
8452
8454 {
8455 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8456 return plugin.GetID(
name);
8457 }
8458
8460 {
8461 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8462 return plugin.GetName(id);
8463 }
8464
8467 {
8468
8469
8470 int varFlags;
8471 if (!ctx.
Read(varFlags))
8472 return;
8473
8474 if (varFlags & ItemVariableFlags.FLOAT)
8475 {
8477 }
8478 }
8479
8481 {
8482
8483 super.SerializeNumericalVars(floats_out);
8484
8485
8486
8488 {
8490 }
8491
8493 {
8495 }
8496
8498 {
8500 }
8501
8503 {
8508 }
8509
8511 {
8513 }
8514 }
8515
8517 {
8518
8519 super.DeSerializeNumericalVars(floats);
8520
8521
8522 int index = 0;
8523 int mask = Math.Round(floats.Get(index));
8524
8525 index++;
8526
8528 {
8530 {
8532 }
8533 else
8534 {
8535 float quantity = floats.Get(index);
8537 }
8538 index++;
8539 }
8540
8542 {
8543 float wet = floats.Get(index);
8545 index++;
8546 }
8547
8549 {
8550 int liquidtype = Math.Round(floats.Get(index));
8552 index++;
8553 }
8554
8556 {
8558 index++;
8560 index++;
8562 index++;
8564 index++;
8565 }
8566
8568 {
8569 int cleanness = Math.Round(floats.Get(index));
8571 index++;
8572 }
8573 }
8574
8576 {
8577 super.WriteVarsToCTX(ctx);
8578
8579
8581 {
8583 }
8584
8586 {
8588 }
8589
8591 {
8593 }
8594
8596 {
8597 int r,g,b,a;
8603 }
8604
8606 {
8608 }
8609 }
8610
8612 {
8613 if (!super.ReadVarsFromCTX(ctx,version))
8614 return false;
8615
8616 int intValue;
8617 float value;
8618
8619 if (version < 140)
8620 {
8621 if (!ctx.
Read(intValue))
8622 return false;
8623
8624 m_VariablesMask = intValue;
8625 }
8626
8628 {
8629 if (!ctx.
Read(value))
8630 return false;
8631
8633 {
8635 }
8636 else
8637 {
8639 }
8640 }
8641
8642 if (version < 140)
8643 {
8645 {
8646 if (!ctx.
Read(value))
8647 return false;
8648 SetTemperatureDirect(value);
8649 }
8650 }
8651
8653 {
8654 if (!ctx.
Read(value))
8655 return false;
8657 }
8658
8660 {
8661 if (!ctx.
Read(intValue))
8662 return false;
8664 }
8665
8667 {
8668 int r,g,b,a;
8670 return false;
8672 return false;
8674 return false;
8676 return false;
8677
8679 }
8680
8682 {
8683 if (!ctx.
Read(intValue))
8684 return false;
8686 }
8687
8688 if (version >= 138 && version < 140)
8689 {
8691 {
8692 if (!ctx.
Read(intValue))
8693 return false;
8694 SetFrozen(intValue);
8695 }
8696 }
8697
8698 return true;
8699 }
8700
8701
8703 {
8706 {
8708 }
8709
8710 if (!super.OnStoreLoad(ctx, version))
8711 {
8713 return false;
8714 }
8715
8716 if (version >= 114)
8717 {
8718 bool hasQuickBarIndexSaved;
8719
8720 if (!ctx.
Read(hasQuickBarIndexSaved))
8721 {
8723 return false;
8724 }
8725
8726 if (hasQuickBarIndexSaved)
8727 {
8728 int itmQBIndex;
8729
8730
8731 if (!ctx.
Read(itmQBIndex))
8732 {
8734 return false;
8735 }
8736
8737 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8738 if (itmQBIndex != -1 && parentPlayer)
8739 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8740 }
8741 }
8742 else
8743 {
8744
8745 PlayerBase player;
8746 int itemQBIndex;
8747 if (version ==
int.
MAX)
8748 {
8749 if (!ctx.
Read(itemQBIndex))
8750 {
8752 return false;
8753 }
8754 }
8755 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8756 {
8757
8758 if (!ctx.
Read(itemQBIndex))
8759 {
8761 return false;
8762 }
8763 if (itemQBIndex != -1 && player)
8764 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8765 }
8766 }
8767
8768 if (version < 140)
8769 {
8770
8771 if (!LoadVariables(ctx, version))
8772 {
8774 return false;
8775 }
8776 }
8777
8778
8780 {
8782 return false;
8783 }
8784 if (version >= 132)
8785 {
8787 if (raib)
8788 {
8790 {
8792 return false;
8793 }
8794 }
8795 }
8796
8798 return true;
8799 }
8800
8801
8802
8804 {
8805 super.OnStoreSave(ctx);
8806
8807 PlayerBase player;
8808 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8809 {
8811
8812 int itemQBIndex = -1;
8813 itemQBIndex = player.FindQuickBarEntityIndex(this);
8814 ctx.
Write(itemQBIndex);
8815 }
8816 else
8817 {
8819 }
8820
8822
8824 if (raib)
8825 {
8827 }
8828 }
8829
8830
8832 {
8833 super.AfterStoreLoad();
8834
8836 {
8838 }
8839
8841 {
8844 }
8845 }
8846
8848 {
8849 super.EEOnAfterLoad();
8850
8852 {
8854 }
8855
8858 }
8859
8861 {
8862 return false;
8863 }
8864
8865
8866
8868 {
8870 {
8871 #ifdef PLATFORM_CONSOLE
8872
8874 {
8876 if (menu)
8877 {
8879 }
8880 }
8881 #endif
8882 }
8883
8885 {
8888 }
8889
8891 {
8892 SetWeightDirty();
8894 }
8896 {
8899 }
8900
8902 {
8905
8908 }
8910 {
8914 }
8915
8916 super.OnVariablesSynchronized();
8917 }
8918
8919
8920
8922 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8923 {
8924 if (!IsServerCheck(allow_client))
8925 return false;
8926
8928 return false;
8929
8932
8933 if (value <= (min + 0.001))
8934 value = min;
8935
8936 if (value == min)
8937 {
8938 if (destroy_config)
8939 {
8940 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8941 if (dstr)
8942 {
8944 this.Delete();
8945 return true;
8946 }
8947 }
8948 else if (destroy_forced)
8949 {
8951 this.Delete();
8952 return true;
8953 }
8954
8956 }
8957
8960
8962 {
8963 EntityAI parent = GetHierarchyRoot();
8964 InventoryLocation iLoc = new InventoryLocation();
8965 GetInventory().GetCurrentInventoryLocation(iLoc);
8967 {
8968 int iLocSlot = iLoc.
GetSlot();
8970 {
8972 }
8974 {
8976 }
8977 }
8978 }
8979
8981 {
8983
8984 if (delta)
8986 }
8987
8989
8990 return false;
8991 }
8992
8993
8995 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8996 {
8998 }
8999
9001 {
9004 }
9005
9007 {
9010 }
9011
9013 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
9014 {
9015 float value_clamped = Math.Clamp(value, 0, 1);
9017 SetQuantity(result, destroy_config, destroy_forced);
9018 }
9019
9020
9023 {
9025 }
9026
9028 {
9030 }
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9042 {
9043 int slot = -1;
9044 GameInventory inventory = GetInventory();
9045 if (inventory)
9046 {
9047 InventoryLocation il = new InventoryLocation;
9050 }
9051
9053 }
9054
9056 {
9057 float quantity_max = 0;
9058
9060 {
9061 if (attSlotID != -1)
9062 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9063
9064 if (quantity_max <= 0)
9066 }
9067
9068 if (quantity_max <= 0)
9070
9071 return quantity_max;
9072 }
9073
9075 {
9077 }
9078
9080 {
9082 }
9083
9084
9086 {
9088 }
9089
9091 {
9093 }
9094
9096 {
9098 }
9099
9100
9102 {
9103
9104 float weightEx = GetWeightEx();
9105 float special = GetInventoryAndCargoWeight();
9106 return weightEx - special;
9107 }
9108
9109
9111 {
9113 }
9114
9116 {
9118 {
9119 #ifdef DEVELOPER
9120 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9121 {
9122 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9124 }
9125 #endif
9126
9128 }
9129 else if (HasEnergyManager())
9130 {
9131 #ifdef DEVELOPER
9132 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9133 {
9134 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9135 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9136 }
9137 #endif
9138 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9139 }
9140 else
9141 {
9142 #ifdef DEVELOPER
9143 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9144 {
9145 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9146 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9147 }
9148 #endif
9149 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9150 }
9151 }
9152
9155 {
9156 int item_count = 0;
9158
9159 GameInventory inventory = GetInventory();
9160 CargoBase cargo = inventory.
GetCargo();
9161 if (cargo != NULL)
9162 {
9164 }
9165
9167 for (int i = 0; i < nAttachments; ++i)
9168 {
9170 if (item)
9171 item_count += item.GetNumberOfItems();
9172 }
9173 return item_count;
9174 }
9175
9178 {
9179 float weight = 0;
9180 float wetness = 1;
9181 if (include_wetness)
9184 {
9185 weight = wetness * m_ConfigWeight;
9186 }
9188 {
9189 weight = 1;
9190 }
9191 return weight;
9192 }
9193
9194
9195
9197 {
9198 GameInventory inventory = GetInventory();
9199 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9200 {
9201 array<EntityAI> items = new array<EntityAI>;
9203 for (int i = 0; i < items.Count(); ++i)
9204 {
9206 if (item)
9207 {
9208 g_Game.ObjectDelete(item);
9209 }
9210 }
9211 }
9212 }
9213
9214
9215
9216
9218 {
9219 float energy = 0;
9220 if (HasEnergyManager())
9221 {
9222 energy = GetCompEM().GetEnergy();
9223 }
9224 return energy;
9225 }
9226
9227
9229 {
9230 super.OnEnergyConsumed();
9231
9233 }
9234
9236 {
9237 super.OnEnergyAdded();
9238
9240 }
9241
9242
9244 {
9245 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9246 {
9248 {
9249 float energy_0to1 = GetCompEM().GetEnergy0To1();
9251 }
9252 }
9253 }
9254
9255
9257 {
9258 return ConfigGetFloat("heatIsolation");
9259 }
9260
9262 {
9264 }
9265
9267 {
9268 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9269 if (
g_Game.ConfigIsExisting(paramPath))
9270 return g_Game.ConfigGetFloat(paramPath);
9271
9272 return 0.0;
9273 }
9274
9276 {
9277 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9278 if (
g_Game.ConfigIsExisting(paramPath))
9279 return g_Game.ConfigGetFloat(paramPath);
9280
9281 return 0.0;
9282 }
9283
9284 override void SetWet(
float value,
bool allow_client =
false)
9285 {
9286 if (!IsServerCheck(allow_client))
9287 return;
9288
9291
9293
9294 m_VarWet = Math.Clamp(value, min, max);
9295
9297 {
9300 }
9301 }
9302
9303 override void AddWet(
float value)
9304 {
9306 }
9307
9309 {
9311 }
9312
9314 {
9316 }
9317
9319 {
9321 }
9322
9324 {
9326 }
9327
9329 {
9331 }
9332
9334 {
9337 if (newLevel != oldLevel)
9338 {
9340 }
9341 }
9342
9344 {
9345 SetWeightDirty();
9346 }
9347
9349 {
9350 return GetWetLevelInternal(
m_VarWet);
9351 }
9352
9353
9354
9356 {
9358 }
9359
9361 {
9363 }
9364
9366 {
9368 }
9369
9371 {
9373 }
9374
9375
9376
9378 {
9379 if (ConfigIsExisting("itemModelLength"))
9380 {
9381 return ConfigGetFloat("itemModelLength");
9382 }
9383 return 0;
9384 }
9385
9387 {
9388 if (ConfigIsExisting("itemAttachOffset"))
9389 {
9390 return ConfigGetFloat("itemAttachOffset");
9391 }
9392 return 0;
9393 }
9394
9395 override void SetCleanness(
int value,
bool allow_client =
false)
9396 {
9397 if (!IsServerCheck(allow_client))
9398 return;
9399
9401
9403
9406 }
9407
9409 {
9411 }
9412
9414 {
9415 return true;
9416 }
9417
9418
9419
9420
9422 {
9424 }
9425
9427 {
9429 }
9430
9431
9432
9433
9434 override void SetColor(
int r,
int g,
int b,
int a)
9435 {
9441 }
9443 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9444 {
9449 }
9450
9452 {
9454 }
9455
9458 {
9459 int r,g,b,a;
9461 r = r/255;
9462 g = g/255;
9463 b = b/255;
9464 a = a/255;
9465 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9466 }
9467
9468
9469
9470 override void SetLiquidType(
int value,
bool allow_client =
false)
9471 {
9472 if (!IsServerCheck(allow_client))
9473 return;
9474
9479 }
9480
9482 {
9483 return ConfigGetInt("varLiquidTypeInit");
9484 }
9485
9487 {
9489 }
9490
9492 {
9494 SetFrozen(false);
9495 }
9496
9499 {
9500 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9501 }
9502
9503
9506 {
9507 PlayerBase nplayer;
9508 if (PlayerBase.CastTo(nplayer, player))
9509 {
9511 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9512 }
9513 }
9514
9515
9518 {
9519 PlayerBase nplayer;
9520 if (PlayerBase.CastTo(nplayer,player))
9521 {
9522 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9523 }
9524
9525 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9526
9527 if (HasEnergyManager())
9528 {
9529 GetCompEM().UpdatePlugState();
9530 }
9531 }
9532
9533
9535 {
9536 super.OnPlacementStarted(player);
9537
9539 }
9540
9541 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9542 {
9544 {
9545 m_AdminLog.OnPlacementComplete(player,
this);
9546 }
9547
9548 super.OnPlacementComplete(player, position, orientation);
9549 }
9550
9551
9552
9553
9554
9556 {
9558 {
9559 return true;
9560 }
9561 else
9562 {
9563 return false;
9564 }
9565 }
9566
9567
9569 {
9571 {
9573 }
9574 }
9575
9576
9578 {
9580 }
9581
9583 {
9585 }
9586
9587 override void InsertAgent(
int agent,
float count = 1)
9588 {
9589 if (count < 1)
9590 return;
9591
9593 }
9594
9597 {
9599 }
9600
9601
9603 {
9605 }
9606
9607
9608
9609
9610
9611
9612
9613
9614
9615
9616
9617
9618
9619
9620
9621
9622
9623
9624
9625
9626
9627
9628
9629
9630
9631
9632
9633
9634
9635
9636
9637
9638
9639
9640
9641
9642
9643
9644
9645
9646
9647
9649 {
9651 return false;
9652 return true;
9653 }
9654
9656 {
9657
9659 }
9660
9661
9664 {
9665 super.CheckForRoofLimited(timeTresholdMS);
9666
9667 float time =
g_Game.GetTime();
9668 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9669 {
9670 m_PreviousRoofTestTime = time;
9671 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9672 }
9673 }
9674
9675
9677 {
9679 {
9680 return 0;
9681 }
9682
9683 if (GetInventory().GetAttachmentSlotsCount() != 0)
9684 {
9685 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9686 if (filter)
9687 return filter.GetProtectionLevel(type, false, system);
9688 else
9689 return 0;
9690 }
9691
9692 string subclassPath, entryName;
9693
9694 switch (type)
9695 {
9697 entryName = "biological";
9698 break;
9700 entryName = "chemical";
9701 break;
9702 default:
9703 entryName = "biological";
9704 break;
9705 }
9706
9707 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9708
9709 return g_Game.ConfigGetFloat(subclassPath + entryName);
9710 }
9711
9712
9713
9716 {
9717 if (!IsMagazine())
9719
9721 }
9722
9723
9724
9725
9726
9731 {
9732 return true;
9733 }
9734
9736 {
9738 }
9739
9740
9741
9742
9743
9745 {
9746 if (parent)
9747 {
9748 if (parent.IsInherited(DayZInfected))
9749 return true;
9750
9751 if (!parent.IsRuined())
9752 return true;
9753 }
9754
9755 return true;
9756 }
9757
9759 {
9760 if (!super.CanPutAsAttachment(parent))
9761 {
9762 return false;
9763 }
9764
9765 if (!IsRuined() && !parent.IsRuined())
9766 {
9767 return true;
9768 }
9769
9770 return false;
9771 }
9772
9774 {
9775
9776
9777
9778
9779 return super.CanReceiveItemIntoCargo(item);
9780 }
9781
9783 {
9784
9785
9786
9787
9788 GameInventory attachmentInv = attachment.GetInventory();
9790 {
9791 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9792 return false;
9793 }
9794
9795 InventoryLocation loc = new InventoryLocation();
9796 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9797 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9798 return false;
9799
9800 return super.CanReceiveAttachment(attachment, slotId);
9801 }
9802
9804 {
9805 if (!super.CanReleaseAttachment(attachment))
9806 return false;
9807
9808 return GetInventory().AreChildrenAccessible();
9809 }
9810
9811
9812
9813
9814
9815
9816
9817
9818
9819
9820
9821
9822
9823
9824
9825
9826
9827
9828
9829
9830
9832 {
9833 int id = muzzle_owner.GetMuzzleID();
9834 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9835
9836 if (WPOF_array)
9837 {
9838 for (int i = 0; i < WPOF_array.Count(); i++)
9839 {
9840 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9841
9842 if (WPOF)
9843 {
9844 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9845 }
9846 }
9847 }
9848 }
9849
9850
9852 {
9853 int id = muzzle_owner.GetMuzzleID();
9855
9856 if (WPOBE_array)
9857 {
9858 for (int i = 0; i < WPOBE_array.Count(); i++)
9859 {
9860 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9861
9862 if (WPOBE)
9863 {
9864 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9865 }
9866 }
9867 }
9868 }
9869
9870
9872 {
9873 int id = muzzle_owner.GetMuzzleID();
9874 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9875
9876 if (WPOOH_array)
9877 {
9878 for (int i = 0; i < WPOOH_array.Count(); i++)
9879 {
9880 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9881
9882 if (WPOOH)
9883 {
9884 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9885 }
9886 }
9887 }
9888 }
9889
9890
9892 {
9893 int id = muzzle_owner.GetMuzzleID();
9894 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9895
9896 if (WPOOH_array)
9897 {
9898 for (int i = 0; i < WPOOH_array.Count(); i++)
9899 {
9900 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9901
9902 if (WPOOH)
9903 {
9904 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9905 }
9906 }
9907 }
9908 }
9909
9910
9912 {
9913 int id = muzzle_owner.GetMuzzleID();
9914 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9915
9916 if (WPOOH_array)
9917 {
9918 for (int i = 0; i < WPOOH_array.Count(); i++)
9919 {
9920 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9921
9922 if (WPOOH)
9923 {
9924 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9925 }
9926 }
9927 }
9928 }
9929
9930
9931
9933 {
9935 {
9936 return true;
9937 }
9938
9939 return false;
9940 }
9941
9943 {
9945 {
9946 return true;
9947 }
9948
9949 return false;
9950 }
9951
9953 {
9955 {
9956 return true;
9957 }
9958
9959 return false;
9960 }
9961
9963 {
9964 return false;
9965 }
9966
9969 {
9970 return UATimeSpent.DEFAULT_DEPLOY;
9971 }
9972
9973
9974
9975
9977 {
9979 SetSynchDirty();
9980 }
9981
9983 {
9985 }
9986
9987
9989 {
9990 return false;
9991 }
9992
9995 {
9996 string att_type = "None";
9997
9998 if (ConfigIsExisting("soundAttType"))
9999 {
10000 att_type = ConfigGetString("soundAttType");
10001 }
10002
10004 }
10005
10007 {
10009 }
10010
10011
10012
10013
10014
10020
10022 {
10025
10027 }
10028
10029
10031 {
10033 return;
10034
10036
10039
10042
10043 SoundParameters params = new SoundParameters();
10047 }
10048
10049
10051 {
10053 {
10056
10057 SetSynchDirty();
10058
10061 }
10062 }
10063
10065 {
10067 }
10068
10069
10071 {
10073 return;
10074
10076 SetSynchDirty();
10077
10080 }
10081
10083 {
10086 }
10087
10089 {
10091 }
10092
10093 void OnApply(PlayerBase player);
10094
10096 {
10097 return 1.0;
10098 };
10099
10101 {
10103 }
10104
10106 {
10108 }
10109
10111
10113 {
10114 SetDynamicPhysicsLifeTime(0.01);
10116 }
10117
10119 {
10120 array<string> zone_names = new array<string>;
10121 GetDamageZones(zone_names);
10122 for (int i = 0; i < zone_names.Count(); i++)
10123 {
10124 SetHealthMax(zone_names.Get(i),"Health");
10125 }
10126 SetHealthMax("","Health");
10127 }
10128
10131 {
10132 float global_health = GetHealth01("","Health");
10133 array<string> zones = new array<string>;
10134 GetDamageZones(zones);
10135
10136 for (int i = 0; i < zones.Count(); i++)
10137 {
10138 SetHealth01(zones.Get(i),"Health",global_health);
10139 }
10140 }
10141
10144 {
10145 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10146 }
10147
10149 {
10150 if (!hasRootAsPlayer)
10151 {
10152 if (refParentIB)
10153 {
10154
10155 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10156 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10157
10158 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10159 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10160
10163 }
10164 else
10165 {
10166
10169 }
10170 }
10171 }
10172
10174 {
10176 {
10177 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10178 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10179 {
10180 float heatPermCoef = 1.0;
10182 while (ent)
10183 {
10184 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10185 ent = ent.GetHierarchyParent();
10186 }
10187
10188 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10189 }
10190 }
10191 }
10192
10194 {
10195
10196 EntityAI parent = GetHierarchyParent();
10197 if (!parent)
10198 {
10199 hasParent = false;
10200 hasRootAsPlayer = false;
10201 }
10202 else
10203 {
10204 hasParent = true;
10205 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10206 refParentIB =
ItemBase.Cast(parent);
10207 }
10208 }
10209
10210 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10211 {
10212
10213 }
10214
10216 {
10217
10218 return false;
10219 }
10220
10222 {
10223
10224
10225 return false;
10226 }
10227
10229 {
10230
10231 return false;
10232 }
10233
10236 {
10237 return !GetIsFrozen() &&
IsOpen();
10238 }
10239
10241 {
10242 bool hasParent = false, hasRootAsPlayer = false;
10244
10245 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10246 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10247
10248 if (wwtu || foodDecay)
10249 {
10253
10254 if (processWetness || processTemperature || processDecay)
10255 {
10257
10258 if (processWetness)
10259 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10260
10261 if (processTemperature)
10263
10264 if (processDecay)
10265 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10266 }
10267 }
10268 }
10269
10272 {
10274 }
10275
10277 {
10280
10281 return super.GetTemperatureFreezeThreshold();
10282 }
10283
10285 {
10288
10289 return super.GetTemperatureThawThreshold();
10290 }
10291
10293 {
10296
10297 return super.GetItemOverheatThreshold();
10298 }
10299
10301 {
10303 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10304
10305 return super.GetTemperatureFreezeTime();
10306 }
10307
10309 {
10311 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10312
10313 return super.GetTemperatureThawTime();
10314 }
10315
10320
10322 {
10323 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10324 }
10325
10327 {
10328 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10329 }
10330
10333 {
10335 }
10336
10338 {
10340 }
10341
10343 {
10345 }
10346
10349 {
10350 return null;
10351 }
10352
10355 {
10356 return false;
10357 }
10358
10360 {
10362 {
10365 if (!trg)
10366 {
10368 explosive = this;
10369 }
10370
10371 explosive.PairRemote(trg);
10373
10374 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10375 trg.SetPersistentPairID(persistentID);
10376 explosive.SetPersistentPairID(persistentID);
10377
10378 return true;
10379 }
10380 return false;
10381 }
10382
10385 {
10386 float ret = 1.0;
10389 ret *= GetHealth01();
10390
10391 return ret;
10392 }
10393
10394 #ifdef DEVELOPER
10395 override void SetDebugItem()
10396 {
10397 super.SetDebugItem();
10398 _itemBase = this;
10399 }
10400
10402 {
10403 string text = super.GetDebugText();
10404
10406 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10407
10408 return text;
10409 }
10410 #endif
10411
10413 {
10414 return true;
10415 }
10416
10418
10420
10422 {
10425 }
10426
10427
10435
10451
10452 [
Obsolete(
"Use ItemSoundHandler instead")]
10455 {
10456 if (!
g_Game.IsDedicatedServer())
10457 {
10458 if (ConfigIsExisting("attachSoundSet"))
10459 {
10460 string cfg_path = "";
10461 string soundset = "";
10462 string type_name =
GetType();
10463
10466 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10467 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10468
10469 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10470 {
10471 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10472 {
10473 if (cfg_slot_array[i] == slot_type)
10474 {
10475 soundset = cfg_soundset_array[i];
10476 break;
10477 }
10478 }
10479 }
10480
10481 if (soundset != "")
10482 {
10483 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10485 }
10486 }
10487 }
10488 }
10489
10491}
10492
10494{
10496 if (entity)
10497 {
10498 bool is_item = entity.IsInherited(
ItemBase);
10499 if (is_item && full_quantity)
10500 {
10503 }
10504 }
10505 else
10506 {
10508 return NULL;
10509 }
10510 return entity;
10511}
10512
10514{
10515 if (item)
10516 {
10517 if (health > 0)
10518 item.SetHealth("", "", health);
10519
10520 if (item.CanHaveTemperature())
10521 {
10523 if (item.CanFreeze())
10524 item.SetFrozen(false);
10525 }
10526
10527 if (item.HasEnergyManager())
10528 {
10529 if (quantity >= 0)
10530 {
10531 item.GetCompEM().SetEnergy0To1(quantity);
10532 }
10533 else
10534 {
10536 }
10537 }
10538 else if (item.IsMagazine())
10539 {
10540 Magazine mag = Magazine.Cast(item);
10541 if (quantity >= 0)
10542 {
10543 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10544 }
10545 else
10546 {
10548 }
10549
10550 }
10551 else
10552 {
10553 if (quantity >= 0)
10554 {
10555 item.SetQuantityNormalized(quantity, false);
10556 }
10557 else
10558 {
10560 }
10561
10562 }
10563 }
10564}
10565
10566#ifdef DEVELOPER
10568#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.