5261{
5263 {
5264 return true;
5265 }
5266};
5267
5269{
5270
5271};
5272
5273
5274
5276{
5280
5282
5285
5286
5287
5288
5289
5298
5304
5309
5314
5335 protected bool m_IsResultOfSplit
5336
5338
5343
5344
5345
5347
5351
5352
5353
5355
5358
5359
5360
5366
5367
5375
5378
5379
5381
5382
5384
5385
5390
5391
5396
5398
5399
5401
5402
5404 {
5409
5410 if (!
g_Game.IsDedicatedServer())
5411 {
5413 {
5415
5417 {
5419 }
5420 }
5421
5424 }
5425
5426 m_OldLocation = null;
5427
5429 {
5431 }
5432
5433 if (ConfigIsExisting("headSelectionsToHide"))
5434 {
5437 }
5438
5440 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5441 {
5443 }
5444
5446
5447 m_IsResultOfSplit = false;
5448
5450 }
5451
5453 {
5454 super.InitItemVariables();
5455
5461 m_Count = ConfigGetInt(
"count");
5462
5465
5470
5473
5478
5490
5494
5495
5498 if (ConfigIsExisting("canBeSplit"))
5499 {
5502 }
5503
5505 if (ConfigIsExisting("itemBehaviour"))
5507
5508
5511 RegisterNetSyncVariableInt("m_VarLiquidType");
5512 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5513
5514 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5515 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5516 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5517
5518 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5519 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5520 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5521 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5522
5523 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5524 RegisterNetSyncVariableBool("m_IsTakeable");
5525 RegisterNetSyncVariableBool("m_IsHologram");
5526
5529 {
5532 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
5533 }
5534
5536
5538 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5540
5542 }
5543
5545 {
5547 }
5548
5550 {
5553 {
5558 }
5559 }
5560
5561 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5562 {
5564 {
5567 }
5568
5570 }
5571
5573 {
5579 }
5580
5582
5584 {
5586
5587 if (!action)
5588 {
5589 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5590 return;
5591 }
5592
5594 if (!ai)
5595 {
5597 return;
5598 }
5599
5601 if (!action_array)
5602 {
5603 action_array = new array<ActionBase_Basic>;
5605 }
5606 if (LogManager.IsActionLogEnable())
5607 {
5608 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5609 }
5610
5611 if (action_array.Find(action) != -1)
5612 {
5613 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5614 }
5615 else
5616 {
5617 action_array.Insert(action);
5618 }
5619 }
5620
5622 {
5623 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5624 ActionBase action = player.GetActionManager().GetAction(actionName);
5627
5628 if (action_array)
5629 {
5630 action_array.RemoveItem(action);
5631 }
5632 }
5633
5634
5635
5637 {
5638 ActionOverrideData overrideData = new ActionOverrideData();
5642
5644 if (!actionMap)
5645 {
5648 }
5649
5650 actionMap.Insert(this.
Type(), overrideData);
5651
5652 }
5653
5655
5657
5658
5660 {
5663
5666
5667 string config_to_search = "CfgVehicles";
5668 string muzzle_owner_config;
5669
5671 {
5672 if (IsInherited(Weapon))
5673 config_to_search = "CfgWeapons";
5674
5675 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5676
5677 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5678
5679 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
5680
5681 if (config_OnFire_subclass_count > 0)
5682 {
5683 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5684
5685 for (int i = 0; i < config_OnFire_subclass_count; i++)
5686 {
5687 string particle_class = "";
5688 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
5689 string config_OnFire_entry = config_OnFire_class + particle_class;
5690 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5691 WPOF_array.Insert(WPOF);
5692 }
5693
5694
5696 }
5697 }
5698
5700 {
5701 config_to_search = "CfgWeapons";
5702 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5703
5704 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5705
5706 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
5707
5708 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5709 {
5710 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5711
5712 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5713 {
5714 string particle_class2 = "";
5715 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
5716 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5717 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5718 WPOBE_array.Insert(WPOBE);
5719 }
5720
5721
5723 }
5724 }
5725 }
5726
5727
5729 {
5732
5734 {
5735 string config_to_search = "CfgVehicles";
5736
5737 if (IsInherited(Weapon))
5738 config_to_search = "CfgWeapons";
5739
5740 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5741 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5742
5743 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
5744 {
5745
5747
5749 {
5751 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5753 return;
5754 }
5755
5758
5759
5760
5761 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
5762 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5763
5764 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5765 {
5766 string particle_class = "";
5767 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
5768 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5769 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
5770
5771 if (entry_type == CT_CLASS)
5772 {
5773 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5774 WPOOH_array.Insert(WPOF);
5775 }
5776 }
5777
5778
5780 }
5781 }
5782 }
5783
5785 {
5787 }
5788
5790 {
5792 {
5794
5797
5800
5801 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5802 }
5803 }
5804
5806 {
5808 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5809
5811 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5812
5814 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5815
5817 {
5819 }
5820 }
5821
5823 {
5825 }
5826
5828 {
5831 else
5833
5835 {
5838 }
5839 else
5840 {
5843
5846 }
5847
5849 }
5850
5852 {
5854 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5855 }
5856
5858 {
5860 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5862 }
5863
5865 {
5867 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5868 }
5869
5871 {
5874
5875 OverheatingParticle OP = new OverheatingParticle();
5880
5882 }
5883
5885 {
5888
5889 return -1;
5890 }
5891
5893 {
5895 {
5898
5899 for (int i = count; i > 0; --i)
5900 {
5901 int id = i - 1;
5904
5907
5908 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5909 {
5910 if (p)
5911 {
5914 }
5915 }
5916 }
5917 }
5918 }
5919
5921 {
5923 {
5925 {
5926 int id = i - 1;
5928
5929 if (OP)
5930 {
5932
5933 if (p)
5934 {
5936 }
5937
5938 delete OP;
5939 }
5940 }
5941
5944 }
5945 }
5946
5949 {
5950 return 0.0;
5951 }
5952
5953
5955 {
5956 return 250;
5957 }
5958
5960 {
5961 return 0;
5962 }
5963
5966 {
5968 return true;
5969
5970 return false;
5971 }
5972
5975 {
5978
5980 {
5982 }
5983 else
5984 {
5985
5987 }
5988
5990 }
5991
5998 {
5999 return -1;
6000 }
6001
6002
6003
6004
6006 {
6008 {
6009 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6010 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6011
6012 if (r_index >= 0)
6013 {
6014 InventoryLocation r_il = new InventoryLocation;
6015 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6016
6017 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6020 {
6021 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6022 }
6024 {
6025 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6026 }
6027
6028 }
6029
6030 player.GetHumanInventory().ClearUserReservedLocation(this);
6031 }
6032
6035 }
6036
6037
6038
6039
6041 {
6042 return ItemBase.m_DebugActionsMask;
6043 }
6044
6046 {
6047 return ItemBase.m_DebugActionsMask & mask;
6048 }
6049
6051 {
6052 ItemBase.m_DebugActionsMask = mask;
6053 }
6054
6056 {
6057 ItemBase.m_DebugActionsMask |= mask;
6058 }
6059
6061 {
6062 ItemBase.m_DebugActionsMask &= ~mask;
6063 }
6064
6066 {
6068 {
6070 }
6071 else
6072 {
6074 }
6075 }
6076
6077
6079 {
6080 if (GetEconomyProfile())
6081 {
6082 float q_max = GetEconomyProfile().GetQuantityMax();
6083 if (q_max > 0)
6084 {
6085 float q_min = GetEconomyProfile().GetQuantityMin();
6086 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
6087
6089 {
6090 ComponentEnergyManager comp = GetCompEM();
6092 {
6094 }
6095 }
6097 {
6099
6100 }
6101
6102 }
6103 }
6104 }
6105
6108 {
6109 EntityAI parent = GetHierarchyParent();
6110
6111 if (parent)
6112 {
6113 InventoryLocation inventory_location_to_lock = new InventoryLocation;
6114 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
6115 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
6116 }
6117 }
6118
6121 {
6122 EntityAI parent = GetHierarchyParent();
6123
6124 if (parent)
6125 {
6126 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
6127 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
6128 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
6129 }
6130 }
6131
6133 {
6134
6135
6136
6137
6139
6141 {
6142 if (ScriptInputUserData.CanStoreInputUserData())
6143 {
6144 ScriptInputUserData ctx = new ScriptInputUserData;
6150 ctx.
Write(use_stack_max);
6153
6155 {
6156 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
6157 }
6158 }
6159 }
6160 else if (!
g_Game.IsMultiplayer())
6161 {
6163 }
6164 }
6165
6167 {
6169 }
6170
6172 {
6174 }
6175
6177 {
6179 }
6180
6182 {
6183
6184 return false;
6185 }
6186
6188 {
6189 return false;
6190 }
6191
6195 {
6196 return false;
6197 }
6198
6200 {
6201 return "";
6202 }
6203
6205
6207 {
6208 return false;
6209 }
6210
6212 {
6213 return true;
6214 }
6215
6216
6217
6219 {
6220 return true;
6221 }
6222
6224 {
6225 return true;
6226 }
6227
6229 {
6230 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
6232 }
6233
6235 {
6237 }
6238
6240 {
6242 if (!is_being_placed)
6244 SetSynchDirty();
6245 }
6246
6247
6249
6251 {
6253 }
6254
6256 {
6258 }
6259
6261 {
6262 return 1;
6263 }
6264
6266 {
6267 return false;
6268 }
6269
6271 {
6273 SetSynchDirty();
6274 }
6275
6276
6277
6278
6279
6280
6281
6282
6283
6284
6285
6286
6287
6288
6289
6290
6291
6292
6293
6294
6295
6296
6297
6298
6299
6300
6301
6302
6303
6304
6305
6306
6307
6308
6309
6311 {
6312 super.OnMovedInsideCargo(container);
6313
6314 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6315 }
6316
6317 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6318 {
6319 super.EEItemLocationChanged(oldLoc, newLoc);
6320
6321 PlayerBase newPlayer = null;
6322 PlayerBase oldPlayer = null;
6323
6324 if (newLoc.GetParent())
6325 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6326
6327 if (oldLoc.GetParent())
6328 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6329
6331 {
6332 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
6333
6334 if (rIndex >= 0)
6335 {
6336 InventoryLocation rIl = new InventoryLocation;
6337 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
6338
6339 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
6342 {
6343 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
6344 }
6346 {
6348 }
6349
6350 }
6351 }
6352
6354 {
6355 if (newPlayer)
6356 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
6357
6358 if (newPlayer == oldPlayer)
6359 {
6360 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6361 {
6363 {
6364 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6365 {
6366 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6367 }
6368 }
6369 else
6370 {
6371 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6372 }
6373 }
6374
6375 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6376 {
6377 int type = oldLoc.GetType();
6379 {
6380 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6381 }
6383 {
6384 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6385 }
6386 }
6387 if (!m_OldLocation)
6388 {
6389 m_OldLocation = new InventoryLocation;
6390 }
6391 m_OldLocation.Copy(oldLoc);
6392 }
6393 else
6394 {
6395 if (m_OldLocation)
6396 {
6397 m_OldLocation.Reset();
6398 }
6399 }
6400
6401 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
6402 }
6403 else
6404 {
6405 if (newPlayer)
6406 {
6407 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6408 if (resIndex >= 0)
6409 {
6410 InventoryLocation il = new InventoryLocation;
6411 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
6413 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
6416 {
6417 il.
GetParent().GetOnReleaseLock().Invoke(it);
6418 }
6420 {
6422 }
6423
6424 }
6425 }
6427 {
6428
6430 }
6431
6432 if (m_OldLocation)
6433 {
6434 m_OldLocation.Reset();
6435 }
6436 }
6437
6439 {
6440 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
6441 }
6442
6444 {
6445 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
6446 }
6447 }
6448
6449 override void EOnContact(IEntity other, Contact extra)
6450 {
6452 {
6453 int liquidType = -1;
6455 if (impactSpeed > 0.0)
6456 {
6458 #ifndef SERVER
6460 #else
6462 SetSynchDirty();
6463 #endif
6465 }
6466 }
6467
6468 #ifdef SERVER
6469 if (GetCompEM() && GetCompEM().IsPlugged())
6470 {
6471 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6472 GetCompEM().UnplugThis();
6473 }
6474 #endif
6475 }
6476
6478
6480 {
6482 }
6483
6485 {
6486
6487 }
6488
6490 {
6491 super.OnItemLocationChanged(old_owner, new_owner);
6492
6493 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6494 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6495
6496 if (!relatedPlayer && playerNew)
6497 relatedPlayer = playerNew;
6498
6499 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6500 {
6502 if (actionMgr)
6503 {
6504 ActionBase currentAction = actionMgr.GetRunningAction();
6505 if (currentAction)
6507 }
6508 }
6509
6510 Man ownerPlayerOld = null;
6511 Man ownerPlayerNew = null;
6512
6513 if (old_owner)
6514 {
6515 if (old_owner.
IsMan())
6516 {
6517 ownerPlayerOld = Man.Cast(old_owner);
6518 }
6519 else
6520 {
6521 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6522 }
6523 }
6524 else
6525 {
6527 {
6529
6530 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6531 {
6532 GetCompEM().UnplugThis();
6533 }
6534 }
6535 }
6536
6537 if (new_owner)
6538 {
6539 if (new_owner.
IsMan())
6540 {
6541 ownerPlayerNew = Man.Cast(new_owner);
6542 }
6543 else
6544 {
6545 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6546 }
6547 }
6548
6549 if (ownerPlayerOld != ownerPlayerNew)
6550 {
6551 if (ownerPlayerOld)
6552 {
6553 array<EntityAI> subItemsExit = new array<EntityAI>;
6555 for (int i = 0; i < subItemsExit.Count(); i++)
6556 {
6559 }
6560 }
6561
6562 if (ownerPlayerNew)
6563 {
6564 array<EntityAI> subItemsEnter = new array<EntityAI>;
6566 for (int j = 0; j < subItemsEnter.Count(); j++)
6567 {
6570 }
6571 }
6572 }
6573 else if (ownerPlayerNew != null)
6574 {
6575 PlayerBase nplayer;
6576 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6577 {
6578 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6580 for (int k = 0; k < subItemsUpdate.Count(); k++)
6581 {
6583 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6584 }
6585 }
6586 }
6587
6588 if (old_owner)
6589 old_owner.OnChildItemRemoved(this);
6590 if (new_owner)
6591 new_owner.OnChildItemReceived(this);
6592 }
6593
6594
6596 {
6597 super.EEDelete(parent);
6598 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6599 if (player)
6600 {
6602
6603 if (player.IsAlive())
6604 {
6605 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6606 if (r_index >= 0)
6607 {
6608 InventoryLocation r_il = new InventoryLocation;
6609 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6610
6611 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6614 {
6615 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6616 }
6618 {
6619 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6620 }
6621
6622 }
6623
6624 player.RemoveQuickBarEntityShortcut(this);
6625 }
6626 }
6627 }
6628
6630 {
6631 super.EEKilled(killer);
6632
6635 {
6636 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6637 {
6638 if (IsMagazine())
6639 {
6640 if (Magazine.Cast(this).GetAmmoCount() > 0)
6641 {
6643 }
6644 }
6645 else
6646 {
6648 }
6649 }
6650 }
6651 }
6652
6654 {
6655 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6656
6657 super.OnWasAttached(parent, slot_id);
6658
6661
6664 }
6665
6667 {
6668 super.OnWasDetached(parent, slot_id);
6669
6672
6675 }
6676
6678 {
6679 int idx;
6682
6683 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6684 if (inventory_slots.Count() < 1)
6685 {
6686 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6687 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6688 }
6689 else
6690 {
6691 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6692 }
6693
6694 idx = inventory_slots.Find(slot);
6695 if (idx < 0)
6696 return "";
6697
6698 return attach_types.Get(idx);
6699 }
6700
6702 {
6703 int idx = -1;
6704 string slot;
6705
6708
6709 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6710 if (inventory_slots.Count() < 1)
6711 {
6712 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6713 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6714 }
6715 else
6716 {
6717 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6718 if (detach_types.Count() < 1)
6719 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6720 }
6721
6722 for (int i = 0; i < inventory_slots.Count(); i++)
6723 {
6724 slot = inventory_slots.Get(i);
6725 }
6726
6727 if (slot != "")
6728 {
6729 if (detach_types.Count() == 1)
6730 idx = 0;
6731 else
6732 idx = inventory_slots.Find(slot);
6733 }
6734 if (idx < 0)
6735 return "";
6736
6737 return detach_types.Get(idx);
6738 }
6739
6741 {
6742
6744
6745
6746 float min_time = 1;
6747 float max_time = 3;
6748 float delay = Math.RandomFloat(min_time, max_time);
6749
6750 explode_timer.Run(delay, this, "DoAmmoExplosion");
6751 }
6752
6754 {
6755 Magazine magazine = Magazine.Cast(this);
6756 int pop_sounds_count = 6;
6757 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6758
6759
6760 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6761 string sound_name = pop_sounds[ sound_idx ];
6762 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
6763
6764
6765 magazine.ServerAddAmmoCount(-1);
6766
6767
6768 float min_temp_to_explode = 100;
6769
6770 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
6771 {
6773 }
6774 }
6775
6776
6777 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6778 {
6779 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6780
6781 const int CHANCE_DAMAGE_CARGO = 4;
6782 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6783 const int CHANCE_DAMAGE_NOTHING = 2;
6784
6786 {
6787 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6788 int chances;
6789 int rnd;
6790
6791 if (GetInventory().GetCargo())
6792 {
6793 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6794 rnd = Math.RandomInt(0,chances);
6795
6796 if (rnd < CHANCE_DAMAGE_CARGO)
6797 {
6799 }
6800 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6801 {
6803 }
6804 }
6805 else
6806 {
6807 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6808 rnd = Math.RandomInt(0,chances);
6809
6810 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6811 {
6813 }
6814 }
6815 }
6816 }
6817
6819 {
6820 CargoBase cargo = GetInventory().GetCargo();
6821 if (cargo)
6822 {
6824 if (item_count > 0)
6825 {
6826 int random_pick = Math.RandomInt(0, item_count);
6828 if (!item.IsExplosive())
6829 {
6830 item.AddHealth("","",damage);
6831 return true;
6832 }
6833 }
6834 }
6835 return false;
6836 }
6837
6839 {
6840 GameInventory inventory = GetInventory();
6842 if (attachment_count > 0)
6843 {
6844 int random_pick = Math.RandomInt(0, attachment_count);
6846 if (!attachment.IsExplosive())
6847 {
6848 attachment.AddHealth("","",damage);
6849 return true;
6850 }
6851 }
6852 return false;
6853 }
6854
6856 {
6858 }
6859
6861 {
6863 return GetInventory().CanRemoveEntity();
6864
6865 return false;
6866 }
6867
6869 {
6870
6872 return false;
6873
6874
6876 return false;
6877
6878
6879
6881 if (delta == 0)
6882 return false;
6883
6884
6885 return true;
6886 }
6887
6889 {
6891 {
6892 if (ScriptInputUserData.CanStoreInputUserData())
6893 {
6894 ScriptInputUserData ctx = new ScriptInputUserData;
6899 ctx.
Write(destination_entity);
6903 }
6904 }
6905 else if (!
g_Game.IsMultiplayer())
6906 {
6908 }
6909 }
6910
6912 {
6913 float split_quantity_new;
6917 InventoryLocation loc = new InventoryLocation;
6918
6919 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6920 {
6922 split_quantity_new = stack_max;
6923 else
6925
6927 {
6928 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6929 if (new_item)
6930 {
6931 new_item.SetResultOfSplit(true);
6932 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6934 new_item.
SetQuantity(split_quantity_new,
false,
true);
6935 }
6936 }
6937 }
6938 else if (destination_entity && slot_id == -1)
6939 {
6940 if (quantity > stack_max)
6941 split_quantity_new = stack_max;
6942 else
6943 split_quantity_new = quantity;
6944
6946 {
6947 GameInventory destinationInventory = destination_entity.GetInventory();
6949 {
6952 }
6953
6954 if (new_item)
6955 {
6956 new_item.SetResultOfSplit(true);
6957 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6959 new_item.
SetQuantity(split_quantity_new,
false,
true);
6960 }
6961 }
6962 }
6963 else
6964 {
6965 if (stack_max != 0)
6966 {
6968 {
6970 }
6971
6972 if (split_quantity_new == 0)
6973 {
6974 if (!
g_Game.IsMultiplayer())
6975 player.PhysicalPredictiveDropItem(this);
6976 else
6977 player.ServerDropEntity(this);
6978 return;
6979 }
6980
6982 {
6984
6985 if (new_item)
6986 {
6987 new_item.SetResultOfSplit(true);
6988 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6991 new_item.PlaceOnSurface();
6992 }
6993 }
6994 }
6995 }
6996 }
6997
6999 {
7000 float split_quantity_new;
7004 InventoryLocation loc = new InventoryLocation;
7005
7006 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
7007 {
7009 split_quantity_new = stack_max;
7010 else
7012
7014 {
7015 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
7016 if (new_item)
7017 {
7018 new_item.SetResultOfSplit(true);
7019 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7021 new_item.
SetQuantity(split_quantity_new,
false,
true);
7022 }
7023 }
7024 }
7025 else if (destination_entity && slot_id == -1)
7026 {
7027 if (quantity > stack_max)
7028 split_quantity_new = stack_max;
7029 else
7030 split_quantity_new = quantity;
7031
7033 {
7034 GameInventory destinationInventory = destination_entity.GetInventory();
7036 {
7039 }
7040
7041 if (new_item)
7042 {
7043 new_item.SetResultOfSplit(true);
7044 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7046 new_item.
SetQuantity(split_quantity_new,
false,
true);
7047 }
7048 }
7049 }
7050 else
7051 {
7052 if (stack_max != 0)
7053 {
7055 {
7057 }
7058
7060 {
7062
7063 if (new_item)
7064 {
7065 new_item.SetResultOfSplit(true);
7066 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7069 new_item.PlaceOnSurface();
7070 }
7071 }
7072 }
7073 }
7074 }
7075
7077 {
7079 {
7080 if (ScriptInputUserData.CanStoreInputUserData())
7081 {
7082 ScriptInputUserData ctx = new ScriptInputUserData;
7087 dst.WriteToContext(ctx);
7089 }
7090 }
7091 else if (!
g_Game.IsMultiplayer())
7092 {
7094 }
7095 }
7096
7098 {
7100 {
7101 if (ScriptInputUserData.CanStoreInputUserData())
7102 {
7103 ScriptInputUserData ctx = new ScriptInputUserData;
7108 ctx.
Write(destination_entity);
7114 }
7115 }
7116 else if (!
g_Game.IsMultiplayer())
7117 {
7119 }
7120 }
7121
7123 {
7125 }
7126
7128 {
7130 float split_quantity_new;
7132 if (dst.IsValid())
7133 {
7134 int slot_id = dst.GetSlot();
7136
7137 if (quantity > stack_max)
7138 split_quantity_new = stack_max;
7139 else
7140 split_quantity_new = quantity;
7141
7143 {
7145
7146 if (new_item)
7147 {
7148 new_item.SetResultOfSplit(true);
7149 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7151 new_item.
SetQuantity(split_quantity_new,
false,
true);
7152 }
7153
7154 return new_item;
7155 }
7156 }
7157
7158 return null;
7159 }
7160
7162 {
7164 float split_quantity_new;
7166 if (destination_entity)
7167 {
7169 if (quantity > stackable)
7170 split_quantity_new = stackable;
7171 else
7172 split_quantity_new = quantity;
7173
7175 {
7176 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
7177 if (new_item)
7178 {
7179 new_item.SetResultOfSplit(true);
7180 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7182 new_item.
SetQuantity(split_quantity_new,
false,
true);
7183 }
7184 }
7185 }
7186 }
7187
7189 {
7191 {
7192 if (ScriptInputUserData.CanStoreInputUserData())
7193 {
7194 ScriptInputUserData ctx = new ScriptInputUserData;
7199 ItemBase destination_entity =
this;
7200 ctx.
Write(destination_entity);
7204 }
7205 }
7206 else if (!
g_Game.IsMultiplayer())
7207 {
7209 }
7210 }
7211
7213 {
7215 float split_quantity_new;
7217 if (player)
7218 {
7220 if (quantity > stackable)
7221 split_quantity_new = stackable;
7222 else
7223 split_quantity_new = quantity;
7224
7226 {
7227 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
7228 new_item =
ItemBase.Cast(in_hands);
7229 if (new_item)
7230 {
7231 new_item.SetResultOfSplit(true);
7232 MiscGameplayFunctions.TransferItemProperties(this,new_item);
7234 new_item.SetQuantity(split_quantity_new, false, true);
7235 }
7236 }
7237 }
7238 }
7239
7241 {
7243 float split_quantity_new = Math.Floor(quantity * 0.5);
7244
7246 return;
7247
7249
7250 if (new_item)
7251 {
7252 if (new_item.GetQuantityMax() < split_quantity_new)
7253 {
7254 split_quantity_new = new_item.GetQuantityMax();
7255 }
7256
7257 new_item.SetResultOfSplit(true);
7258 MiscGameplayFunctions.TransferItemProperties(this, new_item);
7259
7261 {
7264 }
7265 else
7266 {
7268 new_item.
SetQuantity(split_quantity_new,
false,
true);
7269 }
7270 }
7271 }
7272
7274 {
7276 float split_quantity_new = Math.Floor(quantity / 2);
7277
7279 return;
7280
7281 InventoryLocation invloc = new InventoryLocation;
7283
7285 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
7286
7287 if (new_item)
7288 {
7289 if (new_item.GetQuantityMax() < split_quantity_new)
7290 {
7291 split_quantity_new = new_item.GetQuantityMax();
7292 }
7294 {
7297 }
7298 else if (split_quantity_new > 1)
7299 {
7301 new_item.
SetQuantity(split_quantity_new,
false,
true);
7302 }
7303 }
7304 }
7305
7308 {
7309 SetWeightDirty();
7311
7312 if (parent)
7313 parent.OnAttachmentQuantityChangedEx(this, delta);
7314
7316 {
7318 {
7320 }
7322 {
7323 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
7325 }
7326 }
7327 }
7328
7331 {
7332
7333 }
7334
7337 {
7339 }
7340
7342 {
7343 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
7344
7346 {
7347 if (newLevel == GameConstants.STATE_RUINED)
7348 {
7350 EntityAI parent = GetHierarchyParent();
7351 if (parent && parent.IsFireplace())
7352 {
7353 CargoBase cargo = GetInventory().GetCargo();
7354 if (cargo)
7355 {
7357 {
7359 }
7360 }
7361 }
7362 }
7363
7365 {
7366
7368 return;
7369 }
7370
7371 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7372 {
7374 }
7375 }
7376 }
7377
7378
7380 {
7381 super.OnRightClick();
7382
7384 {
7386 {
7387 if (ScriptInputUserData.CanStoreInputUserData())
7388 {
7389 EntityAI root = GetHierarchyRoot();
7390 Man playerOwner = GetHierarchyRootPlayer();
7391 InventoryLocation dst = new InventoryLocation;
7392
7393
7394 if (!playerOwner && root && root == this)
7395 {
7397 }
7398 else
7399 {
7400
7401 GetInventory().GetCurrentInventoryLocation(dst);
7403 {
7404 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
7406 {
7408 }
7409 else
7410 {
7412
7413
7414 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7415 {
7417 }
7418 else
7419 {
7420 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7421 }
7422 }
7423 }
7424 }
7425
7426 ScriptInputUserData ctx = new ScriptInputUserData;
7434 }
7435 }
7436 else if (!
g_Game.IsMultiplayer())
7437 {
7439 }
7440 }
7441 }
7442
7444 {
7445 if (root)
7446 {
7447 vector m4[4];
7448 root.GetTransform(m4);
7449 dst.SetGround(this, m4);
7450 }
7451 else
7452 {
7453 GetInventory().GetCurrentInventoryLocation(dst);
7454 }
7455 }
7456
7457 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7458 {
7459
7460 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7461 return false;
7462
7463 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7464 return false;
7465
7466
7468 return false;
7469
7470
7471 Magazine mag = Magazine.Cast(this);
7472 if (mag)
7473 {
7474 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7475 return false;
7476
7477 if (stack_max_limit)
7478 {
7479 Magazine other_mag = Magazine.Cast(other_item);
7480 if (other_item)
7481 {
7482 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7483 return false;
7484 }
7485
7486 }
7487 }
7488 else
7489 {
7490
7492 return false;
7493
7495 return false;
7496 }
7497
7498 PlayerBase player = null;
7499 if (CastTo(player, GetHierarchyRootPlayer()))
7500 {
7501 if (player.GetInventory().HasAttachment(this))
7502 return false;
7503
7504 if (player.IsItemsToDelete())
7505 return false;
7506 }
7507
7508 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7509 return false;
7510
7511 int slotID;
7513 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7514 return false;
7515
7516 return true;
7517 }
7518
7520 {
7522 }
7523
7525 {
7526 return m_IsResultOfSplit;
7527 }
7528
7530 {
7531 m_IsResultOfSplit = value;
7532 }
7533
7535 {
7537 }
7538
7540 {
7541 float other_item_quantity = other_item.GetQuantity();
7542 float this_free_space;
7543
7545
7547
7548 if (other_item_quantity > this_free_space)
7549 {
7550 return this_free_space;
7551 }
7552 else
7553 {
7554 return other_item_quantity;
7555 }
7556 }
7557
7559 {
7561 }
7562
7564 {
7566 return;
7567
7568 if (!IsMagazine() && other_item)
7569 {
7571 if (quantity_used != 0)
7572 {
7573 float hp1 = GetHealth01("","");
7574 float hp2 = other_item.GetHealth01("","");
7575 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7576 hpResult = hpResult / (
GetQuantity() + quantity_used);
7577
7578 hpResult *= GetMaxHealth();
7579 Math.Round(hpResult);
7580 SetHealth("", "Health", hpResult);
7581
7583 other_item.AddQuantity(-quantity_used);
7584 }
7585 }
7587 }
7588
7590 {
7591 #ifdef SERVER
7592 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7593 GetHierarchyParent().IncreaseLifetimeUp();
7594 #endif
7595 };
7596
7598 {
7599 PlayerBase p = PlayerBase.Cast(player);
7600
7601 array<int> recipesIds = p.m_Recipes;
7602 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7603 if (moduleRecipesManager)
7604 {
7605 EntityAI itemInHands = player.GetEntityInHands();
7606 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7607 }
7608
7609 for (int i = 0;i < recipesIds.Count(); i++)
7610 {
7611 int key = recipesIds.Get(i);
7612 string recipeName = moduleRecipesManager.GetRecipeName(key);
7614 }
7615 }
7616
7617
7618 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7619 {
7620 super.GetDebugActions(outputList);
7621
7622
7628
7629
7634
7639
7640
7644
7645
7647 {
7651 }
7652
7655
7656
7660
7662
7663 InventoryLocation loc = new InventoryLocation();
7664 GetInventory().GetCurrentInventoryLocation(loc);
7666 {
7667 if (Gizmo_IsSupported())
7670 }
7671
7673 }
7674
7675
7676
7677
7679 {
7680 super.OnAction(action_id, player, ctx);
7681
7683 {
7684 switch (action_id)
7685 {
7689 return true;
7693 return true;
7694 }
7695 }
7696
7698 {
7699 switch (action_id)
7700 {
7702 Delete();
7703 return true;
7704 }
7705 }
7706
7707 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7708 {
7709 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7710 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7711 PlayerBase p = PlayerBase.Cast(player);
7712 if (
EActions.RECIPES_RANGE_START < 1000)
7713 {
7714 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7715 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7716 }
7717 }
7718 #ifndef SERVER
7719 else if (action_id ==
EActions.WATCH_PLAYER)
7720 {
7721 PluginDeveloper.SetDeveloperItemClientEx(player);
7722 }
7723 #endif
7725 {
7726 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7727 {
7728 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7729 OnDebugButtonPressServer(id + 1);
7730 }
7731
7732 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7733 {
7734 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7736 }
7737
7738 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7739 {
7740 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7742 }
7743
7744 else if (action_id ==
EActions.ADD_QUANTITY)
7745 {
7746 if (IsMagazine())
7747 {
7748 Magazine mag = Magazine.Cast(this);
7749 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7750 }
7751 else
7752 {
7754 }
7755
7756 if (m_EM)
7757 {
7758 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7759 }
7760
7761 }
7762
7763 else if (action_id ==
EActions.REMOVE_QUANTITY)
7764 {
7765 if (IsMagazine())
7766 {
7767 Magazine mag2 = Magazine.Cast(this);
7768 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7769 }
7770 else
7771 {
7773 }
7774 if (m_EM)
7775 {
7776 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7777 }
7778
7779 }
7780
7781 else if (action_id ==
EActions.SET_QUANTITY_0)
7782 {
7784
7785 if (m_EM)
7786 {
7787 m_EM.SetEnergy(0);
7788 }
7789 }
7790
7791 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7792 {
7794
7795 if (m_EM)
7796 {
7797 m_EM.SetEnergy(m_EM.GetEnergyMax());
7798 }
7799 }
7800
7801 else if (action_id ==
EActions.ADD_HEALTH)
7802 {
7803 AddHealth("","",GetMaxHealth("","Health")/5);
7804 }
7805 else if (action_id ==
EActions.REMOVE_HEALTH)
7806 {
7807 AddHealth("","",-GetMaxHealth("","Health")/5);
7808 }
7809 else if (action_id ==
EActions.DESTROY_HEALTH)
7810 {
7811 SetHealth01("","",0);
7812 }
7813 else if (action_id ==
EActions.WATCH_ITEM)
7814 {
7816 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7817 #ifdef DEVELOPER
7818 SetDebugDeveloper_item(this);
7819 #endif
7820 }
7821
7822 else if (action_id ==
EActions.ADD_TEMPERATURE)
7823 {
7824 AddTemperature(20);
7825
7826 }
7827
7828 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7829 {
7830 AddTemperature(-20);
7831
7832 }
7833
7834 else if (action_id ==
EActions.FLIP_FROZEN)
7835 {
7836 SetFrozen(!GetIsFrozen());
7837
7838 }
7839
7840 else if (action_id ==
EActions.ADD_WETNESS)
7841 {
7843
7844 }
7845
7846 else if (action_id ==
EActions.REMOVE_WETNESS)
7847 {
7849
7850 }
7851
7852 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7853 {
7856
7857
7858 }
7859
7860 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7861 {
7864 }
7865
7866 else if (action_id ==
EActions.MAKE_SPECIAL)
7867 {
7868 auto debugParams = DebugSpawnParams.WithPlayer(player);
7869 OnDebugSpawnEx(debugParams);
7870 }
7871
7872 }
7873
7874
7875 return false;
7876 }
7877
7878
7879
7880
7884
7887
7888
7889
7891 {
7892 return false;
7893 }
7894
7895
7897 {
7898 return true;
7899 }
7900
7901
7903 {
7904 return true;
7905 }
7906
7907
7908
7910 {
7911 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7912 return g_Game.ConfigIsExisting(config_path);
7913 }
7914
7917 {
7918 return null;
7919 }
7920
7922 {
7923 return false;
7924 }
7925
7927 {
7928 return false;
7929 }
7930
7934
7935
7937 {
7938 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7939 return module_repairing.CanRepair(this, item_repair_kit);
7940 }
7941
7942
7943 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7944 {
7945 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7946 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7947 }
7948
7949
7951 {
7952
7953
7954
7955
7956
7957
7958
7959
7960 return 1;
7961 }
7962
7963
7964
7966 {
7968 }
7969
7970
7971
7973 {
7975 }
7976
7977
7986 {
7987 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7988
7989 if (player)
7990 {
7991 player.MessageStatus(text);
7992 }
7993 }
7994
7995
8004 {
8005 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8006
8007 if (player)
8008 {
8009 player.MessageAction(text);
8010 }
8011 }
8012
8013
8022 {
8023 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8024
8025 if (player)
8026 {
8027 player.MessageFriendly(text);
8028 }
8029 }
8030
8031
8040 {
8041 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
8042
8043 if (player)
8044 {
8045 player.MessageImportant(text);
8046 }
8047 }
8048
8050 {
8051 return true;
8052 }
8053
8054
8055 override bool KindOf(
string tag)
8056 {
8057 bool found = false;
8058 string item_name = this.
GetType();
8060 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
8061
8062 int array_size = item_tag_array.Count();
8063 for (int i = 0; i < array_size; i++)
8064 {
8065 if (item_tag_array.Get(i) == tag)
8066 {
8067 found = true;
8068 break;
8069 }
8070 }
8071 return found;
8072 }
8073
8074
8076 {
8077
8078 super.OnRPC(sender, rpc_type,ctx);
8079
8080
8081 switch (rpc_type)
8082 {
8083 #ifndef SERVER
8084 case ERPCs.RPC_SOUND_LOCK_ATTACH:
8085 Param2<bool, string> p = new Param2<bool, string>(false, "");
8086
8088 return;
8089
8090 bool play = p.param1;
8091 string soundSet = p.param2;
8092
8093 if (play)
8094 {
8096 {
8098 {
8100 }
8101 }
8102 else
8103 {
8105 }
8106 }
8107 else
8108 {
8110 }
8111
8112 break;
8113 #endif
8114
8115 }
8116
8118 {
8120 }
8121 }
8122
8123
8124
8125
8127 {
8128 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8129 return plugin.GetID(
name);
8130 }
8131
8133 {
8134 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
8135 return plugin.GetName(id);
8136 }
8137
8140 {
8141
8142
8143 int varFlags;
8144 if (!ctx.
Read(varFlags))
8145 return;
8146
8147 if (varFlags & ItemVariableFlags.FLOAT)
8148 {
8150 }
8151 }
8152
8154 {
8155
8156 super.SerializeNumericalVars(floats_out);
8157
8158
8159
8161 {
8163 }
8164
8166 {
8168 }
8169
8171 {
8173 }
8174
8176 {
8181 }
8182
8184 {
8186 }
8187 }
8188
8190 {
8191
8192 super.DeSerializeNumericalVars(floats);
8193
8194
8195 int index = 0;
8196 int mask = Math.Round(floats.Get(index));
8197
8198 index++;
8199
8201 {
8203 {
8205 }
8206 else
8207 {
8208 float quantity = floats.Get(index);
8210 }
8211 index++;
8212 }
8213
8215 {
8216 float wet = floats.Get(index);
8218 index++;
8219 }
8220
8222 {
8223 int liquidtype = Math.Round(floats.Get(index));
8225 index++;
8226 }
8227
8229 {
8231 index++;
8233 index++;
8235 index++;
8237 index++;
8238 }
8239
8241 {
8242 int cleanness = Math.Round(floats.Get(index));
8244 index++;
8245 }
8246 }
8247
8249 {
8250 super.WriteVarsToCTX(ctx);
8251
8252
8254 {
8256 }
8257
8259 {
8261 }
8262
8264 {
8266 }
8267
8269 {
8270 int r,g,b,a;
8276 }
8277
8279 {
8281 }
8282 }
8283
8285 {
8286 if (!super.ReadVarsFromCTX(ctx,version))
8287 return false;
8288
8289 int intValue;
8290 float value;
8291
8292 if (version < 140)
8293 {
8294 if (!ctx.
Read(intValue))
8295 return false;
8296
8297 m_VariablesMask = intValue;
8298 }
8299
8301 {
8302 if (!ctx.
Read(value))
8303 return false;
8304
8306 {
8308 }
8309 else
8310 {
8312 }
8313 }
8314
8315 if (version < 140)
8316 {
8318 {
8319 if (!ctx.
Read(value))
8320 return false;
8321 SetTemperatureDirect(value);
8322 }
8323 }
8324
8326 {
8327 if (!ctx.
Read(value))
8328 return false;
8330 }
8331
8333 {
8334 if (!ctx.
Read(intValue))
8335 return false;
8337 }
8338
8340 {
8341 int r,g,b,a;
8343 return false;
8345 return false;
8347 return false;
8349 return false;
8350
8352 }
8353
8355 {
8356 if (!ctx.
Read(intValue))
8357 return false;
8359 }
8360
8361 if (version >= 138 && version < 140)
8362 {
8364 {
8365 if (!ctx.
Read(intValue))
8366 return false;
8367 SetFrozen(intValue);
8368 }
8369 }
8370
8371 return true;
8372 }
8373
8374
8376 {
8379 {
8381 }
8382
8383 if (!super.OnStoreLoad(ctx, version))
8384 {
8386 return false;
8387 }
8388
8389 if (version >= 114)
8390 {
8391 bool hasQuickBarIndexSaved;
8392
8393 if (!ctx.
Read(hasQuickBarIndexSaved))
8394 {
8396 return false;
8397 }
8398
8399 if (hasQuickBarIndexSaved)
8400 {
8401 int itmQBIndex;
8402
8403
8404 if (!ctx.
Read(itmQBIndex))
8405 {
8407 return false;
8408 }
8409
8410 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8411 if (itmQBIndex != -1 && parentPlayer)
8412 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8413 }
8414 }
8415 else
8416 {
8417
8418 PlayerBase player;
8419 int itemQBIndex;
8420 if (version ==
int.
MAX)
8421 {
8422 if (!ctx.
Read(itemQBIndex))
8423 {
8425 return false;
8426 }
8427 }
8428 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8429 {
8430
8431 if (!ctx.
Read(itemQBIndex))
8432 {
8434 return false;
8435 }
8436 if (itemQBIndex != -1 && player)
8437 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8438 }
8439 }
8440
8441 if (version < 140)
8442 {
8443
8444 if (!LoadVariables(ctx, version))
8445 {
8447 return false;
8448 }
8449 }
8450
8451
8453 {
8455 return false;
8456 }
8457 if (version >= 132)
8458 {
8460 if (raib)
8461 {
8463 {
8465 return false;
8466 }
8467 }
8468 }
8469
8471 return true;
8472 }
8473
8474
8475
8477 {
8478 super.OnStoreSave(ctx);
8479
8480 PlayerBase player;
8481 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8482 {
8484
8485 int itemQBIndex = -1;
8486 itemQBIndex = player.FindQuickBarEntityIndex(this);
8487 ctx.
Write(itemQBIndex);
8488 }
8489 else
8490 {
8492 }
8493
8495
8497 if (raib)
8498 {
8500 }
8501 }
8502
8503
8505 {
8506 super.AfterStoreLoad();
8507
8509 {
8511 }
8512
8514 {
8517 }
8518 }
8519
8521 {
8522 super.EEOnAfterLoad();
8523
8525 {
8527 }
8528
8531 }
8532
8534 {
8535 return false;
8536 }
8537
8538
8539
8541 {
8543 {
8544 #ifdef PLATFORM_CONSOLE
8545
8547 {
8549 if (menu)
8550 {
8552 }
8553 }
8554 #endif
8555 }
8556
8558 {
8561 }
8562
8564 {
8565 SetWeightDirty();
8567 }
8569 {
8572 }
8573
8575 {
8578
8581 }
8583 {
8587 }
8588
8589 super.OnVariablesSynchronized();
8590 }
8591
8592
8593
8595 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8596 {
8597 if (!IsServerCheck(allow_client))
8598 return false;
8599
8601 return false;
8602
8605
8606 if (value <= (min + 0.001))
8607 value = min;
8608
8609 if (value == min)
8610 {
8611 if (destroy_config)
8612 {
8613 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8614 if (dstr)
8615 {
8617 this.Delete();
8618 return true;
8619 }
8620 }
8621 else if (destroy_forced)
8622 {
8624 this.Delete();
8625 return true;
8626 }
8627
8629 }
8630
8633
8635 {
8636 EntityAI parent = GetHierarchyRoot();
8637 InventoryLocation iLoc = new InventoryLocation();
8638 GetInventory().GetCurrentInventoryLocation(iLoc);
8640 {
8641 int iLocSlot = iLoc.
GetSlot();
8643 {
8645 }
8647 {
8649 }
8650 }
8651 }
8652
8654 {
8656
8657 if (delta)
8659 }
8660
8662
8663 return false;
8664 }
8665
8666
8668 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8669 {
8671 }
8672
8674 {
8677 }
8678
8680 {
8683 }
8684
8686 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8687 {
8688 float value_clamped = Math.Clamp(value, 0, 1);
8690 SetQuantity(result, destroy_config, destroy_forced);
8691 }
8692
8693
8696 {
8698 }
8699
8701 {
8703 }
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8715 {
8716 int slot = -1;
8717 GameInventory inventory = GetInventory();
8718 if (inventory)
8719 {
8720 InventoryLocation il = new InventoryLocation;
8723 }
8724
8726 }
8727
8729 {
8730 float quantity_max = 0;
8731
8733 {
8734 if (attSlotID != -1)
8735 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8736
8737 if (quantity_max <= 0)
8739 }
8740
8741 if (quantity_max <= 0)
8743
8744 return quantity_max;
8745 }
8746
8748 {
8750 }
8751
8753 {
8755 }
8756
8757
8759 {
8761 }
8762
8764 {
8766 }
8767
8769 {
8771 }
8772
8773
8775 {
8776
8777 float weightEx = GetWeightEx();
8778 float special = GetInventoryAndCargoWeight();
8779 return weightEx - special;
8780 }
8781
8782
8784 {
8786 }
8787
8789 {
8791 {
8792 #ifdef DEVELOPER
8793 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8794 {
8795 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8797 }
8798 #endif
8799
8801 }
8802 else if (HasEnergyManager())
8803 {
8804 #ifdef DEVELOPER
8805 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8806 {
8807 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8808 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8809 }
8810 #endif
8811 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
8812 }
8813 else
8814 {
8815 #ifdef DEVELOPER
8816 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8817 {
8818 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8819 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8820 }
8821 #endif
8822 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
8823 }
8824 }
8825
8828 {
8829 int item_count = 0;
8831
8832 GameInventory inventory = GetInventory();
8833 CargoBase cargo = inventory.
GetCargo();
8834 if (cargo != NULL)
8835 {
8837 }
8838
8840 for (int i = 0; i < nAttachments; ++i)
8841 {
8843 if (item)
8844 item_count += item.GetNumberOfItems();
8845 }
8846 return item_count;
8847 }
8848
8851 {
8852 float weight = 0;
8853 float wetness = 1;
8854 if (include_wetness)
8857 {
8858 weight = wetness * m_ConfigWeight;
8859 }
8861 {
8862 weight = 1;
8863 }
8864 return weight;
8865 }
8866
8867
8868
8870 {
8871 GameInventory inventory = GetInventory();
8872 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
8873 {
8874 array<EntityAI> items = new array<EntityAI>;
8876 for (int i = 0; i < items.Count(); ++i)
8877 {
8879 if (item)
8880 {
8881 g_Game.ObjectDelete(item);
8882 }
8883 }
8884 }
8885 }
8886
8887
8888
8889
8891 {
8892 float energy = 0;
8893 if (HasEnergyManager())
8894 {
8895 energy = GetCompEM().GetEnergy();
8896 }
8897 return energy;
8898 }
8899
8900
8902 {
8903 super.OnEnergyConsumed();
8904
8906 }
8907
8909 {
8910 super.OnEnergyAdded();
8911
8913 }
8914
8915
8917 {
8918 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8919 {
8921 {
8922 float energy_0to1 = GetCompEM().GetEnergy0To1();
8924 }
8925 }
8926 }
8927
8928
8930 {
8931 return ConfigGetFloat("heatIsolation");
8932 }
8933
8935 {
8937 }
8938
8940 {
8941 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8942 if (
g_Game.ConfigIsExisting(paramPath))
8943 return g_Game.ConfigGetFloat(paramPath);
8944
8945 return 0.0;
8946 }
8947
8949 {
8950 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8951 if (
g_Game.ConfigIsExisting(paramPath))
8952 return g_Game.ConfigGetFloat(paramPath);
8953
8954 return 0.0;
8955 }
8956
8957 override void SetWet(
float value,
bool allow_client =
false)
8958 {
8959 if (!IsServerCheck(allow_client))
8960 return;
8961
8964
8966
8967 m_VarWet = Math.Clamp(value, min, max);
8968
8970 {
8973 }
8974 }
8975
8976 override void AddWet(
float value)
8977 {
8979 }
8980
8982 {
8984 }
8985
8987 {
8989 }
8990
8992 {
8994 }
8995
8997 {
8999 }
9000
9002 {
9004 }
9005
9007 {
9010 if (newLevel != oldLevel)
9011 {
9013 }
9014 }
9015
9017 {
9018 SetWeightDirty();
9019 }
9020
9022 {
9023 return GetWetLevelInternal(
m_VarWet);
9024 }
9025
9026
9027
9029 {
9031 }
9032
9034 {
9036 }
9037
9039 {
9041 }
9042
9044 {
9046 }
9047
9048
9049
9051 {
9052 if (ConfigIsExisting("itemModelLength"))
9053 {
9054 return ConfigGetFloat("itemModelLength");
9055 }
9056 return 0;
9057 }
9058
9060 {
9061 if (ConfigIsExisting("itemAttachOffset"))
9062 {
9063 return ConfigGetFloat("itemAttachOffset");
9064 }
9065 return 0;
9066 }
9067
9068 override void SetCleanness(
int value,
bool allow_client =
false)
9069 {
9070 if (!IsServerCheck(allow_client))
9071 return;
9072
9074
9076
9079 }
9080
9082 {
9084 }
9085
9087 {
9088 return true;
9089 }
9090
9091
9092
9093
9095 {
9097 }
9098
9100 {
9102 }
9103
9104
9105
9106
9107 override void SetColor(
int r,
int g,
int b,
int a)
9108 {
9114 }
9116 override void GetColor(out
int r,out
int g,out
int b,out
int a)
9117 {
9122 }
9123
9125 {
9127 }
9128
9131 {
9132 int r,g,b,a;
9134 r = r/255;
9135 g = g/255;
9136 b = b/255;
9137 a = a/255;
9138 return MiscGameplayFunctions.GetColorString(r, g, b, a);
9139 }
9140
9141
9142
9143 override void SetLiquidType(
int value,
bool allow_client =
false)
9144 {
9145 if (!IsServerCheck(allow_client))
9146 return;
9147
9152 }
9153
9155 {
9156 return ConfigGetInt("varLiquidTypeInit");
9157 }
9158
9160 {
9162 }
9163
9165 {
9167 SetFrozen(false);
9168 }
9169
9172 {
9173 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9174 }
9175
9176
9179 {
9180 PlayerBase nplayer;
9181 if (PlayerBase.CastTo(nplayer, player))
9182 {
9184 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
9185 }
9186 }
9187
9188
9191 {
9192 PlayerBase nplayer;
9193 if (PlayerBase.CastTo(nplayer,player))
9194 {
9195 nplayer.SetEnableQuickBarEntityShortcut(this, false);
9196 }
9197
9198 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
9199
9200 if (HasEnergyManager())
9201 {
9202 GetCompEM().UpdatePlugState();
9203 }
9204 }
9205
9206
9208 {
9209 super.OnPlacementStarted(player);
9210
9212 }
9213
9214 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
9215 {
9217 {
9218 m_AdminLog.OnPlacementComplete(player,
this);
9219 }
9220
9221 super.OnPlacementComplete(player, position, orientation);
9222 }
9223
9224
9225
9226
9227
9229 {
9231 {
9232 return true;
9233 }
9234 else
9235 {
9236 return false;
9237 }
9238 }
9239
9240
9242 {
9244 {
9246 }
9247 }
9248
9249
9251 {
9253 }
9254
9256 {
9258 }
9259
9260 override void InsertAgent(
int agent,
float count = 1)
9261 {
9262 if (count < 1)
9263 return;
9264
9266 }
9267
9270 {
9272 }
9273
9274
9276 {
9278 }
9279
9280
9281
9282
9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
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
9322 {
9324 return false;
9325 return true;
9326 }
9327
9329 {
9330
9332 }
9333
9334
9337 {
9338 super.CheckForRoofLimited(timeTresholdMS);
9339
9340 float time =
g_Game.GetTime();
9341 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
9342 {
9343 m_PreviousRoofTestTime = time;
9344 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
9345 }
9346 }
9347
9348
9350 {
9352 {
9353 return 0;
9354 }
9355
9356 if (GetInventory().GetAttachmentSlotsCount() != 0)
9357 {
9358 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
9359 if (filter)
9360 return filter.GetProtectionLevel(type, false, system);
9361 else
9362 return 0;
9363 }
9364
9365 string subclassPath, entryName;
9366
9367 switch (type)
9368 {
9370 entryName = "biological";
9371 break;
9373 entryName = "chemical";
9374 break;
9375 default:
9376 entryName = "biological";
9377 break;
9378 }
9379
9380 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
9381
9382 return g_Game.ConfigGetFloat(subclassPath + entryName);
9383 }
9384
9385
9386
9389 {
9390 if (!IsMagazine())
9392
9394 }
9395
9396
9397
9398
9399
9404 {
9405 return true;
9406 }
9407
9409 {
9411 }
9412
9413
9414
9415
9416
9418 {
9419 if (parent)
9420 {
9421 if (parent.IsInherited(DayZInfected))
9422 return true;
9423
9424 if (!parent.IsRuined())
9425 return true;
9426 }
9427
9428 return true;
9429 }
9430
9432 {
9433 if (!super.CanPutAsAttachment(parent))
9434 {
9435 return false;
9436 }
9437
9438 if (!IsRuined() && !parent.IsRuined())
9439 {
9440 return true;
9441 }
9442
9443 return false;
9444 }
9445
9447 {
9448
9449
9450
9451
9452 return super.CanReceiveItemIntoCargo(item);
9453 }
9454
9456 {
9457
9458
9459
9460
9461 GameInventory attachmentInv = attachment.GetInventory();
9463 {
9464 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9465 return false;
9466 }
9467
9468 InventoryLocation loc = new InventoryLocation();
9469 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9470 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9471 return false;
9472
9473 return super.CanReceiveAttachment(attachment, slotId);
9474 }
9475
9477 {
9478 if (!super.CanReleaseAttachment(attachment))
9479 return false;
9480
9481 return GetInventory().AreChildrenAccessible();
9482 }
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497
9498
9499
9500
9501
9502
9503
9505 {
9506 int id = muzzle_owner.GetMuzzleID();
9507 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9508
9509 if (WPOF_array)
9510 {
9511 for (int i = 0; i < WPOF_array.Count(); i++)
9512 {
9513 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9514
9515 if (WPOF)
9516 {
9517 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9518 }
9519 }
9520 }
9521 }
9522
9523
9525 {
9526 int id = muzzle_owner.GetMuzzleID();
9528
9529 if (WPOBE_array)
9530 {
9531 for (int i = 0; i < WPOBE_array.Count(); i++)
9532 {
9533 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9534
9535 if (WPOBE)
9536 {
9537 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9538 }
9539 }
9540 }
9541 }
9542
9543
9545 {
9546 int id = muzzle_owner.GetMuzzleID();
9547 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9548
9549 if (WPOOH_array)
9550 {
9551 for (int i = 0; i < WPOOH_array.Count(); i++)
9552 {
9553 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9554
9555 if (WPOOH)
9556 {
9557 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9558 }
9559 }
9560 }
9561 }
9562
9563
9565 {
9566 int id = muzzle_owner.GetMuzzleID();
9567 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9568
9569 if (WPOOH_array)
9570 {
9571 for (int i = 0; i < WPOOH_array.Count(); i++)
9572 {
9573 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9574
9575 if (WPOOH)
9576 {
9577 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9578 }
9579 }
9580 }
9581 }
9582
9583
9585 {
9586 int id = muzzle_owner.GetMuzzleID();
9587 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9588
9589 if (WPOOH_array)
9590 {
9591 for (int i = 0; i < WPOOH_array.Count(); i++)
9592 {
9593 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9594
9595 if (WPOOH)
9596 {
9597 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9598 }
9599 }
9600 }
9601 }
9602
9603
9604
9606 {
9608 {
9609 return true;
9610 }
9611
9612 return false;
9613 }
9614
9616 {
9618 {
9619 return true;
9620 }
9621
9622 return false;
9623 }
9624
9626 {
9628 {
9629 return true;
9630 }
9631
9632 return false;
9633 }
9634
9636 {
9637 return false;
9638 }
9639
9642 {
9643 return UATimeSpent.DEFAULT_DEPLOY;
9644 }
9645
9646
9647
9648
9650 {
9652 SetSynchDirty();
9653 }
9654
9656 {
9658 }
9659
9660
9662 {
9663 return false;
9664 }
9665
9668 {
9669 string att_type = "None";
9670
9671 if (ConfigIsExisting("soundAttType"))
9672 {
9673 att_type = ConfigGetString("soundAttType");
9674 }
9675
9677 }
9678
9680 {
9682 }
9683
9684
9685
9686
9687
9693
9695 {
9698
9700 }
9701
9702
9704 {
9706 return;
9707
9709
9712
9715
9716 SoundParameters params = new SoundParameters();
9720 }
9721
9722
9724 {
9726 {
9729
9730 SetSynchDirty();
9731
9734 }
9735 }
9736
9738 {
9740 }
9741
9742
9744 {
9746 return;
9747
9749 SetSynchDirty();
9750
9753 }
9754
9756 {
9759 }
9760
9762 {
9764 }
9765
9766 void OnApply(PlayerBase player);
9767
9769 {
9770 return 1.0;
9771 };
9772
9774 {
9776 }
9777
9779 {
9781 }
9782
9784
9786 {
9787 SetDynamicPhysicsLifeTime(0.01);
9789 }
9790
9792 {
9793 array<string> zone_names = new array<string>;
9794 GetDamageZones(zone_names);
9795 for (int i = 0; i < zone_names.Count(); i++)
9796 {
9797 SetHealthMax(zone_names.Get(i),"Health");
9798 }
9799 SetHealthMax("","Health");
9800 }
9801
9804 {
9805 float global_health = GetHealth01("","Health");
9806 array<string> zones = new array<string>;
9807 GetDamageZones(zones);
9808
9809 for (int i = 0; i < zones.Count(); i++)
9810 {
9811 SetHealth01(zones.Get(i),"Health",global_health);
9812 }
9813 }
9814
9817 {
9818 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9819 }
9820
9822 {
9823 if (!hasRootAsPlayer)
9824 {
9825 if (refParentIB)
9826 {
9827
9828 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9829 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9830
9831 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9832 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9833
9836 }
9837 else
9838 {
9839
9842 }
9843 }
9844 }
9845
9847 {
9849 {
9850 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9851 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
9852 {
9853 float heatPermCoef = 1.0;
9855 while (ent)
9856 {
9857 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9858 ent = ent.GetHierarchyParent();
9859 }
9860
9861 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9862 }
9863 }
9864 }
9865
9867 {
9868
9869 EntityAI parent = GetHierarchyParent();
9870 if (!parent)
9871 {
9872 hasParent = false;
9873 hasRootAsPlayer = false;
9874 }
9875 else
9876 {
9877 hasParent = true;
9878 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9879 refParentIB =
ItemBase.Cast(parent);
9880 }
9881 }
9882
9883 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9884 {
9885
9886 }
9887
9889 {
9890
9891 return false;
9892 }
9893
9895 {
9896
9897
9898 return false;
9899 }
9900
9902 {
9903
9904 return false;
9905 }
9906
9909 {
9910 return !GetIsFrozen() &&
IsOpen();
9911 }
9912
9914 {
9915 bool hasParent = false, hasRootAsPlayer = false;
9917
9918 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9919 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9920
9921 if (wwtu || foodDecay)
9922 {
9926
9927 if (processWetness || processTemperature || processDecay)
9928 {
9930
9931 if (processWetness)
9932 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9933
9934 if (processTemperature)
9936
9937 if (processDecay)
9938 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9939 }
9940 }
9941 }
9942
9945 {
9947 }
9948
9950 {
9953
9954 return super.GetTemperatureFreezeThreshold();
9955 }
9956
9958 {
9961
9962 return super.GetTemperatureThawThreshold();
9963 }
9964
9966 {
9969
9970 return super.GetItemOverheatThreshold();
9971 }
9972
9974 {
9976 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
9977
9978 return super.GetTemperatureFreezeTime();
9979 }
9980
9982 {
9984 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
9985
9986 return super.GetTemperatureThawTime();
9987 }
9988
9993
9995 {
9996 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
9997 }
9998
10000 {
10001 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
10002 }
10003
10006 {
10008 }
10009
10011 {
10013 }
10014
10016 {
10018 }
10019
10022 {
10023 return null;
10024 }
10025
10028 {
10029 return false;
10030 }
10031
10033 {
10035 {
10038 if (!trg)
10039 {
10041 explosive = this;
10042 }
10043
10044 explosive.PairRemote(trg);
10046
10047 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
10048 trg.SetPersistentPairID(persistentID);
10049 explosive.SetPersistentPairID(persistentID);
10050
10051 return true;
10052 }
10053 return false;
10054 }
10055
10058 {
10059 float ret = 1.0;
10062 ret *= GetHealth01();
10063
10064 return ret;
10065 }
10066
10067 #ifdef DEVELOPER
10068 override void SetDebugItem()
10069 {
10070 super.SetDebugItem();
10071 _itemBase = this;
10072 }
10073
10075 {
10076 string text = super.GetDebugText();
10077
10079 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
10080
10081 return text;
10082 }
10083 #endif
10084
10086 {
10087 return true;
10088 }
10089
10091
10093
10095 {
10098 }
10099
10100
10108
10124
10125 [
Obsolete(
"Use ItemSoundHandler instead")]
10128 {
10129 if (!
g_Game.IsDedicatedServer())
10130 {
10131 if (ConfigIsExisting("attachSoundSet"))
10132 {
10133 string cfg_path = "";
10134 string soundset = "";
10135 string type_name =
GetType();
10136
10139 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
10140 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
10141
10142 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
10143 {
10144 for (int i = 0; i < cfg_soundset_array.Count(); i++)
10145 {
10146 if (cfg_slot_array[i] == slot_type)
10147 {
10148 soundset = cfg_soundset_array[i];
10149 break;
10150 }
10151 }
10152 }
10153
10154 if (soundset != "")
10155 {
10156 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
10158 }
10159 }
10160 }
10161 }
10162
10164}
10165
10167{
10169 if (entity)
10170 {
10171 bool is_item = entity.IsInherited(
ItemBase);
10172 if (is_item && full_quantity)
10173 {
10176 }
10177 }
10178 else
10179 {
10181 return NULL;
10182 }
10183 return entity;
10184}
10185
10187{
10188 if (item)
10189 {
10190 if (health > 0)
10191 item.SetHealth("", "", health);
10192
10193 if (item.CanHaveTemperature())
10194 {
10196 if (item.CanFreeze())
10197 item.SetFrozen(false);
10198 }
10199
10200 if (item.HasEnergyManager())
10201 {
10202 if (quantity >= 0)
10203 {
10204 item.GetCompEM().SetEnergy0To1(quantity);
10205 }
10206 else
10207 {
10209 }
10210 }
10211 else if (item.IsMagazine())
10212 {
10213 Magazine mag = Magazine.Cast(item);
10214 if (quantity >= 0)
10215 {
10216 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
10217 }
10218 else
10219 {
10221 }
10222
10223 }
10224 else
10225 {
10226 if (quantity >= 0)
10227 {
10228 item.SetQuantityNormalized(quantity, false);
10229 }
10230 else
10231 {
10233 }
10234
10235 }
10236 }
10237}
10238
10239#ifdef DEVELOPER
10241#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.