5445{
5447 {
5448 return true;
5449 }
5450};
5451
5453{
5454
5455};
5456
5457
5458
5460{
5464
5466
5469
5470
5471
5472
5473
5482
5488
5493
5498
5519 protected bool m_IsResultOfSplit
5520
5522
5527
5528
5529
5531
5535
5536
5537
5539
5542
5543
5544
5550
5551
5559
5562
5563
5565
5566
5568
5569
5574
5575
5580
5582
5583
5585
5586
5588 {
5593
5594 if (!
g_Game.IsDedicatedServer())
5595 {
5597 {
5599
5601 {
5603 }
5604 }
5605
5608 }
5609
5610 m_OldLocation = null;
5611
5613 {
5615 }
5616
5617 if (ConfigIsExisting("headSelectionsToHide"))
5618 {
5621 }
5622
5624 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5625 {
5627 }
5628
5630
5631 m_IsResultOfSplit = false;
5632
5634 }
5635
5637 {
5638 super.InitItemVariables();
5639
5645 m_Count = ConfigGetInt(
"count");
5646
5649
5654
5657
5662
5674
5678
5679
5682 if (ConfigIsExisting("canBeSplit"))
5683 {
5686 }
5687
5689 if (ConfigIsExisting("itemBehaviour"))
5691
5692
5695 RegisterNetSyncVariableInt("m_VarLiquidType");
5696 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5697
5698 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5699 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5700 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5701
5702 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5703 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5704 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5705 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5706
5707 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5708 RegisterNetSyncVariableBool("m_IsTakeable");
5709 RegisterNetSyncVariableBool("m_IsHologram");
5710
5713 {
5716 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5717 }
5718
5720
5722 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5724
5726 }
5727
5729 {
5731 }
5732
5734 {
5737 {
5742 }
5743 }
5744
5745 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5746 {
5748 {
5751 }
5752
5754 }
5755
5757 {
5763 }
5764
5766
5768 {
5770
5771 if (!action)
5772 {
5773 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5774 return;
5775 }
5776
5778 if (!ai)
5779 {
5781 return;
5782 }
5783
5785 if (!action_array)
5786 {
5787 action_array = new array<ActionBase_Basic>;
5789 }
5790 if (LogManager.IsActionLogEnable())
5791 {
5792 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5793 }
5794
5795 if (action_array.Find(action) != -1)
5796 {
5797 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5798 }
5799 else
5800 {
5801 action_array.Insert(action);
5802 }
5803 }
5804
5806 {
5807 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5808 ActionBase action = player.GetActionManager().GetAction(actionName);
5811
5812 if (action_array)
5813 {
5814 action_array.RemoveItem(action);
5815 }
5816 }
5817
5818
5819
5821 {
5822 ActionOverrideData overrideData = new ActionOverrideData();
5826
5828 if (!actionMap)
5829 {
5832 }
5833
5834 actionMap.Insert(this.
Type(), overrideData);
5835
5836 }
5837
5839
5841
5842
5844 {
5847
5850
5851 string config_to_search = "CfgVehicles";
5852 string muzzle_owner_config;
5853
5855 {
5856 if (IsInherited(Weapon))
5857 config_to_search = "CfgWeapons";
5858
5859 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5860
5861 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5862
5863 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
5864
5865 if (config_OnFire_subclass_count > 0)
5866 {
5867 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5868
5869 for (int i = 0; i < config_OnFire_subclass_count; i++)
5870 {
5871 string particle_class = "";
5872 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
5873 string config_OnFire_entry = config_OnFire_class + particle_class;
5874 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5875 WPOF_array.Insert(WPOF);
5876 }
5877
5878
5880 }
5881 }
5882
5884 {
5885 config_to_search = "CfgWeapons";
5886 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5887
5888 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5889
5890 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5891
5892 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5893 {
5894 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5895
5896 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5897 {
5898 string particle_class2 = "";
5899 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5900 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5901 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5902 WPOBE_array.Insert(WPOBE);
5903 }
5904
5905
5907 }
5908 }
5909 }
5910
5911
5913 {
5916
5918 {
5919 string config_to_search = "CfgVehicles";
5920
5921 if (IsInherited(Weapon))
5922 config_to_search = "CfgWeapons";
5923
5924 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5925 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5926
5927 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
5928 {
5929
5931
5933 {
5935 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5937 return;
5938 }
5939
5942
5943
5944
5945 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
5946 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5947
5948 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5949 {
5950 string particle_class = "";
5951 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
5952 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5953 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
5954
5955 if (entry_type == CT_CLASS)
5956 {
5957 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5958 WPOOH_array.Insert(WPOF);
5959 }
5960 }
5961
5962
5964 }
5965 }
5966 }
5967
5969 {
5971 }
5972
5974 {
5976 {
5978
5981
5984
5985 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5986 }
5987 }
5988
5990 {
5992 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5993
5995 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5996
5998 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5999
6001 {
6003 }
6004 }
6005
6007 {
6009 }
6010
6012 {
6015 else
6017
6019 {
6022 }
6023 else
6024 {
6027
6030 }
6031
6033 }
6034
6036 {
6038 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6039 }
6040
6042 {
6044 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
6046 }
6047
6049 {
6051 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
6052 }
6053
6055 {
6058
6059 OverheatingParticle OP = new OverheatingParticle();
6064
6066 }
6067
6069 {
6072
6073 return -1;
6074 }
6075
6077 {
6079 {
6082
6083 for (int i = count; i > 0; --i)
6084 {
6085 int id = i - 1;
6088
6091
6092 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
6093 {
6094 if (p)
6095 {
6098 }
6099 }
6100 }
6101 }
6102 }
6103
6105 {
6107 {
6109 {
6110 int id = i - 1;
6112
6113 if (OP)
6114 {
6116
6117 if (p)
6118 {
6120 }
6121
6122 delete OP;
6123 }
6124 }
6125
6128 }
6129 }
6130
6133 {
6134 return 0.0;
6135 }
6136
6137
6139 {
6140 return 250;
6141 }
6142
6144 {
6145 return 0;
6146 }
6147
6150 {
6152 return true;
6153
6154 return false;
6155 }
6156
6159 {
6162
6164 {
6166 }
6167 else
6168 {
6169
6171 }
6172
6174 }
6175
6182 {
6183 return -1;
6184 }
6185
6186
6187
6188
6190 {
6192 {
6193 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6194 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6195
6196 if (r_index >= 0)
6197 {
6198 InventoryLocation r_il = new InventoryLocation;
6199 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6200
6201 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6204 {
6205 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6206 }
6208 {
6209 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6210 }
6211
6212 }
6213
6214 player.GetHumanInventory().ClearUserReservedLocation(this);
6215 }
6216
6219 }
6220
6221
6222
6223
6225 {
6226 return ItemBase.m_DebugActionsMask;
6227 }
6228
6230 {
6231 return ItemBase.m_DebugActionsMask & mask;
6232 }
6233
6235 {
6236 ItemBase.m_DebugActionsMask = mask;
6237 }
6238
6240 {
6241 ItemBase.m_DebugActionsMask |= mask;
6242 }
6243
6245 {
6246 ItemBase.m_DebugActionsMask &= ~mask;
6247 }
6248
6250 {
6252 {
6254 }
6255 else
6256 {
6258 }
6259 }
6260
6261
6263 {
6264 if (GetEconomyProfile())
6265 {
6266 float q_max = GetEconomyProfile().GetQuantityMax();
6267 if (q_max > 0)
6268 {
6269 float q_min = GetEconomyProfile().GetQuantityMin();
6270 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6271
6273 {
6274 ComponentEnergyManager comp = GetCompEM();
6276 {
6278 }
6279 }
6281 {
6283
6284 }
6285
6286 }
6287 }
6288 }
6289
6292 {
6293 EntityAI parent = GetHierarchyParent();
6294
6295 if (parent)
6296 {
6297 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6298 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6299 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6300 }
6301 }
6302
6305 {
6306 EntityAI parent = GetHierarchyParent();
6307
6308 if (parent)
6309 {
6310 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6311 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6312 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6313 }
6314 }
6315
6317 {
6318
6319
6320
6321
6323
6325 {
6326 if (ScriptInputUserData.CanStoreInputUserData())
6327 {
6328 ScriptInputUserData ctx = new ScriptInputUserData;
6334 ctx.
Write(use_stack_max);
6337
6339 {
6340 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6341 }
6342 }
6343 }
6344 else if (!
g_Game.IsMultiplayer())
6345 {
6347 }
6348 }
6349
6351 {
6353 }
6354
6356 {
6358 }
6359
6361 {
6363 }
6364
6366 {
6367
6368 return false;
6369 }
6370
6372 {
6373 return false;
6374 }
6375
6379 {
6380 return false;
6381 }
6382
6384 {
6385 return "";
6386 }
6387
6389
6391 {
6392 return false;
6393 }
6394
6396 {
6397 return true;
6398 }
6399
6400
6401
6403 {
6404 return true;
6405 }
6406
6408 {
6409 return true;
6410 }
6411
6413 {
6414 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6416 }
6417
6419 {
6421 }
6422
6424 {
6426 if (!is_being_placed)
6428 SetSynchDirty();
6429 }
6430
6431
6433
6435 {
6437 }
6438
6440 {
6442 }
6443
6445 {
6446 return 1;
6447 }
6448
6450 {
6451 return false;
6452 }
6453
6455 {
6457 SetSynchDirty();
6458 }
6459
6460
6461
6462
6463
6464
6465
6466
6467
6468
6469
6470
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491
6492
6493
6495 {
6496 super.OnMovedInsideCargo(container);
6497
6498 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6499 }
6500
6501 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6502 {
6503 super.EEItemLocationChanged(oldLoc, newLoc);
6504
6505 PlayerBase newPlayer = null;
6506 PlayerBase oldPlayer = null;
6507
6508 if (newLoc.GetParent())
6509 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6510
6511 if (oldLoc.GetParent())
6512 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6513
6515 {
6516 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6517
6518 if (rIndex >= 0)
6519 {
6520 InventoryLocation rIl = new InventoryLocation;
6521 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6522
6523 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6526 {
6527 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6528 }
6530 {
6532 }
6533
6534 }
6535 }
6536
6538 {
6539 if (newPlayer)
6540 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6541
6542 if (newPlayer == oldPlayer)
6543 {
6544 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6545 {
6547 {
6548 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6549 {
6550 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6551 }
6552 }
6553 else
6554 {
6555 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6556 }
6557 }
6558
6559 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6560 {
6561 int type = oldLoc.GetType();
6563 {
6564 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6565 }
6567 {
6568 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6569 }
6570 }
6571 if (!m_OldLocation)
6572 {
6573 m_OldLocation = new InventoryLocation;
6574 }
6575 m_OldLocation.Copy(oldLoc);
6576 }
6577 else
6578 {
6579 if (m_OldLocation)
6580 {
6581 m_OldLocation.Reset();
6582 }
6583 }
6584
6585 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6586 }
6587 else
6588 {
6589 if (newPlayer)
6590 {
6591 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6592 if (resIndex >= 0)
6593 {
6594 InventoryLocation il = new InventoryLocation;
6595 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6597 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6600 {
6601 il.
GetParent().GetOnReleaseLock().Invoke(it);
6602 }
6604 {
6606 }
6607
6608 }
6609 }
6611 {
6612
6614 }
6615
6616 if (m_OldLocation)
6617 {
6618 m_OldLocation.Reset();
6619 }
6620 }
6621
6623 {
6624 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6625 }
6626
6628 {
6629 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6630 }
6631 }
6632
6633 override void EOnContact(IEntity other, Contact extra)
6634 {
6636 {
6637 int liquidType = -1;
6639 if (impactSpeed > 0.0)
6640 {
6642 #ifndef SERVER
6644 #else
6646 SetSynchDirty();
6647 #endif
6649 }
6650 }
6651
6652 #ifdef SERVER
6653 if (GetCompEM() && GetCompEM().IsPlugged())
6654 {
6655 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6656 GetCompEM().UnplugThis();
6657 }
6658 #endif
6659 }
6660
6662
6664 {
6666 }
6667
6669 {
6670
6671 }
6672
6674 {
6675 super.OnItemLocationChanged(old_owner, new_owner);
6676
6677 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6678 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6679
6680 if (!relatedPlayer && playerNew)
6681 relatedPlayer = playerNew;
6682
6683 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6684 {
6686 if (actionMgr)
6687 {
6688 ActionBase currentAction = actionMgr.GetRunningAction();
6689 if (currentAction)
6691 }
6692 }
6693
6694 Man ownerPlayerOld = null;
6695 Man ownerPlayerNew = null;
6696
6697 if (old_owner)
6698 {
6699 if (old_owner.
IsMan())
6700 {
6701 ownerPlayerOld = Man.Cast(old_owner);
6702 }
6703 else
6704 {
6705 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6706 }
6707 }
6708 else
6709 {
6711 {
6713
6714 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6715 {
6716 GetCompEM().UnplugThis();
6717 }
6718 }
6719 }
6720
6721 if (new_owner)
6722 {
6723 if (new_owner.
IsMan())
6724 {
6725 ownerPlayerNew = Man.Cast(new_owner);
6726 }
6727 else
6728 {
6729 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6730 }
6731 }
6732
6733 if (ownerPlayerOld != ownerPlayerNew)
6734 {
6735 if (ownerPlayerOld)
6736 {
6737 array<EntityAI> subItemsExit = new array<EntityAI>;
6739 for (int i = 0; i < subItemsExit.Count(); i++)
6740 {
6743 }
6744 }
6745
6746 if (ownerPlayerNew)
6747 {
6748 array<EntityAI> subItemsEnter = new array<EntityAI>;
6750 for (int j = 0; j < subItemsEnter.Count(); j++)
6751 {
6754 }
6755 }
6756 }
6757 else if (ownerPlayerNew != null)
6758 {
6759 PlayerBase nplayer;
6760 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6761 {
6762 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6764 for (int k = 0; k < subItemsUpdate.Count(); k++)
6765 {
6767 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6768 }
6769 }
6770 }
6771
6772 if (old_owner)
6773 old_owner.OnChildItemRemoved(this);
6774 if (new_owner)
6775 new_owner.OnChildItemReceived(this);
6776 }
6777
6778
6780 {
6781 super.EEDelete(parent);
6782 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6783 if (player)
6784 {
6786
6787 if (player.IsAlive())
6788 {
6789 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6790 if (r_index >= 0)
6791 {
6792 InventoryLocation r_il = new InventoryLocation;
6793 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6794
6795 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6798 {
6799 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6800 }
6802 {
6803 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6804 }
6805
6806 }
6807
6808 player.RemoveQuickBarEntityShortcut(this);
6809 }
6810 }
6811 }
6812
6814 {
6815 super.EEKilled(killer);
6816
6819 {
6820 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6821 {
6822 if (IsMagazine())
6823 {
6824 if (Magazine.Cast(this).GetAmmoCount() > 0)
6825 {
6827 }
6828 }
6829 else
6830 {
6832 }
6833 }
6834 }
6835 }
6836
6838 {
6839 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6840
6841 super.OnWasAttached(parent, slot_id);
6842
6845
6848 }
6849
6851 {
6852 super.OnWasDetached(parent, slot_id);
6853
6856
6859 }
6860
6862 {
6863 int idx;
6866
6867 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6868 if (inventory_slots.Count() < 1)
6869 {
6870 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6871 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6872 }
6873 else
6874 {
6875 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6876 }
6877
6878 idx = inventory_slots.Find(slot);
6879 if (idx < 0)
6880 return "";
6881
6882 return attach_types.Get(idx);
6883 }
6884
6886 {
6887 int idx = -1;
6888 string slot;
6889
6892
6893 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6894 if (inventory_slots.Count() < 1)
6895 {
6896 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6897 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6898 }
6899 else
6900 {
6901 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6902 if (detach_types.Count() < 1)
6903 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6904 }
6905
6906 for (int i = 0; i < inventory_slots.Count(); i++)
6907 {
6908 slot = inventory_slots.Get(i);
6909 }
6910
6911 if (slot != "")
6912 {
6913 if (detach_types.Count() == 1)
6914 idx = 0;
6915 else
6916 idx = inventory_slots.Find(slot);
6917 }
6918 if (idx < 0)
6919 return "";
6920
6921 return detach_types.Get(idx);
6922 }
6923
6925 {
6926
6928
6929
6930 float min_time = 1;
6931 float max_time = 3;
6932 float delay = Math.RandomFloat(min_time, max_time);
6933
6934 explode_timer.Run(delay, this, "DoAmmoExplosion");
6935 }
6936
6938 {
6939 Magazine magazine = Magazine.Cast(this);
6940 int pop_sounds_count = 6;
6941 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6942
6943
6944 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6945 string sound_name = pop_sounds[ sound_idx ];
6946 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
6947
6948
6949 magazine.ServerAddAmmoCount(-1);
6950
6951
6952 float min_temp_to_explode = 100;
6953
6954 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
6955 {
6957 }
6958 }
6959
6960
6961 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6962 {
6963 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6964
6965 const int CHANCE_DAMAGE_CARGO = 4;
6966 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6967 const int CHANCE_DAMAGE_NOTHING = 2;
6968
6970 {
6971 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6972 int chances;
6973 int rnd;
6974
6975 if (GetInventory().GetCargo())
6976 {
6977 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6978 rnd = Math.RandomInt(0,chances);
6979
6980 if (rnd < CHANCE_DAMAGE_CARGO)
6981 {
6983 }
6984 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6985 {
6987 }
6988 }
6989 else
6990 {
6991 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6992 rnd = Math.RandomInt(0,chances);
6993
6994 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6995 {
6997 }
6998 }
6999 }
7000 }
7001
7003 {
7004 CargoBase cargo = GetInventory().GetCargo();
7005 if (cargo)
7006 {
7008 if (item_count > 0)
7009 {
7010 int random_pick = Math.RandomInt(0, item_count);
7012 if (!item.IsExplosive())
7013 {
7014 item.AddHealth("","",damage);
7015 return true;
7016 }
7017 }
7018 }
7019 return false;
7020 }
7021
7023 {
7024 GameInventory inventory = GetInventory();
7026 if (attachment_count > 0)
7027 {
7028 int random_pick = Math.RandomInt(0, attachment_count);
7030 if (!attachment.IsExplosive())
7031 {
7032 attachment.AddHealth("","",damage);
7033 return true;
7034 }
7035 }
7036 return false;
7037 }
7038
7040 {
7042 }
7043
7045 {
7047 return GetInventory().CanRemoveEntity();
7048
7049 return false;
7050 }
7051
7053 {
7054
7056 return false;
7057
7058
7060 return false;
7061
7062
7063
7065 if (delta == 0)
7066 return false;
7067
7068
7069 return true;
7070 }
7071
7073 {
7075 {
7076 if (ScriptInputUserData.CanStoreInputUserData())
7077 {
7078 ScriptInputUserData ctx = new ScriptInputUserData;
7083 ctx.
Write(destination_entity);
7087 }
7088 }
7089 else if (!
g_Game.IsMultiplayer())
7090 {
7092 }
7093 }
7094
7096 {
7097 float split_quantity_new;
7101 InventoryLocation loc = new InventoryLocation;
7102
7103 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7104 {
7106 split_quantity_new = stack_max;
7107 else
7109
7111 {
7112 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7113 if (new_item)
7114 {
7115 new_item.SetResultOfSplit(true);
7116 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7118 new_item.
SetQuantity(split_quantity_new,
false,
true);
7119 }
7120 }
7121 }
7122 else if (destination_entity && slot_id == -1)
7123 {
7124 if (quantity > stack_max)
7125 split_quantity_new = stack_max;
7126 else
7127 split_quantity_new = quantity;
7128
7130 {
7131 GameInventory destinationInventory = destination_entity.GetInventory();
7133 {
7136 }
7137
7138 if (new_item)
7139 {
7140 new_item.SetResultOfSplit(true);
7141 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7143 new_item.
SetQuantity(split_quantity_new,
false,
true);
7144 }
7145 }
7146 }
7147 else
7148 {
7149 if (stack_max != 0)
7150 {
7152 {
7154 }
7155
7156 if (split_quantity_new == 0)
7157 {
7158 if (!
g_Game.IsMultiplayer())
7159 player.PhysicalPredictiveDropItem(this);
7160 else
7161 player.ServerDropEntity(this);
7162 return;
7163 }
7164
7166 {
7168
7169 if (new_item)
7170 {
7171 new_item.SetResultOfSplit(true);
7172 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7175 new_item.PlaceOnSurface();
7176 }
7177 }
7178 }
7179 }
7180 }
7181
7183 {
7184 float split_quantity_new;
7188 InventoryLocation loc = new InventoryLocation;
7189
7190 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7191 {
7193 split_quantity_new = stack_max;
7194 else
7196
7198 {
7199 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7200 if (new_item)
7201 {
7202 new_item.SetResultOfSplit(true);
7203 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7205 new_item.
SetQuantity(split_quantity_new,
false,
true);
7206 }
7207 }
7208 }
7209 else if (destination_entity && slot_id == -1)
7210 {
7211 if (quantity > stack_max)
7212 split_quantity_new = stack_max;
7213 else
7214 split_quantity_new = quantity;
7215
7217 {
7218 GameInventory destinationInventory = destination_entity.GetInventory();
7220 {
7223 }
7224
7225 if (new_item)
7226 {
7227 new_item.SetResultOfSplit(true);
7228 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7230 new_item.
SetQuantity(split_quantity_new,
false,
true);
7231 }
7232 }
7233 }
7234 else
7235 {
7236 if (stack_max != 0)
7237 {
7239 {
7241 }
7242
7244 {
7246
7247 if (new_item)
7248 {
7249 new_item.SetResultOfSplit(true);
7250 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7253 new_item.PlaceOnSurface();
7254 }
7255 }
7256 }
7257 }
7258 }
7259
7261 {
7263 {
7264 if (ScriptInputUserData.CanStoreInputUserData())
7265 {
7266 ScriptInputUserData ctx = new ScriptInputUserData;
7271 dst.WriteToContext(ctx);
7273 }
7274 }
7275 else if (!
g_Game.IsMultiplayer())
7276 {
7278 }
7279 }
7280
7282 {
7284 {
7285 if (ScriptInputUserData.CanStoreInputUserData())
7286 {
7287 ScriptInputUserData ctx = new ScriptInputUserData;
7292 ctx.
Write(destination_entity);
7298 }
7299 }
7300 else if (!
g_Game.IsMultiplayer())
7301 {
7303 }
7304 }
7305
7307 {
7309 }
7310
7312 {
7314 float split_quantity_new;
7316 if (dst.IsValid())
7317 {
7318 int slot_id = dst.GetSlot();
7320
7321 if (quantity > stack_max)
7322 split_quantity_new = stack_max;
7323 else
7324 split_quantity_new = quantity;
7325
7327 {
7329
7330 if (new_item)
7331 {
7332 new_item.SetResultOfSplit(true);
7333 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7335 new_item.
SetQuantity(split_quantity_new,
false,
true);
7336 }
7337
7338 return new_item;
7339 }
7340 }
7341
7342 return null;
7343 }
7344
7346 {
7348 float split_quantity_new;
7350 if (destination_entity)
7351 {
7353 if (quantity > stackable)
7354 split_quantity_new = stackable;
7355 else
7356 split_quantity_new = quantity;
7357
7359 {
7360 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7361 if (new_item)
7362 {
7363 new_item.SetResultOfSplit(true);
7364 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7366 new_item.
SetQuantity(split_quantity_new,
false,
true);
7367 }
7368 }
7369 }
7370 }
7371
7373 {
7375 {
7376 if (ScriptInputUserData.CanStoreInputUserData())
7377 {
7378 ScriptInputUserData ctx = new ScriptInputUserData;
7383 ItemBase destination_entity =
this;
7384 ctx.
Write(destination_entity);
7388 }
7389 }
7390 else if (!
g_Game.IsMultiplayer())
7391 {
7393 }
7394 }
7395
7397 {
7399 float split_quantity_new;
7401 if (player)
7402 {
7404 if (quantity > stackable)
7405 split_quantity_new = stackable;
7406 else
7407 split_quantity_new = quantity;
7408
7410 {
7411 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7412 new_item =
ItemBase.Cast(in_hands);
7413 if (new_item)
7414 {
7415 new_item.SetResultOfSplit(true);
7416 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7418 new_item.SetQuantity(split_quantity_new, false, true);
7419 }
7420 }
7421 }
7422 }
7423
7425 {
7427 float split_quantity_new = Math.Floor(quantity * 0.5);
7428
7430 return;
7431
7433
7434 if (new_item)
7435 {
7436 if (new_item.GetQuantityMax() < split_quantity_new)
7437 {
7438 split_quantity_new = new_item.GetQuantityMax();
7439 }
7440
7441 new_item.SetResultOfSplit(true);
7442 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7443
7445 {
7448 }
7449 else
7450 {
7452 new_item.
SetQuantity(split_quantity_new,
false,
true);
7453 }
7454 }
7455 }
7456
7458 {
7460 float split_quantity_new = Math.Floor(quantity / 2);
7461
7463 return;
7464
7465 InventoryLocation invloc = new InventoryLocation;
7467
7469 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7470
7471 if (new_item)
7472 {
7473 if (new_item.GetQuantityMax() < split_quantity_new)
7474 {
7475 split_quantity_new = new_item.GetQuantityMax();
7476 }
7478 {
7481 }
7482 else if (split_quantity_new > 1)
7483 {
7485 new_item.
SetQuantity(split_quantity_new,
false,
true);
7486 }
7487 }
7488 }
7489
7492 {
7493 SetWeightDirty();
7495
7496 if (parent)
7497 parent.OnAttachmentQuantityChangedEx(this, delta);
7498
7500 {
7502 {
7504 }
7506 {
7507 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7509 }
7510 }
7511 }
7512
7515 {
7516
7517 }
7518
7521 {
7523 }
7524
7526 {
7527 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7528
7530 {
7531 if (newLevel == GameConstants.STATE_RUINED)
7532 {
7534 EntityAI parent = GetHierarchyParent();
7535 if (parent && parent.IsFireplace())
7536 {
7537 CargoBase cargo = GetInventory().GetCargo();
7538 if (cargo)
7539 {
7541 {
7543 }
7544 }
7545 }
7546 }
7547
7549 {
7550
7552 return;
7553 }
7554
7555 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7556 {
7558 }
7559 }
7560 }
7561
7562
7564 {
7565 super.OnRightClick();
7566
7568 {
7570 {
7571 if (ScriptInputUserData.CanStoreInputUserData())
7572 {
7573 EntityAI root = GetHierarchyRoot();
7574 Man playerOwner = GetHierarchyRootPlayer();
7575 InventoryLocation dst = new InventoryLocation;
7576
7577
7578 if (!playerOwner && root && root == this)
7579 {
7581 }
7582 else
7583 {
7584
7585 GetInventory().GetCurrentInventoryLocation(dst);
7587 {
7588 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7590 {
7592 }
7593 else
7594 {
7596
7597
7598 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7599 {
7601 }
7602 else
7603 {
7604 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7605 }
7606 }
7607 }
7608 }
7609
7610 ScriptInputUserData ctx = new ScriptInputUserData;
7618 }
7619 }
7620 else if (!
g_Game.IsMultiplayer())
7621 {
7623 }
7624 }
7625 }
7626
7628 {
7629 if (root)
7630 {
7631 vector m4[4];
7632 root.GetTransform(m4);
7633 dst.SetGround(this, m4);
7634 }
7635 else
7636 {
7637 GetInventory().GetCurrentInventoryLocation(dst);
7638 }
7639 }
7640
7641 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7642 {
7643
7644 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7645 return false;
7646
7647 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7648 return false;
7649
7650
7652 return false;
7653
7654
7655 Magazine mag = Magazine.Cast(this);
7656 if (mag)
7657 {
7658 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7659 return false;
7660
7661 if (stack_max_limit)
7662 {
7663 Magazine other_mag = Magazine.Cast(other_item);
7664 if (other_item)
7665 {
7666 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7667 return false;
7668 }
7669
7670 }
7671 }
7672 else
7673 {
7674
7676 return false;
7677
7679 return false;
7680 }
7681
7682 PlayerBase player = null;
7683 if (CastTo(player, GetHierarchyRootPlayer()))
7684 {
7685 if (player.GetInventory().HasAttachment(this))
7686 return false;
7687
7688 if (player.IsItemsToDelete())
7689 return false;
7690 }
7691
7692 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7693 return false;
7694
7695 int slotID;
7697 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7698 return false;
7699
7700 return true;
7701 }
7702
7704 {
7706 }
7707
7709 {
7710 return m_IsResultOfSplit;
7711 }
7712
7714 {
7715 m_IsResultOfSplit = value;
7716 }
7717
7719 {
7721 }
7722
7724 {
7725 float other_item_quantity = other_item.GetQuantity();
7726 float this_free_space;
7727
7729
7731
7732 if (other_item_quantity > this_free_space)
7733 {
7734 return this_free_space;
7735 }
7736 else
7737 {
7738 return other_item_quantity;
7739 }
7740 }
7741
7743 {
7745 }
7746
7748 {
7750 return;
7751
7752 if (!IsMagazine() && other_item)
7753 {
7755 if (quantity_used != 0)
7756 {
7757 float hp1 = GetHealth01("","");
7758 float hp2 = other_item.GetHealth01("","");
7759 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7760 hpResult = hpResult / (
GetQuantity() + quantity_used);
7761
7762 hpResult *= GetMaxHealth();
7763 Math.Round(hpResult);
7764 SetHealth("", "Health", hpResult);
7765
7767 other_item.AddQuantity(-quantity_used);
7768 }
7769 }
7771 }
7772
7774 {
7775 #ifdef SERVER
7776 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7777 GetHierarchyParent().IncreaseLifetimeUp();
7778 #endif
7779 };
7780
7782 {
7783 PlayerBase p = PlayerBase.Cast(player);
7784
7785 array<int> recipesIds = p.m_Recipes;
7786 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7787 if (moduleRecipesManager)
7788 {
7789 EntityAI itemInHands = player.GetEntityInHands();
7790 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7791 }
7792
7793 for (int i = 0;i < recipesIds.Count(); i++)
7794 {
7795 int key = recipesIds.Get(i);
7796 string recipeName = moduleRecipesManager.GetRecipeName(key);
7798 }
7799 }
7800
7801
7802 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7803 {
7804 super.GetDebugActions(outputList);
7805
7806
7812
7813
7818
7823
7824
7828
7829
7831 {
7835 }
7836
7839
7840
7844
7846
7847 InventoryLocation loc = new InventoryLocation();
7848 GetInventory().GetCurrentInventoryLocation(loc);
7850 {
7851 if (Gizmo_IsSupported())
7854 }
7855
7857 }
7858
7859
7860
7861
7863 {
7864 super.OnAction(action_id, player, ctx);
7865
7867 {
7868 switch (action_id)
7869 {
7873 return true;
7877 return true;
7878 }
7879 }
7880
7882 {
7883 switch (action_id)
7884 {
7886 Delete();
7887 return true;
7888 }
7889 }
7890
7891 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7892 {
7893 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7894 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7895 PlayerBase p = PlayerBase.Cast(player);
7896 if (
EActions.RECIPES_RANGE_START < 1000)
7897 {
7898 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7899 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7900 }
7901 }
7902 #ifndef SERVER
7903 else if (action_id ==
EActions.WATCH_PLAYER)
7904 {
7905 PluginDeveloper.SetDeveloperItemClientEx(player);
7906 }
7907 #endif
7909 {
7910 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7911 {
7912 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7913 OnDebugButtonPressServer(id + 1);
7914 }
7915
7916 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7917 {
7918 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7920 }
7921
7922 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7923 {
7924 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7926 }
7927
7928 else if (action_id ==
EActions.ADD_QUANTITY)
7929 {
7930 if (IsMagazine())
7931 {
7932 Magazine mag = Magazine.Cast(this);
7933 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7934 }
7935 else
7936 {
7938 }
7939
7940 if (m_EM)
7941 {
7942 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7943 }
7944
7945 }
7946
7947 else if (action_id ==
EActions.REMOVE_QUANTITY)
7948 {
7949 if (IsMagazine())
7950 {
7951 Magazine mag2 = Magazine.Cast(this);
7952 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7953 }
7954 else
7955 {
7957 }
7958 if (m_EM)
7959 {
7960 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7961 }
7962
7963 }
7964
7965 else if (action_id ==
EActions.SET_QUANTITY_0)
7966 {
7968
7969 if (m_EM)
7970 {
7971 m_EM.SetEnergy(0);
7972 }
7973 }
7974
7975 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7976 {
7978
7979 if (m_EM)
7980 {
7981 m_EM.SetEnergy(m_EM.GetEnergyMax());
7982 }
7983 }
7984
7985 else if (action_id ==
EActions.ADD_HEALTH)
7986 {
7987 AddHealth("","",GetMaxHealth("","Health")/5);
7988 }
7989 else if (action_id ==
EActions.REMOVE_HEALTH)
7990 {
7991 AddHealth("","",-GetMaxHealth("","Health")/5);
7992 }
7993 else if (action_id ==
EActions.DESTROY_HEALTH)
7994 {
7995 SetHealth01("","",0);
7996 }
7997 else if (action_id ==
EActions.WATCH_ITEM)
7998 {
8000 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
8001 #ifdef DEVELOPER
8002 SetDebugDeveloper_item(this);
8003 #endif
8004 }
8005
8006 else if (action_id ==
EActions.ADD_TEMPERATURE)
8007 {
8008 AddTemperature(20);
8009
8010 }
8011
8012 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
8013 {
8014 AddTemperature(-20);
8015
8016 }
8017
8018 else if (action_id ==
EActions.FLIP_FROZEN)
8019 {
8020 SetFrozen(!GetIsFrozen());
8021
8022 }
8023
8024 else if (action_id ==
EActions.ADD_WETNESS)
8025 {
8027
8028 }
8029
8030 else if (action_id ==
EActions.REMOVE_WETNESS)
8031 {
8033
8034 }
8035
8036 else if (action_id ==
EActions.LIQUIDTYPE_UP)
8037 {
8040
8041
8042 }
8043
8044 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
8045 {
8048 }
8049
8050 else if (action_id ==
EActions.MAKE_SPECIAL)
8051 {
8052 auto debugParams = DebugSpawnParams.WithPlayer(player);
8053 OnDebugSpawnEx(debugParams);
8054 }
8055
8056 }
8057
8058
8059 return false;
8060 }
8061
8062
8063
8064
8068
8071
8072
8073
8075 {
8076 return false;
8077 }
8078
8079
8081 {
8082 return true;
8083 }
8084
8085
8087 {
8088 return true;
8089 }
8090
8091
8092
8094 {
8095 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
8096 return g_Game.ConfigIsExisting(config_path);
8097 }
8098
8101 {
8102 return null;
8103 }
8104
8106 {
8107 return false;
8108 }
8109
8111 {
8112 return false;
8113 }
8114
8118
8119
8121 {
8122 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8123 return module_repairing.CanRepair(this, item_repair_kit);
8124 }
8125
8126
8127 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
8128 {
8129 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
8130 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
8131 }
8132
8133
8135 {
8136
8137
8138
8139
8140
8141
8142
8143
8144 return 1;
8145 }
8146
8147
8148
8150 {
8152 }
8153
8154
8155
8157 {
8159 }
8160
8161
8170 {
8171 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8172
8173 if (player)
8174 {
8175 player.MessageStatus(text);
8176 }
8177 }
8178
8179
8188 {
8189 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8190
8191 if (player)
8192 {
8193 player.MessageAction(text);
8194 }
8195 }
8196
8197
8206 {
8207 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8208
8209 if (player)
8210 {
8211 player.MessageFriendly(text);
8212 }
8213 }
8214
8215
8224 {
8225 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8226
8227 if (player)
8228 {
8229 player.MessageImportant(text);
8230 }
8231 }
8232
8234 {
8235 return true;
8236 }
8237
8238
8239 override bool KindOf(
string tag)
8240 {
8241 bool found = false;
8242 string item_name = this.
GetType();
8244 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8245
8246 int array_size = item_tag_array.Count();
8247 for (int i = 0; i < array_size; i++)
8248 {
8249 if (item_tag_array.Get(i) == tag)
8250 {
8251 found = true;
8252 break;
8253 }
8254 }
8255 return found;
8256 }
8257
8258
8260 {
8261
8262 super.OnRPC(sender, rpc_type,ctx);
8263
8264
8265 switch (rpc_type)
8266 {
8267 #ifndef SERVER
8268 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8269 Param2<bool, string> p = new Param2<bool, string>(false, "");
8270
8272 return;
8273
8274 bool play = p.param1;
8275 string soundSet = p.param2;
8276
8277 if (play)
8278 {
8280 {
8282 {
8284 }
8285 }
8286 else
8287 {
8289 }
8290 }
8291 else
8292 {
8294 }
8295
8296 break;
8297 #endif
8298
8299 }
8300
8302 {
8304 }
8305 }
8306
8307
8308
8309
8311 {
8312 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8313 return plugin.GetID(
name);
8314 }
8315
8317 {
8318 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8319 return plugin.GetName(id);
8320 }
8321
8324 {
8325
8326
8327 int varFlags;
8328 if (!ctx.
Read(varFlags))
8329 return;
8330
8331 if (varFlags & ItemVariableFlags.FLOAT)
8332 {
8334 }
8335 }
8336
8338 {
8339
8340 super.SerializeNumericalVars(floats_out);
8341
8342
8343
8345 {
8347 }
8348
8350 {
8352 }
8353
8355 {
8357 }
8358
8360 {
8365 }
8366
8368 {
8370 }
8371 }
8372
8374 {
8375
8376 super.DeSerializeNumericalVars(floats);
8377
8378
8379 int index = 0;
8380 int mask = Math.Round(floats.Get(index));
8381
8382 index++;
8383
8385 {
8387 {
8389 }
8390 else
8391 {
8392 float quantity = floats.Get(index);
8394 }
8395 index++;
8396 }
8397
8399 {
8400 float wet = floats.Get(index);
8402 index++;
8403 }
8404
8406 {
8407 int liquidtype = Math.Round(floats.Get(index));
8409 index++;
8410 }
8411
8413 {
8415 index++;
8417 index++;
8419 index++;
8421 index++;
8422 }
8423
8425 {
8426 int cleanness = Math.Round(floats.Get(index));
8428 index++;
8429 }
8430 }
8431
8433 {
8434 super.WriteVarsToCTX(ctx);
8435
8436
8438 {
8440 }
8441
8443 {
8445 }
8446
8448 {
8450 }
8451
8453 {
8454 int r,g,b,a;
8460 }
8461
8463 {
8465 }
8466 }
8467
8469 {
8470 if (!super.ReadVarsFromCTX(ctx,version))
8471 return false;
8472
8473 int intValue;
8474 float value;
8475
8476 if (version < 140)
8477 {
8478 if (!ctx.
Read(intValue))
8479 return false;
8480
8481 m_VariablesMask = intValue;
8482 }
8483
8485 {
8486 if (!ctx.
Read(value))
8487 return false;
8488
8490 {
8492 }
8493 else
8494 {
8496 }
8497 }
8498
8499 if (version < 140)
8500 {
8502 {
8503 if (!ctx.
Read(value))
8504 return false;
8505 SetTemperatureDirect(value);
8506 }
8507 }
8508
8510 {
8511 if (!ctx.
Read(value))
8512 return false;
8514 }
8515
8517 {
8518 if (!ctx.
Read(intValue))
8519 return false;
8521 }
8522
8524 {
8525 int r,g,b,a;
8527 return false;
8529 return false;
8531 return false;
8533 return false;
8534
8536 }
8537
8539 {
8540 if (!ctx.
Read(intValue))
8541 return false;
8543 }
8544
8545 if (version >= 138 && version < 140)
8546 {
8548 {
8549 if (!ctx.
Read(intValue))
8550 return false;
8551 SetFrozen(intValue);
8552 }
8553 }
8554
8555 return true;
8556 }
8557
8558
8560 {
8563 {
8565 }
8566
8567 if (!super.OnStoreLoad(ctx, version))
8568 {
8570 return false;
8571 }
8572
8573 if (version >= 114)
8574 {
8575 bool hasQuickBarIndexSaved;
8576
8577 if (!ctx.
Read(hasQuickBarIndexSaved))
8578 {
8580 return false;
8581 }
8582
8583 if (hasQuickBarIndexSaved)
8584 {
8585 int itmQBIndex;
8586
8587
8588 if (!ctx.
Read(itmQBIndex))
8589 {
8591 return false;
8592 }
8593
8594 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8595 if (itmQBIndex != -1 && parentPlayer)
8596 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8597 }
8598 }
8599 else
8600 {
8601
8602 PlayerBase player;
8603 int itemQBIndex;
8604 if (version ==
int.
MAX)
8605 {
8606 if (!ctx.
Read(itemQBIndex))
8607 {
8609 return false;
8610 }
8611 }
8612 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8613 {
8614
8615 if (!ctx.
Read(itemQBIndex))
8616 {
8618 return false;
8619 }
8620 if (itemQBIndex != -1 && player)
8621 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8622 }
8623 }
8624
8625 if (version < 140)
8626 {
8627
8628 if (!LoadVariables(ctx, version))
8629 {
8631 return false;
8632 }
8633 }
8634
8635
8637 {
8639 return false;
8640 }
8641 if (version >= 132)
8642 {
8644 if (raib)
8645 {
8647 {
8649 return false;
8650 }
8651 }
8652 }
8653
8655 return true;
8656 }
8657
8658
8659
8661 {
8662 super.OnStoreSave(ctx);
8663
8664 PlayerBase player;
8665 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8666 {
8668
8669 int itemQBIndex = -1;
8670 itemQBIndex = player.FindQuickBarEntityIndex(this);
8671 ctx.
Write(itemQBIndex);
8672 }
8673 else
8674 {
8676 }
8677
8679
8681 if (raib)
8682 {
8684 }
8685 }
8686
8687
8689 {
8690 super.AfterStoreLoad();
8691
8693 {
8695 }
8696
8698 {
8701 }
8702 }
8703
8705 {
8706 super.EEOnAfterLoad();
8707
8709 {
8711 }
8712
8715 }
8716
8718 {
8719 return false;
8720 }
8721
8722
8723
8725 {
8727 {
8728 #ifdef PLATFORM_CONSOLE
8729
8731 {
8733 if (menu)
8734 {
8736 }
8737 }
8738 #endif
8739 }
8740
8742 {
8745 }
8746
8748 {
8749 SetWeightDirty();
8751 }
8753 {
8756 }
8757
8759 {
8762
8765 }
8767 {
8771 }
8772
8773 super.OnVariablesSynchronized();
8774 }
8775
8776
8777
8779 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8780 {
8781 if (!IsServerCheck(allow_client))
8782 return false;
8783
8785 return false;
8786
8789
8790 if (value <= (min + 0.001))
8791 value = min;
8792
8793 if (value == min)
8794 {
8795 if (destroy_config)
8796 {
8797 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8798 if (dstr)
8799 {
8801 this.Delete();
8802 return true;
8803 }
8804 }
8805 else if (destroy_forced)
8806 {
8808 this.Delete();
8809 return true;
8810 }
8811
8813 }
8814
8817
8819 {
8820 EntityAI parent = GetHierarchyRoot();
8821 InventoryLocation iLoc = new InventoryLocation();
8822 GetInventory().GetCurrentInventoryLocation(iLoc);
8824 {
8825 int iLocSlot = iLoc.
GetSlot();
8827 {
8829 }
8831 {
8833 }
8834 }
8835 }
8836
8838 {
8840
8841 if (delta)
8843 }
8844
8846
8847 return false;
8848 }
8849
8850
8852 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8853 {
8855 }
8856
8858 {
8861 }
8862
8864 {
8867 }
8868
8870 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8871 {
8872 float value_clamped = Math.Clamp(value, 0, 1);
8874 SetQuantity(result, destroy_config, destroy_forced);
8875 }
8876
8877
8880 {
8882 }
8883
8885 {
8887 }
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8899 {
8900 int slot = -1;
8901 GameInventory inventory = GetInventory();
8902 if (inventory)
8903 {
8904 InventoryLocation il = new InventoryLocation;
8907 }
8908
8910 }
8911
8913 {
8914 float quantity_max = 0;
8915
8917 {
8918 if (attSlotID != -1)
8919 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8920
8921 if (quantity_max <= 0)
8923 }
8924
8925 if (quantity_max <= 0)
8927
8928 return quantity_max;
8929 }
8930
8932 {
8934 }
8935
8937 {
8939 }
8940
8941
8943 {
8945 }
8946
8948 {
8950 }
8951
8953 {
8955 }
8956
8957
8959 {
8960
8961 float weightEx = GetWeightEx();
8962 float special = GetInventoryAndCargoWeight();
8963 return weightEx - special;
8964 }
8965
8966
8968 {
8970 }
8971
8973 {
8975 {
8976 #ifdef DEVELOPER
8977 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8978 {
8979 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8981 }
8982 #endif
8983
8985 }
8986 else if (HasEnergyManager())
8987 {
8988 #ifdef DEVELOPER
8989 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8990 {
8991 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8992 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8993 }
8994 #endif
8995 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
8996 }
8997 else
8998 {
8999 #ifdef DEVELOPER
9000 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
9001 {
9002 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
9003 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
9004 }
9005 #endif
9006 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
9007 }
9008 }
9009
9012 {
9013 int item_count = 0;
9015
9016 GameInventory inventory = GetInventory();
9017 CargoBase cargo = inventory.
GetCargo();
9018 if (cargo != NULL)
9019 {
9021 }
9022
9024 for (int i = 0; i < nAttachments; ++i)
9025 {
9027 if (item)
9028 item_count += item.GetNumberOfItems();
9029 }
9030 return item_count;
9031 }
9032
9035 {
9036 float weight = 0;
9037 float wetness = 1;
9038 if (include_wetness)
9041 {
9042 weight = wetness * m_ConfigWeight;
9043 }
9045 {
9046 weight = 1;
9047 }
9048 return weight;
9049 }
9050
9051
9052
9054 {
9055 GameInventory inventory = GetInventory();
9056 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
9057 {
9058 array<EntityAI> items = new array<EntityAI>;
9060 for (int i = 0; i < items.Count(); ++i)
9061 {
9063 if (item)
9064 {
9065 g_Game.ObjectDelete(item);
9066 }
9067 }
9068 }
9069 }
9070
9071
9072
9073
9075 {
9076 float energy = 0;
9077 if (HasEnergyManager())
9078 {
9079 energy = GetCompEM().GetEnergy();
9080 }
9081 return energy;
9082 }
9083
9084
9086 {
9087 super.OnEnergyConsumed();
9088
9090 }
9091
9093 {
9094 super.OnEnergyAdded();
9095
9097 }
9098
9099
9101 {
9102 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
9103 {
9105 {
9106 float energy_0to1 = GetCompEM().GetEnergy0To1();
9108 }
9109 }
9110 }
9111
9112
9114 {
9115 return ConfigGetFloat("heatIsolation");
9116 }
9117
9119 {
9121 }
9122
9124 {
9125 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
9126 if (
g_Game.ConfigIsExisting(paramPath))
9127 return g_Game.ConfigGetFloat(paramPath);
9128
9129 return 0.0;
9130 }
9131
9133 {
9134 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
9135 if (
g_Game.ConfigIsExisting(paramPath))
9136 return g_Game.ConfigGetFloat(paramPath);
9137
9138 return 0.0;
9139 }
9140
9141 override void SetWet(
float value,
bool allow_client =
false)
9142 {
9143 if (!IsServerCheck(allow_client))
9144 return;
9145
9148
9150
9151 m_VarWet = Math.Clamp(value, min, max);
9152
9154 {
9157 }
9158 }
9159
9160 override void AddWet(
float value)
9161 {
9163 }
9164
9166 {
9168 }
9169
9171 {
9173 }
9174
9176 {
9178 }
9179
9181 {
9183 }
9184
9186 {
9188 }
9189
9191 {
9194 if (newLevel != oldLevel)
9195 {
9197 }
9198 }
9199
9201 {
9202 SetWeightDirty();
9203 }
9204
9206 {
9207 return GetWetLevelInternal(
m_VarWet);
9208 }
9209
9210
9211
9213 {
9215 }
9216
9218 {
9220 }
9221
9223 {
9225 }
9226
9228 {
9230 }
9231
9232
9233
9235 {
9236 if (ConfigIsExisting("itemModelLength"))
9237 {
9238 return ConfigGetFloat("itemModelLength");
9239 }
9240 return 0;
9241 }
9242
9244 {
9245 if (ConfigIsExisting("itemAttachOffset"))
9246 {
9247 return ConfigGetFloat("itemAttachOffset");
9248 }
9249 return 0;
9250 }
9251
9252 override void SetCleanness(
int value,
bool allow_client =
false)
9253 {
9254 if (!IsServerCheck(allow_client))
9255 return;
9256
9258
9260
9263 }
9264
9266 {
9268 }
9269
9271 {
9272 return true;
9273 }
9274
9275
9276
9277
9279 {
9281 }
9282
9284 {
9286 }
9287
9288
9289
9290
9291 override void SetColor(
int r,
int g,
int b,
int a)
9292 {
9298 }
9300 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9301 {
9306 }
9307
9309 {
9311 }
9312
9315 {
9316 int r,g,b,a;
9318 r = r/255;
9319 g = g/255;
9320 b = b/255;
9321 a = a/255;
9322 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9323 }
9324
9325
9326
9327 override void SetLiquidType(
int value,
bool allow_client =
false)
9328 {
9329 if (!IsServerCheck(allow_client))
9330 return;
9331
9336 }
9337
9339 {
9340 return ConfigGetInt("varLiquidTypeInit");
9341 }
9342
9344 {
9346 }
9347
9349 {
9351 SetFrozen(false);
9352 }
9353
9356 {
9357 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9358 }
9359
9360
9363 {
9364 PlayerBase nplayer;
9365 if (PlayerBase.CastTo(nplayer, player))
9366 {
9368 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9369 }
9370 }
9371
9372
9375 {
9376 PlayerBase nplayer;
9377 if (PlayerBase.CastTo(nplayer,player))
9378 {
9379 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9380 }
9381
9382 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9383
9384 if (HasEnergyManager())
9385 {
9386 GetCompEM().UpdatePlugState();
9387 }
9388 }
9389
9390
9392 {
9393 super.OnPlacementStarted(player);
9394
9396 }
9397
9398 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9399 {
9401 {
9402 m_AdminLog.OnPlacementComplete(player,
this);
9403 }
9404
9405 super.OnPlacementComplete(player, position, orientation);
9406 }
9407
9408
9409
9410
9411
9413 {
9415 {
9416 return true;
9417 }
9418 else
9419 {
9420 return false;
9421 }
9422 }
9423
9424
9426 {
9428 {
9430 }
9431 }
9432
9433
9435 {
9437 }
9438
9440 {
9442 }
9443
9444 override void InsertAgent(
int agent,
float count = 1)
9445 {
9446 if (count < 1)
9447 return;
9448
9450 }
9451
9454 {
9456 }
9457
9458
9460 {
9462 }
9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9504
9506 {
9508 return false;
9509 return true;
9510 }
9511
9513 {
9514
9516 }
9517
9518
9521 {
9522 super.CheckForRoofLimited(timeTresholdMS);
9523
9524 float time =
g_Game.GetTime();
9525 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9526 {
9527 m_PreviousRoofTestTime = time;
9528 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9529 }
9530 }
9531
9532
9534 {
9536 {
9537 return 0;
9538 }
9539
9540 if (GetInventory().GetAttachmentSlotsCount() != 0)
9541 {
9542 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9543 if (filter)
9544 return filter.GetProtectionLevel(type, false, system);
9545 else
9546 return 0;
9547 }
9548
9549 string subclassPath, entryName;
9550
9551 switch (type)
9552 {
9554 entryName = "biological";
9555 break;
9557 entryName = "chemical";
9558 break;
9559 default:
9560 entryName = "biological";
9561 break;
9562 }
9563
9564 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9565
9566 return g_Game.ConfigGetFloat(subclassPath + entryName);
9567 }
9568
9569
9570
9573 {
9574 if (!IsMagazine())
9576
9578 }
9579
9580
9581
9582
9583
9588 {
9589 return true;
9590 }
9591
9593 {
9595 }
9596
9597
9598
9599
9600
9602 {
9603 if (parent)
9604 {
9605 if (parent.IsInherited(DayZInfected))
9606 return true;
9607
9608 if (!parent.IsRuined())
9609 return true;
9610 }
9611
9612 return true;
9613 }
9614
9616 {
9617 if (!super.CanPutAsAttachment(parent))
9618 {
9619 return false;
9620 }
9621
9622 if (!IsRuined() && !parent.IsRuined())
9623 {
9624 return true;
9625 }
9626
9627 return false;
9628 }
9629
9631 {
9632
9633
9634
9635
9636 return super.CanReceiveItemIntoCargo(item);
9637 }
9638
9640 {
9641
9642
9643
9644
9645 GameInventory attachmentInv = attachment.GetInventory();
9647 {
9648 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9649 return false;
9650 }
9651
9652 InventoryLocation loc = new InventoryLocation();
9653 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9654 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9655 return false;
9656
9657 return super.CanReceiveAttachment(attachment, slotId);
9658 }
9659
9661 {
9662 if (!super.CanReleaseAttachment(attachment))
9663 return false;
9664
9665 return GetInventory().AreChildrenAccessible();
9666 }
9667
9668
9669
9670
9671
9672
9673
9674
9675
9676
9677
9678
9679
9680
9681
9682
9683
9684
9685
9686
9687
9689 {
9690 int id = muzzle_owner.GetMuzzleID();
9691 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9692
9693 if (WPOF_array)
9694 {
9695 for (int i = 0; i < WPOF_array.Count(); i++)
9696 {
9697 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9698
9699 if (WPOF)
9700 {
9701 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9702 }
9703 }
9704 }
9705 }
9706
9707
9709 {
9710 int id = muzzle_owner.GetMuzzleID();
9712
9713 if (WPOBE_array)
9714 {
9715 for (int i = 0; i < WPOBE_array.Count(); i++)
9716 {
9717 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9718
9719 if (WPOBE)
9720 {
9721 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9722 }
9723 }
9724 }
9725 }
9726
9727
9729 {
9730 int id = muzzle_owner.GetMuzzleID();
9731 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9732
9733 if (WPOOH_array)
9734 {
9735 for (int i = 0; i < WPOOH_array.Count(); i++)
9736 {
9737 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9738
9739 if (WPOOH)
9740 {
9741 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9742 }
9743 }
9744 }
9745 }
9746
9747
9749 {
9750 int id = muzzle_owner.GetMuzzleID();
9751 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9752
9753 if (WPOOH_array)
9754 {
9755 for (int i = 0; i < WPOOH_array.Count(); i++)
9756 {
9757 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9758
9759 if (WPOOH)
9760 {
9761 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9762 }
9763 }
9764 }
9765 }
9766
9767
9769 {
9770 int id = muzzle_owner.GetMuzzleID();
9771 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9772
9773 if (WPOOH_array)
9774 {
9775 for (int i = 0; i < WPOOH_array.Count(); i++)
9776 {
9777 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9778
9779 if (WPOOH)
9780 {
9781 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9782 }
9783 }
9784 }
9785 }
9786
9787
9788
9790 {
9792 {
9793 return true;
9794 }
9795
9796 return false;
9797 }
9798
9800 {
9802 {
9803 return true;
9804 }
9805
9806 return false;
9807 }
9808
9810 {
9812 {
9813 return true;
9814 }
9815
9816 return false;
9817 }
9818
9820 {
9821 return false;
9822 }
9823
9826 {
9827 return UATimeSpent.DEFAULT_DEPLOY;
9828 }
9829
9830
9831
9832
9834 {
9836 SetSynchDirty();
9837 }
9838
9840 {
9842 }
9843
9844
9846 {
9847 return false;
9848 }
9849
9852 {
9853 string att_type = "None";
9854
9855 if (ConfigIsExisting("soundAttType"))
9856 {
9857 att_type = ConfigGetString("soundAttType");
9858 }
9859
9861 }
9862
9864 {
9866 }
9867
9868
9869
9870
9871
9877
9879 {
9882
9884 }
9885
9886
9888 {
9890 return;
9891
9893
9896
9899
9900 SoundParameters params = new SoundParameters();
9904 }
9905
9906
9908 {
9910 {
9913
9914 SetSynchDirty();
9915
9918 }
9919 }
9920
9922 {
9924 }
9925
9926
9928 {
9930 return;
9931
9933 SetSynchDirty();
9934
9937 }
9938
9940 {
9943 }
9944
9946 {
9948 }
9949
9950 void OnApply(PlayerBase player);
9951
9953 {
9954 return 1.0;
9955 };
9956
9958 {
9960 }
9961
9963 {
9965 }
9966
9968
9970 {
9971 SetDynamicPhysicsLifeTime(0.01);
9973 }
9974
9976 {
9977 array<string> zone_names = new array<string>;
9978 GetDamageZones(zone_names);
9979 for (int i = 0; i < zone_names.Count(); i++)
9980 {
9981 SetHealthMax(zone_names.Get(i),"Health");
9982 }
9983 SetHealthMax("","Health");
9984 }
9985
9988 {
9989 float global_health = GetHealth01("","Health");
9990 array<string> zones = new array<string>;
9991 GetDamageZones(zones);
9992
9993 for (int i = 0; i < zones.Count(); i++)
9994 {
9995 SetHealth01(zones.Get(i),"Health",global_health);
9996 }
9997 }
9998
10001 {
10002 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
10003 }
10004
10006 {
10007 if (!hasRootAsPlayer)
10008 {
10009 if (refParentIB)
10010 {
10011
10012 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
10013 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
10014
10015 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
10016 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
10017
10020 }
10021 else
10022 {
10023
10026 }
10027 }
10028 }
10029
10031 {
10033 {
10034 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
10035 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
10036 {
10037 float heatPermCoef = 1.0;
10039 while (ent)
10040 {
10041 heatPermCoef *= ent.GetHeatPermeabilityCoef();
10042 ent = ent.GetHierarchyParent();
10043 }
10044
10045 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
10046 }
10047 }
10048 }
10049
10051 {
10052
10053 EntityAI parent = GetHierarchyParent();
10054 if (!parent)
10055 {
10056 hasParent = false;
10057 hasRootAsPlayer = false;
10058 }
10059 else
10060 {
10061 hasParent = true;
10062 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
10063 refParentIB =
ItemBase.Cast(parent);
10064 }
10065 }
10066
10067 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
10068 {
10069
10070 }
10071
10073 {
10074
10075 return false;
10076 }
10077
10079 {
10080
10081
10082 return false;
10083 }
10084
10086 {
10087
10088 return false;
10089 }
10090
10093 {
10094 return !GetIsFrozen() &&
IsOpen();
10095 }
10096
10098 {
10099 bool hasParent = false, hasRootAsPlayer = false;
10101
10102 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
10103 bool foodDecay =
g_Game.IsFoodDecayEnabled();
10104
10105 if (wwtu || foodDecay)
10106 {
10110
10111 if (processWetness || processTemperature || processDecay)
10112 {
10114
10115 if (processWetness)
10116 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
10117
10118 if (processTemperature)
10120
10121 if (processDecay)
10122 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
10123 }
10124 }
10125 }
10126
10129 {
10131 }
10132
10134 {
10137
10138 return super.GetTemperatureFreezeThreshold();
10139 }
10140
10142 {
10145
10146 return super.GetTemperatureThawThreshold();
10147 }
10148
10150 {
10153
10154 return super.GetItemOverheatThreshold();
10155 }
10156
10158 {
10160 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
10161
10162 return super.GetTemperatureFreezeTime();
10163 }
10164
10166 {
10168 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10169
10170 return super.GetTemperatureThawTime();
10171 }
10172
10177
10179 {
10180 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10181 }
10182
10184 {
10185 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10186 }
10187
10190 {
10192 }
10193
10195 {
10197 }
10198
10200 {
10202 }
10203
10206 {
10207 return null;
10208 }
10209
10212 {
10213 return false;
10214 }
10215
10217 {
10219 {
10222 if (!trg)
10223 {
10225 explosive = this;
10226 }
10227
10228 explosive.PairRemote(trg);
10230
10231 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10232 trg.SetPersistentPairID(persistentID);
10233 explosive.SetPersistentPairID(persistentID);
10234
10235 return true;
10236 }
10237 return false;
10238 }
10239
10242 {
10243 float ret = 1.0;
10246 ret *= GetHealth01();
10247
10248 return ret;
10249 }
10250
10251 #ifdef DEVELOPER
10252 override void SetDebugItem()
10253 {
10254 super.SetDebugItem();
10255 _itemBase = this;
10256 }
10257
10259 {
10260 string text = super.GetDebugText();
10261
10263 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10264
10265 return text;
10266 }
10267 #endif
10268
10270 {
10271 return true;
10272 }
10273
10275
10277
10279 {
10282 }
10283
10284
10292
10308
10309 [
Obsolete(
"Use ItemSoundHandler instead")]
10312 {
10313 if (!
g_Game.IsDedicatedServer())
10314 {
10315 if (ConfigIsExisting("attachSoundSet"))
10316 {
10317 string cfg_path = "";
10318 string soundset = "";
10319 string type_name =
GetType();
10320
10323 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10324 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10325
10326 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10327 {
10328 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10329 {
10330 if (cfg_slot_array[i] == slot_type)
10331 {
10332 soundset = cfg_soundset_array[i];
10333 break;
10334 }
10335 }
10336 }
10337
10338 if (soundset != "")
10339 {
10340 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10342 }
10343 }
10344 }
10345 }
10346
10348}
10349
10351{
10353 if (entity)
10354 {
10355 bool is_item = entity.IsInherited(
ItemBase);
10356 if (is_item && full_quantity)
10357 {
10360 }
10361 }
10362 else
10363 {
10365 return NULL;
10366 }
10367 return entity;
10368}
10369
10371{
10372 if (item)
10373 {
10374 if (health > 0)
10375 item.SetHealth("", "", health);
10376
10377 if (item.CanHaveTemperature())
10378 {
10380 if (item.CanFreeze())
10381 item.SetFrozen(false);
10382 }
10383
10384 if (item.HasEnergyManager())
10385 {
10386 if (quantity >= 0)
10387 {
10388 item.GetCompEM().SetEnergy0To1(quantity);
10389 }
10390 else
10391 {
10393 }
10394 }
10395 else if (item.IsMagazine())
10396 {
10397 Magazine mag = Magazine.Cast(item);
10398 if (quantity >= 0)
10399 {
10400 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10401 }
10402 else
10403 {
10405 }
10406
10407 }
10408 else
10409 {
10410 if (quantity >= 0)
10411 {
10412 item.SetQuantityNormalized(quantity, false);
10413 }
10414 else
10415 {
10417 }
10418
10419 }
10420 }
10421}
10422
10423#ifdef DEVELOPER
10425#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
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
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
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 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)
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)
bool ShouldSplitQuantity(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)
override 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...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
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)
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 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)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
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
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 string GetFoldSoundset()
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 string GetLoopFoldSoundset()
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.