5391{
5393 {
5394 return true;
5395 }
5396};
5397
5398
5399
5401{
5405
5407
5410
5411
5412
5413
5414
5423
5429
5434
5439
5460 protected bool m_IsResultOfSplit
5461
5463
5468
5469
5470
5472
5476
5477
5478
5480
5483
5484
5485
5491
5492
5500
5503
5504
5506
5507
5509
5510
5515
5516
5521
5522
5524
5525
5527 {
5532
5533 if (!
GetGame().IsDedicatedServer())
5534 {
5536 {
5538
5540 {
5542 }
5543 }
5544
5547 }
5548
5549 m_OldLocation = null;
5550
5552 {
5554 }
5555
5556 if (ConfigIsExisting("headSelectionsToHide"))
5557 {
5560 }
5561
5563 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5564 {
5566 }
5567
5569
5570 m_IsResultOfSplit = false;
5571
5573 }
5574
5576 {
5577 super.InitItemVariables();
5578
5584 m_Count = ConfigGetInt(
"count");
5585
5588
5593
5596
5601
5613
5617
5618
5621 if (ConfigIsExisting("canBeSplit"))
5622 {
5625 }
5626
5628 if (ConfigIsExisting("itemBehaviour"))
5630
5631
5634 RegisterNetSyncVariableInt("m_VarLiquidType");
5635 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5636
5637 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5638 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5639 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5640
5641 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5642 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5643 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5644 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5645
5646 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5647 RegisterNetSyncVariableBool("m_IsTakeable");
5648 RegisterNetSyncVariableBool("m_IsHologram");
5649
5652 {
5655 }
5656
5658
5660 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5662
5663 }
5664
5666 {
5668 }
5669
5671 {
5674 {
5679 }
5680 }
5681
5682 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5683 {
5685 {
5688 }
5689
5691 }
5692
5694 {
5700 }
5701
5703
5705 {
5707
5708 if (!action)
5709 {
5710 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5711 return;
5712 }
5713
5715 if (!ai)
5716 {
5718 return;
5719 }
5720
5722 if (!action_array)
5723 {
5724 action_array = new array<ActionBase_Basic>;
5726 }
5727 if (LogManager.IsActionLogEnable())
5728 {
5729 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5730 }
5731
5732 if (action_array.Find(action) != -1)
5733 {
5734 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5735 }
5736 else
5737 {
5738 action_array.Insert(action);
5739 }
5740 }
5741
5743 {
5745 ActionBase action = player.GetActionManager().GetAction(actionName);
5748
5749 if (action_array)
5750 {
5751 action_array.RemoveItem(action);
5752 }
5753 }
5754
5755
5756
5758 {
5759 ActionOverrideData overrideData = new ActionOverrideData();
5763
5765 if (!actionMap)
5766 {
5769 }
5770
5771 actionMap.Insert(this.
Type(), overrideData);
5772
5773 }
5774
5776
5778
5779
5781 {
5784
5787
5788 string config_to_search = "CfgVehicles";
5789 string muzzle_owner_config;
5790
5792 {
5793 if (IsInherited(Weapon))
5794 config_to_search = "CfgWeapons";
5795
5796 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5797
5798 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5799
5801
5802 if (config_OnFire_subclass_count > 0)
5803 {
5804 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5805
5806 for (int i = 0; i < config_OnFire_subclass_count; i++)
5807 {
5808 string particle_class = "";
5810 string config_OnFire_entry = config_OnFire_class + particle_class;
5811 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5812 WPOF_array.Insert(WPOF);
5813 }
5814
5815
5817 }
5818 }
5819
5821 {
5822 config_to_search = "CfgWeapons";
5823 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5824
5825 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5826
5828
5829 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5830 {
5831 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5832
5833 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5834 {
5835 string particle_class2 = "";
5837 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5838 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5839 WPOBE_array.Insert(WPOBE);
5840 }
5841
5842
5844 }
5845 }
5846 }
5847
5848
5850 {
5853
5855 {
5856 string config_to_search = "CfgVehicles";
5857
5858 if (IsInherited(Weapon))
5859 config_to_search = "CfgWeapons";
5860
5861 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5862 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5863
5864 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5865 {
5866
5868
5870 {
5872 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5874 return;
5875 }
5876
5879
5880
5881
5883 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5884
5885 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5886 {
5887 string particle_class = "";
5889 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5891
5892 if (entry_type == CT_CLASS)
5893 {
5894 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5895 WPOOH_array.Insert(WPOF);
5896 }
5897 }
5898
5899
5901 }
5902 }
5903 }
5904
5906 {
5908 }
5909
5911 {
5913 {
5915
5918
5921
5922 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5923 }
5924 }
5925
5927 {
5929 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5930
5932 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5933
5935 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5936
5938 {
5940 }
5941 }
5942
5944 {
5946 }
5947
5949 {
5952 else
5954
5956 {
5959 }
5960 else
5961 {
5964
5967 }
5968
5970 }
5971
5973 {
5975 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5976 }
5977
5979 {
5981 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5983 }
5984
5986 {
5988 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5989 }
5990
5992 {
5995
5996 OverheatingParticle OP = new OverheatingParticle();
6001
6003 }
6004
6006 {
6009
6010 return -1;
6011 }
6012
6014 {
6016 {
6019
6020 for (int i = count; i > 0; --i)
6021 {
6022 int id = i - 1;
6025
6028
6029 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6030 {
6031 if (p)
6032 {
6035 }
6036 }
6037 }
6038 }
6039 }
6040
6042 {
6044 {
6046 {
6047 int id = i - 1;
6049
6050 if (OP)
6051 {
6053
6054 if (p)
6055 {
6057 }
6058
6059 delete OP;
6060 }
6061 }
6062
6065 }
6066 }
6067
6070 {
6071 return 0.0;
6072 }
6073
6074
6076 {
6077 return 250;
6078 }
6079
6081 {
6082 return 0;
6083 }
6084
6087 {
6089 return true;
6090
6091 return false;
6092 }
6093
6096 {
6099
6101 {
6103 }
6104 else
6105 {
6106
6108 }
6109
6111 }
6112
6119 {
6120 return -1;
6121 }
6122
6123
6124
6125
6127 {
6129 {
6131 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6132
6133 if (r_index >= 0)
6134 {
6135 InventoryLocation r_il = new InventoryLocation;
6136 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6137
6138 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6141 {
6142 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6143 }
6145 {
6146 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6147 }
6148
6149 }
6150
6151 player.GetHumanInventory().ClearUserReservedLocation(this);
6152 }
6153
6156 }
6157
6158
6159
6160
6162 {
6163 return ItemBase.m_DebugActionsMask;
6164 }
6165
6167 {
6168 return ItemBase.m_DebugActionsMask & mask;
6169 }
6170
6172 {
6173 ItemBase.m_DebugActionsMask = mask;
6174 }
6175
6177 {
6178 ItemBase.m_DebugActionsMask |= mask;
6179 }
6180
6182 {
6183 ItemBase.m_DebugActionsMask &= ~mask;
6184 }
6185
6187 {
6189 {
6191 }
6192 else
6193 {
6195 }
6196 }
6197
6198
6200 {
6201 if (GetEconomyProfile())
6202 {
6203 float q_max = GetEconomyProfile().GetQuantityMax();
6204 if (q_max > 0)
6205 {
6206 float q_min = GetEconomyProfile().GetQuantityMin();
6207 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6208
6210 {
6211 ComponentEnergyManager comp = GetCompEM();
6213 {
6215 }
6216 }
6218 {
6220
6221 }
6222
6223 }
6224 }
6225 }
6226
6229 {
6230 EntityAI parent = GetHierarchyParent();
6231
6232 if (parent)
6233 {
6234 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6235 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6236 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6237 }
6238 }
6239
6242 {
6243 EntityAI parent = GetHierarchyParent();
6244
6245 if (parent)
6246 {
6247 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6248 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6249 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6250 }
6251 }
6252
6254 {
6255
6256
6257
6258
6260
6262 {
6263 if (ScriptInputUserData.CanStoreInputUserData())
6264 {
6265 ScriptInputUserData ctx = new ScriptInputUserData;
6271 ctx.
Write(use_stack_max);
6274
6276 {
6277 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6278 }
6279 }
6280 }
6281 else if (!
GetGame().IsMultiplayer())
6282 {
6284 }
6285 }
6286
6288 {
6290 }
6291
6293 {
6295 }
6296
6298 {
6300 }
6301
6303 {
6304
6305 return false;
6306 }
6307
6309 {
6310 return false;
6311 }
6312
6316 {
6317 return false;
6318 }
6319
6321 {
6322 return "";
6323 }
6324
6326
6328 {
6329 return false;
6330 }
6331
6333 {
6334 return true;
6335 }
6336
6337
6338
6340 {
6341 return true;
6342 }
6343
6345 {
6346 return true;
6347 }
6348
6350 {
6351 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6353 }
6354
6356 {
6358 }
6359
6361 {
6363 if (!is_being_placed)
6365 SetSynchDirty();
6366 }
6367
6368
6370
6372 {
6374 }
6375
6377 {
6379 }
6380
6382 {
6383 return 1;
6384 }
6385
6387 {
6388 return false;
6389 }
6390
6392 {
6394 SetSynchDirty();
6395 }
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427
6428
6429
6430
6432 {
6433 super.OnMovedInsideCargo(container);
6434
6435 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6436 }
6437
6438 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6439 {
6440 super.EEItemLocationChanged(oldLoc,newLoc);
6441
6442 PlayerBase new_player = null;
6443 PlayerBase old_player = null;
6444
6445 if (newLoc.GetParent())
6446 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6447
6448 if (oldLoc.GetParent())
6449 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6450
6452 {
6453 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6454
6455 if (r_index >= 0)
6456 {
6457 InventoryLocation r_il = new InventoryLocation;
6458 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6459
6460 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6463 {
6464 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6465 }
6467 {
6468 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6469 }
6470
6471 }
6472 }
6473
6475 {
6476 if (new_player)
6477 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6478
6479 if (new_player == old_player)
6480 {
6481
6482 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6483 {
6485 {
6486 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6487 {
6488 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6489 }
6490 }
6491 else
6492 {
6493 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6494 }
6495 }
6496
6497 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6498 {
6499 int type = oldLoc.GetType();
6501 {
6502 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6503 }
6505 {
6506 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6507 }
6508 }
6509 if (!m_OldLocation)
6510 {
6511 m_OldLocation = new InventoryLocation;
6512 }
6513 m_OldLocation.Copy(oldLoc);
6514 }
6515 else
6516 {
6517 if (m_OldLocation)
6518 {
6519 m_OldLocation.Reset();
6520 }
6521 }
6522
6524 }
6525 else
6526 {
6527 if (new_player)
6528 {
6529 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6530 if (res_index >= 0)
6531 {
6532 InventoryLocation il = new InventoryLocation;
6533 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6535 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6538 {
6539 il.
GetParent().GetOnReleaseLock().Invoke(it);
6540 }
6542 {
6544 }
6545
6546 }
6547 }
6549 {
6550
6552 }
6553
6554 if (m_OldLocation)
6555 {
6556 m_OldLocation.Reset();
6557 }
6558 }
6559 }
6560
6561 override void EOnContact(IEntity other, Contact extra)
6562 {
6564 {
6565 int liquidType = -1;
6567 if (impactSpeed > 0.0)
6568 {
6570 #ifndef SERVER
6572 #else
6574 SetSynchDirty();
6575 #endif
6577 }
6578 }
6579
6580 #ifdef SERVER
6581 if (GetCompEM() && GetCompEM().IsPlugged())
6582 {
6583 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6584 GetCompEM().UnplugThis();
6585 }
6586 #endif
6587 }
6588
6590
6592 {
6594 }
6595
6597 {
6598
6599 }
6600
6602 {
6603 super.OnItemLocationChanged(old_owner, new_owner);
6604
6605 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6606 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6607
6608 if (!relatedPlayer && playerNew)
6609 relatedPlayer = playerNew;
6610
6611 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6612 {
6614 if (actionMgr)
6615 {
6616 ActionBase currentAction = actionMgr.GetRunningAction();
6617 if (currentAction)
6619 }
6620 }
6621
6622 Man ownerPlayerOld = null;
6623 Man ownerPlayerNew = null;
6624
6625 if (old_owner)
6626 {
6627 if (old_owner.
IsMan())
6628 {
6629 ownerPlayerOld = Man.Cast(old_owner);
6630 }
6631 else
6632 {
6633 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6634 }
6635 }
6636 else
6637 {
6639 {
6641
6642 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6643 {
6644 GetCompEM().UnplugThis();
6645 }
6646 }
6647 }
6648
6649 if (new_owner)
6650 {
6651 if (new_owner.
IsMan())
6652 {
6653 ownerPlayerNew = Man.Cast(new_owner);
6654 }
6655 else
6656 {
6657 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6658 }
6659 }
6660
6661 if (ownerPlayerOld != ownerPlayerNew)
6662 {
6663 if (ownerPlayerOld)
6664 {
6665 array<EntityAI> subItemsExit = new array<EntityAI>;
6667 for (int i = 0; i < subItemsExit.Count(); i++)
6668 {
6671 }
6672 }
6673
6674 if (ownerPlayerNew)
6675 {
6676 array<EntityAI> subItemsEnter = new array<EntityAI>;
6678 for (int j = 0; j < subItemsEnter.Count(); j++)
6679 {
6682 }
6683 }
6684 }
6685 else if (ownerPlayerNew != null)
6686 {
6687 PlayerBase nplayer;
6688 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6689 {
6690 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6692 for (int k = 0; k < subItemsUpdate.Count(); k++)
6693 {
6695 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6696 }
6697 }
6698 }
6699
6700 if (old_owner)
6701 old_owner.OnChildItemRemoved(this);
6702 if (new_owner)
6703 new_owner.OnChildItemReceived(this);
6704 }
6705
6706
6708 {
6709 super.EEDelete(parent);
6710 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6711 if (player)
6712 {
6714
6715 if (player.IsAlive())
6716 {
6717 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6718 if (r_index >= 0)
6719 {
6720 InventoryLocation r_il = new InventoryLocation;
6721 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6722
6723 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6726 {
6727 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6728 }
6730 {
6731 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6732 }
6733
6734 }
6735
6736 player.RemoveQuickBarEntityShortcut(this);
6737 }
6738 }
6739 }
6740
6742 {
6743 super.EEKilled(killer);
6744
6747 {
6748 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6749 {
6750 if (IsMagazine())
6751 {
6752 if (Magazine.Cast(this).GetAmmoCount() > 0)
6753 {
6755 }
6756 }
6757 else
6758 {
6760 }
6761 }
6762 }
6763 }
6764
6766 {
6767 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6768
6769 super.OnWasAttached(parent, slot_id);
6770
6773
6775 }
6776
6778 {
6779 super.OnWasDetached(parent, slot_id);
6780
6783 }
6784
6786 {
6787 int idx;
6790
6791 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6792 if (inventory_slots.Count() < 1)
6793 {
6794 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6795 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6796 }
6797 else
6798 {
6799 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6800 }
6801
6802 idx = inventory_slots.Find(slot);
6803 if (idx < 0)
6804 return "";
6805
6806 return attach_types.Get(idx);
6807 }
6808
6810 {
6811 int idx = -1;
6812 string slot;
6813
6816
6817 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6818 if (inventory_slots.Count() < 1)
6819 {
6820 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6821 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6822 }
6823 else
6824 {
6825 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6826 if (detach_types.Count() < 1)
6827 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6828 }
6829
6830 for (int i = 0; i < inventory_slots.Count(); i++)
6831 {
6832 slot = inventory_slots.Get(i);
6833 }
6834
6835 if (slot != "")
6836 {
6837 if (detach_types.Count() == 1)
6838 idx = 0;
6839 else
6840 idx = inventory_slots.Find(slot);
6841 }
6842 if (idx < 0)
6843 return "";
6844
6845 return detach_types.Get(idx);
6846 }
6847
6849 {
6850
6852
6853
6854 float min_time = 1;
6855 float max_time = 3;
6856 float delay = Math.RandomFloat(min_time, max_time);
6857
6858 explode_timer.Run(delay, this, "DoAmmoExplosion");
6859 }
6860
6862 {
6863 Magazine magazine = Magazine.Cast(this);
6864 int pop_sounds_count = 6;
6865 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6866
6867
6868 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6869 string sound_name = pop_sounds[ sound_idx ];
6871
6872
6873 magazine.ServerAddAmmoCount(-1);
6874
6875
6876 float min_temp_to_explode = 100;
6877
6878 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6879 {
6881 }
6882 }
6883
6884
6885 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6886 {
6887 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6888
6889 const int CHANCE_DAMAGE_CARGO = 4;
6890 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6891 const int CHANCE_DAMAGE_NOTHING = 2;
6892
6894 {
6895 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6896 int chances;
6897 int rnd;
6898
6899 if (GetInventory().GetCargo())
6900 {
6901 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6902 rnd = Math.RandomInt(0,chances);
6903
6904 if (rnd < CHANCE_DAMAGE_CARGO)
6905 {
6907 }
6908 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6909 {
6911 }
6912 }
6913 else
6914 {
6915 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6916 rnd = Math.RandomInt(0,chances);
6917
6918 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6919 {
6921 }
6922 }
6923 }
6924 }
6925
6927 {
6928 if (GetInventory().GetCargo())
6929 {
6930 int item_count = GetInventory().GetCargo().GetItemCount();
6931 if (item_count > 0)
6932 {
6933 int random_pick = Math.RandomInt(0, item_count);
6935 if (!item.IsExplosive())
6936 {
6937 item.AddHealth("","",damage);
6938 return true;
6939 }
6940 }
6941 }
6942 return false;
6943 }
6944
6946 {
6947 int attachment_count = GetInventory().AttachmentCount();
6948 if (attachment_count > 0)
6949 {
6950 int random_pick = Math.RandomInt(0, attachment_count);
6951 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6952 if (!attachment.IsExplosive())
6953 {
6954 attachment.AddHealth("","",damage);
6955 return true;
6956 }
6957 }
6958 return false;
6959 }
6960
6962 {
6964 }
6965
6967 {
6969 return GetInventory().CanRemoveEntity();
6970
6971 return false;
6972 }
6973
6975 {
6977 return;
6978
6980 {
6981 if (ScriptInputUserData.CanStoreInputUserData())
6982 {
6983 ScriptInputUserData ctx = new ScriptInputUserData;
6988 ctx.
Write(destination_entity);
6992 }
6993 }
6994 else if (!
GetGame().IsMultiplayer())
6995 {
6997 }
6998 }
6999
7001 {
7003 return;
7004
7005 float split_quantity_new;
7009 InventoryLocation loc = new InventoryLocation;
7010
7011 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7012 {
7014 split_quantity_new = stack_max;
7015 else
7017
7018 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7019 if (new_item)
7020 {
7021 new_item.SetResultOfSplit(true);
7022 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7024 new_item.SetQuantity(split_quantity_new);
7025 }
7026 }
7027 else if (destination_entity && slot_id == -1)
7028 {
7029 if (quantity > stack_max)
7030 split_quantity_new = stack_max;
7031 else
7032 split_quantity_new = quantity;
7033
7035 {
7038 }
7039
7040 if (new_item)
7041 {
7042 new_item.SetResultOfSplit(true);
7043 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7045 new_item.SetQuantity(split_quantity_new);
7046 }
7047 }
7048 else
7049 {
7050 if (stack_max != 0)
7051 {
7053 {
7055 }
7056
7057 if (split_quantity_new == 0)
7058 {
7059 if (!
GetGame().IsMultiplayer())
7060 player.PhysicalPredictiveDropItem(this);
7061 else
7062 player.ServerDropEntity(this);
7063 return;
7064 }
7065
7067
7068 if (new_item)
7069 {
7070 new_item.SetResultOfSplit(true);
7071 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7073 new_item.SetQuantity(stack_max);
7074 new_item.PlaceOnSurface();
7075 }
7076 }
7077 }
7078 }
7079
7081 {
7083 return;
7084
7085 float split_quantity_new;
7089 InventoryLocation loc = new InventoryLocation;
7090
7091 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7092 {
7094 split_quantity_new = stack_max;
7095 else
7097
7098 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7099 if (new_item)
7100 {
7101 new_item.SetResultOfSplit(true);
7102 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7104 new_item.SetQuantity(split_quantity_new);
7105 }
7106 }
7107 else if (destination_entity && slot_id == -1)
7108 {
7109 if (quantity > stack_max)
7110 split_quantity_new = stack_max;
7111 else
7112 split_quantity_new = quantity;
7113
7115 {
7118 }
7119
7120 if (new_item)
7121 {
7122 new_item.SetResultOfSplit(true);
7123 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7125 new_item.SetQuantity(split_quantity_new);
7126 }
7127 }
7128 else
7129 {
7130 if (stack_max != 0)
7131 {
7133 {
7135 }
7136
7138
7139 if (new_item)
7140 {
7141 new_item.SetResultOfSplit(true);
7142 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7144 new_item.SetQuantity(stack_max);
7145 new_item.PlaceOnSurface();
7146 }
7147 }
7148 }
7149 }
7150
7152 {
7154 return;
7155
7157 {
7158 if (ScriptInputUserData.CanStoreInputUserData())
7159 {
7160 ScriptInputUserData ctx = new ScriptInputUserData;
7165 dst.WriteToContext(ctx);
7167 }
7168 }
7169 else if (!
GetGame().IsMultiplayer())
7170 {
7172 }
7173 }
7174
7176 {
7178 return;
7179
7181 {
7182 if (ScriptInputUserData.CanStoreInputUserData())
7183 {
7184 ScriptInputUserData ctx = new ScriptInputUserData;
7189 ctx.
Write(destination_entity);
7195 }
7196 }
7197 else if (!
GetGame().IsMultiplayer())
7198 {
7200 }
7201 }
7202
7204 {
7206 }
7207
7209 {
7211 return this;
7212
7214 float split_quantity_new;
7216 if (dst.IsValid())
7217 {
7218 int slot_id = dst.GetSlot();
7220
7221 if (quantity > stack_max)
7222 split_quantity_new = stack_max;
7223 else
7224 split_quantity_new = quantity;
7225
7227
7228 if (new_item)
7229 {
7230 new_item.SetResultOfSplit(true);
7231 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7234 }
7235
7236 return new_item;
7237 }
7238
7239 return null;
7240 }
7241
7243 {
7245 return;
7246
7248 float split_quantity_new;
7250 if (destination_entity)
7251 {
7253 if (quantity > stackable)
7254 split_quantity_new = stackable;
7255 else
7256 split_quantity_new = quantity;
7257
7258 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7259 if (new_item)
7260 {
7261 new_item.SetResultOfSplit(true);
7262 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7264 new_item.SetQuantity(split_quantity_new);
7265 }
7266 }
7267 }
7268
7270 {
7272 return;
7273
7275 {
7276 if (ScriptInputUserData.CanStoreInputUserData())
7277 {
7278 ScriptInputUserData ctx = new ScriptInputUserData;
7283 ItemBase destination_entity =
this;
7284 ctx.
Write(destination_entity);
7288 }
7289 }
7290 else if (!
GetGame().IsMultiplayer())
7291 {
7293 }
7294 }
7295
7297 {
7299 return;
7300
7302 float split_quantity_new;
7304 if (player)
7305 {
7307 if (quantity > stackable)
7308 split_quantity_new = stackable;
7309 else
7310 split_quantity_new = quantity;
7311
7312 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7313 new_item =
ItemBase.Cast(in_hands);
7314 if (new_item)
7315 {
7316 new_item.SetResultOfSplit(true);
7317 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7319 new_item.SetQuantity(split_quantity_new);
7320 }
7321 }
7322 }
7323
7325 {
7327 return;
7328
7330 float split_quantity_new = Math.Floor(quantity * 0.5);
7331
7333
7334 if (new_item)
7335 {
7336 if (new_item.GetQuantityMax() < split_quantity_new)
7337 {
7338 split_quantity_new = new_item.GetQuantityMax();
7339 }
7340
7341 new_item.SetResultOfSplit(true);
7342 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7343
7345 {
7348 }
7349 else
7350 {
7353 }
7354 }
7355 }
7356
7358 {
7360 return;
7361
7363 float split_quantity_new = Math.Floor(quantity / 2);
7364
7365 InventoryLocation invloc = new InventoryLocation;
7367
7369 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7370
7371 if (new_item)
7372 {
7373 if (new_item.GetQuantityMax() < split_quantity_new)
7374 {
7375 split_quantity_new = new_item.GetQuantityMax();
7376 }
7378 {
7381 }
7382 else
7383 {
7386 }
7387 }
7388 }
7389
7392 {
7393 SetWeightDirty();
7395
7396 if (parent)
7397 parent.OnAttachmentQuantityChangedEx(this, delta);
7398
7400 {
7402 {
7404 }
7406 {
7407 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7409 }
7410 }
7411
7412 }
7413
7416 {
7417
7418 }
7419
7422 {
7424 }
7425
7427 {
7428 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7429
7431 {
7432 if (newLevel == GameConstants.STATE_RUINED)
7433 {
7435 EntityAI parent = GetHierarchyParent();
7436 if (parent && parent.IsFireplace())
7437 {
7438 CargoBase cargo = GetInventory().GetCargo();
7439 if (cargo)
7440 {
7442 {
7444 }
7445 }
7446 }
7447 }
7448
7450 {
7451
7453 return;
7454 }
7455
7456 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7457 {
7459 }
7460 }
7461 }
7462
7463
7465 {
7466 super.OnRightClick();
7467
7469 {
7471 {
7472 if (ScriptInputUserData.CanStoreInputUserData())
7473 {
7474 vector m4[4];
7476
7477 EntityAI root = GetHierarchyRoot();
7478
7479 InventoryLocation dst = new InventoryLocation;
7481 {
7482 if (root)
7483 {
7484 root.GetTransform(m4);
7486 }
7487 else
7488 GetInventory().GetCurrentInventoryLocation(dst);
7489 }
7490 else
7491 {
7493
7494
7495 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7496 {
7497 if (root)
7498 {
7499 root.GetTransform(m4);
7501 }
7502 else
7503 GetInventory().GetCurrentInventoryLocation(dst);
7504 }
7505 else
7506 {
7507 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7508 }
7509 }
7510
7511 ScriptInputUserData ctx = new ScriptInputUserData;
7519 }
7520 }
7521 else if (!
GetGame().IsMultiplayer())
7522 {
7524 }
7525 }
7526 }
7527
7528 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7529 {
7530
7531 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7532 return false;
7533
7534 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7535 return false;
7536
7537
7539 return false;
7540
7541
7542 Magazine mag = Magazine.Cast(this);
7543 if (mag)
7544 {
7545 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7546 return false;
7547
7548 if (stack_max_limit)
7549 {
7550 Magazine other_mag = Magazine.Cast(other_item);
7551 if (other_item)
7552 {
7553 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7554 return false;
7555 }
7556
7557 }
7558 }
7559 else
7560 {
7561
7563 return false;
7564
7566 return false;
7567 }
7568
7569 PlayerBase player = null;
7570 if (CastTo(player, GetHierarchyRootPlayer()))
7571 {
7572 if (player.GetInventory().HasAttachment(this))
7573 return false;
7574
7575 if (player.IsItemsToDelete())
7576 return false;
7577 }
7578
7579 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7580 return false;
7581
7582 int slotID;
7584 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7585 return false;
7586
7587 return true;
7588 }
7589
7591 {
7593 }
7594
7596 {
7597 return m_IsResultOfSplit;
7598 }
7599
7601 {
7602 m_IsResultOfSplit = value;
7603 }
7604
7606 {
7608 }
7609
7611 {
7612 float other_item_quantity = other_item.GetQuantity();
7613 float this_free_space;
7614
7616
7618
7619 if (other_item_quantity > this_free_space)
7620 {
7621 return this_free_space;
7622 }
7623 else
7624 {
7625 return other_item_quantity;
7626 }
7627 }
7628
7630 {
7632 }
7633
7635 {
7637 return;
7638
7639 if (!IsMagazine() && other_item)
7640 {
7642 if (quantity_used != 0)
7643 {
7644 float hp1 = GetHealth01("","");
7645 float hp2 = other_item.GetHealth01("","");
7646 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7647 hpResult = hpResult / (
GetQuantity() + quantity_used);
7648
7649 hpResult *= GetMaxHealth();
7650 Math.Round(hpResult);
7651 SetHealth("", "Health", hpResult);
7652
7654 other_item.AddQuantity(-quantity_used);
7655 }
7656 }
7658 }
7659
7661 {
7662 #ifdef SERVER
7663 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7664 GetHierarchyParent().IncreaseLifetimeUp();
7665 #endif
7666 };
7667
7669 {
7670 PlayerBase p = PlayerBase.Cast(player);
7671
7672 array<int> recipesIds = p.m_Recipes;
7673 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7674 if (moduleRecipesManager)
7675 {
7676 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7677 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7678 }
7679
7680 for (int i = 0;i < recipesIds.Count(); i++)
7681 {
7682 int key = recipesIds.Get(i);
7683 string recipeName = moduleRecipesManager.GetRecipeName(key);
7685 }
7686 }
7687
7688
7689 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7690 {
7691 super.GetDebugActions(outputList);
7692
7693
7698
7699
7703
7707
7708
7711
7712
7714 {
7717 }
7718
7720
7723
7727 }
7728
7729
7730
7731
7733 {
7734 super.OnAction(action_id, player, ctx);
7735 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7736 {
7737 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7738 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7739 PlayerBase p = PlayerBase.Cast(player);
7740 if (
EActions.RECIPES_RANGE_START < 1000)
7741 {
7742 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7743 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7744 }
7745 }
7746 #ifndef SERVER
7747 else if (action_id ==
EActions.WATCH_PLAYER)
7748 {
7749 PluginDeveloper.SetDeveloperItemClientEx(player);
7750 }
7751 #endif
7753 {
7754 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7755 {
7756 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7757 OnDebugButtonPressServer(id + 1);
7758 }
7759
7760 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7761 {
7762 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7764 }
7765
7766 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7767 {
7768 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7770 }
7771
7772 else if (action_id ==
EActions.ADD_QUANTITY)
7773 {
7774 if (IsMagazine())
7775 {
7776 Magazine mag = Magazine.Cast(this);
7777 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7778 }
7779 else
7780 {
7782 }
7783
7784 if (m_EM)
7785 {
7786 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7787 }
7788
7789 }
7790
7791 else if (action_id ==
EActions.REMOVE_QUANTITY)
7792 {
7793 if (IsMagazine())
7794 {
7795 Magazine mag2 = Magazine.Cast(this);
7796 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7797 }
7798 else
7799 {
7801 }
7802 if (m_EM)
7803 {
7804 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7805 }
7806
7807 }
7808
7809 else if (action_id ==
EActions.SET_QUANTITY_0)
7810 {
7812
7813 if (m_EM)
7814 {
7815 m_EM.SetEnergy(0);
7816 }
7817 }
7818
7819 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7820 {
7822
7823 if (m_EM)
7824 {
7825 m_EM.SetEnergy(m_EM.GetEnergyMax());
7826 }
7827 }
7828
7829 else if (action_id ==
EActions.ADD_HEALTH)
7830 {
7831 AddHealth("","",GetMaxHealth("","Health")/5);
7832 }
7833 else if (action_id ==
EActions.REMOVE_HEALTH)
7834 {
7835 AddHealth("","",-GetMaxHealth("","Health")/5);
7836 }
7837 else if (action_id ==
EActions.DESTROY_HEALTH)
7838 {
7839 SetHealth01("","",0);
7840 }
7841 else if (action_id ==
EActions.WATCH_ITEM)
7842 {
7844 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7845 #ifdef DEVELOPER
7846 SetDebugDeveloper_item(this);
7847 #endif
7848 }
7849
7850 else if (action_id ==
EActions.ADD_TEMPERATURE)
7851 {
7852 AddTemperature(20);
7853
7854 }
7855
7856 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7857 {
7858 AddTemperature(-20);
7859
7860 }
7861
7862 else if (action_id ==
EActions.FLIP_FROZEN)
7863 {
7864 SetFrozen(!GetIsFrozen());
7865
7866 }
7867
7868 else if (action_id ==
EActions.ADD_WETNESS)
7869 {
7871
7872 }
7873
7874 else if (action_id ==
EActions.REMOVE_WETNESS)
7875 {
7877
7878 }
7879
7880 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7881 {
7884
7885
7886 }
7887
7888 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7889 {
7892 }
7893
7894 else if (action_id ==
EActions.MAKE_SPECIAL)
7895 {
7896 auto debugParams = DebugSpawnParams.WithPlayer(player);
7897 OnDebugSpawnEx(debugParams);
7898 }
7899
7900 else if (action_id ==
EActions.DELETE)
7901 {
7902 Delete();
7903 }
7904
7905 }
7906
7907
7908 return false;
7909 }
7910
7911
7912
7913
7917
7920
7921
7922
7924 {
7925 return false;
7926 }
7927
7928
7930 {
7931 return true;
7932 }
7933
7934
7936 {
7937 return true;
7938 }
7939
7940
7941
7943 {
7944 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7946 }
7947
7950 {
7951 return null;
7952 }
7953
7955 {
7956 return false;
7957 }
7958
7960 {
7961 return false;
7962 }
7963
7967
7968
7970 {
7971 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7972 return module_repairing.CanRepair(this, item_repair_kit);
7973 }
7974
7975
7976 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7977 {
7978 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7979 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7980 }
7981
7982
7984 {
7985
7986
7987
7988
7989
7990
7991
7992
7993 return 1;
7994 }
7995
7996
7997
7999 {
8001 }
8002
8003
8004
8006 {
8008 }
8009
8010
8019 {
8020 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8021
8022 if (player)
8023 {
8024 player.MessageStatus(text);
8025 }
8026 }
8027
8028
8037 {
8038 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8039
8040 if (player)
8041 {
8042 player.MessageAction(text);
8043 }
8044 }
8045
8046
8055 {
8056 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8057
8058 if (player)
8059 {
8060 player.MessageFriendly(text);
8061 }
8062 }
8063
8064
8073 {
8074 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8075
8076 if (player)
8077 {
8078 player.MessageImportant(text);
8079 }
8080 }
8081
8083 {
8084 return true;
8085 }
8086
8087
8088 override bool KindOf(
string tag)
8089 {
8090 bool found = false;
8091 string item_name = this.
GetType();
8094
8095 int array_size = item_tag_array.Count();
8096 for (int i = 0; i < array_size; i++)
8097 {
8098 if (item_tag_array.Get(i) == tag)
8099 {
8100 found = true;
8101 break;
8102 }
8103 }
8104 return found;
8105 }
8106
8107
8109 {
8110
8111 super.OnRPC(sender, rpc_type,ctx);
8112
8113
8114 switch (rpc_type)
8115 {
8116 #ifndef SERVER
8117 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8118 Param2<bool, string> p = new Param2<bool, string>(false, "");
8119
8121 return;
8122
8123 bool play = p.param1;
8124 string soundSet = p.param2;
8125
8126 if (play)
8127 {
8129 {
8131 {
8133 }
8134 }
8135 else
8136 {
8138 }
8139 }
8140 else
8141 {
8143 }
8144
8145 break;
8146 #endif
8147
8148 }
8149
8151 {
8153 }
8154 }
8155
8156
8157
8158
8160 {
8161 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8162 return plugin.GetID(
name);
8163 }
8164
8166 {
8167 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8168 return plugin.GetName(id);
8169 }
8170
8173 {
8174
8175
8176 int varFlags;
8177 if (!ctx.
Read(varFlags))
8178 return;
8179
8180 if (varFlags & ItemVariableFlags.FLOAT)
8181 {
8183 }
8184 }
8185
8187 {
8188
8189 super.SerializeNumericalVars(floats_out);
8190
8191
8192
8194 {
8196 }
8197
8199 {
8201 }
8202
8204 {
8206 }
8207
8209 {
8214 }
8215
8217 {
8219 }
8220 }
8221
8223 {
8224
8225 super.DeSerializeNumericalVars(floats);
8226
8227
8228 int index = 0;
8229 int mask = Math.Round(floats.Get(index));
8230
8231 index++;
8232
8234 {
8236 {
8238 }
8239 else
8240 {
8241 float quantity = floats.Get(index);
8243 }
8244 index++;
8245 }
8246
8248 {
8249 float wet = floats.Get(index);
8251 index++;
8252 }
8253
8255 {
8256 int liquidtype = Math.Round(floats.Get(index));
8258 index++;
8259 }
8260
8262 {
8264 index++;
8266 index++;
8268 index++;
8270 index++;
8271 }
8272
8274 {
8275 int cleanness = Math.Round(floats.Get(index));
8277 index++;
8278 }
8279 }
8280
8282 {
8283 super.WriteVarsToCTX(ctx);
8284
8285
8287 {
8289 }
8290
8292 {
8294 }
8295
8297 {
8299 }
8300
8302 {
8303 int r,g,b,a;
8309 }
8310
8312 {
8314 }
8315 }
8316
8318 {
8319 if (!super.ReadVarsFromCTX(ctx,version))
8320 return false;
8321
8322 int intValue;
8323 float value;
8324
8325 if (version < 140)
8326 {
8327 if (!ctx.
Read(intValue))
8328 return false;
8329
8330 m_VariablesMask = intValue;
8331 }
8332
8334 {
8335 if (!ctx.
Read(value))
8336 return false;
8337
8339 {
8341 }
8342 else
8343 {
8345 }
8346 }
8347
8348 if (version < 140)
8349 {
8351 {
8352 if (!ctx.
Read(value))
8353 return false;
8354 SetTemperatureDirect(value);
8355 }
8356 }
8357
8359 {
8360 if (!ctx.
Read(value))
8361 return false;
8363 }
8364
8366 {
8367 if (!ctx.
Read(intValue))
8368 return false;
8370 }
8371
8373 {
8374 int r,g,b,a;
8376 return false;
8378 return false;
8380 return false;
8382 return false;
8383
8385 }
8386
8388 {
8389 if (!ctx.
Read(intValue))
8390 return false;
8392 }
8393
8394 if (version >= 138 && version < 140)
8395 {
8397 {
8398 if (!ctx.
Read(intValue))
8399 return false;
8400 SetFrozen(intValue);
8401 }
8402 }
8403
8404 return true;
8405 }
8406
8407
8409 {
8412 {
8414 }
8415
8416 if (!super.OnStoreLoad(ctx, version))
8417 {
8419 return false;
8420 }
8421
8422 if (version >= 114)
8423 {
8424 bool hasQuickBarIndexSaved;
8425
8426 if (!ctx.
Read(hasQuickBarIndexSaved))
8427 {
8429 return false;
8430 }
8431
8432 if (hasQuickBarIndexSaved)
8433 {
8434 int itmQBIndex;
8435
8436
8437 if (!ctx.
Read(itmQBIndex))
8438 {
8440 return false;
8441 }
8442
8443 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8444 if (itmQBIndex != -1 && parentPlayer)
8445 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8446 }
8447 }
8448 else
8449 {
8450
8451 PlayerBase player;
8452 int itemQBIndex;
8453 if (version ==
int.
MAX)
8454 {
8455 if (!ctx.
Read(itemQBIndex))
8456 {
8458 return false;
8459 }
8460 }
8461 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8462 {
8463
8464 if (!ctx.
Read(itemQBIndex))
8465 {
8467 return false;
8468 }
8469 if (itemQBIndex != -1 && player)
8470 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8471 }
8472 }
8473
8474 if (version < 140)
8475 {
8476
8477 if (!LoadVariables(ctx, version))
8478 {
8480 return false;
8481 }
8482 }
8483
8484
8486 {
8488 return false;
8489 }
8490 if (version >= 132)
8491 {
8493 if (raib)
8494 {
8496 {
8498 return false;
8499 }
8500 }
8501 }
8502
8504 return true;
8505 }
8506
8507
8508
8510 {
8511 super.OnStoreSave(ctx);
8512
8513 PlayerBase player;
8514 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8515 {
8517
8518 int itemQBIndex = -1;
8519 itemQBIndex = player.FindQuickBarEntityIndex(this);
8520 ctx.
Write(itemQBIndex);
8521 }
8522 else
8523 {
8525 }
8526
8528
8530 if (raib)
8531 {
8533 }
8534 }
8535
8536
8538 {
8539 super.AfterStoreLoad();
8540
8542 {
8544 }
8545
8547 {
8550 }
8551 }
8552
8554 {
8555 super.EEOnAfterLoad();
8556
8558 {
8560 }
8561
8564 }
8565
8567 {
8568 return false;
8569 }
8570
8571
8572
8574 {
8576 {
8577 #ifdef PLATFORM_CONSOLE
8578
8580 {
8582 if (menu)
8583 {
8585 }
8586 }
8587 #endif
8588 }
8589
8591 {
8594 }
8595
8597 {
8598 SetWeightDirty();
8600 }
8602 {
8605 }
8606
8608 {
8611 }
8613 {
8616 }
8617
8618 super.OnVariablesSynchronized();
8619 }
8620
8621
8622
8624 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8625 {
8626 if (!IsServerCheck(allow_client))
8627 return false;
8628
8630 return false;
8631
8634
8635 if (value <= (min + 0.001))
8636 value = min;
8637
8638 if (value == min)
8639 {
8640 if (destroy_config)
8641 {
8642 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8643 if (dstr)
8644 {
8646 this.Delete();
8647 return true;
8648 }
8649 }
8650 else if (destroy_forced)
8651 {
8653 this.Delete();
8654 return true;
8655 }
8656
8658 }
8659
8662
8664 {
8666
8667 if (delta)
8669 }
8670
8672
8673 return false;
8674 }
8675
8676
8678 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8679 {
8681 }
8682
8684 {
8687 }
8688
8690 {
8693 }
8694
8697 {
8698 float value_clamped = Math.Clamp(value, 0, 1);
8700 SetQuantity(result, destroy_config, destroy_forced);
8701 }
8702
8703
8706 {
8708 }
8709
8711 {
8713 }
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8725 {
8726 int slot = -1;
8727 if (GetInventory())
8728 {
8729 InventoryLocation il = new InventoryLocation;
8730 GetInventory().GetCurrentInventoryLocation(il);
8732 }
8733
8735 }
8736
8738 {
8739 float quantity_max = 0;
8740
8742 {
8743 if (attSlotID != -1)
8744 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8745
8746 if (quantity_max <= 0)
8748 }
8749
8750 if (quantity_max <= 0)
8752
8753 return quantity_max;
8754 }
8755
8757 {
8759 }
8760
8762 {
8764 }
8765
8766
8768 {
8770 }
8771
8773 {
8775 }
8776
8778 {
8780 }
8781
8782
8784 {
8785
8786 float weightEx = GetWeightEx();
8787 float special = GetInventoryAndCargoWeight();
8788 return weightEx - special;
8789 }
8790
8791
8793 {
8795 }
8796
8798 {
8800 {
8801 #ifdef DEVELOPER
8802 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8803 {
8804 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8806 }
8807 #endif
8808
8810 }
8811 else if (HasEnergyManager())
8812 {
8813 #ifdef DEVELOPER
8814 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8815 {
8816 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8817 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8818 }
8819 #endif
8820 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8821 }
8822 else
8823 {
8824 #ifdef DEVELOPER
8825 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8826 {
8827 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8828 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8829 }
8830 #endif
8831 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8832 }
8833 }
8834
8837 {
8838 int item_count = 0;
8840
8841 if (GetInventory().GetCargo() != NULL)
8842 {
8843 item_count = GetInventory().GetCargo().GetItemCount();
8844 }
8845
8846 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8847 {
8848 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8849 if (item)
8850 item_count += item.GetNumberOfItems();
8851 }
8852 return item_count;
8853 }
8854
8857 {
8858 float weight = 0;
8859 float wetness = 1;
8860 if (include_wetness)
8863 {
8864 weight = wetness * m_ConfigWeight;
8865 }
8867 {
8868 weight = 1;
8869 }
8870 return weight;
8871 }
8872
8873
8874
8876 {
8877 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8878 {
8879 GameInventory inv = GetInventory();
8880 array<EntityAI> items = new array<EntityAI>;
8882 for (int i = 0; i < items.Count(); i++)
8883 {
8885 if (item)
8886 {
8888 }
8889 }
8890 }
8891 }
8892
8893
8894
8895
8897 {
8898 float energy = 0;
8899 if (HasEnergyManager())
8900 {
8901 energy = GetCompEM().GetEnergy();
8902 }
8903 return energy;
8904 }
8905
8906
8908 {
8909 super.OnEnergyConsumed();
8910
8912 }
8913
8915 {
8916 super.OnEnergyAdded();
8917
8919 }
8920
8921
8923 {
8924 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8925 {
8927 {
8928 float energy_0to1 = GetCompEM().GetEnergy0To1();
8930 }
8931 }
8932 }
8933
8934
8936 {
8937 return ConfigGetFloat("heatIsolation");
8938 }
8939
8941 {
8943 }
8944
8946 {
8947 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8948 if (
GetGame().ConfigIsExisting(paramPath))
8950
8951 return 0.0;
8952 }
8953
8955 {
8956 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8957 if (
GetGame().ConfigIsExisting(paramPath))
8959
8960 return 0.0;
8961 }
8962
8963 override void SetWet(
float value,
bool allow_client =
false)
8964 {
8965 if (!IsServerCheck(allow_client))
8966 return;
8967
8970
8972
8973 m_VarWet = Math.Clamp(value, min, max);
8974
8976 {
8979 }
8980 }
8981
8982 override void AddWet(
float value)
8983 {
8985 }
8986
8988 {
8990 }
8991
8993 {
8995 }
8996
8998 {
9000 }
9001
9003 {
9005 }
9006
9008 {
9010 }
9011
9013 {
9016 if (newLevel != oldLevel)
9017 {
9019 }
9020 }
9021
9023 {
9024 SetWeightDirty();
9025 }
9026
9028 {
9029 return GetWetLevelInternal(
m_VarWet);
9030 }
9031
9032
9033
9035 {
9037 }
9038
9040 {
9042 }
9043
9045 {
9047 }
9048
9050 {
9052 }
9053
9054
9055
9057 {
9058 if (ConfigIsExisting("itemModelLength"))
9059 {
9060 return ConfigGetFloat("itemModelLength");
9061 }
9062 return 0;
9063 }
9064
9066 {
9067 if (ConfigIsExisting("itemAttachOffset"))
9068 {
9069 return ConfigGetFloat("itemAttachOffset");
9070 }
9071 return 0;
9072 }
9073
9074 override void SetCleanness(
int value,
bool allow_client =
false)
9075 {
9076 if (!IsServerCheck(allow_client))
9077 return;
9078
9080
9082
9085 }
9086
9088 {
9090 }
9091
9093 {
9094 return true;
9095 }
9096
9097
9098
9099
9101 {
9103 }
9104
9106 {
9108 }
9109
9110
9111
9112
9113 override void SetColor(
int r,
int g,
int b,
int a)
9114 {
9120 }
9122 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9123 {
9128 }
9129
9131 {
9133 }
9134
9137 {
9138 int r,g,b,a;
9140 r = r/255;
9141 g = g/255;
9142 b = b/255;
9143 a = a/255;
9144 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9145 }
9146
9147
9148
9149 override void SetLiquidType(
int value,
bool allow_client =
false)
9150 {
9151 if (!IsServerCheck(allow_client))
9152 return;
9153
9158 }
9159
9161 {
9162 return ConfigGetInt("varLiquidTypeInit");
9163 }
9164
9166 {
9168 }
9169
9171 {
9173 SetFrozen(false);
9174 }
9175
9178 {
9179 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9180 }
9181
9182
9185 {
9186 PlayerBase nplayer;
9187 if (PlayerBase.CastTo(nplayer, player))
9188 {
9190
9191 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9192 }
9193 }
9194
9195
9198 {
9199 PlayerBase nplayer;
9200 if (PlayerBase.CastTo(nplayer,player))
9201 {
9202
9203 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9204
9205 }
9206
9207
9208 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9209
9210
9211 if (HasEnergyManager())
9212 {
9213 GetCompEM().UpdatePlugState();
9214 }
9215 }
9216
9217
9219 {
9220 super.OnPlacementStarted(player);
9221
9223 }
9224
9225 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9226 {
9228 {
9229 m_AdminLog.OnPlacementComplete(player,
this);
9230 }
9231
9232 super.OnPlacementComplete(player, position, orientation);
9233 }
9234
9235
9236
9237
9238
9240 {
9242 {
9243 return true;
9244 }
9245 else
9246 {
9247 return false;
9248 }
9249 }
9250
9251
9253 {
9255 {
9257 }
9258 }
9259
9260
9262 {
9264 }
9265
9267 {
9269 }
9270
9271 override void InsertAgent(
int agent,
float count = 1)
9272 {
9273 if (count < 1)
9274 return;
9275
9277 }
9278
9281 {
9283 }
9284
9285
9287 {
9289 }
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9333 {
9335 return false;
9336 return true;
9337 }
9338
9340 {
9341
9343 }
9344
9345
9348 {
9349 super.CheckForRoofLimited(timeTresholdMS);
9350
9352 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9353 {
9354 m_PreviousRoofTestTime = time;
9355 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9356 }
9357 }
9358
9359
9361 {
9363 {
9364 return 0;
9365 }
9366
9367 if (GetInventory().GetAttachmentSlotsCount() != 0)
9368 {
9369 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9370 if (filter)
9371 return filter.GetProtectionLevel(type, false, system);
9372 else
9373 return 0;
9374 }
9375
9376 string subclassPath, entryName;
9377
9378 switch (type)
9379 {
9381 entryName = "biological";
9382 break;
9384 entryName = "chemical";
9385 break;
9386 default:
9387 entryName = "biological";
9388 break;
9389 }
9390
9391 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9392
9394 }
9395
9396
9397
9400 {
9401 if (!IsMagazine())
9403
9405 }
9406
9407
9408
9409
9410
9415 {
9416 return true;
9417 }
9418
9420 {
9422 }
9423
9424
9425
9426
9427
9429 {
9430 if (parent)
9431 {
9432 if (parent.IsInherited(DayZInfected))
9433 return true;
9434
9435 if (!parent.IsRuined())
9436 return true;
9437 }
9438
9439 return true;
9440 }
9441
9443 {
9444 if (!super.CanPutAsAttachment(parent))
9445 {
9446 return false;
9447 }
9448
9449 if (!IsRuined() && !parent.IsRuined())
9450 {
9451 return true;
9452 }
9453
9454 return false;
9455 }
9456
9458 {
9459
9460
9461
9462
9463 return super.CanReceiveItemIntoCargo(item);
9464 }
9465
9467 {
9468
9469
9470
9471
9472 GameInventory attachmentInv = attachment.GetInventory();
9474 {
9475 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9476 return false;
9477 }
9478
9479 InventoryLocation loc = new InventoryLocation();
9480 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9481 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9482 return false;
9483
9484 return super.CanReceiveAttachment(attachment, slotId);
9485 }
9486
9488 {
9489 if (!super.CanReleaseAttachment(attachment))
9490 return false;
9491
9492 return GetInventory().AreChildrenAccessible();
9493 }
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9516 {
9517 int id = muzzle_owner.GetMuzzleID();
9518 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9519
9520 if (WPOF_array)
9521 {
9522 for (int i = 0; i < WPOF_array.Count(); i++)
9523 {
9524 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9525
9526 if (WPOF)
9527 {
9528 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9529 }
9530 }
9531 }
9532 }
9533
9534
9536 {
9537 int id = muzzle_owner.GetMuzzleID();
9539
9540 if (WPOBE_array)
9541 {
9542 for (int i = 0; i < WPOBE_array.Count(); i++)
9543 {
9544 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9545
9546 if (WPOBE)
9547 {
9548 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9549 }
9550 }
9551 }
9552 }
9553
9554
9556 {
9557 int id = muzzle_owner.GetMuzzleID();
9558 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9559
9560 if (WPOOH_array)
9561 {
9562 for (int i = 0; i < WPOOH_array.Count(); i++)
9563 {
9564 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9565
9566 if (WPOOH)
9567 {
9568 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9569 }
9570 }
9571 }
9572 }
9573
9574
9576 {
9577 int id = muzzle_owner.GetMuzzleID();
9578 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9579
9580 if (WPOOH_array)
9581 {
9582 for (int i = 0; i < WPOOH_array.Count(); i++)
9583 {
9584 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9585
9586 if (WPOOH)
9587 {
9588 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9589 }
9590 }
9591 }
9592 }
9593
9594
9596 {
9597 int id = muzzle_owner.GetMuzzleID();
9598 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9599
9600 if (WPOOH_array)
9601 {
9602 for (int i = 0; i < WPOOH_array.Count(); i++)
9603 {
9604 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9605
9606 if (WPOOH)
9607 {
9608 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9609 }
9610 }
9611 }
9612 }
9613
9614
9615
9617 {
9619 {
9620 return true;
9621 }
9622
9623 return false;
9624 }
9625
9627 {
9629 {
9630 return true;
9631 }
9632
9633 return false;
9634 }
9635
9637 {
9639 {
9640 return true;
9641 }
9642
9643 return false;
9644 }
9645
9647 {
9648 return false;
9649 }
9650
9653 {
9654 return UATimeSpent.DEFAULT_DEPLOY;
9655 }
9656
9657
9658
9659
9661 {
9663 SetSynchDirty();
9664 }
9665
9667 {
9669 }
9670
9671
9673 {
9674 return false;
9675 }
9676
9679 {
9680 string att_type = "None";
9681
9682 if (ConfigIsExisting("soundAttType"))
9683 {
9684 att_type = ConfigGetString("soundAttType");
9685 }
9686
9688 }
9689
9691 {
9693 }
9694
9695
9696
9697
9698
9702
9704 {
9707
9709 }
9710
9711
9713 {
9715 return;
9716
9718
9721
9724
9725 SoundParameters params = new SoundParameters();
9729 }
9730
9731
9733 {
9735 return;
9736
9738 SetSynchDirty();
9739
9742 }
9743
9744
9746 {
9748 return;
9749
9751 SetSynchDirty();
9752
9755 }
9756
9758 {
9760 }
9761
9763 {
9765 }
9766
9769 {
9770 if (!
GetGame().IsDedicatedServer())
9771 {
9772 if (ConfigIsExisting("attachSoundSet"))
9773 {
9774 string cfg_path = "";
9775 string soundset = "";
9777
9780 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9781 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9782
9783 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9784 {
9785 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9786 {
9787 if (cfg_slot_array[i] == slot_type)
9788 {
9789 soundset = cfg_soundset_array[i];
9790 break;
9791 }
9792 }
9793 }
9794
9795 if (soundset != "")
9796 {
9797 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9799 }
9800 }
9801 }
9802 }
9803
9805 {
9806
9807 }
9808
9809 void OnApply(PlayerBase player);
9810
9812 {
9813 return 1.0;
9814 };
9815
9817 {
9819 }
9820
9822 {
9824 }
9825
9827
9829 {
9830 SetDynamicPhysicsLifeTime(0.01);
9832 }
9833
9835 {
9836 array<string> zone_names = new array<string>;
9837 GetDamageZones(zone_names);
9838 for (int i = 0; i < zone_names.Count(); i++)
9839 {
9840 SetHealthMax(zone_names.Get(i),"Health");
9841 }
9842 SetHealthMax("","Health");
9843 }
9844
9847 {
9848 float global_health = GetHealth01("","Health");
9849 array<string> zones = new array<string>;
9850 GetDamageZones(zones);
9851
9852 for (int i = 0; i < zones.Count(); i++)
9853 {
9854 SetHealth01(zones.Get(i),"Health",global_health);
9855 }
9856 }
9857
9860 {
9861 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9862 }
9863
9865 {
9866 if (!hasRootAsPlayer)
9867 {
9868 if (refParentIB)
9869 {
9870
9871 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9872 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9873
9874 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9875 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9876
9879 }
9880 else
9881 {
9882
9885 }
9886 }
9887 }
9888
9890 {
9892 {
9893 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9894 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9895 {
9896 float heatPermCoef = 1.0;
9898 while (ent)
9899 {
9900 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9901 ent = ent.GetHierarchyParent();
9902 }
9903
9904 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9905 }
9906 }
9907 }
9908
9910 {
9911
9912 EntityAI parent = GetHierarchyParent();
9913 if (!parent)
9914 {
9915 hasParent = false;
9916 hasRootAsPlayer = false;
9917 }
9918 else
9919 {
9920 hasParent = true;
9921 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9922 refParentIB =
ItemBase.Cast(parent);
9923 }
9924 }
9925
9926 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9927 {
9928
9929 }
9930
9932 {
9933
9934 return false;
9935 }
9936
9938 {
9939
9940
9941 return false;
9942 }
9943
9945 {
9946
9947 return false;
9948 }
9949
9952 {
9953 return !GetIsFrozen() &&
IsOpen();
9954 }
9955
9957 {
9958 bool hasParent = false, hasRootAsPlayer = false;
9960
9961 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9962 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9963
9964 if (wwtu || foodDecay)
9965 {
9969
9970 if (processWetness || processTemperature || processDecay)
9971 {
9973
9974 if (processWetness)
9975 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9976
9977 if (processTemperature)
9979
9980 if (processDecay)
9981 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9982 }
9983 }
9984 }
9985
9988 {
9990 }
9991
9993 {
9996
9997 return super.GetTemperatureFreezeThreshold();
9998 }
9999
10001 {
10004
10005 return super.GetTemperatureThawThreshold();
10006 }
10007
10009 {
10012
10013 return super.GetItemOverheatThreshold();
10014 }
10015
10017 {
10019 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10020
10021 return super.GetTemperatureFreezeTime();
10022 }
10023
10025 {
10027 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10028
10029 return super.GetTemperatureThawTime();
10030 }
10031
10036
10038 {
10039 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10040 }
10041
10043 {
10044 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10045 }
10046
10049 {
10051 }
10052
10054 {
10056 }
10057
10059 {
10061 }
10062
10065 {
10066 return null;
10067 }
10068
10071 {
10072 return false;
10073 }
10074
10076 {
10078 {
10081 if (!trg)
10082 {
10084 explosive = this;
10085 }
10086
10087 explosive.PairRemote(trg);
10089
10090 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10091 trg.SetPersistentPairID(persistentID);
10092 explosive.SetPersistentPairID(persistentID);
10093
10094 return true;
10095 }
10096 return false;
10097 }
10098
10101 {
10102 float ret = 1.0;
10105 ret *= GetHealth01();
10106
10107 return ret;
10108 }
10109
10110 #ifdef DEVELOPER
10111 override void SetDebugItem()
10112 {
10113 super.SetDebugItem();
10114 _itemBase = this;
10115 }
10116
10118 {
10119 string text = super.GetDebugText();
10120
10122 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10123
10124 return text;
10125 }
10126 #endif
10127
10129 {
10130 return true;
10131 }
10132
10134
10136
10138 {
10141 }
10142
10143
10151
10167}
10168
10170{
10172 if (entity)
10173 {
10174 bool is_item = entity.IsInherited(
ItemBase);
10175 if (is_item && full_quantity)
10176 {
10179 }
10180 }
10181 else
10182 {
10184 return NULL;
10185 }
10186 return entity;
10187}
10188
10190{
10191 if (item)
10192 {
10193 if (health > 0)
10194 item.SetHealth("", "", health);
10195
10196 if (item.CanHaveTemperature())
10197 {
10199 if (item.CanFreeze())
10200 item.SetFrozen(false);
10201 }
10202
10203 if (item.HasEnergyManager())
10204 {
10205 if (quantity >= 0)
10206 {
10207 item.GetCompEM().SetEnergy0To1(quantity);
10208 }
10209 else
10210 {
10212 }
10213 }
10214 else if (item.IsMagazine())
10215 {
10216 Magazine mag = Magazine.Cast(item);
10217 if (quantity >= 0)
10218 {
10219 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10220 }
10221 else
10222 {
10224 }
10225
10226 }
10227 else
10228 {
10229 if (quantity >= 0)
10230 {
10231 item.SetQuantityNormalized(quantity, false);
10232 }
10233 else
10234 {
10236 }
10237
10238 }
10239 }
10240}
10241
10242#ifdef DEVELOPER
10244#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.