5334{
5336 {
5337 return true;
5338 }
5339};
5340
5341
5342
5344{
5348
5350
5353
5354
5355
5356
5357
5366
5372
5377
5382
5403 protected bool m_IsResultOfSplit
5404
5406
5411
5412
5413
5415
5419
5420
5421
5423
5426
5427
5428
5434
5435
5443
5446
5447
5449
5450
5452
5453
5458
5459
5464
5465
5467
5468
5470 {
5475
5476 if (!
GetGame().IsDedicatedServer())
5477 {
5479 {
5481
5483 {
5485 }
5486 }
5487
5490 }
5491
5492 m_OldLocation = null;
5493
5495 {
5497 }
5498
5499 if (ConfigIsExisting("headSelectionsToHide"))
5500 {
5503 }
5504
5506 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5507 {
5509 }
5510
5512
5513 m_IsResultOfSplit = false;
5514
5516 }
5517
5519 {
5520 super.InitItemVariables();
5521
5527 m_Count = ConfigGetInt(
"count");
5528
5531
5536
5539
5544
5556
5560
5561
5564 if (ConfigIsExisting("canBeSplit"))
5565 {
5568 }
5569
5571 if (ConfigIsExisting("itemBehaviour"))
5573
5574
5577 RegisterNetSyncVariableInt("m_VarLiquidType");
5578 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5579
5580 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5581 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5582 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5583
5584 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5585 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5586 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5587 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5588
5589 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5590 RegisterNetSyncVariableBool("m_IsTakeable");
5591 RegisterNetSyncVariableBool("m_IsHologram");
5592
5595 {
5598 }
5599
5601
5603 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5605
5606 }
5607
5609 {
5611 }
5612
5614 {
5617 {
5622 }
5623 }
5624
5625 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5626 {
5628 {
5631 }
5632
5634 }
5635
5637 {
5643 }
5644
5646
5648 {
5650
5651 if (!action)
5652 {
5653 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5654 return;
5655 }
5656
5658 if (!ai)
5659 {
5661 return;
5662 }
5663
5665 if (!action_array)
5666 {
5667 action_array = new array<ActionBase_Basic>;
5669 }
5670 if (LogManager.IsActionLogEnable())
5671 {
5672 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5673 }
5674
5675 if (action_array.Find(action) != -1)
5676 {
5677 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5678 }
5679 else
5680 {
5681 action_array.Insert(action);
5682 }
5683 }
5684
5686 {
5688 ActionBase action = player.GetActionManager().GetAction(actionName);
5691
5692 if (action_array)
5693 {
5694 action_array.RemoveItem(action);
5695 }
5696 }
5697
5698
5699
5701 {
5702 ActionOverrideData overrideData = new ActionOverrideData();
5706
5708 if (!actionMap)
5709 {
5712 }
5713
5714 actionMap.Insert(this.
Type(), overrideData);
5715
5716 }
5717
5719
5721
5722
5724 {
5727
5730
5731 string config_to_search = "CfgVehicles";
5732 string muzzle_owner_config;
5733
5735 {
5736 if (IsInherited(Weapon))
5737 config_to_search = "CfgWeapons";
5738
5739 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5740
5741 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5742
5744
5745 if (config_OnFire_subclass_count > 0)
5746 {
5747 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5748
5749 for (int i = 0; i < config_OnFire_subclass_count; i++)
5750 {
5751 string particle_class = "";
5753 string config_OnFire_entry = config_OnFire_class + particle_class;
5754 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5755 WPOF_array.Insert(WPOF);
5756 }
5757
5758
5760 }
5761 }
5762
5764 {
5765 config_to_search = "CfgWeapons";
5766 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5767
5768 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5769
5771
5772 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5773 {
5774 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5775
5776 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5777 {
5778 string particle_class2 = "";
5780 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5781 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5782 WPOBE_array.Insert(WPOBE);
5783 }
5784
5785
5787 }
5788 }
5789 }
5790
5791
5793 {
5796
5798 {
5799 string config_to_search = "CfgVehicles";
5800
5801 if (IsInherited(Weapon))
5802 config_to_search = "CfgWeapons";
5803
5804 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5805 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5806
5807 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5808 {
5809
5811
5813 {
5815 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5817 return;
5818 }
5819
5822
5823
5824
5826 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5827
5828 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5829 {
5830 string particle_class = "";
5832 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5834
5835 if (entry_type == CT_CLASS)
5836 {
5837 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5838 WPOOH_array.Insert(WPOF);
5839 }
5840 }
5841
5842
5844 }
5845 }
5846 }
5847
5849 {
5851 }
5852
5854 {
5856 {
5858
5861
5864
5865 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5866 }
5867 }
5868
5870 {
5872 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5873
5875 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5876
5878 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5879
5881 {
5883 }
5884 }
5885
5887 {
5889 }
5890
5892 {
5895 else
5897
5899 {
5902 }
5903 else
5904 {
5907
5910 }
5911
5913 }
5914
5916 {
5918 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5919 }
5920
5922 {
5924 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5926 }
5927
5929 {
5931 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5932 }
5933
5935 {
5938
5939 OverheatingParticle OP = new OverheatingParticle();
5944
5946 }
5947
5949 {
5952
5953 return -1;
5954 }
5955
5957 {
5959 {
5962
5963 for (int i = count; i > 0; --i)
5964 {
5965 int id = i - 1;
5968
5971
5972 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5973 {
5974 if (p)
5975 {
5978 }
5979 }
5980 }
5981 }
5982 }
5983
5985 {
5987 {
5989 {
5990 int id = i - 1;
5992
5993 if (OP)
5994 {
5996
5997 if (p)
5998 {
6000 }
6001
6002 delete OP;
6003 }
6004 }
6005
6008 }
6009 }
6010
6013 {
6014 return 0.0;
6015 }
6016
6017
6019 {
6020 return 250;
6021 }
6022
6024 {
6025 return 0;
6026 }
6027
6030 {
6032 return true;
6033
6034 return false;
6035 }
6036
6039 {
6042
6044 {
6046 }
6047 else
6048 {
6049
6051 }
6052
6054 }
6055
6062 {
6063 return -1;
6064 }
6065
6066
6067
6068
6070 {
6072 {
6074 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6075
6076 if (r_index >= 0)
6077 {
6078 InventoryLocation r_il = new InventoryLocation;
6079 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6080
6081 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6084 {
6085 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6086 }
6088 {
6089 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6090 }
6091
6092 }
6093
6094 player.GetHumanInventory().ClearUserReservedLocation(this);
6095 }
6096
6099 }
6100
6101
6102
6103
6105 {
6106 return ItemBase.m_DebugActionsMask;
6107 }
6108
6110 {
6111 return ItemBase.m_DebugActionsMask & mask;
6112 }
6113
6115 {
6116 ItemBase.m_DebugActionsMask = mask;
6117 }
6118
6120 {
6121 ItemBase.m_DebugActionsMask |= mask;
6122 }
6123
6125 {
6126 ItemBase.m_DebugActionsMask &= ~mask;
6127 }
6128
6130 {
6132 {
6134 }
6135 else
6136 {
6138 }
6139 }
6140
6141
6143 {
6144 if (GetEconomyProfile())
6145 {
6146 float q_max = GetEconomyProfile().GetQuantityMax();
6147 if (q_max > 0)
6148 {
6149 float q_min = GetEconomyProfile().GetQuantityMin();
6150 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6151
6153 {
6154 ComponentEnergyManager comp = GetCompEM();
6156 {
6158 }
6159 }
6161 {
6163
6164 }
6165
6166 }
6167 }
6168 }
6169
6172 {
6173 EntityAI parent = GetHierarchyParent();
6174
6175 if (parent)
6176 {
6177 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6178 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6179 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6180 }
6181 }
6182
6185 {
6186 EntityAI parent = GetHierarchyParent();
6187
6188 if (parent)
6189 {
6190 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6191 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6192 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6193 }
6194 }
6195
6197 {
6198
6199
6200
6201
6203
6205 {
6206 if (ScriptInputUserData.CanStoreInputUserData())
6207 {
6208 ScriptInputUserData ctx = new ScriptInputUserData;
6214 ctx.
Write(use_stack_max);
6217
6219 {
6220 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6221 }
6222 }
6223 }
6224 else if (!
GetGame().IsMultiplayer())
6225 {
6227 }
6228 }
6229
6231 {
6233 }
6234
6236 {
6238 }
6239
6241 {
6243 }
6244
6246 {
6247
6248 return false;
6249 }
6250
6252 {
6253 return false;
6254 }
6255
6259 {
6260 return false;
6261 }
6262
6264 {
6265 return "";
6266 }
6267
6269
6271 {
6272 return false;
6273 }
6274
6276 {
6277 return true;
6278 }
6279
6280
6281
6283 {
6284 return true;
6285 }
6286
6288 {
6289 return true;
6290 }
6291
6293 {
6294 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6296 }
6297
6299 {
6301 }
6302
6304 {
6306 if (!is_being_placed)
6308 SetSynchDirty();
6309 }
6310
6311
6313
6315 {
6317 }
6318
6320 {
6322 }
6323
6325 {
6326 return 1;
6327 }
6328
6330 {
6331 return false;
6332 }
6333
6335 {
6337 SetSynchDirty();
6338 }
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6375 {
6376 super.OnMovedInsideCargo(container);
6377
6378 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6379 }
6380
6381 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6382 {
6383 super.EEItemLocationChanged(oldLoc,newLoc);
6384
6385 PlayerBase new_player = null;
6386 PlayerBase old_player = null;
6387
6388 if (newLoc.GetParent())
6389 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6390
6391 if (oldLoc.GetParent())
6392 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6393
6395 {
6396 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6397
6398 if (r_index >= 0)
6399 {
6400 InventoryLocation r_il = new InventoryLocation;
6401 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6402
6403 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6406 {
6407 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6408 }
6410 {
6411 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6412 }
6413
6414 }
6415 }
6416
6418 {
6419 if (new_player)
6420 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6421
6422 if (new_player == old_player)
6423 {
6424
6425 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6426 {
6428 {
6429 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6430 {
6431 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6432 }
6433 }
6434 else
6435 {
6436 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6437 }
6438 }
6439
6440 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6441 {
6442 int type = oldLoc.GetType();
6444 {
6445 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6446 }
6448 {
6449 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6450 }
6451 }
6452 if (!m_OldLocation)
6453 {
6454 m_OldLocation = new InventoryLocation;
6455 }
6456 m_OldLocation.Copy(oldLoc);
6457 }
6458 else
6459 {
6460 if (m_OldLocation)
6461 {
6462 m_OldLocation.Reset();
6463 }
6464 }
6465
6467 }
6468 else
6469 {
6470 if (new_player)
6471 {
6472 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6473 if (res_index >= 0)
6474 {
6475 InventoryLocation il = new InventoryLocation;
6476 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6478 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6481 {
6482 il.
GetParent().GetOnReleaseLock().Invoke(it);
6483 }
6485 {
6487 }
6488
6489 }
6490 }
6492 {
6493
6495 }
6496
6497 if (m_OldLocation)
6498 {
6499 m_OldLocation.Reset();
6500 }
6501 }
6502 }
6503
6504 override void EOnContact(IEntity other, Contact extra)
6505 {
6507 {
6508 int liquidType = -1;
6510 if (impactSpeed > 0.0)
6511 {
6513 #ifndef SERVER
6515 #else
6517 SetSynchDirty();
6518 #endif
6520 }
6521 }
6522
6523 #ifdef SERVER
6524 if (GetCompEM() && GetCompEM().IsPlugged())
6525 {
6526 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6527 GetCompEM().UnplugThis();
6528 }
6529 #endif
6530 }
6531
6533
6535 {
6537 }
6538
6540 {
6541
6542 }
6543
6545 {
6546 super.OnItemLocationChanged(old_owner, new_owner);
6547
6548 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6549 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6550
6551 if (!relatedPlayer && playerNew)
6552 relatedPlayer = playerNew;
6553
6554 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6555 {
6557 if (actionMgr)
6558 {
6559 ActionBase currentAction = actionMgr.GetRunningAction();
6560 if (currentAction)
6562 }
6563 }
6564
6565 Man ownerPlayerOld = null;
6566 Man ownerPlayerNew = null;
6567
6568 if (old_owner)
6569 {
6570 if (old_owner.
IsMan())
6571 {
6572 ownerPlayerOld = Man.Cast(old_owner);
6573 }
6574 else
6575 {
6576 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6577 }
6578 }
6579 else
6580 {
6582 {
6584
6585 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6586 {
6587 GetCompEM().UnplugThis();
6588 }
6589 }
6590 }
6591
6592 if (new_owner)
6593 {
6594 if (new_owner.
IsMan())
6595 {
6596 ownerPlayerNew = Man.Cast(new_owner);
6597 }
6598 else
6599 {
6600 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6601 }
6602 }
6603
6604 if (ownerPlayerOld != ownerPlayerNew)
6605 {
6606 if (ownerPlayerOld)
6607 {
6608 array<EntityAI> subItemsExit = new array<EntityAI>;
6610 for (int i = 0; i < subItemsExit.Count(); i++)
6611 {
6614 }
6615 }
6616
6617 if (ownerPlayerNew)
6618 {
6619 array<EntityAI> subItemsEnter = new array<EntityAI>;
6621 for (int j = 0; j < subItemsEnter.Count(); j++)
6622 {
6625 }
6626 }
6627 }
6628 else if (ownerPlayerNew != null)
6629 {
6630 PlayerBase nplayer;
6631 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6632 {
6633 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6635 for (int k = 0; k < subItemsUpdate.Count(); k++)
6636 {
6638 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6639 }
6640 }
6641 }
6642
6643 if (old_owner)
6644 old_owner.OnChildItemRemoved(this);
6645 if (new_owner)
6646 new_owner.OnChildItemReceived(this);
6647 }
6648
6649
6651 {
6652 super.EEDelete(parent);
6653 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6654 if (player)
6655 {
6657
6658 if (player.IsAlive())
6659 {
6660 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6661 if (r_index >= 0)
6662 {
6663 InventoryLocation r_il = new InventoryLocation;
6664 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6665
6666 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6669 {
6670 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6671 }
6673 {
6674 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6675 }
6676
6677 }
6678
6679 player.RemoveQuickBarEntityShortcut(this);
6680 }
6681 }
6682 }
6683
6685 {
6686 super.EEKilled(killer);
6687
6690 {
6691 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6692 {
6693 if (IsMagazine())
6694 {
6695 if (Magazine.Cast(this).GetAmmoCount() > 0)
6696 {
6698 }
6699 }
6700 else
6701 {
6703 }
6704 }
6705 }
6706 }
6707
6709 {
6710 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6711
6712 super.OnWasAttached(parent, slot_id);
6713
6716
6718 }
6719
6721 {
6722 super.OnWasDetached(parent, slot_id);
6723
6726 }
6727
6729 {
6730 int idx;
6733
6734 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6735 if (inventory_slots.Count() < 1)
6736 {
6737 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6738 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6739 }
6740 else
6741 {
6742 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6743 }
6744
6745 idx = inventory_slots.Find(slot);
6746 if (idx < 0)
6747 return "";
6748
6749 return attach_types.Get(idx);
6750 }
6751
6753 {
6754 int idx = -1;
6755 string slot;
6756
6759
6760 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6761 if (inventory_slots.Count() < 1)
6762 {
6763 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6764 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6765 }
6766 else
6767 {
6768 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6769 if (detach_types.Count() < 1)
6770 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6771 }
6772
6773 for (int i = 0; i < inventory_slots.Count(); i++)
6774 {
6775 slot = inventory_slots.Get(i);
6776 }
6777
6778 if (slot != "")
6779 {
6780 if (detach_types.Count() == 1)
6781 idx = 0;
6782 else
6783 idx = inventory_slots.Find(slot);
6784 }
6785 if (idx < 0)
6786 return "";
6787
6788 return detach_types.Get(idx);
6789 }
6790
6792 {
6793
6795
6796
6797 float min_time = 1;
6798 float max_time = 3;
6799 float delay = Math.RandomFloat(min_time, max_time);
6800
6801 explode_timer.Run(delay, this, "DoAmmoExplosion");
6802 }
6803
6805 {
6806 Magazine magazine = Magazine.Cast(this);
6807 int pop_sounds_count = 6;
6808 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6809
6810
6811 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6812 string sound_name = pop_sounds[ sound_idx ];
6814
6815
6816 magazine.ServerAddAmmoCount(-1);
6817
6818
6819 float min_temp_to_explode = 100;
6820
6821 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6822 {
6824 }
6825 }
6826
6827
6828 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6829 {
6830 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6831
6832 const int CHANCE_DAMAGE_CARGO = 4;
6833 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6834 const int CHANCE_DAMAGE_NOTHING = 2;
6835
6837 {
6838 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6839 int chances;
6840 int rnd;
6841
6842 if (GetInventory().GetCargo())
6843 {
6844 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6845 rnd = Math.RandomInt(0,chances);
6846
6847 if (rnd < CHANCE_DAMAGE_CARGO)
6848 {
6850 }
6851 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6852 {
6854 }
6855 }
6856 else
6857 {
6858 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6859 rnd = Math.RandomInt(0,chances);
6860
6861 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6862 {
6864 }
6865 }
6866 }
6867 }
6868
6870 {
6871 if (GetInventory().GetCargo())
6872 {
6873 int item_count = GetInventory().GetCargo().GetItemCount();
6874 if (item_count > 0)
6875 {
6876 int random_pick = Math.RandomInt(0, item_count);
6878 if (!item.IsExplosive())
6879 {
6880 item.AddHealth("","",damage);
6881 return true;
6882 }
6883 }
6884 }
6885 return false;
6886 }
6887
6889 {
6890 int attachment_count = GetInventory().AttachmentCount();
6891 if (attachment_count > 0)
6892 {
6893 int random_pick = Math.RandomInt(0, attachment_count);
6894 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6895 if (!attachment.IsExplosive())
6896 {
6897 attachment.AddHealth("","",damage);
6898 return true;
6899 }
6900 }
6901 return false;
6902 }
6903
6905 {
6907 }
6908
6910 {
6912 return GetInventory().CanRemoveEntity();
6913
6914 return false;
6915 }
6916
6918 {
6920 return;
6921
6923 {
6924 if (ScriptInputUserData.CanStoreInputUserData())
6925 {
6926 ScriptInputUserData ctx = new ScriptInputUserData;
6931 ctx.
Write(destination_entity);
6935 }
6936 }
6937 else if (!
GetGame().IsMultiplayer())
6938 {
6940 }
6941 }
6942
6944 {
6946 return;
6947
6948 float split_quantity_new;
6952 InventoryLocation loc = new InventoryLocation;
6953
6954 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6955 {
6957 split_quantity_new = stack_max;
6958 else
6960
6961 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6962 if (new_item)
6963 {
6964 new_item.SetResultOfSplit(true);
6965 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6967 new_item.SetQuantity(split_quantity_new);
6968 }
6969 }
6970 else if (destination_entity && slot_id == -1)
6971 {
6972 if (quantity > stack_max)
6973 split_quantity_new = stack_max;
6974 else
6975 split_quantity_new = quantity;
6976
6978 {
6981 }
6982
6983 if (new_item)
6984 {
6985 new_item.SetResultOfSplit(true);
6986 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6988 new_item.SetQuantity(split_quantity_new);
6989 }
6990 }
6991 else
6992 {
6993 if (stack_max != 0)
6994 {
6996 {
6998 }
6999
7000 if (split_quantity_new == 0)
7001 {
7002 if (!
GetGame().IsMultiplayer())
7003 player.PhysicalPredictiveDropItem(this);
7004 else
7005 player.ServerDropEntity(this);
7006 return;
7007 }
7008
7010
7011 if (new_item)
7012 {
7013 new_item.SetResultOfSplit(true);
7014 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7016 new_item.SetQuantity(stack_max);
7017 new_item.PlaceOnSurface();
7018 }
7019 }
7020 }
7021 }
7022
7024 {
7026 return;
7027
7028 float split_quantity_new;
7032 InventoryLocation loc = new InventoryLocation;
7033
7034 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7035 {
7037 split_quantity_new = stack_max;
7038 else
7040
7041 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7042 if (new_item)
7043 {
7044 new_item.SetResultOfSplit(true);
7045 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7047 new_item.SetQuantity(split_quantity_new);
7048 }
7049 }
7050 else if (destination_entity && slot_id == -1)
7051 {
7052 if (quantity > stack_max)
7053 split_quantity_new = stack_max;
7054 else
7055 split_quantity_new = quantity;
7056
7058 {
7061 }
7062
7063 if (new_item)
7064 {
7065 new_item.SetResultOfSplit(true);
7066 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7068 new_item.SetQuantity(split_quantity_new);
7069 }
7070 }
7071 else
7072 {
7073 if (stack_max != 0)
7074 {
7076 {
7078 }
7079
7081
7082 if (new_item)
7083 {
7084 new_item.SetResultOfSplit(true);
7085 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7087 new_item.SetQuantity(stack_max);
7088 new_item.PlaceOnSurface();
7089 }
7090 }
7091 }
7092 }
7093
7095 {
7097 return;
7098
7100 {
7101 if (ScriptInputUserData.CanStoreInputUserData())
7102 {
7103 ScriptInputUserData ctx = new ScriptInputUserData;
7108 dst.WriteToContext(ctx);
7110 }
7111 }
7112 else if (!
GetGame().IsMultiplayer())
7113 {
7115 }
7116 }
7117
7119 {
7121 return;
7122
7124 {
7125 if (ScriptInputUserData.CanStoreInputUserData())
7126 {
7127 ScriptInputUserData ctx = new ScriptInputUserData;
7132 ctx.
Write(destination_entity);
7138 }
7139 }
7140 else if (!
GetGame().IsMultiplayer())
7141 {
7143 }
7144 }
7145
7147 {
7149 }
7150
7152 {
7154 return this;
7155
7157 float split_quantity_new;
7159 if (dst.IsValid())
7160 {
7161 int slot_id = dst.GetSlot();
7163
7164 if (quantity > stack_max)
7165 split_quantity_new = stack_max;
7166 else
7167 split_quantity_new = quantity;
7168
7170
7171 if (new_item)
7172 {
7173 new_item.SetResultOfSplit(true);
7174 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7177 }
7178
7179 return new_item;
7180 }
7181
7182 return null;
7183 }
7184
7186 {
7188 return;
7189
7191 float split_quantity_new;
7193 if (destination_entity)
7194 {
7196 if (quantity > stackable)
7197 split_quantity_new = stackable;
7198 else
7199 split_quantity_new = quantity;
7200
7201 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7202 if (new_item)
7203 {
7204 new_item.SetResultOfSplit(true);
7205 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7207 new_item.SetQuantity(split_quantity_new);
7208 }
7209 }
7210 }
7211
7213 {
7215 return;
7216
7218 {
7219 if (ScriptInputUserData.CanStoreInputUserData())
7220 {
7221 ScriptInputUserData ctx = new ScriptInputUserData;
7226 ItemBase destination_entity =
this;
7227 ctx.
Write(destination_entity);
7231 }
7232 }
7233 else if (!
GetGame().IsMultiplayer())
7234 {
7236 }
7237 }
7238
7240 {
7242 return;
7243
7245 float split_quantity_new;
7247 if (player)
7248 {
7250 if (quantity > stackable)
7251 split_quantity_new = stackable;
7252 else
7253 split_quantity_new = quantity;
7254
7255 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7256 new_item =
ItemBase.Cast(in_hands);
7257 if (new_item)
7258 {
7259 new_item.SetResultOfSplit(true);
7260 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7262 new_item.SetQuantity(split_quantity_new);
7263 }
7264 }
7265 }
7266
7268 {
7270 return;
7271
7273 float split_quantity_new = Math.Floor(quantity * 0.5);
7274
7276
7277 if (new_item)
7278 {
7279 if (new_item.GetQuantityMax() < split_quantity_new)
7280 {
7281 split_quantity_new = new_item.GetQuantityMax();
7282 }
7283
7284 new_item.SetResultOfSplit(true);
7285 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7286
7288 {
7291 }
7292 else
7293 {
7296 }
7297 }
7298 }
7299
7301 {
7303 return;
7304
7306 float split_quantity_new = Math.Floor(quantity / 2);
7307
7308 InventoryLocation invloc = new InventoryLocation;
7310
7312 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7313
7314 if (new_item)
7315 {
7316 if (new_item.GetQuantityMax() < split_quantity_new)
7317 {
7318 split_quantity_new = new_item.GetQuantityMax();
7319 }
7321 {
7324 }
7325 else
7326 {
7329 }
7330 }
7331 }
7332
7335 {
7336 SetWeightDirty();
7338
7339 if (parent)
7340 parent.OnAttachmentQuantityChangedEx(this, delta);
7341
7343 {
7345 {
7347 }
7349 {
7350 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7352 }
7353 }
7354
7355 }
7356
7359 {
7360
7361 }
7362
7365 {
7367 }
7368
7370 {
7371 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7372
7374 {
7375 if (newLevel == GameConstants.STATE_RUINED)
7376 {
7378 EntityAI parent = GetHierarchyParent();
7379 if (parent && parent.IsFireplace())
7380 {
7381 CargoBase cargo = GetInventory().GetCargo();
7382 if (cargo)
7383 {
7385 {
7387 }
7388 }
7389 }
7390 }
7391
7393 {
7394
7396 return;
7397 }
7398
7399 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7400 {
7402 }
7403 }
7404 }
7405
7406
7408 {
7409 super.OnRightClick();
7410
7412 {
7414 {
7415 if (ScriptInputUserData.CanStoreInputUserData())
7416 {
7417 vector m4[4];
7419
7420 EntityAI root = GetHierarchyRoot();
7421
7422 InventoryLocation dst = new InventoryLocation;
7424 {
7425 if (root)
7426 {
7427 root.GetTransform(m4);
7429 }
7430 else
7431 GetInventory().GetCurrentInventoryLocation(dst);
7432 }
7433 else
7434 {
7436
7437
7438 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7439 {
7440 if (root)
7441 {
7442 root.GetTransform(m4);
7444 }
7445 else
7446 GetInventory().GetCurrentInventoryLocation(dst);
7447 }
7448 else
7449 {
7450 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7451 }
7452 }
7453
7454 ScriptInputUserData ctx = new ScriptInputUserData;
7462 }
7463 }
7464 else if (!
GetGame().IsMultiplayer())
7465 {
7467 }
7468 }
7469 }
7470
7471 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7472 {
7473
7474 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7475 return false;
7476
7477 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7478 return false;
7479
7480
7482 return false;
7483
7484
7485 Magazine mag = Magazine.Cast(this);
7486 if (mag)
7487 {
7488 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7489 return false;
7490
7491 if (stack_max_limit)
7492 {
7493 Magazine other_mag = Magazine.Cast(other_item);
7494 if (other_item)
7495 {
7496 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7497 return false;
7498 }
7499
7500 }
7501 }
7502 else
7503 {
7504
7506 return false;
7507
7509 return false;
7510 }
7511
7512 PlayerBase player = null;
7513 if (CastTo(player, GetHierarchyRootPlayer()))
7514 {
7515 if (player.GetInventory().HasAttachment(this))
7516 return false;
7517
7518 if (player.IsItemsToDelete())
7519 return false;
7520 }
7521
7522 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7523 return false;
7524
7525 int slotID;
7527 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7528 return false;
7529
7530 return true;
7531 }
7532
7534 {
7536 }
7537
7539 {
7540 return m_IsResultOfSplit;
7541 }
7542
7544 {
7545 m_IsResultOfSplit = value;
7546 }
7547
7549 {
7551 }
7552
7554 {
7555 float other_item_quantity = other_item.GetQuantity();
7556 float this_free_space;
7557
7559
7561
7562 if (other_item_quantity > this_free_space)
7563 {
7564 return this_free_space;
7565 }
7566 else
7567 {
7568 return other_item_quantity;
7569 }
7570 }
7571
7573 {
7575 }
7576
7578 {
7580 return;
7581
7582 if (!IsMagazine() && other_item)
7583 {
7585 if (quantity_used != 0)
7586 {
7587 float hp1 = GetHealth01("","");
7588 float hp2 = other_item.GetHealth01("","");
7589 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7590 hpResult = hpResult / (
GetQuantity() + quantity_used);
7591
7592 hpResult *= GetMaxHealth();
7593 Math.Round(hpResult);
7594 SetHealth("", "Health", hpResult);
7595
7597 other_item.AddQuantity(-quantity_used);
7598 }
7599 }
7601 }
7602
7604 {
7605 #ifdef SERVER
7606 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7607 GetHierarchyParent().IncreaseLifetimeUp();
7608 #endif
7609 };
7610
7612 {
7613 PlayerBase p = PlayerBase.Cast(player);
7614
7615 array<int> recipesIds = p.m_Recipes;
7616 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7617 if (moduleRecipesManager)
7618 {
7619 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7620 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7621 }
7622
7623 for (int i = 0;i < recipesIds.Count(); i++)
7624 {
7625 int key = recipesIds.Get(i);
7626 string recipeName = moduleRecipesManager.GetRecipeName(key);
7628 }
7629 }
7630
7631
7632 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7633 {
7634 super.GetDebugActions(outputList);
7635
7636
7641
7642
7646
7650
7651
7654
7655
7657 {
7660 }
7661
7663
7666
7670 }
7671
7672
7673
7674
7676 {
7677 super.OnAction(action_id, player, ctx);
7678 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7679 {
7680 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7681 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7682 PlayerBase p = PlayerBase.Cast(player);
7683 if (
EActions.RECIPES_RANGE_START < 1000)
7684 {
7685 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7686 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7687 }
7688 }
7689 #ifndef SERVER
7690 else if (action_id ==
EActions.WATCH_PLAYER)
7691 {
7692 PluginDeveloper.SetDeveloperItemClientEx(player);
7693 }
7694 #endif
7696 {
7697 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7698 {
7699 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7700 OnDebugButtonPressServer(id + 1);
7701 }
7702
7703 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7704 {
7705 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7707 }
7708
7709 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7710 {
7711 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7713 }
7714
7715 else if (action_id ==
EActions.ADD_QUANTITY)
7716 {
7717 if (IsMagazine())
7718 {
7719 Magazine mag = Magazine.Cast(this);
7720 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7721 }
7722 else
7723 {
7725 }
7726
7727 if (m_EM)
7728 {
7729 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7730 }
7731
7732 }
7733
7734 else if (action_id ==
EActions.REMOVE_QUANTITY)
7735 {
7736 if (IsMagazine())
7737 {
7738 Magazine mag2 = Magazine.Cast(this);
7739 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7740 }
7741 else
7742 {
7744 }
7745 if (m_EM)
7746 {
7747 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7748 }
7749
7750 }
7751
7752 else if (action_id ==
EActions.SET_QUANTITY_0)
7753 {
7755
7756 if (m_EM)
7757 {
7758 m_EM.SetEnergy(0);
7759 }
7760 }
7761
7762 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7763 {
7765
7766 if (m_EM)
7767 {
7768 m_EM.SetEnergy(m_EM.GetEnergyMax());
7769 }
7770 }
7771
7772 else if (action_id ==
EActions.ADD_HEALTH)
7773 {
7774 AddHealth("","",GetMaxHealth("","Health")/5);
7775 }
7776 else if (action_id ==
EActions.REMOVE_HEALTH)
7777 {
7778 AddHealth("","",-GetMaxHealth("","Health")/5);
7779 }
7780 else if (action_id ==
EActions.DESTROY_HEALTH)
7781 {
7782 SetHealth01("","",0);
7783 }
7784 else if (action_id ==
EActions.WATCH_ITEM)
7785 {
7787 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7788 #ifdef DEVELOPER
7789 SetDebugDeveloper_item(this);
7790 #endif
7791 }
7792
7793 else if (action_id ==
EActions.ADD_TEMPERATURE)
7794 {
7795 AddTemperature(20);
7796
7797 }
7798
7799 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7800 {
7801 AddTemperature(-20);
7802
7803 }
7804
7805 else if (action_id ==
EActions.FLIP_FROZEN)
7806 {
7807 SetFrozen(!GetIsFrozen());
7808
7809 }
7810
7811 else if (action_id ==
EActions.ADD_WETNESS)
7812 {
7814
7815 }
7816
7817 else if (action_id ==
EActions.REMOVE_WETNESS)
7818 {
7820
7821 }
7822
7823 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7824 {
7827
7828
7829 }
7830
7831 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7832 {
7835 }
7836
7837 else if (action_id ==
EActions.MAKE_SPECIAL)
7838 {
7839 auto debugParams = DebugSpawnParams.WithPlayer(player);
7840 OnDebugSpawnEx(debugParams);
7841 }
7842
7843 else if (action_id ==
EActions.DELETE)
7844 {
7845 Delete();
7846 }
7847
7848 }
7849
7850
7851 return false;
7852 }
7853
7854
7855
7856
7860
7863
7864
7865
7867 {
7868 return false;
7869 }
7870
7871
7873 {
7874 return true;
7875 }
7876
7877
7879 {
7880 return true;
7881 }
7882
7883
7884
7886 {
7887 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7889 }
7890
7893 {
7894 return null;
7895 }
7896
7898 {
7899 return false;
7900 }
7901
7903 {
7904 return false;
7905 }
7906
7910
7911
7913 {
7914 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7915 return module_repairing.CanRepair(this, item_repair_kit);
7916 }
7917
7918
7919 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7920 {
7921 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7922 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7923 }
7924
7925
7927 {
7928
7929
7930
7931
7932
7933
7934
7935
7936 return 1;
7937 }
7938
7939
7940
7942 {
7944 }
7945
7946
7947
7949 {
7951 }
7952
7953
7962 {
7963 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7964
7965 if (player)
7966 {
7967 player.MessageStatus(text);
7968 }
7969 }
7970
7971
7980 {
7981 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7982
7983 if (player)
7984 {
7985 player.MessageAction(text);
7986 }
7987 }
7988
7989
7998 {
7999 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8000
8001 if (player)
8002 {
8003 player.MessageFriendly(text);
8004 }
8005 }
8006
8007
8016 {
8017 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8018
8019 if (player)
8020 {
8021 player.MessageImportant(text);
8022 }
8023 }
8024
8026 {
8027 return true;
8028 }
8029
8030
8031 override bool KindOf(
string tag)
8032 {
8033 bool found = false;
8034 string item_name = this.
GetType();
8037
8038 int array_size = item_tag_array.Count();
8039 for (int i = 0; i < array_size; i++)
8040 {
8041 if (item_tag_array.Get(i) == tag)
8042 {
8043 found = true;
8044 break;
8045 }
8046 }
8047 return found;
8048 }
8049
8050
8052 {
8053
8054 super.OnRPC(sender, rpc_type,ctx);
8055
8056
8057 switch (rpc_type)
8058 {
8059 #ifndef SERVER
8060 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8061 Param2<bool, string> p = new Param2<bool, string>(false, "");
8062
8064 return;
8065
8066 bool play = p.param1;
8067 string soundSet = p.param2;
8068
8069 if (play)
8070 {
8072 {
8074 {
8076 }
8077 }
8078 else
8079 {
8081 }
8082 }
8083 else
8084 {
8086 }
8087
8088 break;
8089 #endif
8090
8091 }
8092
8094 {
8096 }
8097 }
8098
8099
8100
8101
8103 {
8104 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8105 return plugin.GetID(
name);
8106 }
8107
8109 {
8110 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8111 return plugin.GetName(id);
8112 }
8113
8116 {
8117
8118
8119 int varFlags;
8120 if (!ctx.
Read(varFlags))
8121 return;
8122
8123 if (varFlags & ItemVariableFlags.FLOAT)
8124 {
8126 }
8127 }
8128
8130 {
8131
8132 super.SerializeNumericalVars(floats_out);
8133
8134
8135
8137 {
8139 }
8140
8142 {
8144 }
8145
8147 {
8149 }
8150
8152 {
8157 }
8158
8160 {
8162 }
8163 }
8164
8166 {
8167
8168 super.DeSerializeNumericalVars(floats);
8169
8170
8171 int index = 0;
8172 int mask = Math.Round(floats.Get(index));
8173
8174 index++;
8175
8177 {
8179 {
8181 }
8182 else
8183 {
8184 float quantity = floats.Get(index);
8186 }
8187 index++;
8188 }
8189
8191 {
8192 float wet = floats.Get(index);
8194 index++;
8195 }
8196
8198 {
8199 int liquidtype = Math.Round(floats.Get(index));
8201 index++;
8202 }
8203
8205 {
8207 index++;
8209 index++;
8211 index++;
8213 index++;
8214 }
8215
8217 {
8218 int cleanness = Math.Round(floats.Get(index));
8220 index++;
8221 }
8222 }
8223
8225 {
8226 super.WriteVarsToCTX(ctx);
8227
8228
8230 {
8232 }
8233
8235 {
8237 }
8238
8240 {
8242 }
8243
8245 {
8246 int r,g,b,a;
8252 }
8253
8255 {
8257 }
8258 }
8259
8261 {
8262 if (!super.ReadVarsFromCTX(ctx,version))
8263 return false;
8264
8265 int intValue;
8266 float value;
8267
8268 if (version < 140)
8269 {
8270 if (!ctx.
Read(intValue))
8271 return false;
8272
8273 m_VariablesMask = intValue;
8274 }
8275
8277 {
8278 if (!ctx.
Read(value))
8279 return false;
8280
8282 {
8284 }
8285 else
8286 {
8288 }
8289 }
8290
8291 if (version < 140)
8292 {
8294 {
8295 if (!ctx.
Read(value))
8296 return false;
8297 SetTemperatureDirect(value);
8298 }
8299 }
8300
8302 {
8303 if (!ctx.
Read(value))
8304 return false;
8306 }
8307
8309 {
8310 if (!ctx.
Read(intValue))
8311 return false;
8313 }
8314
8316 {
8317 int r,g,b,a;
8319 return false;
8321 return false;
8323 return false;
8325 return false;
8326
8328 }
8329
8331 {
8332 if (!ctx.
Read(intValue))
8333 return false;
8335 }
8336
8337 if (version >= 138 && version < 140)
8338 {
8340 {
8341 if (!ctx.
Read(intValue))
8342 return false;
8343 SetFrozen(intValue);
8344 }
8345 }
8346
8347 return true;
8348 }
8349
8350
8352 {
8355 {
8357 }
8358
8359 if (!super.OnStoreLoad(ctx, version))
8360 {
8362 return false;
8363 }
8364
8365 if (version >= 114)
8366 {
8367 bool hasQuickBarIndexSaved;
8368
8369 if (!ctx.
Read(hasQuickBarIndexSaved))
8370 {
8372 return false;
8373 }
8374
8375 if (hasQuickBarIndexSaved)
8376 {
8377 int itmQBIndex;
8378
8379
8380 if (!ctx.
Read(itmQBIndex))
8381 {
8383 return false;
8384 }
8385
8386 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8387 if (itmQBIndex != -1 && parentPlayer)
8388 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8389 }
8390 }
8391 else
8392 {
8393
8394 PlayerBase player;
8395 int itemQBIndex;
8396 if (version ==
int.
MAX)
8397 {
8398 if (!ctx.
Read(itemQBIndex))
8399 {
8401 return false;
8402 }
8403 }
8404 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8405 {
8406
8407 if (!ctx.
Read(itemQBIndex))
8408 {
8410 return false;
8411 }
8412 if (itemQBIndex != -1 && player)
8413 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8414 }
8415 }
8416
8417 if (version < 140)
8418 {
8419
8420 if (!LoadVariables(ctx, version))
8421 {
8423 return false;
8424 }
8425 }
8426
8427
8429 {
8431 return false;
8432 }
8433 if (version >= 132)
8434 {
8436 if (raib)
8437 {
8439 {
8441 return false;
8442 }
8443 }
8444 }
8445
8447 return true;
8448 }
8449
8450
8451
8453 {
8454 super.OnStoreSave(ctx);
8455
8456 PlayerBase player;
8457 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8458 {
8460
8461 int itemQBIndex = -1;
8462 itemQBIndex = player.FindQuickBarEntityIndex(this);
8463 ctx.
Write(itemQBIndex);
8464 }
8465 else
8466 {
8468 }
8469
8471
8473 if (raib)
8474 {
8476 }
8477 }
8478
8479
8481 {
8482 super.AfterStoreLoad();
8483
8485 {
8487 }
8488
8490 {
8493 }
8494 }
8495
8497 {
8498 super.EEOnAfterLoad();
8499
8501 {
8503 }
8504
8507 }
8508
8510 {
8511 return false;
8512 }
8513
8514
8515
8517 {
8519 {
8520 #ifdef PLATFORM_CONSOLE
8521
8523 {
8525 if (menu)
8526 {
8528 }
8529 }
8530 #endif
8531 }
8532
8534 {
8537 }
8538
8540 {
8541 SetWeightDirty();
8543 }
8545 {
8548 }
8549
8551 {
8554 }
8556 {
8559 }
8560
8561 super.OnVariablesSynchronized();
8562 }
8563
8564
8565
8567 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8568 {
8569 if (!IsServerCheck(allow_client))
8570 return false;
8571
8573 return false;
8574
8577
8578 if (value <= (min + 0.001))
8579 value = min;
8580
8581 if (value == min)
8582 {
8583 if (destroy_config)
8584 {
8585 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8586 if (dstr)
8587 {
8589 this.Delete();
8590 return true;
8591 }
8592 }
8593 else if (destroy_forced)
8594 {
8596 this.Delete();
8597 return true;
8598 }
8599
8601 }
8602
8605
8607 {
8609
8610 if (delta)
8612 }
8613
8615
8616 return false;
8617 }
8618
8619
8621 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8622 {
8624 }
8625
8627 {
8630 }
8631
8633 {
8636 }
8637
8640 {
8641 float value_clamped = Math.Clamp(value, 0, 1);
8643 SetQuantity(result, destroy_config, destroy_forced);
8644 }
8645
8646
8649 {
8651 }
8652
8654 {
8656 }
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8668 {
8669 int slot = -1;
8670 if (GetInventory())
8671 {
8672 InventoryLocation il = new InventoryLocation;
8673 GetInventory().GetCurrentInventoryLocation(il);
8675 }
8676
8678 }
8679
8681 {
8682 float quantity_max = 0;
8683
8685 {
8686 if (attSlotID != -1)
8687 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8688
8689 if (quantity_max <= 0)
8691 }
8692
8693 if (quantity_max <= 0)
8695
8696 return quantity_max;
8697 }
8698
8700 {
8702 }
8703
8705 {
8707 }
8708
8709
8711 {
8713 }
8714
8716 {
8718 }
8719
8721 {
8723 }
8724
8725
8727 {
8728
8729 float weightEx = GetWeightEx();
8730 float special = GetInventoryAndCargoWeight();
8731 return weightEx - special;
8732 }
8733
8734
8736 {
8738 }
8739
8741 {
8743 {
8744 #ifdef DEVELOPER
8745 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8746 {
8747 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8749 }
8750 #endif
8751
8753 }
8754 else if (HasEnergyManager())
8755 {
8756 #ifdef DEVELOPER
8757 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8758 {
8759 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8760 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8761 }
8762 #endif
8763 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8764 }
8765 else
8766 {
8767 #ifdef DEVELOPER
8768 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8769 {
8770 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8771 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8772 }
8773 #endif
8774 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8775 }
8776 }
8777
8780 {
8781 int item_count = 0;
8783
8784 if (GetInventory().GetCargo() != NULL)
8785 {
8786 item_count = GetInventory().GetCargo().GetItemCount();
8787 }
8788
8789 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8790 {
8791 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8792 if (item)
8793 item_count += item.GetNumberOfItems();
8794 }
8795 return item_count;
8796 }
8797
8800 {
8801 float weight = 0;
8802 float wetness = 1;
8803 if (include_wetness)
8806 {
8807 weight = wetness * m_ConfigWeight;
8808 }
8810 {
8811 weight = 1;
8812 }
8813 return weight;
8814 }
8815
8816
8817
8819 {
8820 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8821 {
8822 GameInventory inv = GetInventory();
8823 array<EntityAI> items = new array<EntityAI>;
8825 for (int i = 0; i < items.Count(); i++)
8826 {
8828 if (item)
8829 {
8831 }
8832 }
8833 }
8834 }
8835
8836
8837
8838
8840 {
8841 float energy = 0;
8842 if (HasEnergyManager())
8843 {
8844 energy = GetCompEM().GetEnergy();
8845 }
8846 return energy;
8847 }
8848
8849
8851 {
8852 super.OnEnergyConsumed();
8853
8855 }
8856
8858 {
8859 super.OnEnergyAdded();
8860
8862 }
8863
8864
8866 {
8867 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8868 {
8870 {
8871 float energy_0to1 = GetCompEM().GetEnergy0To1();
8873 }
8874 }
8875 }
8876
8877
8879 {
8880 return ConfigGetFloat("heatIsolation");
8881 }
8882
8884 {
8886 }
8887
8889 {
8890 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8891 if (
GetGame().ConfigIsExisting(paramPath))
8893
8894 return 0.0;
8895 }
8896
8898 {
8899 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8900 if (
GetGame().ConfigIsExisting(paramPath))
8902
8903 return 0.0;
8904 }
8905
8906 override void SetWet(
float value,
bool allow_client =
false)
8907 {
8908 if (!IsServerCheck(allow_client))
8909 return;
8910
8913
8915
8916 m_VarWet = Math.Clamp(value, min, max);
8917
8919 {
8922 }
8923 }
8924
8925 override void AddWet(
float value)
8926 {
8928 }
8929
8931 {
8933 }
8934
8936 {
8938 }
8939
8941 {
8943 }
8944
8946 {
8948 }
8949
8951 {
8953 }
8954
8956 {
8959 if (newLevel != oldLevel)
8960 {
8962 }
8963 }
8964
8966 {
8967 SetWeightDirty();
8968 }
8969
8971 {
8972 return GetWetLevelInternal(
m_VarWet);
8973 }
8974
8975
8976
8978 {
8980 }
8981
8983 {
8985 }
8986
8988 {
8990 }
8991
8993 {
8995 }
8996
8997
8998
9000 {
9001 if (ConfigIsExisting("itemModelLength"))
9002 {
9003 return ConfigGetFloat("itemModelLength");
9004 }
9005 return 0;
9006 }
9007
9009 {
9010 if (ConfigIsExisting("itemAttachOffset"))
9011 {
9012 return ConfigGetFloat("itemAttachOffset");
9013 }
9014 return 0;
9015 }
9016
9017 override void SetCleanness(
int value,
bool allow_client =
false)
9018 {
9019 if (!IsServerCheck(allow_client))
9020 return;
9021
9023
9025
9028 }
9029
9031 {
9033 }
9034
9036 {
9037 return true;
9038 }
9039
9040
9041
9042
9044 {
9046 }
9047
9049 {
9051 }
9052
9053
9054
9055
9056 override void SetColor(
int r,
int g,
int b,
int a)
9057 {
9063 }
9065 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9066 {
9071 }
9072
9074 {
9076 }
9077
9080 {
9081 int r,g,b,a;
9083 r = r/255;
9084 g = g/255;
9085 b = b/255;
9086 a = a/255;
9087 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9088 }
9089
9090
9091
9092 override void SetLiquidType(
int value,
bool allow_client =
false)
9093 {
9094 if (!IsServerCheck(allow_client))
9095 return;
9096
9101 }
9102
9104 {
9105 return ConfigGetInt("varLiquidTypeInit");
9106 }
9107
9109 {
9111 }
9112
9114 {
9116 SetFrozen(false);
9117 }
9118
9121 {
9122 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9123 }
9124
9125
9128 {
9129 PlayerBase nplayer;
9130 if (PlayerBase.CastTo(nplayer, player))
9131 {
9133
9134 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9135 }
9136 }
9137
9138
9141 {
9142 PlayerBase nplayer;
9143 if (PlayerBase.CastTo(nplayer,player))
9144 {
9145
9146 nplayer.SetEnableQuickBarEntityShortcut(this,false);
9147
9148 }
9149
9150
9151 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9152
9153
9154 if (HasEnergyManager())
9155 {
9156 GetCompEM().UpdatePlugState();
9157 }
9158 }
9159
9160
9162 {
9163 super.OnPlacementStarted(player);
9164
9166 }
9167
9168 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9169 {
9171 {
9172 m_AdminLog.OnPlacementComplete(player,
this);
9173 }
9174
9175 super.OnPlacementComplete(player, position, orientation);
9176 }
9177
9178
9179
9180
9181
9183 {
9185 {
9186 return true;
9187 }
9188 else
9189 {
9190 return false;
9191 }
9192 }
9193
9194
9196 {
9198 {
9200 }
9201 }
9202
9203
9205 {
9207 }
9208
9210 {
9212 }
9213
9214 override void InsertAgent(
int agent,
float count = 1)
9215 {
9216 if (count < 1)
9217 return;
9218
9220 }
9221
9224 {
9226 }
9227
9228
9230 {
9232 }
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263
9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9276 {
9278 return false;
9279 return true;
9280 }
9281
9283 {
9284
9286 }
9287
9288
9291 {
9292 super.CheckForRoofLimited(timeTresholdMS);
9293
9295 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9296 {
9297 m_PreviousRoofTestTime = time;
9298 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9299 }
9300 }
9301
9302
9304 {
9306 {
9307 return 0;
9308 }
9309
9310 if (GetInventory().GetAttachmentSlotsCount() != 0)
9311 {
9312 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9313 if (filter)
9314 return filter.GetProtectionLevel(type, false, system);
9315 else
9316 return 0;
9317 }
9318
9319 string subclassPath, entryName;
9320
9321 switch (type)
9322 {
9324 entryName = "biological";
9325 break;
9327 entryName = "chemical";
9328 break;
9329 default:
9330 entryName = "biological";
9331 break;
9332 }
9333
9334 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9335
9337 }
9338
9339
9340
9343 {
9344 if (!IsMagazine())
9346
9348 }
9349
9350
9351
9352
9353
9358 {
9359 return true;
9360 }
9361
9363 {
9365 }
9366
9367
9368
9369
9370
9372 {
9373 if (parent)
9374 {
9375 if (parent.IsInherited(DayZInfected))
9376 return true;
9377
9378 if (!parent.IsRuined())
9379 return true;
9380 }
9381
9382 return true;
9383 }
9384
9386 {
9387 if (!super.CanPutAsAttachment(parent))
9388 {
9389 return false;
9390 }
9391
9392 if (!IsRuined() && !parent.IsRuined())
9393 {
9394 return true;
9395 }
9396
9397 return false;
9398 }
9399
9401 {
9402
9403
9404
9405
9406 return super.CanReceiveItemIntoCargo(item);
9407 }
9408
9410 {
9411
9412
9413
9414
9415 GameInventory attachmentInv = attachment.GetInventory();
9417 {
9418 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9419 return false;
9420 }
9421
9422 InventoryLocation loc = new InventoryLocation();
9423 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9424 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9425 return false;
9426
9427 return super.CanReceiveAttachment(attachment, slotId);
9428 }
9429
9431 {
9432 if (!super.CanReleaseAttachment(attachment))
9433 return false;
9434
9435 return GetInventory().AreChildrenAccessible();
9436 }
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9452
9453
9454
9455
9456
9457
9459 {
9460 int id = muzzle_owner.GetMuzzleID();
9461 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9462
9463 if (WPOF_array)
9464 {
9465 for (int i = 0; i < WPOF_array.Count(); i++)
9466 {
9467 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9468
9469 if (WPOF)
9470 {
9471 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9472 }
9473 }
9474 }
9475 }
9476
9477
9479 {
9480 int id = muzzle_owner.GetMuzzleID();
9482
9483 if (WPOBE_array)
9484 {
9485 for (int i = 0; i < WPOBE_array.Count(); i++)
9486 {
9487 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9488
9489 if (WPOBE)
9490 {
9491 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9492 }
9493 }
9494 }
9495 }
9496
9497
9499 {
9500 int id = muzzle_owner.GetMuzzleID();
9501 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9502
9503 if (WPOOH_array)
9504 {
9505 for (int i = 0; i < WPOOH_array.Count(); i++)
9506 {
9507 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9508
9509 if (WPOOH)
9510 {
9511 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9512 }
9513 }
9514 }
9515 }
9516
9517
9519 {
9520 int id = muzzle_owner.GetMuzzleID();
9521 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9522
9523 if (WPOOH_array)
9524 {
9525 for (int i = 0; i < WPOOH_array.Count(); i++)
9526 {
9527 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9528
9529 if (WPOOH)
9530 {
9531 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9532 }
9533 }
9534 }
9535 }
9536
9537
9539 {
9540 int id = muzzle_owner.GetMuzzleID();
9541 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9542
9543 if (WPOOH_array)
9544 {
9545 for (int i = 0; i < WPOOH_array.Count(); i++)
9546 {
9547 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9548
9549 if (WPOOH)
9550 {
9551 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9552 }
9553 }
9554 }
9555 }
9556
9557
9558
9560 {
9562 {
9563 return true;
9564 }
9565
9566 return false;
9567 }
9568
9570 {
9572 {
9573 return true;
9574 }
9575
9576 return false;
9577 }
9578
9580 {
9582 {
9583 return true;
9584 }
9585
9586 return false;
9587 }
9588
9590 {
9591 return false;
9592 }
9593
9596 {
9597 return UATimeSpent.DEFAULT_DEPLOY;
9598 }
9599
9600
9601
9602
9604 {
9606 SetSynchDirty();
9607 }
9608
9610 {
9612 }
9613
9614
9616 {
9617 return false;
9618 }
9619
9622 {
9623 string att_type = "None";
9624
9625 if (ConfigIsExisting("soundAttType"))
9626 {
9627 att_type = ConfigGetString("soundAttType");
9628 }
9629
9631 }
9632
9634 {
9636 }
9637
9638
9639
9640
9641
9645
9647 {
9650
9652 }
9653
9654
9656 {
9658 return;
9659
9661
9664
9667
9668 SoundParameters params = new SoundParameters();
9672 }
9673
9674
9676 {
9678 return;
9679
9681 SetSynchDirty();
9682
9685 }
9686
9687
9689 {
9691 return;
9692
9694 SetSynchDirty();
9695
9698 }
9699
9701 {
9703 }
9704
9706 {
9708 }
9709
9712 {
9713 if (!
GetGame().IsDedicatedServer())
9714 {
9715 if (ConfigIsExisting("attachSoundSet"))
9716 {
9717 string cfg_path = "";
9718 string soundset = "";
9720
9723 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9724 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9725
9726 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9727 {
9728 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9729 {
9730 if (cfg_slot_array[i] == slot_type)
9731 {
9732 soundset = cfg_soundset_array[i];
9733 break;
9734 }
9735 }
9736 }
9737
9738 if (soundset != "")
9739 {
9740 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9742 }
9743 }
9744 }
9745 }
9746
9748 {
9749
9750 }
9751
9752 void OnApply(PlayerBase player);
9753
9755 {
9756 return 1.0;
9757 };
9758
9760 {
9762 }
9763
9765 {
9767 }
9768
9770
9772 {
9773 SetDynamicPhysicsLifeTime(0.01);
9775 }
9776
9778 {
9779 array<string> zone_names = new array<string>;
9780 GetDamageZones(zone_names);
9781 for (int i = 0; i < zone_names.Count(); i++)
9782 {
9783 SetHealthMax(zone_names.Get(i),"Health");
9784 }
9785 SetHealthMax("","Health");
9786 }
9787
9790 {
9791 float global_health = GetHealth01("","Health");
9792 array<string> zones = new array<string>;
9793 GetDamageZones(zones);
9794
9795 for (int i = 0; i < zones.Count(); i++)
9796 {
9797 SetHealth01(zones.Get(i),"Health",global_health);
9798 }
9799 }
9800
9803 {
9804 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9805 }
9806
9808 {
9809 if (!hasRootAsPlayer)
9810 {
9811 if (refParentIB)
9812 {
9813
9814 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9815 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9816
9817 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9818 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9819
9822 }
9823 else
9824 {
9825
9828 }
9829 }
9830 }
9831
9833 {
9835 {
9836 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9837 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9838 {
9839 float heatPermCoef = 1.0;
9841 while (ent)
9842 {
9843 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9844 ent = ent.GetHierarchyParent();
9845 }
9846
9847 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9848 }
9849 }
9850 }
9851
9853 {
9854
9855 EntityAI parent = GetHierarchyParent();
9856 if (!parent)
9857 {
9858 hasParent = false;
9859 hasRootAsPlayer = false;
9860 }
9861 else
9862 {
9863 hasParent = true;
9864 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9865 refParentIB =
ItemBase.Cast(parent);
9866 }
9867 }
9868
9869 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9870 {
9871
9872 }
9873
9875 {
9876
9877 return false;
9878 }
9879
9881 {
9882
9883
9884 return false;
9885 }
9886
9888 {
9889
9890 return false;
9891 }
9892
9895 {
9896 return !GetIsFrozen() &&
IsOpen();
9897 }
9898
9900 {
9901 bool hasParent = false, hasRootAsPlayer = false;
9903
9904 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9905 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9906
9907 if (wwtu || foodDecay)
9908 {
9912
9913 if (processWetness || processTemperature || processDecay)
9914 {
9916
9917 if (processWetness)
9918 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9919
9920 if (processTemperature)
9922
9923 if (processDecay)
9924 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9925 }
9926 }
9927 }
9928
9931 {
9933 }
9934
9936 {
9939
9940 return super.GetTemperatureFreezeThreshold();
9941 }
9942
9944 {
9947
9948 return super.GetTemperatureThawThreshold();
9949 }
9950
9952 {
9955
9956 return super.GetItemOverheatThreshold();
9957 }
9958
9960 {
9962 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
9963
9964 return super.GetTemperatureFreezeTime();
9965 }
9966
9968 {
9970 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
9971
9972 return super.GetTemperatureThawTime();
9973 }
9974
9979
9981 {
9982 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
9983 }
9984
9986 {
9987 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
9988 }
9989
9992 {
9994 }
9995
9997 {
9999 }
10000
10002 {
10004 }
10005
10008 {
10009 return null;
10010 }
10011
10014 {
10015 return false;
10016 }
10017
10019 {
10021 {
10024 if (!trg)
10025 {
10027 explosive = this;
10028 }
10029
10030 explosive.PairRemote(trg);
10032
10033 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10034 trg.SetPersistentPairID(persistentID);
10035 explosive.SetPersistentPairID(persistentID);
10036
10037 return true;
10038 }
10039 return false;
10040 }
10041
10044 {
10045 float ret = 1.0;
10048 ret *= GetHealth01();
10049
10050 return ret;
10051 }
10052
10053 #ifdef DEVELOPER
10054 override void SetDebugItem()
10055 {
10056 super.SetDebugItem();
10057 _itemBase = this;
10058 }
10059
10061 {
10062 string text = super.GetDebugText();
10063
10065 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10066
10067 return text;
10068 }
10069 #endif
10070
10072 {
10073 return true;
10074 }
10075
10077
10079
10081 {
10084 }
10085
10086
10094
10110}
10111
10113{
10115 if (entity)
10116 {
10117 bool is_item = entity.IsInherited(
ItemBase);
10118 if (is_item && full_quantity)
10119 {
10122 }
10123 }
10124 else
10125 {
10127 return NULL;
10128 }
10129 return entity;
10130}
10131
10133{
10134 if (item)
10135 {
10136 if (health > 0)
10137 item.SetHealth("", "", health);
10138
10139 if (item.CanHaveTemperature())
10140 {
10142 if (item.CanFreeze())
10143 item.SetFrozen(false);
10144 }
10145
10146 if (item.HasEnergyManager())
10147 {
10148 if (quantity >= 0)
10149 {
10150 item.GetCompEM().SetEnergy0To1(quantity);
10151 }
10152 else
10153 {
10155 }
10156 }
10157 else if (item.IsMagazine())
10158 {
10159 Magazine mag = Magazine.Cast(item);
10160 if (quantity >= 0)
10161 {
10162 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10163 }
10164 else
10165 {
10167 }
10168
10169 }
10170 else
10171 {
10172 if (quantity >= 0)
10173 {
10174 item.SetQuantityNormalized(quantity, false);
10175 }
10176 else
10177 {
10179 }
10180
10181 }
10182 }
10183}
10184
10185#ifdef DEVELOPER
10187#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.