5276{
5278 {
5279 return true;
5280 }
5281};
5282
5284{
5285
5286};
5287
5288
5289
5291{
5295
5297
5300
5301
5302
5303
5304
5313
5319
5324
5329
5350 protected bool m_IsResultOfSplit
5351
5353
5358
5359
5360
5362
5366
5367
5368
5370
5373
5374
5375
5381
5382
5390
5393
5394
5396
5397
5399
5400
5405
5406
5411
5413
5414
5416
5417
5419 {
5424
5425 if (!
g_Game.IsDedicatedServer())
5426 {
5428 {
5430
5432 {
5434 }
5435 }
5436
5439 }
5440
5441 m_OldLocation = null;
5442
5444 {
5446 }
5447
5448 if (ConfigIsExisting("headSelectionsToHide"))
5449 {
5452 }
5453
5455 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5456 {
5458 }
5459
5461
5462 m_IsResultOfSplit = false;
5463
5465 }
5466
5468 {
5469 super.InitItemVariables();
5470
5476 m_Count = ConfigGetInt(
"count");
5477
5480
5485
5488
5493
5505
5509
5510
5513 if (ConfigIsExisting("canBeSplit"))
5514 {
5517 }
5518
5520 if (ConfigIsExisting("itemBehaviour"))
5522
5523
5526 RegisterNetSyncVariableInt("m_VarLiquidType");
5527 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5528
5529 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5530 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5531 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5532
5533 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5534 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5535 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5536 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5537
5538 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5539 RegisterNetSyncVariableBool("m_IsTakeable");
5540 RegisterNetSyncVariableBool("m_IsHologram");
5541
5544 {
5547 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5548 }
5549
5551
5553 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5555
5557 }
5558
5560 {
5562 }
5563
5565 {
5568 {
5573 }
5574 }
5575
5576 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5577 {
5579 {
5582 }
5583
5585 }
5586
5588 {
5594 }
5595
5597
5599 {
5601
5602 if (!action)
5603 {
5604 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5605 return;
5606 }
5607
5609 if (!ai)
5610 {
5612 return;
5613 }
5614
5616 if (!action_array)
5617 {
5618 action_array = new array<ActionBase_Basic>;
5620 }
5621 if (LogManager.IsActionLogEnable())
5622 {
5623 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5624 }
5625
5626 if (action_array.Find(action) != -1)
5627 {
5628 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5629 }
5630 else
5631 {
5632 action_array.Insert(action);
5633 }
5634 }
5635
5637 {
5638 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5639 ActionBase action = player.GetActionManager().GetAction(actionName);
5642
5643 if (action_array)
5644 {
5645 action_array.RemoveItem(action);
5646 }
5647 }
5648
5649
5650
5652 {
5653 ActionOverrideData overrideData = new ActionOverrideData();
5657
5659 if (!actionMap)
5660 {
5663 }
5664
5665 actionMap.Insert(this.
Type(), overrideData);
5666
5667 }
5668
5670
5672
5673
5675 {
5678
5681
5682 string config_to_search = "CfgVehicles";
5683 string muzzle_owner_config;
5684
5686 {
5687 if (IsInherited(Weapon))
5688 config_to_search = "CfgWeapons";
5689
5690 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5691
5692 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5693
5694 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
5695
5696 if (config_OnFire_subclass_count > 0)
5697 {
5698 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5699
5700 for (int i = 0; i < config_OnFire_subclass_count; i++)
5701 {
5702 string particle_class = "";
5703 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
5704 string config_OnFire_entry = config_OnFire_class + particle_class;
5705 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5706 WPOF_array.Insert(WPOF);
5707 }
5708
5709
5711 }
5712 }
5713
5715 {
5716 config_to_search = "CfgWeapons";
5717 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5718
5719 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5720
5721 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5722
5723 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5724 {
5725 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5726
5727 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5728 {
5729 string particle_class2 = "";
5730 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5731 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5732 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5733 WPOBE_array.Insert(WPOBE);
5734 }
5735
5736
5738 }
5739 }
5740 }
5741
5742
5744 {
5747
5749 {
5750 string config_to_search = "CfgVehicles";
5751
5752 if (IsInherited(Weapon))
5753 config_to_search = "CfgWeapons";
5754
5755 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5756 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5757
5758 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
5759 {
5760
5762
5764 {
5766 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5768 return;
5769 }
5770
5773
5774
5775
5776 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
5777 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5778
5779 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5780 {
5781 string particle_class = "";
5782 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
5783 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5784 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
5785
5786 if (entry_type == CT_CLASS)
5787 {
5788 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5789 WPOOH_array.Insert(WPOF);
5790 }
5791 }
5792
5793
5795 }
5796 }
5797 }
5798
5800 {
5802 }
5803
5805 {
5807 {
5809
5812
5815
5816 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5817 }
5818 }
5819
5821 {
5823 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5824
5826 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5827
5829 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5830
5832 {
5834 }
5835 }
5836
5838 {
5840 }
5841
5843 {
5846 else
5848
5850 {
5853 }
5854 else
5855 {
5858
5861 }
5862
5864 }
5865
5867 {
5869 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5870 }
5871
5873 {
5875 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5877 }
5878
5880 {
5882 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5883 }
5884
5886 {
5889
5890 OverheatingParticle OP = new OverheatingParticle();
5895
5897 }
5898
5900 {
5903
5904 return -1;
5905 }
5906
5908 {
5910 {
5913
5914 for (int i = count; i > 0; --i)
5915 {
5916 int id = i - 1;
5919
5922
5923 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5924 {
5925 if (p)
5926 {
5929 }
5930 }
5931 }
5932 }
5933 }
5934
5936 {
5938 {
5940 {
5941 int id = i - 1;
5943
5944 if (OP)
5945 {
5947
5948 if (p)
5949 {
5951 }
5952
5953 delete OP;
5954 }
5955 }
5956
5959 }
5960 }
5961
5964 {
5965 return 0.0;
5966 }
5967
5968
5970 {
5971 return 250;
5972 }
5973
5975 {
5976 return 0;
5977 }
5978
5981 {
5983 return true;
5984
5985 return false;
5986 }
5987
5990 {
5993
5995 {
5997 }
5998 else
5999 {
6000
6002 }
6003
6005 }
6006
6013 {
6014 return -1;
6015 }
6016
6017
6018
6019
6021 {
6023 {
6024 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6025 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6026
6027 if (r_index >= 0)
6028 {
6029 InventoryLocation r_il = new InventoryLocation;
6030 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6031
6032 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6035 {
6036 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6037 }
6039 {
6040 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6041 }
6042
6043 }
6044
6045 player.GetHumanInventory().ClearUserReservedLocation(this);
6046 }
6047
6050 }
6051
6052
6053
6054
6056 {
6057 return ItemBase.m_DebugActionsMask;
6058 }
6059
6061 {
6062 return ItemBase.m_DebugActionsMask & mask;
6063 }
6064
6066 {
6067 ItemBase.m_DebugActionsMask = mask;
6068 }
6069
6071 {
6072 ItemBase.m_DebugActionsMask |= mask;
6073 }
6074
6076 {
6077 ItemBase.m_DebugActionsMask &= ~mask;
6078 }
6079
6081 {
6083 {
6085 }
6086 else
6087 {
6089 }
6090 }
6091
6092
6094 {
6095 if (GetEconomyProfile())
6096 {
6097 float q_max = GetEconomyProfile().GetQuantityMax();
6098 if (q_max > 0)
6099 {
6100 float q_min = GetEconomyProfile().GetQuantityMin();
6101 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6102
6104 {
6105 ComponentEnergyManager comp = GetCompEM();
6107 {
6109 }
6110 }
6112 {
6114
6115 }
6116
6117 }
6118 }
6119 }
6120
6123 {
6124 EntityAI parent = GetHierarchyParent();
6125
6126 if (parent)
6127 {
6128 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6129 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6130 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6131 }
6132 }
6133
6136 {
6137 EntityAI parent = GetHierarchyParent();
6138
6139 if (parent)
6140 {
6141 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6142 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6143 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6144 }
6145 }
6146
6148 {
6149
6150
6151
6152
6154
6156 {
6157 if (ScriptInputUserData.CanStoreInputUserData())
6158 {
6159 ScriptInputUserData ctx = new ScriptInputUserData;
6165 ctx.
Write(use_stack_max);
6168
6170 {
6171 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6172 }
6173 }
6174 }
6175 else if (!
g_Game.IsMultiplayer())
6176 {
6178 }
6179 }
6180
6182 {
6184 }
6185
6187 {
6189 }
6190
6192 {
6194 }
6195
6197 {
6198
6199 return false;
6200 }
6201
6203 {
6204 return false;
6205 }
6206
6210 {
6211 return false;
6212 }
6213
6215 {
6216 return "";
6217 }
6218
6220
6222 {
6223 return false;
6224 }
6225
6227 {
6228 return true;
6229 }
6230
6231
6232
6234 {
6235 return true;
6236 }
6237
6239 {
6240 return true;
6241 }
6242
6244 {
6245 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6247 }
6248
6250 {
6252 }
6253
6255 {
6257 if (!is_being_placed)
6259 SetSynchDirty();
6260 }
6261
6262
6264
6266 {
6268 }
6269
6271 {
6273 }
6274
6276 {
6277 return 1;
6278 }
6279
6281 {
6282 return false;
6283 }
6284
6286 {
6288 SetSynchDirty();
6289 }
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6310
6311
6312
6313
6314
6315
6316
6317
6318
6319
6320
6321
6322
6323
6324
6326 {
6327 super.OnMovedInsideCargo(container);
6328
6329 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6330 }
6331
6332 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6333 {
6334 super.EEItemLocationChanged(oldLoc, newLoc);
6335
6336 PlayerBase newPlayer = null;
6337 PlayerBase oldPlayer = null;
6338
6339 if (newLoc.GetParent())
6340 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6341
6342 if (oldLoc.GetParent())
6343 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6344
6346 {
6347 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6348
6349 if (rIndex >= 0)
6350 {
6351 InventoryLocation rIl = new InventoryLocation;
6352 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6353
6354 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6357 {
6358 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6359 }
6361 {
6363 }
6364
6365 }
6366 }
6367
6369 {
6370 if (newPlayer)
6371 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6372
6373 if (newPlayer == oldPlayer)
6374 {
6375 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6376 {
6378 {
6379 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6380 {
6381 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6382 }
6383 }
6384 else
6385 {
6386 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6387 }
6388 }
6389
6390 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6391 {
6392 int type = oldLoc.GetType();
6394 {
6395 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6396 }
6398 {
6399 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6400 }
6401 }
6402 if (!m_OldLocation)
6403 {
6404 m_OldLocation = new InventoryLocation;
6405 }
6406 m_OldLocation.Copy(oldLoc);
6407 }
6408 else
6409 {
6410 if (m_OldLocation)
6411 {
6412 m_OldLocation.Reset();
6413 }
6414 }
6415
6416 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6417 }
6418 else
6419 {
6420 if (newPlayer)
6421 {
6422 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6423 if (resIndex >= 0)
6424 {
6425 InventoryLocation il = new InventoryLocation;
6426 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6428 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6431 {
6432 il.
GetParent().GetOnReleaseLock().Invoke(it);
6433 }
6435 {
6437 }
6438
6439 }
6440 }
6442 {
6443
6445 }
6446
6447 if (m_OldLocation)
6448 {
6449 m_OldLocation.Reset();
6450 }
6451 }
6452
6454 {
6455 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6456 }
6457
6459 {
6460 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6461 }
6462 }
6463
6464 override void EOnContact(IEntity other, Contact extra)
6465 {
6467 {
6468 int liquidType = -1;
6470 if (impactSpeed > 0.0)
6471 {
6473 #ifndef SERVER
6475 #else
6477 SetSynchDirty();
6478 #endif
6480 }
6481 }
6482
6483 #ifdef SERVER
6484 if (GetCompEM() && GetCompEM().IsPlugged())
6485 {
6486 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6487 GetCompEM().UnplugThis();
6488 }
6489 #endif
6490 }
6491
6493
6495 {
6497 }
6498
6500 {
6501
6502 }
6503
6505 {
6506 super.OnItemLocationChanged(old_owner, new_owner);
6507
6508 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6509 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6510
6511 if (!relatedPlayer && playerNew)
6512 relatedPlayer = playerNew;
6513
6514 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6515 {
6517 if (actionMgr)
6518 {
6519 ActionBase currentAction = actionMgr.GetRunningAction();
6520 if (currentAction)
6522 }
6523 }
6524
6525 Man ownerPlayerOld = null;
6526 Man ownerPlayerNew = null;
6527
6528 if (old_owner)
6529 {
6530 if (old_owner.
IsMan())
6531 {
6532 ownerPlayerOld = Man.Cast(old_owner);
6533 }
6534 else
6535 {
6536 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6537 }
6538 }
6539 else
6540 {
6542 {
6544
6545 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6546 {
6547 GetCompEM().UnplugThis();
6548 }
6549 }
6550 }
6551
6552 if (new_owner)
6553 {
6554 if (new_owner.
IsMan())
6555 {
6556 ownerPlayerNew = Man.Cast(new_owner);
6557 }
6558 else
6559 {
6560 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6561 }
6562 }
6563
6564 if (ownerPlayerOld != ownerPlayerNew)
6565 {
6566 if (ownerPlayerOld)
6567 {
6568 array<EntityAI> subItemsExit = new array<EntityAI>;
6570 for (int i = 0; i < subItemsExit.Count(); i++)
6571 {
6574 }
6575 }
6576
6577 if (ownerPlayerNew)
6578 {
6579 array<EntityAI> subItemsEnter = new array<EntityAI>;
6581 for (int j = 0; j < subItemsEnter.Count(); j++)
6582 {
6585 }
6586 }
6587 }
6588 else if (ownerPlayerNew != null)
6589 {
6590 PlayerBase nplayer;
6591 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6592 {
6593 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6595 for (int k = 0; k < subItemsUpdate.Count(); k++)
6596 {
6598 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6599 }
6600 }
6601 }
6602
6603 if (old_owner)
6604 old_owner.OnChildItemRemoved(this);
6605 if (new_owner)
6606 new_owner.OnChildItemReceived(this);
6607 }
6608
6609
6611 {
6612 super.EEDelete(parent);
6613 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6614 if (player)
6615 {
6617
6618 if (player.IsAlive())
6619 {
6620 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6621 if (r_index >= 0)
6622 {
6623 InventoryLocation r_il = new InventoryLocation;
6624 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6625
6626 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6629 {
6630 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6631 }
6633 {
6634 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6635 }
6636
6637 }
6638
6639 player.RemoveQuickBarEntityShortcut(this);
6640 }
6641 }
6642 }
6643
6645 {
6646 super.EEKilled(killer);
6647
6650 {
6651 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6652 {
6653 if (IsMagazine())
6654 {
6655 if (Magazine.Cast(this).GetAmmoCount() > 0)
6656 {
6658 }
6659 }
6660 else
6661 {
6663 }
6664 }
6665 }
6666 }
6667
6669 {
6670 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6671
6672 super.OnWasAttached(parent, slot_id);
6673
6676
6679 }
6680
6682 {
6683 super.OnWasDetached(parent, slot_id);
6684
6687
6690 }
6691
6693 {
6694 int idx;
6697
6698 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6699 if (inventory_slots.Count() < 1)
6700 {
6701 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6702 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6703 }
6704 else
6705 {
6706 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6707 }
6708
6709 idx = inventory_slots.Find(slot);
6710 if (idx < 0)
6711 return "";
6712
6713 return attach_types.Get(idx);
6714 }
6715
6717 {
6718 int idx = -1;
6719 string slot;
6720
6723
6724 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6725 if (inventory_slots.Count() < 1)
6726 {
6727 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6728 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6729 }
6730 else
6731 {
6732 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6733 if (detach_types.Count() < 1)
6734 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6735 }
6736
6737 for (int i = 0; i < inventory_slots.Count(); i++)
6738 {
6739 slot = inventory_slots.Get(i);
6740 }
6741
6742 if (slot != "")
6743 {
6744 if (detach_types.Count() == 1)
6745 idx = 0;
6746 else
6747 idx = inventory_slots.Find(slot);
6748 }
6749 if (idx < 0)
6750 return "";
6751
6752 return detach_types.Get(idx);
6753 }
6754
6756 {
6757
6759
6760
6761 float min_time = 1;
6762 float max_time = 3;
6763 float delay = Math.RandomFloat(min_time, max_time);
6764
6765 explode_timer.Run(delay, this, "DoAmmoExplosion");
6766 }
6767
6769 {
6770 Magazine magazine = Magazine.Cast(this);
6771 int pop_sounds_count = 6;
6772 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6773
6774
6775 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6776 string sound_name = pop_sounds[ sound_idx ];
6777 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
6778
6779
6780 magazine.ServerAddAmmoCount(-1);
6781
6782
6783 float min_temp_to_explode = 100;
6784
6785 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
6786 {
6788 }
6789 }
6790
6791
6792 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6793 {
6794 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6795
6796 const int CHANCE_DAMAGE_CARGO = 4;
6797 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6798 const int CHANCE_DAMAGE_NOTHING = 2;
6799
6801 {
6802 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6803 int chances;
6804 int rnd;
6805
6806 if (GetInventory().GetCargo())
6807 {
6808 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6809 rnd = Math.RandomInt(0,chances);
6810
6811 if (rnd < CHANCE_DAMAGE_CARGO)
6812 {
6814 }
6815 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6816 {
6818 }
6819 }
6820 else
6821 {
6822 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6823 rnd = Math.RandomInt(0,chances);
6824
6825 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6826 {
6828 }
6829 }
6830 }
6831 }
6832
6834 {
6835 CargoBase cargo = GetInventory().GetCargo();
6836 if (cargo)
6837 {
6839 if (item_count > 0)
6840 {
6841 int random_pick = Math.RandomInt(0, item_count);
6843 if (!item.IsExplosive())
6844 {
6845 item.AddHealth("","",damage);
6846 return true;
6847 }
6848 }
6849 }
6850 return false;
6851 }
6852
6854 {
6855 GameInventory inventory = GetInventory();
6857 if (attachment_count > 0)
6858 {
6859 int random_pick = Math.RandomInt(0, attachment_count);
6861 if (!attachment.IsExplosive())
6862 {
6863 attachment.AddHealth("","",damage);
6864 return true;
6865 }
6866 }
6867 return false;
6868 }
6869
6871 {
6873 }
6874
6876 {
6878 return GetInventory().CanRemoveEntity();
6879
6880 return false;
6881 }
6882
6884 {
6885
6887 return false;
6888
6889
6891 return false;
6892
6893
6894
6896 if (delta == 0)
6897 return false;
6898
6899
6900 return true;
6901 }
6902
6904 {
6906 {
6907 if (ScriptInputUserData.CanStoreInputUserData())
6908 {
6909 ScriptInputUserData ctx = new ScriptInputUserData;
6914 ctx.
Write(destination_entity);
6918 }
6919 }
6920 else if (!
g_Game.IsMultiplayer())
6921 {
6923 }
6924 }
6925
6927 {
6928 float split_quantity_new;
6932 InventoryLocation loc = new InventoryLocation;
6933
6934 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6935 {
6937 split_quantity_new = stack_max;
6938 else
6940
6942 {
6943 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6944 if (new_item)
6945 {
6946 new_item.SetResultOfSplit(true);
6947 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6949 new_item.
SetQuantity(split_quantity_new,
false,
true);
6950 }
6951 }
6952 }
6953 else if (destination_entity && slot_id == -1)
6954 {
6955 if (quantity > stack_max)
6956 split_quantity_new = stack_max;
6957 else
6958 split_quantity_new = quantity;
6959
6961 {
6962 GameInventory destinationInventory = destination_entity.GetInventory();
6964 {
6967 }
6968
6969 if (new_item)
6970 {
6971 new_item.SetResultOfSplit(true);
6972 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6974 new_item.
SetQuantity(split_quantity_new,
false,
true);
6975 }
6976 }
6977 }
6978 else
6979 {
6980 if (stack_max != 0)
6981 {
6983 {
6985 }
6986
6987 if (split_quantity_new == 0)
6988 {
6989 if (!
g_Game.IsMultiplayer())
6990 player.PhysicalPredictiveDropItem(this);
6991 else
6992 player.ServerDropEntity(this);
6993 return;
6994 }
6995
6997 {
6999
7000 if (new_item)
7001 {
7002 new_item.SetResultOfSplit(true);
7003 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7006 new_item.PlaceOnSurface();
7007 }
7008 }
7009 }
7010 }
7011 }
7012
7014 {
7015 float split_quantity_new;
7019 InventoryLocation loc = new InventoryLocation;
7020
7021 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7022 {
7024 split_quantity_new = stack_max;
7025 else
7027
7029 {
7030 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7031 if (new_item)
7032 {
7033 new_item.SetResultOfSplit(true);
7034 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7036 new_item.
SetQuantity(split_quantity_new,
false,
true);
7037 }
7038 }
7039 }
7040 else if (destination_entity && slot_id == -1)
7041 {
7042 if (quantity > stack_max)
7043 split_quantity_new = stack_max;
7044 else
7045 split_quantity_new = quantity;
7046
7048 {
7049 GameInventory destinationInventory = destination_entity.GetInventory();
7051 {
7054 }
7055
7056 if (new_item)
7057 {
7058 new_item.SetResultOfSplit(true);
7059 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7061 new_item.
SetQuantity(split_quantity_new,
false,
true);
7062 }
7063 }
7064 }
7065 else
7066 {
7067 if (stack_max != 0)
7068 {
7070 {
7072 }
7073
7075 {
7077
7078 if (new_item)
7079 {
7080 new_item.SetResultOfSplit(true);
7081 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7084 new_item.PlaceOnSurface();
7085 }
7086 }
7087 }
7088 }
7089 }
7090
7092 {
7094 {
7095 if (ScriptInputUserData.CanStoreInputUserData())
7096 {
7097 ScriptInputUserData ctx = new ScriptInputUserData;
7102 dst.WriteToContext(ctx);
7104 }
7105 }
7106 else if (!
g_Game.IsMultiplayer())
7107 {
7109 }
7110 }
7111
7113 {
7115 {
7116 if (ScriptInputUserData.CanStoreInputUserData())
7117 {
7118 ScriptInputUserData ctx = new ScriptInputUserData;
7123 ctx.
Write(destination_entity);
7129 }
7130 }
7131 else if (!
g_Game.IsMultiplayer())
7132 {
7134 }
7135 }
7136
7138 {
7140 }
7141
7143 {
7145 float split_quantity_new;
7147 if (dst.IsValid())
7148 {
7149 int slot_id = dst.GetSlot();
7151
7152 if (quantity > stack_max)
7153 split_quantity_new = stack_max;
7154 else
7155 split_quantity_new = quantity;
7156
7158 {
7160
7161 if (new_item)
7162 {
7163 new_item.SetResultOfSplit(true);
7164 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7166 new_item.
SetQuantity(split_quantity_new,
false,
true);
7167 }
7168
7169 return new_item;
7170 }
7171 }
7172
7173 return null;
7174 }
7175
7177 {
7179 float split_quantity_new;
7181 if (destination_entity)
7182 {
7184 if (quantity > stackable)
7185 split_quantity_new = stackable;
7186 else
7187 split_quantity_new = quantity;
7188
7190 {
7191 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7192 if (new_item)
7193 {
7194 new_item.SetResultOfSplit(true);
7195 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7197 new_item.
SetQuantity(split_quantity_new,
false,
true);
7198 }
7199 }
7200 }
7201 }
7202
7204 {
7206 {
7207 if (ScriptInputUserData.CanStoreInputUserData())
7208 {
7209 ScriptInputUserData ctx = new ScriptInputUserData;
7214 ItemBase destination_entity =
this;
7215 ctx.
Write(destination_entity);
7219 }
7220 }
7221 else if (!
g_Game.IsMultiplayer())
7222 {
7224 }
7225 }
7226
7228 {
7230 float split_quantity_new;
7232 if (player)
7233 {
7235 if (quantity > stackable)
7236 split_quantity_new = stackable;
7237 else
7238 split_quantity_new = quantity;
7239
7241 {
7242 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7243 new_item =
ItemBase.Cast(in_hands);
7244 if (new_item)
7245 {
7246 new_item.SetResultOfSplit(true);
7247 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7249 new_item.SetQuantity(split_quantity_new, false, true);
7250 }
7251 }
7252 }
7253 }
7254
7256 {
7258 float split_quantity_new = Math.Floor(quantity * 0.5);
7259
7261 return;
7262
7264
7265 if (new_item)
7266 {
7267 if (new_item.GetQuantityMax() < split_quantity_new)
7268 {
7269 split_quantity_new = new_item.GetQuantityMax();
7270 }
7271
7272 new_item.SetResultOfSplit(true);
7273 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7274
7276 {
7279 }
7280 else
7281 {
7283 new_item.
SetQuantity(split_quantity_new,
false,
true);
7284 }
7285 }
7286 }
7287
7289 {
7291 float split_quantity_new = Math.Floor(quantity / 2);
7292
7294 return;
7295
7296 InventoryLocation invloc = new InventoryLocation;
7298
7300 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7301
7302 if (new_item)
7303 {
7304 if (new_item.GetQuantityMax() < split_quantity_new)
7305 {
7306 split_quantity_new = new_item.GetQuantityMax();
7307 }
7309 {
7312 }
7313 else if (split_quantity_new > 1)
7314 {
7316 new_item.
SetQuantity(split_quantity_new,
false,
true);
7317 }
7318 }
7319 }
7320
7323 {
7324 SetWeightDirty();
7326
7327 if (parent)
7328 parent.OnAttachmentQuantityChangedEx(this, delta);
7329
7331 {
7333 {
7335 }
7337 {
7338 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7340 }
7341 }
7342 }
7343
7346 {
7347
7348 }
7349
7352 {
7354 }
7355
7357 {
7358 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7359
7361 {
7362 if (newLevel == GameConstants.STATE_RUINED)
7363 {
7365 EntityAI parent = GetHierarchyParent();
7366 if (parent && parent.IsFireplace())
7367 {
7368 CargoBase cargo = GetInventory().GetCargo();
7369 if (cargo)
7370 {
7372 {
7374 }
7375 }
7376 }
7377 }
7378
7380 {
7381
7383 return;
7384 }
7385
7386 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7387 {
7389 }
7390 }
7391 }
7392
7393
7395 {
7396 super.OnRightClick();
7397
7399 {
7401 {
7402 if (ScriptInputUserData.CanStoreInputUserData())
7403 {
7404 EntityAI root = GetHierarchyRoot();
7405 Man playerOwner = GetHierarchyRootPlayer();
7406 InventoryLocation dst = new InventoryLocation;
7407
7408
7409 if (!playerOwner && root && root == this)
7410 {
7412 }
7413 else
7414 {
7415
7416 GetInventory().GetCurrentInventoryLocation(dst);
7418 {
7419 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7421 {
7423 }
7424 else
7425 {
7427
7428
7429 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7430 {
7432 }
7433 else
7434 {
7435 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7436 }
7437 }
7438 }
7439 }
7440
7441 ScriptInputUserData ctx = new ScriptInputUserData;
7449 }
7450 }
7451 else if (!
g_Game.IsMultiplayer())
7452 {
7454 }
7455 }
7456 }
7457
7459 {
7460 if (root)
7461 {
7462 vector m4[4];
7463 root.GetTransform(m4);
7464 dst.SetGround(this, m4);
7465 }
7466 else
7467 {
7468 GetInventory().GetCurrentInventoryLocation(dst);
7469 }
7470 }
7471
7472 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7473 {
7474
7475 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7476 return false;
7477
7478 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7479 return false;
7480
7481
7483 return false;
7484
7485
7486 Magazine mag = Magazine.Cast(this);
7487 if (mag)
7488 {
7489 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7490 return false;
7491
7492 if (stack_max_limit)
7493 {
7494 Magazine other_mag = Magazine.Cast(other_item);
7495 if (other_item)
7496 {
7497 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7498 return false;
7499 }
7500
7501 }
7502 }
7503 else
7504 {
7505
7507 return false;
7508
7510 return false;
7511 }
7512
7513 PlayerBase player = null;
7514 if (CastTo(player, GetHierarchyRootPlayer()))
7515 {
7516 if (player.GetInventory().HasAttachment(this))
7517 return false;
7518
7519 if (player.IsItemsToDelete())
7520 return false;
7521 }
7522
7523 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7524 return false;
7525
7526 int slotID;
7528 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7529 return false;
7530
7531 return true;
7532 }
7533
7535 {
7537 }
7538
7540 {
7541 return m_IsResultOfSplit;
7542 }
7543
7545 {
7546 m_IsResultOfSplit = value;
7547 }
7548
7550 {
7552 }
7553
7555 {
7556 float other_item_quantity = other_item.GetQuantity();
7557 float this_free_space;
7558
7560
7562
7563 if (other_item_quantity > this_free_space)
7564 {
7565 return this_free_space;
7566 }
7567 else
7568 {
7569 return other_item_quantity;
7570 }
7571 }
7572
7574 {
7576 }
7577
7579 {
7581 return;
7582
7583 if (!IsMagazine() && other_item)
7584 {
7586 if (quantity_used != 0)
7587 {
7588 float hp1 = GetHealth01("","");
7589 float hp2 = other_item.GetHealth01("","");
7590 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7591 hpResult = hpResult / (
GetQuantity() + quantity_used);
7592
7593 hpResult *= GetMaxHealth();
7594 Math.Round(hpResult);
7595 SetHealth("", "Health", hpResult);
7596
7598 other_item.AddQuantity(-quantity_used);
7599 }
7600 }
7602 }
7603
7605 {
7606 #ifdef SERVER
7607 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7608 GetHierarchyParent().IncreaseLifetimeUp();
7609 #endif
7610 };
7611
7613 {
7614 PlayerBase p = PlayerBase.Cast(player);
7615
7616 array<int> recipesIds = p.m_Recipes;
7617 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7618 if (moduleRecipesManager)
7619 {
7620 EntityAI itemInHands = player.GetEntityInHands();
7621 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7622 }
7623
7624 for (int i = 0;i < recipesIds.Count(); i++)
7625 {
7626 int key = recipesIds.Get(i);
7627 string recipeName = moduleRecipesManager.GetRecipeName(key);
7629 }
7630 }
7631
7632
7633 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7634 {
7635 super.GetDebugActions(outputList);
7636
7637
7643
7644
7649
7654
7655
7659
7660
7662 {
7666 }
7667
7670
7671
7675
7677
7678 InventoryLocation loc = new InventoryLocation();
7679 GetInventory().GetCurrentInventoryLocation(loc);
7681 {
7682 if (Gizmo_IsSupported())
7685 }
7686
7688 }
7689
7690
7691
7692
7694 {
7695 super.OnAction(action_id, player, ctx);
7696
7698 {
7699 switch (action_id)
7700 {
7704 return true;
7708 return true;
7709 }
7710 }
7711
7713 {
7714 switch (action_id)
7715 {
7717 Delete();
7718 return true;
7719 }
7720 }
7721
7722 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7723 {
7724 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7725 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7726 PlayerBase p = PlayerBase.Cast(player);
7727 if (
EActions.RECIPES_RANGE_START < 1000)
7728 {
7729 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7730 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7731 }
7732 }
7733 #ifndef SERVER
7734 else if (action_id ==
EActions.WATCH_PLAYER)
7735 {
7736 PluginDeveloper.SetDeveloperItemClientEx(player);
7737 }
7738 #endif
7740 {
7741 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7742 {
7743 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7744 OnDebugButtonPressServer(id + 1);
7745 }
7746
7747 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7748 {
7749 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7751 }
7752
7753 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7754 {
7755 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7757 }
7758
7759 else if (action_id ==
EActions.ADD_QUANTITY)
7760 {
7761 if (IsMagazine())
7762 {
7763 Magazine mag = Magazine.Cast(this);
7764 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7765 }
7766 else
7767 {
7769 }
7770
7771 if (m_EM)
7772 {
7773 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7774 }
7775
7776 }
7777
7778 else if (action_id ==
EActions.REMOVE_QUANTITY)
7779 {
7780 if (IsMagazine())
7781 {
7782 Magazine mag2 = Magazine.Cast(this);
7783 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7784 }
7785 else
7786 {
7788 }
7789 if (m_EM)
7790 {
7791 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7792 }
7793
7794 }
7795
7796 else if (action_id ==
EActions.SET_QUANTITY_0)
7797 {
7799
7800 if (m_EM)
7801 {
7802 m_EM.SetEnergy(0);
7803 }
7804 }
7805
7806 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7807 {
7809
7810 if (m_EM)
7811 {
7812 m_EM.SetEnergy(m_EM.GetEnergyMax());
7813 }
7814 }
7815
7816 else if (action_id ==
EActions.ADD_HEALTH)
7817 {
7818 AddHealth("","",GetMaxHealth("","Health")/5);
7819 }
7820 else if (action_id ==
EActions.REMOVE_HEALTH)
7821 {
7822 AddHealth("","",-GetMaxHealth("","Health")/5);
7823 }
7824 else if (action_id ==
EActions.DESTROY_HEALTH)
7825 {
7826 SetHealth01("","",0);
7827 }
7828 else if (action_id ==
EActions.WATCH_ITEM)
7829 {
7831 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7832 #ifdef DEVELOPER
7833 SetDebugDeveloper_item(this);
7834 #endif
7835 }
7836
7837 else if (action_id ==
EActions.ADD_TEMPERATURE)
7838 {
7839 AddTemperature(20);
7840
7841 }
7842
7843 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7844 {
7845 AddTemperature(-20);
7846
7847 }
7848
7849 else if (action_id ==
EActions.FLIP_FROZEN)
7850 {
7851 SetFrozen(!GetIsFrozen());
7852
7853 }
7854
7855 else if (action_id ==
EActions.ADD_WETNESS)
7856 {
7858
7859 }
7860
7861 else if (action_id ==
EActions.REMOVE_WETNESS)
7862 {
7864
7865 }
7866
7867 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7868 {
7871
7872
7873 }
7874
7875 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7876 {
7879 }
7880
7881 else if (action_id ==
EActions.MAKE_SPECIAL)
7882 {
7883 auto debugParams = DebugSpawnParams.WithPlayer(player);
7884 OnDebugSpawnEx(debugParams);
7885 }
7886
7887 }
7888
7889
7890 return false;
7891 }
7892
7893
7894
7895
7899
7902
7903
7904
7906 {
7907 return false;
7908 }
7909
7910
7912 {
7913 return true;
7914 }
7915
7916
7918 {
7919 return true;
7920 }
7921
7922
7923
7925 {
7926 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7927 return g_Game.ConfigIsExisting(config_path);
7928 }
7929
7932 {
7933 return null;
7934 }
7935
7937 {
7938 return false;
7939 }
7940
7942 {
7943 return false;
7944 }
7945
7949
7950
7952 {
7953 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7954 return module_repairing.CanRepair(this, item_repair_kit);
7955 }
7956
7957
7958 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7959 {
7960 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7961 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7962 }
7963
7964
7966 {
7967
7968
7969
7970
7971
7972
7973
7974
7975 return 1;
7976 }
7977
7978
7979
7981 {
7983 }
7984
7985
7986
7988 {
7990 }
7991
7992
8001 {
8002 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8003
8004 if (player)
8005 {
8006 player.MessageStatus(text);
8007 }
8008 }
8009
8010
8019 {
8020 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8021
8022 if (player)
8023 {
8024 player.MessageAction(text);
8025 }
8026 }
8027
8028
8037 {
8038 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8039
8040 if (player)
8041 {
8042 player.MessageFriendly(text);
8043 }
8044 }
8045
8046
8055 {
8056 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8057
8058 if (player)
8059 {
8060 player.MessageImportant(text);
8061 }
8062 }
8063
8065 {
8066 return true;
8067 }
8068
8069
8070 override bool KindOf(
string tag)
8071 {
8072 bool found = false;
8073 string item_name = this.
GetType();
8075 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8076
8077 int array_size = item_tag_array.Count();
8078 for (int i = 0; i < array_size; i++)
8079 {
8080 if (item_tag_array.Get(i) == tag)
8081 {
8082 found = true;
8083 break;
8084 }
8085 }
8086 return found;
8087 }
8088
8089
8091 {
8092
8093 super.OnRPC(sender, rpc_type,ctx);
8094
8095
8096 switch (rpc_type)
8097 {
8098 #ifndef SERVER
8099 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8100 Param2<bool, string> p = new Param2<bool, string>(false, "");
8101
8103 return;
8104
8105 bool play = p.param1;
8106 string soundSet = p.param2;
8107
8108 if (play)
8109 {
8111 {
8113 {
8115 }
8116 }
8117 else
8118 {
8120 }
8121 }
8122 else
8123 {
8125 }
8126
8127 break;
8128 #endif
8129
8130 }
8131
8133 {
8135 }
8136 }
8137
8138
8139
8140
8142 {
8143 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8144 return plugin.GetID(
name);
8145 }
8146
8148 {
8149 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8150 return plugin.GetName(id);
8151 }
8152
8155 {
8156
8157
8158 int varFlags;
8159 if (!ctx.
Read(varFlags))
8160 return;
8161
8162 if (varFlags & ItemVariableFlags.FLOAT)
8163 {
8165 }
8166 }
8167
8169 {
8170
8171 super.SerializeNumericalVars(floats_out);
8172
8173
8174
8176 {
8178 }
8179
8181 {
8183 }
8184
8186 {
8188 }
8189
8191 {
8196 }
8197
8199 {
8201 }
8202 }
8203
8205 {
8206
8207 super.DeSerializeNumericalVars(floats);
8208
8209
8210 int index = 0;
8211 int mask = Math.Round(floats.Get(index));
8212
8213 index++;
8214
8216 {
8218 {
8220 }
8221 else
8222 {
8223 float quantity = floats.Get(index);
8225 }
8226 index++;
8227 }
8228
8230 {
8231 float wet = floats.Get(index);
8233 index++;
8234 }
8235
8237 {
8238 int liquidtype = Math.Round(floats.Get(index));
8240 index++;
8241 }
8242
8244 {
8246 index++;
8248 index++;
8250 index++;
8252 index++;
8253 }
8254
8256 {
8257 int cleanness = Math.Round(floats.Get(index));
8259 index++;
8260 }
8261 }
8262
8264 {
8265 super.WriteVarsToCTX(ctx);
8266
8267
8269 {
8271 }
8272
8274 {
8276 }
8277
8279 {
8281 }
8282
8284 {
8285 int r,g,b,a;
8291 }
8292
8294 {
8296 }
8297 }
8298
8300 {
8301 if (!super.ReadVarsFromCTX(ctx,version))
8302 return false;
8303
8304 int intValue;
8305 float value;
8306
8307 if (version < 140)
8308 {
8309 if (!ctx.
Read(intValue))
8310 return false;
8311
8312 m_VariablesMask = intValue;
8313 }
8314
8316 {
8317 if (!ctx.
Read(value))
8318 return false;
8319
8321 {
8323 }
8324 else
8325 {
8327 }
8328 }
8329
8330 if (version < 140)
8331 {
8333 {
8334 if (!ctx.
Read(value))
8335 return false;
8336 SetTemperatureDirect(value);
8337 }
8338 }
8339
8341 {
8342 if (!ctx.
Read(value))
8343 return false;
8345 }
8346
8348 {
8349 if (!ctx.
Read(intValue))
8350 return false;
8352 }
8353
8355 {
8356 int r,g,b,a;
8358 return false;
8360 return false;
8362 return false;
8364 return false;
8365
8367 }
8368
8370 {
8371 if (!ctx.
Read(intValue))
8372 return false;
8374 }
8375
8376 if (version >= 138 && version < 140)
8377 {
8379 {
8380 if (!ctx.
Read(intValue))
8381 return false;
8382 SetFrozen(intValue);
8383 }
8384 }
8385
8386 return true;
8387 }
8388
8389
8391 {
8394 {
8396 }
8397
8398 if (!super.OnStoreLoad(ctx, version))
8399 {
8401 return false;
8402 }
8403
8404 if (version >= 114)
8405 {
8406 bool hasQuickBarIndexSaved;
8407
8408 if (!ctx.
Read(hasQuickBarIndexSaved))
8409 {
8411 return false;
8412 }
8413
8414 if (hasQuickBarIndexSaved)
8415 {
8416 int itmQBIndex;
8417
8418
8419 if (!ctx.
Read(itmQBIndex))
8420 {
8422 return false;
8423 }
8424
8425 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8426 if (itmQBIndex != -1 && parentPlayer)
8427 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8428 }
8429 }
8430 else
8431 {
8432
8433 PlayerBase player;
8434 int itemQBIndex;
8435 if (version ==
int.
MAX)
8436 {
8437 if (!ctx.
Read(itemQBIndex))
8438 {
8440 return false;
8441 }
8442 }
8443 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8444 {
8445
8446 if (!ctx.
Read(itemQBIndex))
8447 {
8449 return false;
8450 }
8451 if (itemQBIndex != -1 && player)
8452 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8453 }
8454 }
8455
8456 if (version < 140)
8457 {
8458
8459 if (!LoadVariables(ctx, version))
8460 {
8462 return false;
8463 }
8464 }
8465
8466
8468 {
8470 return false;
8471 }
8472 if (version >= 132)
8473 {
8475 if (raib)
8476 {
8478 {
8480 return false;
8481 }
8482 }
8483 }
8484
8486 return true;
8487 }
8488
8489
8490
8492 {
8493 super.OnStoreSave(ctx);
8494
8495 PlayerBase player;
8496 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8497 {
8499
8500 int itemQBIndex = -1;
8501 itemQBIndex = player.FindQuickBarEntityIndex(this);
8502 ctx.
Write(itemQBIndex);
8503 }
8504 else
8505 {
8507 }
8508
8510
8512 if (raib)
8513 {
8515 }
8516 }
8517
8518
8520 {
8521 super.AfterStoreLoad();
8522
8524 {
8526 }
8527
8529 {
8532 }
8533 }
8534
8536 {
8537 super.EEOnAfterLoad();
8538
8540 {
8542 }
8543
8546 }
8547
8549 {
8550 return false;
8551 }
8552
8553
8554
8556 {
8558 {
8559 #ifdef PLATFORM_CONSOLE
8560
8562 {
8564 if (menu)
8565 {
8567 }
8568 }
8569 #endif
8570 }
8571
8573 {
8576 }
8577
8579 {
8580 SetWeightDirty();
8582 }
8584 {
8587 }
8588
8590 {
8593
8596 }
8598 {
8602 }
8603
8604 super.OnVariablesSynchronized();
8605 }
8606
8607
8608
8610 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8611 {
8612 if (!IsServerCheck(allow_client))
8613 return false;
8614
8616 return false;
8617
8620
8621 if (value <= (min + 0.001))
8622 value = min;
8623
8624 if (value == min)
8625 {
8626 if (destroy_config)
8627 {
8628 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8629 if (dstr)
8630 {
8632 this.Delete();
8633 return true;
8634 }
8635 }
8636 else if (destroy_forced)
8637 {
8639 this.Delete();
8640 return true;
8641 }
8642
8644 }
8645
8648
8650 {
8651 EntityAI parent = GetHierarchyRoot();
8652 InventoryLocation iLoc = new InventoryLocation();
8653 GetInventory().GetCurrentInventoryLocation(iLoc);
8655 {
8656 int iLocSlot = iLoc.
GetSlot();
8658 {
8660 }
8662 {
8664 }
8665 }
8666 }
8667
8669 {
8671
8672 if (delta)
8674 }
8675
8677
8678 return false;
8679 }
8680
8681
8683 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8684 {
8686 }
8687
8689 {
8692 }
8693
8695 {
8698 }
8699
8701 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8702 {
8703 float value_clamped = Math.Clamp(value, 0, 1);
8705 SetQuantity(result, destroy_config, destroy_forced);
8706 }
8707
8708
8711 {
8713 }
8714
8716 {
8718 }
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8730 {
8731 int slot = -1;
8732 GameInventory inventory = GetInventory();
8733 if (inventory)
8734 {
8735 InventoryLocation il = new InventoryLocation;
8738 }
8739
8741 }
8742
8744 {
8745 float quantity_max = 0;
8746
8748 {
8749 if (attSlotID != -1)
8750 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8751
8752 if (quantity_max <= 0)
8754 }
8755
8756 if (quantity_max <= 0)
8758
8759 return quantity_max;
8760 }
8761
8763 {
8765 }
8766
8768 {
8770 }
8771
8772
8774 {
8776 }
8777
8779 {
8781 }
8782
8784 {
8786 }
8787
8788
8790 {
8791
8792 float weightEx = GetWeightEx();
8793 float special = GetInventoryAndCargoWeight();
8794 return weightEx - special;
8795 }
8796
8797
8799 {
8801 }
8802
8804 {
8806 {
8807 #ifdef DEVELOPER
8808 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8809 {
8810 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8812 }
8813 #endif
8814
8816 }
8817 else if (HasEnergyManager())
8818 {
8819 #ifdef DEVELOPER
8820 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8821 {
8822 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8823 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8824 }
8825 #endif
8826 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
8827 }
8828 else
8829 {
8830 #ifdef DEVELOPER
8831 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8832 {
8833 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8834 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8835 }
8836 #endif
8837 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
8838 }
8839 }
8840
8843 {
8844 int item_count = 0;
8846
8847 GameInventory inventory = GetInventory();
8848 CargoBase cargo = inventory.
GetCargo();
8849 if (cargo != NULL)
8850 {
8852 }
8853
8855 for (int i = 0; i < nAttachments; ++i)
8856 {
8858 if (item)
8859 item_count += item.GetNumberOfItems();
8860 }
8861 return item_count;
8862 }
8863
8866 {
8867 float weight = 0;
8868 float wetness = 1;
8869 if (include_wetness)
8872 {
8873 weight = wetness * m_ConfigWeight;
8874 }
8876 {
8877 weight = 1;
8878 }
8879 return weight;
8880 }
8881
8882
8883
8885 {
8886 GameInventory inventory = GetInventory();
8887 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
8888 {
8889 array<EntityAI> items = new array<EntityAI>;
8891 for (int i = 0; i < items.Count(); ++i)
8892 {
8894 if (item)
8895 {
8896 g_Game.ObjectDelete(item);
8897 }
8898 }
8899 }
8900 }
8901
8902
8903
8904
8906 {
8907 float energy = 0;
8908 if (HasEnergyManager())
8909 {
8910 energy = GetCompEM().GetEnergy();
8911 }
8912 return energy;
8913 }
8914
8915
8917 {
8918 super.OnEnergyConsumed();
8919
8921 }
8922
8924 {
8925 super.OnEnergyAdded();
8926
8928 }
8929
8930
8932 {
8933 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8934 {
8936 {
8937 float energy_0to1 = GetCompEM().GetEnergy0To1();
8939 }
8940 }
8941 }
8942
8943
8945 {
8946 return ConfigGetFloat("heatIsolation");
8947 }
8948
8950 {
8952 }
8953
8955 {
8956 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8957 if (
g_Game.ConfigIsExisting(paramPath))
8958 return g_Game.ConfigGetFloat(paramPath);
8959
8960 return 0.0;
8961 }
8962
8964 {
8965 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8966 if (
g_Game.ConfigIsExisting(paramPath))
8967 return g_Game.ConfigGetFloat(paramPath);
8968
8969 return 0.0;
8970 }
8971
8972 override void SetWet(
float value,
bool allow_client =
false)
8973 {
8974 if (!IsServerCheck(allow_client))
8975 return;
8976
8979
8981
8982 m_VarWet = Math.Clamp(value, min, max);
8983
8985 {
8988 }
8989 }
8990
8991 override void AddWet(
float value)
8992 {
8994 }
8995
8997 {
8999 }
9000
9002 {
9004 }
9005
9007 {
9009 }
9010
9012 {
9014 }
9015
9017 {
9019 }
9020
9022 {
9025 if (newLevel != oldLevel)
9026 {
9028 }
9029 }
9030
9032 {
9033 SetWeightDirty();
9034 }
9035
9037 {
9038 return GetWetLevelInternal(
m_VarWet);
9039 }
9040
9041
9042
9044 {
9046 }
9047
9049 {
9051 }
9052
9054 {
9056 }
9057
9059 {
9061 }
9062
9063
9064
9066 {
9067 if (ConfigIsExisting("itemModelLength"))
9068 {
9069 return ConfigGetFloat("itemModelLength");
9070 }
9071 return 0;
9072 }
9073
9075 {
9076 if (ConfigIsExisting("itemAttachOffset"))
9077 {
9078 return ConfigGetFloat("itemAttachOffset");
9079 }
9080 return 0;
9081 }
9082
9083 override void SetCleanness(
int value,
bool allow_client =
false)
9084 {
9085 if (!IsServerCheck(allow_client))
9086 return;
9087
9089
9091
9094 }
9095
9097 {
9099 }
9100
9102 {
9103 return true;
9104 }
9105
9106
9107
9108
9110 {
9112 }
9113
9115 {
9117 }
9118
9119
9120
9121
9122 override void SetColor(
int r,
int g,
int b,
int a)
9123 {
9129 }
9131 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9132 {
9137 }
9138
9140 {
9142 }
9143
9146 {
9147 int r,g,b,a;
9149 r = r/255;
9150 g = g/255;
9151 b = b/255;
9152 a = a/255;
9153 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9154 }
9155
9156
9157
9158 override void SetLiquidType(
int value,
bool allow_client =
false)
9159 {
9160 if (!IsServerCheck(allow_client))
9161 return;
9162
9167 }
9168
9170 {
9171 return ConfigGetInt("varLiquidTypeInit");
9172 }
9173
9175 {
9177 }
9178
9180 {
9182 SetFrozen(false);
9183 }
9184
9187 {
9188 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9189 }
9190
9191
9194 {
9195 PlayerBase nplayer;
9196 if (PlayerBase.CastTo(nplayer, player))
9197 {
9199 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9200 }
9201 }
9202
9203
9206 {
9207 PlayerBase nplayer;
9208 if (PlayerBase.CastTo(nplayer,player))
9209 {
9210 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9211 }
9212
9213 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9214
9215 if (HasEnergyManager())
9216 {
9217 GetCompEM().UpdatePlugState();
9218 }
9219 }
9220
9221
9223 {
9224 super.OnPlacementStarted(player);
9225
9227 }
9228
9229 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9230 {
9232 {
9233 m_AdminLog.OnPlacementComplete(player,
this);
9234 }
9235
9236 super.OnPlacementComplete(player, position, orientation);
9237 }
9238
9239
9240
9241
9242
9244 {
9246 {
9247 return true;
9248 }
9249 else
9250 {
9251 return false;
9252 }
9253 }
9254
9255
9257 {
9259 {
9261 }
9262 }
9263
9264
9266 {
9268 }
9269
9271 {
9273 }
9274
9275 override void InsertAgent(
int agent,
float count = 1)
9276 {
9277 if (count < 1)
9278 return;
9279
9281 }
9282
9285 {
9287 }
9288
9289
9291 {
9293 }
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9337 {
9339 return false;
9340 return true;
9341 }
9342
9344 {
9345
9347 }
9348
9349
9352 {
9353 super.CheckForRoofLimited(timeTresholdMS);
9354
9355 float time =
g_Game.GetTime();
9356 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9357 {
9358 m_PreviousRoofTestTime = time;
9359 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9360 }
9361 }
9362
9363
9365 {
9367 {
9368 return 0;
9369 }
9370
9371 if (GetInventory().GetAttachmentSlotsCount() != 0)
9372 {
9373 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9374 if (filter)
9375 return filter.GetProtectionLevel(type, false, system);
9376 else
9377 return 0;
9378 }
9379
9380 string subclassPath, entryName;
9381
9382 switch (type)
9383 {
9385 entryName = "biological";
9386 break;
9388 entryName = "chemical";
9389 break;
9390 default:
9391 entryName = "biological";
9392 break;
9393 }
9394
9395 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9396
9397 return g_Game.ConfigGetFloat(subclassPath + entryName);
9398 }
9399
9400
9401
9404 {
9405 if (!IsMagazine())
9407
9409 }
9410
9411
9412
9413
9414
9419 {
9420 return true;
9421 }
9422
9424 {
9426 }
9427
9428
9429
9430
9431
9433 {
9434 if (parent)
9435 {
9436 if (parent.IsInherited(DayZInfected))
9437 return true;
9438
9439 if (!parent.IsRuined())
9440 return true;
9441 }
9442
9443 return true;
9444 }
9445
9447 {
9448 if (!super.CanPutAsAttachment(parent))
9449 {
9450 return false;
9451 }
9452
9453 if (!IsRuined() && !parent.IsRuined())
9454 {
9455 return true;
9456 }
9457
9458 return false;
9459 }
9460
9462 {
9463
9464
9465
9466
9467 return super.CanReceiveItemIntoCargo(item);
9468 }
9469
9471 {
9472
9473
9474
9475
9476 GameInventory attachmentInv = attachment.GetInventory();
9478 {
9479 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9480 return false;
9481 }
9482
9483 InventoryLocation loc = new InventoryLocation();
9484 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9485 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9486 return false;
9487
9488 return super.CanReceiveAttachment(attachment, slotId);
9489 }
9490
9492 {
9493 if (!super.CanReleaseAttachment(attachment))
9494 return false;
9495
9496 return GetInventory().AreChildrenAccessible();
9497 }
9498
9499
9500
9501
9502
9503
9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9520 {
9521 int id = muzzle_owner.GetMuzzleID();
9522 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9523
9524 if (WPOF_array)
9525 {
9526 for (int i = 0; i < WPOF_array.Count(); i++)
9527 {
9528 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9529
9530 if (WPOF)
9531 {
9532 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9533 }
9534 }
9535 }
9536 }
9537
9538
9540 {
9541 int id = muzzle_owner.GetMuzzleID();
9543
9544 if (WPOBE_array)
9545 {
9546 for (int i = 0; i < WPOBE_array.Count(); i++)
9547 {
9548 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9549
9550 if (WPOBE)
9551 {
9552 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9553 }
9554 }
9555 }
9556 }
9557
9558
9560 {
9561 int id = muzzle_owner.GetMuzzleID();
9562 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9563
9564 if (WPOOH_array)
9565 {
9566 for (int i = 0; i < WPOOH_array.Count(); i++)
9567 {
9568 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9569
9570 if (WPOOH)
9571 {
9572 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9573 }
9574 }
9575 }
9576 }
9577
9578
9580 {
9581 int id = muzzle_owner.GetMuzzleID();
9582 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9583
9584 if (WPOOH_array)
9585 {
9586 for (int i = 0; i < WPOOH_array.Count(); i++)
9587 {
9588 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9589
9590 if (WPOOH)
9591 {
9592 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9593 }
9594 }
9595 }
9596 }
9597
9598
9600 {
9601 int id = muzzle_owner.GetMuzzleID();
9602 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9603
9604 if (WPOOH_array)
9605 {
9606 for (int i = 0; i < WPOOH_array.Count(); i++)
9607 {
9608 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9609
9610 if (WPOOH)
9611 {
9612 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9613 }
9614 }
9615 }
9616 }
9617
9618
9619
9621 {
9623 {
9624 return true;
9625 }
9626
9627 return false;
9628 }
9629
9631 {
9633 {
9634 return true;
9635 }
9636
9637 return false;
9638 }
9639
9641 {
9643 {
9644 return true;
9645 }
9646
9647 return false;
9648 }
9649
9651 {
9652 return false;
9653 }
9654
9657 {
9658 return UATimeSpent.DEFAULT_DEPLOY;
9659 }
9660
9661
9662
9663
9665 {
9667 SetSynchDirty();
9668 }
9669
9671 {
9673 }
9674
9675
9677 {
9678 return false;
9679 }
9680
9683 {
9684 string att_type = "None";
9685
9686 if (ConfigIsExisting("soundAttType"))
9687 {
9688 att_type = ConfigGetString("soundAttType");
9689 }
9690
9692 }
9693
9695 {
9697 }
9698
9699
9700
9701
9702
9708
9710 {
9713
9715 }
9716
9717
9719 {
9721 return;
9722
9724
9727
9730
9731 SoundParameters params = new SoundParameters();
9735 }
9736
9737
9739 {
9741 {
9744
9745 SetSynchDirty();
9746
9749 }
9750 }
9751
9753 {
9755 }
9756
9757
9759 {
9761 return;
9762
9764 SetSynchDirty();
9765
9768 }
9769
9771 {
9774 }
9775
9777 {
9779 }
9780
9781 void OnApply(PlayerBase player);
9782
9784 {
9785 return 1.0;
9786 };
9787
9789 {
9791 }
9792
9794 {
9796 }
9797
9799
9801 {
9802 SetDynamicPhysicsLifeTime(0.01);
9804 }
9805
9807 {
9808 array<string> zone_names = new array<string>;
9809 GetDamageZones(zone_names);
9810 for (int i = 0; i < zone_names.Count(); i++)
9811 {
9812 SetHealthMax(zone_names.Get(i),"Health");
9813 }
9814 SetHealthMax("","Health");
9815 }
9816
9819 {
9820 float global_health = GetHealth01("","Health");
9821 array<string> zones = new array<string>;
9822 GetDamageZones(zones);
9823
9824 for (int i = 0; i < zones.Count(); i++)
9825 {
9826 SetHealth01(zones.Get(i),"Health",global_health);
9827 }
9828 }
9829
9832 {
9833 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9834 }
9835
9837 {
9838 if (!hasRootAsPlayer)
9839 {
9840 if (refParentIB)
9841 {
9842
9843 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9844 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9845
9846 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9847 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9848
9851 }
9852 else
9853 {
9854
9857 }
9858 }
9859 }
9860
9862 {
9864 {
9865 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9866 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
9867 {
9868 float heatPermCoef = 1.0;
9870 while (ent)
9871 {
9872 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9873 ent = ent.GetHierarchyParent();
9874 }
9875
9876 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9877 }
9878 }
9879 }
9880
9882 {
9883
9884 EntityAI parent = GetHierarchyParent();
9885 if (!parent)
9886 {
9887 hasParent = false;
9888 hasRootAsPlayer = false;
9889 }
9890 else
9891 {
9892 hasParent = true;
9893 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9894 refParentIB =
ItemBase.Cast(parent);
9895 }
9896 }
9897
9898 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9899 {
9900
9901 }
9902
9904 {
9905
9906 return false;
9907 }
9908
9910 {
9911
9912
9913 return false;
9914 }
9915
9917 {
9918
9919 return false;
9920 }
9921
9924 {
9925 return !GetIsFrozen() &&
IsOpen();
9926 }
9927
9929 {
9930 bool hasParent = false, hasRootAsPlayer = false;
9932
9933 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9934 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9935
9936 if (wwtu || foodDecay)
9937 {
9941
9942 if (processWetness || processTemperature || processDecay)
9943 {
9945
9946 if (processWetness)
9947 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9948
9949 if (processTemperature)
9951
9952 if (processDecay)
9953 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9954 }
9955 }
9956 }
9957
9960 {
9962 }
9963
9965 {
9968
9969 return super.GetTemperatureFreezeThreshold();
9970 }
9971
9973 {
9976
9977 return super.GetTemperatureThawThreshold();
9978 }
9979
9981 {
9984
9985 return super.GetItemOverheatThreshold();
9986 }
9987
9989 {
9991 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
9992
9993 return super.GetTemperatureFreezeTime();
9994 }
9995
9997 {
9999 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
10000
10001 return super.GetTemperatureThawTime();
10002 }
10003
10008
10010 {
10011 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
10012 }
10013
10015 {
10016 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10017 }
10018
10021 {
10023 }
10024
10026 {
10028 }
10029
10031 {
10033 }
10034
10037 {
10038 return null;
10039 }
10040
10043 {
10044 return false;
10045 }
10046
10048 {
10050 {
10053 if (!trg)
10054 {
10056 explosive = this;
10057 }
10058
10059 explosive.PairRemote(trg);
10061
10062 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10063 trg.SetPersistentPairID(persistentID);
10064 explosive.SetPersistentPairID(persistentID);
10065
10066 return true;
10067 }
10068 return false;
10069 }
10070
10073 {
10074 float ret = 1.0;
10077 ret *= GetHealth01();
10078
10079 return ret;
10080 }
10081
10082 #ifdef DEVELOPER
10083 override void SetDebugItem()
10084 {
10085 super.SetDebugItem();
10086 _itemBase = this;
10087 }
10088
10090 {
10091 string text = super.GetDebugText();
10092
10094 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10095
10096 return text;
10097 }
10098 #endif
10099
10101 {
10102 return true;
10103 }
10104
10106
10108
10110 {
10113 }
10114
10115
10123
10139
10140 [
Obsolete(
"Use ItemSoundHandler instead")]
10143 {
10144 if (!
g_Game.IsDedicatedServer())
10145 {
10146 if (ConfigIsExisting("attachSoundSet"))
10147 {
10148 string cfg_path = "";
10149 string soundset = "";
10150 string type_name =
GetType();
10151
10154 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10155 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10156
10157 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10158 {
10159 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10160 {
10161 if (cfg_slot_array[i] == slot_type)
10162 {
10163 soundset = cfg_soundset_array[i];
10164 break;
10165 }
10166 }
10167 }
10168
10169 if (soundset != "")
10170 {
10171 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10173 }
10174 }
10175 }
10176 }
10177
10179}
10180
10182{
10184 if (entity)
10185 {
10186 bool is_item = entity.IsInherited(
ItemBase);
10187 if (is_item && full_quantity)
10188 {
10191 }
10192 }
10193 else
10194 {
10196 return NULL;
10197 }
10198 return entity;
10199}
10200
10202{
10203 if (item)
10204 {
10205 if (health > 0)
10206 item.SetHealth("", "", health);
10207
10208 if (item.CanHaveTemperature())
10209 {
10211 if (item.CanFreeze())
10212 item.SetFrozen(false);
10213 }
10214
10215 if (item.HasEnergyManager())
10216 {
10217 if (quantity >= 0)
10218 {
10219 item.GetCompEM().SetEnergy0To1(quantity);
10220 }
10221 else
10222 {
10224 }
10225 }
10226 else if (item.IsMagazine())
10227 {
10228 Magazine mag = Magazine.Cast(item);
10229 if (quantity >= 0)
10230 {
10231 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10232 }
10233 else
10234 {
10236 }
10237
10238 }
10239 else
10240 {
10241 if (quantity >= 0)
10242 {
10243 item.SetQuantityNormalized(quantity, false);
10244 }
10245 else
10246 {
10248 }
10249
10250 }
10251 }
10252}
10253
10254#ifdef DEVELOPER
10256#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.