5510{
5512 {
5513 return true;
5514 }
5515};
5516
5518{
5519
5520};
5521
5522
5523
5525{
5529
5531
5534
5535
5536
5537
5538
5547
5553
5558
5563
5584 protected bool m_IsResultOfSplit
5585
5587
5592
5593
5594
5596
5600
5601
5602
5604
5607
5608
5609
5615
5616
5624
5627
5628
5630
5631
5633
5634
5639
5640
5645
5647
5648
5650
5651
5653 {
5658
5659 if (!
g_Game.IsDedicatedServer())
5660 {
5662 {
5664
5666 {
5668 }
5669 }
5670
5673 }
5674
5675 m_OldLocation = null;
5676
5678 {
5680 }
5681
5682 if (ConfigIsExisting("headSelectionsToHide"))
5683 {
5686 }
5687
5689 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5690 {
5692 }
5693
5695
5696 m_IsResultOfSplit = false;
5697
5699 }
5700
5702 {
5703 super.InitItemVariables();
5704
5710 m_Count = ConfigGetInt(
"count");
5711
5714
5719
5722
5727
5739
5743
5744
5747 if (ConfigIsExisting("canBeSplit"))
5748 {
5751 }
5752
5754 if (ConfigIsExisting("itemBehaviour"))
5756
5757
5760 RegisterNetSyncVariableInt("m_VarLiquidType");
5761 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5762
5763 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5764 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5765 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5766
5767 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5768 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5769 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5770 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5771
5772 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5773 RegisterNetSyncVariableBool("m_IsTakeable");
5774 RegisterNetSyncVariableBool("m_IsHologram");
5775
5778 {
5781 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5782 }
5783
5785
5787 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5789
5791 }
5792
5794 {
5796 }
5797
5799 {
5802 {
5807 }
5808 }
5809
5810 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5811 {
5813 {
5816 }
5817
5819 }
5820
5822 {
5828 }
5829
5831
5833 {
5835
5836 if (!action)
5837 {
5838 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5839 return;
5840 }
5841
5843 if (!ai)
5844 {
5846 return;
5847 }
5848
5850 if (!action_array)
5851 {
5852 action_array = new array<ActionBase_Basic>;
5854 }
5855 if (LogManager.IsActionLogEnable())
5856 {
5857 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5858 }
5859
5860 if (action_array.Find(action) != -1)
5861 {
5862 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5863 }
5864 else
5865 {
5866 action_array.Insert(action);
5867 }
5868 }
5869
5871 {
5872 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5873 ActionBase action = player.GetActionManager().GetAction(actionName);
5876
5877 if (action_array)
5878 {
5879 action_array.RemoveItem(action);
5880 }
5881 }
5882
5883
5884
5886 {
5887 ActionOverrideData overrideData = new ActionOverrideData();
5891
5893 if (!actionMap)
5894 {
5897 }
5898
5899 actionMap.Insert(this.
Type(), overrideData);
5900
5901 }
5902
5904
5906
5907
5909 {
5912
5915
5916 string config_to_search = "CfgVehicles";
5917 string muzzle_owner_config;
5918
5920 {
5921 if (IsInherited(Weapon))
5922 config_to_search = "CfgWeapons";
5923
5924 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5925
5926 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5927
5928 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
5929
5930 if (config_OnFire_subclass_count > 0)
5931 {
5932 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5933
5934 for (int i = 0; i < config_OnFire_subclass_count; i++)
5935 {
5936 string particle_class = "";
5937 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
5938 string config_OnFire_entry = config_OnFire_class + particle_class;
5939 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5940 WPOF_array.Insert(WPOF);
5941 }
5942
5943
5945 }
5946 }
5947
5949 {
5950 config_to_search = "CfgWeapons";
5951 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5952
5953 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5954
5955 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5956
5957 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5958 {
5959 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5960
5961 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5962 {
5963 string particle_class2 = "";
5964 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5965 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5966 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5967 WPOBE_array.Insert(WPOBE);
5968 }
5969
5970
5972 }
5973 }
5974 }
5975
5976
5978 {
5981
5983 {
5984 string config_to_search = "CfgVehicles";
5985
5986 if (IsInherited(Weapon))
5987 config_to_search = "CfgWeapons";
5988
5989 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5990 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5991
5992 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
5993 {
5994
5996
5998 {
6000 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6002 return;
6003 }
6004
6007
6008
6009
6010 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6011 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6012
6013 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6014 {
6015 string particle_class = "";
6016 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6017 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6018 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6019
6020 if (entry_type == CT_CLASS)
6021 {
6022 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6023 WPOOH_array.Insert(WPOF);
6024 }
6025 }
6026
6027
6029 }
6030 }
6031 }
6032
6034 {
6036 }
6037
6039 {
6041 {
6043
6046
6049
6050 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6051 }
6052 }
6053
6055 {
6057 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6058
6060 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6061
6063 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6064
6066 {
6068 }
6069 }
6070
6072 {
6074 }
6075
6077 {
6080 else
6082
6084 {
6087 }
6088 else
6089 {
6092
6095 }
6096
6098 }
6099
6101 {
6103 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6104 }
6105
6107 {
6109 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6111 }
6112
6114 {
6116 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6117 }
6118
6120 {
6123
6124 OverheatingParticle OP = new OverheatingParticle();
6129
6131 }
6132
6134 {
6137
6138 return -1;
6139 }
6140
6142 {
6144 {
6147
6148 for (int i = count; i > 0; --i)
6149 {
6150 int id = i - 1;
6153
6156
6157 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6158 {
6159 if (p)
6160 {
6163 }
6164 }
6165 }
6166 }
6167 }
6168
6170 {
6172 {
6174 {
6175 int id = i - 1;
6177
6178 if (OP)
6179 {
6181
6182 if (p)
6183 {
6185 }
6186
6187 delete OP;
6188 }
6189 }
6190
6193 }
6194 }
6195
6198 {
6199 return 0.0;
6200 }
6201
6202
6204 {
6205 return 250;
6206 }
6207
6209 {
6210 return 0;
6211 }
6212
6215 {
6217 return true;
6218
6219 return false;
6220 }
6221
6224 {
6227
6229 {
6231 }
6232 else
6233 {
6234
6236 }
6237
6239 }
6240
6247 {
6248 return -1;
6249 }
6250
6251
6252
6253
6255 {
6257 {
6258 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6259 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6260
6261 if (r_index >= 0)
6262 {
6263 InventoryLocation r_il = new InventoryLocation;
6264 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6265
6266 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6269 {
6270 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6271 }
6273 {
6274 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6275 }
6276
6277 }
6278
6279 player.GetHumanInventory().ClearUserReservedLocation(this);
6280 }
6281
6284 }
6285
6286
6287
6288
6290 {
6291 return ItemBase.m_DebugActionsMask;
6292 }
6293
6295 {
6296 return ItemBase.m_DebugActionsMask & mask;
6297 }
6298
6300 {
6301 ItemBase.m_DebugActionsMask = mask;
6302 }
6303
6305 {
6306 ItemBase.m_DebugActionsMask |= mask;
6307 }
6308
6310 {
6311 ItemBase.m_DebugActionsMask &= ~mask;
6312 }
6313
6315 {
6317 {
6319 }
6320 else
6321 {
6323 }
6324 }
6325
6326
6328 {
6329 if (GetEconomyProfile())
6330 {
6331 float q_max = GetEconomyProfile().GetQuantityMax();
6332 if (q_max > 0)
6333 {
6334 float q_min = GetEconomyProfile().GetQuantityMin();
6335 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6336
6338 {
6339 ComponentEnergyManager comp = GetCompEM();
6341 {
6343 }
6344 }
6346 {
6348
6349 }
6350
6351 }
6352 }
6353 }
6354
6357 {
6358 EntityAI parent = GetHierarchyParent();
6359
6360 if (parent)
6361 {
6362 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6363 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6364 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6365 }
6366 }
6367
6370 {
6371 EntityAI parent = GetHierarchyParent();
6372
6373 if (parent)
6374 {
6375 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6376 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6377 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6378 }
6379 }
6380
6382 {
6383
6384
6385
6386
6388
6390 {
6391 if (ScriptInputUserData.CanStoreInputUserData())
6392 {
6393 ScriptInputUserData ctx = new ScriptInputUserData;
6399 ctx.
Write(use_stack_max);
6402
6404 {
6405 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6406 }
6407 }
6408 }
6409 else if (!
g_Game.IsMultiplayer())
6410 {
6412 }
6413 }
6414
6416 {
6418 }
6419
6421 {
6423 }
6424
6426 {
6428 }
6429
6431 {
6432
6433 return false;
6434 }
6435
6437 {
6438 return false;
6439 }
6440
6444 {
6445 return false;
6446 }
6447
6449 {
6450 return "";
6451 }
6452
6454
6456 {
6457 return false;
6458 }
6459
6461 {
6462 return true;
6463 }
6464
6465
6466
6468 {
6469 return true;
6470 }
6471
6473 {
6474 return true;
6475 }
6476
6478 {
6479 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6481 }
6482
6484 {
6486 }
6487
6489 {
6491 if (!is_being_placed)
6493 SetSynchDirty();
6494 }
6495
6496
6498
6500 {
6502 }
6503
6505 {
6507 }
6508
6510 {
6511 return 1;
6512 }
6513
6515 {
6516 return false;
6517 }
6518
6520 {
6522 SetSynchDirty();
6523 }
6524
6525
6526
6527
6528
6529
6530
6531
6532
6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551
6552
6553
6554
6555
6556
6557
6558
6560 {
6561 super.OnMovedInsideCargo(container);
6562
6563 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6564 }
6565
6566 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6567 {
6568 super.EEItemLocationChanged(oldLoc, newLoc);
6569
6570 PlayerBase newPlayer = null;
6571 PlayerBase oldPlayer = null;
6572
6573 if (newLoc.GetParent())
6574 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6575
6576 if (oldLoc.GetParent())
6577 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6578
6580 {
6581 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6582
6583 if (rIndex >= 0)
6584 {
6585 InventoryLocation rIl = new InventoryLocation;
6586 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6587
6588 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6591 {
6592 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6593 }
6595 {
6597 }
6598
6599 }
6600 }
6601
6603 {
6604 if (newPlayer)
6605 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6606
6607 if (newPlayer == oldPlayer)
6608 {
6609 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6610 {
6612 {
6613 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6614 {
6615 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6616 }
6617 }
6618 else
6619 {
6620 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6621 }
6622 }
6623
6624 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6625 {
6626 int type = oldLoc.GetType();
6628 {
6629 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6630 }
6632 {
6633 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6634 }
6635 }
6636 if (!m_OldLocation)
6637 {
6638 m_OldLocation = new InventoryLocation;
6639 }
6640 m_OldLocation.Copy(oldLoc);
6641 }
6642 else
6643 {
6644 if (m_OldLocation)
6645 {
6646 m_OldLocation.Reset();
6647 }
6648 }
6649
6650 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6651 }
6652 else
6653 {
6654 if (newPlayer)
6655 {
6656 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6657 if (resIndex >= 0)
6658 {
6659 InventoryLocation il = new InventoryLocation;
6660 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6662 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6665 {
6666 il.
GetParent().GetOnReleaseLock().Invoke(it);
6667 }
6669 {
6671 }
6672
6673 }
6674 }
6676 {
6677
6679 }
6680
6681 if (m_OldLocation)
6682 {
6683 m_OldLocation.Reset();
6684 }
6685 }
6686
6688 {
6689 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6690 }
6691
6693 {
6694 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6695 }
6696 }
6697
6698 override void EOnContact(IEntity other, Contact extra)
6699 {
6701 {
6702 int liquidType = -1;
6704 if (impactSpeed > 0.0)
6705 {
6707 #ifndef SERVER
6709 #else
6711 SetSynchDirty();
6712 #endif
6714 }
6715 }
6716
6717 #ifdef SERVER
6718 if (GetCompEM() && GetCompEM().IsPlugged())
6719 {
6720 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6721 GetCompEM().UnplugThis();
6722 }
6723 #endif
6724 }
6725
6727
6729 {
6731 }
6732
6734 {
6735
6736 }
6737
6739 {
6740 super.OnItemLocationChanged(old_owner, new_owner);
6741
6742 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6743 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6744
6745 if (!relatedPlayer && playerNew)
6746 relatedPlayer = playerNew;
6747
6748 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6749 {
6751 if (actionMgr)
6752 {
6753 ActionBase currentAction = actionMgr.GetRunningAction();
6754 if (currentAction)
6756 }
6757 }
6758
6759 Man ownerPlayerOld = null;
6760 Man ownerPlayerNew = null;
6761
6762 if (old_owner)
6763 {
6764 if (old_owner.
IsMan())
6765 {
6766 ownerPlayerOld = Man.Cast(old_owner);
6767 }
6768 else
6769 {
6770 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6771 }
6772 }
6773 else
6774 {
6776 {
6778
6779 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6780 {
6781 GetCompEM().UnplugThis();
6782 }
6783 }
6784 }
6785
6786 if (new_owner)
6787 {
6788 if (new_owner.
IsMan())
6789 {
6790 ownerPlayerNew = Man.Cast(new_owner);
6791 }
6792 else
6793 {
6794 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6795 }
6796 }
6797
6798 if (ownerPlayerOld != ownerPlayerNew)
6799 {
6800 if (ownerPlayerOld)
6801 {
6802 array<EntityAI> subItemsExit = new array<EntityAI>;
6804 for (int i = 0; i < subItemsExit.Count(); i++)
6805 {
6808 }
6809 }
6810
6811 if (ownerPlayerNew)
6812 {
6813 array<EntityAI> subItemsEnter = new array<EntityAI>;
6815 for (int j = 0; j < subItemsEnter.Count(); j++)
6816 {
6819 }
6820 }
6821 }
6822 else if (ownerPlayerNew != null)
6823 {
6824 PlayerBase nplayer;
6825 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6826 {
6827 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6829 for (int k = 0; k < subItemsUpdate.Count(); k++)
6830 {
6832 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6833 }
6834 }
6835 }
6836
6837 if (old_owner)
6838 old_owner.OnChildItemRemoved(this);
6839 if (new_owner)
6840 new_owner.OnChildItemReceived(this);
6841 }
6842
6843
6845 {
6846 super.EEDelete(parent);
6847 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6848 if (player)
6849 {
6851
6852 if (player.IsAlive())
6853 {
6854 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6855 if (r_index >= 0)
6856 {
6857 InventoryLocation r_il = new InventoryLocation;
6858 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6859
6860 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6863 {
6864 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6865 }
6867 {
6868 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6869 }
6870
6871 }
6872
6873 player.RemoveQuickBarEntityShortcut(this);
6874 }
6875 }
6876 }
6877
6879 {
6880 super.EEKilled(killer);
6881
6884 {
6885 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6886 {
6887 if (IsMagazine())
6888 {
6889 if (Magazine.Cast(this).GetAmmoCount() > 0)
6890 {
6892 }
6893 }
6894 else
6895 {
6897 }
6898 }
6899 }
6900 }
6901
6903 {
6904 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6905
6906 super.OnWasAttached(parent, slot_id);
6907
6910
6913 }
6914
6916 {
6917 super.OnWasDetached(parent, slot_id);
6918
6921
6924 }
6925
6927 {
6928 int idx;
6931
6932 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6933 if (inventory_slots.Count() < 1)
6934 {
6935 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6936 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6937 }
6938 else
6939 {
6940 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6941 }
6942
6943 idx = inventory_slots.Find(slot);
6944 if (idx < 0)
6945 return "";
6946
6947 return attach_types.Get(idx);
6948 }
6949
6951 {
6952 int idx = -1;
6953 string slot;
6954
6957
6958 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6959 if (inventory_slots.Count() < 1)
6960 {
6961 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6962 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6963 }
6964 else
6965 {
6966 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6967 if (detach_types.Count() < 1)
6968 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6969 }
6970
6971 for (int i = 0; i < inventory_slots.Count(); i++)
6972 {
6973 slot = inventory_slots.Get(i);
6974 }
6975
6976 if (slot != "")
6977 {
6978 if (detach_types.Count() == 1)
6979 idx = 0;
6980 else
6981 idx = inventory_slots.Find(slot);
6982 }
6983 if (idx < 0)
6984 return "";
6985
6986 return detach_types.Get(idx);
6987 }
6988
6990 {
6991
6993
6994
6995 float min_time = 1;
6996 float max_time = 3;
6997 float delay = Math.RandomFloat(min_time, max_time);
6998
6999 explode_timer.Run(delay, this, "DoAmmoExplosion");
7000 }
7001
7003 {
7004 Magazine magazine = Magazine.Cast(this);
7005 int pop_sounds_count = 6;
7006 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7007
7008
7009 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7010 string sound_name = pop_sounds[ sound_idx ];
7011 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7012
7013
7014 magazine.ServerAddAmmoCount(-1);
7015
7016
7017 float min_temp_to_explode = 100;
7018
7019 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7020 {
7022 }
7023 }
7024
7025
7026 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7027 {
7028 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7029
7030 const int CHANCE_DAMAGE_CARGO = 4;
7031 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7032 const int CHANCE_DAMAGE_NOTHING = 2;
7033
7035 {
7036 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7037 int chances;
7038 int rnd;
7039
7040 if (GetInventory().GetCargo())
7041 {
7042 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7043 rnd = Math.RandomInt(0,chances);
7044
7045 if (rnd < CHANCE_DAMAGE_CARGO)
7046 {
7048 }
7049 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7050 {
7052 }
7053 }
7054 else
7055 {
7056 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7057 rnd = Math.RandomInt(0,chances);
7058
7059 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7060 {
7062 }
7063 }
7064 }
7065 }
7066
7068 {
7069 CargoBase cargo = GetInventory().GetCargo();
7070 if (cargo)
7071 {
7073 if (item_count > 0)
7074 {
7075 int random_pick = Math.RandomInt(0, item_count);
7077 if (!item.IsExplosive())
7078 {
7079 item.AddHealth("","",damage);
7080 return true;
7081 }
7082 }
7083 }
7084 return false;
7085 }
7086
7088 {
7089 GameInventory inventory = GetInventory();
7091 if (attachment_count > 0)
7092 {
7093 int random_pick = Math.RandomInt(0, attachment_count);
7095 if (!attachment.IsExplosive())
7096 {
7097 attachment.AddHealth("","",damage);
7098 return true;
7099 }
7100 }
7101 return false;
7102 }
7103
7105 {
7107 }
7108
7110 {
7112 return GetInventory().CanRemoveEntity();
7113
7114 return false;
7115 }
7116
7118 {
7119
7121 return false;
7122
7123
7125 return false;
7126
7127
7128
7130 if (delta == 0)
7131 return false;
7132
7133
7134 return true;
7135 }
7136
7138 {
7140 {
7141 if (ScriptInputUserData.CanStoreInputUserData())
7142 {
7143 ScriptInputUserData ctx = new ScriptInputUserData;
7148 ctx.
Write(destination_entity);
7152 }
7153 }
7154 else if (!
g_Game.IsMultiplayer())
7155 {
7157 }
7158 }
7159
7161 {
7162 float split_quantity_new;
7166 InventoryLocation loc = new InventoryLocation;
7167
7168 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7169 {
7171 split_quantity_new = stack_max;
7172 else
7174
7176 {
7177 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7178 if (new_item)
7179 {
7180 new_item.SetResultOfSplit(true);
7181 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7183 new_item.
SetQuantity(split_quantity_new,
false,
true);
7184 }
7185 }
7186 }
7187 else if (destination_entity && slot_id == -1)
7188 {
7189 if (quantity > stack_max)
7190 split_quantity_new = stack_max;
7191 else
7192 split_quantity_new = quantity;
7193
7195 {
7196 GameInventory destinationInventory = destination_entity.GetInventory();
7198 {
7201 }
7202
7203 if (new_item)
7204 {
7205 new_item.SetResultOfSplit(true);
7206 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7208 new_item.
SetQuantity(split_quantity_new,
false,
true);
7209 }
7210 }
7211 }
7212 else
7213 {
7214 if (stack_max != 0)
7215 {
7217 {
7219 }
7220
7221 if (split_quantity_new == 0)
7222 {
7223 if (!
g_Game.IsMultiplayer())
7224 player.PhysicalPredictiveDropItem(this);
7225 else
7226 player.ServerDropEntity(this);
7227 return;
7228 }
7229
7231 {
7233
7234 if (new_item)
7235 {
7236 new_item.SetResultOfSplit(true);
7237 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7240 new_item.PlaceOnSurface();
7241 }
7242 }
7243 }
7244 }
7245 }
7246
7248 {
7249 float split_quantity_new;
7253 InventoryLocation loc = new InventoryLocation;
7254
7255 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7256 {
7258 split_quantity_new = stack_max;
7259 else
7261
7263 {
7264 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7265 if (new_item)
7266 {
7267 new_item.SetResultOfSplit(true);
7268 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7270 new_item.
SetQuantity(split_quantity_new,
false,
true);
7271 }
7272 }
7273 }
7274 else if (destination_entity && slot_id == -1)
7275 {
7276 if (quantity > stack_max)
7277 split_quantity_new = stack_max;
7278 else
7279 split_quantity_new = quantity;
7280
7282 {
7283 GameInventory destinationInventory = destination_entity.GetInventory();
7285 {
7288 }
7289
7290 if (new_item)
7291 {
7292 new_item.SetResultOfSplit(true);
7293 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7295 new_item.
SetQuantity(split_quantity_new,
false,
true);
7296 }
7297 }
7298 }
7299 else
7300 {
7301 if (stack_max != 0)
7302 {
7304 {
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 {
7328 {
7329 if (ScriptInputUserData.CanStoreInputUserData())
7330 {
7331 ScriptInputUserData ctx = new ScriptInputUserData;
7336 dst.WriteToContext(ctx);
7338 }
7339 }
7340 else if (!
g_Game.IsMultiplayer())
7341 {
7343 }
7344 }
7345
7347 {
7349 {
7350 if (ScriptInputUserData.CanStoreInputUserData())
7351 {
7352 ScriptInputUserData ctx = new ScriptInputUserData;
7357 ctx.
Write(destination_entity);
7363 }
7364 }
7365 else if (!
g_Game.IsMultiplayer())
7366 {
7368 }
7369 }
7370
7372 {
7374 }
7375
7377 {
7379 float split_quantity_new;
7381 if (dst.IsValid())
7382 {
7383 int slot_id = dst.GetSlot();
7385
7386 if (quantity > stack_max)
7387 split_quantity_new = stack_max;
7388 else
7389 split_quantity_new = quantity;
7390
7392 {
7394
7395 if (new_item)
7396 {
7397 new_item.SetResultOfSplit(true);
7398 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7400 new_item.
SetQuantity(split_quantity_new,
false,
true);
7401 }
7402
7403 return new_item;
7404 }
7405 }
7406
7407 return null;
7408 }
7409
7411 {
7413 float split_quantity_new;
7415 if (destination_entity)
7416 {
7418 if (quantity > stackable)
7419 split_quantity_new = stackable;
7420 else
7421 split_quantity_new = quantity;
7422
7424 {
7425 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7426 if (new_item)
7427 {
7428 new_item.SetResultOfSplit(true);
7429 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7431 new_item.
SetQuantity(split_quantity_new,
false,
true);
7432 }
7433 }
7434 }
7435 }
7436
7438 {
7440 {
7441 if (ScriptInputUserData.CanStoreInputUserData())
7442 {
7443 ScriptInputUserData ctx = new ScriptInputUserData;
7448 ItemBase destination_entity =
this;
7449 ctx.
Write(destination_entity);
7453 }
7454 }
7455 else if (!
g_Game.IsMultiplayer())
7456 {
7458 }
7459 }
7460
7462 {
7464 float split_quantity_new;
7466 if (player)
7467 {
7469 if (quantity > stackable)
7470 split_quantity_new = stackable;
7471 else
7472 split_quantity_new = quantity;
7473
7475 {
7476 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7477 new_item =
ItemBase.Cast(in_hands);
7478 if (new_item)
7479 {
7480 new_item.SetResultOfSplit(true);
7481 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7483 new_item.SetQuantity(split_quantity_new, false, true);
7484 }
7485 }
7486 }
7487 }
7488
7490 {
7492 float split_quantity_new = Math.Floor(quantity * 0.5);
7493
7495 return;
7496
7498
7499 if (new_item)
7500 {
7501 if (new_item.GetQuantityMax() < split_quantity_new)
7502 {
7503 split_quantity_new = new_item.GetQuantityMax();
7504 }
7505
7506 new_item.SetResultOfSplit(true);
7507 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7508
7510 {
7513 }
7514 else
7515 {
7517 new_item.
SetQuantity(split_quantity_new,
false,
true);
7518 }
7519 }
7520 }
7521
7523 {
7525 float split_quantity_new = Math.Floor(quantity / 2);
7526
7528 return;
7529
7530 InventoryLocation invloc = new InventoryLocation;
7532
7534 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7535
7536 if (new_item)
7537 {
7538 if (new_item.GetQuantityMax() < split_quantity_new)
7539 {
7540 split_quantity_new = new_item.GetQuantityMax();
7541 }
7543 {
7546 }
7547 else if (split_quantity_new > 1)
7548 {
7550 new_item.
SetQuantity(split_quantity_new,
false,
true);
7551 }
7552 }
7553 }
7554
7557 {
7558 SetWeightDirty();
7560
7561 if (parent)
7562 parent.OnAttachmentQuantityChangedEx(this, delta);
7563
7565 {
7567 {
7569 }
7571 {
7572 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7574 }
7575 }
7576 }
7577
7580 {
7581
7582 }
7583
7586 {
7588 }
7589
7591 {
7592 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7593
7595 {
7596 if (newLevel == GameConstants.STATE_RUINED)
7597 {
7599 EntityAI parent = GetHierarchyParent();
7600 if (parent && parent.IsFireplace())
7601 {
7602 CargoBase cargo = GetInventory().GetCargo();
7603 if (cargo)
7604 {
7606 {
7608 }
7609 }
7610 }
7611 }
7612
7614 {
7615
7617 return;
7618 }
7619
7620 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7621 {
7623 }
7624 }
7625 }
7626
7627
7629 {
7630 super.OnRightClick();
7631
7633 {
7635 {
7636 if (ScriptInputUserData.CanStoreInputUserData())
7637 {
7638 EntityAI root = GetHierarchyRoot();
7639 Man playerOwner = GetHierarchyRootPlayer();
7640 InventoryLocation dst = new InventoryLocation;
7641
7642
7643 if (!playerOwner && root && root == this)
7644 {
7646 }
7647 else
7648 {
7649
7650 GetInventory().GetCurrentInventoryLocation(dst);
7652 {
7653 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7655 {
7657 }
7658 else
7659 {
7661
7662
7663 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7664 {
7666 }
7667 else
7668 {
7669 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7670 }
7671 }
7672 }
7673 }
7674
7675 ScriptInputUserData ctx = new ScriptInputUserData;
7683 }
7684 }
7685 else if (!
g_Game.IsMultiplayer())
7686 {
7688 }
7689 }
7690 }
7691
7693 {
7694 if (root)
7695 {
7696 vector m4[4];
7697 root.GetTransform(m4);
7698 dst.SetGround(this, m4);
7699 }
7700 else
7701 {
7702 GetInventory().GetCurrentInventoryLocation(dst);
7703 }
7704 }
7705
7706 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7707 {
7708
7709 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7710 return false;
7711
7712 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7713 return false;
7714
7715
7717 return false;
7718
7719
7720 Magazine mag = Magazine.Cast(this);
7721 if (mag)
7722 {
7723 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7724 return false;
7725
7726 if (stack_max_limit)
7727 {
7728 Magazine other_mag = Magazine.Cast(other_item);
7729 if (other_item)
7730 {
7731 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7732 return false;
7733 }
7734
7735 }
7736 }
7737 else
7738 {
7739
7741 return false;
7742
7744 return false;
7745 }
7746
7747 PlayerBase player = null;
7748 if (CastTo(player, GetHierarchyRootPlayer()))
7749 {
7750 if (player.GetInventory().HasAttachment(this))
7751 return false;
7752
7753 if (player.IsItemsToDelete())
7754 return false;
7755 }
7756
7757 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7758 return false;
7759
7760 int slotID;
7762 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7763 return false;
7764
7765 return true;
7766 }
7767
7769 {
7771 }
7772
7774 {
7775 return m_IsResultOfSplit;
7776 }
7777
7779 {
7780 m_IsResultOfSplit = value;
7781 }
7782
7784 {
7786 }
7787
7789 {
7790 float other_item_quantity = other_item.GetQuantity();
7791 float this_free_space;
7792
7794
7796
7797 if (other_item_quantity > this_free_space)
7798 {
7799 return this_free_space;
7800 }
7801 else
7802 {
7803 return other_item_quantity;
7804 }
7805 }
7806
7808 {
7810 }
7811
7813 {
7815 return;
7816
7817 if (!IsMagazine() && other_item)
7818 {
7820 if (quantity_used != 0)
7821 {
7822 float hp1 = GetHealth01("","");
7823 float hp2 = other_item.GetHealth01("","");
7824 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7825 hpResult = hpResult / (
GetQuantity() + quantity_used);
7826
7827 hpResult *= GetMaxHealth();
7828 Math.Round(hpResult);
7829 SetHealth("", "Health", hpResult);
7830
7832 other_item.AddQuantity(-quantity_used);
7833 }
7834 }
7836 }
7837
7839 {
7840 #ifdef SERVER
7841 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7842 GetHierarchyParent().IncreaseLifetimeUp();
7843 #endif
7844 };
7845
7847 {
7848 PlayerBase p = PlayerBase.Cast(player);
7849
7850 array<int> recipesIds = p.m_Recipes;
7851 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7852 if (moduleRecipesManager)
7853 {
7854 EntityAI itemInHands = player.GetEntityInHands();
7855 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7856 }
7857
7858 for (int i = 0;i < recipesIds.Count(); i++)
7859 {
7860 int key = recipesIds.Get(i);
7861 string recipeName = moduleRecipesManager.GetRecipeName(key);
7863 }
7864 }
7865
7866
7867 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7868 {
7869 super.GetDebugActions(outputList);
7870
7871
7877
7878
7883
7888
7889
7893
7894
7896 {
7900 }
7901
7904
7905
7909
7911
7912 InventoryLocation loc = new InventoryLocation();
7913 GetInventory().GetCurrentInventoryLocation(loc);
7915 {
7916 if (Gizmo_IsSupported())
7919 }
7920
7922 }
7923
7924
7925
7926
7928 {
7929 super.OnAction(action_id, player, ctx);
7930
7932 {
7933 switch (action_id)
7934 {
7938 return true;
7942 return true;
7943 }
7944 }
7945
7947 {
7948 switch (action_id)
7949 {
7951 Delete();
7952 return true;
7953 }
7954 }
7955
7956 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7957 {
7958 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7959 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7960 PlayerBase p = PlayerBase.Cast(player);
7961 if (
EActions.RECIPES_RANGE_START < 1000)
7962 {
7963 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7964 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7965 }
7966 }
7967 #ifndef SERVER
7968 else if (action_id ==
EActions.WATCH_PLAYER)
7969 {
7970 PluginDeveloper.SetDeveloperItemClientEx(player);
7971 }
7972 #endif
7974 {
7975 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7976 {
7977 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7978 OnDebugButtonPressServer(id + 1);
7979 }
7980
7981 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7982 {
7983 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7985 }
7986
7987 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7988 {
7989 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7991 }
7992
7993 else if (action_id ==
EActions.ADD_QUANTITY)
7994 {
7995 if (IsMagazine())
7996 {
7997 Magazine mag = Magazine.Cast(this);
7998 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7999 }
8000 else
8001 {
8003 }
8004
8005 if (m_EM)
8006 {
8007 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8008 }
8009
8010 }
8011
8012 else if (action_id ==
EActions.REMOVE_QUANTITY)
8013 {
8014 if (IsMagazine())
8015 {
8016 Magazine mag2 = Magazine.Cast(this);
8017 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8018 }
8019 else
8020 {
8022 }
8023 if (m_EM)
8024 {
8025 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8026 }
8027
8028 }
8029
8030 else if (action_id ==
EActions.SET_QUANTITY_0)
8031 {
8033
8034 if (m_EM)
8035 {
8036 m_EM.SetEnergy(0);
8037 }
8038 }
8039
8040 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8041 {
8043
8044 if (m_EM)
8045 {
8046 m_EM.SetEnergy(m_EM.GetEnergyMax());
8047 }
8048 }
8049
8050 else if (action_id ==
EActions.ADD_HEALTH)
8051 {
8052 AddHealth("","",GetMaxHealth("","Health")/5);
8053 }
8054 else if (action_id ==
EActions.REMOVE_HEALTH)
8055 {
8056 AddHealth("","",-GetMaxHealth("","Health")/5);
8057 }
8058 else if (action_id ==
EActions.DESTROY_HEALTH)
8059 {
8060 SetHealth01("","",0);
8061 }
8062 else if (action_id ==
EActions.WATCH_ITEM)
8063 {
8065 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8066 #ifdef DEVELOPER
8067 SetDebugDeveloper_item(this);
8068 #endif
8069 }
8070
8071 else if (action_id ==
EActions.ADD_TEMPERATURE)
8072 {
8073 AddTemperature(20);
8074
8075 }
8076
8077 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8078 {
8079 AddTemperature(-20);
8080
8081 }
8082
8083 else if (action_id ==
EActions.FLIP_FROZEN)
8084 {
8085 SetFrozen(!GetIsFrozen());
8086
8087 }
8088
8089 else if (action_id ==
EActions.ADD_WETNESS)
8090 {
8092
8093 }
8094
8095 else if (action_id ==
EActions.REMOVE_WETNESS)
8096 {
8098
8099 }
8100
8101 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8102 {
8105
8106
8107 }
8108
8109 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8110 {
8113 }
8114
8115 else if (action_id ==
EActions.MAKE_SPECIAL)
8116 {
8117 auto debugParams = DebugSpawnParams.WithPlayer(player);
8118 OnDebugSpawnEx(debugParams);
8119 }
8120
8121 }
8122
8123
8124 return false;
8125 }
8126
8127
8128
8129
8133
8136
8137
8138
8140 {
8141 return false;
8142 }
8143
8144
8146 {
8147 return true;
8148 }
8149
8150
8152 {
8153 return true;
8154 }
8155
8156
8157
8159 {
8160 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8161 return g_Game.ConfigIsExisting(config_path);
8162 }
8163
8166 {
8167 return null;
8168 }
8169
8171 {
8172 return false;
8173 }
8174
8176 {
8177 return false;
8178 }
8179
8183
8184
8186 {
8187 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8188 return module_repairing.CanRepair(this, item_repair_kit);
8189 }
8190
8191
8192 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8193 {
8194 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8195 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8196 }
8197
8198
8200 {
8201
8202
8203
8204
8205
8206
8207
8208
8209 return 1;
8210 }
8211
8212
8213
8215 {
8217 }
8218
8219
8220
8222 {
8224 }
8225
8226
8235 {
8236 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8237
8238 if (player)
8239 {
8240 player.MessageStatus(text);
8241 }
8242 }
8243
8244
8253 {
8254 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8255
8256 if (player)
8257 {
8258 player.MessageAction(text);
8259 }
8260 }
8261
8262
8271 {
8272 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8273
8274 if (player)
8275 {
8276 player.MessageFriendly(text);
8277 }
8278 }
8279
8280
8289 {
8290 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8291
8292 if (player)
8293 {
8294 player.MessageImportant(text);
8295 }
8296 }
8297
8299 {
8300 return true;
8301 }
8302
8303
8304 override bool KindOf(
string tag)
8305 {
8306 bool found = false;
8307 string item_name = this.
GetType();
8309 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8310
8311 int array_size = item_tag_array.Count();
8312 for (int i = 0; i < array_size; i++)
8313 {
8314 if (item_tag_array.Get(i) == tag)
8315 {
8316 found = true;
8317 break;
8318 }
8319 }
8320 return found;
8321 }
8322
8323
8325 {
8326
8327 super.OnRPC(sender, rpc_type,ctx);
8328
8329
8330 switch (rpc_type)
8331 {
8332 #ifndef SERVER
8333 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8334 Param2<bool, string> p = new Param2<bool, string>(false, "");
8335
8337 return;
8338
8339 bool play = p.param1;
8340 string soundSet = p.param2;
8341
8342 if (play)
8343 {
8345 {
8347 {
8349 }
8350 }
8351 else
8352 {
8354 }
8355 }
8356 else
8357 {
8359 }
8360
8361 break;
8362 #endif
8363
8364 }
8365
8367 {
8369 }
8370 }
8371
8372
8373
8374
8376 {
8377 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8378 return plugin.GetID(
name);
8379 }
8380
8382 {
8383 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8384 return plugin.GetName(id);
8385 }
8386
8389 {
8390
8391
8392 int varFlags;
8393 if (!ctx.
Read(varFlags))
8394 return;
8395
8396 if (varFlags & ItemVariableFlags.FLOAT)
8397 {
8399 }
8400 }
8401
8403 {
8404
8405 super.SerializeNumericalVars(floats_out);
8406
8407
8408
8410 {
8412 }
8413
8415 {
8417 }
8418
8420 {
8422 }
8423
8425 {
8430 }
8431
8433 {
8435 }
8436 }
8437
8439 {
8440
8441 super.DeSerializeNumericalVars(floats);
8442
8443
8444 int index = 0;
8445 int mask = Math.Round(floats.Get(index));
8446
8447 index++;
8448
8450 {
8452 {
8454 }
8455 else
8456 {
8457 float quantity = floats.Get(index);
8459 }
8460 index++;
8461 }
8462
8464 {
8465 float wet = floats.Get(index);
8467 index++;
8468 }
8469
8471 {
8472 int liquidtype = Math.Round(floats.Get(index));
8474 index++;
8475 }
8476
8478 {
8480 index++;
8482 index++;
8484 index++;
8486 index++;
8487 }
8488
8490 {
8491 int cleanness = Math.Round(floats.Get(index));
8493 index++;
8494 }
8495 }
8496
8498 {
8499 super.WriteVarsToCTX(ctx);
8500
8501
8503 {
8505 }
8506
8508 {
8510 }
8511
8513 {
8515 }
8516
8518 {
8519 int r,g,b,a;
8525 }
8526
8528 {
8530 }
8531 }
8532
8534 {
8535 if (!super.ReadVarsFromCTX(ctx,version))
8536 return false;
8537
8538 int intValue;
8539 float value;
8540
8541 if (version < 140)
8542 {
8543 if (!ctx.
Read(intValue))
8544 return false;
8545
8546 m_VariablesMask = intValue;
8547 }
8548
8550 {
8551 if (!ctx.
Read(value))
8552 return false;
8553
8555 {
8557 }
8558 else
8559 {
8561 }
8562 }
8563
8564 if (version < 140)
8565 {
8567 {
8568 if (!ctx.
Read(value))
8569 return false;
8570 SetTemperatureDirect(value);
8571 }
8572 }
8573
8575 {
8576 if (!ctx.
Read(value))
8577 return false;
8579 }
8580
8582 {
8583 if (!ctx.
Read(intValue))
8584 return false;
8586 }
8587
8589 {
8590 int r,g,b,a;
8592 return false;
8594 return false;
8596 return false;
8598 return false;
8599
8601 }
8602
8604 {
8605 if (!ctx.
Read(intValue))
8606 return false;
8608 }
8609
8610 if (version >= 138 && version < 140)
8611 {
8613 {
8614 if (!ctx.
Read(intValue))
8615 return false;
8616 SetFrozen(intValue);
8617 }
8618 }
8619
8620 return true;
8621 }
8622
8623
8625 {
8628 {
8630 }
8631
8632 if (!super.OnStoreLoad(ctx, version))
8633 {
8635 return false;
8636 }
8637
8638 if (version >= 114)
8639 {
8640 bool hasQuickBarIndexSaved;
8641
8642 if (!ctx.
Read(hasQuickBarIndexSaved))
8643 {
8645 return false;
8646 }
8647
8648 if (hasQuickBarIndexSaved)
8649 {
8650 int itmQBIndex;
8651
8652
8653 if (!ctx.
Read(itmQBIndex))
8654 {
8656 return false;
8657 }
8658
8659 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8660 if (itmQBIndex != -1 && parentPlayer)
8661 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8662 }
8663 }
8664 else
8665 {
8666
8667 PlayerBase player;
8668 int itemQBIndex;
8669 if (version ==
int.
MAX)
8670 {
8671 if (!ctx.
Read(itemQBIndex))
8672 {
8674 return false;
8675 }
8676 }
8677 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8678 {
8679
8680 if (!ctx.
Read(itemQBIndex))
8681 {
8683 return false;
8684 }
8685 if (itemQBIndex != -1 && player)
8686 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8687 }
8688 }
8689
8690 if (version < 140)
8691 {
8692
8693 if (!LoadVariables(ctx, version))
8694 {
8696 return false;
8697 }
8698 }
8699
8700
8702 {
8704 return false;
8705 }
8706 if (version >= 132)
8707 {
8709 if (raib)
8710 {
8712 {
8714 return false;
8715 }
8716 }
8717 }
8718
8720 return true;
8721 }
8722
8723
8724
8726 {
8727 super.OnStoreSave(ctx);
8728
8729 PlayerBase player;
8730 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8731 {
8733
8734 int itemQBIndex = -1;
8735 itemQBIndex = player.FindQuickBarEntityIndex(this);
8736 ctx.
Write(itemQBIndex);
8737 }
8738 else
8739 {
8741 }
8742
8744
8746 if (raib)
8747 {
8749 }
8750 }
8751
8752
8754 {
8755 super.AfterStoreLoad();
8756
8758 {
8760 }
8761
8763 {
8766 }
8767 }
8768
8770 {
8771 super.EEOnAfterLoad();
8772
8774 {
8776 }
8777
8780 }
8781
8783 {
8784 return false;
8785 }
8786
8787
8788
8790 {
8792 {
8793 #ifdef PLATFORM_CONSOLE
8794
8796 {
8798 if (menu)
8799 {
8801 }
8802 }
8803 #endif
8804 }
8805
8807 {
8810 }
8811
8813 {
8814 SetWeightDirty();
8816 }
8818 {
8821 }
8822
8824 {
8827
8830 }
8832 {
8836 }
8837
8838 super.OnVariablesSynchronized();
8839 }
8840
8841
8842
8844 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8845 {
8846 if (!IsServerCheck(allow_client))
8847 return false;
8848
8850 return false;
8851
8854
8855 if (value <= (min + 0.001))
8856 value = min;
8857
8858 if (value == min)
8859 {
8860 if (destroy_config)
8861 {
8862 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8863 if (dstr)
8864 {
8866 this.Delete();
8867 return true;
8868 }
8869 }
8870 else if (destroy_forced)
8871 {
8873 this.Delete();
8874 return true;
8875 }
8876
8878 }
8879
8882
8884 {
8885 EntityAI parent = GetHierarchyRoot();
8886 InventoryLocation iLoc = new InventoryLocation();
8887 GetInventory().GetCurrentInventoryLocation(iLoc);
8889 {
8890 int iLocSlot = iLoc.
GetSlot();
8892 {
8894 }
8896 {
8898 }
8899 }
8900 }
8901
8903 {
8905
8906 if (delta)
8908 }
8909
8911
8912 return false;
8913 }
8914
8915
8917 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8918 {
8920 }
8921
8923 {
8926 }
8927
8929 {
8932 }
8933
8935 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8936 {
8937 float value_clamped = Math.Clamp(value, 0, 1);
8939 SetQuantity(result, destroy_config, destroy_forced);
8940 }
8941
8942
8945 {
8947 }
8948
8950 {
8952 }
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8964 {
8965 int slot = -1;
8966 GameInventory inventory = GetInventory();
8967 if (inventory)
8968 {
8969 InventoryLocation il = new InventoryLocation;
8972 }
8973
8975 }
8976
8978 {
8979 float quantity_max = 0;
8980
8982 {
8983 if (attSlotID != -1)
8984 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8985
8986 if (quantity_max <= 0)
8988 }
8989
8990 if (quantity_max <= 0)
8992
8993 return quantity_max;
8994 }
8995
8997 {
8999 }
9000
9002 {
9004 }
9005
9006
9008 {
9010 }
9011
9013 {
9015 }
9016
9018 {
9020 }
9021
9022
9024 {
9025
9026 float weightEx = GetWeightEx();
9027 float special = GetInventoryAndCargoWeight();
9028 return weightEx - special;
9029 }
9030
9031
9033 {
9035 }
9036
9038 {
9040 {
9041 #ifdef DEVELOPER
9042 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9043 {
9044 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9046 }
9047 #endif
9048
9050 }
9051 else if (HasEnergyManager())
9052 {
9053 #ifdef DEVELOPER
9054 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9055 {
9056 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9057 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9058 }
9059 #endif
9060 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9061 }
9062 else
9063 {
9064 #ifdef DEVELOPER
9065 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9066 {
9067 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9068 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9069 }
9070 #endif
9071 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9072 }
9073 }
9074
9077 {
9078 int item_count = 0;
9080
9081 GameInventory inventory = GetInventory();
9082 CargoBase cargo = inventory.
GetCargo();
9083 if (cargo != NULL)
9084 {
9086 }
9087
9089 for (int i = 0; i < nAttachments; ++i)
9090 {
9092 if (item)
9093 item_count += item.GetNumberOfItems();
9094 }
9095 return item_count;
9096 }
9097
9100 {
9101 float weight = 0;
9102 float wetness = 1;
9103 if (include_wetness)
9106 {
9107 weight = wetness * m_ConfigWeight;
9108 }
9110 {
9111 weight = 1;
9112 }
9113 return weight;
9114 }
9115
9116
9117
9119 {
9120 GameInventory inventory = GetInventory();
9121 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9122 {
9123 array<EntityAI> items = new array<EntityAI>;
9125 for (int i = 0; i < items.Count(); ++i)
9126 {
9128 if (item)
9129 {
9130 g_Game.ObjectDelete(item);
9131 }
9132 }
9133 }
9134 }
9135
9136
9137
9138
9140 {
9141 float energy = 0;
9142 if (HasEnergyManager())
9143 {
9144 energy = GetCompEM().GetEnergy();
9145 }
9146 return energy;
9147 }
9148
9149
9151 {
9152 super.OnEnergyConsumed();
9153
9155 }
9156
9158 {
9159 super.OnEnergyAdded();
9160
9162 }
9163
9164
9166 {
9167 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9168 {
9170 {
9171 float energy_0to1 = GetCompEM().GetEnergy0To1();
9173 }
9174 }
9175 }
9176
9177
9179 {
9180 return ConfigGetFloat("heatIsolation");
9181 }
9182
9184 {
9186 }
9187
9189 {
9190 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9191 if (
g_Game.ConfigIsExisting(paramPath))
9192 return g_Game.ConfigGetFloat(paramPath);
9193
9194 return 0.0;
9195 }
9196
9198 {
9199 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9200 if (
g_Game.ConfigIsExisting(paramPath))
9201 return g_Game.ConfigGetFloat(paramPath);
9202
9203 return 0.0;
9204 }
9205
9206 override void SetWet(
float value,
bool allow_client =
false)
9207 {
9208 if (!IsServerCheck(allow_client))
9209 return;
9210
9213
9215
9216 m_VarWet = Math.Clamp(value, min, max);
9217
9219 {
9222 }
9223 }
9224
9225 override void AddWet(
float value)
9226 {
9228 }
9229
9231 {
9233 }
9234
9236 {
9238 }
9239
9241 {
9243 }
9244
9246 {
9248 }
9249
9251 {
9253 }
9254
9256 {
9259 if (newLevel != oldLevel)
9260 {
9262 }
9263 }
9264
9266 {
9267 SetWeightDirty();
9268 }
9269
9271 {
9272 return GetWetLevelInternal(
m_VarWet);
9273 }
9274
9275
9276
9278 {
9280 }
9281
9283 {
9285 }
9286
9288 {
9290 }
9291
9293 {
9295 }
9296
9297
9298
9300 {
9301 if (ConfigIsExisting("itemModelLength"))
9302 {
9303 return ConfigGetFloat("itemModelLength");
9304 }
9305 return 0;
9306 }
9307
9309 {
9310 if (ConfigIsExisting("itemAttachOffset"))
9311 {
9312 return ConfigGetFloat("itemAttachOffset");
9313 }
9314 return 0;
9315 }
9316
9317 override void SetCleanness(
int value,
bool allow_client =
false)
9318 {
9319 if (!IsServerCheck(allow_client))
9320 return;
9321
9323
9325
9328 }
9329
9331 {
9333 }
9334
9336 {
9337 return true;
9338 }
9339
9340
9341
9342
9344 {
9346 }
9347
9349 {
9351 }
9352
9353
9354
9355
9356 override void SetColor(
int r,
int g,
int b,
int a)
9357 {
9363 }
9365 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9366 {
9371 }
9372
9374 {
9376 }
9377
9380 {
9381 int r,g,b,a;
9383 r = r/255;
9384 g = g/255;
9385 b = b/255;
9386 a = a/255;
9387 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9388 }
9389
9390
9391
9392 override void SetLiquidType(
int value,
bool allow_client =
false)
9393 {
9394 if (!IsServerCheck(allow_client))
9395 return;
9396
9401 }
9402
9404 {
9405 return ConfigGetInt("varLiquidTypeInit");
9406 }
9407
9409 {
9411 }
9412
9414 {
9416 SetFrozen(false);
9417 }
9418
9421 {
9422 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9423 }
9424
9425
9428 {
9429 PlayerBase nplayer;
9430 if (PlayerBase.CastTo(nplayer, player))
9431 {
9433 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9434 }
9435 }
9436
9437
9440 {
9441 PlayerBase nplayer;
9442 if (PlayerBase.CastTo(nplayer,player))
9443 {
9444 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9445 }
9446
9447 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9448
9449 if (HasEnergyManager())
9450 {
9451 GetCompEM().UpdatePlugState();
9452 }
9453 }
9454
9455
9457 {
9458 super.OnPlacementStarted(player);
9459
9461 }
9462
9463 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9464 {
9466 {
9467 m_AdminLog.OnPlacementComplete(player,
this);
9468 }
9469
9470 super.OnPlacementComplete(player, position, orientation);
9471 }
9472
9473
9474
9475
9476
9478 {
9480 {
9481 return true;
9482 }
9483 else
9484 {
9485 return false;
9486 }
9487 }
9488
9489
9491 {
9493 {
9495 }
9496 }
9497
9498
9500 {
9502 }
9503
9505 {
9507 }
9508
9509 override void InsertAgent(
int agent,
float count = 1)
9510 {
9511 if (count < 1)
9512 return;
9513
9515 }
9516
9519 {
9521 }
9522
9523
9525 {
9527 }
9528
9529
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9551
9552
9553
9554
9555
9556
9557
9558
9559
9560
9561
9562
9563
9564
9565
9566
9567
9568
9569
9571 {
9573 return false;
9574 return true;
9575 }
9576
9578 {
9579
9581 }
9582
9583
9586 {
9587 super.CheckForRoofLimited(timeTresholdMS);
9588
9589 float time =
g_Game.GetTime();
9590 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9591 {
9592 m_PreviousRoofTestTime = time;
9593 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9594 }
9595 }
9596
9597
9599 {
9601 {
9602 return 0;
9603 }
9604
9605 if (GetInventory().GetAttachmentSlotsCount() != 0)
9606 {
9607 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9608 if (filter)
9609 return filter.GetProtectionLevel(type, false, system);
9610 else
9611 return 0;
9612 }
9613
9614 string subclassPath, entryName;
9615
9616 switch (type)
9617 {
9619 entryName = "biological";
9620 break;
9622 entryName = "chemical";
9623 break;
9624 default:
9625 entryName = "biological";
9626 break;
9627 }
9628
9629 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9630
9631 return g_Game.ConfigGetFloat(subclassPath + entryName);
9632 }
9633
9634
9635
9638 {
9639 if (!IsMagazine())
9641
9643 }
9644
9645
9646
9647
9648
9653 {
9654 return true;
9655 }
9656
9658 {
9660 }
9661
9662
9663
9664
9665
9667 {
9668 if (parent)
9669 {
9670 if (parent.IsInherited(DayZInfected))
9671 return true;
9672
9673 if (!parent.IsRuined())
9674 return true;
9675 }
9676
9677 return true;
9678 }
9679
9681 {
9682 if (!super.CanPutAsAttachment(parent))
9683 {
9684 return false;
9685 }
9686
9687 if (!IsRuined() && !parent.IsRuined())
9688 {
9689 return true;
9690 }
9691
9692 return false;
9693 }
9694
9696 {
9697
9698
9699
9700
9701 return super.CanReceiveItemIntoCargo(item);
9702 }
9703
9705 {
9706
9707
9708
9709
9710 GameInventory attachmentInv = attachment.GetInventory();
9712 {
9713 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9714 return false;
9715 }
9716
9717 InventoryLocation loc = new InventoryLocation();
9718 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9719 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9720 return false;
9721
9722 return super.CanReceiveAttachment(attachment, slotId);
9723 }
9724
9726 {
9727 if (!super.CanReleaseAttachment(attachment))
9728 return false;
9729
9730 return GetInventory().AreChildrenAccessible();
9731 }
9732
9733
9734
9735
9736
9737
9738
9739
9740
9741
9742
9743
9744
9745
9746
9747
9748
9749
9750
9751
9752
9754 {
9755 int id = muzzle_owner.GetMuzzleID();
9756 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9757
9758 if (WPOF_array)
9759 {
9760 for (int i = 0; i < WPOF_array.Count(); i++)
9761 {
9762 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9763
9764 if (WPOF)
9765 {
9766 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9767 }
9768 }
9769 }
9770 }
9771
9772
9774 {
9775 int id = muzzle_owner.GetMuzzleID();
9777
9778 if (WPOBE_array)
9779 {
9780 for (int i = 0; i < WPOBE_array.Count(); i++)
9781 {
9782 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9783
9784 if (WPOBE)
9785 {
9786 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9787 }
9788 }
9789 }
9790 }
9791
9792
9794 {
9795 int id = muzzle_owner.GetMuzzleID();
9796 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9797
9798 if (WPOOH_array)
9799 {
9800 for (int i = 0; i < WPOOH_array.Count(); i++)
9801 {
9802 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9803
9804 if (WPOOH)
9805 {
9806 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9807 }
9808 }
9809 }
9810 }
9811
9812
9814 {
9815 int id = muzzle_owner.GetMuzzleID();
9816 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9817
9818 if (WPOOH_array)
9819 {
9820 for (int i = 0; i < WPOOH_array.Count(); i++)
9821 {
9822 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9823
9824 if (WPOOH)
9825 {
9826 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9827 }
9828 }
9829 }
9830 }
9831
9832
9834 {
9835 int id = muzzle_owner.GetMuzzleID();
9836 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9837
9838 if (WPOOH_array)
9839 {
9840 for (int i = 0; i < WPOOH_array.Count(); i++)
9841 {
9842 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9843
9844 if (WPOOH)
9845 {
9846 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9847 }
9848 }
9849 }
9850 }
9851
9852
9853
9855 {
9857 {
9858 return true;
9859 }
9860
9861 return false;
9862 }
9863
9865 {
9867 {
9868 return true;
9869 }
9870
9871 return false;
9872 }
9873
9875 {
9877 {
9878 return true;
9879 }
9880
9881 return false;
9882 }
9883
9885 {
9886 return false;
9887 }
9888
9891 {
9892 return UATimeSpent.DEFAULT_DEPLOY;
9893 }
9894
9895
9896
9897
9899 {
9901 SetSynchDirty();
9902 }
9903
9905 {
9907 }
9908
9909
9911 {
9912 return false;
9913 }
9914
9917 {
9918 string att_type = "None";
9919
9920 if (ConfigIsExisting("soundAttType"))
9921 {
9922 att_type = ConfigGetString("soundAttType");
9923 }
9924
9926 }
9927
9929 {
9931 }
9932
9933
9934
9935
9936
9942
9944 {
9947
9949 }
9950
9951
9953 {
9955 return;
9956
9958
9961
9964
9965 SoundParameters params = new SoundParameters();
9969 }
9970
9971
9973 {
9975 {
9978
9979 SetSynchDirty();
9980
9983 }
9984 }
9985
9987 {
9989 }
9990
9991
9993 {
9995 return;
9996
9998 SetSynchDirty();
9999
10002 }
10003
10005 {
10008 }
10009
10011 {
10013 }
10014
10015 void OnApply(PlayerBase player);
10016
10018 {
10019 return 1.0;
10020 };
10021
10023 {
10025 }
10026
10028 {
10030 }
10031
10033
10035 {
10036 SetDynamicPhysicsLifeTime(0.01);
10038 }
10039
10041 {
10042 array<string> zone_names = new array<string>;
10043 GetDamageZones(zone_names);
10044 for (int i = 0; i < zone_names.Count(); i++)
10045 {
10046 SetHealthMax(zone_names.Get(i),"Health");
10047 }
10048 SetHealthMax("","Health");
10049 }
10050
10053 {
10054 float global_health = GetHealth01("","Health");
10055 array<string> zones = new array<string>;
10056 GetDamageZones(zones);
10057
10058 for (int i = 0; i < zones.Count(); i++)
10059 {
10060 SetHealth01(zones.Get(i),"Health",global_health);
10061 }
10062 }
10063
10066 {
10067 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10068 }
10069
10071 {
10072 if (!hasRootAsPlayer)
10073 {
10074 if (refParentIB)
10075 {
10076
10077 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10078 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10079
10080 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10081 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10082
10085 }
10086 else
10087 {
10088
10091 }
10092 }
10093 }
10094
10096 {
10098 {
10099 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10100 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10101 {
10102 float heatPermCoef = 1.0;
10104 while (ent)
10105 {
10106 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10107 ent = ent.GetHierarchyParent();
10108 }
10109
10110 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10111 }
10112 }
10113 }
10114
10116 {
10117
10118 EntityAI parent = GetHierarchyParent();
10119 if (!parent)
10120 {
10121 hasParent = false;
10122 hasRootAsPlayer = false;
10123 }
10124 else
10125 {
10126 hasParent = true;
10127 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10128 refParentIB =
ItemBase.Cast(parent);
10129 }
10130 }
10131
10132 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10133 {
10134
10135 }
10136
10138 {
10139
10140 return false;
10141 }
10142
10144 {
10145
10146
10147 return false;
10148 }
10149
10151 {
10152
10153 return false;
10154 }
10155
10158 {
10159 return !GetIsFrozen() &&
IsOpen();
10160 }
10161
10163 {
10164 bool hasParent = false, hasRootAsPlayer = false;
10166
10167 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10168 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10169
10170 if (wwtu || foodDecay)
10171 {
10175
10176 if (processWetness || processTemperature || processDecay)
10177 {
10179
10180 if (processWetness)
10181 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10182
10183 if (processTemperature)
10185
10186 if (processDecay)
10187 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10188 }
10189 }
10190 }
10191
10194 {
10196 }
10197
10199 {
10202
10203 return super.GetTemperatureFreezeThreshold();
10204 }
10205
10207 {
10210
10211 return super.GetTemperatureThawThreshold();
10212 }
10213
10215 {
10218
10219 return super.GetItemOverheatThreshold();
10220 }
10221
10223 {
10225 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10226
10227 return super.GetTemperatureFreezeTime();
10228 }
10229
10231 {
10233 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10234
10235 return super.GetTemperatureThawTime();
10236 }
10237
10242
10244 {
10245 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10246 }
10247
10249 {
10250 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10251 }
10252
10255 {
10257 }
10258
10260 {
10262 }
10263
10265 {
10267 }
10268
10271 {
10272 return null;
10273 }
10274
10277 {
10278 return false;
10279 }
10280
10282 {
10284 {
10287 if (!trg)
10288 {
10290 explosive = this;
10291 }
10292
10293 explosive.PairRemote(trg);
10295
10296 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10297 trg.SetPersistentPairID(persistentID);
10298 explosive.SetPersistentPairID(persistentID);
10299
10300 return true;
10301 }
10302 return false;
10303 }
10304
10307 {
10308 float ret = 1.0;
10311 ret *= GetHealth01();
10312
10313 return ret;
10314 }
10315
10316 #ifdef DEVELOPER
10317 override void SetDebugItem()
10318 {
10319 super.SetDebugItem();
10320 _itemBase = this;
10321 }
10322
10324 {
10325 string text = super.GetDebugText();
10326
10328 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10329
10330 return text;
10331 }
10332 #endif
10333
10335 {
10336 return true;
10337 }
10338
10340
10342
10344 {
10347 }
10348
10349
10357
10373
10374 [
Obsolete(
"Use ItemSoundHandler instead")]
10377 {
10378 if (!
g_Game.IsDedicatedServer())
10379 {
10380 if (ConfigIsExisting("attachSoundSet"))
10381 {
10382 string cfg_path = "";
10383 string soundset = "";
10384 string type_name =
GetType();
10385
10388 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10389 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10390
10391 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10392 {
10393 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10394 {
10395 if (cfg_slot_array[i] == slot_type)
10396 {
10397 soundset = cfg_soundset_array[i];
10398 break;
10399 }
10400 }
10401 }
10402
10403 if (soundset != "")
10404 {
10405 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10407 }
10408 }
10409 }
10410 }
10411
10413}
10414
10416{
10418 if (entity)
10419 {
10420 bool is_item = entity.IsInherited(
ItemBase);
10421 if (is_item && full_quantity)
10422 {
10425 }
10426 }
10427 else
10428 {
10430 return NULL;
10431 }
10432 return entity;
10433}
10434
10436{
10437 if (item)
10438 {
10439 if (health > 0)
10440 item.SetHealth("", "", health);
10441
10442 if (item.CanHaveTemperature())
10443 {
10445 if (item.CanFreeze())
10446 item.SetFrozen(false);
10447 }
10448
10449 if (item.HasEnergyManager())
10450 {
10451 if (quantity >= 0)
10452 {
10453 item.GetCompEM().SetEnergy0To1(quantity);
10454 }
10455 else
10456 {
10458 }
10459 }
10460 else if (item.IsMagazine())
10461 {
10462 Magazine mag = Magazine.Cast(item);
10463 if (quantity >= 0)
10464 {
10465 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10466 }
10467 else
10468 {
10470 }
10471
10472 }
10473 else
10474 {
10475 if (quantity >= 0)
10476 {
10477 item.SetQuantityNormalized(quantity, false);
10478 }
10479 else
10480 {
10482 }
10483
10484 }
10485 }
10486}
10487
10488#ifdef DEVELOPER
10490#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.