5427{
5429 {
5430 return true;
5431 }
5432};
5433
5434
5435
5437{
5441
5443
5446
5447
5448
5449
5450
5459
5465
5470
5475
5496 protected bool m_IsResultOfSplit
5497
5499
5504
5505
5506
5508
5512
5513
5514
5516
5519
5520
5521
5527
5528
5536
5539
5540
5542
5543
5545
5546
5551
5552
5557
5558
5560
5561
5563 {
5568
5569 if (!
GetGame().IsDedicatedServer())
5570 {
5572 {
5574
5576 {
5578 }
5579 }
5580
5583 }
5584
5585 m_OldLocation = null;
5586
5588 {
5590 }
5591
5592 if (ConfigIsExisting("headSelectionsToHide"))
5593 {
5596 }
5597
5599 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5600 {
5602 }
5603
5605
5606 m_IsResultOfSplit = false;
5607
5609 }
5610
5612 {
5613 super.InitItemVariables();
5614
5620 m_Count = ConfigGetInt(
"count");
5621
5624
5629
5632
5637
5649
5653
5654
5657 if (ConfigIsExisting("canBeSplit"))
5658 {
5661 }
5662
5664 if (ConfigIsExisting("itemBehaviour"))
5666
5667
5670 RegisterNetSyncVariableInt("m_VarLiquidType");
5671 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5672
5673 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5674 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5675 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5676
5677 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5678 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5679 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5680 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5681
5682 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5683 RegisterNetSyncVariableBool("m_IsTakeable");
5684 RegisterNetSyncVariableBool("m_IsHologram");
5685
5688 {
5691 }
5692
5694
5696 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5698
5699 }
5700
5702 {
5704 }
5705
5707 {
5710 {
5715 }
5716 }
5717
5718 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5719 {
5721 {
5724 }
5725
5727 }
5728
5730 {
5736 }
5737
5739
5741 {
5743
5744 if (!action)
5745 {
5746 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5747 return;
5748 }
5749
5751 if (!ai)
5752 {
5754 return;
5755 }
5756
5758 if (!action_array)
5759 {
5760 action_array = new array<ActionBase_Basic>;
5762 }
5763 if (LogManager.IsActionLogEnable())
5764 {
5765 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5766 }
5767
5768 if (action_array.Find(action) != -1)
5769 {
5770 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5771 }
5772 else
5773 {
5774 action_array.Insert(action);
5775 }
5776 }
5777
5779 {
5781 ActionBase action = player.GetActionManager().GetAction(actionName);
5784
5785 if (action_array)
5786 {
5787 action_array.RemoveItem(action);
5788 }
5789 }
5790
5791
5792
5794 {
5795 ActionOverrideData overrideData = new ActionOverrideData();
5799
5801 if (!actionMap)
5802 {
5805 }
5806
5807 actionMap.Insert(this.
Type(), overrideData);
5808
5809 }
5810
5812
5814
5815
5817 {
5820
5823
5824 string config_to_search = "CfgVehicles";
5825 string muzzle_owner_config;
5826
5828 {
5829 if (IsInherited(Weapon))
5830 config_to_search = "CfgWeapons";
5831
5832 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5833
5834 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5835
5837
5838 if (config_OnFire_subclass_count > 0)
5839 {
5840 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5841
5842 for (int i = 0; i < config_OnFire_subclass_count; i++)
5843 {
5844 string particle_class = "";
5846 string config_OnFire_entry = config_OnFire_class + particle_class;
5847 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5848 WPOF_array.Insert(WPOF);
5849 }
5850
5851
5853 }
5854 }
5855
5857 {
5858 config_to_search = "CfgWeapons";
5859 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5860
5861 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5862
5864
5865 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5866 {
5867 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5868
5869 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5870 {
5871 string particle_class2 = "";
5873 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5874 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5875 WPOBE_array.Insert(WPOBE);
5876 }
5877
5878
5880 }
5881 }
5882 }
5883
5884
5886 {
5889
5891 {
5892 string config_to_search = "CfgVehicles";
5893
5894 if (IsInherited(Weapon))
5895 config_to_search = "CfgWeapons";
5896
5897 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5898 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5899
5900 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5901 {
5902
5904
5906 {
5908 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5910 return;
5911 }
5912
5915
5916
5917
5919 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5920
5921 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5922 {
5923 string particle_class = "";
5925 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5927
5928 if (entry_type == CT_CLASS)
5929 {
5930 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5931 WPOOH_array.Insert(WPOF);
5932 }
5933 }
5934
5935
5937 }
5938 }
5939 }
5940
5942 {
5944 }
5945
5947 {
5949 {
5951
5954
5957
5958 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5959 }
5960 }
5961
5963 {
5965 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5966
5968 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5969
5971 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5972
5974 {
5976 }
5977 }
5978
5980 {
5982 }
5983
5985 {
5988 else
5990
5992 {
5995 }
5996 else
5997 {
6000
6003 }
6004
6006 }
6007
6009 {
6011 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6012 }
6013
6015 {
6017 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6019 }
6020
6022 {
6024 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6025 }
6026
6028 {
6031
6032 OverheatingParticle OP = new OverheatingParticle();
6037
6039 }
6040
6042 {
6045
6046 return -1;
6047 }
6048
6050 {
6052 {
6055
6056 for (int i = count; i > 0; --i)
6057 {
6058 int id = i - 1;
6061
6064
6065 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6066 {
6067 if (p)
6068 {
6071 }
6072 }
6073 }
6074 }
6075 }
6076
6078 {
6080 {
6082 {
6083 int id = i - 1;
6085
6086 if (OP)
6087 {
6089
6090 if (p)
6091 {
6093 }
6094
6095 delete OP;
6096 }
6097 }
6098
6101 }
6102 }
6103
6106 {
6107 return 0.0;
6108 }
6109
6110
6112 {
6113 return 250;
6114 }
6115
6117 {
6118 return 0;
6119 }
6120
6123 {
6125 return true;
6126
6127 return false;
6128 }
6129
6132 {
6135
6137 {
6139 }
6140 else
6141 {
6142
6144 }
6145
6147 }
6148
6155 {
6156 return -1;
6157 }
6158
6159
6160
6161
6163 {
6165 {
6167 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6168
6169 if (r_index >= 0)
6170 {
6171 InventoryLocation r_il = new InventoryLocation;
6172 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6173
6174 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6177 {
6178 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6179 }
6181 {
6182 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6183 }
6184
6185 }
6186
6187 player.GetHumanInventory().ClearUserReservedLocation(this);
6188 }
6189
6192 }
6193
6194
6195
6196
6198 {
6199 return ItemBase.m_DebugActionsMask;
6200 }
6201
6203 {
6204 return ItemBase.m_DebugActionsMask & mask;
6205 }
6206
6208 {
6209 ItemBase.m_DebugActionsMask = mask;
6210 }
6211
6213 {
6214 ItemBase.m_DebugActionsMask |= mask;
6215 }
6216
6218 {
6219 ItemBase.m_DebugActionsMask &= ~mask;
6220 }
6221
6223 {
6225 {
6227 }
6228 else
6229 {
6231 }
6232 }
6233
6234
6236 {
6237 if (GetEconomyProfile())
6238 {
6239 float q_max = GetEconomyProfile().GetQuantityMax();
6240 if (q_max > 0)
6241 {
6242 float q_min = GetEconomyProfile().GetQuantityMin();
6243 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6244
6246 {
6247 ComponentEnergyManager comp = GetCompEM();
6249 {
6251 }
6252 }
6254 {
6256
6257 }
6258
6259 }
6260 }
6261 }
6262
6265 {
6266 EntityAI parent = GetHierarchyParent();
6267
6268 if (parent)
6269 {
6270 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6271 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6272 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6273 }
6274 }
6275
6278 {
6279 EntityAI parent = GetHierarchyParent();
6280
6281 if (parent)
6282 {
6283 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6284 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6285 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6286 }
6287 }
6288
6290 {
6291
6292
6293
6294
6296
6298 {
6299 if (ScriptInputUserData.CanStoreInputUserData())
6300 {
6301 ScriptInputUserData ctx = new ScriptInputUserData;
6307 ctx.
Write(use_stack_max);
6310
6312 {
6313 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6314 }
6315 }
6316 }
6317 else if (!
GetGame().IsMultiplayer())
6318 {
6320 }
6321 }
6322
6324 {
6326 }
6327
6329 {
6331 }
6332
6334 {
6336 }
6337
6339 {
6340
6341 return false;
6342 }
6343
6345 {
6346 return false;
6347 }
6348
6352 {
6353 return false;
6354 }
6355
6357 {
6358 return "";
6359 }
6360
6362
6364 {
6365 return false;
6366 }
6367
6369 {
6370 return true;
6371 }
6372
6373
6374
6376 {
6377 return true;
6378 }
6379
6381 {
6382 return true;
6383 }
6384
6386 {
6387 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6389 }
6390
6392 {
6394 }
6395
6397 {
6399 if (!is_being_placed)
6401 SetSynchDirty();
6402 }
6403
6404
6406
6408 {
6410 }
6411
6413 {
6415 }
6416
6418 {
6419 return 1;
6420 }
6421
6423 {
6424 return false;
6425 }
6426
6428 {
6430 SetSynchDirty();
6431 }
6432
6433
6434
6435
6436
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
6452
6453
6454
6455
6456
6457
6458
6459
6460
6461
6462
6463
6464
6465
6466
6468 {
6469 super.OnMovedInsideCargo(container);
6470
6471 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6472 }
6473
6474 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6475 {
6476 super.EEItemLocationChanged(oldLoc,newLoc);
6477
6478 PlayerBase new_player = null;
6479 PlayerBase old_player = null;
6480
6481 if (newLoc.GetParent())
6482 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6483
6484 if (oldLoc.GetParent())
6485 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6486
6488 {
6489 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6490
6491 if (r_index >= 0)
6492 {
6493 InventoryLocation r_il = new InventoryLocation;
6494 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6495
6496 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6499 {
6500 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6501 }
6503 {
6504 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6505 }
6506
6507 }
6508 }
6509
6511 {
6512 if (new_player)
6513 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6514
6515 if (new_player == old_player)
6516 {
6517
6518 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6519 {
6521 {
6522 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6523 {
6524 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6525 }
6526 }
6527 else
6528 {
6529 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6530 }
6531 }
6532
6533 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6534 {
6535 int type = oldLoc.GetType();
6537 {
6538 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6539 }
6541 {
6542 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6543 }
6544 }
6545 if (!m_OldLocation)
6546 {
6547 m_OldLocation = new InventoryLocation;
6548 }
6549 m_OldLocation.Copy(oldLoc);
6550 }
6551 else
6552 {
6553 if (m_OldLocation)
6554 {
6555 m_OldLocation.Reset();
6556 }
6557 }
6558
6560 }
6561 else
6562 {
6563 if (new_player)
6564 {
6565 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6566 if (res_index >= 0)
6567 {
6568 InventoryLocation il = new InventoryLocation;
6569 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6571 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6574 {
6575 il.
GetParent().GetOnReleaseLock().Invoke(it);
6576 }
6578 {
6580 }
6581
6582 }
6583 }
6585 {
6586
6588 }
6589
6590 if (m_OldLocation)
6591 {
6592 m_OldLocation.Reset();
6593 }
6594 }
6595 }
6596
6597 override void EOnContact(IEntity other, Contact extra)
6598 {
6600 {
6601 int liquidType = -1;
6603 if (impactSpeed > 0.0)
6604 {
6606 #ifndef SERVER
6608 #else
6610 SetSynchDirty();
6611 #endif
6613 }
6614 }
6615
6616 #ifdef SERVER
6617 if (GetCompEM() && GetCompEM().IsPlugged())
6618 {
6619 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6620 GetCompEM().UnplugThis();
6621 }
6622 #endif
6623 }
6624
6626
6628 {
6630 }
6631
6633 {
6634
6635 }
6636
6638 {
6639 super.OnItemLocationChanged(old_owner, new_owner);
6640
6641 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6642 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6643
6644 if (!relatedPlayer && playerNew)
6645 relatedPlayer = playerNew;
6646
6647 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6648 {
6650 if (actionMgr)
6651 {
6652 ActionBase currentAction = actionMgr.GetRunningAction();
6653 if (currentAction)
6655 }
6656 }
6657
6658 Man ownerPlayerOld = null;
6659 Man ownerPlayerNew = null;
6660
6661 if (old_owner)
6662 {
6663 if (old_owner.
IsMan())
6664 {
6665 ownerPlayerOld = Man.Cast(old_owner);
6666 }
6667 else
6668 {
6669 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6670 }
6671 }
6672 else
6673 {
6675 {
6677
6678 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6679 {
6680 GetCompEM().UnplugThis();
6681 }
6682 }
6683 }
6684
6685 if (new_owner)
6686 {
6687 if (new_owner.
IsMan())
6688 {
6689 ownerPlayerNew = Man.Cast(new_owner);
6690 }
6691 else
6692 {
6693 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6694 }
6695 }
6696
6697 if (ownerPlayerOld != ownerPlayerNew)
6698 {
6699 if (ownerPlayerOld)
6700 {
6701 array<EntityAI> subItemsExit = new array<EntityAI>;
6703 for (int i = 0; i < subItemsExit.Count(); i++)
6704 {
6707 }
6708 }
6709
6710 if (ownerPlayerNew)
6711 {
6712 array<EntityAI> subItemsEnter = new array<EntityAI>;
6714 for (int j = 0; j < subItemsEnter.Count(); j++)
6715 {
6718 }
6719 }
6720 }
6721 else if (ownerPlayerNew != null)
6722 {
6723 PlayerBase nplayer;
6724 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6725 {
6726 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6728 for (int k = 0; k < subItemsUpdate.Count(); k++)
6729 {
6731 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6732 }
6733 }
6734 }
6735
6736 if (old_owner)
6737 old_owner.OnChildItemRemoved(this);
6738 if (new_owner)
6739 new_owner.OnChildItemReceived(this);
6740 }
6741
6742
6744 {
6745 super.EEDelete(parent);
6746 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6747 if (player)
6748 {
6750
6751 if (player.IsAlive())
6752 {
6753 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6754 if (r_index >= 0)
6755 {
6756 InventoryLocation r_il = new InventoryLocation;
6757 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6758
6759 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6762 {
6763 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6764 }
6766 {
6767 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6768 }
6769
6770 }
6771
6772 player.RemoveQuickBarEntityShortcut(this);
6773 }
6774 }
6775 }
6776
6778 {
6779 super.EEKilled(killer);
6780
6783 {
6784 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6785 {
6786 if (IsMagazine())
6787 {
6788 if (Magazine.Cast(this).GetAmmoCount() > 0)
6789 {
6791 }
6792 }
6793 else
6794 {
6796 }
6797 }
6798 }
6799 }
6800
6802 {
6803 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6804
6805 super.OnWasAttached(parent, slot_id);
6806
6809
6811 }
6812
6814 {
6815 super.OnWasDetached(parent, slot_id);
6816
6819 }
6820
6822 {
6823 int idx;
6826
6827 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6828 if (inventory_slots.Count() < 1)
6829 {
6830 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6831 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6832 }
6833 else
6834 {
6835 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6836 }
6837
6838 idx = inventory_slots.Find(slot);
6839 if (idx < 0)
6840 return "";
6841
6842 return attach_types.Get(idx);
6843 }
6844
6846 {
6847 int idx = -1;
6848 string slot;
6849
6852
6853 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6854 if (inventory_slots.Count() < 1)
6855 {
6856 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6857 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6858 }
6859 else
6860 {
6861 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6862 if (detach_types.Count() < 1)
6863 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6864 }
6865
6866 for (int i = 0; i < inventory_slots.Count(); i++)
6867 {
6868 slot = inventory_slots.Get(i);
6869 }
6870
6871 if (slot != "")
6872 {
6873 if (detach_types.Count() == 1)
6874 idx = 0;
6875 else
6876 idx = inventory_slots.Find(slot);
6877 }
6878 if (idx < 0)
6879 return "";
6880
6881 return detach_types.Get(idx);
6882 }
6883
6885 {
6886
6888
6889
6890 float min_time = 1;
6891 float max_time = 3;
6892 float delay = Math.RandomFloat(min_time, max_time);
6893
6894 explode_timer.Run(delay, this, "DoAmmoExplosion");
6895 }
6896
6898 {
6899 Magazine magazine = Magazine.Cast(this);
6900 int pop_sounds_count = 6;
6901 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6902
6903
6904 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6905 string sound_name = pop_sounds[ sound_idx ];
6907
6908
6909 magazine.ServerAddAmmoCount(-1);
6910
6911
6912 float min_temp_to_explode = 100;
6913
6914 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6915 {
6917 }
6918 }
6919
6920
6921 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6922 {
6923 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6924
6925 const int CHANCE_DAMAGE_CARGO = 4;
6926 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6927 const int CHANCE_DAMAGE_NOTHING = 2;
6928
6930 {
6931 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6932 int chances;
6933 int rnd;
6934
6935 if (GetInventory().GetCargo())
6936 {
6937 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6938 rnd = Math.RandomInt(0,chances);
6939
6940 if (rnd < CHANCE_DAMAGE_CARGO)
6941 {
6943 }
6944 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6945 {
6947 }
6948 }
6949 else
6950 {
6951 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6952 rnd = Math.RandomInt(0,chances);
6953
6954 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6955 {
6957 }
6958 }
6959 }
6960 }
6961
6963 {
6964 if (GetInventory().GetCargo())
6965 {
6966 int item_count = GetInventory().GetCargo().GetItemCount();
6967 if (item_count > 0)
6968 {
6969 int random_pick = Math.RandomInt(0, item_count);
6971 if (!item.IsExplosive())
6972 {
6973 item.AddHealth("","",damage);
6974 return true;
6975 }
6976 }
6977 }
6978 return false;
6979 }
6980
6982 {
6983 int attachment_count = GetInventory().AttachmentCount();
6984 if (attachment_count > 0)
6985 {
6986 int random_pick = Math.RandomInt(0, attachment_count);
6987 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6988 if (!attachment.IsExplosive())
6989 {
6990 attachment.AddHealth("","",damage);
6991 return true;
6992 }
6993 }
6994 return false;
6995 }
6996
6998 {
7000 }
7001
7003 {
7005 return GetInventory().CanRemoveEntity();
7006
7007 return false;
7008 }
7009
7011 {
7013 return;
7014
7016 {
7017 if (ScriptInputUserData.CanStoreInputUserData())
7018 {
7019 ScriptInputUserData ctx = new ScriptInputUserData;
7024 ctx.
Write(destination_entity);
7028 }
7029 }
7030 else if (!
GetGame().IsMultiplayer())
7031 {
7033 }
7034 }
7035
7037 {
7039 return;
7040
7041 float split_quantity_new;
7045 InventoryLocation loc = new InventoryLocation;
7046
7047 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7048 {
7050 split_quantity_new = stack_max;
7051 else
7053
7054 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7055 if (new_item)
7056 {
7057 new_item.SetResultOfSplit(true);
7058 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7060 new_item.SetQuantity(split_quantity_new);
7061 }
7062 }
7063 else if (destination_entity && slot_id == -1)
7064 {
7065 if (quantity > stack_max)
7066 split_quantity_new = stack_max;
7067 else
7068 split_quantity_new = quantity;
7069
7071 {
7074 }
7075
7076 if (new_item)
7077 {
7078 new_item.SetResultOfSplit(true);
7079 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7081 new_item.SetQuantity(split_quantity_new);
7082 }
7083 }
7084 else
7085 {
7086 if (stack_max != 0)
7087 {
7089 {
7091 }
7092
7093 if (split_quantity_new == 0)
7094 {
7095 if (!
GetGame().IsMultiplayer())
7096 player.PhysicalPredictiveDropItem(this);
7097 else
7098 player.ServerDropEntity(this);
7099 return;
7100 }
7101
7103
7104 if (new_item)
7105 {
7106 new_item.SetResultOfSplit(true);
7107 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7109 new_item.SetQuantity(stack_max);
7110 new_item.PlaceOnSurface();
7111 }
7112 }
7113 }
7114 }
7115
7117 {
7119 return;
7120
7121 float split_quantity_new;
7125 InventoryLocation loc = new InventoryLocation;
7126
7127 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7128 {
7130 split_quantity_new = stack_max;
7131 else
7133
7134 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7135 if (new_item)
7136 {
7137 new_item.SetResultOfSplit(true);
7138 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7140 new_item.SetQuantity(split_quantity_new);
7141 }
7142 }
7143 else if (destination_entity && slot_id == -1)
7144 {
7145 if (quantity > stack_max)
7146 split_quantity_new = stack_max;
7147 else
7148 split_quantity_new = quantity;
7149
7151 {
7154 }
7155
7156 if (new_item)
7157 {
7158 new_item.SetResultOfSplit(true);
7159 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7161 new_item.SetQuantity(split_quantity_new);
7162 }
7163 }
7164 else
7165 {
7166 if (stack_max != 0)
7167 {
7169 {
7171 }
7172
7174
7175 if (new_item)
7176 {
7177 new_item.SetResultOfSplit(true);
7178 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7180 new_item.SetQuantity(stack_max);
7181 new_item.PlaceOnSurface();
7182 }
7183 }
7184 }
7185 }
7186
7188 {
7190 return;
7191
7193 {
7194 if (ScriptInputUserData.CanStoreInputUserData())
7195 {
7196 ScriptInputUserData ctx = new ScriptInputUserData;
7201 dst.WriteToContext(ctx);
7203 }
7204 }
7205 else if (!
GetGame().IsMultiplayer())
7206 {
7208 }
7209 }
7210
7212 {
7214 return;
7215
7217 {
7218 if (ScriptInputUserData.CanStoreInputUserData())
7219 {
7220 ScriptInputUserData ctx = new ScriptInputUserData;
7225 ctx.
Write(destination_entity);
7231 }
7232 }
7233 else if (!
GetGame().IsMultiplayer())
7234 {
7236 }
7237 }
7238
7240 {
7242 }
7243
7245 {
7247 return this;
7248
7250 float split_quantity_new;
7252 if (dst.IsValid())
7253 {
7254 int slot_id = dst.GetSlot();
7256
7257 if (quantity > stack_max)
7258 split_quantity_new = stack_max;
7259 else
7260 split_quantity_new = quantity;
7261
7263
7264 if (new_item)
7265 {
7266 new_item.SetResultOfSplit(true);
7267 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7270 }
7271
7272 return new_item;
7273 }
7274
7275 return null;
7276 }
7277
7279 {
7281 return;
7282
7284 float split_quantity_new;
7286 if (destination_entity)
7287 {
7289 if (quantity > stackable)
7290 split_quantity_new = stackable;
7291 else
7292 split_quantity_new = quantity;
7293
7294 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7295 if (new_item)
7296 {
7297 new_item.SetResultOfSplit(true);
7298 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7300 new_item.SetQuantity(split_quantity_new);
7301 }
7302 }
7303 }
7304
7306 {
7308 return;
7309
7311 {
7312 if (ScriptInputUserData.CanStoreInputUserData())
7313 {
7314 ScriptInputUserData ctx = new ScriptInputUserData;
7319 ItemBase destination_entity =
this;
7320 ctx.
Write(destination_entity);
7324 }
7325 }
7326 else if (!
GetGame().IsMultiplayer())
7327 {
7329 }
7330 }
7331
7333 {
7335 return;
7336
7338 float split_quantity_new;
7340 if (player)
7341 {
7343 if (quantity > stackable)
7344 split_quantity_new = stackable;
7345 else
7346 split_quantity_new = quantity;
7347
7348 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7349 new_item =
ItemBase.Cast(in_hands);
7350 if (new_item)
7351 {
7352 new_item.SetResultOfSplit(true);
7353 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7355 new_item.SetQuantity(split_quantity_new);
7356 }
7357 }
7358 }
7359
7361 {
7363 return;
7364
7366 float split_quantity_new = Math.Floor(quantity * 0.5);
7367
7369
7370 if (new_item)
7371 {
7372 if (new_item.GetQuantityMax() < split_quantity_new)
7373 {
7374 split_quantity_new = new_item.GetQuantityMax();
7375 }
7376
7377 new_item.SetResultOfSplit(true);
7378 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7379
7381 {
7384 }
7385 else
7386 {
7389 }
7390 }
7391 }
7392
7394 {
7396 return;
7397
7399 float split_quantity_new = Math.Floor(quantity / 2);
7400
7401 InventoryLocation invloc = new InventoryLocation;
7403
7405 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7406
7407 if (new_item)
7408 {
7409 if (new_item.GetQuantityMax() < split_quantity_new)
7410 {
7411 split_quantity_new = new_item.GetQuantityMax();
7412 }
7414 {
7417 }
7418 else
7419 {
7422 }
7423 }
7424 }
7425
7428 {
7429 SetWeightDirty();
7431
7432 if (parent)
7433 parent.OnAttachmentQuantityChangedEx(this, delta);
7434
7436 {
7438 {
7440 }
7442 {
7443 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7445 }
7446 }
7447
7448 }
7449
7452 {
7453
7454 }
7455
7458 {
7460 }
7461
7463 {
7464 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7465
7467 {
7468 if (newLevel == GameConstants.STATE_RUINED)
7469 {
7471 EntityAI parent = GetHierarchyParent();
7472 if (parent && parent.IsFireplace())
7473 {
7474 CargoBase cargo = GetInventory().GetCargo();
7475 if (cargo)
7476 {
7478 {
7480 }
7481 }
7482 }
7483 }
7484
7486 {
7487
7489 return;
7490 }
7491
7492 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7493 {
7495 }
7496 }
7497 }
7498
7499
7501 {
7502 super.OnRightClick();
7503
7505 {
7507 {
7508 if (ScriptInputUserData.CanStoreInputUserData())
7509 {
7510 vector m4[4];
7512
7513 EntityAI root = GetHierarchyRoot();
7514
7515 InventoryLocation dst = new InventoryLocation;
7517 {
7518 if (root)
7519 {
7520 root.GetTransform(m4);
7522 }
7523 else
7524 GetInventory().GetCurrentInventoryLocation(dst);
7525 }
7526 else
7527 {
7529
7530
7531 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7532 {
7533 if (root)
7534 {
7535 root.GetTransform(m4);
7537 }
7538 else
7539 GetInventory().GetCurrentInventoryLocation(dst);
7540 }
7541 else
7542 {
7543 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7544 }
7545 }
7546
7547 ScriptInputUserData ctx = new ScriptInputUserData;
7555 }
7556 }
7557 else if (!
GetGame().IsMultiplayer())
7558 {
7560 }
7561 }
7562 }
7563
7564 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7565 {
7566
7567 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7568 return false;
7569
7570 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7571 return false;
7572
7573
7575 return false;
7576
7577
7578 Magazine mag = Magazine.Cast(this);
7579 if (mag)
7580 {
7581 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7582 return false;
7583
7584 if (stack_max_limit)
7585 {
7586 Magazine other_mag = Magazine.Cast(other_item);
7587 if (other_item)
7588 {
7589 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7590 return false;
7591 }
7592
7593 }
7594 }
7595 else
7596 {
7597
7599 return false;
7600
7602 return false;
7603 }
7604
7605 PlayerBase player = null;
7606 if (CastTo(player, GetHierarchyRootPlayer()))
7607 {
7608 if (player.GetInventory().HasAttachment(this))
7609 return false;
7610
7611 if (player.IsItemsToDelete())
7612 return false;
7613 }
7614
7615 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7616 return false;
7617
7618 int slotID;
7620 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7621 return false;
7622
7623 return true;
7624 }
7625
7627 {
7629 }
7630
7632 {
7633 return m_IsResultOfSplit;
7634 }
7635
7637 {
7638 m_IsResultOfSplit = value;
7639 }
7640
7642 {
7644 }
7645
7647 {
7648 float other_item_quantity = other_item.GetQuantity();
7649 float this_free_space;
7650
7652
7654
7655 if (other_item_quantity > this_free_space)
7656 {
7657 return this_free_space;
7658 }
7659 else
7660 {
7661 return other_item_quantity;
7662 }
7663 }
7664
7666 {
7668 }
7669
7671 {
7673 return;
7674
7675 if (!IsMagazine() && other_item)
7676 {
7678 if (quantity_used != 0)
7679 {
7680 float hp1 = GetHealth01("","");
7681 float hp2 = other_item.GetHealth01("","");
7682 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7683 hpResult = hpResult / (
GetQuantity() + quantity_used);
7684
7685 hpResult *= GetMaxHealth();
7686 Math.Round(hpResult);
7687 SetHealth("", "Health", hpResult);
7688
7690 other_item.AddQuantity(-quantity_used);
7691 }
7692 }
7694 }
7695
7697 {
7698 #ifdef SERVER
7699 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7700 GetHierarchyParent().IncreaseLifetimeUp();
7701 #endif
7702 };
7703
7705 {
7706 PlayerBase p = PlayerBase.Cast(player);
7707
7708 array<int> recipesIds = p.m_Recipes;
7709 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7710 if (moduleRecipesManager)
7711 {
7712 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7713 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7714 }
7715
7716 for (int i = 0;i < recipesIds.Count(); i++)
7717 {
7718 int key = recipesIds.Get(i);
7719 string recipeName = moduleRecipesManager.GetRecipeName(key);
7721 }
7722 }
7723
7724
7725 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7726 {
7727 super.GetDebugActions(outputList);
7728
7729
7734
7735
7739
7743
7744
7747
7748
7750 {
7753 }
7754
7756
7759
7763 }
7764
7765
7766
7767
7769 {
7770 super.OnAction(action_id, player, ctx);
7771 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7772 {
7773 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7774 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7775 PlayerBase p = PlayerBase.Cast(player);
7776 if (
EActions.RECIPES_RANGE_START < 1000)
7777 {
7778 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7779 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7780 }
7781 }
7782 #ifndef SERVER
7783 else if (action_id ==
EActions.WATCH_PLAYER)
7784 {
7785 PluginDeveloper.SetDeveloperItemClientEx(player);
7786 }
7787 #endif
7789 {
7790 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7791 {
7792 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7793 OnDebugButtonPressServer(id + 1);
7794 }
7795
7796 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7797 {
7798 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7800 }
7801
7802 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7803 {
7804 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7806 }
7807
7808 else if (action_id ==
EActions.ADD_QUANTITY)
7809 {
7810 if (IsMagazine())
7811 {
7812 Magazine mag = Magazine.Cast(this);
7813 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7814 }
7815 else
7816 {
7818 }
7819
7820 if (m_EM)
7821 {
7822 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7823 }
7824
7825 }
7826
7827 else if (action_id ==
EActions.REMOVE_QUANTITY)
7828 {
7829 if (IsMagazine())
7830 {
7831 Magazine mag2 = Magazine.Cast(this);
7832 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7833 }
7834 else
7835 {
7837 }
7838 if (m_EM)
7839 {
7840 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7841 }
7842
7843 }
7844
7845 else if (action_id ==
EActions.SET_QUANTITY_0)
7846 {
7848
7849 if (m_EM)
7850 {
7851 m_EM.SetEnergy(0);
7852 }
7853 }
7854
7855 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7856 {
7858
7859 if (m_EM)
7860 {
7861 m_EM.SetEnergy(m_EM.GetEnergyMax());
7862 }
7863 }
7864
7865 else if (action_id ==
EActions.ADD_HEALTH)
7866 {
7867 AddHealth("","",GetMaxHealth("","Health")/5);
7868 }
7869 else if (action_id ==
EActions.REMOVE_HEALTH)
7870 {
7871 AddHealth("","",-GetMaxHealth("","Health")/5);
7872 }
7873 else if (action_id ==
EActions.DESTROY_HEALTH)
7874 {
7875 SetHealth01("","",0);
7876 }
7877 else if (action_id ==
EActions.WATCH_ITEM)
7878 {
7880 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7881 #ifdef DEVELOPER
7882 SetDebugDeveloper_item(this);
7883 #endif
7884 }
7885
7886 else if (action_id ==
EActions.ADD_TEMPERATURE)
7887 {
7888 AddTemperature(20);
7889
7890 }
7891
7892 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7893 {
7894 AddTemperature(-20);
7895
7896 }
7897
7898 else if (action_id ==
EActions.FLIP_FROZEN)
7899 {
7900 SetFrozen(!GetIsFrozen());
7901
7902 }
7903
7904 else if (action_id ==
EActions.ADD_WETNESS)
7905 {
7907
7908 }
7909
7910 else if (action_id ==
EActions.REMOVE_WETNESS)
7911 {
7913
7914 }
7915
7916 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7917 {
7920
7921
7922 }
7923
7924 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7925 {
7928 }
7929
7930 else if (action_id ==
EActions.MAKE_SPECIAL)
7931 {
7932 auto debugParams = DebugSpawnParams.WithPlayer(player);
7933 OnDebugSpawnEx(debugParams);
7934 }
7935
7936 else if (action_id ==
EActions.DELETE)
7937 {
7938 Delete();
7939 }
7940
7941 }
7942
7943
7944 return false;
7945 }
7946
7947
7948
7949
7953
7956
7957
7958
7960 {
7961 return false;
7962 }
7963
7964
7966 {
7967 return true;
7968 }
7969
7970
7972 {
7973 return true;
7974 }
7975
7976
7977
7979 {
7980 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7982 }
7983
7986 {
7987 return null;
7988 }
7989
7991 {
7992 return false;
7993 }
7994
7996 {
7997 return false;
7998 }
7999
8003
8004
8006 {
8007 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8008 return module_repairing.CanRepair(this, item_repair_kit);
8009 }
8010
8011
8012 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8013 {
8014 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8015 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8016 }
8017
8018
8020 {
8021
8022
8023
8024
8025
8026
8027
8028
8029 return 1;
8030 }
8031
8032
8033
8035 {
8037 }
8038
8039
8040
8042 {
8044 }
8045
8046
8055 {
8056 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8057
8058 if (player)
8059 {
8060 player.MessageStatus(text);
8061 }
8062 }
8063
8064
8073 {
8074 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8075
8076 if (player)
8077 {
8078 player.MessageAction(text);
8079 }
8080 }
8081
8082
8091 {
8092 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8093
8094 if (player)
8095 {
8096 player.MessageFriendly(text);
8097 }
8098 }
8099
8100
8109 {
8110 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8111
8112 if (player)
8113 {
8114 player.MessageImportant(text);
8115 }
8116 }
8117
8119 {
8120 return true;
8121 }
8122
8123
8124 override bool KindOf(
string tag)
8125 {
8126 bool found = false;
8127 string item_name = this.
GetType();
8130
8131 int array_size = item_tag_array.Count();
8132 for (int i = 0; i < array_size; i++)
8133 {
8134 if (item_tag_array.Get(i) == tag)
8135 {
8136 found = true;
8137 break;
8138 }
8139 }
8140 return found;
8141 }
8142
8143
8145 {
8146
8147 super.OnRPC(sender, rpc_type,ctx);
8148
8149
8150 switch (rpc_type)
8151 {
8152 #ifndef SERVER
8153 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8154 Param2<bool, string> p = new Param2<bool, string>(false, "");
8155
8157 return;
8158
8159 bool play = p.param1;
8160 string soundSet = p.param2;
8161
8162 if (play)
8163 {
8165 {
8167 {
8169 }
8170 }
8171 else
8172 {
8174 }
8175 }
8176 else
8177 {
8179 }
8180
8181 break;
8182 #endif
8183
8184 }
8185
8187 {
8189 }
8190 }
8191
8192
8193
8194
8196 {
8197 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8198 return plugin.GetID(
name);
8199 }
8200
8202 {
8203 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8204 return plugin.GetName(id);
8205 }
8206
8209 {
8210
8211
8212 int varFlags;
8213 if (!ctx.
Read(varFlags))
8214 return;
8215
8216 if (varFlags & ItemVariableFlags.FLOAT)
8217 {
8219 }
8220 }
8221
8223 {
8224
8225 super.SerializeNumericalVars(floats_out);
8226
8227
8228
8230 {
8232 }
8233
8235 {
8237 }
8238
8240 {
8242 }
8243
8245 {
8250 }
8251
8253 {
8255 }
8256 }
8257
8259 {
8260
8261 super.DeSerializeNumericalVars(floats);
8262
8263
8264 int index = 0;
8265 int mask = Math.Round(floats.Get(index));
8266
8267 index++;
8268
8270 {
8272 {
8274 }
8275 else
8276 {
8277 float quantity = floats.Get(index);
8279 }
8280 index++;
8281 }
8282
8284 {
8285 float wet = floats.Get(index);
8287 index++;
8288 }
8289
8291 {
8292 int liquidtype = Math.Round(floats.Get(index));
8294 index++;
8295 }
8296
8298 {
8300 index++;
8302 index++;
8304 index++;
8306 index++;
8307 }
8308
8310 {
8311 int cleanness = Math.Round(floats.Get(index));
8313 index++;
8314 }
8315 }
8316
8318 {
8319 super.WriteVarsToCTX(ctx);
8320
8321
8323 {
8325 }
8326
8328 {
8330 }
8331
8333 {
8335 }
8336
8338 {
8339 int r,g,b,a;
8345 }
8346
8348 {
8350 }
8351 }
8352
8354 {
8355 if (!super.ReadVarsFromCTX(ctx,version))
8356 return false;
8357
8358 int intValue;
8359 float value;
8360
8361 if (version < 140)
8362 {
8363 if (!ctx.
Read(intValue))
8364 return false;
8365
8366 m_VariablesMask = intValue;
8367 }
8368
8370 {
8371 if (!ctx.
Read(value))
8372 return false;
8373
8375 {
8377 }
8378 else
8379 {
8381 }
8382 }
8383
8384 if (version < 140)
8385 {
8387 {
8388 if (!ctx.
Read(value))
8389 return false;
8390 SetTemperatureDirect(value);
8391 }
8392 }
8393
8395 {
8396 if (!ctx.
Read(value))
8397 return false;
8399 }
8400
8402 {
8403 if (!ctx.
Read(intValue))
8404 return false;
8406 }
8407
8409 {
8410 int r,g,b,a;
8412 return false;
8414 return false;
8416 return false;
8418 return false;
8419
8421 }
8422
8424 {
8425 if (!ctx.
Read(intValue))
8426 return false;
8428 }
8429
8430 if (version >= 138 && version < 140)
8431 {
8433 {
8434 if (!ctx.
Read(intValue))
8435 return false;
8436 SetFrozen(intValue);
8437 }
8438 }
8439
8440 return true;
8441 }
8442
8443
8445 {
8448 {
8450 }
8451
8452 if (!super.OnStoreLoad(ctx, version))
8453 {
8455 return false;
8456 }
8457
8458 if (version >= 114)
8459 {
8460 bool hasQuickBarIndexSaved;
8461
8462 if (!ctx.
Read(hasQuickBarIndexSaved))
8463 {
8465 return false;
8466 }
8467
8468 if (hasQuickBarIndexSaved)
8469 {
8470 int itmQBIndex;
8471
8472
8473 if (!ctx.
Read(itmQBIndex))
8474 {
8476 return false;
8477 }
8478
8479 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8480 if (itmQBIndex != -1 && parentPlayer)
8481 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8482 }
8483 }
8484 else
8485 {
8486
8487 PlayerBase player;
8488 int itemQBIndex;
8489 if (version ==
int.
MAX)
8490 {
8491 if (!ctx.
Read(itemQBIndex))
8492 {
8494 return false;
8495 }
8496 }
8497 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8498 {
8499
8500 if (!ctx.
Read(itemQBIndex))
8501 {
8503 return false;
8504 }
8505 if (itemQBIndex != -1 && player)
8506 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8507 }
8508 }
8509
8510 if (version < 140)
8511 {
8512
8513 if (!LoadVariables(ctx, version))
8514 {
8516 return false;
8517 }
8518 }
8519
8520
8522 {
8524 return false;
8525 }
8526 if (version >= 132)
8527 {
8529 if (raib)
8530 {
8532 {
8534 return false;
8535 }
8536 }
8537 }
8538
8540 return true;
8541 }
8542
8543
8544
8546 {
8547 super.OnStoreSave(ctx);
8548
8549 PlayerBase player;
8550 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8551 {
8553
8554 int itemQBIndex = -1;
8555 itemQBIndex = player.FindQuickBarEntityIndex(this);
8556 ctx.
Write(itemQBIndex);
8557 }
8558 else
8559 {
8561 }
8562
8564
8566 if (raib)
8567 {
8569 }
8570 }
8571
8572
8574 {
8575 super.AfterStoreLoad();
8576
8578 {
8580 }
8581
8583 {
8586 }
8587 }
8588
8590 {
8591 super.EEOnAfterLoad();
8592
8594 {
8596 }
8597
8600 }
8601
8603 {
8604 return false;
8605 }
8606
8607
8608
8610 {
8612 {
8613 #ifdef PLATFORM_CONSOLE
8614
8616 {
8618 if (menu)
8619 {
8621 }
8622 }
8623 #endif
8624 }
8625
8627 {
8630 }
8631
8633 {
8634 SetWeightDirty();
8636 }
8638 {
8641 }
8642
8644 {
8647 }
8649 {
8652 }
8653
8654 super.OnVariablesSynchronized();
8655 }
8656
8657
8658
8660 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8661 {
8662 if (!IsServerCheck(allow_client))
8663 return false;
8664
8666 return false;
8667
8670
8671 if (value <= (min + 0.001))
8672 value = min;
8673
8674 if (value == min)
8675 {
8676 if (destroy_config)
8677 {
8678 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8679 if (dstr)
8680 {
8682 this.Delete();
8683 return true;
8684 }
8685 }
8686 else if (destroy_forced)
8687 {
8689 this.Delete();
8690 return true;
8691 }
8692
8694 }
8695
8698
8700 {
8702
8703 if (delta)
8705 }
8706
8708
8709 return false;
8710 }
8711
8712
8714 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8715 {
8717 }
8718
8720 {
8723 }
8724
8726 {
8729 }
8730
8733 {
8734 float value_clamped = Math.Clamp(value, 0, 1);
8736 SetQuantity(result, destroy_config, destroy_forced);
8737 }
8738
8739
8742 {
8744 }
8745
8747 {
8749 }
8750
8751
8752
8753
8754
8755
8756
8757
8758
8759
8761 {
8762 int slot = -1;
8763 if (GetInventory())
8764 {
8765 InventoryLocation il = new InventoryLocation;
8766 GetInventory().GetCurrentInventoryLocation(il);
8768 }
8769
8771 }
8772
8774 {
8775 float quantity_max = 0;
8776
8778 {
8779 if (attSlotID != -1)
8780 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8781
8782 if (quantity_max <= 0)
8784 }
8785
8786 if (quantity_max <= 0)
8788
8789 return quantity_max;
8790 }
8791
8793 {
8795 }
8796
8798 {
8800 }
8801
8802
8804 {
8806 }
8807
8809 {
8811 }
8812
8814 {
8816 }
8817
8818
8820 {
8821
8822 float weightEx = GetWeightEx();
8823 float special = GetInventoryAndCargoWeight();
8824 return weightEx - special;
8825 }
8826
8827
8829 {
8831 }
8832
8834 {
8836 {
8837 #ifdef DEVELOPER
8838 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8839 {
8840 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8842 }
8843 #endif
8844
8846 }
8847 else if (HasEnergyManager())
8848 {
8849 #ifdef DEVELOPER
8850 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8851 {
8852 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8853 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8854 }
8855 #endif
8856 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8857 }
8858 else
8859 {
8860 #ifdef DEVELOPER
8861 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8862 {
8863 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8864 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8865 }
8866 #endif
8867 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8868 }
8869 }
8870
8873 {
8874 int item_count = 0;
8876
8877 if (GetInventory().GetCargo() != NULL)
8878 {
8879 item_count = GetInventory().GetCargo().GetItemCount();
8880 }
8881
8882 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8883 {
8884 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8885 if (item)
8886 item_count += item.GetNumberOfItems();
8887 }
8888 return item_count;
8889 }
8890
8893 {
8894 float weight = 0;
8895 float wetness = 1;
8896 if (include_wetness)
8899 {
8900 weight = wetness * m_ConfigWeight;
8901 }
8903 {
8904 weight = 1;
8905 }
8906 return weight;
8907 }
8908
8909
8910
8912 {
8913 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8914 {
8915 GameInventory inv = GetInventory();
8916 array<EntityAI> items = new array<EntityAI>;
8918 for (int i = 0; i < items.Count(); i++)
8919 {
8921 if (item)
8922 {
8924 }
8925 }
8926 }
8927 }
8928
8929
8930
8931
8933 {
8934 float energy = 0;
8935 if (HasEnergyManager())
8936 {
8937 energy = GetCompEM().GetEnergy();
8938 }
8939 return energy;
8940 }
8941
8942
8944 {
8945 super.OnEnergyConsumed();
8946
8948 }
8949
8951 {
8952 super.OnEnergyAdded();
8953
8955 }
8956
8957
8959 {
8960 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8961 {
8963 {
8964 float energy_0to1 = GetCompEM().GetEnergy0To1();
8966 }
8967 }
8968 }
8969
8970
8972 {
8973 return ConfigGetFloat("heatIsolation");
8974 }
8975
8977 {
8979 }
8980
8982 {
8983 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8984 if (
GetGame().ConfigIsExisting(paramPath))
8986
8987 return 0.0;
8988 }
8989
8991 {
8992 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8993 if (
GetGame().ConfigIsExisting(paramPath))
8995
8996 return 0.0;
8997 }
8998
8999 override void SetWet(
float value,
bool allow_client =
false)
9000 {
9001 if (!IsServerCheck(allow_client))
9002 return;
9003
9006
9008
9009 m_VarWet = Math.Clamp(value, min, max);
9010
9012 {
9015 }
9016 }
9017
9018 override void AddWet(
float value)
9019 {
9021 }
9022
9024 {
9026 }
9027
9029 {
9031 }
9032
9034 {
9036 }
9037
9039 {
9041 }
9042
9044 {
9046 }
9047
9049 {
9052 if (newLevel != oldLevel)
9053 {
9055 }
9056 }
9057
9059 {
9060 SetWeightDirty();
9061 }
9062
9064 {
9065 return GetWetLevelInternal(
m_VarWet);
9066 }
9067
9068
9069
9071 {
9073 }
9074
9076 {
9078 }
9079
9081 {
9083 }
9084
9086 {
9088 }
9089
9090
9091
9093 {
9094 if (ConfigIsExisting("itemModelLength"))
9095 {
9096 return ConfigGetFloat("itemModelLength");
9097 }
9098 return 0;
9099 }
9100
9102 {
9103 if (ConfigIsExisting("itemAttachOffset"))
9104 {
9105 return ConfigGetFloat("itemAttachOffset");
9106 }
9107 return 0;
9108 }
9109
9110 override void SetCleanness(
int value,
bool allow_client =
false)
9111 {
9112 if (!IsServerCheck(allow_client))
9113 return;
9114
9116
9118
9121 }
9122
9124 {
9126 }
9127
9129 {
9130 return true;
9131 }
9132
9133
9134
9135
9137 {
9139 }
9140
9142 {
9144 }
9145
9146
9147
9148
9149 override void SetColor(
int r,
int g,
int b,
int a)
9150 {
9156 }
9158 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9159 {
9164 }
9165
9167 {
9169 }
9170
9173 {
9174 int r,g,b,a;
9176 r = r/255;
9177 g = g/255;
9178 b = b/255;
9179 a = a/255;
9180 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9181 }
9182
9183
9184
9185 override void SetLiquidType(
int value,
bool allow_client =
false)
9186 {
9187 if (!IsServerCheck(allow_client))
9188 return;
9189
9194 }
9195
9197 {
9198 return ConfigGetInt("varLiquidTypeInit");
9199 }
9200
9202 {
9204 }
9205
9207 {
9209 SetFrozen(false);
9210 }
9211
9214 {
9215 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9216 }
9217
9218
9221 {
9222 PlayerBase nplayer;
9223 if (PlayerBase.CastTo(nplayer, player))
9224 {
9226
9227 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9228 }
9229 }
9230
9231
9234 {
9235 PlayerBase nplayer;
9236 if (PlayerBase.CastTo(nplayer,player))
9237 {
9238
9239 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9240
9241 }
9242
9243
9244 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9245
9246
9247 if (HasEnergyManager())
9248 {
9249 GetCompEM().UpdatePlugState();
9250 }
9251 }
9252
9253
9255 {
9256 super.OnPlacementStarted(player);
9257
9259 }
9260
9261 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9262 {
9264 {
9265 m_AdminLog.OnPlacementComplete(player,
this);
9266 }
9267
9268 super.OnPlacementComplete(player, position, orientation);
9269 }
9270
9271
9272
9273
9274
9276 {
9278 {
9279 return true;
9280 }
9281 else
9282 {
9283 return false;
9284 }
9285 }
9286
9287
9289 {
9291 {
9293 }
9294 }
9295
9296
9298 {
9300 }
9301
9303 {
9305 }
9306
9307 override void InsertAgent(
int agent,
float count = 1)
9308 {
9309 if (count < 1)
9310 return;
9311
9313 }
9314
9317 {
9319 }
9320
9321
9323 {
9325 }
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9369 {
9371 return false;
9372 return true;
9373 }
9374
9376 {
9377
9379 }
9380
9381
9384 {
9385 super.CheckForRoofLimited(timeTresholdMS);
9386
9388 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9389 {
9390 m_PreviousRoofTestTime = time;
9391 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9392 }
9393 }
9394
9395
9397 {
9399 {
9400 return 0;
9401 }
9402
9403 if (GetInventory().GetAttachmentSlotsCount() != 0)
9404 {
9405 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9406 if (filter)
9407 return filter.GetProtectionLevel(type, false, system);
9408 else
9409 return 0;
9410 }
9411
9412 string subclassPath, entryName;
9413
9414 switch (type)
9415 {
9417 entryName = "biological";
9418 break;
9420 entryName = "chemical";
9421 break;
9422 default:
9423 entryName = "biological";
9424 break;
9425 }
9426
9427 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9428
9430 }
9431
9432
9433
9436 {
9437 if (!IsMagazine())
9439
9441 }
9442
9443
9444
9445
9446
9451 {
9452 return true;
9453 }
9454
9456 {
9458 }
9459
9460
9461
9462
9463
9465 {
9466 if (parent)
9467 {
9468 if (parent.IsInherited(DayZInfected))
9469 return true;
9470
9471 if (!parent.IsRuined())
9472 return true;
9473 }
9474
9475 return true;
9476 }
9477
9479 {
9480 if (!super.CanPutAsAttachment(parent))
9481 {
9482 return false;
9483 }
9484
9485 if (!IsRuined() && !parent.IsRuined())
9486 {
9487 return true;
9488 }
9489
9490 return false;
9491 }
9492
9494 {
9495
9496
9497
9498
9499 return super.CanReceiveItemIntoCargo(item);
9500 }
9501
9503 {
9504
9505
9506
9507
9508 GameInventory attachmentInv = attachment.GetInventory();
9510 {
9511 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9512 return false;
9513 }
9514
9515 InventoryLocation loc = new InventoryLocation();
9516 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9517 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9518 return false;
9519
9520 return super.CanReceiveAttachment(attachment, slotId);
9521 }
9522
9524 {
9525 if (!super.CanReleaseAttachment(attachment))
9526 return false;
9527
9528 return GetInventory().AreChildrenAccessible();
9529 }
9530
9531
9532
9533
9534
9535
9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9547
9548
9549
9550
9552 {
9553 int id = muzzle_owner.GetMuzzleID();
9554 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9555
9556 if (WPOF_array)
9557 {
9558 for (int i = 0; i < WPOF_array.Count(); i++)
9559 {
9560 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9561
9562 if (WPOF)
9563 {
9564 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9565 }
9566 }
9567 }
9568 }
9569
9570
9572 {
9573 int id = muzzle_owner.GetMuzzleID();
9575
9576 if (WPOBE_array)
9577 {
9578 for (int i = 0; i < WPOBE_array.Count(); i++)
9579 {
9580 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9581
9582 if (WPOBE)
9583 {
9584 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9585 }
9586 }
9587 }
9588 }
9589
9590
9592 {
9593 int id = muzzle_owner.GetMuzzleID();
9594 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9595
9596 if (WPOOH_array)
9597 {
9598 for (int i = 0; i < WPOOH_array.Count(); i++)
9599 {
9600 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9601
9602 if (WPOOH)
9603 {
9604 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9605 }
9606 }
9607 }
9608 }
9609
9610
9612 {
9613 int id = muzzle_owner.GetMuzzleID();
9614 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9615
9616 if (WPOOH_array)
9617 {
9618 for (int i = 0; i < WPOOH_array.Count(); i++)
9619 {
9620 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9621
9622 if (WPOOH)
9623 {
9624 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9625 }
9626 }
9627 }
9628 }
9629
9630
9632 {
9633 int id = muzzle_owner.GetMuzzleID();
9634 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9635
9636 if (WPOOH_array)
9637 {
9638 for (int i = 0; i < WPOOH_array.Count(); i++)
9639 {
9640 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9641
9642 if (WPOOH)
9643 {
9644 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9645 }
9646 }
9647 }
9648 }
9649
9650
9651
9653 {
9655 {
9656 return true;
9657 }
9658
9659 return false;
9660 }
9661
9663 {
9665 {
9666 return true;
9667 }
9668
9669 return false;
9670 }
9671
9673 {
9675 {
9676 return true;
9677 }
9678
9679 return false;
9680 }
9681
9683 {
9684 return false;
9685 }
9686
9689 {
9690 return UATimeSpent.DEFAULT_DEPLOY;
9691 }
9692
9693
9694
9695
9697 {
9699 SetSynchDirty();
9700 }
9701
9703 {
9705 }
9706
9707
9709 {
9710 return false;
9711 }
9712
9715 {
9716 string att_type = "None";
9717
9718 if (ConfigIsExisting("soundAttType"))
9719 {
9720 att_type = ConfigGetString("soundAttType");
9721 }
9722
9724 }
9725
9727 {
9729 }
9730
9731
9732
9733
9734
9738
9740 {
9743
9745 }
9746
9747
9749 {
9751 return;
9752
9754
9757
9760
9761 SoundParameters params = new SoundParameters();
9765 }
9766
9767
9769 {
9771 return;
9772
9774 SetSynchDirty();
9775
9778 }
9779
9780
9782 {
9784 return;
9785
9787 SetSynchDirty();
9788
9791 }
9792
9794 {
9796 }
9797
9799 {
9801 }
9802
9805 {
9806 if (!
GetGame().IsDedicatedServer())
9807 {
9808 if (ConfigIsExisting("attachSoundSet"))
9809 {
9810 string cfg_path = "";
9811 string soundset = "";
9813
9816 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9817 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9818
9819 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9820 {
9821 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9822 {
9823 if (cfg_slot_array[i] == slot_type)
9824 {
9825 soundset = cfg_soundset_array[i];
9826 break;
9827 }
9828 }
9829 }
9830
9831 if (soundset != "")
9832 {
9833 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9835 }
9836 }
9837 }
9838 }
9839
9841 {
9842
9843 }
9844
9845 void OnApply(PlayerBase player);
9846
9848 {
9849 return 1.0;
9850 };
9851
9853 {
9855 }
9856
9858 {
9860 }
9861
9863
9865 {
9866 SetDynamicPhysicsLifeTime(0.01);
9868 }
9869
9871 {
9872 array<string> zone_names = new array<string>;
9873 GetDamageZones(zone_names);
9874 for (int i = 0; i < zone_names.Count(); i++)
9875 {
9876 SetHealthMax(zone_names.Get(i),"Health");
9877 }
9878 SetHealthMax("","Health");
9879 }
9880
9883 {
9884 float global_health = GetHealth01("","Health");
9885 array<string> zones = new array<string>;
9886 GetDamageZones(zones);
9887
9888 for (int i = 0; i < zones.Count(); i++)
9889 {
9890 SetHealth01(zones.Get(i),"Health",global_health);
9891 }
9892 }
9893
9896 {
9897 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9898 }
9899
9901 {
9902 if (!hasRootAsPlayer)
9903 {
9904 if (refParentIB)
9905 {
9906
9907 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9908 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9909
9910 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9911 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9912
9915 }
9916 else
9917 {
9918
9921 }
9922 }
9923 }
9924
9926 {
9928 {
9929 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9930 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9931 {
9932 float heatPermCoef = 1.0;
9934 while (ent)
9935 {
9936 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9937 ent = ent.GetHierarchyParent();
9938 }
9939
9940 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9941 }
9942 }
9943 }
9944
9946 {
9947
9948 EntityAI parent = GetHierarchyParent();
9949 if (!parent)
9950 {
9951 hasParent = false;
9952 hasRootAsPlayer = false;
9953 }
9954 else
9955 {
9956 hasParent = true;
9957 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9958 refParentIB =
ItemBase.Cast(parent);
9959 }
9960 }
9961
9962 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9963 {
9964
9965 }
9966
9968 {
9969
9970 return false;
9971 }
9972
9974 {
9975
9976
9977 return false;
9978 }
9979
9981 {
9982
9983 return false;
9984 }
9985
9988 {
9989 return !GetIsFrozen() &&
IsOpen();
9990 }
9991
9993 {
9994 bool hasParent = false, hasRootAsPlayer = false;
9996
9997 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9998 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9999
10000 if (wwtu || foodDecay)
10001 {
10005
10006 if (processWetness || processTemperature || processDecay)
10007 {
10009
10010 if (processWetness)
10011 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10012
10013 if (processTemperature)
10015
10016 if (processDecay)
10017 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10018 }
10019 }
10020 }
10021
10024 {
10026 }
10027
10029 {
10032
10033 return super.GetTemperatureFreezeThreshold();
10034 }
10035
10037 {
10040
10041 return super.GetTemperatureThawThreshold();
10042 }
10043
10045 {
10048
10049 return super.GetItemOverheatThreshold();
10050 }
10051
10053 {
10055 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10056
10057 return super.GetTemperatureFreezeTime();
10058 }
10059
10061 {
10063 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10064
10065 return super.GetTemperatureThawTime();
10066 }
10067
10072
10074 {
10075 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10076 }
10077
10079 {
10080 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10081 }
10082
10085 {
10087 }
10088
10090 {
10092 }
10093
10095 {
10097 }
10098
10101 {
10102 return null;
10103 }
10104
10107 {
10108 return false;
10109 }
10110
10112 {
10114 {
10117 if (!trg)
10118 {
10120 explosive = this;
10121 }
10122
10123 explosive.PairRemote(trg);
10125
10126 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10127 trg.SetPersistentPairID(persistentID);
10128 explosive.SetPersistentPairID(persistentID);
10129
10130 return true;
10131 }
10132 return false;
10133 }
10134
10137 {
10138 float ret = 1.0;
10141 ret *= GetHealth01();
10142
10143 return ret;
10144 }
10145
10146 #ifdef DEVELOPER
10147 override void SetDebugItem()
10148 {
10149 super.SetDebugItem();
10150 _itemBase = this;
10151 }
10152
10154 {
10155 string text = super.GetDebugText();
10156
10158 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10159
10160 return text;
10161 }
10162 #endif
10163
10165 {
10166 return true;
10167 }
10168
10170
10172
10174 {
10177 }
10178
10179
10187
10203}
10204
10206{
10208 if (entity)
10209 {
10210 bool is_item = entity.IsInherited(
ItemBase);
10211 if (is_item && full_quantity)
10212 {
10215 }
10216 }
10217 else
10218 {
10220 return NULL;
10221 }
10222 return entity;
10223}
10224
10226{
10227 if (item)
10228 {
10229 if (health > 0)
10230 item.SetHealth("", "", health);
10231
10232 if (item.CanHaveTemperature())
10233 {
10235 if (item.CanFreeze())
10236 item.SetFrozen(false);
10237 }
10238
10239 if (item.HasEnergyManager())
10240 {
10241 if (quantity >= 0)
10242 {
10243 item.GetCompEM().SetEnergy0To1(quantity);
10244 }
10245 else
10246 {
10248 }
10249 }
10250 else if (item.IsMagazine())
10251 {
10252 Magazine mag = Magazine.Cast(item);
10253 if (quantity >= 0)
10254 {
10255 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10256 }
10257 else
10258 {
10260 }
10261
10262 }
10263 else
10264 {
10265 if (quantity >= 0)
10266 {
10267 item.SetQuantityNormalized(quantity, false);
10268 }
10269 else
10270 {
10272 }
10273
10274 }
10275 }
10276}
10277
10278#ifdef DEVELOPER
10280#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
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
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
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
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 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...
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)
void StartItemSoundServer(int id)
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)
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)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
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)
void Open()
Implementations only.
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 EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
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)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
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 bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
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
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
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 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 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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, 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)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
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
proto native CGame GetGame()
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
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
class JsonUndergroundAreaTriggerData GetPosition
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.