5312{
5314 {
5315 return true;
5316 }
5317};
5318
5319
5320
5322{
5326
5328
5331
5332
5333
5334
5335
5344
5350
5355
5360
5381 protected bool m_IsResultOfSplit
5382
5384
5389
5390
5391
5393
5397
5398
5399
5401
5404
5405
5406
5412
5413
5421
5424
5425
5427
5428
5430
5431
5436
5437
5442
5443
5445
5446
5448 {
5453
5454 if (!
GetGame().IsDedicatedServer())
5455 {
5457 {
5459
5461 {
5463 }
5464 }
5465
5468 }
5469
5470 m_OldLocation = null;
5471
5473 {
5475 }
5476
5477 if (ConfigIsExisting("headSelectionsToHide"))
5478 {
5481 }
5482
5484 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5485 {
5487 }
5488
5490
5491 m_IsResultOfSplit = false;
5492
5494 }
5495
5497 {
5498 super.InitItemVariables();
5499
5505 m_Count = ConfigGetInt(
"count");
5506
5509
5514
5517
5522
5534
5538
5539
5542 if (ConfigIsExisting("canBeSplit"))
5543 {
5546 }
5547
5549 if (ConfigIsExisting("itemBehaviour"))
5551
5552
5555 RegisterNetSyncVariableInt("m_VarLiquidType");
5556 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5557
5558 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5559 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5560 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5561
5562 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5563 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5564 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5565 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5566
5567 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5568 RegisterNetSyncVariableBool("m_IsTakeable");
5569 RegisterNetSyncVariableBool("m_IsHologram");
5570
5573 {
5576 }
5577
5579
5581 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5583
5584 }
5585
5587 {
5589 }
5590
5592 {
5595 {
5600 }
5601 }
5602
5603 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5604 {
5606 {
5609 }
5610
5612 }
5613
5615 {
5621 }
5622
5624
5626 {
5628
5629 if (!action)
5630 {
5631 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5632 return;
5633 }
5634
5636 if (!ai)
5637 {
5639 return;
5640 }
5641
5643 if (!action_array)
5644 {
5645 action_array = new array<ActionBase_Basic>;
5647 }
5648 if (LogManager.IsActionLogEnable())
5649 {
5650 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5651 }
5652
5653 if (action_array.Find(action) != -1)
5654 {
5655 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5656 }
5657 else
5658 {
5659 action_array.Insert(action);
5660 }
5661 }
5662
5664 {
5666 ActionBase action = player.GetActionManager().GetAction(actionName);
5669
5670 if (action_array)
5671 {
5672 action_array.RemoveItem(action);
5673 }
5674 }
5675
5676
5677
5679 {
5680 ActionOverrideData overrideData = new ActionOverrideData();
5684
5686 if (!actionMap)
5687 {
5690 }
5691
5692 actionMap.Insert(this.
Type(), overrideData);
5693
5694 }
5695
5697
5699
5700
5702 {
5705
5708
5709 string config_to_search = "CfgVehicles";
5710 string muzzle_owner_config;
5711
5713 {
5714 if (IsInherited(Weapon))
5715 config_to_search = "CfgWeapons";
5716
5717 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5718
5719 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5720
5722
5723 if (config_OnFire_subclass_count > 0)
5724 {
5725 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5726
5727 for (int i = 0; i < config_OnFire_subclass_count; i++)
5728 {
5729 string particle_class = "";
5731 string config_OnFire_entry = config_OnFire_class + particle_class;
5732 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5733 WPOF_array.Insert(WPOF);
5734 }
5735
5736
5738 }
5739 }
5740
5742 {
5743 config_to_search = "CfgWeapons";
5744 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5745
5746 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5747
5749
5750 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5751 {
5752 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5753
5754 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5755 {
5756 string particle_class2 = "";
5758 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5759 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5760 WPOBE_array.Insert(WPOBE);
5761 }
5762
5763
5765 }
5766 }
5767 }
5768
5769
5771 {
5774
5776 {
5777 string config_to_search = "CfgVehicles";
5778
5779 if (IsInherited(Weapon))
5780 config_to_search = "CfgWeapons";
5781
5782 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5783 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5784
5785 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5786 {
5787
5789
5791 {
5793 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5795 return;
5796 }
5797
5800
5801
5802
5804 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5805
5806 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5807 {
5808 string particle_class = "";
5810 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5812
5813 if (entry_type == CT_CLASS)
5814 {
5815 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5816 WPOOH_array.Insert(WPOF);
5817 }
5818 }
5819
5820
5822 }
5823 }
5824 }
5825
5827 {
5829 }
5830
5832 {
5834 {
5836
5839
5842
5843 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5844 }
5845 }
5846
5848 {
5850 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5851
5853 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5854
5856 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5857
5859 {
5861 }
5862 }
5863
5865 {
5867 }
5868
5870 {
5873 else
5875
5877 {
5880 }
5881 else
5882 {
5885
5888 }
5889
5891 }
5892
5894 {
5896 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5897 }
5898
5900 {
5902 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5904 }
5905
5907 {
5909 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5910 }
5911
5913 {
5916
5917 OverheatingParticle OP = new OverheatingParticle();
5922
5924 }
5925
5927 {
5930
5931 return -1;
5932 }
5933
5935 {
5937 {
5940
5941 for (int i = count; i > 0; --i)
5942 {
5943 int id = i - 1;
5946
5949
5950 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5951 {
5952 if (p)
5953 {
5956 }
5957 }
5958 }
5959 }
5960 }
5961
5963 {
5965 {
5967 {
5968 int id = i - 1;
5970
5971 if (OP)
5972 {
5974
5975 if (p)
5976 {
5978 }
5979
5980 delete OP;
5981 }
5982 }
5983
5986 }
5987 }
5988
5991 {
5992 return 0.0;
5993 }
5994
5995
5997 {
5998 return 250;
5999 }
6000
6002 {
6003 return 0;
6004 }
6005
6008 {
6010 return true;
6011
6012 return false;
6013 }
6014
6017 {
6020
6022 {
6024 }
6025 else
6026 {
6027
6029 }
6030
6032 }
6033
6040 {
6041 return -1;
6042 }
6043
6044
6045
6046
6048 {
6050 {
6052 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6053
6054 if (r_index >= 0)
6055 {
6056 InventoryLocation r_il = new InventoryLocation;
6057 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6058
6059 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6062 {
6063 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6064 }
6066 {
6067 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6068 }
6069
6070 }
6071
6072 player.GetHumanInventory().ClearUserReservedLocation(this);
6073 }
6074
6077 }
6078
6079
6080
6081
6083 {
6084 return ItemBase.m_DebugActionsMask;
6085 }
6086
6088 {
6089 return ItemBase.m_DebugActionsMask & mask;
6090 }
6091
6093 {
6094 ItemBase.m_DebugActionsMask = mask;
6095 }
6096
6098 {
6099 ItemBase.m_DebugActionsMask |= mask;
6100 }
6101
6103 {
6104 ItemBase.m_DebugActionsMask &= ~mask;
6105 }
6106
6108 {
6110 {
6112 }
6113 else
6114 {
6116 }
6117 }
6118
6119
6121 {
6122 if (GetEconomyProfile())
6123 {
6124 float q_max = GetEconomyProfile().GetQuantityMax();
6125 if (q_max > 0)
6126 {
6127 float q_min = GetEconomyProfile().GetQuantityMin();
6128 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6129
6131 {
6132 ComponentEnergyManager comp = GetCompEM();
6134 {
6136 }
6137 }
6139 {
6141
6142 }
6143
6144 }
6145 }
6146 }
6147
6150 {
6151 EntityAI parent = GetHierarchyParent();
6152
6153 if (parent)
6154 {
6155 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6156 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6157 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6158 }
6159 }
6160
6163 {
6164 EntityAI parent = GetHierarchyParent();
6165
6166 if (parent)
6167 {
6168 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6169 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6170 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6171 }
6172 }
6173
6175 {
6176
6177
6178
6179
6181
6183 {
6184 if (ScriptInputUserData.CanStoreInputUserData())
6185 {
6186 ScriptInputUserData ctx = new ScriptInputUserData;
6192 ctx.
Write(use_stack_max);
6195
6197 {
6198 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6199 }
6200 }
6201 }
6202 else if (!
GetGame().IsMultiplayer())
6203 {
6205 }
6206 }
6207
6209 {
6211 }
6212
6214 {
6216 }
6217
6219 {
6221 }
6222
6224 {
6225
6226 return false;
6227 }
6228
6230 {
6231 return false;
6232 }
6233
6237 {
6238 return false;
6239 }
6240
6242 {
6243 return "";
6244 }
6245
6247
6249 {
6250 return false;
6251 }
6252
6254 {
6255 return true;
6256 }
6257
6258
6259
6261 {
6262 return true;
6263 }
6264
6266 {
6267 return true;
6268 }
6269
6271 {
6272 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6274 }
6275
6277 {
6279 }
6280
6282 {
6284 if (!is_being_placed)
6286 SetSynchDirty();
6287 }
6288
6289
6291
6293 {
6295 }
6296
6298 {
6300 }
6301
6303 {
6304 return 1;
6305 }
6306
6308 {
6309 return false;
6310 }
6311
6313 {
6315 SetSynchDirty();
6316 }
6317
6318
6319
6320
6321
6322
6323
6324
6325
6326
6327
6328
6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6353 {
6354 super.OnMovedInsideCargo(container);
6355
6356 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6357 }
6358
6359 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6360 {
6361 super.EEItemLocationChanged(oldLoc,newLoc);
6362
6363 PlayerBase new_player = null;
6364 PlayerBase old_player = null;
6365
6366 if (newLoc.GetParent())
6367 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6368
6369 if (oldLoc.GetParent())
6370 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6371
6373 {
6374 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6375
6376 if (r_index >= 0)
6377 {
6378 InventoryLocation r_il = new InventoryLocation;
6379 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6380
6381 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6384 {
6385 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6386 }
6388 {
6389 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6390 }
6391
6392 }
6393 }
6394
6396 {
6397 if (new_player)
6398 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6399
6400 if (new_player == old_player)
6401 {
6402
6403 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6404 {
6406 {
6407 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6408 {
6409 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6410 }
6411 }
6412 else
6413 {
6414 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6415 }
6416 }
6417
6418 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6419 {
6420 int type = oldLoc.GetType();
6422 {
6423 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6424 }
6426 {
6427 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6428 }
6429 }
6430 if (!m_OldLocation)
6431 {
6432 m_OldLocation = new InventoryLocation;
6433 }
6434 m_OldLocation.Copy(oldLoc);
6435 }
6436 else
6437 {
6438 if (m_OldLocation)
6439 {
6440 m_OldLocation.Reset();
6441 }
6442 }
6443
6445 }
6446 else
6447 {
6448 if (new_player)
6449 {
6450 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6451 if (res_index >= 0)
6452 {
6453 InventoryLocation il = new InventoryLocation;
6454 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6456 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6459 {
6460 il.
GetParent().GetOnReleaseLock().Invoke(it);
6461 }
6463 {
6465 }
6466
6467 }
6468 }
6470 {
6471
6473 }
6474
6475 if (m_OldLocation)
6476 {
6477 m_OldLocation.Reset();
6478 }
6479 }
6480 }
6481
6482 override void EOnContact(IEntity other, Contact extra)
6483 {
6485 {
6486 int liquidType = -1;
6488 if (impactSpeed > 0.0)
6489 {
6491 #ifndef SERVER
6493 #else
6495 SetSynchDirty();
6496 #endif
6498 }
6499 }
6500
6501 #ifdef SERVER
6502 if (GetCompEM() && GetCompEM().IsPlugged())
6503 {
6504 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6505 GetCompEM().UnplugThis();
6506 }
6507 #endif
6508 }
6509
6511
6513 {
6515 }
6516
6518 {
6519
6520 }
6521
6523 {
6524 super.OnItemLocationChanged(old_owner, new_owner);
6525
6526 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6527 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6528
6529 if (!relatedPlayer && playerNew)
6530 relatedPlayer = playerNew;
6531
6532 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6533 {
6535 if (actionMgr)
6536 {
6537 ActionBase currentAction = actionMgr.GetRunningAction();
6538 if (currentAction)
6540 }
6541 }
6542
6543 Man ownerPlayerOld = null;
6544 Man ownerPlayerNew = null;
6545
6546 if (old_owner)
6547 {
6548 if (old_owner.
IsMan())
6549 {
6550 ownerPlayerOld = Man.Cast(old_owner);
6551 }
6552 else
6553 {
6554 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6555 }
6556 }
6557 else
6558 {
6560 {
6562
6563 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6564 {
6565 GetCompEM().UnplugThis();
6566 }
6567 }
6568 }
6569
6570 if (new_owner)
6571 {
6572 if (new_owner.
IsMan())
6573 {
6574 ownerPlayerNew = Man.Cast(new_owner);
6575 }
6576 else
6577 {
6578 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6579 }
6580 }
6581
6582 if (ownerPlayerOld != ownerPlayerNew)
6583 {
6584 if (ownerPlayerOld)
6585 {
6586 array<EntityAI> subItemsExit = new array<EntityAI>;
6588 for (int i = 0; i < subItemsExit.Count(); i++)
6589 {
6592 }
6593 }
6594
6595 if (ownerPlayerNew)
6596 {
6597 array<EntityAI> subItemsEnter = new array<EntityAI>;
6599 for (int j = 0; j < subItemsEnter.Count(); j++)
6600 {
6603 }
6604 }
6605 }
6606 else if (ownerPlayerNew != null)
6607 {
6608 PlayerBase nplayer;
6609 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6610 {
6611 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6613 for (int k = 0; k < subItemsUpdate.Count(); k++)
6614 {
6616 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6617 }
6618 }
6619 }
6620
6621 if (old_owner)
6622 old_owner.OnChildItemRemoved(this);
6623 if (new_owner)
6624 new_owner.OnChildItemReceived(this);
6625 }
6626
6627
6629 {
6630 super.EEDelete(parent);
6631 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6632 if (player)
6633 {
6635
6636 if (player.IsAlive())
6637 {
6638 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6639 if (r_index >= 0)
6640 {
6641 InventoryLocation r_il = new InventoryLocation;
6642 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6643
6644 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6647 {
6648 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6649 }
6651 {
6652 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6653 }
6654
6655 }
6656
6657 player.RemoveQuickBarEntityShortcut(this);
6658 }
6659 }
6660 }
6661
6663 {
6664 super.EEKilled(killer);
6665
6668 {
6669 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6670 {
6671 if (IsMagazine())
6672 {
6673 if (Magazine.Cast(this).GetAmmoCount() > 0)
6674 {
6676 }
6677 }
6678 else
6679 {
6681 }
6682 }
6683 }
6684 }
6685
6687 {
6688 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6689
6690 super.OnWasAttached(parent, slot_id);
6691
6694
6696 }
6697
6699 {
6700 super.OnWasDetached(parent, slot_id);
6701
6704 }
6705
6707 {
6708 int idx;
6711
6712 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6713 if (inventory_slots.Count() < 1)
6714 {
6715 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6716 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6717 }
6718 else
6719 {
6720 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6721 }
6722
6723 idx = inventory_slots.Find(slot);
6724 if (idx < 0)
6725 return "";
6726
6727 return attach_types.Get(idx);
6728 }
6729
6731 {
6732 int idx = -1;
6733 string slot;
6734
6737
6738 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6739 if (inventory_slots.Count() < 1)
6740 {
6741 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6742 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6743 }
6744 else
6745 {
6746 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6747 if (detach_types.Count() < 1)
6748 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6749 }
6750
6751 for (int i = 0; i < inventory_slots.Count(); i++)
6752 {
6753 slot = inventory_slots.Get(i);
6754 }
6755
6756 if (slot != "")
6757 {
6758 if (detach_types.Count() == 1)
6759 idx = 0;
6760 else
6761 idx = inventory_slots.Find(slot);
6762 }
6763 if (idx < 0)
6764 return "";
6765
6766 return detach_types.Get(idx);
6767 }
6768
6770 {
6771
6773
6774
6775 float min_time = 1;
6776 float max_time = 3;
6777 float delay = Math.RandomFloat(min_time, max_time);
6778
6779 explode_timer.Run(delay, this, "DoAmmoExplosion");
6780 }
6781
6783 {
6784 Magazine magazine = Magazine.Cast(this);
6785 int pop_sounds_count = 6;
6786 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6787
6788
6789 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6790 string sound_name = pop_sounds[ sound_idx ];
6792
6793
6794 magazine.ServerAddAmmoCount(-1);
6795
6796
6797 float min_temp_to_explode = 100;
6798
6799 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6800 {
6802 }
6803 }
6804
6805
6806 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6807 {
6808 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6809
6810 const int CHANCE_DAMAGE_CARGO = 4;
6811 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6812 const int CHANCE_DAMAGE_NOTHING = 2;
6813
6815 {
6816 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6817 int chances;
6818 int rnd;
6819
6820 if (GetInventory().GetCargo())
6821 {
6822 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6823 rnd = Math.RandomInt(0,chances);
6824
6825 if (rnd < CHANCE_DAMAGE_CARGO)
6826 {
6828 }
6829 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6830 {
6832 }
6833 }
6834 else
6835 {
6836 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6837 rnd = Math.RandomInt(0,chances);
6838
6839 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6840 {
6842 }
6843 }
6844 }
6845 }
6846
6848 {
6849 if (GetInventory().GetCargo())
6850 {
6851 int item_count = GetInventory().GetCargo().GetItemCount();
6852 if (item_count > 0)
6853 {
6854 int random_pick = Math.RandomInt(0, item_count);
6856 if (!item.IsExplosive())
6857 {
6858 item.AddHealth("","",damage);
6859 return true;
6860 }
6861 }
6862 }
6863 return false;
6864 }
6865
6867 {
6868 int attachment_count = GetInventory().AttachmentCount();
6869 if (attachment_count > 0)
6870 {
6871 int random_pick = Math.RandomInt(0, attachment_count);
6872 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6873 if (!attachment.IsExplosive())
6874 {
6875 attachment.AddHealth("","",damage);
6876 return true;
6877 }
6878 }
6879 return false;
6880 }
6881
6883 {
6885 }
6886
6888 {
6890 return GetInventory().CanRemoveEntity();
6891
6892 return false;
6893 }
6894
6896 {
6898 return;
6899
6901 {
6902 if (ScriptInputUserData.CanStoreInputUserData())
6903 {
6904 ScriptInputUserData ctx = new ScriptInputUserData;
6909 ctx.
Write(destination_entity);
6913 }
6914 }
6915 else if (!
GetGame().IsMultiplayer())
6916 {
6918 }
6919 }
6920
6922 {
6924 return;
6925
6926 float split_quantity_new;
6930 InventoryLocation loc = new InventoryLocation;
6931
6932 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6933 {
6935 split_quantity_new = stack_max;
6936 else
6938
6939 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6940 if (new_item)
6941 {
6942 new_item.SetResultOfSplit(true);
6943 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6945 new_item.SetQuantity(split_quantity_new);
6946 }
6947 }
6948 else if (destination_entity && slot_id == -1)
6949 {
6950 if (quantity > stack_max)
6951 split_quantity_new = stack_max;
6952 else
6953 split_quantity_new = quantity;
6954
6956 {
6959 }
6960
6961 if (new_item)
6962 {
6963 new_item.SetResultOfSplit(true);
6964 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6966 new_item.SetQuantity(split_quantity_new);
6967 }
6968 }
6969 else
6970 {
6971 if (stack_max != 0)
6972 {
6974 {
6976 }
6977
6978 if (split_quantity_new == 0)
6979 {
6980 if (!
GetGame().IsMultiplayer())
6981 player.PhysicalPredictiveDropItem(this);
6982 else
6983 player.ServerDropEntity(this);
6984 return;
6985 }
6986
6988
6989 if (new_item)
6990 {
6991 new_item.SetResultOfSplit(true);
6992 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6994 new_item.SetQuantity(stack_max);
6995 new_item.PlaceOnSurface();
6996 }
6997 }
6998 }
6999 }
7000
7002 {
7004 return;
7005
7006 float split_quantity_new;
7010 InventoryLocation loc = new InventoryLocation;
7011
7012 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7013 {
7015 split_quantity_new = stack_max;
7016 else
7018
7019 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
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 if (destination_entity && slot_id == -1)
7029 {
7030 if (quantity > stack_max)
7031 split_quantity_new = stack_max;
7032 else
7033 split_quantity_new = quantity;
7034
7036 {
7039 }
7040
7041 if (new_item)
7042 {
7043 new_item.SetResultOfSplit(true);
7044 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7046 new_item.SetQuantity(split_quantity_new);
7047 }
7048 }
7049 else
7050 {
7051 if (stack_max != 0)
7052 {
7054 {
7056 }
7057
7059
7060 if (new_item)
7061 {
7062 new_item.SetResultOfSplit(true);
7063 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7065 new_item.SetQuantity(stack_max);
7066 new_item.PlaceOnSurface();
7067 }
7068 }
7069 }
7070 }
7071
7073 {
7075 return;
7076
7078 {
7079 if (ScriptInputUserData.CanStoreInputUserData())
7080 {
7081 ScriptInputUserData ctx = new ScriptInputUserData;
7086 dst.WriteToContext(ctx);
7088 }
7089 }
7090 else if (!
GetGame().IsMultiplayer())
7091 {
7093 }
7094 }
7095
7097 {
7099 return;
7100
7102 {
7103 if (ScriptInputUserData.CanStoreInputUserData())
7104 {
7105 ScriptInputUserData ctx = new ScriptInputUserData;
7110 ctx.
Write(destination_entity);
7116 }
7117 }
7118 else if (!
GetGame().IsMultiplayer())
7119 {
7121 }
7122 }
7123
7125 {
7127 }
7128
7130 {
7132 return this;
7133
7135 float split_quantity_new;
7137 if (dst.IsValid())
7138 {
7139 int slot_id = dst.GetSlot();
7141
7142 if (quantity > stack_max)
7143 split_quantity_new = stack_max;
7144 else
7145 split_quantity_new = quantity;
7146
7148
7149 if (new_item)
7150 {
7151 new_item.SetResultOfSplit(true);
7152 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7155 }
7156
7157 return new_item;
7158 }
7159
7160 return null;
7161 }
7162
7164 {
7166 return;
7167
7169 float split_quantity_new;
7171 if (destination_entity)
7172 {
7174 if (quantity > stackable)
7175 split_quantity_new = stackable;
7176 else
7177 split_quantity_new = quantity;
7178
7179 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7180 if (new_item)
7181 {
7182 new_item.SetResultOfSplit(true);
7183 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7185 new_item.SetQuantity(split_quantity_new);
7186 }
7187 }
7188 }
7189
7191 {
7193 return;
7194
7196 {
7197 if (ScriptInputUserData.CanStoreInputUserData())
7198 {
7199 ScriptInputUserData ctx = new ScriptInputUserData;
7204 ItemBase destination_entity =
this;
7205 ctx.
Write(destination_entity);
7209 }
7210 }
7211 else if (!
GetGame().IsMultiplayer())
7212 {
7214 }
7215 }
7216
7218 {
7220 return;
7221
7223 float split_quantity_new;
7225 if (player)
7226 {
7228 if (quantity > stackable)
7229 split_quantity_new = stackable;
7230 else
7231 split_quantity_new = quantity;
7232
7233 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7234 new_item =
ItemBase.Cast(in_hands);
7235 if (new_item)
7236 {
7237 new_item.SetResultOfSplit(true);
7238 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7240 new_item.SetQuantity(split_quantity_new);
7241 }
7242 }
7243 }
7244
7246 {
7248 return;
7249
7251 float split_quantity_new = Math.Floor(quantity * 0.5);
7252
7254
7255 if (new_item)
7256 {
7257 if (new_item.GetQuantityMax() < split_quantity_new)
7258 {
7259 split_quantity_new = new_item.GetQuantityMax();
7260 }
7261
7262 new_item.SetResultOfSplit(true);
7263 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7264
7266 {
7269 }
7270 else
7271 {
7274 }
7275 }
7276 }
7277
7279 {
7281 return;
7282
7284 float split_quantity_new = Math.Floor(quantity / 2);
7285
7286 InventoryLocation invloc = new InventoryLocation;
7288
7290 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7291
7292 if (new_item)
7293 {
7294 if (new_item.GetQuantityMax() < split_quantity_new)
7295 {
7296 split_quantity_new = new_item.GetQuantityMax();
7297 }
7299 {
7302 }
7303 else
7304 {
7307 }
7308 }
7309 }
7310
7313 {
7314 SetWeightDirty();
7316
7317 if (parent)
7318 parent.OnAttachmentQuantityChangedEx(this, delta);
7319
7321 {
7323 {
7325 }
7327 {
7328 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7330 }
7331 }
7332
7333 }
7334
7337 {
7338
7339 }
7340
7343 {
7345 }
7346
7348 {
7349 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7350
7352 {
7353 if (newLevel == GameConstants.STATE_RUINED)
7354 {
7356 EntityAI parent = GetHierarchyParent();
7357 if (parent && parent.IsFireplace())
7358 {
7359 CargoBase cargo = GetInventory().GetCargo();
7360 if (cargo)
7361 {
7363 {
7365 }
7366 }
7367 }
7368 }
7369
7371 {
7372
7374 return;
7375 }
7376
7377 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7378 {
7380 }
7381 }
7382 }
7383
7384
7386 {
7387 super.OnRightClick();
7388
7390 {
7392 {
7393 if (ScriptInputUserData.CanStoreInputUserData())
7394 {
7395 vector m4[4];
7397
7398 EntityAI root = GetHierarchyRoot();
7399
7400 InventoryLocation dst = new InventoryLocation;
7402 {
7403 if (root)
7404 {
7405 root.GetTransform(m4);
7407 }
7408 else
7409 GetInventory().GetCurrentInventoryLocation(dst);
7410 }
7411 else
7412 {
7414
7415
7416 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7417 {
7418 if (root)
7419 {
7420 root.GetTransform(m4);
7422 }
7423 else
7424 GetInventory().GetCurrentInventoryLocation(dst);
7425 }
7426 else
7427 {
7428 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7429 }
7430 }
7431
7432 ScriptInputUserData ctx = new ScriptInputUserData;
7440 }
7441 }
7442 else if (!
GetGame().IsMultiplayer())
7443 {
7445 }
7446 }
7447 }
7448
7449 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7450 {
7451
7452 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7453 return false;
7454
7455 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7456 return false;
7457
7458
7460 return false;
7461
7462
7463 Magazine mag = Magazine.Cast(this);
7464 if (mag)
7465 {
7466 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7467 return false;
7468
7469 if (stack_max_limit)
7470 {
7471 Magazine other_mag = Magazine.Cast(other_item);
7472 if (other_item)
7473 {
7474 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7475 return false;
7476 }
7477
7478 }
7479 }
7480 else
7481 {
7482
7484 return false;
7485
7487 return false;
7488 }
7489
7490 PlayerBase player = null;
7491 if (CastTo(player, GetHierarchyRootPlayer()))
7492 {
7493 if (player.GetInventory().HasAttachment(this))
7494 return false;
7495
7496 if (player.IsItemsToDelete())
7497 return false;
7498 }
7499
7500 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7501 return false;
7502
7503 int slotID;
7505 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7506 return false;
7507
7508 return true;
7509 }
7510
7512 {
7514 }
7515
7517 {
7518 return m_IsResultOfSplit;
7519 }
7520
7522 {
7523 m_IsResultOfSplit = value;
7524 }
7525
7527 {
7529 }
7530
7532 {
7533 float other_item_quantity = other_item.GetQuantity();
7534 float this_free_space;
7535
7537
7539
7540 if (other_item_quantity > this_free_space)
7541 {
7542 return this_free_space;
7543 }
7544 else
7545 {
7546 return other_item_quantity;
7547 }
7548 }
7549
7551 {
7553 }
7554
7556 {
7558 return;
7559
7560 if (!IsMagazine() && other_item)
7561 {
7563 if (quantity_used != 0)
7564 {
7565 float hp1 = GetHealth01("","");
7566 float hp2 = other_item.GetHealth01("","");
7567 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7568 hpResult = hpResult / (
GetQuantity() + quantity_used);
7569
7570 hpResult *= GetMaxHealth();
7571 Math.Round(hpResult);
7572 SetHealth("", "Health", hpResult);
7573
7575 other_item.AddQuantity(-quantity_used);
7576 }
7577 }
7579 }
7580
7582 {
7583 #ifdef SERVER
7584 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7585 GetHierarchyParent().IncreaseLifetimeUp();
7586 #endif
7587 };
7588
7590 {
7591 PlayerBase p = PlayerBase.Cast(player);
7592
7593 array<int> recipesIds = p.m_Recipes;
7594 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7595 if (moduleRecipesManager)
7596 {
7597 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7598 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7599 }
7600
7601 for (int i = 0;i < recipesIds.Count(); i++)
7602 {
7603 int key = recipesIds.Get(i);
7604 string recipeName = moduleRecipesManager.GetRecipeName(key);
7606 }
7607 }
7608
7609
7610 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7611 {
7612 super.GetDebugActions(outputList);
7613
7614
7619
7620
7624
7628
7629
7632
7633
7635 {
7638 }
7639
7641
7644
7648 }
7649
7650
7651
7652
7654 {
7655 super.OnAction(action_id, player, ctx);
7656 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7657 {
7658 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7659 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7660 PlayerBase p = PlayerBase.Cast(player);
7661 if (
EActions.RECIPES_RANGE_START < 1000)
7662 {
7663 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7664 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7665 }
7666 }
7667 #ifndef SERVER
7668 else if (action_id ==
EActions.WATCH_PLAYER)
7669 {
7670 PluginDeveloper.SetDeveloperItemClientEx(player);
7671 }
7672 #endif
7674 {
7675 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7676 {
7677 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7678 OnDebugButtonPressServer(id + 1);
7679 }
7680
7681 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7682 {
7683 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7685 }
7686
7687 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7688 {
7689 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7691 }
7692
7693 else if (action_id ==
EActions.ADD_QUANTITY)
7694 {
7695 if (IsMagazine())
7696 {
7697 Magazine mag = Magazine.Cast(this);
7698 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7699 }
7700 else
7701 {
7703 }
7704
7705 if (m_EM)
7706 {
7707 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7708 }
7709
7710 }
7711
7712 else if (action_id ==
EActions.REMOVE_QUANTITY)
7713 {
7714 if (IsMagazine())
7715 {
7716 Magazine mag2 = Magazine.Cast(this);
7717 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7718 }
7719 else
7720 {
7722 }
7723 if (m_EM)
7724 {
7725 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7726 }
7727
7728 }
7729
7730 else if (action_id ==
EActions.SET_QUANTITY_0)
7731 {
7733
7734 if (m_EM)
7735 {
7736 m_EM.SetEnergy(0);
7737 }
7738 }
7739
7740 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7741 {
7743
7744 if (m_EM)
7745 {
7746 m_EM.SetEnergy(m_EM.GetEnergyMax());
7747 }
7748 }
7749
7750 else if (action_id ==
EActions.ADD_HEALTH)
7751 {
7752 AddHealth("","",GetMaxHealth("","Health")/5);
7753 }
7754 else if (action_id ==
EActions.REMOVE_HEALTH)
7755 {
7756 AddHealth("","",-GetMaxHealth("","Health")/5);
7757 }
7758 else if (action_id ==
EActions.DESTROY_HEALTH)
7759 {
7760 SetHealth01("","",0);
7761 }
7762 else if (action_id ==
EActions.WATCH_ITEM)
7763 {
7765 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7766 #ifdef DEVELOPER
7767 SetDebugDeveloper_item(this);
7768 #endif
7769 }
7770
7771 else if (action_id ==
EActions.ADD_TEMPERATURE)
7772 {
7773 AddTemperature(20);
7774
7775 }
7776
7777 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7778 {
7779 AddTemperature(-20);
7780
7781 }
7782
7783 else if (action_id ==
EActions.FLIP_FROZEN)
7784 {
7785 SetFrozen(!GetIsFrozen());
7786
7787 }
7788
7789 else if (action_id ==
EActions.ADD_WETNESS)
7790 {
7792
7793 }
7794
7795 else if (action_id ==
EActions.REMOVE_WETNESS)
7796 {
7798
7799 }
7800
7801 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7802 {
7805
7806
7807 }
7808
7809 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7810 {
7813 }
7814
7815 else if (action_id ==
EActions.MAKE_SPECIAL)
7816 {
7817 auto debugParams = DebugSpawnParams.WithPlayer(player);
7818 OnDebugSpawnEx(debugParams);
7819 }
7820
7821 else if (action_id ==
EActions.DELETE)
7822 {
7823 Delete();
7824 }
7825
7826 }
7827
7828
7829 return false;
7830 }
7831
7832
7833
7834
7838
7841
7842
7843
7845 {
7846 return false;
7847 }
7848
7849
7851 {
7852 return true;
7853 }
7854
7855
7857 {
7858 return true;
7859 }
7860
7861
7862
7864 {
7865 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7867 }
7868
7871 {
7872 return null;
7873 }
7874
7876 {
7877 return false;
7878 }
7879
7881 {
7882 return false;
7883 }
7884
7888
7889
7891 {
7892 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7893 return module_repairing.CanRepair(this, item_repair_kit);
7894 }
7895
7896
7897 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7898 {
7899 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7900 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7901 }
7902
7903
7905 {
7906
7907
7908
7909
7910
7911
7912
7913
7914 return 1;
7915 }
7916
7917
7918
7920 {
7922 }
7923
7924
7925
7927 {
7929 }
7930
7931
7940 {
7941 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7942
7943 if (player)
7944 {
7945 player.MessageStatus(text);
7946 }
7947 }
7948
7949
7958 {
7959 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7960
7961 if (player)
7962 {
7963 player.MessageAction(text);
7964 }
7965 }
7966
7967
7976 {
7977 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7978
7979 if (player)
7980 {
7981 player.MessageFriendly(text);
7982 }
7983 }
7984
7985
7994 {
7995 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7996
7997 if (player)
7998 {
7999 player.MessageImportant(text);
8000 }
8001 }
8002
8004 {
8005 return true;
8006 }
8007
8008
8009 override bool KindOf(
string tag)
8010 {
8011 bool found = false;
8012 string item_name = this.
GetType();
8015
8016 int array_size = item_tag_array.Count();
8017 for (int i = 0; i < array_size; i++)
8018 {
8019 if (item_tag_array.Get(i) == tag)
8020 {
8021 found = true;
8022 break;
8023 }
8024 }
8025 return found;
8026 }
8027
8028
8030 {
8031
8032 super.OnRPC(sender, rpc_type,ctx);
8033
8034
8035 switch (rpc_type)
8036 {
8037 #ifndef SERVER
8038 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8039 Param2<bool, string> p = new Param2<bool, string>(false, "");
8040
8042 return;
8043
8044 bool play = p.param1;
8045 string soundSet = p.param2;
8046
8047 if (play)
8048 {
8050 {
8052 {
8054 }
8055 }
8056 else
8057 {
8059 }
8060 }
8061 else
8062 {
8064 }
8065
8066 break;
8067 #endif
8068
8069 }
8070
8072 {
8074 }
8075 }
8076
8077
8078
8079
8081 {
8082 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8083 return plugin.GetID(
name);
8084 }
8085
8087 {
8088 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8089 return plugin.GetName(id);
8090 }
8091
8094 {
8095
8096
8097 int varFlags;
8098 if (!ctx.
Read(varFlags))
8099 return;
8100
8101 if (varFlags & ItemVariableFlags.FLOAT)
8102 {
8104 }
8105 }
8106
8108 {
8109
8110 super.SerializeNumericalVars(floats_out);
8111
8112
8113
8115 {
8117 }
8118
8120 {
8122 }
8123
8125 {
8127 }
8128
8130 {
8135 }
8136
8138 {
8140 }
8141 }
8142
8144 {
8145
8146 super.DeSerializeNumericalVars(floats);
8147
8148
8149 int index = 0;
8150 int mask = Math.Round(floats.Get(index));
8151
8152 index++;
8153
8155 {
8157 {
8159 }
8160 else
8161 {
8162 float quantity = floats.Get(index);
8164 }
8165 index++;
8166 }
8167
8169 {
8170 float wet = floats.Get(index);
8172 index++;
8173 }
8174
8176 {
8177 int liquidtype = Math.Round(floats.Get(index));
8179 index++;
8180 }
8181
8183 {
8185 index++;
8187 index++;
8189 index++;
8191 index++;
8192 }
8193
8195 {
8196 int cleanness = Math.Round(floats.Get(index));
8198 index++;
8199 }
8200 }
8201
8203 {
8204 super.WriteVarsToCTX(ctx);
8205
8206
8208 {
8210 }
8211
8213 {
8215 }
8216
8218 {
8220 }
8221
8223 {
8224 int r,g,b,a;
8230 }
8231
8233 {
8235 }
8236 }
8237
8239 {
8240 if (!super.ReadVarsFromCTX(ctx,version))
8241 return false;
8242
8243 int intValue;
8244 float value;
8245
8246 if (version < 140)
8247 {
8248 if (!ctx.
Read(intValue))
8249 return false;
8250
8251 m_VariablesMask = intValue;
8252 }
8253
8255 {
8256 if (!ctx.
Read(value))
8257 return false;
8258
8260 {
8262 }
8263 else
8264 {
8266 }
8267 }
8268
8269 if (version < 140)
8270 {
8272 {
8273 if (!ctx.
Read(value))
8274 return false;
8275 SetTemperatureDirect(value);
8276 }
8277 }
8278
8280 {
8281 if (!ctx.
Read(value))
8282 return false;
8284 }
8285
8287 {
8288 if (!ctx.
Read(intValue))
8289 return false;
8291 }
8292
8294 {
8295 int r,g,b,a;
8297 return false;
8299 return false;
8301 return false;
8303 return false;
8304
8306 }
8307
8309 {
8310 if (!ctx.
Read(intValue))
8311 return false;
8313 }
8314
8315 if (version >= 138 && version < 140)
8316 {
8318 {
8319 if (!ctx.
Read(intValue))
8320 return false;
8321 SetFrozen(intValue);
8322 }
8323 }
8324
8325 return true;
8326 }
8327
8328
8330 {
8333 {
8335 }
8336
8337 if (!super.OnStoreLoad(ctx, version))
8338 {
8340 return false;
8341 }
8342
8343 if (version >= 114)
8344 {
8345 bool hasQuickBarIndexSaved;
8346
8347 if (!ctx.
Read(hasQuickBarIndexSaved))
8348 {
8350 return false;
8351 }
8352
8353 if (hasQuickBarIndexSaved)
8354 {
8355 int itmQBIndex;
8356
8357
8358 if (!ctx.
Read(itmQBIndex))
8359 {
8361 return false;
8362 }
8363
8364 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8365 if (itmQBIndex != -1 && parentPlayer)
8366 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8367 }
8368 }
8369 else
8370 {
8371
8372 PlayerBase player;
8373 int itemQBIndex;
8374 if (version ==
int.
MAX)
8375 {
8376 if (!ctx.
Read(itemQBIndex))
8377 {
8379 return false;
8380 }
8381 }
8382 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8383 {
8384
8385 if (!ctx.
Read(itemQBIndex))
8386 {
8388 return false;
8389 }
8390 if (itemQBIndex != -1 && player)
8391 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8392 }
8393 }
8394
8395 if (version < 140)
8396 {
8397
8398 if (!LoadVariables(ctx, version))
8399 {
8401 return false;
8402 }
8403 }
8404
8405
8407 {
8409 return false;
8410 }
8411 if (version >= 132)
8412 {
8414 if (raib)
8415 {
8417 {
8419 return false;
8420 }
8421 }
8422 }
8423
8425 return true;
8426 }
8427
8428
8429
8431 {
8432 super.OnStoreSave(ctx);
8433
8434 PlayerBase player;
8435 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8436 {
8438
8439 int itemQBIndex = -1;
8440 itemQBIndex = player.FindQuickBarEntityIndex(this);
8441 ctx.
Write(itemQBIndex);
8442 }
8443 else
8444 {
8446 }
8447
8449
8451 if (raib)
8452 {
8454 }
8455 }
8456
8457
8459 {
8460 super.AfterStoreLoad();
8461
8463 {
8465 }
8466
8468 {
8471 }
8472 }
8473
8475 {
8476 super.EEOnAfterLoad();
8477
8479 {
8481 }
8482
8485 }
8486
8488 {
8489 return false;
8490 }
8491
8492
8493
8495 {
8497 {
8498 #ifdef PLATFORM_CONSOLE
8499
8501 {
8503 if (menu)
8504 {
8506 }
8507 }
8508 #endif
8509 }
8510
8512 {
8515 }
8516
8518 {
8519 SetWeightDirty();
8521 }
8523 {
8526 }
8527
8529 {
8532 }
8534 {
8537 }
8538
8539 super.OnVariablesSynchronized();
8540 }
8541
8542
8543
8545 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8546 {
8547 if (!IsServerCheck(allow_client))
8548 return false;
8549
8551 return false;
8552
8555
8556 if (value <= (min + 0.001))
8557 value = min;
8558
8559 if (value == min)
8560 {
8561 if (destroy_config)
8562 {
8563 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8564 if (dstr)
8565 {
8567 this.Delete();
8568 return true;
8569 }
8570 }
8571 else if (destroy_forced)
8572 {
8574 this.Delete();
8575 return true;
8576 }
8577
8579 }
8580
8583
8585 {
8587
8588 if (delta)
8590 }
8591
8593
8594 return false;
8595 }
8596
8597
8599 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8600 {
8602 }
8603
8605 {
8608 }
8609
8611 {
8614 }
8615
8618 {
8619 float value_clamped = Math.Clamp(value, 0, 1);
8621 SetQuantity(result, destroy_config, destroy_forced);
8622 }
8623
8624
8627 {
8629 }
8630
8632 {
8634 }
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8646 {
8647 int slot = -1;
8648 if (GetInventory())
8649 {
8650 InventoryLocation il = new InventoryLocation;
8651 GetInventory().GetCurrentInventoryLocation(il);
8653 }
8654
8656 }
8657
8659 {
8660 float quantity_max = 0;
8661
8663 {
8664 if (attSlotID != -1)
8665 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8666
8667 if (quantity_max <= 0)
8669 }
8670
8671 if (quantity_max <= 0)
8673
8674 return quantity_max;
8675 }
8676
8678 {
8680 }
8681
8683 {
8685 }
8686
8687
8689 {
8691 }
8692
8694 {
8696 }
8697
8699 {
8701 }
8702
8703
8705 {
8706
8707 float weightEx = GetWeightEx();
8708 float special = GetInventoryAndCargoWeight();
8709 return weightEx - special;
8710 }
8711
8712
8714 {
8716 }
8717
8719 {
8721 {
8722 #ifdef DEVELOPER
8723 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8724 {
8725 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8727 }
8728 #endif
8729
8731 }
8732 else if (HasEnergyManager())
8733 {
8734 #ifdef DEVELOPER
8735 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8736 {
8737 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8738 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8739 }
8740 #endif
8741 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8742 }
8743 else
8744 {
8745 #ifdef DEVELOPER
8746 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8747 {
8748 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8749 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8750 }
8751 #endif
8752 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8753 }
8754 }
8755
8758 {
8759 int item_count = 0;
8761
8762 if (GetInventory().GetCargo() != NULL)
8763 {
8764 item_count = GetInventory().GetCargo().GetItemCount();
8765 }
8766
8767 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8768 {
8769 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8770 if (item)
8771 item_count += item.GetNumberOfItems();
8772 }
8773 return item_count;
8774 }
8775
8778 {
8779 float weight = 0;
8780 float wetness = 1;
8781 if (include_wetness)
8784 {
8785 weight = wetness * m_ConfigWeight;
8786 }
8788 {
8789 weight = 1;
8790 }
8791 return weight;
8792 }
8793
8794
8795
8797 {
8798 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8799 {
8800 GameInventory inv = GetInventory();
8801 array<EntityAI> items = new array<EntityAI>;
8803 for (int i = 0; i < items.Count(); i++)
8804 {
8806 if (item)
8807 {
8809 }
8810 }
8811 }
8812 }
8813
8814
8815
8816
8818 {
8819 float energy = 0;
8820 if (HasEnergyManager())
8821 {
8822 energy = GetCompEM().GetEnergy();
8823 }
8824 return energy;
8825 }
8826
8827
8829 {
8830 super.OnEnergyConsumed();
8831
8833 }
8834
8836 {
8837 super.OnEnergyAdded();
8838
8840 }
8841
8842
8844 {
8845 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8846 {
8848 {
8849 float energy_0to1 = GetCompEM().GetEnergy0To1();
8851 }
8852 }
8853 }
8854
8855
8857 {
8858 return ConfigGetFloat("heatIsolation");
8859 }
8860
8862 {
8864 }
8865
8867 {
8868 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8869 if (
GetGame().ConfigIsExisting(paramPath))
8871
8872 return 0.0;
8873 }
8874
8876 {
8877 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8878 if (
GetGame().ConfigIsExisting(paramPath))
8880
8881 return 0.0;
8882 }
8883
8884 override void SetWet(
float value,
bool allow_client =
false)
8885 {
8886 if (!IsServerCheck(allow_client))
8887 return;
8888
8891
8893
8894 m_VarWet = Math.Clamp(value, min, max);
8895
8897 {
8900 }
8901 }
8902
8903 override void AddWet(
float value)
8904 {
8906 }
8907
8909 {
8911 }
8912
8914 {
8916 }
8917
8919 {
8921 }
8922
8924 {
8926 }
8927
8929 {
8931 }
8932
8934 {
8937 if (newLevel != oldLevel)
8938 {
8940 }
8941 }
8942
8944 {
8945 SetWeightDirty();
8946 }
8947
8949 {
8950 return GetWetLevelInternal(
m_VarWet);
8951 }
8952
8953
8954
8956 {
8958 }
8959
8961 {
8963 }
8964
8966 {
8968 }
8969
8971 {
8973 }
8974
8975
8976
8978 {
8979 if (ConfigIsExisting("itemModelLength"))
8980 {
8981 return ConfigGetFloat("itemModelLength");
8982 }
8983 return 0;
8984 }
8985
8987 {
8988 if (ConfigIsExisting("itemAttachOffset"))
8989 {
8990 return ConfigGetFloat("itemAttachOffset");
8991 }
8992 return 0;
8993 }
8994
8995 override void SetCleanness(
int value,
bool allow_client =
false)
8996 {
8997 if (!IsServerCheck(allow_client))
8998 return;
8999
9001
9003
9006 }
9007
9009 {
9011 }
9012
9014 {
9015 return true;
9016 }
9017
9018
9019
9020
9022 {
9024 }
9025
9027 {
9029 }
9030
9031
9032
9033
9034 override void SetColor(
int r,
int g,
int b,
int a)
9035 {
9041 }
9043 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9044 {
9049 }
9050
9052 {
9054 }
9055
9058 {
9059 int r,g,b,a;
9061 r = r/255;
9062 g = g/255;
9063 b = b/255;
9064 a = a/255;
9065 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9066 }
9067
9068
9069
9070 override void SetLiquidType(
int value,
bool allow_client =
false)
9071 {
9072 if (!IsServerCheck(allow_client))
9073 return;
9074
9079 }
9080
9082 {
9083 return ConfigGetInt("varLiquidTypeInit");
9084 }
9085
9087 {
9089 }
9090
9092 {
9094 SetFrozen(false);
9095 }
9096
9099 {
9100 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9101 }
9102
9103
9106 {
9107 PlayerBase nplayer;
9108 if (PlayerBase.CastTo(nplayer, player))
9109 {
9111
9112 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9113 }
9114 }
9115
9116
9119 {
9120 PlayerBase nplayer;
9121 if (PlayerBase.CastTo(nplayer,player))
9122 {
9123
9124 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9125
9126 }
9127
9128
9129 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9130
9131
9132 if (HasEnergyManager())
9133 {
9134 GetCompEM().UpdatePlugState();
9135 }
9136 }
9137
9138
9140 {
9141 super.OnPlacementStarted(player);
9142
9144 }
9145
9146 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9147 {
9149 {
9150 m_AdminLog.OnPlacementComplete(player,
this);
9151 }
9152
9153 super.OnPlacementComplete(player, position, orientation);
9154 }
9155
9156
9157
9158
9159
9161 {
9163 {
9164 return true;
9165 }
9166 else
9167 {
9168 return false;
9169 }
9170 }
9171
9172
9174 {
9176 {
9178 }
9179 }
9180
9181
9183 {
9185 }
9186
9188 {
9190 }
9191
9192 override void InsertAgent(
int agent,
float count = 1)
9193 {
9194 if (count < 1)
9195 return;
9196
9198 }
9199
9202 {
9204 }
9205
9206
9208 {
9210 }
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9254 {
9256 return false;
9257 return true;
9258 }
9259
9261 {
9262
9264 }
9265
9266
9269 {
9270 super.CheckForRoofLimited(timeTresholdMS);
9271
9273 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9274 {
9275 m_PreviousRoofTestTime = time;
9276 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9277 }
9278 }
9279
9280
9282 {
9284 {
9285 return 0;
9286 }
9287
9288 if (GetInventory().GetAttachmentSlotsCount() != 0)
9289 {
9290 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9291 if (filter)
9292 return filter.GetProtectionLevel(type, false, system);
9293 else
9294 return 0;
9295 }
9296
9297 string subclassPath, entryName;
9298
9299 switch (type)
9300 {
9302 entryName = "biological";
9303 break;
9305 entryName = "chemical";
9306 break;
9307 default:
9308 entryName = "biological";
9309 break;
9310 }
9311
9312 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9313
9315 }
9316
9317
9318
9321 {
9322 if (!IsMagazine())
9324
9326 }
9327
9328
9329
9330
9331
9336 {
9337 return true;
9338 }
9339
9341 {
9343 }
9344
9345
9346
9347
9348
9350 {
9351 if (parent)
9352 {
9353 if (parent.IsInherited(DayZInfected))
9354 return true;
9355
9356 if (!parent.IsRuined())
9357 return true;
9358 }
9359
9360 return true;
9361 }
9362
9364 {
9365 if (!super.CanPutAsAttachment(parent))
9366 {
9367 return false;
9368 }
9369
9370 if (!IsRuined() && !parent.IsRuined())
9371 {
9372 return true;
9373 }
9374
9375 return false;
9376 }
9377
9379 {
9380
9381
9382
9383
9384 return super.CanReceiveItemIntoCargo(item);
9385 }
9386
9388 {
9389
9390
9391
9392
9393 GameInventory attachmentInv = attachment.GetInventory();
9395 {
9396 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9397 return false;
9398 }
9399
9400 InventoryLocation loc = new InventoryLocation();
9401 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9402 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9403 return false;
9404
9405 return super.CanReceiveAttachment(attachment, slotId);
9406 }
9407
9409 {
9410 if (!super.CanReleaseAttachment(attachment))
9411 return false;
9412
9413 return GetInventory().AreChildrenAccessible();
9414 }
9415
9416
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9437 {
9438 int id = muzzle_owner.GetMuzzleID();
9439 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9440
9441 if (WPOF_array)
9442 {
9443 for (int i = 0; i < WPOF_array.Count(); i++)
9444 {
9445 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9446
9447 if (WPOF)
9448 {
9449 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9450 }
9451 }
9452 }
9453 }
9454
9455
9457 {
9458 int id = muzzle_owner.GetMuzzleID();
9460
9461 if (WPOBE_array)
9462 {
9463 for (int i = 0; i < WPOBE_array.Count(); i++)
9464 {
9465 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9466
9467 if (WPOBE)
9468 {
9469 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9470 }
9471 }
9472 }
9473 }
9474
9475
9477 {
9478 int id = muzzle_owner.GetMuzzleID();
9479 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9480
9481 if (WPOOH_array)
9482 {
9483 for (int i = 0; i < WPOOH_array.Count(); i++)
9484 {
9485 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9486
9487 if (WPOOH)
9488 {
9489 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9490 }
9491 }
9492 }
9493 }
9494
9495
9497 {
9498 int id = muzzle_owner.GetMuzzleID();
9499 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9500
9501 if (WPOOH_array)
9502 {
9503 for (int i = 0; i < WPOOH_array.Count(); i++)
9504 {
9505 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9506
9507 if (WPOOH)
9508 {
9509 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9510 }
9511 }
9512 }
9513 }
9514
9515
9517 {
9518 int id = muzzle_owner.GetMuzzleID();
9519 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9520
9521 if (WPOOH_array)
9522 {
9523 for (int i = 0; i < WPOOH_array.Count(); i++)
9524 {
9525 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9526
9527 if (WPOOH)
9528 {
9529 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9530 }
9531 }
9532 }
9533 }
9534
9535
9536
9538 {
9540 {
9541 return true;
9542 }
9543
9544 return false;
9545 }
9546
9548 {
9550 {
9551 return true;
9552 }
9553
9554 return false;
9555 }
9556
9558 {
9560 {
9561 return true;
9562 }
9563
9564 return false;
9565 }
9566
9568 {
9569 return false;
9570 }
9571
9574 {
9575 return UATimeSpent.DEFAULT_DEPLOY;
9576 }
9577
9578
9579
9580
9582 {
9584 SetSynchDirty();
9585 }
9586
9588 {
9590 }
9591
9592
9594 {
9595 return false;
9596 }
9597
9600 {
9601 string att_type = "None";
9602
9603 if (ConfigIsExisting("soundAttType"))
9604 {
9605 att_type = ConfigGetString("soundAttType");
9606 }
9607
9609 }
9610
9612 {
9614 }
9615
9616
9617
9618
9619
9623
9625 {
9628
9630 }
9631
9632
9634 {
9636 return;
9637
9639
9642
9645
9646 SoundParameters params = new SoundParameters();
9650 }
9651
9652
9654 {
9656 return;
9657
9659 SetSynchDirty();
9660
9663 }
9664
9665
9667 {
9669 return;
9670
9672 SetSynchDirty();
9673
9676 }
9677
9679 {
9681 }
9682
9684 {
9686 }
9687
9690 {
9691 if (!
GetGame().IsDedicatedServer())
9692 {
9693 if (ConfigIsExisting("attachSoundSet"))
9694 {
9695 string cfg_path = "";
9696 string soundset = "";
9698
9701 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9702 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9703
9704 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9705 {
9706 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9707 {
9708 if (cfg_slot_array[i] == slot_type)
9709 {
9710 soundset = cfg_soundset_array[i];
9711 break;
9712 }
9713 }
9714 }
9715
9716 if (soundset != "")
9717 {
9718 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9720 }
9721 }
9722 }
9723 }
9724
9726 {
9727
9728 }
9729
9730 void OnApply(PlayerBase player);
9731
9733 {
9734 return 1.0;
9735 };
9736
9738 {
9740 }
9741
9743 {
9745 }
9746
9748
9750 {
9751 SetDynamicPhysicsLifeTime(0.01);
9753 }
9754
9756 {
9757 array<string> zone_names = new array<string>;
9758 GetDamageZones(zone_names);
9759 for (int i = 0; i < zone_names.Count(); i++)
9760 {
9761 SetHealthMax(zone_names.Get(i),"Health");
9762 }
9763 SetHealthMax("","Health");
9764 }
9765
9768 {
9769 float global_health = GetHealth01("","Health");
9770 array<string> zones = new array<string>;
9771 GetDamageZones(zones);
9772
9773 for (int i = 0; i < zones.Count(); i++)
9774 {
9775 SetHealth01(zones.Get(i),"Health",global_health);
9776 }
9777 }
9778
9781 {
9782 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9783 }
9784
9786 {
9787 if (!hasRootAsPlayer)
9788 {
9789 if (refParentIB)
9790 {
9791
9792 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9793 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9794
9795 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9796 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9797
9800 }
9801 else
9802 {
9803
9806 }
9807 }
9808 }
9809
9811 {
9813 {
9814 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9815 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9816 {
9817 float heatPermCoef = 1.0;
9819 while (ent)
9820 {
9821 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9822 ent = ent.GetHierarchyParent();
9823 }
9824
9825 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9826 }
9827 }
9828 }
9829
9831 {
9832
9833 EntityAI parent = GetHierarchyParent();
9834 if (!parent)
9835 {
9836 hasParent = false;
9837 hasRootAsPlayer = false;
9838 }
9839 else
9840 {
9841 hasParent = true;
9842 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9843 refParentIB =
ItemBase.Cast(parent);
9844 }
9845 }
9846
9847 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9848 {
9849
9850 }
9851
9853 {
9854
9855 return false;
9856 }
9857
9859 {
9860
9861
9862 return false;
9863 }
9864
9866 {
9867
9868 return false;
9869 }
9870
9873 {
9874 return !GetIsFrozen() &&
IsOpen();
9875 }
9876
9878 {
9879 bool hasParent = false, hasRootAsPlayer = false;
9881
9882 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9883 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9884
9885 if (wwtu || foodDecay)
9886 {
9890
9891 if (processWetness || processTemperature || processDecay)
9892 {
9894
9895 if (processWetness)
9896 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9897
9898 if (processTemperature)
9900
9901 if (processDecay)
9902 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9903 }
9904 }
9905 }
9906
9909 {
9911 }
9912
9914 {
9917
9918 return super.GetTemperatureFreezeThreshold();
9919 }
9920
9922 {
9925
9926 return super.GetTemperatureThawThreshold();
9927 }
9928
9930 {
9933
9934 return super.GetItemOverheatThreshold();
9935 }
9936
9938 {
9940 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
9941
9942 return super.GetTemperatureFreezeTime();
9943 }
9944
9946 {
9948 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
9949
9950 return super.GetTemperatureThawTime();
9951 }
9952
9957
9959 {
9960 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
9961 }
9962
9964 {
9965 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
9966 }
9967
9970 {
9972 }
9973
9975 {
9977 }
9978
9980 {
9982 }
9983
9986 {
9987 return null;
9988 }
9989
9992 {
9993 return false;
9994 }
9995
9997 {
9999 {
10002 if (!trg)
10003 {
10005 explosive = this;
10006 }
10007
10008 explosive.PairRemote(trg);
10010
10011 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10012 trg.SetPersistentPairID(persistentID);
10013 explosive.SetPersistentPairID(persistentID);
10014
10015 return true;
10016 }
10017 return false;
10018 }
10019
10022 {
10023 float ret = 1.0;
10026 ret *= GetHealth01();
10027
10028 return ret;
10029 }
10030
10031 #ifdef DEVELOPER
10032 override void SetDebugItem()
10033 {
10034 super.SetDebugItem();
10035 _itemBase = this;
10036 }
10037
10039 {
10040 string text = super.GetDebugText();
10041
10043 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10044
10045 return text;
10046 }
10047 #endif
10048
10050 {
10051 return true;
10052 }
10053
10055
10057
10059 {
10062 }
10063
10064
10072
10088}
10089
10091{
10093 if (entity)
10094 {
10095 bool is_item = entity.IsInherited(
ItemBase);
10096 if (is_item && full_quantity)
10097 {
10100 }
10101 }
10102 else
10103 {
10105 return NULL;
10106 }
10107 return entity;
10108}
10109
10111{
10112 if (item)
10113 {
10114 if (health > 0)
10115 item.SetHealth("", "", health);
10116
10117 if (item.CanHaveTemperature())
10118 {
10120 if (item.CanFreeze())
10121 item.SetFrozen(false);
10122 }
10123
10124 if (item.HasEnergyManager())
10125 {
10126 if (quantity >= 0)
10127 {
10128 item.GetCompEM().SetEnergy0To1(quantity);
10129 }
10130 else
10131 {
10133 }
10134 }
10135 else if (item.IsMagazine())
10136 {
10137 Magazine mag = Magazine.Cast(item);
10138 if (quantity >= 0)
10139 {
10140 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10141 }
10142 else
10143 {
10145 }
10146
10147 }
10148 else
10149 {
10150 if (quantity >= 0)
10151 {
10152 item.SetQuantityNormalized(quantity, false);
10153 }
10154 else
10155 {
10157 }
10158
10159 }
10160 }
10161}
10162
10163#ifdef DEVELOPER
10165#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.