5524{
5526 {
5527 return true;
5528 }
5529};
5530
5532{
5533
5534};
5535
5536
5537
5539{
5543
5545
5548
5549
5550
5551
5552
5561
5567
5572
5577
5598 protected bool m_IsResultOfSplit
5599
5601
5606
5607
5608
5610
5614
5615
5616
5618
5621
5622
5623
5629
5630
5638
5641
5642
5644
5645
5647
5648
5653
5654
5659
5661
5662
5664
5665
5667 {
5672
5673 if (!
g_Game.IsDedicatedServer())
5674 {
5676 {
5678
5680 {
5682 }
5683 }
5684
5687 }
5688
5689 m_OldLocation = null;
5690
5692 {
5694 }
5695
5696 if (ConfigIsExisting("headSelectionsToHide"))
5697 {
5700 }
5701
5703 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5704 {
5706 }
5707
5709
5710 m_IsResultOfSplit = false;
5711
5713 }
5714
5716 {
5717 super.InitItemVariables();
5718
5724 m_Count = ConfigGetInt(
"count");
5725
5728
5733
5736
5741
5753
5757
5758
5761 if (ConfigIsExisting("canBeSplit"))
5762 {
5765 }
5766
5768 if (ConfigIsExisting("itemBehaviour"))
5770
5771
5774 RegisterNetSyncVariableInt("m_VarLiquidType");
5775 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5776
5777 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5778 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5779 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5780
5781 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5782 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5783 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5784 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5785
5786 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5787 RegisterNetSyncVariableBool("m_IsTakeable");
5788 RegisterNetSyncVariableBool("m_IsHologram");
5789
5792 {
5795 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5796 }
5797
5799
5801 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5803
5805 }
5806
5808 {
5810 }
5811
5813 {
5816 {
5821 }
5822 }
5823
5824 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5825 {
5827 {
5830 }
5831
5833 }
5834
5836 {
5842 }
5843
5845
5847 {
5849
5850 if (!action)
5851 {
5852 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5853 return;
5854 }
5855
5857 if (!ai)
5858 {
5860 return;
5861 }
5862
5864 if (!action_array)
5865 {
5866 action_array = new array<ActionBase_Basic>;
5868 }
5869 if (LogManager.IsActionLogEnable())
5870 {
5871 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5872 }
5873
5874 if (action_array.Find(action) != -1)
5875 {
5876 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5877 }
5878 else
5879 {
5880 action_array.Insert(action);
5881 }
5882 }
5883
5885 {
5886 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5887 ActionBase action = player.GetActionManager().GetAction(actionName);
5890
5891 if (action_array)
5892 {
5893 action_array.RemoveItem(action);
5894 }
5895 }
5896
5897
5898
5900 {
5901 ActionOverrideData overrideData = new ActionOverrideData();
5905
5907 if (!actionMap)
5908 {
5911 }
5912
5913 actionMap.Insert(this.
Type(), overrideData);
5914
5915 }
5916
5918
5920
5921
5923 {
5926
5929
5930 string config_to_search = "CfgVehicles";
5931 string muzzle_owner_config;
5932
5934 {
5935 if (IsInherited(Weapon))
5936 config_to_search = "CfgWeapons";
5937
5938 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5939
5940 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5941
5942 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
5943
5944 if (config_OnFire_subclass_count > 0)
5945 {
5946 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5947
5948 for (int i = 0; i < config_OnFire_subclass_count; i++)
5949 {
5950 string particle_class = "";
5951 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
5952 string config_OnFire_entry = config_OnFire_class + particle_class;
5953 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5954 WPOF_array.Insert(WPOF);
5955 }
5956
5957
5959 }
5960 }
5961
5963 {
5964 config_to_search = "CfgWeapons";
5965 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5966
5967 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5968
5969 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5970
5971 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5972 {
5973 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5974
5975 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5976 {
5977 string particle_class2 = "";
5978 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5979 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5980 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5981 WPOBE_array.Insert(WPOBE);
5982 }
5983
5984
5986 }
5987 }
5988 }
5989
5990
5992 {
5995
5997 {
5998 string config_to_search = "CfgVehicles";
5999
6000 if (IsInherited(Weapon))
6001 config_to_search = "CfgWeapons";
6002
6003 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6004 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6005
6006 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6007 {
6008
6010
6012 {
6014 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6016 return;
6017 }
6018
6021
6022
6023
6024 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6025 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6026
6027 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6028 {
6029 string particle_class = "";
6030 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6031 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6032 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6033
6034 if (entry_type == CT_CLASS)
6035 {
6036 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6037 WPOOH_array.Insert(WPOF);
6038 }
6039 }
6040
6041
6043 }
6044 }
6045 }
6046
6048 {
6050 }
6051
6053 {
6055 {
6057
6060
6063
6064 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6065 }
6066 }
6067
6069 {
6071 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6072
6074 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6075
6077 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6078
6080 {
6082 }
6083 }
6084
6086 {
6088 }
6089
6091 {
6094 else
6096
6098 {
6101 }
6102 else
6103 {
6106
6109 }
6110
6112 }
6113
6115 {
6117 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6118 }
6119
6121 {
6123 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6125 }
6126
6128 {
6130 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6131 }
6132
6134 {
6137
6138 OverheatingParticle OP = new OverheatingParticle();
6143
6145 }
6146
6148 {
6151
6152 return -1;
6153 }
6154
6156 {
6158 {
6161
6162 for (int i = count; i > 0; --i)
6163 {
6164 int id = i - 1;
6167
6170
6171 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6172 {
6173 if (p)
6174 {
6177 }
6178 }
6179 }
6180 }
6181 }
6182
6184 {
6186 {
6188 {
6189 int id = i - 1;
6191
6192 if (OP)
6193 {
6195
6196 if (p)
6197 {
6199 }
6200
6201 delete OP;
6202 }
6203 }
6204
6207 }
6208 }
6209
6212 {
6213 return 0.0;
6214 }
6215
6216
6218 {
6219 return 250;
6220 }
6221
6223 {
6224 return 0;
6225 }
6226
6229 {
6231 return true;
6232
6233 return false;
6234 }
6235
6238 {
6241
6243 {
6245 }
6246 else
6247 {
6248
6250 }
6251
6253 }
6254
6261 {
6262 return -1;
6263 }
6264
6265
6266
6267
6269 {
6271 {
6272 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6273 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6274
6275 if (r_index >= 0)
6276 {
6277 InventoryLocation r_il = new InventoryLocation;
6278 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6279
6280 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6283 {
6284 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6285 }
6287 {
6288 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6289 }
6290
6291 }
6292
6293 player.GetHumanInventory().ClearUserReservedLocation(this);
6294 }
6295
6298 }
6299
6300
6301
6302
6304 {
6305 return ItemBase.m_DebugActionsMask;
6306 }
6307
6309 {
6310 return ItemBase.m_DebugActionsMask & mask;
6311 }
6312
6314 {
6315 ItemBase.m_DebugActionsMask = mask;
6316 }
6317
6319 {
6320 ItemBase.m_DebugActionsMask |= mask;
6321 }
6322
6324 {
6325 ItemBase.m_DebugActionsMask &= ~mask;
6326 }
6327
6329 {
6331 {
6333 }
6334 else
6335 {
6337 }
6338 }
6339
6340
6342 {
6343 if (GetEconomyProfile())
6344 {
6345 float q_max = GetEconomyProfile().GetQuantityMax();
6346 if (q_max > 0)
6347 {
6348 float q_min = GetEconomyProfile().GetQuantityMin();
6349 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6350
6352 {
6353 ComponentEnergyManager comp = GetCompEM();
6355 {
6357 }
6358 }
6360 {
6362
6363 }
6364
6365 }
6366 }
6367 }
6368
6371 {
6372 EntityAI parent = GetHierarchyParent();
6373
6374 if (parent)
6375 {
6376 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6377 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6378 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6379 }
6380 }
6381
6384 {
6385 EntityAI parent = GetHierarchyParent();
6386
6387 if (parent)
6388 {
6389 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6390 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6391 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6392 }
6393 }
6394
6396 {
6397
6398
6399
6400
6402
6404 {
6405 if (ScriptInputUserData.CanStoreInputUserData())
6406 {
6407 ScriptInputUserData ctx = new ScriptInputUserData;
6413 ctx.
Write(use_stack_max);
6416
6418 {
6419 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6420 }
6421 }
6422 }
6423 else if (!
g_Game.IsMultiplayer())
6424 {
6426 }
6427 }
6428
6430 {
6432 }
6433
6435 {
6437 }
6438
6440 {
6442 }
6443
6445 {
6446
6447 return false;
6448 }
6449
6451 {
6452 return false;
6453 }
6454
6458 {
6459 return false;
6460 }
6461
6463 {
6464 return "";
6465 }
6466
6468
6470 {
6471 return false;
6472 }
6473
6475 {
6476 return true;
6477 }
6478
6479
6480
6482 {
6483 return true;
6484 }
6485
6487 {
6488 return true;
6489 }
6490
6492 {
6493 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6495 }
6496
6498 {
6500 }
6501
6503 {
6505 if (!is_being_placed)
6507 SetSynchDirty();
6508 }
6509
6510
6512
6514 {
6516 }
6517
6519 {
6521 }
6522
6524 {
6525 return 1;
6526 }
6527
6529 {
6530 return false;
6531 }
6532
6534 {
6536 SetSynchDirty();
6537 }
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6559
6560
6561
6562
6563
6564
6565
6566
6567
6568
6569
6570
6571
6572
6574 {
6575 super.OnMovedInsideCargo(container);
6576
6577 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6578 }
6579
6580 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6581 {
6582 super.EEItemLocationChanged(oldLoc, newLoc);
6583
6584 PlayerBase newPlayer = null;
6585 PlayerBase oldPlayer = null;
6586
6587 if (newLoc.GetParent())
6588 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6589
6590 if (oldLoc.GetParent())
6591 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6592
6594 {
6595 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6596
6597 if (rIndex >= 0)
6598 {
6599 InventoryLocation rIl = new InventoryLocation;
6600 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6601
6602 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6605 {
6606 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6607 }
6609 {
6611 }
6612
6613 }
6614 }
6615
6617 {
6618 if (newPlayer)
6619 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6620
6621 if (newPlayer == oldPlayer)
6622 {
6623 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6624 {
6626 {
6627 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6628 {
6629 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6630 }
6631 }
6632 else
6633 {
6634 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6635 }
6636 }
6637
6638 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6639 {
6640 int type = oldLoc.GetType();
6642 {
6643 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6644 }
6646 {
6647 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6648 }
6649 }
6650 if (!m_OldLocation)
6651 {
6652 m_OldLocation = new InventoryLocation;
6653 }
6654 m_OldLocation.Copy(oldLoc);
6655 }
6656 else
6657 {
6658 if (m_OldLocation)
6659 {
6660 m_OldLocation.Reset();
6661 }
6662 }
6663
6664 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6665 }
6666 else
6667 {
6668 if (newPlayer)
6669 {
6670 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6671 if (resIndex >= 0)
6672 {
6673 InventoryLocation il = new InventoryLocation;
6674 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6676 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6679 {
6680 il.
GetParent().GetOnReleaseLock().Invoke(it);
6681 }
6683 {
6685 }
6686
6687 }
6688 }
6690 {
6691
6693 }
6694
6695 if (m_OldLocation)
6696 {
6697 m_OldLocation.Reset();
6698 }
6699 }
6700
6702 {
6703 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6704 }
6705
6707 {
6708 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6709 }
6710 }
6711
6712 override void EOnContact(IEntity other, Contact extra)
6713 {
6715 {
6716 int liquidType = -1;
6718 if (impactSpeed > 0.0)
6719 {
6721 #ifndef SERVER
6723 #else
6725 SetSynchDirty();
6726 #endif
6728 }
6729 }
6730
6731 #ifdef SERVER
6732 if (GetCompEM() && GetCompEM().IsPlugged())
6733 {
6734 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6735 GetCompEM().UnplugThis();
6736 }
6737 #endif
6738 }
6739
6741
6743 {
6745 }
6746
6748 {
6749
6750 }
6751
6753 {
6754 super.OnItemLocationChanged(old_owner, new_owner);
6755
6756 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6757 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6758
6759 if (!relatedPlayer && playerNew)
6760 relatedPlayer = playerNew;
6761
6762 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6763 {
6765 if (actionMgr)
6766 {
6767 ActionBase currentAction = actionMgr.GetRunningAction();
6768 if (currentAction)
6770 }
6771 }
6772
6773 Man ownerPlayerOld = null;
6774 Man ownerPlayerNew = null;
6775
6776 if (old_owner)
6777 {
6778 if (old_owner.
IsMan())
6779 {
6780 ownerPlayerOld = Man.Cast(old_owner);
6781 }
6782 else
6783 {
6784 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6785 }
6786 }
6787 else
6788 {
6790 {
6792
6793 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6794 {
6795 GetCompEM().UnplugThis();
6796 }
6797 }
6798 }
6799
6800 if (new_owner)
6801 {
6802 if (new_owner.
IsMan())
6803 {
6804 ownerPlayerNew = Man.Cast(new_owner);
6805 }
6806 else
6807 {
6808 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6809 }
6810 }
6811
6812 if (ownerPlayerOld != ownerPlayerNew)
6813 {
6814 if (ownerPlayerOld)
6815 {
6816 array<EntityAI> subItemsExit = new array<EntityAI>;
6818 for (int i = 0; i < subItemsExit.Count(); i++)
6819 {
6822 }
6823 }
6824
6825 if (ownerPlayerNew)
6826 {
6827 array<EntityAI> subItemsEnter = new array<EntityAI>;
6829 for (int j = 0; j < subItemsEnter.Count(); j++)
6830 {
6833 }
6834 }
6835 }
6836 else if (ownerPlayerNew != null)
6837 {
6838 PlayerBase nplayer;
6839 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6840 {
6841 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6843 for (int k = 0; k < subItemsUpdate.Count(); k++)
6844 {
6846 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6847 }
6848 }
6849 }
6850
6851 if (old_owner)
6852 old_owner.OnChildItemRemoved(this);
6853 if (new_owner)
6854 new_owner.OnChildItemReceived(this);
6855 }
6856
6857
6859 {
6860 super.EEDelete(parent);
6861 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6862 if (player)
6863 {
6865
6866 if (player.IsAlive())
6867 {
6868 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6869 if (r_index >= 0)
6870 {
6871 InventoryLocation r_il = new InventoryLocation;
6872 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6873
6874 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6877 {
6878 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6879 }
6881 {
6882 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6883 }
6884
6885 }
6886
6887 player.RemoveQuickBarEntityShortcut(this);
6888 }
6889 }
6890 }
6891
6893 {
6894 super.EEKilled(killer);
6895
6898 {
6899 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6900 {
6901 if (IsMagazine())
6902 {
6903 if (Magazine.Cast(this).GetAmmoCount() > 0)
6904 {
6906 }
6907 }
6908 else
6909 {
6911 }
6912 }
6913 }
6914 }
6915
6917 {
6918 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6919
6920 super.OnWasAttached(parent, slot_id);
6921
6924
6927 }
6928
6930 {
6931 super.OnWasDetached(parent, slot_id);
6932
6935
6938 }
6939
6941 {
6942 int idx;
6945
6946 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6947 if (inventory_slots.Count() < 1)
6948 {
6949 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6950 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6951 }
6952 else
6953 {
6954 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6955 }
6956
6957 idx = inventory_slots.Find(slot);
6958 if (idx < 0)
6959 return "";
6960
6961 return attach_types.Get(idx);
6962 }
6963
6965 {
6966 int idx = -1;
6967 string slot;
6968
6971
6972 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6973 if (inventory_slots.Count() < 1)
6974 {
6975 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6976 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6977 }
6978 else
6979 {
6980 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6981 if (detach_types.Count() < 1)
6982 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6983 }
6984
6985 for (int i = 0; i < inventory_slots.Count(); i++)
6986 {
6987 slot = inventory_slots.Get(i);
6988 }
6989
6990 if (slot != "")
6991 {
6992 if (detach_types.Count() == 1)
6993 idx = 0;
6994 else
6995 idx = inventory_slots.Find(slot);
6996 }
6997 if (idx < 0)
6998 return "";
6999
7000 return detach_types.Get(idx);
7001 }
7002
7004 {
7005
7007
7008
7009 float min_time = 1;
7010 float max_time = 3;
7011 float delay = Math.RandomFloat(min_time, max_time);
7012
7013 explode_timer.Run(delay, this, "DoAmmoExplosion");
7014 }
7015
7017 {
7018 Magazine magazine = Magazine.Cast(this);
7019 int pop_sounds_count = 6;
7020 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7021
7022
7023 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7024 string sound_name = pop_sounds[ sound_idx ];
7025 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7026
7027
7028 magazine.ServerAddAmmoCount(-1);
7029
7030
7031 float min_temp_to_explode = 100;
7032
7033 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7034 {
7036 }
7037 }
7038
7039
7040 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7041 {
7042 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7043
7044 const int CHANCE_DAMAGE_CARGO = 4;
7045 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7046 const int CHANCE_DAMAGE_NOTHING = 2;
7047
7049 {
7050 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7051 int chances;
7052 int rnd;
7053
7054 if (GetInventory().GetCargo())
7055 {
7056 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7057 rnd = Math.RandomInt(0,chances);
7058
7059 if (rnd < CHANCE_DAMAGE_CARGO)
7060 {
7062 }
7063 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7064 {
7066 }
7067 }
7068 else
7069 {
7070 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7071 rnd = Math.RandomInt(0,chances);
7072
7073 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7074 {
7076 }
7077 }
7078 }
7079 }
7080
7082 {
7083 CargoBase cargo = GetInventory().GetCargo();
7084 if (cargo)
7085 {
7087 if (item_count > 0)
7088 {
7089 int random_pick = Math.RandomInt(0, item_count);
7091 if (!item.IsExplosive())
7092 {
7093 item.AddHealth("","",damage);
7094 return true;
7095 }
7096 }
7097 }
7098 return false;
7099 }
7100
7102 {
7103 GameInventory inventory = GetInventory();
7105 if (attachment_count > 0)
7106 {
7107 int random_pick = Math.RandomInt(0, attachment_count);
7109 if (!attachment.IsExplosive())
7110 {
7111 attachment.AddHealth("","",damage);
7112 return true;
7113 }
7114 }
7115 return false;
7116 }
7117
7119 {
7121 }
7122
7124 {
7126 return GetInventory().CanRemoveEntity();
7127
7128 return false;
7129 }
7130
7132 {
7133
7135 return false;
7136
7137
7139 return false;
7140
7141
7142
7144 if (delta == 0)
7145 return false;
7146
7147
7148 return true;
7149 }
7150
7152 {
7154 {
7155 if (ScriptInputUserData.CanStoreInputUserData())
7156 {
7157 ScriptInputUserData ctx = new ScriptInputUserData;
7162 ctx.
Write(destination_entity);
7166 }
7167 }
7168 else if (!
g_Game.IsMultiplayer())
7169 {
7171 }
7172 }
7173
7175 {
7176 float split_quantity_new;
7180 InventoryLocation loc = new InventoryLocation;
7181
7182 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7183 {
7185 split_quantity_new = stack_max;
7186 else
7188
7190 {
7191 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7192 if (new_item)
7193 {
7194 new_item.SetResultOfSplit(true);
7195 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7197 new_item.
SetQuantity(split_quantity_new,
false,
true);
7198 }
7199 }
7200 }
7201 else if (destination_entity && slot_id == -1)
7202 {
7203 if (quantity > stack_max)
7204 split_quantity_new = stack_max;
7205 else
7206 split_quantity_new = quantity;
7207
7209 {
7210 GameInventory destinationInventory = destination_entity.GetInventory();
7212 {
7215 }
7216
7217 if (new_item)
7218 {
7219 new_item.SetResultOfSplit(true);
7220 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7222 new_item.
SetQuantity(split_quantity_new,
false,
true);
7223 }
7224 }
7225 }
7226 else
7227 {
7228 if (stack_max != 0)
7229 {
7231 {
7233 }
7234
7235 if (split_quantity_new == 0)
7236 {
7237 if (!
g_Game.IsMultiplayer())
7238 player.PhysicalPredictiveDropItem(this);
7239 else
7240 player.ServerDropEntity(this);
7241 return;
7242 }
7243
7245 {
7247
7248 if (new_item)
7249 {
7250 new_item.SetResultOfSplit(true);
7251 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7254 new_item.PlaceOnSurface();
7255 }
7256 }
7257 }
7258 }
7259 }
7260
7262 {
7263 float split_quantity_new;
7267 InventoryLocation loc = new InventoryLocation;
7268
7269 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7270 {
7272 split_quantity_new = stack_max;
7273 else
7275
7277 {
7278 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7279 if (new_item)
7280 {
7281 new_item.SetResultOfSplit(true);
7282 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7284 new_item.
SetQuantity(split_quantity_new,
false,
true);
7285 }
7286 }
7287 }
7288 else if (destination_entity && slot_id == -1)
7289 {
7290 if (quantity > stack_max)
7291 split_quantity_new = stack_max;
7292 else
7293 split_quantity_new = quantity;
7294
7296 {
7297 GameInventory destinationInventory = destination_entity.GetInventory();
7299 {
7302 }
7303
7304 if (new_item)
7305 {
7306 new_item.SetResultOfSplit(true);
7307 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7309 new_item.
SetQuantity(split_quantity_new,
false,
true);
7310 }
7311 }
7312 }
7313 else
7314 {
7315 if (stack_max != 0)
7316 {
7318 {
7320 }
7321
7323 {
7325
7326 if (new_item)
7327 {
7328 new_item.SetResultOfSplit(true);
7329 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7332 new_item.PlaceOnSurface();
7333 }
7334 }
7335 }
7336 }
7337 }
7338
7340 {
7342 {
7343 if (ScriptInputUserData.CanStoreInputUserData())
7344 {
7345 ScriptInputUserData ctx = new ScriptInputUserData;
7350 dst.WriteToContext(ctx);
7352 }
7353 }
7354 else if (!
g_Game.IsMultiplayer())
7355 {
7357 }
7358 }
7359
7361 {
7363 {
7364 if (ScriptInputUserData.CanStoreInputUserData())
7365 {
7366 ScriptInputUserData ctx = new ScriptInputUserData;
7371 ctx.
Write(destination_entity);
7377 }
7378 }
7379 else if (!
g_Game.IsMultiplayer())
7380 {
7382 }
7383 }
7384
7386 {
7388 }
7389
7391 {
7393 float split_quantity_new;
7395 if (dst.IsValid())
7396 {
7397 int slot_id = dst.GetSlot();
7399
7400 if (quantity > stack_max)
7401 split_quantity_new = stack_max;
7402 else
7403 split_quantity_new = quantity;
7404
7406 {
7408
7409 if (new_item)
7410 {
7411 new_item.SetResultOfSplit(true);
7412 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7414 new_item.
SetQuantity(split_quantity_new,
false,
true);
7415 }
7416
7417 return new_item;
7418 }
7419 }
7420
7421 return null;
7422 }
7423
7425 {
7427 float split_quantity_new;
7429 if (destination_entity)
7430 {
7432 if (quantity > stackable)
7433 split_quantity_new = stackable;
7434 else
7435 split_quantity_new = quantity;
7436
7438 {
7439 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7440 if (new_item)
7441 {
7442 new_item.SetResultOfSplit(true);
7443 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7445 new_item.
SetQuantity(split_quantity_new,
false,
true);
7446 }
7447 }
7448 }
7449 }
7450
7452 {
7454 {
7455 if (ScriptInputUserData.CanStoreInputUserData())
7456 {
7457 ScriptInputUserData ctx = new ScriptInputUserData;
7462 ItemBase destination_entity =
this;
7463 ctx.
Write(destination_entity);
7467 }
7468 }
7469 else if (!
g_Game.IsMultiplayer())
7470 {
7472 }
7473 }
7474
7476 {
7478 float split_quantity_new;
7480 if (player)
7481 {
7483 if (quantity > stackable)
7484 split_quantity_new = stackable;
7485 else
7486 split_quantity_new = quantity;
7487
7489 {
7490 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7491 new_item =
ItemBase.Cast(in_hands);
7492 if (new_item)
7493 {
7494 new_item.SetResultOfSplit(true);
7495 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7497 new_item.SetQuantity(split_quantity_new, false, true);
7498 }
7499 }
7500 }
7501 }
7502
7504 {
7506 float split_quantity_new = Math.Floor(quantity * 0.5);
7507
7509 return;
7510
7512
7513 if (new_item)
7514 {
7515 if (new_item.GetQuantityMax() < split_quantity_new)
7516 {
7517 split_quantity_new = new_item.GetQuantityMax();
7518 }
7519
7520 new_item.SetResultOfSplit(true);
7521 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7522
7524 {
7527 }
7528 else
7529 {
7531 new_item.
SetQuantity(split_quantity_new,
false,
true);
7532 }
7533 }
7534 }
7535
7537 {
7539 float split_quantity_new = Math.Floor(quantity / 2);
7540
7542 return;
7543
7544 InventoryLocation invloc = new InventoryLocation;
7546
7548 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7549
7550 if (new_item)
7551 {
7552 if (new_item.GetQuantityMax() < split_quantity_new)
7553 {
7554 split_quantity_new = new_item.GetQuantityMax();
7555 }
7557 {
7560 }
7561 else if (split_quantity_new > 1)
7562 {
7564 new_item.
SetQuantity(split_quantity_new,
false,
true);
7565 }
7566 }
7567 }
7568
7571 {
7572 SetWeightDirty();
7574
7575 if (parent)
7576 parent.OnAttachmentQuantityChangedEx(this, delta);
7577
7579 {
7581 {
7583 }
7585 {
7586 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7588 }
7589 }
7590 }
7591
7594 {
7595
7596 }
7597
7600 {
7602 }
7603
7605 {
7606 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7607
7609 {
7610 if (newLevel == GameConstants.STATE_RUINED)
7611 {
7613 EntityAI parent = GetHierarchyParent();
7614 if (parent && parent.IsFireplace())
7615 {
7616 CargoBase cargo = GetInventory().GetCargo();
7617 if (cargo)
7618 {
7620 {
7622 }
7623 }
7624 }
7625 }
7626
7628 {
7629
7631 return;
7632 }
7633
7634 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7635 {
7637 }
7638 }
7639 }
7640
7641
7643 {
7644 super.OnRightClick();
7645
7647 {
7649 {
7650 if (ScriptInputUserData.CanStoreInputUserData())
7651 {
7652 EntityAI root = GetHierarchyRoot();
7653 Man playerOwner = GetHierarchyRootPlayer();
7654 InventoryLocation dst = new InventoryLocation;
7655
7656
7657 if (!playerOwner && root && root == this)
7658 {
7660 }
7661 else
7662 {
7663
7664 GetInventory().GetCurrentInventoryLocation(dst);
7666 {
7667 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7669 {
7671 }
7672 else
7673 {
7675
7676
7677 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7678 {
7680 }
7681 else
7682 {
7683 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7684 }
7685 }
7686 }
7687 }
7688
7689 ScriptInputUserData ctx = new ScriptInputUserData;
7697 }
7698 }
7699 else if (!
g_Game.IsMultiplayer())
7700 {
7702 }
7703 }
7704 }
7705
7707 {
7708 if (root)
7709 {
7710 vector m4[4];
7711 root.GetTransform(m4);
7712 dst.SetGround(this, m4);
7713 }
7714 else
7715 {
7716 GetInventory().GetCurrentInventoryLocation(dst);
7717 }
7718 }
7719
7720 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7721 {
7722
7723 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7724 return false;
7725
7726 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7727 return false;
7728
7729
7731 return false;
7732
7733
7734 Magazine mag = Magazine.Cast(this);
7735 if (mag)
7736 {
7737 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7738 return false;
7739
7740 if (stack_max_limit)
7741 {
7742 Magazine other_mag = Magazine.Cast(other_item);
7743 if (other_item)
7744 {
7745 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7746 return false;
7747 }
7748
7749 }
7750 }
7751 else
7752 {
7753
7755 return false;
7756
7758 return false;
7759 }
7760
7761 PlayerBase player = null;
7762 if (CastTo(player, GetHierarchyRootPlayer()))
7763 {
7764 if (player.GetInventory().HasAttachment(this))
7765 return false;
7766
7767 if (player.IsItemsToDelete())
7768 return false;
7769 }
7770
7771 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7772 return false;
7773
7774 int slotID;
7776 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7777 return false;
7778
7779 return true;
7780 }
7781
7783 {
7785 }
7786
7788 {
7789 return m_IsResultOfSplit;
7790 }
7791
7793 {
7794 m_IsResultOfSplit = value;
7795 }
7796
7798 {
7800 }
7801
7803 {
7804 float other_item_quantity = other_item.GetQuantity();
7805 float this_free_space;
7806
7808
7810
7811 if (other_item_quantity > this_free_space)
7812 {
7813 return this_free_space;
7814 }
7815 else
7816 {
7817 return other_item_quantity;
7818 }
7819 }
7820
7822 {
7824 }
7825
7827 {
7829 return;
7830
7831 if (!IsMagazine() && other_item)
7832 {
7834 if (quantity_used != 0)
7835 {
7836 float hp1 = GetHealth01("","");
7837 float hp2 = other_item.GetHealth01("","");
7838 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7839 hpResult = hpResult / (
GetQuantity() + quantity_used);
7840
7841 hpResult *= GetMaxHealth();
7842 Math.Round(hpResult);
7843 SetHealth("", "Health", hpResult);
7844
7846 other_item.AddQuantity(-quantity_used);
7847 }
7848 }
7850 }
7851
7853 {
7854 #ifdef SERVER
7855 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7856 GetHierarchyParent().IncreaseLifetimeUp();
7857 #endif
7858 };
7859
7861 {
7862 PlayerBase p = PlayerBase.Cast(player);
7863
7864 array<int> recipesIds = p.m_Recipes;
7865 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7866 if (moduleRecipesManager)
7867 {
7868 EntityAI itemInHands = player.GetEntityInHands();
7869 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7870 }
7871
7872 for (int i = 0;i < recipesIds.Count(); i++)
7873 {
7874 int key = recipesIds.Get(i);
7875 string recipeName = moduleRecipesManager.GetRecipeName(key);
7877 }
7878 }
7879
7880
7881 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7882 {
7883 super.GetDebugActions(outputList);
7884
7885
7891
7892
7897
7902
7903
7907
7908
7910 {
7914 }
7915
7918
7919
7923
7925
7926 InventoryLocation loc = new InventoryLocation();
7927 GetInventory().GetCurrentInventoryLocation(loc);
7929 {
7930 if (Gizmo_IsSupported())
7933 }
7934
7936 }
7937
7938
7939
7940
7942 {
7943 super.OnAction(action_id, player, ctx);
7944
7946 {
7947 switch (action_id)
7948 {
7952 return true;
7956 return true;
7957 }
7958 }
7959
7961 {
7962 switch (action_id)
7963 {
7965 Delete();
7966 return true;
7967 }
7968 }
7969
7970 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7971 {
7972 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7973 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7974 PlayerBase p = PlayerBase.Cast(player);
7975 if (
EActions.RECIPES_RANGE_START < 1000)
7976 {
7977 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7978 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7979 }
7980 }
7981 #ifndef SERVER
7982 else if (action_id ==
EActions.WATCH_PLAYER)
7983 {
7984 PluginDeveloper.SetDeveloperItemClientEx(player);
7985 }
7986 #endif
7988 {
7989 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7990 {
7991 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7992 OnDebugButtonPressServer(id + 1);
7993 }
7994
7995 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7996 {
7997 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7999 }
8000
8001 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8002 {
8003 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8005 }
8006
8007 else if (action_id ==
EActions.ADD_QUANTITY)
8008 {
8009 if (IsMagazine())
8010 {
8011 Magazine mag = Magazine.Cast(this);
8012 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8013 }
8014 else
8015 {
8017 }
8018
8019 if (m_EM)
8020 {
8021 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8022 }
8023
8024 }
8025
8026 else if (action_id ==
EActions.REMOVE_QUANTITY)
8027 {
8028 if (IsMagazine())
8029 {
8030 Magazine mag2 = Magazine.Cast(this);
8031 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8032 }
8033 else
8034 {
8036 }
8037 if (m_EM)
8038 {
8039 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8040 }
8041
8042 }
8043
8044 else if (action_id ==
EActions.SET_QUANTITY_0)
8045 {
8047
8048 if (m_EM)
8049 {
8050 m_EM.SetEnergy(0);
8051 }
8052 }
8053
8054 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8055 {
8057
8058 if (m_EM)
8059 {
8060 m_EM.SetEnergy(m_EM.GetEnergyMax());
8061 }
8062 }
8063
8064 else if (action_id ==
EActions.ADD_HEALTH)
8065 {
8066 AddHealth("","",GetMaxHealth("","Health")/5);
8067 }
8068 else if (action_id ==
EActions.REMOVE_HEALTH)
8069 {
8070 AddHealth("","",-GetMaxHealth("","Health")/5);
8071 }
8072 else if (action_id ==
EActions.DESTROY_HEALTH)
8073 {
8074 SetHealth01("","",0);
8075 }
8076 else if (action_id ==
EActions.WATCH_ITEM)
8077 {
8079 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8080 #ifdef DEVELOPER
8081 SetDebugDeveloper_item(this);
8082 #endif
8083 }
8084
8085 else if (action_id ==
EActions.ADD_TEMPERATURE)
8086 {
8087 AddTemperature(20);
8088
8089 }
8090
8091 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8092 {
8093 AddTemperature(-20);
8094
8095 }
8096
8097 else if (action_id ==
EActions.FLIP_FROZEN)
8098 {
8099 SetFrozen(!GetIsFrozen());
8100
8101 }
8102
8103 else if (action_id ==
EActions.ADD_WETNESS)
8104 {
8106
8107 }
8108
8109 else if (action_id ==
EActions.REMOVE_WETNESS)
8110 {
8112
8113 }
8114
8115 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8116 {
8119
8120
8121 }
8122
8123 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8124 {
8127 }
8128
8129 else if (action_id ==
EActions.MAKE_SPECIAL)
8130 {
8131 auto debugParams = DebugSpawnParams.WithPlayer(player);
8132 OnDebugSpawnEx(debugParams);
8133 }
8134
8135 }
8136
8137
8138 return false;
8139 }
8140
8141
8142
8143
8147
8150
8151
8152
8154 {
8155 return false;
8156 }
8157
8158
8160 {
8161 return true;
8162 }
8163
8164
8166 {
8167 return true;
8168 }
8169
8170
8171
8173 {
8174 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8175 return g_Game.ConfigIsExisting(config_path);
8176 }
8177
8180 {
8181 return null;
8182 }
8183
8185 {
8186 return false;
8187 }
8188
8190 {
8191 return false;
8192 }
8193
8197
8198
8200 {
8201 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8202 return module_repairing.CanRepair(this, item_repair_kit);
8203 }
8204
8205
8206 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8207 {
8208 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8209 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8210 }
8211
8212
8214 {
8215
8216
8217
8218
8219
8220
8221
8222
8223 return 1;
8224 }
8225
8226
8227
8229 {
8231 }
8232
8233
8234
8236 {
8238 }
8239
8240
8249 {
8250 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8251
8252 if (player)
8253 {
8254 player.MessageStatus(text);
8255 }
8256 }
8257
8258
8267 {
8268 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8269
8270 if (player)
8271 {
8272 player.MessageAction(text);
8273 }
8274 }
8275
8276
8285 {
8286 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8287
8288 if (player)
8289 {
8290 player.MessageFriendly(text);
8291 }
8292 }
8293
8294
8303 {
8304 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8305
8306 if (player)
8307 {
8308 player.MessageImportant(text);
8309 }
8310 }
8311
8313 {
8314 return true;
8315 }
8316
8317
8318 override bool KindOf(
string tag)
8319 {
8320 bool found = false;
8321 string item_name = this.
GetType();
8323 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8324
8325 int array_size = item_tag_array.Count();
8326 for (int i = 0; i < array_size; i++)
8327 {
8328 if (item_tag_array.Get(i) == tag)
8329 {
8330 found = true;
8331 break;
8332 }
8333 }
8334 return found;
8335 }
8336
8337
8339 {
8340
8341 super.OnRPC(sender, rpc_type,ctx);
8342
8343
8344 switch (rpc_type)
8345 {
8346 #ifndef SERVER
8347 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8348 Param2<bool, string> p = new Param2<bool, string>(false, "");
8349
8351 return;
8352
8353 bool play = p.param1;
8354 string soundSet = p.param2;
8355
8356 if (play)
8357 {
8359 {
8361 {
8363 }
8364 }
8365 else
8366 {
8368 }
8369 }
8370 else
8371 {
8373 }
8374
8375 break;
8376 #endif
8377
8378 }
8379
8381 {
8383 }
8384 }
8385
8386
8387
8388
8390 {
8391 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8392 return plugin.GetID(
name);
8393 }
8394
8396 {
8397 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8398 return plugin.GetName(id);
8399 }
8400
8403 {
8404
8405
8406 int varFlags;
8407 if (!ctx.
Read(varFlags))
8408 return;
8409
8410 if (varFlags & ItemVariableFlags.FLOAT)
8411 {
8413 }
8414 }
8415
8417 {
8418
8419 super.SerializeNumericalVars(floats_out);
8420
8421
8422
8424 {
8426 }
8427
8429 {
8431 }
8432
8434 {
8436 }
8437
8439 {
8444 }
8445
8447 {
8449 }
8450 }
8451
8453 {
8454
8455 super.DeSerializeNumericalVars(floats);
8456
8457
8458 int index = 0;
8459 int mask = Math.Round(floats.Get(index));
8460
8461 index++;
8462
8464 {
8466 {
8468 }
8469 else
8470 {
8471 float quantity = floats.Get(index);
8473 }
8474 index++;
8475 }
8476
8478 {
8479 float wet = floats.Get(index);
8481 index++;
8482 }
8483
8485 {
8486 int liquidtype = Math.Round(floats.Get(index));
8488 index++;
8489 }
8490
8492 {
8494 index++;
8496 index++;
8498 index++;
8500 index++;
8501 }
8502
8504 {
8505 int cleanness = Math.Round(floats.Get(index));
8507 index++;
8508 }
8509 }
8510
8512 {
8513 super.WriteVarsToCTX(ctx);
8514
8515
8517 {
8519 }
8520
8522 {
8524 }
8525
8527 {
8529 }
8530
8532 {
8533 int r,g,b,a;
8539 }
8540
8542 {
8544 }
8545 }
8546
8548 {
8549 if (!super.ReadVarsFromCTX(ctx,version))
8550 return false;
8551
8552 int intValue;
8553 float value;
8554
8555 if (version < 140)
8556 {
8557 if (!ctx.
Read(intValue))
8558 return false;
8559
8560 m_VariablesMask = intValue;
8561 }
8562
8564 {
8565 if (!ctx.
Read(value))
8566 return false;
8567
8569 {
8571 }
8572 else
8573 {
8575 }
8576 }
8577
8578 if (version < 140)
8579 {
8581 {
8582 if (!ctx.
Read(value))
8583 return false;
8584 SetTemperatureDirect(value);
8585 }
8586 }
8587
8589 {
8590 if (!ctx.
Read(value))
8591 return false;
8593 }
8594
8596 {
8597 if (!ctx.
Read(intValue))
8598 return false;
8600 }
8601
8603 {
8604 int r,g,b,a;
8606 return false;
8608 return false;
8610 return false;
8612 return false;
8613
8615 }
8616
8618 {
8619 if (!ctx.
Read(intValue))
8620 return false;
8622 }
8623
8624 if (version >= 138 && version < 140)
8625 {
8627 {
8628 if (!ctx.
Read(intValue))
8629 return false;
8630 SetFrozen(intValue);
8631 }
8632 }
8633
8634 return true;
8635 }
8636
8637
8639 {
8642 {
8644 }
8645
8646 if (!super.OnStoreLoad(ctx, version))
8647 {
8649 return false;
8650 }
8651
8652 if (version >= 114)
8653 {
8654 bool hasQuickBarIndexSaved;
8655
8656 if (!ctx.
Read(hasQuickBarIndexSaved))
8657 {
8659 return false;
8660 }
8661
8662 if (hasQuickBarIndexSaved)
8663 {
8664 int itmQBIndex;
8665
8666
8667 if (!ctx.
Read(itmQBIndex))
8668 {
8670 return false;
8671 }
8672
8673 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8674 if (itmQBIndex != -1 && parentPlayer)
8675 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8676 }
8677 }
8678 else
8679 {
8680
8681 PlayerBase player;
8682 int itemQBIndex;
8683 if (version ==
int.
MAX)
8684 {
8685 if (!ctx.
Read(itemQBIndex))
8686 {
8688 return false;
8689 }
8690 }
8691 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8692 {
8693
8694 if (!ctx.
Read(itemQBIndex))
8695 {
8697 return false;
8698 }
8699 if (itemQBIndex != -1 && player)
8700 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8701 }
8702 }
8703
8704 if (version < 140)
8705 {
8706
8707 if (!LoadVariables(ctx, version))
8708 {
8710 return false;
8711 }
8712 }
8713
8714
8716 {
8718 return false;
8719 }
8720 if (version >= 132)
8721 {
8723 if (raib)
8724 {
8726 {
8728 return false;
8729 }
8730 }
8731 }
8732
8734 return true;
8735 }
8736
8737
8738
8740 {
8741 super.OnStoreSave(ctx);
8742
8743 PlayerBase player;
8744 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8745 {
8747
8748 int itemQBIndex = -1;
8749 itemQBIndex = player.FindQuickBarEntityIndex(this);
8750 ctx.
Write(itemQBIndex);
8751 }
8752 else
8753 {
8755 }
8756
8758
8760 if (raib)
8761 {
8763 }
8764 }
8765
8766
8768 {
8769 super.AfterStoreLoad();
8770
8772 {
8774 }
8775
8777 {
8780 }
8781 }
8782
8784 {
8785 super.EEOnAfterLoad();
8786
8788 {
8790 }
8791
8794 }
8795
8797 {
8798 return false;
8799 }
8800
8801
8802
8804 {
8806 {
8807 #ifdef PLATFORM_CONSOLE
8808
8810 {
8812 if (menu)
8813 {
8815 }
8816 }
8817 #endif
8818 }
8819
8821 {
8824 }
8825
8827 {
8828 SetWeightDirty();
8830 }
8832 {
8835 }
8836
8838 {
8841
8844 }
8846 {
8850 }
8851
8852 super.OnVariablesSynchronized();
8853 }
8854
8855
8856
8858 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8859 {
8860 if (!IsServerCheck(allow_client))
8861 return false;
8862
8864 return false;
8865
8868
8869 if (value <= (min + 0.001))
8870 value = min;
8871
8872 if (value == min)
8873 {
8874 if (destroy_config)
8875 {
8876 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8877 if (dstr)
8878 {
8880 this.Delete();
8881 return true;
8882 }
8883 }
8884 else if (destroy_forced)
8885 {
8887 this.Delete();
8888 return true;
8889 }
8890
8892 }
8893
8896
8898 {
8899 EntityAI parent = GetHierarchyRoot();
8900 InventoryLocation iLoc = new InventoryLocation();
8901 GetInventory().GetCurrentInventoryLocation(iLoc);
8903 {
8904 int iLocSlot = iLoc.
GetSlot();
8906 {
8908 }
8910 {
8912 }
8913 }
8914 }
8915
8917 {
8919
8920 if (delta)
8922 }
8923
8925
8926 return false;
8927 }
8928
8929
8931 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8932 {
8934 }
8935
8937 {
8940 }
8941
8943 {
8946 }
8947
8949 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8950 {
8951 float value_clamped = Math.Clamp(value, 0, 1);
8953 SetQuantity(result, destroy_config, destroy_forced);
8954 }
8955
8956
8959 {
8961 }
8962
8964 {
8966 }
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8978 {
8979 int slot = -1;
8980 GameInventory inventory = GetInventory();
8981 if (inventory)
8982 {
8983 InventoryLocation il = new InventoryLocation;
8986 }
8987
8989 }
8990
8992 {
8993 float quantity_max = 0;
8994
8996 {
8997 if (attSlotID != -1)
8998 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8999
9000 if (quantity_max <= 0)
9002 }
9003
9004 if (quantity_max <= 0)
9006
9007 return quantity_max;
9008 }
9009
9011 {
9013 }
9014
9016 {
9018 }
9019
9020
9022 {
9024 }
9025
9027 {
9029 }
9030
9032 {
9034 }
9035
9036
9038 {
9039
9040 float weightEx = GetWeightEx();
9041 float special = GetInventoryAndCargoWeight();
9042 return weightEx - special;
9043 }
9044
9045
9047 {
9049 }
9050
9052 {
9054 {
9055 #ifdef DEVELOPER
9056 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9057 {
9058 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9060 }
9061 #endif
9062
9064 }
9065 else if (HasEnergyManager())
9066 {
9067 #ifdef DEVELOPER
9068 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9069 {
9070 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9071 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9072 }
9073 #endif
9074 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9075 }
9076 else
9077 {
9078 #ifdef DEVELOPER
9079 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9080 {
9081 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9082 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9083 }
9084 #endif
9085 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9086 }
9087 }
9088
9091 {
9092 int item_count = 0;
9094
9095 GameInventory inventory = GetInventory();
9096 CargoBase cargo = inventory.
GetCargo();
9097 if (cargo != NULL)
9098 {
9100 }
9101
9103 for (int i = 0; i < nAttachments; ++i)
9104 {
9106 if (item)
9107 item_count += item.GetNumberOfItems();
9108 }
9109 return item_count;
9110 }
9111
9114 {
9115 float weight = 0;
9116 float wetness = 1;
9117 if (include_wetness)
9120 {
9121 weight = wetness * m_ConfigWeight;
9122 }
9124 {
9125 weight = 1;
9126 }
9127 return weight;
9128 }
9129
9130
9131
9133 {
9134 GameInventory inventory = GetInventory();
9135 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9136 {
9137 array<EntityAI> items = new array<EntityAI>;
9139 for (int i = 0; i < items.Count(); ++i)
9140 {
9142 if (item)
9143 {
9144 g_Game.ObjectDelete(item);
9145 }
9146 }
9147 }
9148 }
9149
9150
9151
9152
9154 {
9155 float energy = 0;
9156 if (HasEnergyManager())
9157 {
9158 energy = GetCompEM().GetEnergy();
9159 }
9160 return energy;
9161 }
9162
9163
9165 {
9166 super.OnEnergyConsumed();
9167
9169 }
9170
9172 {
9173 super.OnEnergyAdded();
9174
9176 }
9177
9178
9180 {
9181 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9182 {
9184 {
9185 float energy_0to1 = GetCompEM().GetEnergy0To1();
9187 }
9188 }
9189 }
9190
9191
9193 {
9194 return ConfigGetFloat("heatIsolation");
9195 }
9196
9198 {
9200 }
9201
9203 {
9204 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9205 if (
g_Game.ConfigIsExisting(paramPath))
9206 return g_Game.ConfigGetFloat(paramPath);
9207
9208 return 0.0;
9209 }
9210
9212 {
9213 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9214 if (
g_Game.ConfigIsExisting(paramPath))
9215 return g_Game.ConfigGetFloat(paramPath);
9216
9217 return 0.0;
9218 }
9219
9220 override void SetWet(
float value,
bool allow_client =
false)
9221 {
9222 if (!IsServerCheck(allow_client))
9223 return;
9224
9227
9229
9230 m_VarWet = Math.Clamp(value, min, max);
9231
9233 {
9236 }
9237 }
9238
9239 override void AddWet(
float value)
9240 {
9242 }
9243
9245 {
9247 }
9248
9250 {
9252 }
9253
9255 {
9257 }
9258
9260 {
9262 }
9263
9265 {
9267 }
9268
9270 {
9273 if (newLevel != oldLevel)
9274 {
9276 }
9277 }
9278
9280 {
9281 SetWeightDirty();
9282 }
9283
9285 {
9286 return GetWetLevelInternal(
m_VarWet);
9287 }
9288
9289
9290
9292 {
9294 }
9295
9297 {
9299 }
9300
9302 {
9304 }
9305
9307 {
9309 }
9310
9311
9312
9314 {
9315 if (ConfigIsExisting("itemModelLength"))
9316 {
9317 return ConfigGetFloat("itemModelLength");
9318 }
9319 return 0;
9320 }
9321
9323 {
9324 if (ConfigIsExisting("itemAttachOffset"))
9325 {
9326 return ConfigGetFloat("itemAttachOffset");
9327 }
9328 return 0;
9329 }
9330
9331 override void SetCleanness(
int value,
bool allow_client =
false)
9332 {
9333 if (!IsServerCheck(allow_client))
9334 return;
9335
9337
9339
9342 }
9343
9345 {
9347 }
9348
9350 {
9351 return true;
9352 }
9353
9354
9355
9356
9358 {
9360 }
9361
9363 {
9365 }
9366
9367
9368
9369
9370 override void SetColor(
int r,
int g,
int b,
int a)
9371 {
9377 }
9379 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9380 {
9385 }
9386
9388 {
9390 }
9391
9394 {
9395 int r,g,b,a;
9397 r = r/255;
9398 g = g/255;
9399 b = b/255;
9400 a = a/255;
9401 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9402 }
9403
9404
9405
9406 override void SetLiquidType(
int value,
bool allow_client =
false)
9407 {
9408 if (!IsServerCheck(allow_client))
9409 return;
9410
9415 }
9416
9418 {
9419 return ConfigGetInt("varLiquidTypeInit");
9420 }
9421
9423 {
9425 }
9426
9428 {
9430 SetFrozen(false);
9431 }
9432
9435 {
9436 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9437 }
9438
9439
9442 {
9443 PlayerBase nplayer;
9444 if (PlayerBase.CastTo(nplayer, player))
9445 {
9447 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9448 }
9449 }
9450
9451
9454 {
9455 PlayerBase nplayer;
9456 if (PlayerBase.CastTo(nplayer,player))
9457 {
9458 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9459 }
9460
9461 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9462
9463 if (HasEnergyManager())
9464 {
9465 GetCompEM().UpdatePlugState();
9466 }
9467 }
9468
9469
9471 {
9472 super.OnPlacementStarted(player);
9473
9475 }
9476
9477 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9478 {
9480 {
9481 m_AdminLog.OnPlacementComplete(player,
this);
9482 }
9483
9484 super.OnPlacementComplete(player, position, orientation);
9485 }
9486
9487
9488
9489
9490
9492 {
9494 {
9495 return true;
9496 }
9497 else
9498 {
9499 return false;
9500 }
9501 }
9502
9503
9505 {
9507 {
9509 }
9510 }
9511
9512
9514 {
9516 }
9517
9519 {
9521 }
9522
9523 override void InsertAgent(
int agent,
float count = 1)
9524 {
9525 if (count < 1)
9526 return;
9527
9529 }
9530
9533 {
9535 }
9536
9537
9539 {
9541 }
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9570
9571
9572
9573
9574
9575
9576
9577
9578
9579
9580
9581
9582
9583
9585 {
9587 return false;
9588 return true;
9589 }
9590
9592 {
9593
9595 }
9596
9597
9600 {
9601 super.CheckForRoofLimited(timeTresholdMS);
9602
9603 float time =
g_Game.GetTime();
9604 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9605 {
9606 m_PreviousRoofTestTime = time;
9607 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9608 }
9609 }
9610
9611
9613 {
9615 {
9616 return 0;
9617 }
9618
9619 if (GetInventory().GetAttachmentSlotsCount() != 0)
9620 {
9621 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9622 if (filter)
9623 return filter.GetProtectionLevel(type, false, system);
9624 else
9625 return 0;
9626 }
9627
9628 string subclassPath, entryName;
9629
9630 switch (type)
9631 {
9633 entryName = "biological";
9634 break;
9636 entryName = "chemical";
9637 break;
9638 default:
9639 entryName = "biological";
9640 break;
9641 }
9642
9643 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9644
9645 return g_Game.ConfigGetFloat(subclassPath + entryName);
9646 }
9647
9648
9649
9652 {
9653 if (!IsMagazine())
9655
9657 }
9658
9659
9660
9661
9662
9667 {
9668 return true;
9669 }
9670
9672 {
9674 }
9675
9676
9677
9678
9679
9681 {
9682 if (parent)
9683 {
9684 if (parent.IsInherited(DayZInfected))
9685 return true;
9686
9687 if (!parent.IsRuined())
9688 return true;
9689 }
9690
9691 return true;
9692 }
9693
9695 {
9696 if (!super.CanPutAsAttachment(parent))
9697 {
9698 return false;
9699 }
9700
9701 if (!IsRuined() && !parent.IsRuined())
9702 {
9703 return true;
9704 }
9705
9706 return false;
9707 }
9708
9710 {
9711
9712
9713
9714
9715 return super.CanReceiveItemIntoCargo(item);
9716 }
9717
9719 {
9720
9721
9722
9723
9724 GameInventory attachmentInv = attachment.GetInventory();
9726 {
9727 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9728 return false;
9729 }
9730
9731 InventoryLocation loc = new InventoryLocation();
9732 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9733 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9734 return false;
9735
9736 return super.CanReceiveAttachment(attachment, slotId);
9737 }
9738
9740 {
9741 if (!super.CanReleaseAttachment(attachment))
9742 return false;
9743
9744 return GetInventory().AreChildrenAccessible();
9745 }
9746
9747
9748
9749
9750
9751
9752
9753
9754
9755
9756
9757
9758
9759
9760
9761
9762
9763
9764
9765
9766
9768 {
9769 int id = muzzle_owner.GetMuzzleID();
9770 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9771
9772 if (WPOF_array)
9773 {
9774 for (int i = 0; i < WPOF_array.Count(); i++)
9775 {
9776 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9777
9778 if (WPOF)
9779 {
9780 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9781 }
9782 }
9783 }
9784 }
9785
9786
9788 {
9789 int id = muzzle_owner.GetMuzzleID();
9791
9792 if (WPOBE_array)
9793 {
9794 for (int i = 0; i < WPOBE_array.Count(); i++)
9795 {
9796 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9797
9798 if (WPOBE)
9799 {
9800 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9801 }
9802 }
9803 }
9804 }
9805
9806
9808 {
9809 int id = muzzle_owner.GetMuzzleID();
9810 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9811
9812 if (WPOOH_array)
9813 {
9814 for (int i = 0; i < WPOOH_array.Count(); i++)
9815 {
9816 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9817
9818 if (WPOOH)
9819 {
9820 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9821 }
9822 }
9823 }
9824 }
9825
9826
9828 {
9829 int id = muzzle_owner.GetMuzzleID();
9830 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9831
9832 if (WPOOH_array)
9833 {
9834 for (int i = 0; i < WPOOH_array.Count(); i++)
9835 {
9836 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9837
9838 if (WPOOH)
9839 {
9840 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9841 }
9842 }
9843 }
9844 }
9845
9846
9848 {
9849 int id = muzzle_owner.GetMuzzleID();
9850 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9851
9852 if (WPOOH_array)
9853 {
9854 for (int i = 0; i < WPOOH_array.Count(); i++)
9855 {
9856 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9857
9858 if (WPOOH)
9859 {
9860 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9861 }
9862 }
9863 }
9864 }
9865
9866
9867
9869 {
9871 {
9872 return true;
9873 }
9874
9875 return false;
9876 }
9877
9879 {
9881 {
9882 return true;
9883 }
9884
9885 return false;
9886 }
9887
9889 {
9891 {
9892 return true;
9893 }
9894
9895 return false;
9896 }
9897
9899 {
9900 return false;
9901 }
9902
9905 {
9906 return UATimeSpent.DEFAULT_DEPLOY;
9907 }
9908
9909
9910
9911
9913 {
9915 SetSynchDirty();
9916 }
9917
9919 {
9921 }
9922
9923
9925 {
9926 return false;
9927 }
9928
9931 {
9932 string att_type = "None";
9933
9934 if (ConfigIsExisting("soundAttType"))
9935 {
9936 att_type = ConfigGetString("soundAttType");
9937 }
9938
9940 }
9941
9943 {
9945 }
9946
9947
9948
9949
9950
9956
9958 {
9961
9963 }
9964
9965
9967 {
9969 return;
9970
9972
9975
9978
9979 SoundParameters params = new SoundParameters();
9983 }
9984
9985
9987 {
9989 {
9992
9993 SetSynchDirty();
9994
9997 }
9998 }
9999
10001 {
10003 }
10004
10005
10007 {
10009 return;
10010
10012 SetSynchDirty();
10013
10016 }
10017
10019 {
10022 }
10023
10025 {
10027 }
10028
10029 void OnApply(PlayerBase player);
10030
10032 {
10033 return 1.0;
10034 };
10035
10037 {
10039 }
10040
10042 {
10044 }
10045
10047
10049 {
10050 SetDynamicPhysicsLifeTime(0.01);
10052 }
10053
10055 {
10056 array<string> zone_names = new array<string>;
10057 GetDamageZones(zone_names);
10058 for (int i = 0; i < zone_names.Count(); i++)
10059 {
10060 SetHealthMax(zone_names.Get(i),"Health");
10061 }
10062 SetHealthMax("","Health");
10063 }
10064
10067 {
10068 float global_health = GetHealth01("","Health");
10069 array<string> zones = new array<string>;
10070 GetDamageZones(zones);
10071
10072 for (int i = 0; i < zones.Count(); i++)
10073 {
10074 SetHealth01(zones.Get(i),"Health",global_health);
10075 }
10076 }
10077
10080 {
10081 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10082 }
10083
10085 {
10086 if (!hasRootAsPlayer)
10087 {
10088 if (refParentIB)
10089 {
10090
10091 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10092 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10093
10094 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10095 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10096
10099 }
10100 else
10101 {
10102
10105 }
10106 }
10107 }
10108
10110 {
10112 {
10113 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10114 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10115 {
10116 float heatPermCoef = 1.0;
10118 while (ent)
10119 {
10120 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10121 ent = ent.GetHierarchyParent();
10122 }
10123
10124 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10125 }
10126 }
10127 }
10128
10130 {
10131
10132 EntityAI parent = GetHierarchyParent();
10133 if (!parent)
10134 {
10135 hasParent = false;
10136 hasRootAsPlayer = false;
10137 }
10138 else
10139 {
10140 hasParent = true;
10141 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10142 refParentIB =
ItemBase.Cast(parent);
10143 }
10144 }
10145
10146 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10147 {
10148
10149 }
10150
10152 {
10153
10154 return false;
10155 }
10156
10158 {
10159
10160
10161 return false;
10162 }
10163
10165 {
10166
10167 return false;
10168 }
10169
10172 {
10173 return !GetIsFrozen() &&
IsOpen();
10174 }
10175
10177 {
10178 bool hasParent = false, hasRootAsPlayer = false;
10180
10181 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10182 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10183
10184 if (wwtu || foodDecay)
10185 {
10189
10190 if (processWetness || processTemperature || processDecay)
10191 {
10193
10194 if (processWetness)
10195 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10196
10197 if (processTemperature)
10199
10200 if (processDecay)
10201 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10202 }
10203 }
10204 }
10205
10208 {
10210 }
10211
10213 {
10216
10217 return super.GetTemperatureFreezeThreshold();
10218 }
10219
10221 {
10224
10225 return super.GetTemperatureThawThreshold();
10226 }
10227
10229 {
10232
10233 return super.GetItemOverheatThreshold();
10234 }
10235
10237 {
10239 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10240
10241 return super.GetTemperatureFreezeTime();
10242 }
10243
10245 {
10247 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10248
10249 return super.GetTemperatureThawTime();
10250 }
10251
10256
10258 {
10259 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10260 }
10261
10263 {
10264 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10265 }
10266
10269 {
10271 }
10272
10274 {
10276 }
10277
10279 {
10281 }
10282
10285 {
10286 return null;
10287 }
10288
10291 {
10292 return false;
10293 }
10294
10296 {
10298 {
10301 if (!trg)
10302 {
10304 explosive = this;
10305 }
10306
10307 explosive.PairRemote(trg);
10309
10310 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10311 trg.SetPersistentPairID(persistentID);
10312 explosive.SetPersistentPairID(persistentID);
10313
10314 return true;
10315 }
10316 return false;
10317 }
10318
10321 {
10322 float ret = 1.0;
10325 ret *= GetHealth01();
10326
10327 return ret;
10328 }
10329
10330 #ifdef DEVELOPER
10331 override void SetDebugItem()
10332 {
10333 super.SetDebugItem();
10334 _itemBase = this;
10335 }
10336
10338 {
10339 string text = super.GetDebugText();
10340
10342 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10343
10344 return text;
10345 }
10346 #endif
10347
10349 {
10350 return true;
10351 }
10352
10354
10356
10358 {
10361 }
10362
10363
10371
10387
10388 [
Obsolete(
"Use ItemSoundHandler instead")]
10391 {
10392 if (!
g_Game.IsDedicatedServer())
10393 {
10394 if (ConfigIsExisting("attachSoundSet"))
10395 {
10396 string cfg_path = "";
10397 string soundset = "";
10398 string type_name =
GetType();
10399
10402 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10403 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10404
10405 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10406 {
10407 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10408 {
10409 if (cfg_slot_array[i] == slot_type)
10410 {
10411 soundset = cfg_soundset_array[i];
10412 break;
10413 }
10414 }
10415 }
10416
10417 if (soundset != "")
10418 {
10419 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10421 }
10422 }
10423 }
10424 }
10425
10427}
10428
10430{
10432 if (entity)
10433 {
10434 bool is_item = entity.IsInherited(
ItemBase);
10435 if (is_item && full_quantity)
10436 {
10439 }
10440 }
10441 else
10442 {
10444 return NULL;
10445 }
10446 return entity;
10447}
10448
10450{
10451 if (item)
10452 {
10453 if (health > 0)
10454 item.SetHealth("", "", health);
10455
10456 if (item.CanHaveTemperature())
10457 {
10459 if (item.CanFreeze())
10460 item.SetFrozen(false);
10461 }
10462
10463 if (item.HasEnergyManager())
10464 {
10465 if (quantity >= 0)
10466 {
10467 item.GetCompEM().SetEnergy0To1(quantity);
10468 }
10469 else
10470 {
10472 }
10473 }
10474 else if (item.IsMagazine())
10475 {
10476 Magazine mag = Magazine.Cast(item);
10477 if (quantity >= 0)
10478 {
10479 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10480 }
10481 else
10482 {
10484 }
10485
10486 }
10487 else
10488 {
10489 if (quantity >= 0)
10490 {
10491 item.SetQuantityNormalized(quantity, false);
10492 }
10493 else
10494 {
10496 }
10497
10498 }
10499 }
10500}
10501
10502#ifdef DEVELOPER
10504#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.