5166{
5168 {
5169 return true;
5170 }
5171};
5172
5173
5174
5176{
5180
5182
5185
5186
5187
5188
5189
5198
5204
5209
5214
5235 protected bool m_IsResultOfSplit
5236
5238
5243
5244
5245
5247
5251
5252
5253
5255
5258
5259
5260
5266
5267
5275
5278
5279
5281
5282
5284
5285
5290
5291
5296
5297
5299
5300
5302 {
5307
5308 if (!
GetGame().IsDedicatedServer())
5309 {
5311 {
5313
5315 {
5317 }
5318 }
5319
5322 }
5323
5324 m_OldLocation = null;
5325
5327 {
5329 }
5330
5331 if (ConfigIsExisting("headSelectionsToHide"))
5332 {
5335 }
5336
5338 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5339 {
5341 }
5342
5344
5345 m_IsResultOfSplit = false;
5346
5348 }
5349
5351 {
5352 super.InitItemVariables();
5353
5359 m_Count = ConfigGetInt(
"count");
5360
5363
5368
5371
5376
5388
5392
5393
5396 if (ConfigIsExisting("canBeSplit"))
5397 {
5400 }
5401
5403 if (ConfigIsExisting("itemBehaviour"))
5405
5406
5409 RegisterNetSyncVariableInt("m_VarLiquidType");
5410 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5411
5412 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5413 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5414 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5415
5416 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5417 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5418 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5419 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5420
5421 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5422 RegisterNetSyncVariableBool("m_IsTakeable");
5423 RegisterNetSyncVariableBool("m_IsHologram");
5424
5427 {
5430 }
5431
5433
5435 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5437
5438 }
5439
5441 {
5443 }
5444
5446 {
5449 {
5454 }
5455 }
5456
5457 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5458 {
5460 {
5463 }
5464
5466 }
5467
5469 {
5475 }
5476
5478
5480 {
5482
5483 if (!action)
5484 {
5485 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5486 return;
5487 }
5488
5490 if (!ai)
5491 {
5493 return;
5494 }
5495
5497 if (!action_array)
5498 {
5499 action_array = new array<ActionBase_Basic>;
5501 }
5502 if (LogManager.IsActionLogEnable())
5503 {
5504 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5505 }
5506
5507 if (action_array.Find(action) != -1)
5508 {
5509 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5510 }
5511 else
5512 {
5513 action_array.Insert(action);
5514 }
5515 }
5516
5518 {
5520 ActionBase action = player.GetActionManager().GetAction(actionName);
5523
5524 if (action_array)
5525 {
5526 action_array.RemoveItem(action);
5527 }
5528 }
5529
5530
5531
5533 {
5534 ActionOverrideData overrideData = new ActionOverrideData();
5538
5540 if (!actionMap)
5541 {
5544 }
5545
5546 actionMap.Insert(this.
Type(), overrideData);
5547
5548 }
5549
5551
5553
5554
5556 {
5559
5562
5563 string config_to_search = "CfgVehicles";
5564 string muzzle_owner_config;
5565
5567 {
5568 if (IsInherited(Weapon))
5569 config_to_search = "CfgWeapons";
5570
5571 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5572
5573 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5574
5576
5577 if (config_OnFire_subclass_count > 0)
5578 {
5579 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5580
5581 for (int i = 0; i < config_OnFire_subclass_count; i++)
5582 {
5583 string particle_class = "";
5585 string config_OnFire_entry = config_OnFire_class + particle_class;
5586 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5587 WPOF_array.Insert(WPOF);
5588 }
5589
5590
5592 }
5593 }
5594
5596 {
5597 config_to_search = "CfgWeapons";
5598 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5599
5600 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5601
5603
5604 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5605 {
5606 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5607
5608 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5609 {
5610 string particle_class2 = "";
5612 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5613 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5614 WPOBE_array.Insert(WPOBE);
5615 }
5616
5617
5619 }
5620 }
5621 }
5622
5623
5625 {
5628
5630 {
5631 string config_to_search = "CfgVehicles";
5632
5633 if (IsInherited(Weapon))
5634 config_to_search = "CfgWeapons";
5635
5636 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5637 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5638
5639 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5640 {
5641
5643
5645 {
5647 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5649 return;
5650 }
5651
5654
5655
5656
5658 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5659
5660 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5661 {
5662 string particle_class = "";
5664 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5666
5667 if (entry_type == CT_CLASS)
5668 {
5669 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5670 WPOOH_array.Insert(WPOF);
5671 }
5672 }
5673
5674
5676 }
5677 }
5678 }
5679
5681 {
5683 }
5684
5686 {
5688 {
5690
5693
5696
5697 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5698 }
5699 }
5700
5702 {
5704 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5705
5707 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5708
5710 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5711
5713 {
5715 }
5716 }
5717
5719 {
5721 }
5722
5724 {
5727 else
5729
5731 {
5734 }
5735 else
5736 {
5739
5742 }
5743
5745 }
5746
5748 {
5750 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5751 }
5752
5754 {
5756 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5758 }
5759
5761 {
5763 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5764 }
5765
5767 {
5770
5771 OverheatingParticle OP = new OverheatingParticle();
5776
5778 }
5779
5781 {
5784
5785 return -1;
5786 }
5787
5789 {
5791 {
5794
5795 for (int i = count; i > 0; --i)
5796 {
5797 int id = i - 1;
5800
5803
5804 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5805 {
5806 if (p)
5807 {
5810 }
5811 }
5812 }
5813 }
5814 }
5815
5817 {
5819 {
5821 {
5822 int id = i - 1;
5824
5825 if (OP)
5826 {
5828
5829 if (p)
5830 {
5832 }
5833
5834 delete OP;
5835 }
5836 }
5837
5840 }
5841 }
5842
5845 {
5846 return 0.0;
5847 }
5848
5849
5851 {
5852 return 250;
5853 }
5854
5856 {
5857 return 0;
5858 }
5859
5862 {
5864 return true;
5865
5866 return false;
5867 }
5868
5871 {
5874
5876 {
5878 }
5879 else
5880 {
5881
5883 }
5884
5886 }
5887
5894 {
5895 return -1;
5896 }
5897
5898
5899
5900
5902 {
5904 {
5906 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
5907
5908 if (r_index >= 0)
5909 {
5910 InventoryLocation r_il = new InventoryLocation;
5911 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
5912
5913 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
5916 {
5917 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
5918 }
5920 {
5921 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
5922 }
5923
5924 }
5925
5926 player.GetHumanInventory().ClearUserReservedLocation(this);
5927 }
5928
5931 }
5932
5933
5934
5935
5937 {
5938 return ItemBase.m_DebugActionsMask;
5939 }
5940
5942 {
5943 return ItemBase.m_DebugActionsMask & mask;
5944 }
5945
5947 {
5948 ItemBase.m_DebugActionsMask = mask;
5949 }
5950
5952 {
5953 ItemBase.m_DebugActionsMask |= mask;
5954 }
5955
5957 {
5958 ItemBase.m_DebugActionsMask &= ~mask;
5959 }
5960
5962 {
5964 {
5966 }
5967 else
5968 {
5970 }
5971 }
5972
5973
5975 {
5976 if (GetEconomyProfile())
5977 {
5978 float q_max = GetEconomyProfile().GetQuantityMax();
5979 if (q_max > 0)
5980 {
5981 float q_min = GetEconomyProfile().GetQuantityMin();
5982 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
5983
5985 {
5986 ComponentEnergyManager comp = GetCompEM();
5988 {
5990 }
5991 }
5993 {
5995
5996 }
5997
5998 }
5999 }
6000 }
6001
6004 {
6005 EntityAI parent = GetHierarchyParent();
6006
6007 if (parent)
6008 {
6009 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6010 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6011 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6012 }
6013 }
6014
6017 {
6018 EntityAI parent = GetHierarchyParent();
6019
6020 if (parent)
6021 {
6022 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6023 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6024 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6025 }
6026 }
6027
6029 {
6030
6031
6032
6033
6035
6037 {
6038 if (ScriptInputUserData.CanStoreInputUserData())
6039 {
6040 ScriptInputUserData ctx = new ScriptInputUserData;
6046 ctx.
Write(use_stack_max);
6049
6051 {
6052 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6053 }
6054 }
6055 }
6056 else if (!
GetGame().IsMultiplayer())
6057 {
6059 }
6060 }
6061
6063 {
6065 }
6066
6068 {
6070 }
6071
6073 {
6075 }
6076
6078 {
6079
6080 return false;
6081 }
6082
6084 {
6085 return false;
6086 }
6087
6091 {
6092 return false;
6093 }
6094
6096 {
6097 return "";
6098 }
6099
6101
6103 {
6104 return false;
6105 }
6106
6108 {
6109 return true;
6110 }
6111
6112
6113
6115 {
6116 return true;
6117 }
6118
6120 {
6121 return true;
6122 }
6123
6125 {
6126 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6128 }
6129
6131 {
6133 }
6134
6136 {
6138 if (!is_being_placed)
6140 SetSynchDirty();
6141 }
6142
6143
6145
6147 {
6149 }
6150
6152 {
6154 }
6155
6157 {
6158 return 1;
6159 }
6160
6162 {
6163 return false;
6164 }
6165
6167 {
6169 SetSynchDirty();
6170 }
6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189
6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6207 {
6208 super.OnMovedInsideCargo(container);
6209
6210 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6211 }
6212
6213 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6214 {
6215 super.EEItemLocationChanged(oldLoc,newLoc);
6216
6217 PlayerBase new_player = null;
6218 PlayerBase old_player = null;
6219
6220 if (newLoc.GetParent())
6221 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6222
6223 if (oldLoc.GetParent())
6224 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6225
6227 {
6228 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6229
6230 if (r_index >= 0)
6231 {
6232 InventoryLocation r_il = new InventoryLocation;
6233 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6234
6235 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6238 {
6239 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6240 }
6242 {
6243 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6244 }
6245
6246 }
6247 }
6248
6250 {
6251 if (new_player)
6252 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6253
6254 if (new_player == old_player)
6255 {
6256
6257 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6258 {
6260 {
6261 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6262 {
6263 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6264 }
6265 }
6266 else
6267 {
6268 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6269 }
6270 }
6271
6272 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6273 {
6274 int type = oldLoc.GetType();
6276 {
6277 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6278 }
6280 {
6281 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6282 }
6283 }
6284 if (!m_OldLocation)
6285 {
6286 m_OldLocation = new InventoryLocation;
6287 }
6288 m_OldLocation.Copy(oldLoc);
6289 }
6290 else
6291 {
6292 if (m_OldLocation)
6293 {
6294 m_OldLocation.Reset();
6295 }
6296 }
6297
6299 }
6300 else
6301 {
6302 if (new_player)
6303 {
6304 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6305 if (res_index >= 0)
6306 {
6307 InventoryLocation il = new InventoryLocation;
6308 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6310 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6313 {
6314 il.
GetParent().GetOnReleaseLock().Invoke(it);
6315 }
6317 {
6319 }
6320
6321 }
6322 }
6324 {
6325
6327 }
6328
6329 if (m_OldLocation)
6330 {
6331 m_OldLocation.Reset();
6332 }
6333 }
6334 }
6335
6336 override void EOnContact(IEntity other, Contact extra)
6337 {
6339 {
6340 int liquidType = -1;
6342 if (impactSpeed > 0.0)
6343 {
6345 #ifndef SERVER
6347 #else
6349 SetSynchDirty();
6350 #endif
6352 }
6353 }
6354
6355 #ifdef SERVER
6356 if (GetCompEM() && GetCompEM().IsPlugged())
6357 {
6358 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6359 GetCompEM().UnplugThis();
6360 }
6361 #endif
6362 }
6363
6365
6367 {
6369 }
6370
6372 {
6373
6374 }
6375
6377 {
6378 super.OnItemLocationChanged(old_owner, new_owner);
6379
6380 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6381 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6382
6383 if (!relatedPlayer && playerNew)
6384 relatedPlayer = playerNew;
6385
6386 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6387 {
6389 if (actionMgr)
6390 {
6391 ActionBase currentAction = actionMgr.GetRunningAction();
6392 if (currentAction)
6394 }
6395 }
6396
6397 Man ownerPlayerOld = null;
6398 Man ownerPlayerNew = null;
6399
6400 if (old_owner)
6401 {
6402 if (old_owner.
IsMan())
6403 {
6404 ownerPlayerOld = Man.Cast(old_owner);
6405 }
6406 else
6407 {
6408 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6409 }
6410 }
6411 else
6412 {
6414 {
6416
6417 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6418 {
6419 GetCompEM().UnplugThis();
6420 }
6421 }
6422 }
6423
6424 if (new_owner)
6425 {
6426 if (new_owner.
IsMan())
6427 {
6428 ownerPlayerNew = Man.Cast(new_owner);
6429 }
6430 else
6431 {
6432 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6433 }
6434 }
6435
6436 if (ownerPlayerOld != ownerPlayerNew)
6437 {
6438 if (ownerPlayerOld)
6439 {
6440 array<EntityAI> subItemsExit = new array<EntityAI>;
6442 for (int i = 0; i < subItemsExit.Count(); i++)
6443 {
6446 }
6447 }
6448
6449 if (ownerPlayerNew)
6450 {
6451 array<EntityAI> subItemsEnter = new array<EntityAI>;
6453 for (int j = 0; j < subItemsEnter.Count(); j++)
6454 {
6457 }
6458 }
6459 }
6460 else if (ownerPlayerNew != null)
6461 {
6462 PlayerBase nplayer;
6463 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6464 {
6465 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6467 for (int k = 0; k < subItemsUpdate.Count(); k++)
6468 {
6470 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6471 }
6472 }
6473 }
6474
6475 if (old_owner)
6476 old_owner.OnChildItemRemoved(this);
6477 if (new_owner)
6478 new_owner.OnChildItemReceived(this);
6479 }
6480
6481
6483 {
6484 super.EEDelete(parent);
6485 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6486 if (player)
6487 {
6489
6490 if (player.IsAlive())
6491 {
6492 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6493 if (r_index >= 0)
6494 {
6495 InventoryLocation r_il = new InventoryLocation;
6496 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6497
6498 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6501 {
6502 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6503 }
6505 {
6506 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6507 }
6508
6509 }
6510
6511 player.RemoveQuickBarEntityShortcut(this);
6512 }
6513 }
6514 }
6515
6517 {
6518 super.EEKilled(killer);
6519
6522 {
6523 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6524 {
6525 if (IsMagazine())
6526 {
6527 if (Magazine.Cast(this).GetAmmoCount() > 0)
6528 {
6530 }
6531 }
6532 else
6533 {
6535 }
6536 }
6537 }
6538 }
6539
6541 {
6542 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6543
6544 super.OnWasAttached(parent, slot_id);
6545
6548
6550 }
6551
6553 {
6554 super.OnWasDetached(parent, slot_id);
6555
6558 }
6559
6561 {
6562 int idx;
6565
6566 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6567 if (inventory_slots.Count() < 1)
6568 {
6569 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6570 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6571 }
6572 else
6573 {
6574 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6575 }
6576
6577 idx = inventory_slots.Find(slot);
6578 if (idx < 0)
6579 return "";
6580
6581 return attach_types.Get(idx);
6582 }
6583
6585 {
6586 int idx = -1;
6587 string slot;
6588
6591
6592 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6593 if (inventory_slots.Count() < 1)
6594 {
6595 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6596 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6597 }
6598 else
6599 {
6600 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6601 if (detach_types.Count() < 1)
6602 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6603 }
6604
6605 for (int i = 0; i < inventory_slots.Count(); i++)
6606 {
6607 slot = inventory_slots.Get(i);
6608 }
6609
6610 if (slot != "")
6611 {
6612 if (detach_types.Count() == 1)
6613 idx = 0;
6614 else
6615 idx = inventory_slots.Find(slot);
6616 }
6617 if (idx < 0)
6618 return "";
6619
6620 return detach_types.Get(idx);
6621 }
6622
6624 {
6625
6627
6628
6629 float min_time = 1;
6630 float max_time = 3;
6631 float delay = Math.RandomFloat(min_time, max_time);
6632
6633 explode_timer.Run(delay, this, "DoAmmoExplosion");
6634 }
6635
6637 {
6638 Magazine magazine = Magazine.Cast(this);
6639 int pop_sounds_count = 6;
6640 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6641
6642
6643 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6644 string sound_name = pop_sounds[ sound_idx ];
6646
6647
6648 magazine.ServerAddAmmoCount(-1);
6649
6650
6651 float min_temp_to_explode = 100;
6652
6653 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6654 {
6656 }
6657 }
6658
6659
6660 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6661 {
6662 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6663
6664 const int CHANCE_DAMAGE_CARGO = 4;
6665 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6666 const int CHANCE_DAMAGE_NOTHING = 2;
6667
6669 {
6670 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6671 int chances;
6672 int rnd;
6673
6674 if (GetInventory().GetCargo())
6675 {
6676 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6677 rnd = Math.RandomInt(0,chances);
6678
6679 if (rnd < CHANCE_DAMAGE_CARGO)
6680 {
6682 }
6683 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6684 {
6686 }
6687 }
6688 else
6689 {
6690 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6691 rnd = Math.RandomInt(0,chances);
6692
6693 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6694 {
6696 }
6697 }
6698 }
6699 }
6700
6702 {
6703 if (GetInventory().GetCargo())
6704 {
6705 int item_count = GetInventory().GetCargo().GetItemCount();
6706 if (item_count > 0)
6707 {
6708 int random_pick = Math.RandomInt(0, item_count);
6710 if (!item.IsExplosive())
6711 {
6712 item.AddHealth("","",damage);
6713 return true;
6714 }
6715 }
6716 }
6717 return false;
6718 }
6719
6721 {
6722 int attachment_count = GetInventory().AttachmentCount();
6723 if (attachment_count > 0)
6724 {
6725 int random_pick = Math.RandomInt(0, attachment_count);
6726 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6727 if (!attachment.IsExplosive())
6728 {
6729 attachment.AddHealth("","",damage);
6730 return true;
6731 }
6732 }
6733 return false;
6734 }
6735
6737 {
6739 }
6740
6742 {
6744 return GetInventory().CanRemoveEntity();
6745
6746 return false;
6747 }
6748
6750 {
6752 return;
6753
6755 {
6756 if (ScriptInputUserData.CanStoreInputUserData())
6757 {
6758 ScriptInputUserData ctx = new ScriptInputUserData;
6763 ctx.
Write(destination_entity);
6767 }
6768 }
6769 else if (!
GetGame().IsMultiplayer())
6770 {
6772 }
6773 }
6774
6776 {
6778 return;
6779
6780 float split_quantity_new;
6784 InventoryLocation loc = new InventoryLocation;
6785
6786 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6787 {
6789 split_quantity_new = stack_max;
6790 else
6792
6793 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6794 if (new_item)
6795 {
6796 new_item.SetResultOfSplit(true);
6797 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6799 new_item.SetQuantity(split_quantity_new);
6800 }
6801 }
6802 else if (destination_entity && slot_id == -1)
6803 {
6804 if (quantity > stack_max)
6805 split_quantity_new = stack_max;
6806 else
6807 split_quantity_new = quantity;
6808
6810 {
6813 }
6814
6815 if (new_item)
6816 {
6817 new_item.SetResultOfSplit(true);
6818 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6820 new_item.SetQuantity(split_quantity_new);
6821 }
6822 }
6823 else
6824 {
6825 if (stack_max != 0)
6826 {
6828 {
6830 }
6831
6832 if (split_quantity_new == 0)
6833 {
6834 if (!
GetGame().IsMultiplayer())
6835 player.PhysicalPredictiveDropItem(this);
6836 else
6837 player.ServerDropEntity(this);
6838 return;
6839 }
6840
6842
6843 if (new_item)
6844 {
6845 new_item.SetResultOfSplit(true);
6846 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6848 new_item.SetQuantity(stack_max);
6849 new_item.PlaceOnSurface();
6850 }
6851 }
6852 }
6853 }
6854
6856 {
6858 return;
6859
6860 float split_quantity_new;
6864 InventoryLocation loc = new InventoryLocation;
6865
6866 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6867 {
6869 split_quantity_new = stack_max;
6870 else
6872
6873 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6874 if (new_item)
6875 {
6876 new_item.SetResultOfSplit(true);
6877 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6879 new_item.SetQuantity(split_quantity_new);
6880 }
6881 }
6882 else if (destination_entity && slot_id == -1)
6883 {
6884 if (quantity > stack_max)
6885 split_quantity_new = stack_max;
6886 else
6887 split_quantity_new = quantity;
6888
6890 {
6893 }
6894
6895 if (new_item)
6896 {
6897 new_item.SetResultOfSplit(true);
6898 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6900 new_item.SetQuantity(split_quantity_new);
6901 }
6902 }
6903 else
6904 {
6905 if (stack_max != 0)
6906 {
6908 {
6910 }
6911
6913
6914 if (new_item)
6915 {
6916 new_item.SetResultOfSplit(true);
6917 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6919 new_item.SetQuantity(stack_max);
6920 new_item.PlaceOnSurface();
6921 }
6922 }
6923 }
6924 }
6925
6927 {
6929 return;
6930
6932 {
6933 if (ScriptInputUserData.CanStoreInputUserData())
6934 {
6935 ScriptInputUserData ctx = new ScriptInputUserData;
6940 dst.WriteToContext(ctx);
6942 }
6943 }
6944 else if (!
GetGame().IsMultiplayer())
6945 {
6947 }
6948 }
6949
6951 {
6953 return;
6954
6956 {
6957 if (ScriptInputUserData.CanStoreInputUserData())
6958 {
6959 ScriptInputUserData ctx = new ScriptInputUserData;
6964 ctx.
Write(destination_entity);
6970 }
6971 }
6972 else if (!
GetGame().IsMultiplayer())
6973 {
6975 }
6976 }
6977
6979 {
6981 }
6982
6984 {
6986 return this;
6987
6989 float split_quantity_new;
6991 if (dst.IsValid())
6992 {
6993 int slot_id = dst.GetSlot();
6995
6996 if (quantity > stack_max)
6997 split_quantity_new = stack_max;
6998 else
6999 split_quantity_new = quantity;
7000
7002
7003 if (new_item)
7004 {
7005 new_item.SetResultOfSplit(true);
7006 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7009 }
7010
7011 return new_item;
7012 }
7013
7014 return null;
7015 }
7016
7018 {
7020 return;
7021
7023 float split_quantity_new;
7025 if (destination_entity)
7026 {
7028 if (quantity > stackable)
7029 split_quantity_new = stackable;
7030 else
7031 split_quantity_new = quantity;
7032
7033 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7034 if (new_item)
7035 {
7036 new_item.SetResultOfSplit(true);
7037 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7039 new_item.SetQuantity(split_quantity_new);
7040 }
7041 }
7042 }
7043
7045 {
7047 return;
7048
7050 {
7051 if (ScriptInputUserData.CanStoreInputUserData())
7052 {
7053 ScriptInputUserData ctx = new ScriptInputUserData;
7058 ItemBase destination_entity =
this;
7059 ctx.
Write(destination_entity);
7063 }
7064 }
7065 else if (!
GetGame().IsMultiplayer())
7066 {
7068 }
7069 }
7070
7072 {
7074 return;
7075
7077 float split_quantity_new;
7079 if (player)
7080 {
7082 if (quantity > stackable)
7083 split_quantity_new = stackable;
7084 else
7085 split_quantity_new = quantity;
7086
7087 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7088 new_item =
ItemBase.Cast(in_hands);
7089 if (new_item)
7090 {
7091 new_item.SetResultOfSplit(true);
7092 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7094 new_item.SetQuantity(split_quantity_new);
7095 }
7096 }
7097 }
7098
7100 {
7102 return;
7103
7105 float split_quantity_new = Math.Floor(quantity * 0.5);
7106
7108
7109 if (new_item)
7110 {
7111 if (new_item.GetQuantityMax() < split_quantity_new)
7112 {
7113 split_quantity_new = new_item.GetQuantityMax();
7114 }
7115
7116 new_item.SetResultOfSplit(true);
7117 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7118
7120 {
7123 }
7124 else
7125 {
7128 }
7129 }
7130 }
7131
7133 {
7135 return;
7136
7138 float split_quantity_new = Math.Floor(quantity / 2);
7139
7140 InventoryLocation invloc = new InventoryLocation;
7142
7144 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7145
7146 if (new_item)
7147 {
7148 if (new_item.GetQuantityMax() < split_quantity_new)
7149 {
7150 split_quantity_new = new_item.GetQuantityMax();
7151 }
7153 {
7156 }
7157 else
7158 {
7161 }
7162 }
7163 }
7164
7167 {
7168 SetWeightDirty();
7170
7171 if (parent)
7172 parent.OnAttachmentQuantityChangedEx(this, delta);
7173
7175 {
7177 {
7179 }
7181 {
7182 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7184 }
7185 }
7186
7187 }
7188
7191 {
7192
7193 }
7194
7197 {
7199 }
7200
7202 {
7203 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7204
7206 {
7207 if (newLevel == GameConstants.STATE_RUINED)
7208 {
7210 EntityAI parent = GetHierarchyParent();
7211 if (parent && parent.IsFireplace())
7212 {
7213 CargoBase cargo = GetInventory().GetCargo();
7214 if (cargo)
7215 {
7217 {
7219 }
7220 }
7221 }
7222 }
7223
7225 {
7226
7228 return;
7229 }
7230
7231 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7232 {
7234 }
7235 }
7236 }
7237
7238
7240 {
7241 super.OnRightClick();
7242
7244 {
7246 {
7247 if (ScriptInputUserData.CanStoreInputUserData())
7248 {
7249 vector m4[4];
7251
7252 EntityAI root = GetHierarchyRoot();
7253
7254 InventoryLocation dst = new InventoryLocation;
7256 {
7257 if (root)
7258 {
7259 root.GetTransform(m4);
7261 }
7262 else
7263 GetInventory().GetCurrentInventoryLocation(dst);
7264 }
7265 else
7266 {
7268
7269
7270 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7271 {
7272 if (root)
7273 {
7274 root.GetTransform(m4);
7276 }
7277 else
7278 GetInventory().GetCurrentInventoryLocation(dst);
7279 }
7280 else
7281 {
7282 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7283 }
7284 }
7285
7286 ScriptInputUserData ctx = new ScriptInputUserData;
7294 }
7295 }
7296 else if (!
GetGame().IsMultiplayer())
7297 {
7299 }
7300 }
7301 }
7302
7303 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7304 {
7305
7306 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7307 return false;
7308
7309 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7310 return false;
7311
7312
7314 return false;
7315
7316
7317 Magazine mag = Magazine.Cast(this);
7318 if (mag)
7319 {
7320 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7321 return false;
7322
7323 if (stack_max_limit)
7324 {
7325 Magazine other_mag = Magazine.Cast(other_item);
7326 if (other_item)
7327 {
7328 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7329 return false;
7330 }
7331
7332 }
7333 }
7334 else
7335 {
7336
7338 return false;
7339
7341 return false;
7342 }
7343
7344 PlayerBase player = null;
7345 if (CastTo(player, GetHierarchyRootPlayer()))
7346 {
7347 if (player.GetInventory().HasAttachment(this))
7348 return false;
7349
7350 if (player.IsItemsToDelete())
7351 return false;
7352 }
7353
7354 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7355 return false;
7356
7357 int slotID;
7359 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7360 return false;
7361
7362 return true;
7363 }
7364
7366 {
7368 }
7369
7371 {
7372 return m_IsResultOfSplit;
7373 }
7374
7376 {
7377 m_IsResultOfSplit = value;
7378 }
7379
7381 {
7383 }
7384
7386 {
7387 float other_item_quantity = other_item.GetQuantity();
7388 float this_free_space;
7389
7391
7393
7394 if (other_item_quantity > this_free_space)
7395 {
7396 return this_free_space;
7397 }
7398 else
7399 {
7400 return other_item_quantity;
7401 }
7402 }
7403
7405 {
7407 }
7408
7410 {
7412 return;
7413
7414 if (!IsMagazine() && other_item)
7415 {
7417 if (quantity_used != 0)
7418 {
7419 float hp1 = GetHealth01("","");
7420 float hp2 = other_item.GetHealth01("","");
7421 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7422 hpResult = hpResult / (
GetQuantity() + quantity_used);
7423
7424 hpResult *= GetMaxHealth();
7425 Math.Round(hpResult);
7426 SetHealth("", "Health", hpResult);
7427
7429 other_item.AddQuantity(-quantity_used);
7430 }
7431 }
7433 }
7434
7436 {
7437 #ifdef SERVER
7438 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7439 GetHierarchyParent().IncreaseLifetimeUp();
7440 #endif
7441 };
7442
7444 {
7445 PlayerBase p = PlayerBase.Cast(player);
7446
7447 array<int> recipesIds = p.m_Recipes;
7448 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7449 if (moduleRecipesManager)
7450 {
7451 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7452 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7453 }
7454
7455 for (int i = 0;i < recipesIds.Count(); i++)
7456 {
7457 int key = recipesIds.Get(i);
7458 string recipeName = moduleRecipesManager.GetRecipeName(key);
7460 }
7461 }
7462
7463
7464 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7465 {
7466 super.GetDebugActions(outputList);
7467
7468
7473
7474
7478
7482
7483
7486
7487
7489 {
7492 }
7493
7495
7498
7502 }
7503
7504
7505
7506
7508 {
7509 super.OnAction(action_id, player, ctx);
7510 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7511 {
7512 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7513 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7514 PlayerBase p = PlayerBase.Cast(player);
7515 if (
EActions.RECIPES_RANGE_START < 1000)
7516 {
7517 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7518 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7519 }
7520 }
7521 #ifndef SERVER
7522 else if (action_id ==
EActions.WATCH_PLAYER)
7523 {
7524 PluginDeveloper.SetDeveloperItemClientEx(player);
7525 }
7526 #endif
7528 {
7529 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7530 {
7531 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7532 OnDebugButtonPressServer(id + 1);
7533 }
7534
7535 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7536 {
7537 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7539 }
7540
7541 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7542 {
7543 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7545 }
7546
7547 else if (action_id ==
EActions.ADD_QUANTITY)
7548 {
7549 if (IsMagazine())
7550 {
7551 Magazine mag = Magazine.Cast(this);
7552 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7553 }
7554 else
7555 {
7557 }
7558
7559 if (m_EM)
7560 {
7561 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7562 }
7563
7564 }
7565
7566 else if (action_id ==
EActions.REMOVE_QUANTITY)
7567 {
7568 if (IsMagazine())
7569 {
7570 Magazine mag2 = Magazine.Cast(this);
7571 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7572 }
7573 else
7574 {
7576 }
7577 if (m_EM)
7578 {
7579 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7580 }
7581
7582 }
7583
7584 else if (action_id ==
EActions.SET_QUANTITY_0)
7585 {
7587
7588 if (m_EM)
7589 {
7590 m_EM.SetEnergy(0);
7591 }
7592 }
7593
7594 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7595 {
7597
7598 if (m_EM)
7599 {
7600 m_EM.SetEnergy(m_EM.GetEnergyMax());
7601 }
7602 }
7603
7604 else if (action_id ==
EActions.ADD_HEALTH)
7605 {
7606 AddHealth("","",GetMaxHealth("","Health")/5);
7607 }
7608 else if (action_id ==
EActions.REMOVE_HEALTH)
7609 {
7610 AddHealth("","",-GetMaxHealth("","Health")/5);
7611 }
7612 else if (action_id ==
EActions.DESTROY_HEALTH)
7613 {
7614 SetHealth01("","",0);
7615 }
7616 else if (action_id ==
EActions.WATCH_ITEM)
7617 {
7619 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7620 #ifdef DEVELOPER
7621 SetDebugDeveloper_item(this);
7622 #endif
7623 }
7624
7625 else if (action_id ==
EActions.ADD_TEMPERATURE)
7626 {
7627 AddTemperature(20);
7628
7629 }
7630
7631 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7632 {
7633 AddTemperature(-20);
7634
7635 }
7636
7637 else if (action_id ==
EActions.FLIP_FROZEN)
7638 {
7639 SetFrozen(!GetIsFrozen());
7640
7641 }
7642
7643 else if (action_id ==
EActions.ADD_WETNESS)
7644 {
7646
7647 }
7648
7649 else if (action_id ==
EActions.REMOVE_WETNESS)
7650 {
7652
7653 }
7654
7655 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7656 {
7659
7660
7661 }
7662
7663 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7664 {
7667 }
7668
7669 else if (action_id ==
EActions.MAKE_SPECIAL)
7670 {
7671 auto debugParams = DebugSpawnParams.WithPlayer(player);
7672 OnDebugSpawnEx(debugParams);
7673 }
7674
7675 else if (action_id ==
EActions.DELETE)
7676 {
7677 Delete();
7678 }
7679
7680 }
7681
7682
7683 return false;
7684 }
7685
7686
7687
7688
7692
7695
7696
7697
7699 {
7700 return false;
7701 }
7702
7703
7705 {
7706 return true;
7707 }
7708
7709
7711 {
7712 return true;
7713 }
7714
7715
7716
7718 {
7719 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7721 }
7722
7725 {
7726 return null;
7727 }
7728
7730 {
7731 return false;
7732 }
7733
7735 {
7736 return false;
7737 }
7738
7742
7743
7745 {
7746 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7747 return module_repairing.CanRepair(this, item_repair_kit);
7748 }
7749
7750
7751 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7752 {
7753 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7754 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7755 }
7756
7757
7759 {
7760
7761
7762
7763
7764
7765
7766
7767
7768 return 1;
7769 }
7770
7771
7772
7774 {
7776 }
7777
7778
7779
7781 {
7783 }
7784
7785
7794 {
7795 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7796
7797 if (player)
7798 {
7799 player.MessageStatus(text);
7800 }
7801 }
7802
7803
7812 {
7813 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7814
7815 if (player)
7816 {
7817 player.MessageAction(text);
7818 }
7819 }
7820
7821
7830 {
7831 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7832
7833 if (player)
7834 {
7835 player.MessageFriendly(text);
7836 }
7837 }
7838
7839
7848 {
7849 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7850
7851 if (player)
7852 {
7853 player.MessageImportant(text);
7854 }
7855 }
7856
7858 {
7859 return true;
7860 }
7861
7862
7863 override bool KindOf(
string tag)
7864 {
7865 bool found = false;
7866 string item_name = this.
GetType();
7869
7870 int array_size = item_tag_array.Count();
7871 for (int i = 0; i < array_size; i++)
7872 {
7873 if (item_tag_array.Get(i) == tag)
7874 {
7875 found = true;
7876 break;
7877 }
7878 }
7879 return found;
7880 }
7881
7882
7884 {
7885
7886 super.OnRPC(sender, rpc_type,ctx);
7887
7888
7889 switch (rpc_type)
7890 {
7891 #ifndef SERVER
7892 case ERPCs.RPC_SOUND_LOCK_ATTACH:
7893 Param2<bool, string> p = new Param2<bool, string>(false, "");
7894
7896 return;
7897
7898 bool play = p.param1;
7899 string soundSet = p.param2;
7900
7901 if (play)
7902 {
7904 {
7906 {
7908 }
7909 }
7910 else
7911 {
7913 }
7914 }
7915 else
7916 {
7918 }
7919
7920 break;
7921 #endif
7922
7923 }
7924
7926 {
7928 }
7929 }
7930
7931
7932
7933
7935 {
7936 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
7937 return plugin.GetID(
name);
7938 }
7939
7941 {
7942 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
7943 return plugin.GetName(id);
7944 }
7945
7948 {
7949
7950
7951 int varFlags;
7952 if (!ctx.
Read(varFlags))
7953 return;
7954
7955 if (varFlags & ItemVariableFlags.FLOAT)
7956 {
7958 }
7959 }
7960
7962 {
7963
7964 super.SerializeNumericalVars(floats_out);
7965
7966
7967
7969 {
7971 }
7972
7974 {
7976 }
7977
7979 {
7981 }
7982
7984 {
7989 }
7990
7992 {
7994 }
7995 }
7996
7998 {
7999
8000 super.DeSerializeNumericalVars(floats);
8001
8002
8003 int index = 0;
8004 int mask = Math.Round(floats.Get(index));
8005
8006 index++;
8007
8009 {
8011 {
8013 }
8014 else
8015 {
8016 float quantity = floats.Get(index);
8018 }
8019 index++;
8020 }
8021
8023 {
8024 float wet = floats.Get(index);
8026 index++;
8027 }
8028
8030 {
8031 int liquidtype = Math.Round(floats.Get(index));
8033 index++;
8034 }
8035
8037 {
8039 index++;
8041 index++;
8043 index++;
8045 index++;
8046 }
8047
8049 {
8050 int cleanness = Math.Round(floats.Get(index));
8052 index++;
8053 }
8054 }
8055
8057 {
8058 super.WriteVarsToCTX(ctx);
8059
8060
8062 {
8064 }
8065
8067 {
8069 }
8070
8072 {
8074 }
8075
8077 {
8078 int r,g,b,a;
8084 }
8085
8087 {
8089 }
8090 }
8091
8093 {
8094 if (!super.ReadVarsFromCTX(ctx,version))
8095 return false;
8096
8097 int intValue;
8098 float value;
8099
8100 if (version < 140)
8101 {
8102 if (!ctx.
Read(intValue))
8103 return false;
8104
8105 m_VariablesMask = intValue;
8106 }
8107
8109 {
8110 if (!ctx.
Read(value))
8111 return false;
8112
8114 {
8116 }
8117 else
8118 {
8120 }
8121 }
8122
8123 if (version < 140)
8124 {
8126 {
8127 if (!ctx.
Read(value))
8128 return false;
8129 SetTemperatureDirect(value);
8130 }
8131 }
8132
8134 {
8135 if (!ctx.
Read(value))
8136 return false;
8138 }
8139
8141 {
8142 if (!ctx.
Read(intValue))
8143 return false;
8145 }
8146
8148 {
8149 int r,g,b,a;
8151 return false;
8153 return false;
8155 return false;
8157 return false;
8158
8160 }
8161
8163 {
8164 if (!ctx.
Read(intValue))
8165 return false;
8167 }
8168
8169 if (version >= 138 && version < 140)
8170 {
8172 {
8173 if (!ctx.
Read(intValue))
8174 return false;
8175 SetFrozen(intValue);
8176 }
8177 }
8178
8179 return true;
8180 }
8181
8182
8184 {
8187 {
8189 }
8190
8191 if (!super.OnStoreLoad(ctx, version))
8192 {
8194 return false;
8195 }
8196
8197 if (version >= 114)
8198 {
8199 bool hasQuickBarIndexSaved;
8200
8201 if (!ctx.
Read(hasQuickBarIndexSaved))
8202 {
8204 return false;
8205 }
8206
8207 if (hasQuickBarIndexSaved)
8208 {
8209 int itmQBIndex;
8210
8211
8212 if (!ctx.
Read(itmQBIndex))
8213 {
8215 return false;
8216 }
8217
8218 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8219 if (itmQBIndex != -1 && parentPlayer)
8220 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8221 }
8222 }
8223 else
8224 {
8225
8226 PlayerBase player;
8227 int itemQBIndex;
8228 if (version ==
int.
MAX)
8229 {
8230 if (!ctx.
Read(itemQBIndex))
8231 {
8233 return false;
8234 }
8235 }
8236 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8237 {
8238
8239 if (!ctx.
Read(itemQBIndex))
8240 {
8242 return false;
8243 }
8244 if (itemQBIndex != -1 && player)
8245 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8246 }
8247 }
8248
8249 if (version < 140)
8250 {
8251
8252 if (!LoadVariables(ctx, version))
8253 {
8255 return false;
8256 }
8257 }
8258
8259
8261 {
8263 return false;
8264 }
8265 if (version >= 132)
8266 {
8268 if (raib)
8269 {
8271 {
8273 return false;
8274 }
8275 }
8276 }
8277
8279 return true;
8280 }
8281
8282
8283
8285 {
8286 super.OnStoreSave(ctx);
8287
8288 PlayerBase player;
8289 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8290 {
8292
8293 int itemQBIndex = -1;
8294 itemQBIndex = player.FindQuickBarEntityIndex(this);
8295 ctx.
Write(itemQBIndex);
8296 }
8297 else
8298 {
8300 }
8301
8303
8305 if (raib)
8306 {
8308 }
8309 }
8310
8311
8313 {
8314 super.AfterStoreLoad();
8315
8317 {
8319 }
8320
8322 {
8325 }
8326 }
8327
8329 {
8330 super.EEOnAfterLoad();
8331
8333 {
8335 }
8336
8339 }
8340
8342 {
8343 return false;
8344 }
8345
8346
8347
8349 {
8351 {
8352 #ifdef PLATFORM_CONSOLE
8353
8355 {
8357 if (menu)
8358 {
8360 }
8361 }
8362 #endif
8363 }
8364
8366 {
8369 }
8370
8372 {
8373 SetWeightDirty();
8375 }
8377 {
8380 }
8381
8383 {
8386 }
8388 {
8391 }
8392
8393 super.OnVariablesSynchronized();
8394 }
8395
8396
8397
8399 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8400 {
8401 if (!IsServerCheck(allow_client))
8402 return false;
8403
8405 return false;
8406
8409
8410 if (value <= (min + 0.001))
8411 value = min;
8412
8413 if (value == min)
8414 {
8415 if (destroy_config)
8416 {
8417 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8418 if (dstr)
8419 {
8421 this.Delete();
8422 return true;
8423 }
8424 }
8425 else if (destroy_forced)
8426 {
8428 this.Delete();
8429 return true;
8430 }
8431
8433 }
8434
8437
8439 {
8441
8442 if (delta)
8444 }
8445
8447
8448 return false;
8449 }
8450
8451
8453 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8454 {
8456 }
8457
8459 {
8462 }
8463
8465 {
8468 }
8469
8472 {
8473 float value_clamped = Math.Clamp(value, 0, 1);
8475 SetQuantity(result, destroy_config, destroy_forced);
8476 }
8477
8478
8481 {
8483 }
8484
8486 {
8488 }
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8500 {
8501 int slot = -1;
8502 if (GetInventory())
8503 {
8504 InventoryLocation il = new InventoryLocation;
8505 GetInventory().GetCurrentInventoryLocation(il);
8507 }
8508
8510 }
8511
8513 {
8514 float quantity_max = 0;
8515
8517 {
8518 if (attSlotID != -1)
8519 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8520
8521 if (quantity_max <= 0)
8523 }
8524
8525 if (quantity_max <= 0)
8527
8528 return quantity_max;
8529 }
8530
8532 {
8534 }
8535
8537 {
8539 }
8540
8541
8543 {
8545 }
8546
8548 {
8550 }
8551
8553 {
8555 }
8556
8557
8559 {
8560
8561 float weightEx = GetWeightEx();
8562 float special = GetInventoryAndCargoWeight();
8563 return weightEx - special;
8564 }
8565
8566
8568 {
8570 }
8571
8573 {
8575 {
8576 #ifdef DEVELOPER
8577 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8578 {
8579 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8581 }
8582 #endif
8583
8585 }
8586 else if (HasEnergyManager())
8587 {
8588 #ifdef DEVELOPER
8589 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8590 {
8591 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8592 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8593 }
8594 #endif
8595 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8596 }
8597 else
8598 {
8599 #ifdef DEVELOPER
8600 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8601 {
8602 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8603 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8604 }
8605 #endif
8606 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8607 }
8608 }
8609
8612 {
8613 int item_count = 0;
8615
8616 if (GetInventory().GetCargo() != NULL)
8617 {
8618 item_count = GetInventory().GetCargo().GetItemCount();
8619 }
8620
8621 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8622 {
8623 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8624 if (item)
8625 item_count += item.GetNumberOfItems();
8626 }
8627 return item_count;
8628 }
8629
8632 {
8633 float weight = 0;
8634 float wetness = 1;
8635 if (include_wetness)
8638 {
8639 weight = wetness * m_ConfigWeight;
8640 }
8642 {
8643 weight = 1;
8644 }
8645 return weight;
8646 }
8647
8648
8649
8651 {
8652 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8653 {
8654 GameInventory inv = GetInventory();
8655 array<EntityAI> items = new array<EntityAI>;
8657 for (int i = 0; i < items.Count(); i++)
8658 {
8660 if (item)
8661 {
8663 }
8664 }
8665 }
8666 }
8667
8668
8669
8670
8672 {
8673 float energy = 0;
8674 if (HasEnergyManager())
8675 {
8676 energy = GetCompEM().GetEnergy();
8677 }
8678 return energy;
8679 }
8680
8681
8683 {
8684 super.OnEnergyConsumed();
8685
8687 }
8688
8690 {
8691 super.OnEnergyAdded();
8692
8694 }
8695
8696
8698 {
8699 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8700 {
8702 {
8703 float energy_0to1 = GetCompEM().GetEnergy0To1();
8705 }
8706 }
8707 }
8708
8709
8711 {
8712 return ConfigGetFloat("heatIsolation");
8713 }
8714
8716 {
8718 }
8719
8721 {
8722 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8723 if (
GetGame().ConfigIsExisting(paramPath))
8725
8726 return 0.0;
8727 }
8728
8730 {
8731 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8732 if (
GetGame().ConfigIsExisting(paramPath))
8734
8735 return 0.0;
8736 }
8737
8738 override void SetWet(
float value,
bool allow_client =
false)
8739 {
8740 if (!IsServerCheck(allow_client))
8741 return;
8742
8745
8747
8748 m_VarWet = Math.Clamp(value, min, max);
8749
8751 {
8754 }
8755 }
8756
8757 override void AddWet(
float value)
8758 {
8760 }
8761
8763 {
8765 }
8766
8768 {
8770 }
8771
8773 {
8775 }
8776
8778 {
8780 }
8781
8783 {
8785 }
8786
8788 {
8791 if (newLevel != oldLevel)
8792 {
8794 }
8795 }
8796
8798 {
8799 SetWeightDirty();
8800 }
8801
8803 {
8804 return GetWetLevelInternal(
m_VarWet);
8805 }
8806
8807
8808
8810 {
8812 }
8813
8815 {
8817 }
8818
8820 {
8822 }
8823
8825 {
8827 }
8828
8829
8830
8832 {
8833 if (ConfigIsExisting("itemModelLength"))
8834 {
8835 return ConfigGetFloat("itemModelLength");
8836 }
8837 return 0;
8838 }
8839
8841 {
8842 if (ConfigIsExisting("itemAttachOffset"))
8843 {
8844 return ConfigGetFloat("itemAttachOffset");
8845 }
8846 return 0;
8847 }
8848
8849 override void SetCleanness(
int value,
bool allow_client =
false)
8850 {
8851 if (!IsServerCheck(allow_client))
8852 return;
8853
8855
8857
8860 }
8861
8863 {
8865 }
8866
8868 {
8869 return true;
8870 }
8871
8872
8873
8874
8876 {
8878 }
8879
8881 {
8883 }
8884
8885
8886
8887
8888 override void SetColor(
int r,
int g,
int b,
int a)
8889 {
8895 }
8897 override void GetColor(out
int r,out
int g,out
int b,out
int a)
8898 {
8903 }
8904
8906 {
8908 }
8909
8912 {
8913 int r,g,b,a;
8915 r = r/255;
8916 g = g/255;
8917 b = b/255;
8918 a = a/255;
8919 return MiscGameplayFunctions.GetColorString(r, g, b, a);
8920 }
8921
8922
8923
8924 override void SetLiquidType(
int value,
bool allow_client =
false)
8925 {
8926 if (!IsServerCheck(allow_client))
8927 return;
8928
8933 }
8934
8936 {
8937 return ConfigGetInt("varLiquidTypeInit");
8938 }
8939
8941 {
8943 }
8944
8946 {
8948 SetFrozen(false);
8949 }
8950
8953 {
8954 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
8955 }
8956
8957
8960 {
8961 PlayerBase nplayer;
8962 if (PlayerBase.CastTo(nplayer, player))
8963 {
8965
8966 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
8967 }
8968 }
8969
8970
8973 {
8974 PlayerBase nplayer;
8975 if (PlayerBase.CastTo(nplayer,player))
8976 {
8977
8978 nplayer.SetEnableQuickBarEntityShortcut(this,false);
8979
8980 }
8981
8982
8983 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
8984
8985
8986 if (HasEnergyManager())
8987 {
8988 GetCompEM().UpdatePlugState();
8989 }
8990 }
8991
8992
8994 {
8995 super.OnPlacementStarted(player);
8996
8998 }
8999
9000 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9001 {
9003 {
9004 m_AdminLog.OnPlacementComplete(player,
this);
9005 }
9006
9007 super.OnPlacementComplete(player, position, orientation);
9008 }
9009
9010
9011
9012
9013
9015 {
9017 {
9018 return true;
9019 }
9020 else
9021 {
9022 return false;
9023 }
9024 }
9025
9026
9028 {
9030 {
9032 }
9033 }
9034
9035
9037 {
9039 }
9040
9042 {
9044 }
9045
9046 override void InsertAgent(
int agent,
float count = 1)
9047 {
9048 if (count < 1)
9049 return;
9050
9052 }
9053
9056 {
9058 }
9059
9060
9062 {
9064 }
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9108 {
9110 return false;
9111 return true;
9112 }
9113
9115 {
9116
9118 }
9119
9120
9123 {
9124 super.CheckForRoofLimited(timeTresholdMS);
9125
9127 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9128 {
9129 m_PreviousRoofTestTime = time;
9130 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9131 }
9132 }
9133
9134
9136 {
9138 {
9139 return 0;
9140 }
9141
9142 if (GetInventory().GetAttachmentSlotsCount() != 0)
9143 {
9144 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9145 if (filter)
9146 return filter.GetProtectionLevel(type, false, system);
9147 else
9148 return 0;
9149 }
9150
9151 string subclassPath, entryName;
9152
9153 switch (type)
9154 {
9156 entryName = "biological";
9157 break;
9159 entryName = "chemical";
9160 break;
9161 default:
9162 entryName = "biological";
9163 break;
9164 }
9165
9166 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9167
9169 }
9170
9171
9172
9175 {
9176 if (!IsMagazine())
9178
9180 }
9181
9182
9183
9184
9185
9190 {
9191 return true;
9192 }
9193
9195 {
9197 }
9198
9199
9200
9201
9202
9204 {
9205 if (parent)
9206 {
9207 if (parent.IsInherited(DayZInfected))
9208 return true;
9209
9210 if (!parent.IsRuined())
9211 return true;
9212 }
9213
9214 return true;
9215 }
9216
9218 {
9219 if (!super.CanPutAsAttachment(parent))
9220 {
9221 return false;
9222 }
9223
9224 if (!IsRuined() && !parent.IsRuined())
9225 {
9226 return true;
9227 }
9228
9229 return false;
9230 }
9231
9233 {
9234
9235
9236
9237
9238 return super.CanReceiveItemIntoCargo(item);
9239 }
9240
9242 {
9243
9244
9245
9246
9247 GameInventory attachmentInv = attachment.GetInventory();
9249 {
9250 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9251 return false;
9252 }
9253
9254 InventoryLocation loc = new InventoryLocation();
9255 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9256 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9257 return false;
9258
9259 return super.CanReceiveAttachment(attachment, slotId);
9260 }
9261
9263 {
9264 if (!super.CanReleaseAttachment(attachment))
9265 return false;
9266
9267 return GetInventory().AreChildrenAccessible();
9268 }
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9291 {
9292 int id = muzzle_owner.GetMuzzleID();
9293 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9294
9295 if (WPOF_array)
9296 {
9297 for (int i = 0; i < WPOF_array.Count(); i++)
9298 {
9299 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9300
9301 if (WPOF)
9302 {
9303 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9304 }
9305 }
9306 }
9307 }
9308
9309
9311 {
9312 int id = muzzle_owner.GetMuzzleID();
9314
9315 if (WPOBE_array)
9316 {
9317 for (int i = 0; i < WPOBE_array.Count(); i++)
9318 {
9319 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9320
9321 if (WPOBE)
9322 {
9323 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9324 }
9325 }
9326 }
9327 }
9328
9329
9331 {
9332 int id = muzzle_owner.GetMuzzleID();
9333 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9334
9335 if (WPOOH_array)
9336 {
9337 for (int i = 0; i < WPOOH_array.Count(); i++)
9338 {
9339 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9340
9341 if (WPOOH)
9342 {
9343 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9344 }
9345 }
9346 }
9347 }
9348
9349
9351 {
9352 int id = muzzle_owner.GetMuzzleID();
9353 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9354
9355 if (WPOOH_array)
9356 {
9357 for (int i = 0; i < WPOOH_array.Count(); i++)
9358 {
9359 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9360
9361 if (WPOOH)
9362 {
9363 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9364 }
9365 }
9366 }
9367 }
9368
9369
9371 {
9372 int id = muzzle_owner.GetMuzzleID();
9373 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9374
9375 if (WPOOH_array)
9376 {
9377 for (int i = 0; i < WPOOH_array.Count(); i++)
9378 {
9379 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9380
9381 if (WPOOH)
9382 {
9383 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9384 }
9385 }
9386 }
9387 }
9388
9389
9390
9392 {
9394 {
9395 return true;
9396 }
9397
9398 return false;
9399 }
9400
9402 {
9404 {
9405 return true;
9406 }
9407
9408 return false;
9409 }
9410
9412 {
9414 {
9415 return true;
9416 }
9417
9418 return false;
9419 }
9420
9422 {
9423 return false;
9424 }
9425
9428 {
9429 return UATimeSpent.DEFAULT_DEPLOY;
9430 }
9431
9432
9433
9434
9436 {
9438 SetSynchDirty();
9439 }
9440
9442 {
9444 }
9445
9446
9448 {
9449 return false;
9450 }
9451
9454 {
9455 string att_type = "None";
9456
9457 if (ConfigIsExisting("soundAttType"))
9458 {
9459 att_type = ConfigGetString("soundAttType");
9460 }
9461
9463 }
9464
9466 {
9468 }
9469
9470
9471
9472
9473
9477
9479 {
9482
9484 }
9485
9486
9488 {
9490 return;
9491
9493
9496
9499
9500 SoundParameters params = new SoundParameters();
9504 }
9505
9506
9508 {
9510 return;
9511
9513 SetSynchDirty();
9514
9517 }
9518
9519
9521 {
9523 return;
9524
9526 SetSynchDirty();
9527
9530 }
9531
9533 {
9535 }
9536
9538 {
9540 }
9541
9544 {
9545 if (!
GetGame().IsDedicatedServer())
9546 {
9547 if (ConfigIsExisting("attachSoundSet"))
9548 {
9549 string cfg_path = "";
9550 string soundset = "";
9552
9555 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9556 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9557
9558 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9559 {
9560 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9561 {
9562 if (cfg_slot_array[i] == slot_type)
9563 {
9564 soundset = cfg_soundset_array[i];
9565 break;
9566 }
9567 }
9568 }
9569
9570 if (soundset != "")
9571 {
9572 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9574 }
9575 }
9576 }
9577 }
9578
9580 {
9581
9582 }
9583
9584 void OnApply(PlayerBase player);
9585
9587 {
9588 return 1.0;
9589 };
9590
9592 {
9594 }
9595
9597 {
9599 }
9600
9602
9604 {
9605 SetDynamicPhysicsLifeTime(0.01);
9607 }
9608
9610 {
9611 array<string> zone_names = new array<string>;
9612 GetDamageZones(zone_names);
9613 for (int i = 0; i < zone_names.Count(); i++)
9614 {
9615 SetHealthMax(zone_names.Get(i),"Health");
9616 }
9617 SetHealthMax("","Health");
9618 }
9619
9622 {
9623 float global_health = GetHealth01("","Health");
9624 array<string> zones = new array<string>;
9625 GetDamageZones(zones);
9626
9627 for (int i = 0; i < zones.Count(); i++)
9628 {
9629 SetHealth01(zones.Get(i),"Health",global_health);
9630 }
9631 }
9632
9635 {
9636 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9637 }
9638
9640 {
9641 if (!hasRootAsPlayer)
9642 {
9643 if (refParentIB)
9644 {
9645
9646 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9647 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9648
9649 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9650 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9651
9654 }
9655 else
9656 {
9657
9660 }
9661 }
9662 }
9663
9665 {
9667 {
9668 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9669 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9670 {
9671 float heatPermCoef = 1.0;
9673 while (ent)
9674 {
9675 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9676 ent = ent.GetHierarchyParent();
9677 }
9678
9679 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9680 }
9681 }
9682 }
9683
9685 {
9686
9687 EntityAI parent = GetHierarchyParent();
9688 if (!parent)
9689 {
9690 hasParent = false;
9691 hasRootAsPlayer = false;
9692 }
9693 else
9694 {
9695 hasParent = true;
9696 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9697 refParentIB =
ItemBase.Cast(parent);
9698 }
9699 }
9700
9701 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9702 {
9703
9704 }
9705
9707 {
9708
9709 return false;
9710 }
9711
9713 {
9714
9715
9716 return false;
9717 }
9718
9720 {
9721
9722 return false;
9723 }
9724
9727 {
9728 return !GetIsFrozen() &&
IsOpen();
9729 }
9730
9732 {
9733 bool hasParent = false, hasRootAsPlayer = false;
9735
9736 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9737 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9738
9739 if (wwtu || foodDecay)
9740 {
9744
9745 if (processWetness || processTemperature || processDecay)
9746 {
9748
9749 if (processWetness)
9750 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9751
9752 if (processTemperature)
9754
9755 if (processDecay)
9756 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9757 }
9758 }
9759 }
9760
9763 {
9765 }
9766
9768 {
9771
9772 return super.GetTemperatureFreezeThreshold();
9773 }
9774
9776 {
9779
9780 return super.GetTemperatureThawThreshold();
9781 }
9782
9784 {
9787
9788 return super.GetItemOverheatThreshold();
9789 }
9790
9792 {
9794 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
9795
9796 return super.GetTemperatureFreezeTime();
9797 }
9798
9800 {
9802 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
9803
9804 return super.GetTemperatureThawTime();
9805 }
9806
9811
9813 {
9814 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
9815 }
9816
9818 {
9819 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
9820 }
9821
9824 {
9826 }
9827
9829 {
9831 }
9832
9834 {
9836 }
9837
9840 {
9841 return null;
9842 }
9843
9846 {
9847 return false;
9848 }
9849
9851 {
9853 {
9856 if (!trg)
9857 {
9859 explosive = this;
9860 }
9861
9862 explosive.PairRemote(trg);
9864
9865 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
9866 trg.SetPersistentPairID(persistentID);
9867 explosive.SetPersistentPairID(persistentID);
9868
9869 return true;
9870 }
9871 return false;
9872 }
9873
9876 {
9877 float ret = 1.0;
9880 ret *= GetHealth01();
9881
9882 return ret;
9883 }
9884
9885 #ifdef DEVELOPER
9886 override void SetDebugItem()
9887 {
9888 super.SetDebugItem();
9889 _itemBase = this;
9890 }
9891
9893 {
9894 string text = super.GetDebugText();
9895
9897 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
9898
9899 return text;
9900 }
9901 #endif
9902
9904 {
9905 return true;
9906 }
9907
9909
9911
9913 {
9916 }
9917
9918
9926
9942}
9943
9945{
9947 if (entity)
9948 {
9949 bool is_item = entity.IsInherited(
ItemBase);
9950 if (is_item && full_quantity)
9951 {
9954 }
9955 }
9956 else
9957 {
9959 return NULL;
9960 }
9961 return entity;
9962}
9963
9965{
9966 if (item)
9967 {
9968 if (health > 0)
9969 item.SetHealth("", "", health);
9970
9971 if (item.CanHaveTemperature())
9972 {
9974 if (item.CanFreeze())
9975 item.SetFrozen(false);
9976 }
9977
9978 if (item.HasEnergyManager())
9979 {
9980 if (quantity >= 0)
9981 {
9982 item.GetCompEM().SetEnergy0To1(quantity);
9983 }
9984 else
9985 {
9987 }
9988 }
9989 else if (item.IsMagazine())
9990 {
9991 Magazine mag = Magazine.Cast(item);
9992 if (quantity >= 0)
9993 {
9994 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
9995 }
9996 else
9997 {
9999 }
10000
10001 }
10002 else
10003 {
10004 if (quantity >= 0)
10005 {
10006 item.SetQuantityNormalized(quantity, false);
10007 }
10008 else
10009 {
10011 }
10012
10013 }
10014 }
10015}
10016
10017#ifdef DEVELOPER
10019#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.