5532{
5534 {
5535 return true;
5536 }
5537};
5538
5540{
5541
5542};
5543
5544
5545
5547{
5551
5553
5556
5557
5558
5559
5560
5569
5575
5580
5585
5606 protected bool m_IsResultOfSplit
5607
5609
5614
5615
5616
5618
5622
5623
5624
5626
5629
5630
5631
5637
5638
5646
5649
5650
5652
5653
5655
5656
5661
5662
5667
5669
5670
5672
5673
5675 {
5680
5681 if (!
g_Game.IsDedicatedServer())
5682 {
5684 {
5686
5688 {
5690 }
5691 }
5692
5695 }
5696
5697 m_OldLocation = null;
5698
5700 {
5702 }
5703
5704 if (ConfigIsExisting("headSelectionsToHide"))
5705 {
5708 }
5709
5711 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5712 {
5714 }
5715
5717
5718 m_IsResultOfSplit = false;
5719
5721 }
5722
5724 {
5725 super.InitItemVariables();
5726
5732 m_Count = ConfigGetInt(
"count");
5733
5736
5741
5744
5749
5761
5765
5766
5769 if (ConfigIsExisting("canBeSplit"))
5770 {
5773 }
5774
5776 if (ConfigIsExisting("itemBehaviour"))
5778
5779
5782 RegisterNetSyncVariableInt("m_VarLiquidType");
5783 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5784
5785 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5786 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5787 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5788
5789 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5790 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5791 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5792 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5793
5794 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5795 RegisterNetSyncVariableBool("m_IsTakeable");
5796 RegisterNetSyncVariableBool("m_IsHologram");
5797
5800 {
5803 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5804 }
5805
5807
5809 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5811
5813 }
5814
5816 {
5818 }
5819
5821 {
5824 {
5829 }
5830 }
5831
5832 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5833 {
5835 {
5838 }
5839
5841 }
5842
5844 {
5850 }
5851
5853
5855 {
5857
5858 if (!action)
5859 {
5860 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5861 return;
5862 }
5863
5865 if (!ai)
5866 {
5868 return;
5869 }
5870
5872 if (!action_array)
5873 {
5874 action_array = new array<ActionBase_Basic>;
5876 }
5877 if (LogManager.IsActionLogEnable())
5878 {
5879 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5880 }
5881
5882 if (action_array.Find(action) != -1)
5883 {
5884 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5885 }
5886 else
5887 {
5888 action_array.Insert(action);
5889 }
5890 }
5891
5893 {
5894 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5895 ActionBase action = player.GetActionManager().GetAction(actionName);
5898
5899 if (action_array)
5900 {
5901 action_array.RemoveItem(action);
5902 }
5903 }
5904
5905
5906
5908 {
5909 ActionOverrideData overrideData = new ActionOverrideData();
5913
5915 if (!actionMap)
5916 {
5919 }
5920
5921 actionMap.Insert(this.
Type(), overrideData);
5922
5923 }
5924
5926
5928
5929
5931 {
5934
5937
5938 string config_to_search = "CfgVehicles";
5939 string muzzle_owner_config;
5940
5942 {
5943 if (IsInherited(Weapon))
5944 config_to_search = "CfgWeapons";
5945
5946 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5947
5948 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5949
5950 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
5951
5952 if (config_OnFire_subclass_count > 0)
5953 {
5954 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5955
5956 for (int i = 0; i < config_OnFire_subclass_count; i++)
5957 {
5958 string particle_class = "";
5959 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
5960 string config_OnFire_entry = config_OnFire_class + particle_class;
5961 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5962 WPOF_array.Insert(WPOF);
5963 }
5964
5965
5967 }
5968 }
5969
5971 {
5972 config_to_search = "CfgWeapons";
5973 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5974
5975 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5976
5977 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5978
5979 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5980 {
5981 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5982
5983 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5984 {
5985 string particle_class2 = "";
5986 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5987 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5988 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5989 WPOBE_array.Insert(WPOBE);
5990 }
5991
5992
5994 }
5995 }
5996 }
5997
5998
6000 {
6003
6005 {
6006 string config_to_search = "CfgVehicles";
6007
6008 if (IsInherited(Weapon))
6009 config_to_search = "CfgWeapons";
6010
6011 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
6012 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
6013
6014 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
6015 {
6016
6018
6020 {
6022 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
6024 return;
6025 }
6026
6029
6030
6031
6032 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
6033 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
6034
6035 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
6036 {
6037 string particle_class = "";
6038 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
6039 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
6040 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
6041
6042 if (entry_type == CT_CLASS)
6043 {
6044 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
6045 WPOOH_array.Insert(WPOF);
6046 }
6047 }
6048
6049
6051 }
6052 }
6053 }
6054
6056 {
6058 }
6059
6061 {
6063 {
6065
6068
6071
6072 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6073 }
6074 }
6075
6077 {
6079 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6080
6082 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6083
6085 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6086
6088 {
6090 }
6091 }
6092
6094 {
6096 }
6097
6099 {
6102 else
6104
6106 {
6109 }
6110 else
6111 {
6114
6117 }
6118
6120 }
6121
6123 {
6125 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6126 }
6127
6129 {
6131 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6133 }
6134
6136 {
6138 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6139 }
6140
6142 {
6145
6146 OverheatingParticle OP = new OverheatingParticle();
6151
6153 }
6154
6156 {
6159
6160 return -1;
6161 }
6162
6164 {
6166 {
6169
6170 for (int i = count; i > 0; --i)
6171 {
6172 int id = i - 1;
6175
6178
6179 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6180 {
6181 if (p)
6182 {
6185 }
6186 }
6187 }
6188 }
6189 }
6190
6192 {
6194 {
6196 {
6197 int id = i - 1;
6199
6200 if (OP)
6201 {
6203
6204 if (p)
6205 {
6207 }
6208
6209 delete OP;
6210 }
6211 }
6212
6215 }
6216 }
6217
6220 {
6221 return 0.0;
6222 }
6223
6224
6226 {
6227 return 250;
6228 }
6229
6231 {
6232 return 0;
6233 }
6234
6237 {
6239 return true;
6240
6241 return false;
6242 }
6243
6246 {
6249
6251 {
6253 }
6254 else
6255 {
6256
6258 }
6259
6261 }
6262
6269 {
6270 return -1;
6271 }
6272
6273
6274
6275
6277 {
6279 {
6280 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6281 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6282
6283 if (r_index >= 0)
6284 {
6285 InventoryLocation r_il = new InventoryLocation;
6286 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6287
6288 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6291 {
6292 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6293 }
6295 {
6296 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6297 }
6298
6299 }
6300
6301 player.GetHumanInventory().ClearUserReservedLocation(this);
6302 }
6303
6306 }
6307
6308
6309
6310
6312 {
6313 return ItemBase.m_DebugActionsMask;
6314 }
6315
6317 {
6318 return ItemBase.m_DebugActionsMask & mask;
6319 }
6320
6322 {
6323 ItemBase.m_DebugActionsMask = mask;
6324 }
6325
6327 {
6328 ItemBase.m_DebugActionsMask |= mask;
6329 }
6330
6332 {
6333 ItemBase.m_DebugActionsMask &= ~mask;
6334 }
6335
6337 {
6339 {
6341 }
6342 else
6343 {
6345 }
6346 }
6347
6348
6350 {
6351 if (GetEconomyProfile())
6352 {
6353 float q_max = GetEconomyProfile().GetQuantityMax();
6354 if (q_max > 0)
6355 {
6356 float q_min = GetEconomyProfile().GetQuantityMin();
6357 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6358
6360 {
6361 ComponentEnergyManager comp = GetCompEM();
6363 {
6365 }
6366 }
6368 {
6370
6371 }
6372
6373 }
6374 }
6375 }
6376
6379 {
6380 EntityAI parent = GetHierarchyParent();
6381
6382 if (parent)
6383 {
6384 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6385 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6386 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6387 }
6388 }
6389
6392 {
6393 EntityAI parent = GetHierarchyParent();
6394
6395 if (parent)
6396 {
6397 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6398 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6399 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6400 }
6401 }
6402
6404 {
6405
6406
6407
6408
6410
6412 {
6413 if (ScriptInputUserData.CanStoreInputUserData())
6414 {
6415 ScriptInputUserData ctx = new ScriptInputUserData;
6421 ctx.
Write(use_stack_max);
6424
6426 {
6427 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6428 }
6429 }
6430 }
6431 else if (!
g_Game.IsMultiplayer())
6432 {
6434 }
6435 }
6436
6438 {
6440 }
6441
6443 {
6445 }
6446
6448 {
6450 }
6451
6453 {
6454
6455 return false;
6456 }
6457
6459 {
6460 return false;
6461 }
6462
6466 {
6467 return false;
6468 }
6469
6471 {
6472 return "";
6473 }
6474
6476
6478 {
6479 return false;
6480 }
6481
6483 {
6484 return true;
6485 }
6486
6487
6488
6490 {
6491 return true;
6492 }
6493
6495 {
6496 return true;
6497 }
6498
6500 {
6501 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6503 }
6504
6506 {
6508 }
6509
6511 {
6513 if (!is_being_placed)
6515 SetSynchDirty();
6516 }
6517
6518
6520
6522 {
6524 }
6525
6527 {
6529 }
6530
6532 {
6533 return 1;
6534 }
6535
6537 {
6538 return false;
6539 }
6540
6542 {
6544 SetSynchDirty();
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
6573
6574
6575
6576
6577
6578
6579
6580
6582 {
6583 super.OnMovedInsideCargo(container);
6584
6585 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6586 }
6587
6588 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6589 {
6590 super.EEItemLocationChanged(oldLoc, newLoc);
6591
6592 PlayerBase newPlayer = null;
6593 PlayerBase oldPlayer = null;
6594
6595 if (newLoc.GetParent())
6596 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6597
6598 if (oldLoc.GetParent())
6599 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6600
6602 {
6603 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6604
6605 if (rIndex >= 0)
6606 {
6607 InventoryLocation rIl = new InventoryLocation;
6608 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6609
6610 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6613 {
6614 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6615 }
6617 {
6619 }
6620
6621 }
6622 }
6623
6625 {
6626 if (newPlayer)
6627 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6628
6629 if (newPlayer == oldPlayer)
6630 {
6631 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6632 {
6634 {
6635 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6636 {
6637 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6638 }
6639 }
6640 else
6641 {
6642 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6643 }
6644 }
6645
6646 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6647 {
6648 int type = oldLoc.GetType();
6650 {
6651 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6652 }
6654 {
6655 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6656 }
6657 }
6658 if (!m_OldLocation)
6659 {
6660 m_OldLocation = new InventoryLocation;
6661 }
6662 m_OldLocation.Copy(oldLoc);
6663 }
6664 else
6665 {
6666 if (m_OldLocation)
6667 {
6668 m_OldLocation.Reset();
6669 }
6670 }
6671
6672 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6673 }
6674 else
6675 {
6676 if (newPlayer)
6677 {
6678 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6679 if (resIndex >= 0)
6680 {
6681 InventoryLocation il = new InventoryLocation;
6682 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6684 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6687 {
6688 il.
GetParent().GetOnReleaseLock().Invoke(it);
6689 }
6691 {
6693 }
6694
6695 }
6696 }
6698 {
6699
6701 }
6702
6703 if (m_OldLocation)
6704 {
6705 m_OldLocation.Reset();
6706 }
6707 }
6708
6710 {
6711 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6712 }
6713
6715 {
6716 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6717 }
6718 }
6719
6720 override void EOnContact(IEntity other, Contact extra)
6721 {
6723 {
6724 int liquidType = -1;
6726 if (impactSpeed > 0.0)
6727 {
6729 #ifndef SERVER
6731 #else
6733 SetSynchDirty();
6734 #endif
6736 }
6737 }
6738
6739 #ifdef SERVER
6740 if (GetCompEM() && GetCompEM().IsPlugged())
6741 {
6742 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6743 GetCompEM().UnplugThis();
6744 }
6745 #endif
6746 }
6747
6749
6751 {
6753 }
6754
6756 {
6757
6758 }
6759
6761 {
6762 super.OnItemLocationChanged(old_owner, new_owner);
6763
6764 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6765 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6766
6767 if (!relatedPlayer && playerNew)
6768 relatedPlayer = playerNew;
6769
6770 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6771 {
6773 if (actionMgr)
6774 {
6775 ActionBase currentAction = actionMgr.GetRunningAction();
6776 if (currentAction)
6778 }
6779 }
6780
6781 Man ownerPlayerOld = null;
6782 Man ownerPlayerNew = null;
6783
6784 if (old_owner)
6785 {
6786 if (old_owner.
IsMan())
6787 {
6788 ownerPlayerOld = Man.Cast(old_owner);
6789 }
6790 else
6791 {
6792 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6793 }
6794 }
6795 else
6796 {
6798 {
6800
6801 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6802 {
6803 GetCompEM().UnplugThis();
6804 }
6805 }
6806 }
6807
6808 if (new_owner)
6809 {
6810 if (new_owner.
IsMan())
6811 {
6812 ownerPlayerNew = Man.Cast(new_owner);
6813 }
6814 else
6815 {
6816 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6817 }
6818 }
6819
6820 if (ownerPlayerOld != ownerPlayerNew)
6821 {
6822 if (ownerPlayerOld)
6823 {
6824 array<EntityAI> subItemsExit = new array<EntityAI>;
6826 for (int i = 0; i < subItemsExit.Count(); i++)
6827 {
6830 }
6831 }
6832
6833 if (ownerPlayerNew)
6834 {
6835 array<EntityAI> subItemsEnter = new array<EntityAI>;
6837 for (int j = 0; j < subItemsEnter.Count(); j++)
6838 {
6841 }
6842 }
6843 }
6844 else if (ownerPlayerNew != null)
6845 {
6846 PlayerBase nplayer;
6847 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6848 {
6849 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6851 for (int k = 0; k < subItemsUpdate.Count(); k++)
6852 {
6854 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6855 }
6856 }
6857 }
6858
6859 if (old_owner)
6860 old_owner.OnChildItemRemoved(this);
6861 if (new_owner)
6862 new_owner.OnChildItemReceived(this);
6863 }
6864
6865
6867 {
6868 super.EEDelete(parent);
6869 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6870 if (player)
6871 {
6873
6874 if (player.IsAlive())
6875 {
6876 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6877 if (r_index >= 0)
6878 {
6879 InventoryLocation r_il = new InventoryLocation;
6880 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6881
6882 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6885 {
6886 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6887 }
6889 {
6890 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6891 }
6892
6893 }
6894
6895 player.RemoveQuickBarEntityShortcut(this);
6896 }
6897 }
6898 }
6899
6901 {
6902 super.EEKilled(killer);
6903
6906 {
6907 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6908 {
6909 if (IsMagazine())
6910 {
6911 if (Magazine.Cast(this).GetAmmoCount() > 0)
6912 {
6914 }
6915 }
6916 else
6917 {
6919 }
6920 }
6921 }
6922 }
6923
6925 {
6926 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6927
6928 super.OnWasAttached(parent, slot_id);
6929
6932
6935 }
6936
6938 {
6939 super.OnWasDetached(parent, slot_id);
6940
6943
6946 }
6947
6949 {
6950 int idx;
6953
6954 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6955 if (inventory_slots.Count() < 1)
6956 {
6957 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6958 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6959 }
6960 else
6961 {
6962 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6963 }
6964
6965 idx = inventory_slots.Find(slot);
6966 if (idx < 0)
6967 return "";
6968
6969 return attach_types.Get(idx);
6970 }
6971
6973 {
6974 int idx = -1;
6975 string slot;
6976
6979
6980 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6981 if (inventory_slots.Count() < 1)
6982 {
6983 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6984 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6985 }
6986 else
6987 {
6988 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6989 if (detach_types.Count() < 1)
6990 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6991 }
6992
6993 for (int i = 0; i < inventory_slots.Count(); i++)
6994 {
6995 slot = inventory_slots.Get(i);
6996 }
6997
6998 if (slot != "")
6999 {
7000 if (detach_types.Count() == 1)
7001 idx = 0;
7002 else
7003 idx = inventory_slots.Find(slot);
7004 }
7005 if (idx < 0)
7006 return "";
7007
7008 return detach_types.Get(idx);
7009 }
7010
7012 {
7013
7015
7016
7017 float min_time = 1;
7018 float max_time = 3;
7019 float delay = Math.RandomFloat(min_time, max_time);
7020
7021 explode_timer.Run(delay, this, "DoAmmoExplosion");
7022 }
7023
7025 {
7026 Magazine magazine = Magazine.Cast(this);
7027 int pop_sounds_count = 6;
7028 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
7029
7030
7031 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
7032 string sound_name = pop_sounds[ sound_idx ];
7033 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
7034
7035
7036 magazine.ServerAddAmmoCount(-1);
7037
7038
7039 float min_temp_to_explode = 100;
7040
7041 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
7042 {
7044 }
7045 }
7046
7047
7048 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
7049 {
7050 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
7051
7052 const int CHANCE_DAMAGE_CARGO = 4;
7053 const int CHANCE_DAMAGE_ATTACHMENT = 1;
7054 const int CHANCE_DAMAGE_NOTHING = 2;
7055
7057 {
7058 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
7059 int chances;
7060 int rnd;
7061
7062 if (GetInventory().GetCargo())
7063 {
7064 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7065 rnd = Math.RandomInt(0,chances);
7066
7067 if (rnd < CHANCE_DAMAGE_CARGO)
7068 {
7070 }
7071 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
7072 {
7074 }
7075 }
7076 else
7077 {
7078 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
7079 rnd = Math.RandomInt(0,chances);
7080
7081 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
7082 {
7084 }
7085 }
7086 }
7087 }
7088
7090 {
7091 CargoBase cargo = GetInventory().GetCargo();
7092 if (cargo)
7093 {
7095 if (item_count > 0)
7096 {
7097 int random_pick = Math.RandomInt(0, item_count);
7099 if (!item.IsExplosive())
7100 {
7101 item.AddHealth("","",damage);
7102 return true;
7103 }
7104 }
7105 }
7106 return false;
7107 }
7108
7110 {
7111 GameInventory inventory = GetInventory();
7113 if (attachment_count > 0)
7114 {
7115 int random_pick = Math.RandomInt(0, attachment_count);
7117 if (!attachment.IsExplosive())
7118 {
7119 attachment.AddHealth("","",damage);
7120 return true;
7121 }
7122 }
7123 return false;
7124 }
7125
7127 {
7129 }
7130
7132 {
7134 return GetInventory().CanRemoveEntity();
7135
7136 return false;
7137 }
7138
7140 {
7141
7143 return false;
7144
7145
7147 return false;
7148
7149
7150
7152 if (delta == 0)
7153 return false;
7154
7155
7156 return true;
7157 }
7158
7160 {
7162 {
7163 if (ScriptInputUserData.CanStoreInputUserData())
7164 {
7165 ScriptInputUserData ctx = new ScriptInputUserData;
7170 ctx.
Write(destination_entity);
7174 }
7175 }
7176 else if (!
g_Game.IsMultiplayer())
7177 {
7179 }
7180 }
7181
7183 {
7184 float split_quantity_new;
7188 InventoryLocation loc = new InventoryLocation;
7189
7190 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7191 {
7193 split_quantity_new = stack_max;
7194 else
7196
7198 {
7199 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7200 if (new_item)
7201 {
7202 new_item.SetResultOfSplit(true);
7203 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7205 new_item.
SetQuantity(split_quantity_new,
false,
true);
7206 }
7207 }
7208 }
7209 else if (destination_entity && slot_id == -1)
7210 {
7211 if (quantity > stack_max)
7212 split_quantity_new = stack_max;
7213 else
7214 split_quantity_new = quantity;
7215
7217 {
7218 GameInventory destinationInventory = destination_entity.GetInventory();
7220 {
7223 }
7224
7225 if (new_item)
7226 {
7227 new_item.SetResultOfSplit(true);
7228 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7230 new_item.
SetQuantity(split_quantity_new,
false,
true);
7231 }
7232 }
7233 }
7234 else
7235 {
7236 if (stack_max != 0)
7237 {
7239 {
7241 }
7242
7243 if (split_quantity_new == 0)
7244 {
7245 if (!
g_Game.IsMultiplayer())
7246 player.PhysicalPredictiveDropItem(this);
7247 else
7248 player.ServerDropEntity(this);
7249 return;
7250 }
7251
7253 {
7255
7256 if (new_item)
7257 {
7258 new_item.SetResultOfSplit(true);
7259 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7262 new_item.PlaceOnSurface();
7263 }
7264 }
7265 }
7266 }
7267 }
7268
7270 {
7271 float split_quantity_new;
7275 InventoryLocation loc = new InventoryLocation;
7276
7277 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7278 {
7280 split_quantity_new = stack_max;
7281 else
7283
7285 {
7286 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7287 if (new_item)
7288 {
7289 new_item.SetResultOfSplit(true);
7290 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7292 new_item.
SetQuantity(split_quantity_new,
false,
true);
7293 }
7294 }
7295 }
7296 else if (destination_entity && slot_id == -1)
7297 {
7298 if (quantity > stack_max)
7299 split_quantity_new = stack_max;
7300 else
7301 split_quantity_new = quantity;
7302
7304 {
7305 GameInventory destinationInventory = destination_entity.GetInventory();
7307 {
7310 }
7311
7312 if (new_item)
7313 {
7314 new_item.SetResultOfSplit(true);
7315 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7317 new_item.
SetQuantity(split_quantity_new,
false,
true);
7318 }
7319 }
7320 }
7321 else
7322 {
7323 if (stack_max != 0)
7324 {
7326 {
7328 }
7329
7331 {
7333
7334 if (new_item)
7335 {
7336 new_item.SetResultOfSplit(true);
7337 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7340 new_item.PlaceOnSurface();
7341 }
7342 }
7343 }
7344 }
7345 }
7346
7348 {
7350 {
7351 if (ScriptInputUserData.CanStoreInputUserData())
7352 {
7353 ScriptInputUserData ctx = new ScriptInputUserData;
7358 dst.WriteToContext(ctx);
7360 }
7361 }
7362 else if (!
g_Game.IsMultiplayer())
7363 {
7365 }
7366 }
7367
7369 {
7371 {
7372 if (ScriptInputUserData.CanStoreInputUserData())
7373 {
7374 ScriptInputUserData ctx = new ScriptInputUserData;
7379 ctx.
Write(destination_entity);
7385 }
7386 }
7387 else if (!
g_Game.IsMultiplayer())
7388 {
7390 }
7391 }
7392
7394 {
7396 }
7397
7399 {
7401 float split_quantity_new;
7403 if (dst.IsValid())
7404 {
7405 int slot_id = dst.GetSlot();
7407
7408 if (quantity > stack_max)
7409 split_quantity_new = stack_max;
7410 else
7411 split_quantity_new = quantity;
7412
7414 {
7416
7417 if (new_item)
7418 {
7419 new_item.SetResultOfSplit(true);
7420 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7422 new_item.
SetQuantity(split_quantity_new,
false,
true);
7423 }
7424
7425 return new_item;
7426 }
7427 }
7428
7429 return null;
7430 }
7431
7433 {
7435 float split_quantity_new;
7437 if (destination_entity)
7438 {
7440 if (quantity > stackable)
7441 split_quantity_new = stackable;
7442 else
7443 split_quantity_new = quantity;
7444
7446 {
7447 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7448 if (new_item)
7449 {
7450 new_item.SetResultOfSplit(true);
7451 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7453 new_item.
SetQuantity(split_quantity_new,
false,
true);
7454 }
7455 }
7456 }
7457 }
7458
7460 {
7462 {
7463 if (ScriptInputUserData.CanStoreInputUserData())
7464 {
7465 ScriptInputUserData ctx = new ScriptInputUserData;
7470 ItemBase destination_entity =
this;
7471 ctx.
Write(destination_entity);
7475 }
7476 }
7477 else if (!
g_Game.IsMultiplayer())
7478 {
7480 }
7481 }
7482
7484 {
7486 float split_quantity_new;
7488 if (player)
7489 {
7491 if (quantity > stackable)
7492 split_quantity_new = stackable;
7493 else
7494 split_quantity_new = quantity;
7495
7497 {
7498 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7499 new_item =
ItemBase.Cast(in_hands);
7500 if (new_item)
7501 {
7502 new_item.SetResultOfSplit(true);
7503 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7505 new_item.SetQuantity(split_quantity_new, false, true);
7506 }
7507 }
7508 }
7509 }
7510
7512 {
7514 float split_quantity_new = Math.Floor(quantity * 0.5);
7515
7517 return;
7518
7520
7521 if (new_item)
7522 {
7523 if (new_item.GetQuantityMax() < split_quantity_new)
7524 {
7525 split_quantity_new = new_item.GetQuantityMax();
7526 }
7527
7528 new_item.SetResultOfSplit(true);
7529 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7530
7532 {
7535 }
7536 else
7537 {
7539 new_item.
SetQuantity(split_quantity_new,
false,
true);
7540 }
7541 }
7542 }
7543
7545 {
7547 float split_quantity_new = Math.Floor(quantity / 2);
7548
7550 return;
7551
7552 InventoryLocation invloc = new InventoryLocation;
7554
7556 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7557
7558 if (new_item)
7559 {
7560 if (new_item.GetQuantityMax() < split_quantity_new)
7561 {
7562 split_quantity_new = new_item.GetQuantityMax();
7563 }
7565 {
7568 }
7569 else if (split_quantity_new > 1)
7570 {
7572 new_item.
SetQuantity(split_quantity_new,
false,
true);
7573 }
7574 }
7575 }
7576
7579 {
7580 SetWeightDirty();
7582
7583 if (parent)
7584 parent.OnAttachmentQuantityChangedEx(this, delta);
7585
7587 {
7589 {
7591 }
7593 {
7594 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7596 }
7597 }
7598 }
7599
7602 {
7603
7604 }
7605
7608 {
7610 }
7611
7613 {
7614 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7615
7617 {
7618 if (newLevel == GameConstants.STATE_RUINED)
7619 {
7621 EntityAI parent = GetHierarchyParent();
7622 if (parent && parent.IsFireplace())
7623 {
7624 CargoBase cargo = GetInventory().GetCargo();
7625 if (cargo)
7626 {
7628 {
7630 }
7631 }
7632 }
7633 }
7634
7636 {
7637
7639 return;
7640 }
7641
7642 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7643 {
7645 }
7646 }
7647 }
7648
7649
7651 {
7652 super.OnRightClick();
7653
7655 {
7657 {
7658 if (ScriptInputUserData.CanStoreInputUserData())
7659 {
7660 EntityAI root = GetHierarchyRoot();
7661 Man playerOwner = GetHierarchyRootPlayer();
7662 InventoryLocation dst = new InventoryLocation;
7663
7664
7665 if (!playerOwner && root && root == this)
7666 {
7668 }
7669 else
7670 {
7671
7672 GetInventory().GetCurrentInventoryLocation(dst);
7674 {
7675 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7677 {
7679 }
7680 else
7681 {
7683
7684
7685 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7686 {
7688 }
7689 else
7690 {
7691 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7692 }
7693 }
7694 }
7695 }
7696
7697 ScriptInputUserData ctx = new ScriptInputUserData;
7705 }
7706 }
7707 else if (!
g_Game.IsMultiplayer())
7708 {
7710 }
7711 }
7712 }
7713
7715 {
7716 if (root)
7717 {
7718 vector m4[4];
7719 root.GetTransform(m4);
7720 dst.SetGround(this, m4);
7721 }
7722 else
7723 {
7724 GetInventory().GetCurrentInventoryLocation(dst);
7725 }
7726 }
7727
7728 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7729 {
7730
7731 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7732 return false;
7733
7734 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7735 return false;
7736
7737
7739 return false;
7740
7741
7742 Magazine mag = Magazine.Cast(this);
7743 if (mag)
7744 {
7745 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7746 return false;
7747
7748 if (stack_max_limit)
7749 {
7750 Magazine other_mag = Magazine.Cast(other_item);
7751 if (other_item)
7752 {
7753 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7754 return false;
7755 }
7756
7757 }
7758 }
7759 else
7760 {
7761
7763 return false;
7764
7766 return false;
7767 }
7768
7769 PlayerBase player = null;
7770 if (CastTo(player, GetHierarchyRootPlayer()))
7771 {
7772 if (player.GetInventory().HasAttachment(this))
7773 return false;
7774
7775 if (player.IsItemsToDelete())
7776 return false;
7777 }
7778
7779 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7780 return false;
7781
7782 int slotID;
7784 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7785 return false;
7786
7787 return true;
7788 }
7789
7791 {
7793 }
7794
7796 {
7797 return m_IsResultOfSplit;
7798 }
7799
7801 {
7802 m_IsResultOfSplit = value;
7803 }
7804
7806 {
7808 }
7809
7811 {
7812 float other_item_quantity = other_item.GetQuantity();
7813 float this_free_space;
7814
7816
7818
7819 if (other_item_quantity > this_free_space)
7820 {
7821 return this_free_space;
7822 }
7823 else
7824 {
7825 return other_item_quantity;
7826 }
7827 }
7828
7830 {
7832 }
7833
7835 {
7837 return;
7838
7839 if (!IsMagazine() && other_item)
7840 {
7842 if (quantity_used != 0)
7843 {
7844 float hp1 = GetHealth01("","");
7845 float hp2 = other_item.GetHealth01("","");
7846 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7847 hpResult = hpResult / (
GetQuantity() + quantity_used);
7848
7849 hpResult *= GetMaxHealth();
7850 Math.Round(hpResult);
7851 SetHealth("", "Health", hpResult);
7852
7854 other_item.AddQuantity(-quantity_used);
7855 }
7856 }
7858 }
7859
7861 {
7862 #ifdef SERVER
7863 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7864 GetHierarchyParent().IncreaseLifetimeUp();
7865 #endif
7866 };
7867
7869 {
7870 PlayerBase p = PlayerBase.Cast(player);
7871
7872 array<int> recipesIds = p.m_Recipes;
7873 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7874 if (moduleRecipesManager)
7875 {
7876 EntityAI itemInHands = player.GetEntityInHands();
7877 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7878 }
7879
7880 for (int i = 0;i < recipesIds.Count(); i++)
7881 {
7882 int key = recipesIds.Get(i);
7883 string recipeName = moduleRecipesManager.GetRecipeName(key);
7885 }
7886 }
7887
7888
7889 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7890 {
7891 super.GetDebugActions(outputList);
7892
7893
7899
7900
7905
7910
7911
7915
7916
7918 {
7922 }
7923
7926
7927
7931
7933
7934 InventoryLocation loc = new InventoryLocation();
7935 GetInventory().GetCurrentInventoryLocation(loc);
7937 {
7938 if (Gizmo_IsSupported())
7941 }
7942
7944 }
7945
7946
7947
7948
7950 {
7951 super.OnAction(action_id, player, ctx);
7952
7954 {
7955 switch (action_id)
7956 {
7960 return true;
7964 return true;
7965 }
7966 }
7967
7969 {
7970 switch (action_id)
7971 {
7973 Delete();
7974 return true;
7975 }
7976 }
7977
7978 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7979 {
7980 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7981 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7982 PlayerBase p = PlayerBase.Cast(player);
7983 if (
EActions.RECIPES_RANGE_START < 1000)
7984 {
7985 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7986 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7987 }
7988 }
7989 #ifndef SERVER
7990 else if (action_id ==
EActions.WATCH_PLAYER)
7991 {
7992 PluginDeveloper.SetDeveloperItemClientEx(player);
7993 }
7994 #endif
7996 {
7997 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7998 {
7999 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
8000 OnDebugButtonPressServer(id + 1);
8001 }
8002
8003 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
8004 {
8005 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
8007 }
8008
8009 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
8010 {
8011 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
8013 }
8014
8015 else if (action_id ==
EActions.ADD_QUANTITY)
8016 {
8017 if (IsMagazine())
8018 {
8019 Magazine mag = Magazine.Cast(this);
8020 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
8021 }
8022 else
8023 {
8025 }
8026
8027 if (m_EM)
8028 {
8029 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
8030 }
8031
8032 }
8033
8034 else if (action_id ==
EActions.REMOVE_QUANTITY)
8035 {
8036 if (IsMagazine())
8037 {
8038 Magazine mag2 = Magazine.Cast(this);
8039 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
8040 }
8041 else
8042 {
8044 }
8045 if (m_EM)
8046 {
8047 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
8048 }
8049
8050 }
8051
8052 else if (action_id ==
EActions.SET_QUANTITY_0)
8053 {
8055
8056 if (m_EM)
8057 {
8058 m_EM.SetEnergy(0);
8059 }
8060 }
8061
8062 else if (action_id ==
EActions.SET_MAX_QUANTITY)
8063 {
8065
8066 if (m_EM)
8067 {
8068 m_EM.SetEnergy(m_EM.GetEnergyMax());
8069 }
8070 }
8071
8072 else if (action_id ==
EActions.ADD_HEALTH)
8073 {
8074 AddHealth("","",GetMaxHealth("","Health")/5);
8075 }
8076 else if (action_id ==
EActions.REMOVE_HEALTH)
8077 {
8078 AddHealth("","",-GetMaxHealth("","Health")/5);
8079 }
8080 else if (action_id ==
EActions.DESTROY_HEALTH)
8081 {
8082 SetHealth01("","",0);
8083 }
8084 else if (action_id ==
EActions.WATCH_ITEM)
8085 {
8087 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8088 #ifdef DEVELOPER
8089 SetDebugDeveloper_item(this);
8090 #endif
8091 }
8092
8093 else if (action_id ==
EActions.ADD_TEMPERATURE)
8094 {
8095 AddTemperature(20);
8096
8097 }
8098
8099 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8100 {
8101 AddTemperature(-20);
8102
8103 }
8104
8105 else if (action_id ==
EActions.FLIP_FROZEN)
8106 {
8107 SetFrozen(!GetIsFrozen());
8108
8109 }
8110
8111 else if (action_id ==
EActions.ADD_WETNESS)
8112 {
8114
8115 }
8116
8117 else if (action_id ==
EActions.REMOVE_WETNESS)
8118 {
8120
8121 }
8122
8123 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8124 {
8127
8128
8129 }
8130
8131 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8132 {
8135 }
8136
8137 else if (action_id ==
EActions.MAKE_SPECIAL)
8138 {
8139 auto debugParams = DebugSpawnParams.WithPlayer(player);
8140 OnDebugSpawnEx(debugParams);
8141 }
8142
8143 }
8144
8145
8146 return false;
8147 }
8148
8149
8150
8151
8155
8158
8159
8160
8162 {
8163 return false;
8164 }
8165
8166
8168 {
8169 return true;
8170 }
8171
8172
8174 {
8175 return true;
8176 }
8177
8178
8179
8181 {
8182 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8183 return g_Game.ConfigIsExisting(config_path);
8184 }
8185
8188 {
8189 return null;
8190 }
8191
8193 {
8194 return false;
8195 }
8196
8198 {
8199 return false;
8200 }
8201
8205
8206
8208 {
8209 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8210 return module_repairing.CanRepair(this, item_repair_kit);
8211 }
8212
8213
8214 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8215 {
8216 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8217 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8218 }
8219
8220
8222 {
8223
8224
8225
8226
8227
8228
8229
8230
8231 return 1;
8232 }
8233
8234
8235
8237 {
8239 }
8240
8241
8242
8244 {
8246 }
8247
8248
8257 {
8258 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8259
8260 if (player)
8261 {
8262 player.MessageStatus(text);
8263 }
8264 }
8265
8266
8275 {
8276 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8277
8278 if (player)
8279 {
8280 player.MessageAction(text);
8281 }
8282 }
8283
8284
8293 {
8294 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8295
8296 if (player)
8297 {
8298 player.MessageFriendly(text);
8299 }
8300 }
8301
8302
8311 {
8312 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8313
8314 if (player)
8315 {
8316 player.MessageImportant(text);
8317 }
8318 }
8319
8321 {
8322 return true;
8323 }
8324
8325
8326 override bool KindOf(
string tag)
8327 {
8328 bool found = false;
8329 string item_name = this.
GetType();
8331 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8332
8333 int array_size = item_tag_array.Count();
8334 for (int i = 0; i < array_size; i++)
8335 {
8336 if (item_tag_array.Get(i) == tag)
8337 {
8338 found = true;
8339 break;
8340 }
8341 }
8342 return found;
8343 }
8344
8345
8347 {
8348
8349 super.OnRPC(sender, rpc_type,ctx);
8350
8351
8352 switch (rpc_type)
8353 {
8354 #ifndef SERVER
8355 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8356 Param2<bool, string> p = new Param2<bool, string>(false, "");
8357
8359 return;
8360
8361 bool play = p.param1;
8362 string soundSet = p.param2;
8363
8364 if (play)
8365 {
8367 {
8369 {
8371 }
8372 }
8373 else
8374 {
8376 }
8377 }
8378 else
8379 {
8381 }
8382
8383 break;
8384 #endif
8385
8386 }
8387
8389 {
8391 }
8392 }
8393
8394
8395
8396
8398 {
8399 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8400 return plugin.GetID(
name);
8401 }
8402
8404 {
8405 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8406 return plugin.GetName(id);
8407 }
8408
8411 {
8412
8413
8414 int varFlags;
8415 if (!ctx.
Read(varFlags))
8416 return;
8417
8418 if (varFlags & ItemVariableFlags.FLOAT)
8419 {
8421 }
8422 }
8423
8425 {
8426
8427 super.SerializeNumericalVars(floats_out);
8428
8429
8430
8432 {
8434 }
8435
8437 {
8439 }
8440
8442 {
8444 }
8445
8447 {
8452 }
8453
8455 {
8457 }
8458 }
8459
8461 {
8462
8463 super.DeSerializeNumericalVars(floats);
8464
8465
8466 int index = 0;
8467 int mask = Math.Round(floats.Get(index));
8468
8469 index++;
8470
8472 {
8474 {
8476 }
8477 else
8478 {
8479 float quantity = floats.Get(index);
8481 }
8482 index++;
8483 }
8484
8486 {
8487 float wet = floats.Get(index);
8489 index++;
8490 }
8491
8493 {
8494 int liquidtype = Math.Round(floats.Get(index));
8496 index++;
8497 }
8498
8500 {
8502 index++;
8504 index++;
8506 index++;
8508 index++;
8509 }
8510
8512 {
8513 int cleanness = Math.Round(floats.Get(index));
8515 index++;
8516 }
8517 }
8518
8520 {
8521 super.WriteVarsToCTX(ctx);
8522
8523
8525 {
8527 }
8528
8530 {
8532 }
8533
8535 {
8537 }
8538
8540 {
8541 int r,g,b,a;
8547 }
8548
8550 {
8552 }
8553 }
8554
8556 {
8557 if (!super.ReadVarsFromCTX(ctx,version))
8558 return false;
8559
8560 int intValue;
8561 float value;
8562
8563 if (version < 140)
8564 {
8565 if (!ctx.
Read(intValue))
8566 return false;
8567
8568 m_VariablesMask = intValue;
8569 }
8570
8572 {
8573 if (!ctx.
Read(value))
8574 return false;
8575
8577 {
8579 }
8580 else
8581 {
8583 }
8584 }
8585
8586 if (version < 140)
8587 {
8589 {
8590 if (!ctx.
Read(value))
8591 return false;
8592 SetTemperatureDirect(value);
8593 }
8594 }
8595
8597 {
8598 if (!ctx.
Read(value))
8599 return false;
8601 }
8602
8604 {
8605 if (!ctx.
Read(intValue))
8606 return false;
8608 }
8609
8611 {
8612 int r,g,b,a;
8614 return false;
8616 return false;
8618 return false;
8620 return false;
8621
8623 }
8624
8626 {
8627 if (!ctx.
Read(intValue))
8628 return false;
8630 }
8631
8632 if (version >= 138 && version < 140)
8633 {
8635 {
8636 if (!ctx.
Read(intValue))
8637 return false;
8638 SetFrozen(intValue);
8639 }
8640 }
8641
8642 return true;
8643 }
8644
8645
8647 {
8650 {
8652 }
8653
8654 if (!super.OnStoreLoad(ctx, version))
8655 {
8657 return false;
8658 }
8659
8660 if (version >= 114)
8661 {
8662 bool hasQuickBarIndexSaved;
8663
8664 if (!ctx.
Read(hasQuickBarIndexSaved))
8665 {
8667 return false;
8668 }
8669
8670 if (hasQuickBarIndexSaved)
8671 {
8672 int itmQBIndex;
8673
8674
8675 if (!ctx.
Read(itmQBIndex))
8676 {
8678 return false;
8679 }
8680
8681 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8682 if (itmQBIndex != -1 && parentPlayer)
8683 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8684 }
8685 }
8686 else
8687 {
8688
8689 PlayerBase player;
8690 int itemQBIndex;
8691 if (version ==
int.
MAX)
8692 {
8693 if (!ctx.
Read(itemQBIndex))
8694 {
8696 return false;
8697 }
8698 }
8699 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8700 {
8701
8702 if (!ctx.
Read(itemQBIndex))
8703 {
8705 return false;
8706 }
8707 if (itemQBIndex != -1 && player)
8708 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8709 }
8710 }
8711
8712 if (version < 140)
8713 {
8714
8715 if (!LoadVariables(ctx, version))
8716 {
8718 return false;
8719 }
8720 }
8721
8722
8724 {
8726 return false;
8727 }
8728 if (version >= 132)
8729 {
8731 if (raib)
8732 {
8734 {
8736 return false;
8737 }
8738 }
8739 }
8740
8742 return true;
8743 }
8744
8745
8746
8748 {
8749 super.OnStoreSave(ctx);
8750
8751 PlayerBase player;
8752 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8753 {
8755
8756 int itemQBIndex = -1;
8757 itemQBIndex = player.FindQuickBarEntityIndex(this);
8758 ctx.
Write(itemQBIndex);
8759 }
8760 else
8761 {
8763 }
8764
8766
8768 if (raib)
8769 {
8771 }
8772 }
8773
8774
8776 {
8777 super.AfterStoreLoad();
8778
8780 {
8782 }
8783
8785 {
8788 }
8789 }
8790
8792 {
8793 super.EEOnAfterLoad();
8794
8796 {
8798 }
8799
8802 }
8803
8805 {
8806 return false;
8807 }
8808
8809
8810
8812 {
8814 {
8815 #ifdef PLATFORM_CONSOLE
8816
8818 {
8820 if (menu)
8821 {
8823 }
8824 }
8825 #endif
8826 }
8827
8829 {
8832 }
8833
8835 {
8836 SetWeightDirty();
8838 }
8840 {
8843 }
8844
8846 {
8849
8852 }
8854 {
8858 }
8859
8860 super.OnVariablesSynchronized();
8861 }
8862
8863
8864
8866 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8867 {
8868 if (!IsServerCheck(allow_client))
8869 return false;
8870
8872 return false;
8873
8876
8877 if (value <= (min + 0.001))
8878 value = min;
8879
8880 if (value == min)
8881 {
8882 if (destroy_config)
8883 {
8884 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8885 if (dstr)
8886 {
8888 this.Delete();
8889 return true;
8890 }
8891 }
8892 else if (destroy_forced)
8893 {
8895 this.Delete();
8896 return true;
8897 }
8898
8900 }
8901
8904
8906 {
8907 EntityAI parent = GetHierarchyRoot();
8908 InventoryLocation iLoc = new InventoryLocation();
8909 GetInventory().GetCurrentInventoryLocation(iLoc);
8911 {
8912 int iLocSlot = iLoc.
GetSlot();
8914 {
8916 }
8918 {
8920 }
8921 }
8922 }
8923
8925 {
8927
8928 if (delta)
8930 }
8931
8933
8934 return false;
8935 }
8936
8937
8939 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8940 {
8942 }
8943
8945 {
8948 }
8949
8951 {
8954 }
8955
8957 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8958 {
8959 float value_clamped = Math.Clamp(value, 0, 1);
8961 SetQuantity(result, destroy_config, destroy_forced);
8962 }
8963
8964
8967 {
8969 }
8970
8972 {
8974 }
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8986 {
8987 int slot = -1;
8988 GameInventory inventory = GetInventory();
8989 if (inventory)
8990 {
8991 InventoryLocation il = new InventoryLocation;
8994 }
8995
8997 }
8998
9000 {
9001 float quantity_max = 0;
9002
9004 {
9005 if (attSlotID != -1)
9006 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
9007
9008 if (quantity_max <= 0)
9010 }
9011
9012 if (quantity_max <= 0)
9014
9015 return quantity_max;
9016 }
9017
9019 {
9021 }
9022
9024 {
9026 }
9027
9028
9030 {
9032 }
9033
9035 {
9037 }
9038
9040 {
9042 }
9043
9044
9046 {
9047
9048 float weightEx = GetWeightEx();
9049 float special = GetInventoryAndCargoWeight();
9050 return weightEx - special;
9051 }
9052
9053
9055 {
9057 }
9058
9060 {
9062 {
9063 #ifdef DEVELOPER
9064 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9065 {
9066 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
9068 }
9069 #endif
9070
9072 }
9073 else if (HasEnergyManager())
9074 {
9075 #ifdef DEVELOPER
9076 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9077 {
9078 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
9079 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
9080 }
9081 #endif
9082 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
9083 }
9084 else
9085 {
9086 #ifdef DEVELOPER
9087 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9088 {
9089 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9090 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9091 }
9092 #endif
9093 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9094 }
9095 }
9096
9099 {
9100 int item_count = 0;
9102
9103 GameInventory inventory = GetInventory();
9104 CargoBase cargo = inventory.
GetCargo();
9105 if (cargo != NULL)
9106 {
9108 }
9109
9111 for (int i = 0; i < nAttachments; ++i)
9112 {
9114 if (item)
9115 item_count += item.GetNumberOfItems();
9116 }
9117 return item_count;
9118 }
9119
9122 {
9123 float weight = 0;
9124 float wetness = 1;
9125 if (include_wetness)
9128 {
9129 weight = wetness * m_ConfigWeight;
9130 }
9132 {
9133 weight = 1;
9134 }
9135 return weight;
9136 }
9137
9138
9139
9141 {
9142 GameInventory inventory = GetInventory();
9143 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9144 {
9145 array<EntityAI> items = new array<EntityAI>;
9147 for (int i = 0; i < items.Count(); ++i)
9148 {
9150 if (item)
9151 {
9152 g_Game.ObjectDelete(item);
9153 }
9154 }
9155 }
9156 }
9157
9158
9159
9160
9162 {
9163 float energy = 0;
9164 if (HasEnergyManager())
9165 {
9166 energy = GetCompEM().GetEnergy();
9167 }
9168 return energy;
9169 }
9170
9171
9173 {
9174 super.OnEnergyConsumed();
9175
9177 }
9178
9180 {
9181 super.OnEnergyAdded();
9182
9184 }
9185
9186
9188 {
9189 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9190 {
9192 {
9193 float energy_0to1 = GetCompEM().GetEnergy0To1();
9195 }
9196 }
9197 }
9198
9199
9201 {
9202 return ConfigGetFloat("heatIsolation");
9203 }
9204
9206 {
9208 }
9209
9211 {
9212 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9213 if (
g_Game.ConfigIsExisting(paramPath))
9214 return g_Game.ConfigGetFloat(paramPath);
9215
9216 return 0.0;
9217 }
9218
9220 {
9221 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9222 if (
g_Game.ConfigIsExisting(paramPath))
9223 return g_Game.ConfigGetFloat(paramPath);
9224
9225 return 0.0;
9226 }
9227
9228 override void SetWet(
float value,
bool allow_client =
false)
9229 {
9230 if (!IsServerCheck(allow_client))
9231 return;
9232
9235
9237
9238 m_VarWet = Math.Clamp(value, min, max);
9239
9241 {
9244 }
9245 }
9246
9247 override void AddWet(
float value)
9248 {
9250 }
9251
9253 {
9255 }
9256
9258 {
9260 }
9261
9263 {
9265 }
9266
9268 {
9270 }
9271
9273 {
9275 }
9276
9278 {
9281 if (newLevel != oldLevel)
9282 {
9284 }
9285 }
9286
9288 {
9289 SetWeightDirty();
9290 }
9291
9293 {
9294 return GetWetLevelInternal(
m_VarWet);
9295 }
9296
9297
9298
9300 {
9302 }
9303
9305 {
9307 }
9308
9310 {
9312 }
9313
9315 {
9317 }
9318
9319
9320
9322 {
9323 if (ConfigIsExisting("itemModelLength"))
9324 {
9325 return ConfigGetFloat("itemModelLength");
9326 }
9327 return 0;
9328 }
9329
9331 {
9332 if (ConfigIsExisting("itemAttachOffset"))
9333 {
9334 return ConfigGetFloat("itemAttachOffset");
9335 }
9336 return 0;
9337 }
9338
9339 override void SetCleanness(
int value,
bool allow_client =
false)
9340 {
9341 if (!IsServerCheck(allow_client))
9342 return;
9343
9345
9347
9350 }
9351
9353 {
9355 }
9356
9358 {
9359 return true;
9360 }
9361
9362
9363
9364
9366 {
9368 }
9369
9371 {
9373 }
9374
9375
9376
9377
9378 override void SetColor(
int r,
int g,
int b,
int a)
9379 {
9385 }
9387 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9388 {
9393 }
9394
9396 {
9398 }
9399
9402 {
9403 int r,g,b,a;
9405 r = r/255;
9406 g = g/255;
9407 b = b/255;
9408 a = a/255;
9409 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9410 }
9411
9412
9413
9414 override void SetLiquidType(
int value,
bool allow_client =
false)
9415 {
9416 if (!IsServerCheck(allow_client))
9417 return;
9418
9423 }
9424
9426 {
9427 return ConfigGetInt("varLiquidTypeInit");
9428 }
9429
9431 {
9433 }
9434
9436 {
9438 SetFrozen(false);
9439 }
9440
9443 {
9444 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9445 }
9446
9447
9450 {
9451 PlayerBase nplayer;
9452 if (PlayerBase.CastTo(nplayer, player))
9453 {
9455 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9456 }
9457 }
9458
9459
9462 {
9463 PlayerBase nplayer;
9464 if (PlayerBase.CastTo(nplayer,player))
9465 {
9466 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9467 }
9468
9469 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9470
9471 if (HasEnergyManager())
9472 {
9473 GetCompEM().UpdatePlugState();
9474 }
9475 }
9476
9477
9479 {
9480 super.OnPlacementStarted(player);
9481
9483 }
9484
9485 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9486 {
9488 {
9489 m_AdminLog.OnPlacementComplete(player,
this);
9490 }
9491
9492 super.OnPlacementComplete(player, position, orientation);
9493 }
9494
9495
9496
9497
9498
9500 {
9502 {
9503 return true;
9504 }
9505 else
9506 {
9507 return false;
9508 }
9509 }
9510
9511
9513 {
9515 {
9517 }
9518 }
9519
9520
9522 {
9524 }
9525
9527 {
9529 }
9530
9531 override void InsertAgent(
int agent,
float count = 1)
9532 {
9533 if (count < 1)
9534 return;
9535
9537 }
9538
9541 {
9543 }
9544
9545
9547 {
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
9584
9585
9586
9587
9588
9589
9590
9591
9593 {
9595 return false;
9596 return true;
9597 }
9598
9600 {
9601
9603 }
9604
9605
9608 {
9609 super.CheckForRoofLimited(timeTresholdMS);
9610
9611 float time =
g_Game.GetTime();
9612 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9613 {
9614 m_PreviousRoofTestTime = time;
9615 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9616 }
9617 }
9618
9619
9621 {
9623 {
9624 return 0;
9625 }
9626
9627 if (GetInventory().GetAttachmentSlotsCount() != 0)
9628 {
9629 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9630 if (filter)
9631 return filter.GetProtectionLevel(type, false, system);
9632 else
9633 return 0;
9634 }
9635
9636 string subclassPath, entryName;
9637
9638 switch (type)
9639 {
9641 entryName = "biological";
9642 break;
9644 entryName = "chemical";
9645 break;
9646 default:
9647 entryName = "biological";
9648 break;
9649 }
9650
9651 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9652
9653 return g_Game.ConfigGetFloat(subclassPath + entryName);
9654 }
9655
9656
9657
9660 {
9661 if (!IsMagazine())
9663
9665 }
9666
9667
9668
9669
9670
9675 {
9676 return true;
9677 }
9678
9680 {
9682 }
9683
9684
9685
9686
9687
9689 {
9690 if (parent)
9691 {
9692 if (parent.IsInherited(DayZInfected))
9693 return true;
9694
9695 if (!parent.IsRuined())
9696 return true;
9697 }
9698
9699 return true;
9700 }
9701
9703 {
9704 if (!super.CanPutAsAttachment(parent))
9705 {
9706 return false;
9707 }
9708
9709 if (!IsRuined() && !parent.IsRuined())
9710 {
9711 return true;
9712 }
9713
9714 return false;
9715 }
9716
9718 {
9719
9720
9721
9722
9723 return super.CanReceiveItemIntoCargo(item);
9724 }
9725
9727 {
9728
9729
9730
9731
9732 GameInventory attachmentInv = attachment.GetInventory();
9734 {
9735 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9736 return false;
9737 }
9738
9739 InventoryLocation loc = new InventoryLocation();
9740 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9741 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9742 return false;
9743
9744 return super.CanReceiveAttachment(attachment, slotId);
9745 }
9746
9748 {
9749 if (!super.CanReleaseAttachment(attachment))
9750 return false;
9751
9752 return GetInventory().AreChildrenAccessible();
9753 }
9754
9755
9756
9757
9758
9759
9760
9761
9762
9763
9764
9765
9766
9767
9768
9769
9770
9771
9772
9773
9774
9776 {
9777 int id = muzzle_owner.GetMuzzleID();
9778 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9779
9780 if (WPOF_array)
9781 {
9782 for (int i = 0; i < WPOF_array.Count(); i++)
9783 {
9784 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9785
9786 if (WPOF)
9787 {
9788 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9789 }
9790 }
9791 }
9792 }
9793
9794
9796 {
9797 int id = muzzle_owner.GetMuzzleID();
9799
9800 if (WPOBE_array)
9801 {
9802 for (int i = 0; i < WPOBE_array.Count(); i++)
9803 {
9804 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9805
9806 if (WPOBE)
9807 {
9808 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9809 }
9810 }
9811 }
9812 }
9813
9814
9816 {
9817 int id = muzzle_owner.GetMuzzleID();
9818 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9819
9820 if (WPOOH_array)
9821 {
9822 for (int i = 0; i < WPOOH_array.Count(); i++)
9823 {
9824 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9825
9826 if (WPOOH)
9827 {
9828 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9829 }
9830 }
9831 }
9832 }
9833
9834
9836 {
9837 int id = muzzle_owner.GetMuzzleID();
9838 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9839
9840 if (WPOOH_array)
9841 {
9842 for (int i = 0; i < WPOOH_array.Count(); i++)
9843 {
9844 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9845
9846 if (WPOOH)
9847 {
9848 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9849 }
9850 }
9851 }
9852 }
9853
9854
9856 {
9857 int id = muzzle_owner.GetMuzzleID();
9858 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9859
9860 if (WPOOH_array)
9861 {
9862 for (int i = 0; i < WPOOH_array.Count(); i++)
9863 {
9864 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9865
9866 if (WPOOH)
9867 {
9868 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9869 }
9870 }
9871 }
9872 }
9873
9874
9875
9877 {
9879 {
9880 return true;
9881 }
9882
9883 return false;
9884 }
9885
9887 {
9889 {
9890 return true;
9891 }
9892
9893 return false;
9894 }
9895
9897 {
9899 {
9900 return true;
9901 }
9902
9903 return false;
9904 }
9905
9907 {
9908 return false;
9909 }
9910
9913 {
9914 return UATimeSpent.DEFAULT_DEPLOY;
9915 }
9916
9917
9918
9919
9921 {
9923 SetSynchDirty();
9924 }
9925
9927 {
9929 }
9930
9931
9933 {
9934 return false;
9935 }
9936
9939 {
9940 string att_type = "None";
9941
9942 if (ConfigIsExisting("soundAttType"))
9943 {
9944 att_type = ConfigGetString("soundAttType");
9945 }
9946
9948 }
9949
9951 {
9953 }
9954
9955
9956
9957
9958
9964
9966 {
9969
9971 }
9972
9973
9975 {
9977 return;
9978
9980
9983
9986
9987 SoundParameters params = new SoundParameters();
9991 }
9992
9993
9995 {
9997 {
10000
10001 SetSynchDirty();
10002
10005 }
10006 }
10007
10009 {
10011 }
10012
10013
10015 {
10017 return;
10018
10020 SetSynchDirty();
10021
10024 }
10025
10027 {
10030 }
10031
10033 {
10035 }
10036
10037 void OnApply(PlayerBase player);
10038
10040 {
10041 return 1.0;
10042 };
10043
10045 {
10047 }
10048
10050 {
10052 }
10053
10055
10057 {
10058 SetDynamicPhysicsLifeTime(0.01);
10060 }
10061
10063 {
10064 array<string> zone_names = new array<string>;
10065 GetDamageZones(zone_names);
10066 for (int i = 0; i < zone_names.Count(); i++)
10067 {
10068 SetHealthMax(zone_names.Get(i),"Health");
10069 }
10070 SetHealthMax("","Health");
10071 }
10072
10075 {
10076 float global_health = GetHealth01("","Health");
10077 array<string> zones = new array<string>;
10078 GetDamageZones(zones);
10079
10080 for (int i = 0; i < zones.Count(); i++)
10081 {
10082 SetHealth01(zones.Get(i),"Health",global_health);
10083 }
10084 }
10085
10088 {
10089 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10090 }
10091
10093 {
10094 if (!hasRootAsPlayer)
10095 {
10096 if (refParentIB)
10097 {
10098
10099 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10100 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10101
10102 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10103 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10104
10107 }
10108 else
10109 {
10110
10113 }
10114 }
10115 }
10116
10118 {
10120 {
10121 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10122 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10123 {
10124 float heatPermCoef = 1.0;
10126 while (ent)
10127 {
10128 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10129 ent = ent.GetHierarchyParent();
10130 }
10131
10132 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10133 }
10134 }
10135 }
10136
10138 {
10139
10140 EntityAI parent = GetHierarchyParent();
10141 if (!parent)
10142 {
10143 hasParent = false;
10144 hasRootAsPlayer = false;
10145 }
10146 else
10147 {
10148 hasParent = true;
10149 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10150 refParentIB =
ItemBase.Cast(parent);
10151 }
10152 }
10153
10154 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10155 {
10156
10157 }
10158
10160 {
10161
10162 return false;
10163 }
10164
10166 {
10167
10168
10169 return false;
10170 }
10171
10173 {
10174
10175 return false;
10176 }
10177
10180 {
10181 return !GetIsFrozen() &&
IsOpen();
10182 }
10183
10185 {
10186 bool hasParent = false, hasRootAsPlayer = false;
10188
10189 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10190 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10191
10192 if (wwtu || foodDecay)
10193 {
10197
10198 if (processWetness || processTemperature || processDecay)
10199 {
10201
10202 if (processWetness)
10203 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10204
10205 if (processTemperature)
10207
10208 if (processDecay)
10209 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10210 }
10211 }
10212 }
10213
10216 {
10218 }
10219
10221 {
10224
10225 return super.GetTemperatureFreezeThreshold();
10226 }
10227
10229 {
10232
10233 return super.GetTemperatureThawThreshold();
10234 }
10235
10237 {
10240
10241 return super.GetItemOverheatThreshold();
10242 }
10243
10245 {
10247 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10248
10249 return super.GetTemperatureFreezeTime();
10250 }
10251
10253 {
10255 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10256
10257 return super.GetTemperatureThawTime();
10258 }
10259
10264
10266 {
10267 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10268 }
10269
10271 {
10272 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10273 }
10274
10277 {
10279 }
10280
10282 {
10284 }
10285
10287 {
10289 }
10290
10293 {
10294 return null;
10295 }
10296
10299 {
10300 return false;
10301 }
10302
10304 {
10306 {
10309 if (!trg)
10310 {
10312 explosive = this;
10313 }
10314
10315 explosive.PairRemote(trg);
10317
10318 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10319 trg.SetPersistentPairID(persistentID);
10320 explosive.SetPersistentPairID(persistentID);
10321
10322 return true;
10323 }
10324 return false;
10325 }
10326
10329 {
10330 float ret = 1.0;
10333 ret *= GetHealth01();
10334
10335 return ret;
10336 }
10337
10338 #ifdef DEVELOPER
10339 override void SetDebugItem()
10340 {
10341 super.SetDebugItem();
10342 _itemBase = this;
10343 }
10344
10346 {
10347 string text = super.GetDebugText();
10348
10350 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10351
10352 return text;
10353 }
10354 #endif
10355
10357 {
10358 return true;
10359 }
10360
10362
10364
10366 {
10369 }
10370
10371
10379
10395
10396 [
Obsolete(
"Use ItemSoundHandler instead")]
10399 {
10400 if (!
g_Game.IsDedicatedServer())
10401 {
10402 if (ConfigIsExisting("attachSoundSet"))
10403 {
10404 string cfg_path = "";
10405 string soundset = "";
10406 string type_name =
GetType();
10407
10410 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10411 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10412
10413 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10414 {
10415 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10416 {
10417 if (cfg_slot_array[i] == slot_type)
10418 {
10419 soundset = cfg_soundset_array[i];
10420 break;
10421 }
10422 }
10423 }
10424
10425 if (soundset != "")
10426 {
10427 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10429 }
10430 }
10431 }
10432 }
10433
10435}
10436
10438{
10440 if (entity)
10441 {
10442 bool is_item = entity.IsInherited(
ItemBase);
10443 if (is_item && full_quantity)
10444 {
10447 }
10448 }
10449 else
10450 {
10452 return NULL;
10453 }
10454 return entity;
10455}
10456
10458{
10459 if (item)
10460 {
10461 if (health > 0)
10462 item.SetHealth("", "", health);
10463
10464 if (item.CanHaveTemperature())
10465 {
10467 if (item.CanFreeze())
10468 item.SetFrozen(false);
10469 }
10470
10471 if (item.HasEnergyManager())
10472 {
10473 if (quantity >= 0)
10474 {
10475 item.GetCompEM().SetEnergy0To1(quantity);
10476 }
10477 else
10478 {
10480 }
10481 }
10482 else if (item.IsMagazine())
10483 {
10484 Magazine mag = Magazine.Cast(item);
10485 if (quantity >= 0)
10486 {
10487 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10488 }
10489 else
10490 {
10492 }
10493
10494 }
10495 else
10496 {
10497 if (quantity >= 0)
10498 {
10499 item.SetQuantityNormalized(quantity, false);
10500 }
10501 else
10502 {
10504 }
10505
10506 }
10507 }
10508}
10509
10510#ifdef DEVELOPER
10512#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.