4961{
4963 {
4964 return true;
4965 }
4966};
4967
4968
4969
4971{
4975
4977
4980
4981
4982
4983
4984
4993
4999
5004
5009
5030 protected bool m_IsResultOfSplit
5031
5033
5038
5039
5040
5042
5046
5047
5048
5050
5053
5054
5055
5061
5062
5070
5073
5074
5076
5077
5079
5080
5085
5086
5091
5092
5094
5095
5097 {
5102
5103 if (!
GetGame().IsDedicatedServer())
5104 {
5106 {
5108
5110 {
5112 }
5113 }
5114
5117 }
5118
5119 m_OldLocation = null;
5120
5122 {
5124 }
5125
5126 if (ConfigIsExisting("headSelectionsToHide"))
5127 {
5130 }
5131
5133 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
5134 {
5136 }
5137
5139
5140 m_IsResultOfSplit = false;
5141
5143 }
5144
5146 {
5147 super.InitItemVariables();
5148
5154 m_Count = ConfigGetInt(
"count");
5155
5158
5163
5166
5171
5183
5187
5188
5191 if (ConfigIsExisting("canBeSplit"))
5192 {
5195 }
5196
5198 if (ConfigIsExisting("itemBehaviour"))
5200
5201
5204 RegisterNetSyncVariableInt("m_VarLiquidType");
5205 RegisterNetSyncVariableInt("m_Cleanness",0,1);
5206
5207 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
5208 RegisterNetSyncVariableFloat("m_ImpactSpeed");
5209 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
5210
5211 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
5212 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
5213 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
5214 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
5215
5216 RegisterNetSyncVariableBool("m_IsBeingPlaced");
5217 RegisterNetSyncVariableBool("m_IsTakeable");
5218 RegisterNetSyncVariableBool("m_IsHologram");
5219
5222 {
5225 }
5226
5228
5230 if (ConfigIsExisting("temperaturePerQuantityWeight"))
5232
5233 }
5234
5236 {
5238 }
5239
5241 {
5244 {
5249 }
5250 }
5251
5252 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
5253 {
5255 {
5258 }
5259
5261 }
5262
5264 {
5270 }
5271
5273
5275 {
5277
5278 if (!action)
5279 {
5280 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
5281 return;
5282 }
5283
5285 if (!ai)
5286 {
5288 return;
5289 }
5290
5292 if (!action_array)
5293 {
5294 action_array = new array<ActionBase_Basic>;
5296 }
5297 if (LogManager.IsActionLogEnable())
5298 {
5299 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
5300 }
5301
5302 if (action_array.Find(action) != -1)
5303 {
5304 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
5305 }
5306 else
5307 {
5308 action_array.Insert(action);
5309 }
5310 }
5311
5313 {
5315 ActionBase action = player.GetActionManager().GetAction(actionName);
5318
5319 if (action_array)
5320 {
5321 action_array.RemoveItem(action);
5322 }
5323 }
5324
5325
5326
5328 {
5329 ActionOverrideData overrideData = new ActionOverrideData();
5333
5335 if (!actionMap)
5336 {
5339 }
5340
5341 actionMap.Insert(this.
Type(), overrideData);
5342
5343 }
5344
5346
5348
5349
5351 {
5354
5357
5358 string config_to_search = "CfgVehicles";
5359 string muzzle_owner_config;
5360
5362 {
5363 if (IsInherited(Weapon))
5364 config_to_search = "CfgWeapons";
5365
5366 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5367
5368 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
5369
5371
5372 if (config_OnFire_subclass_count > 0)
5373 {
5374 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
5375
5376 for (int i = 0; i < config_OnFire_subclass_count; i++)
5377 {
5378 string particle_class = "";
5380 string config_OnFire_entry = config_OnFire_class + particle_class;
5381 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
5382 WPOF_array.Insert(WPOF);
5383 }
5384
5385
5387 }
5388 }
5389
5391 {
5392 config_to_search = "CfgWeapons";
5393 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5394
5395 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
5396
5398
5399 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
5400 {
5401 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
5402
5403 for (i = 0; i < config_OnBulletCasingEject_count; i++)
5404 {
5405 string particle_class2 = "";
5407 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
5408 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
5409 WPOBE_array.Insert(WPOBE);
5410 }
5411
5412
5414 }
5415 }
5416 }
5417
5418
5420 {
5423
5425 {
5426 string config_to_search = "CfgVehicles";
5427
5428 if (IsInherited(Weapon))
5429 config_to_search = "CfgWeapons";
5430
5431 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
5432 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
5433
5434 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
5435 {
5436
5438
5440 {
5442 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
5444 return;
5445 }
5446
5449
5450
5451
5453 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
5454
5455 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
5456 {
5457 string particle_class = "";
5459 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
5461
5462 if (entry_type == CT_CLASS)
5463 {
5464 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
5465 WPOOH_array.Insert(WPOF);
5466 }
5467 }
5468
5469
5471 }
5472 }
5473 }
5474
5476 {
5478 }
5479
5481 {
5483 {
5485
5488
5491
5492 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5493 }
5494 }
5495
5497 {
5499 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5500
5502 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5503
5505 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5506
5508 {
5510 }
5511 }
5512
5514 {
5516 }
5517
5519 {
5522 else
5524
5526 {
5529 }
5530 else
5531 {
5534
5537 }
5538
5540 }
5541
5543 {
5545 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5546 }
5547
5549 {
5551 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
5553 }
5554
5556 {
5558 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
5559 }
5560
5562 {
5565
5566 OverheatingParticle OP = new OverheatingParticle();
5571
5573 }
5574
5576 {
5579
5580 return -1;
5581 }
5582
5584 {
5586 {
5589
5590 for (int i = count; i > 0; --i)
5591 {
5592 int id = i - 1;
5595
5598
5599 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
5600 {
5601 if (p)
5602 {
5605 }
5606 }
5607 }
5608 }
5609 }
5610
5612 {
5614 {
5616 {
5617 int id = i - 1;
5619
5620 if (OP)
5621 {
5623
5624 if (p)
5625 {
5627 }
5628
5629 delete OP;
5630 }
5631 }
5632
5635 }
5636 }
5637
5640 {
5641 return 0.0;
5642 }
5643
5644
5646 {
5647 return 250;
5648 }
5649
5651 {
5652 return 0;
5653 }
5654
5657 {
5659 return true;
5660
5661 return false;
5662 }
5663
5666 {
5669
5671 {
5673 }
5674 else
5675 {
5676
5678 }
5679
5681 }
5682
5689 {
5690 return -1;
5691 }
5692
5693
5694
5695
5697 {
5699 {
5701 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
5702
5703 if (r_index >= 0)
5704 {
5705 InventoryLocation r_il = new InventoryLocation;
5706 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
5707
5708 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
5711 {
5712 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
5713 }
5715 {
5716 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
5717 }
5718
5719 }
5720
5721 player.GetHumanInventory().ClearUserReservedLocation(this);
5722 }
5723
5726 }
5727
5728
5729
5730
5732 {
5733 return ItemBase.m_DebugActionsMask;
5734 }
5735
5737 {
5738 return ItemBase.m_DebugActionsMask & mask;
5739 }
5740
5742 {
5743 ItemBase.m_DebugActionsMask = mask;
5744 }
5745
5747 {
5748 ItemBase.m_DebugActionsMask |= mask;
5749 }
5750
5752 {
5753 ItemBase.m_DebugActionsMask &= ~mask;
5754 }
5755
5757 {
5759 {
5761 }
5762 else
5763 {
5765 }
5766 }
5767
5768
5770 {
5771 if (GetEconomyProfile())
5772 {
5773 float q_max = GetEconomyProfile().GetQuantityMax();
5774 if (q_max > 0)
5775 {
5776 float q_min = GetEconomyProfile().GetQuantityMin();
5777 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
5778
5780 {
5781 ComponentEnergyManager comp = GetCompEM();
5783 {
5785 }
5786 }
5788 {
5790
5791 }
5792
5793 }
5794 }
5795 }
5796
5799 {
5800 EntityAI parent = GetHierarchyParent();
5801
5802 if (parent)
5803 {
5804 InventoryLocation inventory_location_to_lock = new InventoryLocation;
5805 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
5806 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
5807 }
5808 }
5809
5812 {
5813 EntityAI parent = GetHierarchyParent();
5814
5815 if (parent)
5816 {
5817 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
5818 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
5819 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
5820 }
5821 }
5822
5824 {
5825
5826
5827
5828
5830
5832 {
5833 if (ScriptInputUserData.CanStoreInputUserData())
5834 {
5835 ScriptInputUserData ctx = new ScriptInputUserData;
5841 ctx.
Write(use_stack_max);
5844
5846 {
5847 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
5848 }
5849 }
5850 }
5851 else if (!
GetGame().IsMultiplayer())
5852 {
5854 }
5855 }
5856
5858 {
5860 }
5861
5863 {
5865 }
5866
5868 {
5870 }
5871
5873 {
5874
5875 return false;
5876 }
5877
5879 {
5880 return false;
5881 }
5882
5886 {
5887 return false;
5888 }
5889
5891 {
5892 return "";
5893 }
5894
5896
5898 {
5899 return false;
5900 }
5901
5903 {
5904 return true;
5905 }
5906
5907
5908
5910 {
5911 return true;
5912 }
5913
5915 {
5916 return true;
5917 }
5918
5920 {
5921 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
5923 }
5924
5926 {
5928 }
5929
5931 {
5933 if (!is_being_placed)
5935 SetSynchDirty();
5936 }
5937
5938
5940
5942 {
5944 }
5945
5947 {
5949 }
5950
5952 {
5953 return 1;
5954 }
5955
5957 {
5958 return false;
5959 }
5960
5962 {
5964 SetSynchDirty();
5965 }
5966
5967
5968
5969
5970
5971
5972
5973
5974
5975
5976
5977
5978
5979
5980
5981
5982
5983
5984
5985
5986
5987
5988
5989
5990
5991
5992
5993
5994
5995
5996
5997
5998
5999
6000
6002 {
6003 super.OnMovedInsideCargo(container);
6004
6005 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6006 }
6007
6008 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
6009 {
6010 super.EEItemLocationChanged(oldLoc,newLoc);
6011
6012 PlayerBase new_player = null;
6013 PlayerBase old_player = null;
6014
6015 if (newLoc.GetParent())
6016 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
6017
6018 if (oldLoc.GetParent())
6019 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
6020
6022 {
6023 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
6024
6025 if (r_index >= 0)
6026 {
6027 InventoryLocation r_il = new InventoryLocation;
6028 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6029
6030 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6033 {
6034 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6035 }
6037 {
6038 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6039 }
6040
6041 }
6042 }
6043
6045 {
6046 if (new_player)
6047 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
6048
6049 if (new_player == old_player)
6050 {
6051
6052 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
6053 {
6055 {
6056 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
6057 {
6058 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6059 }
6060 }
6061 else
6062 {
6063 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
6064 }
6065 }
6066
6067 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
6068 {
6069 int type = oldLoc.GetType();
6071 {
6072 oldLoc.GetParent().GetOnSetLock().Invoke(this);
6073 }
6075 {
6076 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
6077 }
6078 }
6079 if (!m_OldLocation)
6080 {
6081 m_OldLocation = new InventoryLocation;
6082 }
6083 m_OldLocation.Copy(oldLoc);
6084 }
6085 else
6086 {
6087 if (m_OldLocation)
6088 {
6089 m_OldLocation.Reset();
6090 }
6091 }
6092
6094 }
6095 else
6096 {
6097 if (new_player)
6098 {
6099 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
6100 if (res_index >= 0)
6101 {
6102 InventoryLocation il = new InventoryLocation;
6103 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
6105 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
6108 {
6109 il.
GetParent().GetOnReleaseLock().Invoke(it);
6110 }
6112 {
6114 }
6115
6116 }
6117 }
6119 {
6120
6122 }
6123
6124 if (m_OldLocation)
6125 {
6126 m_OldLocation.Reset();
6127 }
6128 }
6129 }
6130
6131 override void EOnContact(IEntity other, Contact extra)
6132 {
6134 {
6135 int liquidType = -1;
6137 if (impactSpeed > 0.0)
6138 {
6140 #ifndef SERVER
6142 #else
6144 SetSynchDirty();
6145 #endif
6147 }
6148 }
6149
6150 #ifdef SERVER
6151 if (GetCompEM() && GetCompEM().IsPlugged())
6152 {
6153 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
6154 GetCompEM().UnplugThis();
6155 }
6156 #endif
6157 }
6158
6160
6162 {
6164 }
6165
6167 {
6168
6169 }
6170
6172 {
6173 super.OnItemLocationChanged(old_owner, new_owner);
6174
6175 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
6176 PlayerBase playerNew = PlayerBase.Cast(new_owner);
6177
6178 if (!relatedPlayer && playerNew)
6179 relatedPlayer = playerNew;
6180
6181 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
6182 {
6184 if (actionMgr)
6185 {
6186 ActionBase currentAction = actionMgr.GetRunningAction();
6187 if (currentAction)
6189 }
6190 }
6191
6192 Man ownerPlayerOld = null;
6193 Man ownerPlayerNew = null;
6194
6195 if (old_owner)
6196 {
6197 if (old_owner.
IsMan())
6198 {
6199 ownerPlayerOld = Man.Cast(old_owner);
6200 }
6201 else
6202 {
6203 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
6204 }
6205 }
6206 else
6207 {
6209 {
6211
6212 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
6213 {
6214 GetCompEM().UnplugThis();
6215 }
6216 }
6217 }
6218
6219 if (new_owner)
6220 {
6221 if (new_owner.
IsMan())
6222 {
6223 ownerPlayerNew = Man.Cast(new_owner);
6224 }
6225 else
6226 {
6227 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
6228 }
6229 }
6230
6231 if (ownerPlayerOld != ownerPlayerNew)
6232 {
6233 if (ownerPlayerOld)
6234 {
6235 array<EntityAI> subItemsExit = new array<EntityAI>;
6237 for (int i = 0; i < subItemsExit.Count(); i++)
6238 {
6241 }
6242 }
6243
6244 if (ownerPlayerNew)
6245 {
6246 array<EntityAI> subItemsEnter = new array<EntityAI>;
6248 for (int j = 0; j < subItemsEnter.Count(); j++)
6249 {
6252 }
6253 }
6254 }
6255 else if (ownerPlayerNew != null)
6256 {
6257 PlayerBase nplayer;
6258 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
6259 {
6260 array<EntityAI> subItemsUpdate = new array<EntityAI>;
6262 for (int k = 0; k < subItemsUpdate.Count(); k++)
6263 {
6265 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
6266 }
6267 }
6268 }
6269
6270 if (old_owner)
6271 old_owner.OnChildItemRemoved(this);
6272 if (new_owner)
6273 new_owner.OnChildItemReceived(this);
6274 }
6275
6276
6278 {
6279 super.EEDelete(parent);
6280 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
6281 if (player)
6282 {
6284
6285 if (player.IsAlive())
6286 {
6287 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
6288 if (r_index >= 0)
6289 {
6290 InventoryLocation r_il = new InventoryLocation;
6291 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
6292
6293 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
6296 {
6297 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
6298 }
6300 {
6301 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
6302 }
6303
6304 }
6305
6306 player.RemoveQuickBarEntityShortcut(this);
6307 }
6308 }
6309 }
6310
6312 {
6313 super.EEKilled(killer);
6314
6317 {
6318 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
6319 {
6320 if (IsMagazine())
6321 {
6322 if (Magazine.Cast(this).GetAmmoCount() > 0)
6323 {
6325 }
6326 }
6327 else
6328 {
6330 }
6331 }
6332 }
6333 }
6334
6336 {
6337 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
6338
6339 super.OnWasAttached(parent, slot_id);
6340
6343
6345 }
6346
6348 {
6349 super.OnWasDetached(parent, slot_id);
6350
6353 }
6354
6356 {
6357 int idx;
6360
6361 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6362 if (inventory_slots.Count() < 1)
6363 {
6364 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
6365 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
6366 }
6367 else
6368 {
6369 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
6370 }
6371
6372 idx = inventory_slots.Find(slot);
6373 if (idx < 0)
6374 return "";
6375
6376 return attach_types.Get(idx);
6377 }
6378
6380 {
6381 int idx = -1;
6382 string slot;
6383
6386
6387 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
6388 if (inventory_slots.Count() < 1)
6389 {
6390 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
6391 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6392 }
6393 else
6394 {
6395 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
6396 if (detach_types.Count() < 1)
6397 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
6398 }
6399
6400 for (int i = 0; i < inventory_slots.Count(); i++)
6401 {
6402 slot = inventory_slots.Get(i);
6403 }
6404
6405 if (slot != "")
6406 {
6407 if (detach_types.Count() == 1)
6408 idx = 0;
6409 else
6410 idx = inventory_slots.Find(slot);
6411 }
6412 if (idx < 0)
6413 return "";
6414
6415 return detach_types.Get(idx);
6416 }
6417
6419 {
6420
6422
6423
6424 float min_time = 1;
6425 float max_time = 3;
6426 float delay = Math.RandomFloat(min_time, max_time);
6427
6428 explode_timer.Run(delay, this, "DoAmmoExplosion");
6429 }
6430
6432 {
6433 Magazine magazine = Magazine.Cast(this);
6434 int pop_sounds_count = 6;
6435 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
6436
6437
6438 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
6439 string sound_name = pop_sounds[ sound_idx ];
6441
6442
6443 magazine.ServerAddAmmoCount(-1);
6444
6445
6446 float min_temp_to_explode = 100;
6447
6448 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
6449 {
6451 }
6452 }
6453
6454
6455 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
6456 {
6457 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
6458
6459 const int CHANCE_DAMAGE_CARGO = 4;
6460 const int CHANCE_DAMAGE_ATTACHMENT = 1;
6461 const int CHANCE_DAMAGE_NOTHING = 2;
6462
6464 {
6465 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
6466 int chances;
6467 int rnd;
6468
6469 if (GetInventory().GetCargo())
6470 {
6471 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6472 rnd = Math.RandomInt(0,chances);
6473
6474 if (rnd < CHANCE_DAMAGE_CARGO)
6475 {
6477 }
6478 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
6479 {
6481 }
6482 }
6483 else
6484 {
6485 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
6486 rnd = Math.RandomInt(0,chances);
6487
6488 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
6489 {
6491 }
6492 }
6493 }
6494 }
6495
6497 {
6498 if (GetInventory().GetCargo())
6499 {
6500 int item_count = GetInventory().GetCargo().GetItemCount();
6501 if (item_count > 0)
6502 {
6503 int random_pick = Math.RandomInt(0, item_count);
6505 if (!item.IsExplosive())
6506 {
6507 item.AddHealth("","",damage);
6508 return true;
6509 }
6510 }
6511 }
6512 return false;
6513 }
6514
6516 {
6517 int attachment_count = GetInventory().AttachmentCount();
6518 if (attachment_count > 0)
6519 {
6520 int random_pick = Math.RandomInt(0, attachment_count);
6521 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
6522 if (!attachment.IsExplosive())
6523 {
6524 attachment.AddHealth("","",damage);
6525 return true;
6526 }
6527 }
6528 return false;
6529 }
6530
6532 {
6534 }
6535
6537 {
6539 return GetInventory().CanRemoveEntity();
6540
6541 return false;
6542 }
6543
6545 {
6547 return;
6548
6550 {
6551 if (ScriptInputUserData.CanStoreInputUserData())
6552 {
6553 ScriptInputUserData ctx = new ScriptInputUserData;
6558 ctx.
Write(destination_entity);
6562 }
6563 }
6564 else if (!
GetGame().IsMultiplayer())
6565 {
6567 }
6568 }
6569
6571 {
6573 return;
6574
6575 float split_quantity_new;
6579 InventoryLocation loc = new InventoryLocation;
6580
6581 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6582 {
6584 split_quantity_new = stack_max;
6585 else
6587
6588 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6589 if (new_item)
6590 {
6591 new_item.SetResultOfSplit(true);
6592 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6594 new_item.SetQuantity(split_quantity_new);
6595 }
6596 }
6597 else if (destination_entity && slot_id == -1)
6598 {
6599 if (quantity > stack_max)
6600 split_quantity_new = stack_max;
6601 else
6602 split_quantity_new = quantity;
6603
6605 {
6608 }
6609
6610 if (new_item)
6611 {
6612 new_item.SetResultOfSplit(true);
6613 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6615 new_item.SetQuantity(split_quantity_new);
6616 }
6617 }
6618 else
6619 {
6620 if (stack_max != 0)
6621 {
6623 {
6625 }
6626
6627 if (split_quantity_new == 0)
6628 {
6629 if (!
GetGame().IsMultiplayer())
6630 player.PhysicalPredictiveDropItem(this);
6631 else
6632 player.ServerDropEntity(this);
6633 return;
6634 }
6635
6637
6638 if (new_item)
6639 {
6640 new_item.SetResultOfSplit(true);
6641 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6643 new_item.SetQuantity(stack_max);
6644 new_item.PlaceOnSurface();
6645 }
6646 }
6647 }
6648 }
6649
6651 {
6653 return;
6654
6655 float split_quantity_new;
6659 InventoryLocation loc = new InventoryLocation;
6660
6661 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
6662 {
6664 split_quantity_new = stack_max;
6665 else
6667
6668 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
6669 if (new_item)
6670 {
6671 new_item.SetResultOfSplit(true);
6672 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6674 new_item.SetQuantity(split_quantity_new);
6675 }
6676 }
6677 else if (destination_entity && slot_id == -1)
6678 {
6679 if (quantity > stack_max)
6680 split_quantity_new = stack_max;
6681 else
6682 split_quantity_new = quantity;
6683
6685 {
6688 }
6689
6690 if (new_item)
6691 {
6692 new_item.SetResultOfSplit(true);
6693 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6695 new_item.SetQuantity(split_quantity_new);
6696 }
6697 }
6698 else
6699 {
6700 if (stack_max != 0)
6701 {
6703 {
6705 }
6706
6708
6709 if (new_item)
6710 {
6711 new_item.SetResultOfSplit(true);
6712 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6714 new_item.SetQuantity(stack_max);
6715 new_item.PlaceOnSurface();
6716 }
6717 }
6718 }
6719 }
6720
6722 {
6724 return;
6725
6727 {
6728 if (ScriptInputUserData.CanStoreInputUserData())
6729 {
6730 ScriptInputUserData ctx = new ScriptInputUserData;
6735 dst.WriteToContext(ctx);
6737 }
6738 }
6739 else if (!
GetGame().IsMultiplayer())
6740 {
6742 }
6743 }
6744
6746 {
6748 return;
6749
6751 {
6752 if (ScriptInputUserData.CanStoreInputUserData())
6753 {
6754 ScriptInputUserData ctx = new ScriptInputUserData;
6759 ctx.
Write(destination_entity);
6765 }
6766 }
6767 else if (!
GetGame().IsMultiplayer())
6768 {
6770 }
6771 }
6772
6774 {
6776 }
6777
6779 {
6781 return this;
6782
6784 float split_quantity_new;
6786 if (dst.IsValid())
6787 {
6788 int slot_id = dst.GetSlot();
6790
6791 if (quantity > stack_max)
6792 split_quantity_new = stack_max;
6793 else
6794 split_quantity_new = quantity;
6795
6797
6798 if (new_item)
6799 {
6800 new_item.SetResultOfSplit(true);
6801 MiscGameplayFunctions.TransferItemProperties(this,new_item);
6804 }
6805
6806 return new_item;
6807 }
6808
6809 return null;
6810 }
6811
6813 {
6815 return;
6816
6818 float split_quantity_new;
6820 if (destination_entity)
6821 {
6823 if (quantity > stackable)
6824 split_quantity_new = stackable;
6825 else
6826 split_quantity_new = quantity;
6827
6828 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
6829 if (new_item)
6830 {
6831 new_item.SetResultOfSplit(true);
6832 MiscGameplayFunctions.TransferItemProperties(this,new_item);
6834 new_item.SetQuantity(split_quantity_new);
6835 }
6836 }
6837 }
6838
6840 {
6842 return;
6843
6845 {
6846 if (ScriptInputUserData.CanStoreInputUserData())
6847 {
6848 ScriptInputUserData ctx = new ScriptInputUserData;
6853 ItemBase destination_entity =
this;
6854 ctx.
Write(destination_entity);
6858 }
6859 }
6860 else if (!
GetGame().IsMultiplayer())
6861 {
6863 }
6864 }
6865
6867 {
6869 return;
6870
6872 float split_quantity_new;
6874 if (player)
6875 {
6877 if (quantity > stackable)
6878 split_quantity_new = stackable;
6879 else
6880 split_quantity_new = quantity;
6881
6882 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
6883 new_item =
ItemBase.Cast(in_hands);
6884 if (new_item)
6885 {
6886 new_item.SetResultOfSplit(true);
6887 MiscGameplayFunctions.TransferItemProperties(this,new_item);
6889 new_item.SetQuantity(split_quantity_new);
6890 }
6891 }
6892 }
6893
6895 {
6897 return;
6898
6900 float split_quantity_new = Math.Floor(quantity * 0.5);
6901
6903
6904 if (new_item)
6905 {
6906 if (new_item.GetQuantityMax() < split_quantity_new)
6907 {
6908 split_quantity_new = new_item.GetQuantityMax();
6909 }
6910
6911 new_item.SetResultOfSplit(true);
6912 MiscGameplayFunctions.TransferItemProperties(this, new_item);
6913
6915 {
6918 }
6919 else
6920 {
6923 }
6924 }
6925 }
6926
6928 {
6930 return;
6931
6933 float split_quantity_new = Math.Floor(quantity / 2);
6934
6935 InventoryLocation invloc = new InventoryLocation;
6937
6939 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
6940
6941 if (new_item)
6942 {
6943 if (new_item.GetQuantityMax() < split_quantity_new)
6944 {
6945 split_quantity_new = new_item.GetQuantityMax();
6946 }
6948 {
6951 }
6952 else
6953 {
6956 }
6957 }
6958 }
6959
6962 {
6963 SetWeightDirty();
6965
6966 if (parent)
6967 parent.OnAttachmentQuantityChangedEx(this, delta);
6968
6970 {
6972 {
6974 }
6976 {
6977 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
6979 }
6980 }
6981
6982 }
6983
6986 {
6987
6988 }
6989
6992 {
6994 }
6995
6997 {
6998 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
6999
7001 {
7002 if (newLevel == GameConstants.STATE_RUINED)
7003 {
7005 EntityAI parent = GetHierarchyParent();
7006 if (parent && parent.IsFireplace())
7007 {
7008 CargoBase cargo = GetInventory().GetCargo();
7009 if (cargo)
7010 {
7012 {
7014 }
7015 }
7016 }
7017 }
7018
7020 {
7021
7023 return;
7024 }
7025
7026 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
7027 {
7029 }
7030 }
7031 }
7032
7033
7035 {
7036 super.OnRightClick();
7037
7039 {
7041 {
7042 if (ScriptInputUserData.CanStoreInputUserData())
7043 {
7044 vector m4[4];
7046
7047 EntityAI root = GetHierarchyRoot();
7048
7049 InventoryLocation dst = new InventoryLocation;
7051 {
7052 if (root)
7053 {
7054 root.GetTransform(m4);
7056 }
7057 else
7058 GetInventory().GetCurrentInventoryLocation(dst);
7059 }
7060 else
7061 {
7063
7064
7065 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
7066 {
7067 if (root)
7068 {
7069 root.GetTransform(m4);
7071 }
7072 else
7073 GetInventory().GetCurrentInventoryLocation(dst);
7074 }
7075 else
7076 {
7077 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
7078 }
7079 }
7080
7081 ScriptInputUserData ctx = new ScriptInputUserData;
7089 }
7090 }
7091 else if (!
GetGame().IsMultiplayer())
7092 {
7094 }
7095 }
7096 }
7097
7098 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
7099 {
7100
7101 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
7102 return false;
7103
7104 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
7105 return false;
7106
7107
7109 return false;
7110
7111
7112 Magazine mag = Magazine.Cast(this);
7113 if (mag)
7114 {
7115 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
7116 return false;
7117
7118 if (stack_max_limit)
7119 {
7120 Magazine other_mag = Magazine.Cast(other_item);
7121 if (other_item)
7122 {
7123 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
7124 return false;
7125 }
7126
7127 }
7128 }
7129 else
7130 {
7131
7133 return false;
7134
7136 return false;
7137 }
7138
7139 PlayerBase player = null;
7140 if (CastTo(player, GetHierarchyRootPlayer()))
7141 {
7142 if (player.GetInventory().HasAttachment(this))
7143 return false;
7144
7145 if (player.IsItemsToDelete())
7146 return false;
7147 }
7148
7149 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
7150 return false;
7151
7152 int slotID;
7154 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
7155 return false;
7156
7157 return true;
7158 }
7159
7161 {
7163 }
7164
7166 {
7167 return m_IsResultOfSplit;
7168 }
7169
7171 {
7172 m_IsResultOfSplit = value;
7173 }
7174
7176 {
7178 }
7179
7181 {
7182 float other_item_quantity = other_item.GetQuantity();
7183 float this_free_space;
7184
7186
7188
7189 if (other_item_quantity > this_free_space)
7190 {
7191 return this_free_space;
7192 }
7193 else
7194 {
7195 return other_item_quantity;
7196 }
7197 }
7198
7200 {
7202 }
7203
7205 {
7207 return;
7208
7209 if (!IsMagazine() && other_item)
7210 {
7212 if (quantity_used != 0)
7213 {
7214 float hp1 = GetHealth01("","");
7215 float hp2 = other_item.GetHealth01("","");
7216 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
7217 hpResult = hpResult / (
GetQuantity() + quantity_used);
7218
7219 hpResult *= GetMaxHealth();
7220 Math.Round(hpResult);
7221 SetHealth("", "Health", hpResult);
7222
7224 other_item.AddQuantity(-quantity_used);
7225 }
7226 }
7228 }
7229
7231 {
7232 #ifdef SERVER
7233 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
7234 GetHierarchyParent().IncreaseLifetimeUp();
7235 #endif
7236 };
7237
7239 {
7240 PlayerBase p = PlayerBase.Cast(player);
7241
7242 array<int> recipesIds = p.m_Recipes;
7243 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7244 if (moduleRecipesManager)
7245 {
7246 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
7247 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
7248 }
7249
7250 for (int i = 0;i < recipesIds.Count(); i++)
7251 {
7252 int key = recipesIds.Get(i);
7253 string recipeName = moduleRecipesManager.GetRecipeName(key);
7255 }
7256 }
7257
7258
7259 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
7260 {
7261 super.GetDebugActions(outputList);
7262
7263
7268
7269
7273
7277
7278
7281
7282
7284 {
7287 }
7288
7290
7293
7297 }
7298
7299
7300
7301
7303 {
7304 super.OnAction(action_id, player, ctx);
7305 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
7306 {
7307 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
7308 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
7309 PlayerBase p = PlayerBase.Cast(player);
7310 if (
EActions.RECIPES_RANGE_START < 1000)
7311 {
7312 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
7313 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
7314 }
7315 }
7316 #ifndef SERVER
7317 else if (action_id ==
EActions.WATCH_PLAYER)
7318 {
7319 PluginDeveloper.SetDeveloperItemClientEx(player);
7320 }
7321 #endif
7323 {
7324 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
7325 {
7326 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
7327 OnDebugButtonPressServer(id + 1);
7328 }
7329
7330 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
7331 {
7332 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
7334 }
7335
7336 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
7337 {
7338 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
7340 }
7341
7342 else if (action_id ==
EActions.ADD_QUANTITY)
7343 {
7344 if (IsMagazine())
7345 {
7346 Magazine mag = Magazine.Cast(this);
7347 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
7348 }
7349 else
7350 {
7352 }
7353
7354 if (m_EM)
7355 {
7356 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
7357 }
7358
7359 }
7360
7361 else if (action_id ==
EActions.REMOVE_QUANTITY)
7362 {
7363 if (IsMagazine())
7364 {
7365 Magazine mag2 = Magazine.Cast(this);
7366 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
7367 }
7368 else
7369 {
7371 }
7372 if (m_EM)
7373 {
7374 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
7375 }
7376
7377 }
7378
7379 else if (action_id ==
EActions.SET_QUANTITY_0)
7380 {
7382
7383 if (m_EM)
7384 {
7385 m_EM.SetEnergy(0);
7386 }
7387 }
7388
7389 else if (action_id ==
EActions.SET_MAX_QUANTITY)
7390 {
7392
7393 if (m_EM)
7394 {
7395 m_EM.SetEnergy(m_EM.GetEnergyMax());
7396 }
7397 }
7398
7399 else if (action_id ==
EActions.ADD_HEALTH)
7400 {
7401 AddHealth("","",GetMaxHealth("","Health")/5);
7402 }
7403 else if (action_id ==
EActions.REMOVE_HEALTH)
7404 {
7405 AddHealth("","",-GetMaxHealth("","Health")/5);
7406 }
7407 else if (action_id ==
EActions.DESTROY_HEALTH)
7408 {
7409 SetHealth01("","",0);
7410 }
7411 else if (action_id ==
EActions.WATCH_ITEM)
7412 {
7414 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
7415 #ifdef DEVELOPER
7416 SetDebugDeveloper_item(this);
7417 #endif
7418 }
7419
7420 else if (action_id ==
EActions.ADD_TEMPERATURE)
7421 {
7422 AddTemperature(20);
7423
7424 }
7425
7426 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
7427 {
7428 AddTemperature(-20);
7429
7430 }
7431
7432 else if (action_id ==
EActions.FLIP_FROZEN)
7433 {
7434 SetFrozen(!GetIsFrozen());
7435
7436 }
7437
7438 else if (action_id ==
EActions.ADD_WETNESS)
7439 {
7441
7442 }
7443
7444 else if (action_id ==
EActions.REMOVE_WETNESS)
7445 {
7447
7448 }
7449
7450 else if (action_id ==
EActions.LIQUIDTYPE_UP)
7451 {
7454
7455
7456 }
7457
7458 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
7459 {
7462 }
7463
7464 else if (action_id ==
EActions.MAKE_SPECIAL)
7465 {
7466 auto debugParams = DebugSpawnParams.WithPlayer(player);
7467 OnDebugSpawnEx(debugParams);
7468 }
7469
7470 else if (action_id ==
EActions.DELETE)
7471 {
7472 Delete();
7473 }
7474
7475 }
7476
7477
7478 return false;
7479 }
7480
7481
7482
7483
7487
7490
7491
7492
7494 {
7495 return false;
7496 }
7497
7498
7500 {
7501 return true;
7502 }
7503
7504
7506 {
7507 return true;
7508 }
7509
7510
7511
7513 {
7514 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
7516 }
7517
7520 {
7521 return null;
7522 }
7523
7525 {
7526 return false;
7527 }
7528
7530 {
7531 return false;
7532 }
7533
7537
7538
7540 {
7541 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7542 return module_repairing.CanRepair(this, item_repair_kit);
7543 }
7544
7545
7546 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
7547 {
7548 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
7549 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
7550 }
7551
7552
7554 {
7555
7556
7557
7558
7559
7560
7561
7562
7563 return 1;
7564 }
7565
7566
7567
7569 {
7571 }
7572
7573
7574
7576 {
7578 }
7579
7580
7589 {
7590 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7591
7592 if (player)
7593 {
7594 player.MessageStatus(text);
7595 }
7596 }
7597
7598
7607 {
7608 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7609
7610 if (player)
7611 {
7612 player.MessageAction(text);
7613 }
7614 }
7615
7616
7625 {
7626 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7627
7628 if (player)
7629 {
7630 player.MessageFriendly(text);
7631 }
7632 }
7633
7634
7643 {
7644 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
7645
7646 if (player)
7647 {
7648 player.MessageImportant(text);
7649 }
7650 }
7651
7653 {
7654 return true;
7655 }
7656
7657
7658 override bool KindOf(
string tag)
7659 {
7660 bool found = false;
7661 string item_name = this.
GetType();
7664
7665 int array_size = item_tag_array.Count();
7666 for (int i = 0; i < array_size; i++)
7667 {
7668 if (item_tag_array.Get(i) == tag)
7669 {
7670 found = true;
7671 break;
7672 }
7673 }
7674 return found;
7675 }
7676
7677
7679 {
7680
7681 super.OnRPC(sender, rpc_type,ctx);
7682
7683
7684 switch (rpc_type)
7685 {
7686 #ifndef SERVER
7687 case ERPCs.RPC_SOUND_LOCK_ATTACH:
7688 Param2<bool, string> p = new Param2<bool, string>(false, "");
7689
7691 return;
7692
7693 bool play = p.param1;
7694 string soundSet = p.param2;
7695
7696 if (play)
7697 {
7699 {
7701 {
7703 }
7704 }
7705 else
7706 {
7708 }
7709 }
7710 else
7711 {
7713 }
7714
7715 break;
7716 #endif
7717
7718 }
7719
7721 {
7723 }
7724 }
7725
7726
7727
7728
7730 {
7731 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
7732 return plugin.GetID(
name);
7733 }
7734
7736 {
7737 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
7738 return plugin.GetName(id);
7739 }
7740
7743 {
7744
7745
7746 int varFlags;
7747 if (!ctx.
Read(varFlags))
7748 return;
7749
7750 if (varFlags & ItemVariableFlags.FLOAT)
7751 {
7753 }
7754 }
7755
7757 {
7758
7759 super.SerializeNumericalVars(floats_out);
7760
7761
7762
7764 {
7766 }
7767
7769 {
7771 }
7772
7774 {
7776 }
7777
7779 {
7784 }
7785
7787 {
7789 }
7790 }
7791
7793 {
7794
7795 super.DeSerializeNumericalVars(floats);
7796
7797
7798 int index = 0;
7799 int mask = Math.Round(floats.Get(index));
7800
7801 index++;
7802
7804 {
7806 {
7808 }
7809 else
7810 {
7811 float quantity = floats.Get(index);
7813 }
7814 index++;
7815 }
7816
7818 {
7819 float wet = floats.Get(index);
7821 index++;
7822 }
7823
7825 {
7826 int liquidtype = Math.Round(floats.Get(index));
7828 index++;
7829 }
7830
7832 {
7834 index++;
7836 index++;
7838 index++;
7840 index++;
7841 }
7842
7844 {
7845 int cleanness = Math.Round(floats.Get(index));
7847 index++;
7848 }
7849 }
7850
7852 {
7853 super.WriteVarsToCTX(ctx);
7854
7855
7857 {
7859 }
7860
7862 {
7864 }
7865
7867 {
7869 }
7870
7872 {
7873 int r,g,b,a;
7879 }
7880
7882 {
7884 }
7885 }
7886
7888 {
7889 if (!super.ReadVarsFromCTX(ctx,version))
7890 return false;
7891
7892 int intValue;
7893 float value;
7894
7895 if (version < 140)
7896 {
7897 if (!ctx.
Read(intValue))
7898 return false;
7899
7900 m_VariablesMask = intValue;
7901 }
7902
7904 {
7905 if (!ctx.
Read(value))
7906 return false;
7907
7909 {
7911 }
7912 else
7913 {
7915 }
7916 }
7917
7918 if (version < 140)
7919 {
7921 {
7922 if (!ctx.
Read(value))
7923 return false;
7924 SetTemperatureDirect(value);
7925 }
7926 }
7927
7929 {
7930 if (!ctx.
Read(value))
7931 return false;
7933 }
7934
7936 {
7937 if (!ctx.
Read(intValue))
7938 return false;
7940 }
7941
7943 {
7944 int r,g,b,a;
7946 return false;
7948 return false;
7950 return false;
7952 return false;
7953
7955 }
7956
7958 {
7959 if (!ctx.
Read(intValue))
7960 return false;
7962 }
7963
7964 if (version >= 138 && version < 140)
7965 {
7967 {
7968 if (!ctx.
Read(intValue))
7969 return false;
7970 SetFrozen(intValue);
7971 }
7972 }
7973
7974 return true;
7975 }
7976
7977
7979 {
7982 {
7984 }
7985
7986 if (!super.OnStoreLoad(ctx, version))
7987 {
7989 return false;
7990 }
7991
7992 if (version >= 114)
7993 {
7994 bool hasQuickBarIndexSaved;
7995
7996 if (!ctx.
Read(hasQuickBarIndexSaved))
7997 {
7999 return false;
8000 }
8001
8002 if (hasQuickBarIndexSaved)
8003 {
8004 int itmQBIndex;
8005
8006
8007 if (!ctx.
Read(itmQBIndex))
8008 {
8010 return false;
8011 }
8012
8013 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
8014 if (itmQBIndex != -1 && parentPlayer)
8015 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
8016 }
8017 }
8018 else
8019 {
8020
8021 PlayerBase player;
8022 int itemQBIndex;
8023 if (version ==
int.
MAX)
8024 {
8025 if (!ctx.
Read(itemQBIndex))
8026 {
8028 return false;
8029 }
8030 }
8031 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
8032 {
8033
8034 if (!ctx.
Read(itemQBIndex))
8035 {
8037 return false;
8038 }
8039 if (itemQBIndex != -1 && player)
8040 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
8041 }
8042 }
8043
8044 if (version < 140)
8045 {
8046
8047 if (!LoadVariables(ctx, version))
8048 {
8050 return false;
8051 }
8052 }
8053
8054
8056 {
8058 return false;
8059 }
8060 if (version >= 132)
8061 {
8063 if (raib)
8064 {
8066 {
8068 return false;
8069 }
8070 }
8071 }
8072
8074 return true;
8075 }
8076
8077
8078
8080 {
8081 super.OnStoreSave(ctx);
8082
8083 PlayerBase player;
8084 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
8085 {
8087
8088 int itemQBIndex = -1;
8089 itemQBIndex = player.FindQuickBarEntityIndex(this);
8090 ctx.
Write(itemQBIndex);
8091 }
8092 else
8093 {
8095 }
8096
8098
8100 if (raib)
8101 {
8103 }
8104 }
8105
8106
8108 {
8109 super.AfterStoreLoad();
8110
8112 {
8114 }
8115
8117 {
8120 }
8121 }
8122
8124 {
8125 super.EEOnAfterLoad();
8126
8128 {
8130 }
8131
8134 }
8135
8137 {
8138 return false;
8139 }
8140
8141
8142
8144 {
8146 {
8147 #ifdef PLATFORM_CONSOLE
8148
8150 {
8152 if (menu)
8153 {
8155 }
8156 }
8157 #endif
8158 }
8159
8161 {
8164 }
8165
8167 {
8168 SetWeightDirty();
8170 }
8172 {
8175 }
8176
8178 {
8181 }
8183 {
8186 }
8187
8188 super.OnVariablesSynchronized();
8189 }
8190
8191
8192
8194 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
8195 {
8196 if (!IsServerCheck(allow_client))
8197 return false;
8198
8200 return false;
8201
8204
8205 if (value <= (min + 0.001))
8206 value = min;
8207
8208 if (value == min)
8209 {
8210 if (destroy_config)
8211 {
8212 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
8213 if (dstr)
8214 {
8216 this.Delete();
8217 return true;
8218 }
8219 }
8220 else if (destroy_forced)
8221 {
8223 this.Delete();
8224 return true;
8225 }
8226
8228 }
8229
8232
8234 {
8236
8237 if (delta)
8239 }
8240
8242
8243 return false;
8244 }
8245
8246
8248 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
8249 {
8251 }
8252
8254 {
8257 }
8258
8260 {
8263 }
8264
8267 {
8268 float value_clamped = Math.Clamp(value, 0, 1);
8270 SetQuantity(result, destroy_config, destroy_forced);
8271 }
8272
8273
8276 {
8278 }
8279
8281 {
8283 }
8284
8285
8286
8287
8288
8289
8290
8291
8292
8293
8295 {
8296 int slot = -1;
8297 if (GetInventory())
8298 {
8299 InventoryLocation il = new InventoryLocation;
8300 GetInventory().GetCurrentInventoryLocation(il);
8302 }
8303
8305 }
8306
8308 {
8309 float quantity_max = 0;
8310
8312 {
8313 if (attSlotID != -1)
8314 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
8315
8316 if (quantity_max <= 0)
8318 }
8319
8320 if (quantity_max <= 0)
8322
8323 return quantity_max;
8324 }
8325
8327 {
8329 }
8330
8332 {
8334 }
8335
8336
8338 {
8340 }
8341
8343 {
8345 }
8346
8348 {
8350 }
8351
8352
8354 {
8355
8356 float weightEx = GetWeightEx();
8357 float special = GetInventoryAndCargoWeight();
8358 return weightEx - special;
8359 }
8360
8361
8363 {
8365 }
8366
8368 {
8370 {
8371 #ifdef DEVELOPER
8372 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8373 {
8374 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
8376 }
8377 #endif
8378
8380 }
8381 else if (HasEnergyManager())
8382 {
8383 #ifdef DEVELOPER
8384 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8385 {
8386 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
8387 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
8388 }
8389 #endif
8390 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
8391 }
8392 else
8393 {
8394 #ifdef DEVELOPER
8395 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
8396 {
8397 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
8398 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
8399 }
8400 #endif
8401 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
8402 }
8403 }
8404
8407 {
8408 int item_count = 0;
8410
8411 if (GetInventory().GetCargo() != NULL)
8412 {
8413 item_count = GetInventory().GetCargo().GetItemCount();
8414 }
8415
8416 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
8417 {
8418 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
8419 if (item)
8420 item_count += item.GetNumberOfItems();
8421 }
8422 return item_count;
8423 }
8424
8427 {
8428 float weight = 0;
8429 float wetness = 1;
8430 if (include_wetness)
8433 {
8434 weight = wetness * m_ConfigWeight;
8435 }
8437 {
8438 weight = 1;
8439 }
8440 return weight;
8441 }
8442
8443
8444
8446 {
8447 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
8448 {
8449 GameInventory inv = GetInventory();
8450 array<EntityAI> items = new array<EntityAI>;
8452 for (int i = 0; i < items.Count(); i++)
8453 {
8455 if (item)
8456 {
8458 }
8459 }
8460 }
8461 }
8462
8463
8464
8465
8467 {
8468 float energy = 0;
8469 if (HasEnergyManager())
8470 {
8471 energy = GetCompEM().GetEnergy();
8472 }
8473 return energy;
8474 }
8475
8476
8478 {
8479 super.OnEnergyConsumed();
8480
8482 }
8483
8485 {
8486 super.OnEnergyAdded();
8487
8489 }
8490
8491
8493 {
8494 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
8495 {
8497 {
8498 float energy_0to1 = GetCompEM().GetEnergy0To1();
8500 }
8501 }
8502 }
8503
8504
8506 {
8507 return ConfigGetFloat("heatIsolation");
8508 }
8509
8511 {
8513 }
8514
8516 {
8517 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
8518 if (
GetGame().ConfigIsExisting(paramPath))
8520
8521 return 0.0;
8522 }
8523
8525 {
8526 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
8527 if (
GetGame().ConfigIsExisting(paramPath))
8529
8530 return 0.0;
8531 }
8532
8533 override void SetWet(
float value,
bool allow_client =
false)
8534 {
8535 if (!IsServerCheck(allow_client))
8536 return;
8537
8540
8542
8543 m_VarWet = Math.Clamp(value, min, max);
8544
8546 {
8549 }
8550 }
8551
8552 override void AddWet(
float value)
8553 {
8555 }
8556
8558 {
8560 }
8561
8563 {
8565 }
8566
8568 {
8570 }
8571
8573 {
8575 }
8576
8578 {
8580 }
8581
8583 {
8586 if (newLevel != oldLevel)
8587 {
8589 }
8590 }
8591
8593 {
8594 SetWeightDirty();
8595 }
8596
8598 {
8599 return GetWetLevelInternal(
m_VarWet);
8600 }
8601
8602
8603
8605 {
8607 }
8608
8610 {
8612 }
8613
8615 {
8617 }
8618
8620 {
8622 }
8623
8624
8625
8627 {
8628 if (ConfigIsExisting("itemModelLength"))
8629 {
8630 return ConfigGetFloat("itemModelLength");
8631 }
8632 return 0;
8633 }
8634
8636 {
8637 if (ConfigIsExisting("itemAttachOffset"))
8638 {
8639 return ConfigGetFloat("itemAttachOffset");
8640 }
8641 return 0;
8642 }
8643
8644 override void SetCleanness(
int value,
bool allow_client =
false)
8645 {
8646 if (!IsServerCheck(allow_client))
8647 return;
8648
8650
8652
8655 }
8656
8658 {
8660 }
8661
8663 {
8664 return true;
8665 }
8666
8667
8668
8669
8671 {
8673 }
8674
8676 {
8678 }
8679
8680
8681
8682
8683 override void SetColor(
int r,
int g,
int b,
int a)
8684 {
8690 }
8692 override void GetColor(out
int r,out
int g,out
int b,out
int a)
8693 {
8698 }
8699
8701 {
8703 }
8704
8707 {
8708 int r,g,b,a;
8710 r = r/255;
8711 g = g/255;
8712 b = b/255;
8713 a = a/255;
8714 return MiscGameplayFunctions.GetColorString(r, g, b, a);
8715 }
8716
8717
8718
8719 override void SetLiquidType(
int value,
bool allow_client =
false)
8720 {
8721 if (!IsServerCheck(allow_client))
8722 return;
8723
8728 }
8729
8731 {
8732 return ConfigGetInt("varLiquidTypeInit");
8733 }
8734
8736 {
8738 }
8739
8741 {
8743 SetFrozen(false);
8744 }
8745
8748 {
8749 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
8750 }
8751
8752
8755 {
8756 PlayerBase nplayer;
8757 if (PlayerBase.CastTo(nplayer, player))
8758 {
8760
8761 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
8762 }
8763 }
8764
8765
8768 {
8769 PlayerBase nplayer;
8770 if (PlayerBase.CastTo(nplayer,player))
8771 {
8772
8773 nplayer.SetEnableQuickBarEntityShortcut(this,false);
8774
8775 }
8776
8777
8778 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
8779
8780
8781 if (HasEnergyManager())
8782 {
8783 GetCompEM().UpdatePlugState();
8784 }
8785 }
8786
8787
8789 {
8790 super.OnPlacementStarted(player);
8791
8793 }
8794
8795 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
8796 {
8798 {
8799 m_AdminLog.OnPlacementComplete(player,
this);
8800 }
8801
8802 super.OnPlacementComplete(player, position, orientation);
8803 }
8804
8805
8806
8807
8808
8810 {
8812 {
8813 return true;
8814 }
8815 else
8816 {
8817 return false;
8818 }
8819 }
8820
8821
8823 {
8825 {
8827 }
8828 }
8829
8830
8832 {
8834 }
8835
8837 {
8839 }
8840
8841 override void InsertAgent(
int agent,
float count = 1)
8842 {
8843 if (count < 1)
8844 return;
8845
8847 }
8848
8851 {
8853 }
8854
8855
8857 {
8859 }
8860
8861
8862
8863
8864
8865
8866
8867
8868
8869
8870
8871
8872
8873
8874
8875
8876
8877
8878
8879
8880
8881
8882
8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896
8897
8898
8899
8900
8901
8903 {
8905 return false;
8906 return true;
8907 }
8908
8910 {
8911
8913 }
8914
8915
8918 {
8919 super.CheckForRoofLimited(timeTresholdMS);
8920
8922 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
8923 {
8924 m_PreviousRoofTestTime = time;
8925 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
8926 }
8927 }
8928
8929
8931 {
8933 {
8934 return 0;
8935 }
8936
8937 if (GetInventory().GetAttachmentSlotsCount() != 0)
8938 {
8939 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
8940 if (filter)
8941 return filter.GetProtectionLevel(type, false, system);
8942 else
8943 return 0;
8944 }
8945
8946 string subclassPath, entryName;
8947
8948 switch (type)
8949 {
8951 entryName = "biological";
8952 break;
8954 entryName = "chemical";
8955 break;
8956 default:
8957 entryName = "biological";
8958 break;
8959 }
8960
8961 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
8962
8964 }
8965
8966
8967
8970 {
8971 if (!IsMagazine())
8973
8975 }
8976
8977
8978
8979
8980
8985 {
8986 return true;
8987 }
8988
8990 {
8992 }
8993
8994
8995
8996
8997
8999 {
9000 if (parent)
9001 {
9002 if (parent.IsInherited(DayZInfected))
9003 return true;
9004
9005 if (!parent.IsRuined())
9006 return true;
9007 }
9008
9009 return true;
9010 }
9011
9013 {
9014 if (!super.CanPutAsAttachment(parent))
9015 {
9016 return false;
9017 }
9018
9019 if (!IsRuined() && !parent.IsRuined())
9020 {
9021 return true;
9022 }
9023
9024 return false;
9025 }
9026
9028 {
9029
9030
9031
9032
9033 return super.CanReceiveItemIntoCargo(item);
9034 }
9035
9037 {
9038
9039
9040
9041
9042 GameInventory attachmentInv = attachment.GetInventory();
9044 {
9045 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
9046 return false;
9047 }
9048
9049 InventoryLocation loc = new InventoryLocation();
9050 attachment.GetInventory().GetCurrentInventoryLocation(loc);
9051 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
9052 return false;
9053
9054 return super.CanReceiveAttachment(attachment, slotId);
9055 }
9056
9058 {
9059 if (!super.CanReleaseAttachment(attachment))
9060 return false;
9061
9062 return GetInventory().AreChildrenAccessible();
9063 }
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9086 {
9087 int id = muzzle_owner.GetMuzzleID();
9088 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
9089
9090 if (WPOF_array)
9091 {
9092 for (int i = 0; i < WPOF_array.Count(); i++)
9093 {
9094 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
9095
9096 if (WPOF)
9097 {
9098 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
9099 }
9100 }
9101 }
9102 }
9103
9104
9106 {
9107 int id = muzzle_owner.GetMuzzleID();
9109
9110 if (WPOBE_array)
9111 {
9112 for (int i = 0; i < WPOBE_array.Count(); i++)
9113 {
9114 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
9115
9116 if (WPOBE)
9117 {
9118 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9119 }
9120 }
9121 }
9122 }
9123
9124
9126 {
9127 int id = muzzle_owner.GetMuzzleID();
9128 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9129
9130 if (WPOOH_array)
9131 {
9132 for (int i = 0; i < WPOOH_array.Count(); i++)
9133 {
9134 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9135
9136 if (WPOOH)
9137 {
9138 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
9139 }
9140 }
9141 }
9142 }
9143
9144
9146 {
9147 int id = muzzle_owner.GetMuzzleID();
9148 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9149
9150 if (WPOOH_array)
9151 {
9152 for (int i = 0; i < WPOOH_array.Count(); i++)
9153 {
9154 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9155
9156 if (WPOOH)
9157 {
9158 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9159 }
9160 }
9161 }
9162 }
9163
9164
9166 {
9167 int id = muzzle_owner.GetMuzzleID();
9168 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
9169
9170 if (WPOOH_array)
9171 {
9172 for (int i = 0; i < WPOOH_array.Count(); i++)
9173 {
9174 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
9175
9176 if (WPOOH)
9177 {
9178 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9179 }
9180 }
9181 }
9182 }
9183
9184
9185
9187 {
9189 {
9190 return true;
9191 }
9192
9193 return false;
9194 }
9195
9197 {
9199 {
9200 return true;
9201 }
9202
9203 return false;
9204 }
9205
9207 {
9209 {
9210 return true;
9211 }
9212
9213 return false;
9214 }
9215
9217 {
9218 return false;
9219 }
9220
9223 {
9224 return UATimeSpent.DEFAULT_DEPLOY;
9225 }
9226
9227
9228
9229
9231 {
9233 SetSynchDirty();
9234 }
9235
9237 {
9239 }
9240
9241
9243 {
9244 return false;
9245 }
9246
9249 {
9250 string att_type = "None";
9251
9252 if (ConfigIsExisting("soundAttType"))
9253 {
9254 att_type = ConfigGetString("soundAttType");
9255 }
9256
9258 }
9259
9261 {
9263 }
9264
9265
9266
9267
9268
9272
9274 {
9277
9279 }
9280
9281
9283 {
9285 return;
9286
9288
9291
9294
9295 SoundParameters params = new SoundParameters();
9299 }
9300
9301
9303 {
9305 return;
9306
9308 SetSynchDirty();
9309
9312 }
9313
9314
9316 {
9318 return;
9319
9321 SetSynchDirty();
9322
9325 }
9326
9328 {
9330 }
9331
9333 {
9335 }
9336
9339 {
9340 if (!
GetGame().IsDedicatedServer())
9341 {
9342 if (ConfigIsExisting("attachSoundSet"))
9343 {
9344 string cfg_path = "";
9345 string soundset = "";
9347
9350 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
9351 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
9352
9353 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
9354 {
9355 for (int i = 0; i < cfg_soundset_array.Count(); i++)
9356 {
9357 if (cfg_slot_array[i] == slot_type)
9358 {
9359 soundset = cfg_soundset_array[i];
9360 break;
9361 }
9362 }
9363 }
9364
9365 if (soundset != "")
9366 {
9367 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
9369 }
9370 }
9371 }
9372 }
9373
9375 {
9376
9377 }
9378
9379 void OnApply(PlayerBase player);
9380
9382 {
9383 return 1.0;
9384 };
9385
9387 {
9389 }
9390
9392 {
9394 }
9395
9397
9399 {
9400 SetDynamicPhysicsLifeTime(0.01);
9402 }
9403
9405 {
9406 array<string> zone_names = new array<string>;
9407 GetDamageZones(zone_names);
9408 for (int i = 0; i < zone_names.Count(); i++)
9409 {
9410 SetHealthMax(zone_names.Get(i),"Health");
9411 }
9412 SetHealthMax("","Health");
9413 }
9414
9417 {
9418 float global_health = GetHealth01("","Health");
9419 array<string> zones = new array<string>;
9420 GetDamageZones(zones);
9421
9422 for (int i = 0; i < zones.Count(); i++)
9423 {
9424 SetHealth01(zones.Get(i),"Health",global_health);
9425 }
9426 }
9427
9430 {
9431 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
9432 }
9433
9435 {
9436 if (!hasRootAsPlayer)
9437 {
9438 if (refParentIB)
9439 {
9440
9441 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
9442 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
9443
9444 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
9445 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
9446
9449 }
9450 else
9451 {
9452
9455 }
9456 }
9457 }
9458
9460 {
9462 {
9463 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
9464 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
9465 {
9466 float heatPermCoef = 1.0;
9468 while (ent)
9469 {
9470 heatPermCoef *= ent.GetHeatPermeabilityCoef();
9471 ent = ent.GetHierarchyParent();
9472 }
9473
9474 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
9475 }
9476 }
9477 }
9478
9480 {
9481
9482 EntityAI parent = GetHierarchyParent();
9483 if (!parent)
9484 {
9485 hasParent = false;
9486 hasRootAsPlayer = false;
9487 }
9488 else
9489 {
9490 hasParent = true;
9491 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
9492 refParentIB =
ItemBase.Cast(parent);
9493 }
9494 }
9495
9496 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
9497 {
9498
9499 }
9500
9502 {
9503
9504 return false;
9505 }
9506
9508 {
9509
9510
9511 return false;
9512 }
9513
9515 {
9516
9517 return false;
9518 }
9519
9522 {
9523 return !GetIsFrozen() &&
IsOpen();
9524 }
9525
9527 {
9528 bool hasParent = false, hasRootAsPlayer = false;
9530
9531 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
9532 bool foodDecay =
g_Game.IsFoodDecayEnabled();
9533
9534 if (wwtu || foodDecay)
9535 {
9539
9540 if (processWetness || processTemperature || processDecay)
9541 {
9543
9544 if (processWetness)
9545 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
9546
9547 if (processTemperature)
9549
9550 if (processDecay)
9551 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
9552 }
9553 }
9554 }
9555
9558 {
9560 }
9561
9563 {
9566
9567 return super.GetTemperatureFreezeThreshold();
9568 }
9569
9571 {
9574
9575 return super.GetTemperatureThawThreshold();
9576 }
9577
9579 {
9582
9583 return super.GetItemOverheatThreshold();
9584 }
9585
9587 {
9589 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
9590
9591 return super.GetTemperatureFreezeTime();
9592 }
9593
9595 {
9597 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
9598
9599 return super.GetTemperatureThawTime();
9600 }
9601
9606
9608 {
9609 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
9610 }
9611
9613 {
9614 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
9615 }
9616
9619 {
9621 }
9622
9624 {
9626 }
9627
9629 {
9631 }
9632
9635 {
9636 return null;
9637 }
9638
9641 {
9642 return false;
9643 }
9644
9646 {
9648 {
9651 if (!trg)
9652 {
9654 explosive = this;
9655 }
9656
9657 explosive.PairRemote(trg);
9659
9660 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
9661 trg.SetPersistentPairID(persistentID);
9662 explosive.SetPersistentPairID(persistentID);
9663
9664 return true;
9665 }
9666 return false;
9667 }
9668
9671 {
9672 float ret = 1.0;
9675 ret *= GetHealth01();
9676
9677 return ret;
9678 }
9679
9680 #ifdef DEVELOPER
9681 override void SetDebugItem()
9682 {
9683 super.SetDebugItem();
9684 _itemBase = this;
9685 }
9686
9688 {
9689 string text = super.GetDebugText();
9690
9692 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
9693
9694 return text;
9695 }
9696 #endif
9697
9699 {
9700 return true;
9701 }
9702
9704
9706
9708 {
9711 }
9712
9713
9721
9737}
9738
9740{
9742 if (entity)
9743 {
9744 bool is_item = entity.IsInherited(
ItemBase);
9745 if (is_item && full_quantity)
9746 {
9749 }
9750 }
9751 else
9752 {
9754 return NULL;
9755 }
9756 return entity;
9757}
9758
9760{
9761 if (item)
9762 {
9763 if (health > 0)
9764 item.SetHealth("", "", health);
9765
9766 if (item.CanHaveTemperature())
9767 {
9769 if (item.CanFreeze())
9770 item.SetFrozen(false);
9771 }
9772
9773 if (item.HasEnergyManager())
9774 {
9775 if (quantity >= 0)
9776 {
9777 item.GetCompEM().SetEnergy0To1(quantity);
9778 }
9779 else
9780 {
9782 }
9783 }
9784 else if (item.IsMagazine())
9785 {
9786 Magazine mag = Magazine.Cast(item);
9787 if (quantity >= 0)
9788 {
9789 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
9790 }
9791 else
9792 {
9794 }
9795
9796 }
9797 else
9798 {
9799 if (quantity >= 0)
9800 {
9801 item.SetQuantityNormalized(quantity, false);
9802 }
9803 else
9804 {
9806 }
9807
9808 }
9809 }
9810}
9811
9812#ifdef DEVELOPER
9814#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.