5371{
5373 {
5374 return true;
5375 }
5376};
5377
5378
5379
5381{
5385
5387
5390
5391
5392
5393
5394
5403
5409
5414
5419
5440 protected bool m_IsResultOfSplit
5441
5443
5448
5449
5450
5452
5456
5457
5458
5460
5463
5464
5465
5471
5472
5480
5483
5484
5486
5487
5489
5490
5495
5496
5501
5502
5504
5505
5507 {
5512
5513 if (!
GetGame().IsDedicatedServer())
5514 {
5516 {
5518
5520 {
5522 }
5523 }
5524
5527 }
5528
5529 m_OldLocation = null;
5530
5532 {
5534 }
5535
5536 if (ConfigIsExisting("headSelectionsToHide"))
5537 {
5540 }
5541
5543 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5544 {
5546 }
5547
5549
5550 m_IsResultOfSplit = false;
5551
5553 }
5554
5556 {
5557 super.InitItemVariables();
5558
5564 m_Count = ConfigGetInt(
"count");
5565
5568
5573
5576
5581
5593
5597
5598
5601 if (ConfigIsExisting("canBeSplit"))
5602 {
5605 }
5606
5608 if (ConfigIsExisting("itemBehaviour"))
5610
5611
5614 RegisterNetSyncVariableInt("m_VarLiquidType");
5615 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5616
5617 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5618 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5619 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5620
5621 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5622 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5623 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5624 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5625
5626 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5627 RegisterNetSyncVariableBool("m_IsTakeable");
5628 RegisterNetSyncVariableBool("m_IsHologram");
5629
5632 {
5635 }
5636
5638
5640 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5642
5643 }
5644
5646 {
5648 }
5649
5651 {
5654 {
5659 }
5660 }
5661
5662 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5663 {
5665 {
5668 }
5669
5671 }
5672
5674 {
5680 }
5681
5683
5685 {
5687
5688 if (!action)
5689 {
5690 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5691 return;
5692 }
5693
5695 if (!ai)
5696 {
5698 return;
5699 }
5700
5702 if (!action_array)
5703 {
5704 action_array = new array<ActionBase_Basic>;
5706 }
5707 if (LogManager.IsActionLogEnable())
5708 {
5709 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5710 }
5711
5712 if (action_array.Find(action) != -1)
5713 {
5714 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5715 }
5716 else
5717 {
5718 action_array.Insert(action);
5719 }
5720 }
5721
5723 {
5725 ActionBase action = player.GetActionManager().GetAction(actionName);
5728
5729 if (action_array)
5730 {
5731 action_array.RemoveItem(action);
5732 }
5733 }
5734
5735
5736
5738 {
5739 ActionOverrideData overrideData = new ActionOverrideData();
5743
5745 if (!actionMap)
5746 {
5749 }
5750
5751 actionMap.Insert(this.
Type(), overrideData);
5752
5753 }
5754
5756
5758
5759
5761 {
5764
5767
5768 string config_to_search = "CfgVehicles";
5769 string muzzle_owner_config;
5770
5772 {
5773 if (IsInherited(Weapon))
5774 config_to_search = "CfgWeapons";
5775
5776 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5777
5778 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5779
5781
5782 if (config_OnFire_subclass_count > 0)
5783 {
5784 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5785
5786 for (int i = 0; i < config_OnFire_subclass_count; i++)
5787 {
5788 string particle_class = "";
5790 string config_OnFire_entry = config_OnFire_class + particle_class;
5791 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5792 WPOF_array.Insert(WPOF);
5793 }
5794
5795
5797 }
5798 }
5799
5801 {
5802 config_to_search = "CfgWeapons";
5803 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5804
5805 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5806
5808
5809 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5810 {
5811 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5812
5813 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5814 {
5815 string particle_class2 = "";
5817 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5818 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5819 WPOBE_array.Insert(WPOBE);
5820 }
5821
5822
5824 }
5825 }
5826 }
5827
5828
5830 {
5833
5835 {
5836 string config_to_search = "CfgVehicles";
5837
5838 if (IsInherited(Weapon))
5839 config_to_search = "CfgWeapons";
5840
5841 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5842 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5843
5844 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5845 {
5846
5848
5850 {
5852 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5854 return;
5855 }
5856
5859
5860
5861
5863 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5864
5865 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5866 {
5867 string particle_class = "";
5869 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5871
5872 if (entry_type == CT_CLASS)
5873 {
5874 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5875 WPOOH_array.Insert(WPOF);
5876 }
5877 }
5878
5879
5881 }
5882 }
5883 }
5884
5886 {
5888 }
5889
5891 {
5893 {
5895
5898
5901
5902 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5903 }
5904 }
5905
5907 {
5909 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5910
5912 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5913
5915 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5916
5918 {
5920 }
5921 }
5922
5924 {
5926 }
5927
5929 {
5932 else
5934
5936 {
5939 }
5940 else
5941 {
5944
5947 }
5948
5950 }
5951
5953 {
5955 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5956 }
5957
5959 {
5961 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5963 }
5964
5966 {
5968 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5969 }
5970
5972 {
5975
5976 OverheatingParticle OP = new OverheatingParticle();
5981
5983 }
5984
5986 {
5989
5990 return -1;
5991 }
5992
5994 {
5996 {
5999
6000 for (int i = count; i > 0; --i)
6001 {
6002 int id = i - 1;
6005
6008
6009 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6010 {
6011 if (p)
6012 {
6015 }
6016 }
6017 }
6018 }
6019 }
6020
6022 {
6024 {
6026 {
6027 int id = i - 1;
6029
6030 if (OP)
6031 {
6033
6034 if (p)
6035 {
6037 }
6038
6039 delete OP;
6040 }
6041 }
6042
6045 }
6046 }
6047
6050 {
6051 return 0.0;
6052 }
6053
6054
6056 {
6057 return 250;
6058 }
6059
6061 {
6062 return 0;
6063 }
6064
6067 {
6069 return true;
6070
6071 return false;
6072 }
6073
6076 {
6079
6081 {
6083 }
6084 else
6085 {
6086
6088 }
6089
6091 }
6092
6099 {
6100 return -1;
6101 }
6102
6103
6104
6105
6107 {
6109 {
6111 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6112
6113 if (r_index >= 0)
6114 {
6115 InventoryLocation r_il = new InventoryLocation;
6116 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6117
6118 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6121 {
6122 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6123 }
6125 {
6126 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6127 }
6128
6129 }
6130
6131 player.GetHumanInventory().ClearUserReservedLocation(this);
6132 }
6133
6136 }
6137
6138
6139
6140
6142 {
6143 return ItemBase.m_DebugActionsMask;
6144 }
6145
6147 {
6148 return ItemBase.m_DebugActionsMask & mask;
6149 }
6150
6152 {
6153 ItemBase.m_DebugActionsMask = mask;
6154 }
6155
6157 {
6158 ItemBase.m_DebugActionsMask |= mask;
6159 }
6160
6162 {
6163 ItemBase.m_DebugActionsMask &= ~mask;
6164 }
6165
6167 {
6169 {
6171 }
6172 else
6173 {
6175 }
6176 }
6177
6178
6180 {
6181 if (GetEconomyProfile())
6182 {
6183 float q_max = GetEconomyProfile().GetQuantityMax();
6184 if (q_max > 0)
6185 {
6186 float q_min = GetEconomyProfile().GetQuantityMin();
6187 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6188
6190 {
6191 ComponentEnergyManager comp = GetCompEM();
6193 {
6195 }
6196 }
6198 {
6200
6201 }
6202
6203 }
6204 }
6205 }
6206
6209 {
6210 EntityAI parent = GetHierarchyParent();
6211
6212 if (parent)
6213 {
6214 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6215 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6216 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6217 }
6218 }
6219
6222 {
6223 EntityAI parent = GetHierarchyParent();
6224
6225 if (parent)
6226 {
6227 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6228 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6229 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6230 }
6231 }
6232
6234 {
6235
6236
6237
6238
6240
6242 {
6243 if (ScriptInputUserData.CanStoreInputUserData())
6244 {
6245 ScriptInputUserData ctx = new ScriptInputUserData;
6251 ctx.
Write(use_stack_max);
6254
6256 {
6257 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6258 }
6259 }
6260 }
6261 else if (!
GetGame().IsMultiplayer())
6262 {
6264 }
6265 }
6266
6268 {
6270 }
6271
6273 {
6275 }
6276
6278 {
6280 }
6281
6283 {
6284
6285 return false;
6286 }
6287
6289 {
6290 return false;
6291 }
6292
6296 {
6297 return false;
6298 }
6299
6301 {
6302 return "";
6303 }
6304
6306
6308 {
6309 return false;
6310 }
6311
6313 {
6314 return true;
6315 }
6316
6317
6318
6320 {
6321 return true;
6322 }
6323
6325 {
6326 return true;
6327 }
6328
6330 {
6331 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6333 }
6334
6336 {
6338 }
6339
6341 {
6343 if (!is_being_placed)
6345 SetSynchDirty();
6346 }
6347
6348
6350
6352 {
6354 }
6355
6357 {
6359 }
6360
6362 {
6363 return 1;
6364 }
6365
6367 {
6368 return false;
6369 }
6370
6372 {
6374 SetSynchDirty();
6375 }
6376
6377
6378
6379
6380
6381
6382
6383
6384
6385
6386
6387
6388
6389
6390
6391
6392
6393
6394
6395
6396
6397
6398
6399
6400
6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6412 {
6413 super.OnMovedInsideCargo(container);
6414
6415 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6416 }
6417
6418 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6419 {
6420 super.EEItemLocationChanged(oldLoc,newLoc);
6421
6422 PlayerBase new_player = null;
6423 PlayerBase old_player = null;
6424
6425 if (newLoc.GetParent())
6426 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6427
6428 if (oldLoc.GetParent())
6429 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6430
6432 {
6433 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6434
6435 if (r_index >= 0)
6436 {
6437 InventoryLocation r_il = new InventoryLocation;
6438 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6439
6440 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6443 {
6444 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6445 }
6447 {
6448 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6449 }
6450
6451 }
6452 }
6453
6455 {
6456 if (new_player)
6457 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6458
6459 if (new_player == old_player)
6460 {
6461
6462 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6463 {
6465 {
6466 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6467 {
6468 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6469 }
6470 }
6471 else
6472 {
6473 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6474 }
6475 }
6476
6477 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6478 {
6479 int type = oldLoc.GetType();
6481 {
6482 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6483 }
6485 {
6486 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6487 }
6488 }
6489 if (!m_OldLocation)
6490 {
6491 m_OldLocation = new InventoryLocation;
6492 }
6493 m_OldLocation.Copy(oldLoc);
6494 }
6495 else
6496 {
6497 if (m_OldLocation)
6498 {
6499 m_OldLocation.Reset();
6500 }
6501 }
6502
6504 }
6505 else
6506 {
6507 if (new_player)
6508 {
6509 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6510 if (res_index >= 0)
6511 {
6512 InventoryLocation il = new InventoryLocation;
6513 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6515 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6518 {
6519 il.
GetParent().GetOnReleaseLock().Invoke(it);
6520 }
6522 {
6524 }
6525
6526 }
6527 }
6529 {
6530
6532 }
6533
6534 if (m_OldLocation)
6535 {
6536 m_OldLocation.Reset();
6537 }
6538 }
6539 }
6540
6541 override void EOnContact(IEntity other, Contact extra)
6542 {
6544 {
6545 int liquidType = -1;
6547 if (impactSpeed > 0.0)
6548 {
6550 #ifndef SERVER
6552 #else
6554 SetSynchDirty();
6555 #endif
6557 }
6558 }
6559
6560 #ifdef SERVER
6561 if (GetCompEM() && GetCompEM().IsPlugged())
6562 {
6563 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6564 GetCompEM().UnplugThis();
6565 }
6566 #endif
6567 }
6568
6570
6572 {
6574 }
6575
6577 {
6578
6579 }
6580
6582 {
6583 super.OnItemLocationChanged(old_owner, new_owner);
6584
6585 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6586 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6587
6588 if (!relatedPlayer && playerNew)
6589 relatedPlayer = playerNew;
6590
6591 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6592 {
6594 if (actionMgr)
6595 {
6596 ActionBase currentAction = actionMgr.GetRunningAction();
6597 if (currentAction)
6599 }
6600 }
6601
6602 Man ownerPlayerOld = null;
6603 Man ownerPlayerNew = null;
6604
6605 if (old_owner)
6606 {
6607 if (old_owner.
IsMan())
6608 {
6609 ownerPlayerOld = Man.Cast(old_owner);
6610 }
6611 else
6612 {
6613 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6614 }
6615 }
6616 else
6617 {
6619 {
6621
6622 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6623 {
6624 GetCompEM().UnplugThis();
6625 }
6626 }
6627 }
6628
6629 if (new_owner)
6630 {
6631 if (new_owner.
IsMan())
6632 {
6633 ownerPlayerNew = Man.Cast(new_owner);
6634 }
6635 else
6636 {
6637 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6638 }
6639 }
6640
6641 if (ownerPlayerOld != ownerPlayerNew)
6642 {
6643 if (ownerPlayerOld)
6644 {
6645 array<EntityAI> subItemsExit = new array<EntityAI>;
6647 for (int i = 0; i < subItemsExit.Count(); i++)
6648 {
6651 }
6652 }
6653
6654 if (ownerPlayerNew)
6655 {
6656 array<EntityAI> subItemsEnter = new array<EntityAI>;
6658 for (int j = 0; j < subItemsEnter.Count(); j++)
6659 {
6662 }
6663 }
6664 }
6665 else if (ownerPlayerNew != null)
6666 {
6667 PlayerBase nplayer;
6668 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6669 {
6670 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6672 for (int k = 0; k < subItemsUpdate.Count(); k++)
6673 {
6675 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6676 }
6677 }
6678 }
6679
6680 if (old_owner)
6681 old_owner.OnChildItemRemoved(this);
6682 if (new_owner)
6683 new_owner.OnChildItemReceived(this);
6684 }
6685
6686
6688 {
6689 super.EEDelete(parent);
6690 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6691 if (player)
6692 {
6694
6695 if (player.IsAlive())
6696 {
6697 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6698 if (r_index >= 0)
6699 {
6700 InventoryLocation r_il = new InventoryLocation;
6701 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6702
6703 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6706 {
6707 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6708 }
6710 {
6711 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6712 }
6713
6714 }
6715
6716 player.RemoveQuickBarEntityShortcut(this);
6717 }
6718 }
6719 }
6720
6722 {
6723 super.EEKilled(killer);
6724
6727 {
6728 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6729 {
6730 if (IsMagazine())
6731 {
6732 if (Magazine.Cast(this).GetAmmoCount() > 0)
6733 {
6735 }
6736 }
6737 else
6738 {
6740 }
6741 }
6742 }
6743 }
6744
6746 {
6747 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6748
6749 super.OnWasAttached(parent, slot_id);
6750
6753
6755 }
6756
6758 {
6759 super.OnWasDetached(parent, slot_id);
6760
6763 }
6764
6766 {
6767 int idx;
6770
6771 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6772 if (inventory_slots.Count() < 1)
6773 {
6774 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6775 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6776 }
6777 else
6778 {
6779 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6780 }
6781
6782 idx = inventory_slots.Find(slot);
6783 if (idx < 0)
6784 return "";
6785
6786 return attach_types.Get(idx);
6787 }
6788
6790 {
6791 int idx = -1;
6792 string slot;
6793
6796
6797 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6798 if (inventory_slots.Count() < 1)
6799 {
6800 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6801 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6802 }
6803 else
6804 {
6805 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6806 if (detach_types.Count() < 1)
6807 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6808 }
6809
6810 for (int i = 0; i < inventory_slots.Count(); i++)
6811 {
6812 slot = inventory_slots.Get(i);
6813 }
6814
6815 if (slot != "")
6816 {
6817 if (detach_types.Count() == 1)
6818 idx = 0;
6819 else
6820 idx = inventory_slots.Find(slot);
6821 }
6822 if (idx < 0)
6823 return "";
6824
6825 return detach_types.Get(idx);
6826 }
6827
6829 {
6830
6832
6833
6834 float min_time = 1;
6835 float max_time = 3;
6836 float delay = Math.RandomFloat(min_time, max_time);
6837
6838 explode_timer.Run(delay, this, "DoAmmoExplosion");
6839 }
6840
6842 {
6843 Magazine magazine = Magazine.Cast(this);
6844 int pop_sounds_count = 6;
6845 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6846
6847
6848 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6849 string sound_name = pop_sounds[ sound_idx ];
6851
6852
6853 magazine.ServerAddAmmoCount(-1);
6854
6855
6856 float min_temp_to_explode = 100;
6857
6858 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6859 {
6861 }
6862 }
6863
6864
6865 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6866 {
6867 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6868
6869 const int CHANCE_DAMAGE_CARGO = 4;
6870 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6871 const int CHANCE_DAMAGE_NOTHING = 2;
6872
6874 {
6875 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6876 int chances;
6877 int rnd;
6878
6879 if (GetInventory().GetCargo())
6880 {
6881 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6882 rnd = Math.RandomInt(0,chances);
6883
6884 if (rnd < CHANCE_DAMAGE_CARGO)
6885 {
6887 }
6888 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6889 {
6891 }
6892 }
6893 else
6894 {
6895 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6896 rnd = Math.RandomInt(0,chances);
6897
6898 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6899 {
6901 }
6902 }
6903 }
6904 }
6905
6907 {
6908 if (GetInventory().GetCargo())
6909 {
6910 int item_count = GetInventory().GetCargo().GetItemCount();
6911 if (item_count > 0)
6912 {
6913 int random_pick = Math.RandomInt(0, item_count);
6915 if (!item.IsExplosive())
6916 {
6917 item.AddHealth("","",damage);
6918 return true;
6919 }
6920 }
6921 }
6922 return false;
6923 }
6924
6926 {
6927 int attachment_count = GetInventory().AttachmentCount();
6928 if (attachment_count > 0)
6929 {
6930 int random_pick = Math.RandomInt(0, attachment_count);
6931 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6932 if (!attachment.IsExplosive())
6933 {
6934 attachment.AddHealth("","",damage);
6935 return true;
6936 }
6937 }
6938 return false;
6939 }
6940
6942 {
6944 }
6945
6947 {
6949 return GetInventory().CanRemoveEntity();
6950
6951 return false;
6952 }
6953
6955 {
6957 return;
6958
6960 {
6961 if (ScriptInputUserData.CanStoreInputUserData())
6962 {
6963 ScriptInputUserData ctx = new ScriptInputUserData;
6968 ctx.
Write(destination_entity);
6972 }
6973 }
6974 else if (!
GetGame().IsMultiplayer())
6975 {
6977 }
6978 }
6979
6981 {
6983 return;
6984
6985 float split_quantity_new;
6989 InventoryLocation loc = new InventoryLocation;
6990
6991 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6992 {
6994 split_quantity_new = stack_max;
6995 else
6997
6998 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6999 if (new_item)
7000 {
7001 new_item.SetResultOfSplit(true);
7002 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7004 new_item.SetQuantity(split_quantity_new);
7005 }
7006 }
7007 else if (destination_entity && slot_id == -1)
7008 {
7009 if (quantity > stack_max)
7010 split_quantity_new = stack_max;
7011 else
7012 split_quantity_new = quantity;
7013
7015 {
7018 }
7019
7020 if (new_item)
7021 {
7022 new_item.SetResultOfSplit(true);
7023 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7025 new_item.SetQuantity(split_quantity_new);
7026 }
7027 }
7028 else
7029 {
7030 if (stack_max != 0)
7031 {
7033 {
7035 }
7036
7037 if (split_quantity_new == 0)
7038 {
7039 if (!
GetGame().IsMultiplayer())
7040 player.PhysicalPredictiveDropItem(this);
7041 else
7042 player.ServerDropEntity(this);
7043 return;
7044 }
7045
7047
7048 if (new_item)
7049 {
7050 new_item.SetResultOfSplit(true);
7051 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7053 new_item.SetQuantity(stack_max);
7054 new_item.PlaceOnSurface();
7055 }
7056 }
7057 }
7058 }
7059
7061 {
7063 return;
7064
7065 float split_quantity_new;
7069 InventoryLocation loc = new InventoryLocation;
7070
7071 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7072 {
7074 split_quantity_new = stack_max;
7075 else
7077
7078 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7079 if (new_item)
7080 {
7081 new_item.SetResultOfSplit(true);
7082 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7084 new_item.SetQuantity(split_quantity_new);
7085 }
7086 }
7087 else if (destination_entity && slot_id == -1)
7088 {
7089 if (quantity > stack_max)
7090 split_quantity_new = stack_max;
7091 else
7092 split_quantity_new = quantity;
7093
7095 {
7098 }
7099
7100 if (new_item)
7101 {
7102 new_item.SetResultOfSplit(true);
7103 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7105 new_item.SetQuantity(split_quantity_new);
7106 }
7107 }
7108 else
7109 {
7110 if (stack_max != 0)
7111 {
7113 {
7115 }
7116
7118
7119 if (new_item)
7120 {
7121 new_item.SetResultOfSplit(true);
7122 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7124 new_item.SetQuantity(stack_max);
7125 new_item.PlaceOnSurface();
7126 }
7127 }
7128 }
7129 }
7130
7132 {
7134 return;
7135
7137 {
7138 if (ScriptInputUserData.CanStoreInputUserData())
7139 {
7140 ScriptInputUserData ctx = new ScriptInputUserData;
7145 dst.WriteToContext(ctx);
7147 }
7148 }
7149 else if (!
GetGame().IsMultiplayer())
7150 {
7152 }
7153 }
7154
7156 {
7158 return;
7159
7161 {
7162 if (ScriptInputUserData.CanStoreInputUserData())
7163 {
7164 ScriptInputUserData ctx = new ScriptInputUserData;
7169 ctx.
Write(destination_entity);
7175 }
7176 }
7177 else if (!
GetGame().IsMultiplayer())
7178 {
7180 }
7181 }
7182
7184 {
7186 }
7187
7189 {
7191 return this;
7192
7194 float split_quantity_new;
7196 if (dst.IsValid())
7197 {
7198 int slot_id = dst.GetSlot();
7200
7201 if (quantity > stack_max)
7202 split_quantity_new = stack_max;
7203 else
7204 split_quantity_new = quantity;
7205
7207
7208 if (new_item)
7209 {
7210 new_item.SetResultOfSplit(true);
7211 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7214 }
7215
7216 return new_item;
7217 }
7218
7219 return null;
7220 }
7221
7223 {
7225 return;
7226
7228 float split_quantity_new;
7230 if (destination_entity)
7231 {
7233 if (quantity > stackable)
7234 split_quantity_new = stackable;
7235 else
7236 split_quantity_new = quantity;
7237
7238 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7239 if (new_item)
7240 {
7241 new_item.SetResultOfSplit(true);
7242 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7244 new_item.SetQuantity(split_quantity_new);
7245 }
7246 }
7247 }
7248
7250 {
7252 return;
7253
7255 {
7256 if (ScriptInputUserData.CanStoreInputUserData())
7257 {
7258 ScriptInputUserData ctx = new ScriptInputUserData;
7263 ItemBase destination_entity =
this;
7264 ctx.
Write(destination_entity);
7268 }
7269 }
7270 else if (!
GetGame().IsMultiplayer())
7271 {
7273 }
7274 }
7275
7277 {
7279 return;
7280
7282 float split_quantity_new;
7284 if (player)
7285 {
7287 if (quantity > stackable)
7288 split_quantity_new = stackable;
7289 else
7290 split_quantity_new = quantity;
7291
7292 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7293 new_item =
ItemBase.Cast(in_hands);
7294 if (new_item)
7295 {
7296 new_item.SetResultOfSplit(true);
7297 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7299 new_item.SetQuantity(split_quantity_new);
7300 }
7301 }
7302 }
7303
7305 {
7307 return;
7308
7310 float split_quantity_new = Math.Floor(quantity * 0.5);
7311
7313
7314 if (new_item)
7315 {
7316 if (new_item.GetQuantityMax() < split_quantity_new)
7317 {
7318 split_quantity_new = new_item.GetQuantityMax();
7319 }
7320
7321 new_item.SetResultOfSplit(true);
7322 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7323
7325 {
7328 }
7329 else
7330 {
7333 }
7334 }
7335 }
7336
7338 {
7340 return;
7341
7343 float split_quantity_new = Math.Floor(quantity / 2);
7344
7345 InventoryLocation invloc = new InventoryLocation;
7347
7349 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7350
7351 if (new_item)
7352 {
7353 if (new_item.GetQuantityMax() < split_quantity_new)
7354 {
7355 split_quantity_new = new_item.GetQuantityMax();
7356 }
7358 {
7361 }
7362 else
7363 {
7366 }
7367 }
7368 }
7369
7372 {
7373 SetWeightDirty();
7375
7376 if (parent)
7377 parent.OnAttachmentQuantityChangedEx(this, delta);
7378
7380 {
7382 {
7384 }
7386 {
7387 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7389 }
7390 }
7391
7392 }
7393
7396 {
7397
7398 }
7399
7402 {
7404 }
7405
7407 {
7408 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7409
7411 {
7412 if (newLevel == GameConstants.STATE_RUINED)
7413 {
7415 EntityAI parent = GetHierarchyParent();
7416 if (parent && parent.IsFireplace())
7417 {
7418 CargoBase cargo = GetInventory().GetCargo();
7419 if (cargo)
7420 {
7422 {
7424 }
7425 }
7426 }
7427 }
7428
7430 {
7431
7433 return;
7434 }
7435
7436 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7437 {
7439 }
7440 }
7441 }
7442
7443
7445 {
7446 super.OnRightClick();
7447
7449 {
7451 {
7452 if (ScriptInputUserData.CanStoreInputUserData())
7453 {
7454 vector m4[4];
7456
7457 EntityAI root = GetHierarchyRoot();
7458
7459 InventoryLocation dst = new InventoryLocation;
7461 {
7462 if (root)
7463 {
7464 root.GetTransform(m4);
7466 }
7467 else
7468 GetInventory().GetCurrentInventoryLocation(dst);
7469 }
7470 else
7471 {
7473
7474
7475 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7476 {
7477 if (root)
7478 {
7479 root.GetTransform(m4);
7481 }
7482 else
7483 GetInventory().GetCurrentInventoryLocation(dst);
7484 }
7485 else
7486 {
7487 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7488 }
7489 }
7490
7491 ScriptInputUserData ctx = new ScriptInputUserData;
7499 }
7500 }
7501 else if (!
GetGame().IsMultiplayer())
7502 {
7504 }
7505 }
7506 }
7507
7508 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7509 {
7510
7511 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7512 return false;
7513
7514 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7515 return false;
7516
7517
7519 return false;
7520
7521
7522 Magazine mag = Magazine.Cast(this);
7523 if (mag)
7524 {
7525 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7526 return false;
7527
7528 if (stack_max_limit)
7529 {
7530 Magazine other_mag = Magazine.Cast(other_item);
7531 if (other_item)
7532 {
7533 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7534 return false;
7535 }
7536
7537 }
7538 }
7539 else
7540 {
7541
7543 return false;
7544
7546 return false;
7547 }
7548
7549 PlayerBase player = null;
7550 if (CastTo(player, GetHierarchyRootPlayer()))
7551 {
7552 if (player.GetInventory().HasAttachment(this))
7553 return false;
7554
7555 if (player.IsItemsToDelete())
7556 return false;
7557 }
7558
7559 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7560 return false;
7561
7562 int slotID;
7564 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7565 return false;
7566
7567 return true;
7568 }
7569
7571 {
7573 }
7574
7576 {
7577 return m_IsResultOfSplit;
7578 }
7579
7581 {
7582 m_IsResultOfSplit = value;
7583 }
7584
7586 {
7588 }
7589
7591 {
7592 float other_item_quantity = other_item.GetQuantity();
7593 float this_free_space;
7594
7596
7598
7599 if (other_item_quantity > this_free_space)
7600 {
7601 return this_free_space;
7602 }
7603 else
7604 {
7605 return other_item_quantity;
7606 }
7607 }
7608
7610 {
7612 }
7613
7615 {
7617 return;
7618
7619 if (!IsMagazine() && other_item)
7620 {
7622 if (quantity_used != 0)
7623 {
7624 float hp1 = GetHealth01("","");
7625 float hp2 = other_item.GetHealth01("","");
7626 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7627 hpResult = hpResult / (
GetQuantity() + quantity_used);
7628
7629 hpResult *= GetMaxHealth();
7630 Math.Round(hpResult);
7631 SetHealth("", "Health", hpResult);
7632
7634 other_item.AddQuantity(-quantity_used);
7635 }
7636 }
7638 }
7639
7641 {
7642 #ifdef SERVER
7643 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7644 GetHierarchyParent().IncreaseLifetimeUp();
7645 #endif
7646 };
7647
7649 {
7650 PlayerBase p = PlayerBase.Cast(player);
7651
7652 array<int> recipesIds = p.m_Recipes;
7653 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7654 if (moduleRecipesManager)
7655 {
7656 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7657 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7658 }
7659
7660 for (int i = 0;i < recipesIds.Count(); i++)
7661 {
7662 int key = recipesIds.Get(i);
7663 string recipeName = moduleRecipesManager.GetRecipeName(key);
7665 }
7666 }
7667
7668
7669 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7670 {
7671 super.GetDebugActions(outputList);
7672
7673
7678
7679
7683
7687
7688
7691
7692
7694 {
7697 }
7698
7700
7703
7707 }
7708
7709
7710
7711
7713 {
7714 super.OnAction(action_id, player, ctx);
7715 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7716 {
7717 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7718 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7719 PlayerBase p = PlayerBase.Cast(player);
7720 if (
EActions.RECIPES_RANGE_START < 1000)
7721 {
7722 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7723 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7724 }
7725 }
7726 #ifndef SERVER
7727 else if (action_id ==
EActions.WATCH_PLAYER)
7728 {
7729 PluginDeveloper.SetDeveloperItemClientEx(player);
7730 }
7731 #endif
7733 {
7734 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7735 {
7736 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7737 OnDebugButtonPressServer(id + 1);
7738 }
7739
7740 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7741 {
7742 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7744 }
7745
7746 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7747 {
7748 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7750 }
7751
7752 else if (action_id ==
EActions.ADD_QUANTITY)
7753 {
7754 if (IsMagazine())
7755 {
7756 Magazine mag = Magazine.Cast(this);
7757 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7758 }
7759 else
7760 {
7762 }
7763
7764 if (m_EM)
7765 {
7766 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7767 }
7768
7769 }
7770
7771 else if (action_id ==
EActions.REMOVE_QUANTITY)
7772 {
7773 if (IsMagazine())
7774 {
7775 Magazine mag2 = Magazine.Cast(this);
7776 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7777 }
7778 else
7779 {
7781 }
7782 if (m_EM)
7783 {
7784 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7785 }
7786
7787 }
7788
7789 else if (action_id ==
EActions.SET_QUANTITY_0)
7790 {
7792
7793 if (m_EM)
7794 {
7795 m_EM.SetEnergy(0);
7796 }
7797 }
7798
7799 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7800 {
7802
7803 if (m_EM)
7804 {
7805 m_EM.SetEnergy(m_EM.GetEnergyMax());
7806 }
7807 }
7808
7809 else if (action_id ==
EActions.ADD_HEALTH)
7810 {
7811 AddHealth("","",GetMaxHealth("","Health")/5);
7812 }
7813 else if (action_id ==
EActions.REMOVE_HEALTH)
7814 {
7815 AddHealth("","",-GetMaxHealth("","Health")/5);
7816 }
7817 else if (action_id ==
EActions.DESTROY_HEALTH)
7818 {
7819 SetHealth01("","",0);
7820 }
7821 else if (action_id ==
EActions.WATCH_ITEM)
7822 {
7824 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7825 #ifdef DEVELOPER
7826 SetDebugDeveloper_item(this);
7827 #endif
7828 }
7829
7830 else if (action_id ==
EActions.ADD_TEMPERATURE)
7831 {
7832 AddTemperature(20);
7833
7834 }
7835
7836 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7837 {
7838 AddTemperature(-20);
7839
7840 }
7841
7842 else if (action_id ==
EActions.FLIP_FROZEN)
7843 {
7844 SetFrozen(!GetIsFrozen());
7845
7846 }
7847
7848 else if (action_id ==
EActions.ADD_WETNESS)
7849 {
7851
7852 }
7853
7854 else if (action_id ==
EActions.REMOVE_WETNESS)
7855 {
7857
7858 }
7859
7860 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7861 {
7864
7865
7866 }
7867
7868 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7869 {
7872 }
7873
7874 else if (action_id ==
EActions.MAKE_SPECIAL)
7875 {
7876 auto debugParams = DebugSpawnParams.WithPlayer(player);
7877 OnDebugSpawnEx(debugParams);
7878 }
7879
7880 else if (action_id ==
EActions.DELETE)
7881 {
7882 Delete();
7883 }
7884
7885 }
7886
7887
7888 return false;
7889 }
7890
7891
7892
7893
7897
7900
7901
7902
7904 {
7905 return false;
7906 }
7907
7908
7910 {
7911 return true;
7912 }
7913
7914
7916 {
7917 return true;
7918 }
7919
7920
7921
7923 {
7924 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7926 }
7927
7930 {
7931 return null;
7932 }
7933
7935 {
7936 return false;
7937 }
7938
7940 {
7941 return false;
7942 }
7943
7947
7948
7950 {
7951 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7952 return module_repairing.CanRepair(this, item_repair_kit);
7953 }
7954
7955
7956 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7957 {
7958 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7959 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7960 }
7961
7962
7964 {
7965
7966
7967
7968
7969
7970
7971
7972
7973 return 1;
7974 }
7975
7976
7977
7979 {
7981 }
7982
7983
7984
7986 {
7988 }
7989
7990
7999 {
8000 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8001
8002 if (player)
8003 {
8004 player.MessageStatus(text);
8005 }
8006 }
8007
8008
8017 {
8018 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8019
8020 if (player)
8021 {
8022 player.MessageAction(text);
8023 }
8024 }
8025
8026
8035 {
8036 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8037
8038 if (player)
8039 {
8040 player.MessageFriendly(text);
8041 }
8042 }
8043
8044
8053 {
8054 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8055
8056 if (player)
8057 {
8058 player.MessageImportant(text);
8059 }
8060 }
8061
8063 {
8064 return true;
8065 }
8066
8067
8068 override bool KindOf(
string tag)
8069 {
8070 bool found = false;
8071 string item_name = this.
GetType();
8074
8075 int array_size = item_tag_array.Count();
8076 for (int i = 0; i < array_size; i++)
8077 {
8078 if (item_tag_array.Get(i) == tag)
8079 {
8080 found = true;
8081 break;
8082 }
8083 }
8084 return found;
8085 }
8086
8087
8089 {
8090
8091 super.OnRPC(sender, rpc_type,ctx);
8092
8093
8094 switch (rpc_type)
8095 {
8096 #ifndef SERVER
8097 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8098 Param2<bool, string> p = new Param2<bool, string>(false, "");
8099
8101 return;
8102
8103 bool play = p.param1;
8104 string soundSet = p.param2;
8105
8106 if (play)
8107 {
8109 {
8111 {
8113 }
8114 }
8115 else
8116 {
8118 }
8119 }
8120 else
8121 {
8123 }
8124
8125 break;
8126 #endif
8127
8128 }
8129
8131 {
8133 }
8134 }
8135
8136
8137
8138
8140 {
8141 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8142 return plugin.GetID(
name);
8143 }
8144
8146 {
8147 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8148 return plugin.GetName(id);
8149 }
8150
8153 {
8154
8155
8156 int varFlags;
8157 if (!ctx.
Read(varFlags))
8158 return;
8159
8160 if (varFlags & ItemVariableFlags.FLOAT)
8161 {
8163 }
8164 }
8165
8167 {
8168
8169 super.SerializeNumericalVars(floats_out);
8170
8171
8172
8174 {
8176 }
8177
8179 {
8181 }
8182
8184 {
8186 }
8187
8189 {
8194 }
8195
8197 {
8199 }
8200 }
8201
8203 {
8204
8205 super.DeSerializeNumericalVars(floats);
8206
8207
8208 int index = 0;
8209 int mask = Math.Round(floats.Get(index));
8210
8211 index++;
8212
8214 {
8216 {
8218 }
8219 else
8220 {
8221 float quantity = floats.Get(index);
8223 }
8224 index++;
8225 }
8226
8228 {
8229 float wet = floats.Get(index);
8231 index++;
8232 }
8233
8235 {
8236 int liquidtype = Math.Round(floats.Get(index));
8238 index++;
8239 }
8240
8242 {
8244 index++;
8246 index++;
8248 index++;
8250 index++;
8251 }
8252
8254 {
8255 int cleanness = Math.Round(floats.Get(index));
8257 index++;
8258 }
8259 }
8260
8262 {
8263 super.WriteVarsToCTX(ctx);
8264
8265
8267 {
8269 }
8270
8272 {
8274 }
8275
8277 {
8279 }
8280
8282 {
8283 int r,g,b,a;
8289 }
8290
8292 {
8294 }
8295 }
8296
8298 {
8299 if (!super.ReadVarsFromCTX(ctx,version))
8300 return false;
8301
8302 int intValue;
8303 float value;
8304
8305 if (version < 140)
8306 {
8307 if (!ctx.
Read(intValue))
8308 return false;
8309
8310 m_VariablesMask = intValue;
8311 }
8312
8314 {
8315 if (!ctx.
Read(value))
8316 return false;
8317
8319 {
8321 }
8322 else
8323 {
8325 }
8326 }
8327
8328 if (version < 140)
8329 {
8331 {
8332 if (!ctx.
Read(value))
8333 return false;
8334 SetTemperatureDirect(value);
8335 }
8336 }
8337
8339 {
8340 if (!ctx.
Read(value))
8341 return false;
8343 }
8344
8346 {
8347 if (!ctx.
Read(intValue))
8348 return false;
8350 }
8351
8353 {
8354 int r,g,b,a;
8356 return false;
8358 return false;
8360 return false;
8362 return false;
8363
8365 }
8366
8368 {
8369 if (!ctx.
Read(intValue))
8370 return false;
8372 }
8373
8374 if (version >= 138 && version < 140)
8375 {
8377 {
8378 if (!ctx.
Read(intValue))
8379 return false;
8380 SetFrozen(intValue);
8381 }
8382 }
8383
8384 return true;
8385 }
8386
8387
8389 {
8392 {
8394 }
8395
8396 if (!super.OnStoreLoad(ctx, version))
8397 {
8399 return false;
8400 }
8401
8402 if (version >= 114)
8403 {
8404 bool hasQuickBarIndexSaved;
8405
8406 if (!ctx.
Read(hasQuickBarIndexSaved))
8407 {
8409 return false;
8410 }
8411
8412 if (hasQuickBarIndexSaved)
8413 {
8414 int itmQBIndex;
8415
8416
8417 if (!ctx.
Read(itmQBIndex))
8418 {
8420 return false;
8421 }
8422
8423 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8424 if (itmQBIndex != -1 && parentPlayer)
8425 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8426 }
8427 }
8428 else
8429 {
8430
8431 PlayerBase player;
8432 int itemQBIndex;
8433 if (version ==
int.
MAX)
8434 {
8435 if (!ctx.
Read(itemQBIndex))
8436 {
8438 return false;
8439 }
8440 }
8441 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8442 {
8443
8444 if (!ctx.
Read(itemQBIndex))
8445 {
8447 return false;
8448 }
8449 if (itemQBIndex != -1 && player)
8450 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8451 }
8452 }
8453
8454 if (version < 140)
8455 {
8456
8457 if (!LoadVariables(ctx, version))
8458 {
8460 return false;
8461 }
8462 }
8463
8464
8466 {
8468 return false;
8469 }
8470 if (version >= 132)
8471 {
8473 if (raib)
8474 {
8476 {
8478 return false;
8479 }
8480 }
8481 }
8482
8484 return true;
8485 }
8486
8487
8488
8490 {
8491 super.OnStoreSave(ctx);
8492
8493 PlayerBase player;
8494 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8495 {
8497
8498 int itemQBIndex = -1;
8499 itemQBIndex = player.FindQuickBarEntityIndex(this);
8500 ctx.
Write(itemQBIndex);
8501 }
8502 else
8503 {
8505 }
8506
8508
8510 if (raib)
8511 {
8513 }
8514 }
8515
8516
8518 {
8519 super.AfterStoreLoad();
8520
8522 {
8524 }
8525
8527 {
8530 }
8531 }
8532
8534 {
8535 super.EEOnAfterLoad();
8536
8538 {
8540 }
8541
8544 }
8545
8547 {
8548 return false;
8549 }
8550
8551
8552
8554 {
8556 {
8557 #ifdef PLATFORM_CONSOLE
8558
8560 {
8562 if (menu)
8563 {
8565 }
8566 }
8567 #endif
8568 }
8569
8571 {
8574 }
8575
8577 {
8578 SetWeightDirty();
8580 }
8582 {
8585 }
8586
8588 {
8591 }
8593 {
8596 }
8597
8598 super.OnVariablesSynchronized();
8599 }
8600
8601
8602
8604 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8605 {
8606 if (!IsServerCheck(allow_client))
8607 return false;
8608
8610 return false;
8611
8614
8615 if (value <= (min + 0.001))
8616 value = min;
8617
8618 if (value == min)
8619 {
8620 if (destroy_config)
8621 {
8622 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8623 if (dstr)
8624 {
8626 this.Delete();
8627 return true;
8628 }
8629 }
8630 else if (destroy_forced)
8631 {
8633 this.Delete();
8634 return true;
8635 }
8636
8638 }
8639
8642
8644 {
8646
8647 if (delta)
8649 }
8650
8652
8653 return false;
8654 }
8655
8656
8658 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8659 {
8661 }
8662
8664 {
8667 }
8668
8670 {
8673 }
8674
8677 {
8678 float value_clamped = Math.Clamp(value, 0, 1);
8680 SetQuantity(result, destroy_config, destroy_forced);
8681 }
8682
8683
8686 {
8688 }
8689
8691 {
8693 }
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8705 {
8706 int slot = -1;
8707 if (GetInventory())
8708 {
8709 InventoryLocation il = new InventoryLocation;
8710 GetInventory().GetCurrentInventoryLocation(il);
8712 }
8713
8715 }
8716
8718 {
8719 float quantity_max = 0;
8720
8722 {
8723 if (attSlotID != -1)
8724 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8725
8726 if (quantity_max <= 0)
8728 }
8729
8730 if (quantity_max <= 0)
8732
8733 return quantity_max;
8734 }
8735
8737 {
8739 }
8740
8742 {
8744 }
8745
8746
8748 {
8750 }
8751
8753 {
8755 }
8756
8758 {
8760 }
8761
8762
8764 {
8765
8766 float weightEx = GetWeightEx();
8767 float special = GetInventoryAndCargoWeight();
8768 return weightEx - special;
8769 }
8770
8771
8773 {
8775 }
8776
8778 {
8780 {
8781 #ifdef DEVELOPER
8782 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8783 {
8784 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8786 }
8787 #endif
8788
8790 }
8791 else if (HasEnergyManager())
8792 {
8793 #ifdef DEVELOPER
8794 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8795 {
8796 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8797 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8798 }
8799 #endif
8800 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8801 }
8802 else
8803 {
8804 #ifdef DEVELOPER
8805 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8806 {
8807 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8808 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8809 }
8810 #endif
8811 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8812 }
8813 }
8814
8817 {
8818 int item_count = 0;
8820
8821 if (GetInventory().GetCargo() != NULL)
8822 {
8823 item_count = GetInventory().GetCargo().GetItemCount();
8824 }
8825
8826 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8827 {
8828 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8829 if (item)
8830 item_count += item.GetNumberOfItems();
8831 }
8832 return item_count;
8833 }
8834
8837 {
8838 float weight = 0;
8839 float wetness = 1;
8840 if (include_wetness)
8843 {
8844 weight = wetness * m_ConfigWeight;
8845 }
8847 {
8848 weight = 1;
8849 }
8850 return weight;
8851 }
8852
8853
8854
8856 {
8857 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8858 {
8859 GameInventory inv = GetInventory();
8860 array<EntityAI> items = new array<EntityAI>;
8862 for (int i = 0; i < items.Count(); i++)
8863 {
8865 if (item)
8866 {
8868 }
8869 }
8870 }
8871 }
8872
8873
8874
8875
8877 {
8878 float energy = 0;
8879 if (HasEnergyManager())
8880 {
8881 energy = GetCompEM().GetEnergy();
8882 }
8883 return energy;
8884 }
8885
8886
8888 {
8889 super.OnEnergyConsumed();
8890
8892 }
8893
8895 {
8896 super.OnEnergyAdded();
8897
8899 }
8900
8901
8903 {
8904 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8905 {
8907 {
8908 float energy_0to1 = GetCompEM().GetEnergy0To1();
8910 }
8911 }
8912 }
8913
8914
8916 {
8917 return ConfigGetFloat("heatIsolation");
8918 }
8919
8921 {
8923 }
8924
8926 {
8927 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8928 if (
GetGame().ConfigIsExisting(paramPath))
8930
8931 return 0.0;
8932 }
8933
8935 {
8936 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8937 if (
GetGame().ConfigIsExisting(paramPath))
8939
8940 return 0.0;
8941 }
8942
8943 override void SetWet(
float value,
bool allow_client =
false)
8944 {
8945 if (!IsServerCheck(allow_client))
8946 return;
8947
8950
8952
8953 m_VarWet = Math.Clamp(value, min, max);
8954
8956 {
8959 }
8960 }
8961
8962 override void AddWet(
float value)
8963 {
8965 }
8966
8968 {
8970 }
8971
8973 {
8975 }
8976
8978 {
8980 }
8981
8983 {
8985 }
8986
8988 {
8990 }
8991
8993 {
8996 if (newLevel != oldLevel)
8997 {
8999 }
9000 }
9001
9003 {
9004 SetWeightDirty();
9005 }
9006
9008 {
9009 return GetWetLevelInternal(
m_VarWet);
9010 }
9011
9012
9013
9015 {
9017 }
9018
9020 {
9022 }
9023
9025 {
9027 }
9028
9030 {
9032 }
9033
9034
9035
9037 {
9038 if (ConfigIsExisting("itemModelLength"))
9039 {
9040 return ConfigGetFloat("itemModelLength");
9041 }
9042 return 0;
9043 }
9044
9046 {
9047 if (ConfigIsExisting("itemAttachOffset"))
9048 {
9049 return ConfigGetFloat("itemAttachOffset");
9050 }
9051 return 0;
9052 }
9053
9054 override void SetCleanness(
int value,
bool allow_client =
false)
9055 {
9056 if (!IsServerCheck(allow_client))
9057 return;
9058
9060
9062
9065 }
9066
9068 {
9070 }
9071
9073 {
9074 return true;
9075 }
9076
9077
9078
9079
9081 {
9083 }
9084
9086 {
9088 }
9089
9090
9091
9092
9093 override void SetColor(
int r,
int g,
int b,
int a)
9094 {
9100 }
9102 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9103 {
9108 }
9109
9111 {
9113 }
9114
9117 {
9118 int r,g,b,a;
9120 r = r/255;
9121 g = g/255;
9122 b = b/255;
9123 a = a/255;
9124 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9125 }
9126
9127
9128
9129 override void SetLiquidType(
int value,
bool allow_client =
false)
9130 {
9131 if (!IsServerCheck(allow_client))
9132 return;
9133
9138 }
9139
9141 {
9142 return ConfigGetInt("varLiquidTypeInit");
9143 }
9144
9146 {
9148 }
9149
9151 {
9153 SetFrozen(false);
9154 }
9155
9158 {
9159 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9160 }
9161
9162
9165 {
9166 PlayerBase nplayer;
9167 if (PlayerBase.CastTo(nplayer, player))
9168 {
9170
9171 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9172 }
9173 }
9174
9175
9178 {
9179 PlayerBase nplayer;
9180 if (PlayerBase.CastTo(nplayer,player))
9181 {
9182
9183 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9184
9185 }
9186
9187
9188 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9189
9190
9191 if (HasEnergyManager())
9192 {
9193 GetCompEM().UpdatePlugState();
9194 }
9195 }
9196
9197
9199 {
9200 super.OnPlacementStarted(player);
9201
9203 }
9204
9205 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9206 {
9208 {
9209 m_AdminLog.OnPlacementComplete(player,
this);
9210 }
9211
9212 super.OnPlacementComplete(player, position, orientation);
9213 }
9214
9215
9216
9217
9218
9220 {
9222 {
9223 return true;
9224 }
9225 else
9226 {
9227 return false;
9228 }
9229 }
9230
9231
9233 {
9235 {
9237 }
9238 }
9239
9240
9242 {
9244 }
9245
9247 {
9249 }
9250
9251 override void InsertAgent(
int agent,
float count = 1)
9252 {
9253 if (count < 1)
9254 return;
9255
9257 }
9258
9261 {
9263 }
9264
9265
9267 {
9269 }
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9313 {
9315 return false;
9316 return true;
9317 }
9318
9320 {
9321
9323 }
9324
9325
9328 {
9329 super.CheckForRoofLimited(timeTresholdMS);
9330
9332 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9333 {
9334 m_PreviousRoofTestTime = time;
9335 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9336 }
9337 }
9338
9339
9341 {
9343 {
9344 return 0;
9345 }
9346
9347 if (GetInventory().GetAttachmentSlotsCount() != 0)
9348 {
9349 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9350 if (filter)
9351 return filter.GetProtectionLevel(type, false, system);
9352 else
9353 return 0;
9354 }
9355
9356 string subclassPath, entryName;
9357
9358 switch (type)
9359 {
9361 entryName = "biological";
9362 break;
9364 entryName = "chemical";
9365 break;
9366 default:
9367 entryName = "biological";
9368 break;
9369 }
9370
9371 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9372
9374 }
9375
9376
9377
9380 {
9381 if (!IsMagazine())
9383
9385 }
9386
9387
9388
9389
9390
9395 {
9396 return true;
9397 }
9398
9400 {
9402 }
9403
9404
9405
9406
9407
9409 {
9410 if (parent)
9411 {
9412 if (parent.IsInherited(DayZInfected))
9413 return true;
9414
9415 if (!parent.IsRuined())
9416 return true;
9417 }
9418
9419 return true;
9420 }
9421
9423 {
9424 if (!super.CanPutAsAttachment(parent))
9425 {
9426 return false;
9427 }
9428
9429 if (!IsRuined() && !parent.IsRuined())
9430 {
9431 return true;
9432 }
9433
9434 return false;
9435 }
9436
9438 {
9439
9440
9441
9442
9443 return super.CanReceiveItemIntoCargo(item);
9444 }
9445
9447 {
9448
9449
9450
9451
9452 GameInventory attachmentInv = attachment.GetInventory();
9454 {
9455 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9456 return false;
9457 }
9458
9459 InventoryLocation loc = new InventoryLocation();
9460 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9461 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9462 return false;
9463
9464 return super.CanReceiveAttachment(attachment, slotId);
9465 }
9466
9468 {
9469 if (!super.CanReleaseAttachment(attachment))
9470 return false;
9471
9472 return GetInventory().AreChildrenAccessible();
9473 }
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9496 {
9497 int id = muzzle_owner.GetMuzzleID();
9498 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9499
9500 if (WPOF_array)
9501 {
9502 for (int i = 0; i < WPOF_array.Count(); i++)
9503 {
9504 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9505
9506 if (WPOF)
9507 {
9508 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9509 }
9510 }
9511 }
9512 }
9513
9514
9516 {
9517 int id = muzzle_owner.GetMuzzleID();
9519
9520 if (WPOBE_array)
9521 {
9522 for (int i = 0; i < WPOBE_array.Count(); i++)
9523 {
9524 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9525
9526 if (WPOBE)
9527 {
9528 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9529 }
9530 }
9531 }
9532 }
9533
9534
9536 {
9537 int id = muzzle_owner.GetMuzzleID();
9538 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9539
9540 if (WPOOH_array)
9541 {
9542 for (int i = 0; i < WPOOH_array.Count(); i++)
9543 {
9544 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9545
9546 if (WPOOH)
9547 {
9548 WPOOH.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.OnUpdate(weapon, 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.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9589 }
9590 }
9591 }
9592 }
9593
9594
9595
9597 {
9599 {
9600 return true;
9601 }
9602
9603 return false;
9604 }
9605
9607 {
9609 {
9610 return true;
9611 }
9612
9613 return false;
9614 }
9615
9617 {
9619 {
9620 return true;
9621 }
9622
9623 return false;
9624 }
9625
9627 {
9628 return false;
9629 }
9630
9633 {
9634 return UATimeSpent.DEFAULT_DEPLOY;
9635 }
9636
9637
9638
9639
9641 {
9643 SetSynchDirty();
9644 }
9645
9647 {
9649 }
9650
9651
9653 {
9654 return false;
9655 }
9656
9659 {
9660 string att_type = "None";
9661
9662 if (ConfigIsExisting("soundAttType"))
9663 {
9664 att_type = ConfigGetString("soundAttType");
9665 }
9666
9668 }
9669
9671 {
9673 }
9674
9675
9676
9677
9678
9682
9684 {
9687
9689 }
9690
9691
9693 {
9695 return;
9696
9698
9701
9704
9705 SoundParameters params = new SoundParameters();
9709 }
9710
9711
9713 {
9715 return;
9716
9718 SetSynchDirty();
9719
9722 }
9723
9724
9726 {
9728 return;
9729
9731 SetSynchDirty();
9732
9735 }
9736
9738 {
9740 }
9741
9743 {
9745 }
9746
9749 {
9750 if (!
GetGame().IsDedicatedServer())
9751 {
9752 if (ConfigIsExisting("attachSoundSet"))
9753 {
9754 string cfg_path = "";
9755 string soundset = "";
9757
9760 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9761 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9762
9763 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9764 {
9765 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9766 {
9767 if (cfg_slot_array[i] == slot_type)
9768 {
9769 soundset = cfg_soundset_array[i];
9770 break;
9771 }
9772 }
9773 }
9774
9775 if (soundset != "")
9776 {
9777 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9779 }
9780 }
9781 }
9782 }
9783
9785 {
9786
9787 }
9788
9789 void OnApply(PlayerBase player);
9790
9792 {
9793 return 1.0;
9794 };
9795
9797 {
9799 }
9800
9802 {
9804 }
9805
9807
9809 {
9810 SetDynamicPhysicsLifeTime(0.01);
9812 }
9813
9815 {
9816 array<string> zone_names = new array<string>;
9817 GetDamageZones(zone_names);
9818 for (int i = 0; i < zone_names.Count(); i++)
9819 {
9820 SetHealthMax(zone_names.Get(i),"Health");
9821 }
9822 SetHealthMax("","Health");
9823 }
9824
9827 {
9828 float global_health = GetHealth01("","Health");
9829 array<string> zones = new array<string>;
9830 GetDamageZones(zones);
9831
9832 for (int i = 0; i < zones.Count(); i++)
9833 {
9834 SetHealth01(zones.Get(i),"Health",global_health);
9835 }
9836 }
9837
9840 {
9841 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9842 }
9843
9845 {
9846 if (!hasRootAsPlayer)
9847 {
9848 if (refParentIB)
9849 {
9850
9851 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9852 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9853
9854 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9855 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9856
9859 }
9860 else
9861 {
9862
9865 }
9866 }
9867 }
9868
9870 {
9872 {
9873 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9874 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9875 {
9876 float heatPermCoef = 1.0;
9878 while (ent)
9879 {
9880 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9881 ent = ent.GetHierarchyParent();
9882 }
9883
9884 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9885 }
9886 }
9887 }
9888
9890 {
9891
9892 EntityAI parent = GetHierarchyParent();
9893 if (!parent)
9894 {
9895 hasParent = false;
9896 hasRootAsPlayer = false;
9897 }
9898 else
9899 {
9900 hasParent = true;
9901 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9902 refParentIB =
ItemBase.Cast(parent);
9903 }
9904 }
9905
9906 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9907 {
9908
9909 }
9910
9912 {
9913
9914 return false;
9915 }
9916
9918 {
9919
9920
9921 return false;
9922 }
9923
9925 {
9926
9927 return false;
9928 }
9929
9932 {
9933 return !GetIsFrozen() &&
IsOpen();
9934 }
9935
9937 {
9938 bool hasParent = false, hasRootAsPlayer = false;
9940
9941 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9942 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9943
9944 if (wwtu || foodDecay)
9945 {
9949
9950 if (processWetness || processTemperature || processDecay)
9951 {
9953
9954 if (processWetness)
9955 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9956
9957 if (processTemperature)
9959
9960 if (processDecay)
9961 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9962 }
9963 }
9964 }
9965
9968 {
9970 }
9971
9973 {
9976
9977 return super.GetTemperatureFreezeThreshold();
9978 }
9979
9981 {
9984
9985 return super.GetTemperatureThawThreshold();
9986 }
9987
9989 {
9992
9993 return super.GetItemOverheatThreshold();
9994 }
9995
9997 {
9999 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10000
10001 return super.GetTemperatureFreezeTime();
10002 }
10003
10005 {
10007 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10008
10009 return super.GetTemperatureThawTime();
10010 }
10011
10016
10018 {
10019 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10020 }
10021
10023 {
10024 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10025 }
10026
10029 {
10031 }
10032
10034 {
10036 }
10037
10039 {
10041 }
10042
10045 {
10046 return null;
10047 }
10048
10051 {
10052 return false;
10053 }
10054
10056 {
10058 {
10061 if (!trg)
10062 {
10064 explosive = this;
10065 }
10066
10067 explosive.PairRemote(trg);
10069
10070 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10071 trg.SetPersistentPairID(persistentID);
10072 explosive.SetPersistentPairID(persistentID);
10073
10074 return true;
10075 }
10076 return false;
10077 }
10078
10081 {
10082 float ret = 1.0;
10085 ret *= GetHealth01();
10086
10087 return ret;
10088 }
10089
10090 #ifdef DEVELOPER
10091 override void SetDebugItem()
10092 {
10093 super.SetDebugItem();
10094 _itemBase = this;
10095 }
10096
10098 {
10099 string text = super.GetDebugText();
10100
10102 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10103
10104 return text;
10105 }
10106 #endif
10107
10109 {
10110 return true;
10111 }
10112
10114
10116
10118 {
10121 }
10122
10123
10131
10147}
10148
10150{
10152 if (entity)
10153 {
10154 bool is_item = entity.IsInherited(
ItemBase);
10155 if (is_item && full_quantity)
10156 {
10159 }
10160 }
10161 else
10162 {
10164 return NULL;
10165 }
10166 return entity;
10167}
10168
10170{
10171 if (item)
10172 {
10173 if (health > 0)
10174 item.SetHealth("", "", health);
10175
10176 if (item.CanHaveTemperature())
10177 {
10179 if (item.CanFreeze())
10180 item.SetFrozen(false);
10181 }
10182
10183 if (item.HasEnergyManager())
10184 {
10185 if (quantity >= 0)
10186 {
10187 item.GetCompEM().SetEnergy0To1(quantity);
10188 }
10189 else
10190 {
10192 }
10193 }
10194 else if (item.IsMagazine())
10195 {
10196 Magazine mag = Magazine.Cast(item);
10197 if (quantity >= 0)
10198 {
10199 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10200 }
10201 else
10202 {
10204 }
10205
10206 }
10207 else
10208 {
10209 if (quantity >= 0)
10210 {
10211 item.SetQuantityNormalized(quantity, false);
10212 }
10213 else
10214 {
10216 }
10217
10218 }
10219 }
10220}
10221
10222#ifdef DEVELOPER
10224#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.