8169{
8171 {
8172 return true;
8173 }
8174};
8175
8176
8177
8179{
8183
8185
8188
8189
8190
8191
8192
8201
8207
8212
8217
8238 protected bool m_IsResultOfSplit
8239
8241
8246
8247
8248
8250
8254
8255
8256
8258
8261
8262
8263
8269
8270
8278
8281
8282
8284
8285
8287
8288
8293
8294
8299
8300
8302
8303
8305 {
8310
8311 if (!
GetGame().IsDedicatedServer())
8312 {
8314 {
8316
8318 {
8320 }
8321 }
8322
8325 }
8326
8327 m_OldLocation = null;
8328
8330 {
8332 }
8333
8334 if (ConfigIsExisting("headSelectionsToHide"))
8335 {
8338 }
8339
8341 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8342 {
8344 }
8345
8347
8348 m_IsResultOfSplit = false;
8349
8351 }
8352
8354 {
8355 super.InitItemVariables();
8356
8362 m_Count = ConfigGetInt(
"count");
8363
8366
8371
8374
8379
8391
8395
8396
8399 if (ConfigIsExisting("canBeSplit"))
8400 {
8403 }
8404
8406 if (ConfigIsExisting("itemBehaviour"))
8408
8409
8412 RegisterNetSyncVariableInt("m_VarLiquidType");
8413 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8414
8415 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8416 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8417 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8418
8419 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8420 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8421 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8422 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8423
8424 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8425 RegisterNetSyncVariableBool("m_IsTakeable");
8426 RegisterNetSyncVariableBool("m_IsHologram");
8427
8430 {
8433 }
8434
8436
8438 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8440
8441 }
8442
8444 {
8446 }
8447
8449 {
8452 {
8457 }
8458 }
8459
8460 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8461 {
8463 {
8466 }
8467
8469 }
8470
8472 {
8478 }
8479
8481
8483 {
8485
8486 if (!action)
8487 {
8488 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8489 return;
8490 }
8491
8493 if (!ai)
8494 {
8496 return;
8497 }
8498
8500 if (!action_array)
8501 {
8502 action_array = new array<ActionBase_Basic>;
8504 }
8505 if (LogManager.IsActionLogEnable())
8506 {
8507 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8508 }
8509
8510 if (action_array.Find(action) != -1)
8511 {
8512 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8513 }
8514 else
8515 {
8516 action_array.Insert(action);
8517 }
8518 }
8519
8521 {
8523 ActionBase action = player.GetActionManager().GetAction(actionName);
8526
8527 if (action_array)
8528 {
8529 action_array.RemoveItem(action);
8530 }
8531 }
8532
8533
8534
8536 {
8537 ActionOverrideData overrideData = new ActionOverrideData();
8541
8543 if (!actionMap)
8544 {
8547 }
8548
8549 actionMap.Insert(this.
Type(), overrideData);
8550
8551 }
8552
8554
8556
8557
8559 {
8562
8565
8566 string config_to_search = "CfgVehicles";
8567 string muzzle_owner_config;
8568
8570 {
8571 if (IsInherited(Weapon))
8572 config_to_search = "CfgWeapons";
8573
8574 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8575
8576 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8577
8579
8580 if (config_OnFire_subclass_count > 0)
8581 {
8582 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8583
8584 for (int i = 0; i < config_OnFire_subclass_count; i++)
8585 {
8586 string particle_class = "";
8588 string config_OnFire_entry = config_OnFire_class + particle_class;
8589 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8590 WPOF_array.Insert(WPOF);
8591 }
8592
8593
8595 }
8596 }
8597
8599 {
8600 config_to_search = "CfgWeapons";
8601 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8602
8603 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8604
8606
8607 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8608 {
8609 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8610
8611 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8612 {
8613 string particle_class2 = "";
8615 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8616 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8617 WPOBE_array.Insert(WPOBE);
8618 }
8619
8620
8622 }
8623 }
8624 }
8625
8626
8628 {
8631
8633 {
8634 string config_to_search = "CfgVehicles";
8635
8636 if (IsInherited(Weapon))
8637 config_to_search = "CfgWeapons";
8638
8639 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8640 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8641
8642 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8643 {
8644
8646
8648 {
8650 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8652 return;
8653 }
8654
8657
8658
8659
8661 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8662
8663 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8664 {
8665 string particle_class = "";
8667 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8669
8670 if (entry_type == CT_CLASS)
8671 {
8672 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8673 WPOOH_array.Insert(WPOF);
8674 }
8675 }
8676
8677
8679 }
8680 }
8681 }
8682
8684 {
8686 }
8687
8689 {
8691 {
8693
8696
8699
8700 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8701 }
8702 }
8703
8705 {
8707 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8708
8710 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8711
8713 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8714
8716 {
8718 }
8719 }
8720
8722 {
8724 }
8725
8727 {
8730 else
8732
8734 {
8737 }
8738 else
8739 {
8742
8745 }
8746
8748 }
8749
8751 {
8753 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8754 }
8755
8757 {
8759 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8761 }
8762
8764 {
8766 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8767 }
8768
8770 {
8773
8774 OverheatingParticle OP = new OverheatingParticle();
8779
8781 }
8782
8784 {
8787
8788 return -1;
8789 }
8790
8792 {
8794 {
8797
8798 for (int i = count; i > 0; --i)
8799 {
8800 int id = i - 1;
8803
8806
8807 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8808 {
8809 if (p)
8810 {
8813 }
8814 }
8815 }
8816 }
8817 }
8818
8820 {
8822 {
8824 {
8825 int id = i - 1;
8827
8828 if (OP)
8829 {
8831
8832 if (p)
8833 {
8835 }
8836
8837 delete OP;
8838 }
8839 }
8840
8843 }
8844 }
8845
8848 {
8849 return 0.0;
8850 }
8851
8852
8854 {
8855 return 250;
8856 }
8857
8859 {
8860 return 0;
8861 }
8862
8865 {
8867 return true;
8868
8869 return false;
8870 }
8871
8874 {
8877
8879 {
8881 }
8882 else
8883 {
8884
8886 }
8887
8889 }
8890
8897 {
8898 return -1;
8899 }
8900
8901
8902
8903
8905 {
8907 {
8909 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8910
8911 if (r_index >= 0)
8912 {
8913 InventoryLocation r_il = new InventoryLocation;
8914 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8915
8916 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8919 {
8920 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8921 }
8923 {
8924 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8925 }
8926
8927 }
8928
8929 player.GetHumanInventory().ClearUserReservedLocation(this);
8930 }
8931
8934 }
8935
8936
8937
8938
8940 {
8941 return ItemBase.m_DebugActionsMask;
8942 }
8943
8945 {
8946 return ItemBase.m_DebugActionsMask & mask;
8947 }
8948
8950 {
8951 ItemBase.m_DebugActionsMask = mask;
8952 }
8953
8955 {
8956 ItemBase.m_DebugActionsMask |= mask;
8957 }
8958
8960 {
8961 ItemBase.m_DebugActionsMask &= ~mask;
8962 }
8963
8965 {
8967 {
8969 }
8970 else
8971 {
8973 }
8974 }
8975
8976
8978 {
8979 if (GetEconomyProfile())
8980 {
8981 float q_max = GetEconomyProfile().GetQuantityMax();
8982 if (q_max > 0)
8983 {
8984 float q_min = GetEconomyProfile().GetQuantityMin();
8985 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8986
8988 {
8989 ComponentEnergyManager comp = GetCompEM();
8991 {
8993 }
8994 }
8996 {
8998
8999 }
9000
9001 }
9002 }
9003 }
9004
9007 {
9008 EntityAI parent = GetHierarchyParent();
9009
9010 if (parent)
9011 {
9012 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9013 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9014 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9015 }
9016 }
9017
9020 {
9021 EntityAI parent = GetHierarchyParent();
9022
9023 if (parent)
9024 {
9025 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9026 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9027 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9028 }
9029 }
9030
9032 {
9033
9034
9035
9036
9038
9040 {
9041 if (ScriptInputUserData.CanStoreInputUserData())
9042 {
9043 ScriptInputUserData ctx = new ScriptInputUserData;
9049 ctx.
Write(use_stack_max);
9052
9054 {
9055 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9056 }
9057 }
9058 }
9059 else if (!
GetGame().IsMultiplayer())
9060 {
9062 }
9063 }
9064
9066 {
9068 }
9069
9071 {
9073 }
9074
9076 {
9078 }
9079
9081 {
9082
9083 return false;
9084 }
9085
9087 {
9088 return false;
9089 }
9090
9094 {
9095 return false;
9096 }
9097
9099 {
9100 return "";
9101 }
9102
9104
9106 {
9107 return false;
9108 }
9109
9111 {
9112 return true;
9113 }
9114
9115
9116
9118 {
9119 return true;
9120 }
9121
9123 {
9124 return true;
9125 }
9126
9128 {
9129 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9131 }
9132
9134 {
9136 }
9137
9139 {
9141 if (!is_being_placed)
9143 SetSynchDirty();
9144 }
9145
9146
9148
9150 {
9152 }
9153
9155 {
9157 }
9158
9160 {
9161 return 1;
9162 }
9163
9165 {
9166 return false;
9167 }
9168
9170 {
9172 SetSynchDirty();
9173 }
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197
9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9210 {
9211 super.OnMovedInsideCargo(container);
9212
9213 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9214 }
9215
9216 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9217 {
9218 super.EEItemLocationChanged(oldLoc,newLoc);
9219
9220 PlayerBase new_player = null;
9221 PlayerBase old_player = null;
9222
9223 if (newLoc.GetParent())
9224 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9225
9226 if (oldLoc.GetParent())
9227 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9228
9230 {
9231 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9232
9233 if (r_index >= 0)
9234 {
9235 InventoryLocation r_il = new InventoryLocation;
9236 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9237
9238 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9241 {
9242 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9243 }
9245 {
9246 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9247 }
9248
9249 }
9250 }
9251
9253 {
9254 if (new_player)
9255 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9256
9257 if (new_player == old_player)
9258 {
9259
9260 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9261 {
9263 {
9264 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9265 {
9266 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9267 }
9268 }
9269 else
9270 {
9271 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9272 }
9273 }
9274
9275 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9276 {
9277 int type = oldLoc.GetType();
9279 {
9280 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9281 }
9283 {
9284 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9285 }
9286 }
9287 if (!m_OldLocation)
9288 {
9289 m_OldLocation = new InventoryLocation;
9290 }
9291 m_OldLocation.Copy(oldLoc);
9292 }
9293 else
9294 {
9295 if (m_OldLocation)
9296 {
9297 m_OldLocation.Reset();
9298 }
9299 }
9300
9302 }
9303 else
9304 {
9305 if (new_player)
9306 {
9307 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9308 if (res_index >= 0)
9309 {
9310 InventoryLocation il = new InventoryLocation;
9311 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9313 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9316 {
9317 il.
GetParent().GetOnReleaseLock().Invoke(it);
9318 }
9320 {
9322 }
9323
9324 }
9325 }
9327 {
9328
9330 }
9331
9332 if (m_OldLocation)
9333 {
9334 m_OldLocation.Reset();
9335 }
9336 }
9337 }
9338
9339 override void EOnContact(IEntity other, Contact extra)
9340 {
9342 {
9343 int liquidType = -1;
9345 if (impactSpeed > 0.0)
9346 {
9348 #ifndef SERVER
9350 #else
9352 SetSynchDirty();
9353 #endif
9355 }
9356 }
9357
9358 #ifdef SERVER
9359 if (GetCompEM() && GetCompEM().IsPlugged())
9360 {
9361 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9362 GetCompEM().UnplugThis();
9363 }
9364 #endif
9365 }
9366
9368
9370 {
9372 }
9373
9375 {
9376
9377 }
9378
9380 {
9381 super.OnItemLocationChanged(old_owner, new_owner);
9382
9383 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9384 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9385
9386 if (!relatedPlayer && playerNew)
9387 relatedPlayer = playerNew;
9388
9389 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9390 {
9392 if (actionMgr)
9393 {
9394 ActionBase currentAction = actionMgr.GetRunningAction();
9395 if (currentAction)
9397 }
9398 }
9399
9400 Man ownerPlayerOld = null;
9401 Man ownerPlayerNew = null;
9402
9403 if (old_owner)
9404 {
9405 if (old_owner.
IsMan())
9406 {
9407 ownerPlayerOld = Man.Cast(old_owner);
9408 }
9409 else
9410 {
9411 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9412 }
9413 }
9414 else
9415 {
9417 {
9419
9420 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9421 {
9422 GetCompEM().UnplugThis();
9423 }
9424 }
9425 }
9426
9427 if (new_owner)
9428 {
9429 if (new_owner.
IsMan())
9430 {
9431 ownerPlayerNew = Man.Cast(new_owner);
9432 }
9433 else
9434 {
9435 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9436 }
9437 }
9438
9439 if (ownerPlayerOld != ownerPlayerNew)
9440 {
9441 if (ownerPlayerOld)
9442 {
9443 array<EntityAI> subItemsExit = new array<EntityAI>;
9445 for (int i = 0; i < subItemsExit.Count(); i++)
9446 {
9449 }
9450 }
9451
9452 if (ownerPlayerNew)
9453 {
9454 array<EntityAI> subItemsEnter = new array<EntityAI>;
9456 for (int j = 0; j < subItemsEnter.Count(); j++)
9457 {
9460 }
9461 }
9462 }
9463 else if (ownerPlayerNew != null)
9464 {
9465 PlayerBase nplayer;
9466 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9467 {
9468 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9470 for (int k = 0; k < subItemsUpdate.Count(); k++)
9471 {
9473 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9474 }
9475 }
9476 }
9477
9478 if (old_owner)
9479 old_owner.OnChildItemRemoved(this);
9480 if (new_owner)
9481 new_owner.OnChildItemReceived(this);
9482 }
9483
9484
9486 {
9487 super.EEDelete(parent);
9488 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9489 if (player)
9490 {
9492
9493 if (player.IsAlive())
9494 {
9495 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9496 if (r_index >= 0)
9497 {
9498 InventoryLocation r_il = new InventoryLocation;
9499 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9500
9501 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9504 {
9505 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9506 }
9508 {
9509 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9510 }
9511
9512 }
9513
9514 player.RemoveQuickBarEntityShortcut(this);
9515 }
9516 }
9517 }
9518
9520 {
9521 super.EEKilled(killer);
9522
9525 {
9526 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9527 {
9528 if (IsMagazine())
9529 {
9530 if (Magazine.Cast(this).GetAmmoCount() > 0)
9531 {
9533 }
9534 }
9535 else
9536 {
9538 }
9539 }
9540 }
9541 }
9542
9544 {
9545 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9546
9547 super.OnWasAttached(parent, slot_id);
9548
9551
9553 }
9554
9556 {
9557 super.OnWasDetached(parent, slot_id);
9558
9561 }
9562
9564 {
9565 int idx;
9568
9569 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9570 if (inventory_slots.Count() < 1)
9571 {
9572 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9573 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9574 }
9575 else
9576 {
9577 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9578 }
9579
9580 idx = inventory_slots.Find(slot);
9581 if (idx < 0)
9582 return "";
9583
9584 return attach_types.Get(idx);
9585 }
9586
9588 {
9589 int idx = -1;
9590 string slot;
9591
9594
9595 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9596 if (inventory_slots.Count() < 1)
9597 {
9598 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9599 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9600 }
9601 else
9602 {
9603 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9604 if (detach_types.Count() < 1)
9605 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9606 }
9607
9608 for (int i = 0; i < inventory_slots.Count(); i++)
9609 {
9610 slot = inventory_slots.Get(i);
9611 }
9612
9613 if (slot != "")
9614 {
9615 if (detach_types.Count() == 1)
9616 idx = 0;
9617 else
9618 idx = inventory_slots.Find(slot);
9619 }
9620 if (idx < 0)
9621 return "";
9622
9623 return detach_types.Get(idx);
9624 }
9625
9627 {
9628
9630
9631
9632 float min_time = 1;
9633 float max_time = 3;
9634 float delay = Math.RandomFloat(min_time, max_time);
9635
9636 explode_timer.Run(delay, this, "DoAmmoExplosion");
9637 }
9638
9640 {
9641 Magazine magazine = Magazine.Cast(this);
9642 int pop_sounds_count = 6;
9643 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9644
9645
9646 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9647 string sound_name = pop_sounds[ sound_idx ];
9649
9650
9651 magazine.ServerAddAmmoCount(-1);
9652
9653
9654 float min_temp_to_explode = 100;
9655
9656 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9657 {
9659 }
9660 }
9661
9662
9663 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9664 {
9665 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9666
9667 const int CHANCE_DAMAGE_CARGO = 4;
9668 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9669 const int CHANCE_DAMAGE_NOTHING = 2;
9670
9672 {
9673 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9674 int chances;
9675 int rnd;
9676
9677 if (GetInventory().GetCargo())
9678 {
9679 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9680 rnd = Math.RandomInt(0,chances);
9681
9682 if (rnd < CHANCE_DAMAGE_CARGO)
9683 {
9685 }
9686 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9687 {
9689 }
9690 }
9691 else
9692 {
9693 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9694 rnd = Math.RandomInt(0,chances);
9695
9696 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9697 {
9699 }
9700 }
9701 }
9702 }
9703
9705 {
9706 if (GetInventory().GetCargo())
9707 {
9708 int item_count = GetInventory().GetCargo().GetItemCount();
9709 if (item_count > 0)
9710 {
9711 int random_pick = Math.RandomInt(0, item_count);
9713 if (!item.IsExplosive())
9714 {
9715 item.AddHealth("","",damage);
9716 return true;
9717 }
9718 }
9719 }
9720 return false;
9721 }
9722
9724 {
9725 int attachment_count = GetInventory().AttachmentCount();
9726 if (attachment_count > 0)
9727 {
9728 int random_pick = Math.RandomInt(0, attachment_count);
9729 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9730 if (!attachment.IsExplosive())
9731 {
9732 attachment.AddHealth("","",damage);
9733 return true;
9734 }
9735 }
9736 return false;
9737 }
9738
9740 {
9742 }
9743
9745 {
9747 return GetInventory().CanRemoveEntity();
9748
9749 return false;
9750 }
9751
9753 {
9755 return;
9756
9758 {
9759 if (ScriptInputUserData.CanStoreInputUserData())
9760 {
9761 ScriptInputUserData ctx = new ScriptInputUserData;
9766 ctx.
Write(destination_entity);
9770 }
9771 }
9772 else if (!
GetGame().IsMultiplayer())
9773 {
9775 }
9776 }
9777
9779 {
9781 return;
9782
9783 float split_quantity_new;
9787 InventoryLocation loc = new InventoryLocation;
9788
9789 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9790 {
9792 split_quantity_new = stack_max;
9793 else
9795
9796 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9797 if (new_item)
9798 {
9799 new_item.SetResultOfSplit(true);
9800 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9802 new_item.SetQuantity(split_quantity_new);
9803 }
9804 }
9805 else if (destination_entity && slot_id == -1)
9806 {
9807 if (quantity > stack_max)
9808 split_quantity_new = stack_max;
9809 else
9810 split_quantity_new = quantity;
9811
9813 {
9816 }
9817
9818 if (new_item)
9819 {
9820 new_item.SetResultOfSplit(true);
9821 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9823 new_item.SetQuantity(split_quantity_new);
9824 }
9825 }
9826 else
9827 {
9828 if (stack_max != 0)
9829 {
9831 {
9833 }
9834
9835 if (split_quantity_new == 0)
9836 {
9837 if (!
GetGame().IsMultiplayer())
9838 player.PhysicalPredictiveDropItem(this);
9839 else
9840 player.ServerDropEntity(this);
9841 return;
9842 }
9843
9845
9846 if (new_item)
9847 {
9848 new_item.SetResultOfSplit(true);
9849 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9851 new_item.SetQuantity(stack_max);
9852 new_item.PlaceOnSurface();
9853 }
9854 }
9855 }
9856 }
9857
9859 {
9861 return;
9862
9863 float split_quantity_new;
9867 InventoryLocation loc = new InventoryLocation;
9868
9869 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9870 {
9872 split_quantity_new = stack_max;
9873 else
9875
9876 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9877 if (new_item)
9878 {
9879 new_item.SetResultOfSplit(true);
9880 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9882 new_item.SetQuantity(split_quantity_new);
9883 }
9884 }
9885 else if (destination_entity && slot_id == -1)
9886 {
9887 if (quantity > stack_max)
9888 split_quantity_new = stack_max;
9889 else
9890 split_quantity_new = quantity;
9891
9893 {
9896 }
9897
9898 if (new_item)
9899 {
9900 new_item.SetResultOfSplit(true);
9901 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9903 new_item.SetQuantity(split_quantity_new);
9904 }
9905 }
9906 else
9907 {
9908 if (stack_max != 0)
9909 {
9911 {
9913 }
9914
9916
9917 if (new_item)
9918 {
9919 new_item.SetResultOfSplit(true);
9920 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9922 new_item.SetQuantity(stack_max);
9923 new_item.PlaceOnSurface();
9924 }
9925 }
9926 }
9927 }
9928
9930 {
9932 return;
9933
9935 {
9936 if (ScriptInputUserData.CanStoreInputUserData())
9937 {
9938 ScriptInputUserData ctx = new ScriptInputUserData;
9943 dst.WriteToContext(ctx);
9945 }
9946 }
9947 else if (!
GetGame().IsMultiplayer())
9948 {
9950 }
9951 }
9952
9954 {
9956 return;
9957
9959 {
9960 if (ScriptInputUserData.CanStoreInputUserData())
9961 {
9962 ScriptInputUserData ctx = new ScriptInputUserData;
9967 ctx.
Write(destination_entity);
9973 }
9974 }
9975 else if (!
GetGame().IsMultiplayer())
9976 {
9978 }
9979 }
9980
9982 {
9984 }
9985
9987 {
9989 return this;
9990
9992 float split_quantity_new;
9994 if (dst.IsValid())
9995 {
9996 int slot_id = dst.GetSlot();
9998
9999 if (quantity > stack_max)
10000 split_quantity_new = stack_max;
10001 else
10002 split_quantity_new = quantity;
10003
10005
10006 if (new_item)
10007 {
10008 new_item.SetResultOfSplit(true);
10009 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10012 }
10013
10014 return new_item;
10015 }
10016
10017 return null;
10018 }
10019
10021 {
10023 return;
10024
10026 float split_quantity_new;
10028 if (destination_entity)
10029 {
10031 if (quantity > stackable)
10032 split_quantity_new = stackable;
10033 else
10034 split_quantity_new = quantity;
10035
10036 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10037 if (new_item)
10038 {
10039 new_item.SetResultOfSplit(true);
10040 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10042 new_item.SetQuantity(split_quantity_new);
10043 }
10044 }
10045 }
10046
10048 {
10050 return;
10051
10053 {
10054 if (ScriptInputUserData.CanStoreInputUserData())
10055 {
10056 ScriptInputUserData ctx = new ScriptInputUserData;
10061 ItemBase destination_entity =
this;
10062 ctx.
Write(destination_entity);
10066 }
10067 }
10068 else if (!
GetGame().IsMultiplayer())
10069 {
10071 }
10072 }
10073
10075 {
10077 return;
10078
10080 float split_quantity_new;
10082 if (player)
10083 {
10085 if (quantity > stackable)
10086 split_quantity_new = stackable;
10087 else
10088 split_quantity_new = quantity;
10089
10090 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10091 new_item =
ItemBase.Cast(in_hands);
10092 if (new_item)
10093 {
10094 new_item.SetResultOfSplit(true);
10095 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10097 new_item.SetQuantity(split_quantity_new);
10098 }
10099 }
10100 }
10101
10103 {
10105 return;
10106
10108 float split_quantity_new = Math.Floor(quantity * 0.5);
10109
10111
10112 if (new_item)
10113 {
10114 if (new_item.GetQuantityMax() < split_quantity_new)
10115 {
10116 split_quantity_new = new_item.GetQuantityMax();
10117 }
10118
10119 new_item.SetResultOfSplit(true);
10120 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10121
10123 {
10126 }
10127 else
10128 {
10131 }
10132 }
10133 }
10134
10136 {
10138 return;
10139
10141 float split_quantity_new = Math.Floor(quantity / 2);
10142
10143 InventoryLocation invloc = new InventoryLocation;
10145
10147 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10148
10149 if (new_item)
10150 {
10151 if (new_item.GetQuantityMax() < split_quantity_new)
10152 {
10153 split_quantity_new = new_item.GetQuantityMax();
10154 }
10156 {
10159 }
10160 else
10161 {
10164 }
10165 }
10166 }
10167
10170 {
10171 SetWeightDirty();
10173
10174 if (parent)
10175 parent.OnAttachmentQuantityChangedEx(this, delta);
10176
10178 {
10180 {
10182 }
10184 {
10185 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10187 }
10188 }
10189
10190 }
10191
10194 {
10195
10196 }
10197
10200 {
10202 }
10203
10205 {
10206 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10207
10209 {
10210 if (newLevel == GameConstants.STATE_RUINED)
10211 {
10213 EntityAI parent = GetHierarchyParent();
10214 if (parent && parent.IsFireplace())
10215 {
10216 CargoBase cargo = GetInventory().GetCargo();
10217 if (cargo)
10218 {
10220 {
10222 }
10223 }
10224 }
10225 }
10226
10228 {
10229
10231 return;
10232 }
10233
10234 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10235 {
10237 }
10238 }
10239 }
10240
10241
10243 {
10244 super.OnRightClick();
10245
10247 {
10249 {
10250 if (ScriptInputUserData.CanStoreInputUserData())
10251 {
10252 vector m4[4];
10254
10255 EntityAI root = GetHierarchyRoot();
10256
10257 InventoryLocation dst = new InventoryLocation;
10259 {
10260 if (root)
10261 {
10262 root.GetTransform(m4);
10264 }
10265 else
10266 GetInventory().GetCurrentInventoryLocation(dst);
10267 }
10268 else
10269 {
10271
10272
10273 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10274 {
10275 if (root)
10276 {
10277 root.GetTransform(m4);
10279 }
10280 else
10281 GetInventory().GetCurrentInventoryLocation(dst);
10282 }
10283 else
10284 {
10285 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10286 }
10287 }
10288
10289 ScriptInputUserData ctx = new ScriptInputUserData;
10297 }
10298 }
10299 else if (!
GetGame().IsMultiplayer())
10300 {
10302 }
10303 }
10304 }
10305
10306 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10307 {
10308
10309 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10310 return false;
10311
10312 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10313 return false;
10314
10315
10317 return false;
10318
10319
10320 Magazine mag = Magazine.Cast(this);
10321 if (mag)
10322 {
10323 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10324 return false;
10325
10326 if (stack_max_limit)
10327 {
10328 Magazine other_mag = Magazine.Cast(other_item);
10329 if (other_item)
10330 {
10331 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10332 return false;
10333 }
10334
10335 }
10336 }
10337 else
10338 {
10339
10341 return false;
10342
10344 return false;
10345 }
10346
10347 PlayerBase player = null;
10348 if (CastTo(player, GetHierarchyRootPlayer()))
10349 {
10350 if (player.GetInventory().HasAttachment(this))
10351 return false;
10352
10353 if (player.IsItemsToDelete())
10354 return false;
10355 }
10356
10357 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10358 return false;
10359
10360 int slotID;
10362 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10363 return false;
10364
10365 return true;
10366 }
10367
10369 {
10371 }
10372
10374 {
10375 return m_IsResultOfSplit;
10376 }
10377
10379 {
10380 m_IsResultOfSplit = value;
10381 }
10382
10384 {
10386 }
10387
10389 {
10390 float other_item_quantity = other_item.GetQuantity();
10391 float this_free_space;
10392
10394
10396
10397 if (other_item_quantity > this_free_space)
10398 {
10399 return this_free_space;
10400 }
10401 else
10402 {
10403 return other_item_quantity;
10404 }
10405 }
10406
10408 {
10410 }
10411
10413 {
10415 return;
10416
10417 if (!IsMagazine() && other_item)
10418 {
10420 if (quantity_used != 0)
10421 {
10422 float hp1 = GetHealth01("","");
10423 float hp2 = other_item.GetHealth01("","");
10424 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10425 hpResult = hpResult / (
GetQuantity() + quantity_used);
10426
10427 hpResult *= GetMaxHealth();
10428 Math.Round(hpResult);
10429 SetHealth("", "Health", hpResult);
10430
10432 other_item.AddQuantity(-quantity_used);
10433 }
10434 }
10436 }
10437
10439 {
10440 #ifdef SERVER
10441 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10442 GetHierarchyParent().IncreaseLifetimeUp();
10443 #endif
10444 };
10445
10447 {
10448 PlayerBase p = PlayerBase.Cast(player);
10449
10450 array<int> recipesIds = p.m_Recipes;
10451 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10452 if (moduleRecipesManager)
10453 {
10454 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10455 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10456 }
10457
10458 for (int i = 0;i < recipesIds.Count(); i++)
10459 {
10460 int key = recipesIds.Get(i);
10461 string recipeName = moduleRecipesManager.GetRecipeName(key);
10463 }
10464 }
10465
10466
10467 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10468 {
10469 super.GetDebugActions(outputList);
10470
10471
10476
10477
10481
10485
10486
10489
10490
10492 {
10495 }
10496
10498
10501
10505 }
10506
10507
10508
10509
10511 {
10512 super.OnAction(action_id, player, ctx);
10513 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10514 {
10515 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10516 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10517 PlayerBase p = PlayerBase.Cast(player);
10518 if (
EActions.RECIPES_RANGE_START < 1000)
10519 {
10520 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10521 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10522 }
10523 }
10524 #ifndef SERVER
10525 else if (action_id ==
EActions.WATCH_PLAYER)
10526 {
10527 PluginDeveloper.SetDeveloperItemClientEx(player);
10528 }
10529 #endif
10531 {
10532 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10533 {
10534 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10535 OnDebugButtonPressServer(id + 1);
10536 }
10537
10538 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10539 {
10540 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10542 }
10543
10544 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10545 {
10546 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10548 }
10549
10550 else if (action_id ==
EActions.ADD_QUANTITY)
10551 {
10552 if (IsMagazine())
10553 {
10554 Magazine mag = Magazine.Cast(this);
10555 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10556 }
10557 else
10558 {
10560 }
10561
10562 if (m_EM)
10563 {
10564 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10565 }
10566
10567 }
10568
10569 else if (action_id ==
EActions.REMOVE_QUANTITY)
10570 {
10571 if (IsMagazine())
10572 {
10573 Magazine mag2 = Magazine.Cast(this);
10574 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10575 }
10576 else
10577 {
10579 }
10580 if (m_EM)
10581 {
10582 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10583 }
10584
10585 }
10586
10587 else if (action_id ==
EActions.SET_QUANTITY_0)
10588 {
10590
10591 if (m_EM)
10592 {
10593 m_EM.SetEnergy(0);
10594 }
10595 }
10596
10597 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10598 {
10600
10601 if (m_EM)
10602 {
10603 m_EM.SetEnergy(m_EM.GetEnergyMax());
10604 }
10605 }
10606
10607 else if (action_id ==
EActions.ADD_HEALTH)
10608 {
10609 AddHealth("","",GetMaxHealth("","Health")/5);
10610 }
10611 else if (action_id ==
EActions.REMOVE_HEALTH)
10612 {
10613 AddHealth("","",-GetMaxHealth("","Health")/5);
10614 }
10615 else if (action_id ==
EActions.DESTROY_HEALTH)
10616 {
10617 SetHealth01("","",0);
10618 }
10619 else if (action_id ==
EActions.WATCH_ITEM)
10620 {
10622 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10623 #ifdef DEVELOPER
10624 SetDebugDeveloper_item(this);
10625 #endif
10626 }
10627
10628 else if (action_id ==
EActions.ADD_TEMPERATURE)
10629 {
10630 AddTemperature(20);
10631
10632 }
10633
10634 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10635 {
10636 AddTemperature(-20);
10637
10638 }
10639
10640 else if (action_id ==
EActions.FLIP_FROZEN)
10641 {
10642 SetFrozen(!GetIsFrozen());
10643
10644 }
10645
10646 else if (action_id ==
EActions.ADD_WETNESS)
10647 {
10649
10650 }
10651
10652 else if (action_id ==
EActions.REMOVE_WETNESS)
10653 {
10655
10656 }
10657
10658 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10659 {
10662
10663
10664 }
10665
10666 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10667 {
10670 }
10671
10672 else if (action_id ==
EActions.MAKE_SPECIAL)
10673 {
10674 auto debugParams = DebugSpawnParams.WithPlayer(player);
10675 OnDebugSpawnEx(debugParams);
10676 }
10677
10678 else if (action_id ==
EActions.DELETE)
10679 {
10680 Delete();
10681 }
10682
10683 }
10684
10685
10686 return false;
10687 }
10688
10689
10690
10691
10695
10698
10699
10700
10702 {
10703 return false;
10704 }
10705
10706
10708 {
10709 return true;
10710 }
10711
10712
10714 {
10715 return true;
10716 }
10717
10718
10719
10721 {
10722 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10724 }
10725
10728 {
10729 return null;
10730 }
10731
10733 {
10734 return false;
10735 }
10736
10738 {
10739 return false;
10740 }
10741
10745
10746
10748 {
10749 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10750 return module_repairing.CanRepair(this, item_repair_kit);
10751 }
10752
10753
10754 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10755 {
10756 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10757 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10758 }
10759
10760
10762 {
10763
10764
10765
10766
10767
10768
10769
10770
10771 return 1;
10772 }
10773
10774
10775
10777 {
10779 }
10780
10781
10782
10784 {
10786 }
10787
10788
10797 {
10798 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10799
10800 if (player)
10801 {
10802 player.MessageStatus(text);
10803 }
10804 }
10805
10806
10815 {
10816 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10817
10818 if (player)
10819 {
10820 player.MessageAction(text);
10821 }
10822 }
10823
10824
10833 {
10834 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10835
10836 if (player)
10837 {
10838 player.MessageFriendly(text);
10839 }
10840 }
10841
10842
10851 {
10852 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10853
10854 if (player)
10855 {
10856 player.MessageImportant(text);
10857 }
10858 }
10859
10861 {
10862 return true;
10863 }
10864
10865
10866 override bool KindOf(
string tag)
10867 {
10868 bool found = false;
10869 string item_name = this.
GetType();
10872
10873 int array_size = item_tag_array.Count();
10874 for (int i = 0; i < array_size; i++)
10875 {
10876 if (item_tag_array.Get(i) == tag)
10877 {
10878 found = true;
10879 break;
10880 }
10881 }
10882 return found;
10883 }
10884
10885
10887 {
10888
10889 super.OnRPC(sender, rpc_type,ctx);
10890
10891
10892 switch (rpc_type)
10893 {
10894 #ifndef SERVER
10895 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10896 Param2<bool, string> p = new Param2<bool, string>(false, "");
10897
10899 return;
10900
10901 bool play = p.param1;
10902 string soundSet = p.param2;
10903
10904 if (play)
10905 {
10907 {
10909 {
10911 }
10912 }
10913 else
10914 {
10916 }
10917 }
10918 else
10919 {
10921 }
10922
10923 break;
10924 #endif
10925
10926 }
10927
10929 {
10931 }
10932 }
10933
10934
10935
10936
10938 {
10939 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10940 return plugin.GetID(
name);
10941 }
10942
10944 {
10945 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10946 return plugin.GetName(id);
10947 }
10948
10951 {
10952
10953
10954 int varFlags;
10955 if (!ctx.
Read(varFlags))
10956 return;
10957
10958 if (varFlags & ItemVariableFlags.FLOAT)
10959 {
10961 }
10962 }
10963
10965 {
10966
10967 super.SerializeNumericalVars(floats_out);
10968
10969
10970
10972 {
10974 }
10975
10977 {
10979 }
10980
10982 {
10984 }
10985
10987 {
10992 }
10993
10995 {
10997 }
10998 }
10999
11001 {
11002
11003 super.DeSerializeNumericalVars(floats);
11004
11005
11006 int index = 0;
11007 int mask = Math.Round(floats.Get(index));
11008
11009 index++;
11010
11012 {
11014 {
11016 }
11017 else
11018 {
11019 float quantity = floats.Get(index);
11020 SetQuantity(quantity,
true,
false,
false,
false);
11021 }
11022 index++;
11023 }
11024
11026 {
11027 float wet = floats.Get(index);
11029 index++;
11030 }
11031
11033 {
11034 int liquidtype = Math.Round(floats.Get(index));
11036 index++;
11037 }
11038
11040 {
11042 index++;
11044 index++;
11046 index++;
11048 index++;
11049 }
11050
11052 {
11053 int cleanness = Math.Round(floats.Get(index));
11055 index++;
11056 }
11057 }
11058
11060 {
11061 super.WriteVarsToCTX(ctx);
11062
11063
11065 {
11067 }
11068
11070 {
11072 }
11073
11075 {
11077 }
11078
11080 {
11081 int r,g,b,a;
11087 }
11088
11090 {
11092 }
11093 }
11094
11096 {
11097 if (!super.ReadVarsFromCTX(ctx,version))
11098 return false;
11099
11100 int intValue;
11101 float value;
11102
11103 if (version < 140)
11104 {
11105 if (!ctx.
Read(intValue))
11106 return false;
11107
11108 m_VariablesMask = intValue;
11109 }
11110
11112 {
11113 if (!ctx.
Read(value))
11114 return false;
11115
11117 {
11119 }
11120 else
11121 {
11123 }
11124 }
11125
11126 if (version < 140)
11127 {
11129 {
11130 if (!ctx.
Read(value))
11131 return false;
11132 SetTemperatureDirect(value);
11133 }
11134 }
11135
11137 {
11138 if (!ctx.
Read(value))
11139 return false;
11141 }
11142
11144 {
11145 if (!ctx.
Read(intValue))
11146 return false;
11148 }
11149
11151 {
11152 int r,g,b,a;
11154 return false;
11156 return false;
11158 return false;
11160 return false;
11161
11163 }
11164
11166 {
11167 if (!ctx.
Read(intValue))
11168 return false;
11170 }
11171
11172 if (version >= 138 && version < 140)
11173 {
11175 {
11176 if (!ctx.
Read(intValue))
11177 return false;
11178 SetFrozen(intValue);
11179 }
11180 }
11181
11182 return true;
11183 }
11184
11185
11187 {
11190 {
11192 }
11193
11194 if (!super.OnStoreLoad(ctx, version))
11195 {
11197 return false;
11198 }
11199
11200 if (version >= 114)
11201 {
11202 bool hasQuickBarIndexSaved;
11203
11204 if (!ctx.
Read(hasQuickBarIndexSaved))
11205 {
11207 return false;
11208 }
11209
11210 if (hasQuickBarIndexSaved)
11211 {
11212 int itmQBIndex;
11213
11214
11215 if (!ctx.
Read(itmQBIndex))
11216 {
11218 return false;
11219 }
11220
11221 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11222 if (itmQBIndex != -1 && parentPlayer)
11223 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11224 }
11225 }
11226 else
11227 {
11228
11229 PlayerBase player;
11230 int itemQBIndex;
11231 if (version ==
int.
MAX)
11232 {
11233 if (!ctx.
Read(itemQBIndex))
11234 {
11236 return false;
11237 }
11238 }
11239 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11240 {
11241
11242 if (!ctx.
Read(itemQBIndex))
11243 {
11245 return false;
11246 }
11247 if (itemQBIndex != -1 && player)
11248 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11249 }
11250 }
11251
11252 if (version < 140)
11253 {
11254
11255 if (!LoadVariables(ctx, version))
11256 {
11258 return false;
11259 }
11260 }
11261
11262
11264 {
11266 return false;
11267 }
11268 if (version >= 132)
11269 {
11271 if (raib)
11272 {
11274 {
11276 return false;
11277 }
11278 }
11279 }
11280
11282 return true;
11283 }
11284
11285
11286
11288 {
11289 super.OnStoreSave(ctx);
11290
11291 PlayerBase player;
11292 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11293 {
11295
11296 int itemQBIndex = -1;
11297 itemQBIndex = player.FindQuickBarEntityIndex(this);
11298 ctx.
Write(itemQBIndex);
11299 }
11300 else
11301 {
11303 }
11304
11306
11308 if (raib)
11309 {
11311 }
11312 }
11313
11314
11316 {
11317 super.AfterStoreLoad();
11318
11320 {
11322 }
11323
11325 {
11328 }
11329 }
11330
11332 {
11333 super.EEOnAfterLoad();
11334
11336 {
11338 }
11339
11342 }
11343
11345 {
11346 return false;
11347 }
11348
11349
11350
11352 {
11354 {
11355 #ifdef PLATFORM_CONSOLE
11356
11358 {
11360 if (menu)
11361 {
11363 }
11364 }
11365 #endif
11366 }
11367
11369 {
11372 }
11373
11375 {
11376 SetWeightDirty();
11378 }
11380 {
11383 }
11384
11386 {
11389 }
11391 {
11394 }
11395
11396 super.OnVariablesSynchronized();
11397 }
11398
11399
11400
11402 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11403 {
11404 if (!IsServerCheck(allow_client))
11405 return false;
11406
11408 return false;
11409
11412
11413 if (value <= (min + 0.001))
11414 value = min;
11415
11416 if (value == min)
11417 {
11418 if (destroy_config)
11419 {
11420 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11421 if (dstr)
11422 {
11424 this.Delete();
11425 return true;
11426 }
11427 }
11428 else if (destroy_forced)
11429 {
11431 this.Delete();
11432 return true;
11433 }
11434
11436 }
11437
11440
11442 {
11444
11445 if (delta)
11447 }
11448
11450
11451 return false;
11452 }
11453
11454
11456 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11457 {
11459 }
11460
11462 {
11465 }
11466
11468 {
11471 }
11472
11475 {
11476 float value_clamped = Math.Clamp(value, 0, 1);
11478 SetQuantity(result, destroy_config, destroy_forced);
11479 }
11480
11481
11484 {
11486 }
11487
11489 {
11491 }
11492
11493
11494
11495
11496
11497
11498
11499
11500
11501
11503 {
11504 int slot = -1;
11505 if (GetInventory())
11506 {
11507 InventoryLocation il = new InventoryLocation;
11508 GetInventory().GetCurrentInventoryLocation(il);
11510 }
11511
11513 }
11514
11516 {
11517 float quantity_max = 0;
11518
11520 {
11521 if (attSlotID != -1)
11522 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11523
11524 if (quantity_max <= 0)
11526 }
11527
11528 if (quantity_max <= 0)
11530
11531 return quantity_max;
11532 }
11533
11535 {
11537 }
11538
11540 {
11542 }
11543
11544
11546 {
11548 }
11549
11551 {
11553 }
11554
11556 {
11558 }
11559
11560
11562 {
11563
11564 float weightEx = GetWeightEx();
11565 float special = GetInventoryAndCargoWeight();
11566 return weightEx - special;
11567 }
11568
11569
11571 {
11573 }
11574
11576 {
11578 {
11579 #ifdef DEVELOPER
11580 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11581 {
11582 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11584 }
11585 #endif
11586
11587 return GetQuantity() * GetConfigWeightModified();
11588 }
11589 else if (HasEnergyManager())
11590 {
11591 #ifdef DEVELOPER
11592 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11593 {
11594 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11595 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11596 }
11597 #endif
11598 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11599 }
11600 else
11601 {
11602 #ifdef DEVELOPER
11603 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11604 {
11605 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11606 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11607 }
11608 #endif
11609 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11610 }
11611 }
11612
11615 {
11616 int item_count = 0;
11618
11619 if (GetInventory().GetCargo() != NULL)
11620 {
11621 item_count = GetInventory().GetCargo().GetItemCount();
11622 }
11623
11624 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11625 {
11626 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11627 if (item)
11628 item_count += item.GetNumberOfItems();
11629 }
11630 return item_count;
11631 }
11632
11635 {
11636 float weight = 0;
11637 float wetness = 1;
11638 if (include_wetness)
11641 {
11642 weight = wetness * m_ConfigWeight;
11643 }
11645 {
11646 weight = 1;
11647 }
11648 return weight;
11649 }
11650
11651
11652
11654 {
11655 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11656 {
11657 GameInventory inv = GetInventory();
11658 array<EntityAI> items = new array<EntityAI>;
11660 for (int i = 0; i < items.Count(); i++)
11661 {
11663 if (item)
11664 {
11666 }
11667 }
11668 }
11669 }
11670
11671
11672
11673
11675 {
11676 float energy = 0;
11677 if (HasEnergyManager())
11678 {
11679 energy = GetCompEM().GetEnergy();
11680 }
11681 return energy;
11682 }
11683
11684
11686 {
11687 super.OnEnergyConsumed();
11688
11690 }
11691
11693 {
11694 super.OnEnergyAdded();
11695
11697 }
11698
11699
11701 {
11702 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11703 {
11705 {
11706 float energy_0to1 = GetCompEM().GetEnergy0To1();
11708 }
11709 }
11710 }
11711
11712
11714 {
11715 return ConfigGetFloat("heatIsolation");
11716 }
11717
11719 {
11721 }
11722
11724 {
11725 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11726 if (
GetGame().ConfigIsExisting(paramPath))
11728
11729 return 0.0;
11730 }
11731
11733 {
11734 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11735 if (
GetGame().ConfigIsExisting(paramPath))
11737
11738 return 0.0;
11739 }
11740
11741 override void SetWet(
float value,
bool allow_client =
false)
11742 {
11743 if (!IsServerCheck(allow_client))
11744 return;
11745
11748
11750
11751 m_VarWet = Math.Clamp(value, min, max);
11752
11754 {
11757 }
11758 }
11759
11760 override void AddWet(
float value)
11761 {
11763 }
11764
11766 {
11768 }
11769
11771 {
11773 }
11774
11776 {
11778 }
11779
11781 {
11783 }
11784
11786 {
11788 }
11789
11790 override void OnWetChanged(
float newVal,
float oldVal)
11791 {
11794 if (newLevel != oldLevel)
11795 {
11797 }
11798 }
11799
11801 {
11802 SetWeightDirty();
11803 }
11804
11806 {
11807 return GetWetLevelInternal(
m_VarWet);
11808 }
11809
11810
11811
11813 {
11815 }
11816
11818 {
11820 }
11821
11823 {
11825 }
11826
11828 {
11830 }
11831
11832
11833
11835 {
11836 if (ConfigIsExisting("itemModelLength"))
11837 {
11838 return ConfigGetFloat("itemModelLength");
11839 }
11840 return 0;
11841 }
11842
11844 {
11845 if (ConfigIsExisting("itemAttachOffset"))
11846 {
11847 return ConfigGetFloat("itemAttachOffset");
11848 }
11849 return 0;
11850 }
11851
11852 override void SetCleanness(
int value,
bool allow_client =
false)
11853 {
11854 if (!IsServerCheck(allow_client))
11855 return;
11856
11858
11860
11863 }
11864
11866 {
11868 }
11869
11871 {
11872 return true;
11873 }
11874
11875
11876
11877
11879 {
11881 }
11882
11884 {
11886 }
11887
11888
11889
11890
11891 override void SetColor(
int r,
int g,
int b,
int a)
11892 {
11898 }
11900 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11901 {
11906 }
11907
11909 {
11911 }
11912
11915 {
11916 int r,g,b,a;
11918 r = r/255;
11919 g = g/255;
11920 b = b/255;
11921 a = a/255;
11922 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11923 }
11924
11925
11926
11927 override void SetLiquidType(
int value,
bool allow_client =
false)
11928 {
11929 if (!IsServerCheck(allow_client))
11930 return;
11931
11936 }
11937
11939 {
11940 return ConfigGetInt("varLiquidTypeInit");
11941 }
11942
11944 {
11946 }
11947
11949 {
11951 SetFrozen(false);
11952 }
11953
11956 {
11957 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11958 }
11959
11960
11963 {
11964 PlayerBase nplayer;
11965 if (PlayerBase.CastTo(nplayer, player))
11966 {
11968
11969 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11970 }
11971 }
11972
11973
11976 {
11977 PlayerBase nplayer;
11978 if (PlayerBase.CastTo(nplayer,player))
11979 {
11980
11981 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11982
11983 }
11984
11985
11986 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11987
11988
11989 if (HasEnergyManager())
11990 {
11991 GetCompEM().UpdatePlugState();
11992 }
11993 }
11994
11995
11997 {
11998 super.OnPlacementStarted(player);
11999
12001 }
12002
12003 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12004 {
12006 {
12007 m_AdminLog.OnPlacementComplete(player,
this);
12008 }
12009
12010 super.OnPlacementComplete(player, position, orientation);
12011 }
12012
12013
12014
12015
12016
12018 {
12020 {
12021 return true;
12022 }
12023 else
12024 {
12025 return false;
12026 }
12027 }
12028
12029
12031 {
12033 {
12035 }
12036 }
12037
12038
12040 {
12042 }
12043
12045 {
12047 }
12048
12049 override void InsertAgent(
int agent,
float count = 1)
12050 {
12051 if (count < 1)
12052 return;
12053
12055 }
12056
12059 {
12061 }
12062
12063
12065 {
12067 }
12068
12069
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081
12082
12083
12084
12085
12086
12087
12088
12089
12090
12091
12092
12093
12094
12095
12096
12097
12098
12099
12100
12101
12102
12103
12104
12105
12106
12107
12108
12109
12111 {
12113 return false;
12114 return true;
12115 }
12116
12118 {
12119
12121 }
12122
12123
12126 {
12127 super.CheckForRoofLimited(timeTresholdMS);
12128
12130 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12131 {
12132 m_PreviousRoofTestTime = time;
12133 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12134 }
12135 }
12136
12137
12139 {
12141 {
12142 return 0;
12143 }
12144
12145 if (GetInventory().GetAttachmentSlotsCount() != 0)
12146 {
12147 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12148 if (filter)
12149 return filter.GetProtectionLevel(type, false, system);
12150 else
12151 return 0;
12152 }
12153
12154 string subclassPath, entryName;
12155
12156 switch (type)
12157 {
12159 entryName = "biological";
12160 break;
12162 entryName = "chemical";
12163 break;
12164 default:
12165 entryName = "biological";
12166 break;
12167 }
12168
12169 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12170
12172 }
12173
12174
12175
12178 {
12179 if (!IsMagazine())
12181
12183 }
12184
12185
12186
12187
12188
12193 {
12194 return true;
12195 }
12196
12198 {
12200 }
12201
12202
12203
12204
12205
12207 {
12208 if (parent)
12209 {
12210 if (parent.IsInherited(DayZInfected))
12211 return true;
12212
12213 if (!parent.IsRuined())
12214 return true;
12215 }
12216
12217 return true;
12218 }
12219
12221 {
12222 if (!super.CanPutAsAttachment(parent))
12223 {
12224 return false;
12225 }
12226
12227 if (!IsRuined() && !parent.IsRuined())
12228 {
12229 return true;
12230 }
12231
12232 return false;
12233 }
12234
12236 {
12237
12238
12239
12240
12241 return super.CanReceiveItemIntoCargo(item);
12242 }
12243
12245 {
12246
12247
12248
12249
12250 GameInventory attachmentInv = attachment.GetInventory();
12252 {
12253 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12254 return false;
12255 }
12256
12257 InventoryLocation loc = new InventoryLocation();
12258 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12259 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12260 return false;
12261
12262 return super.CanReceiveAttachment(attachment, slotId);
12263 }
12264
12266 {
12267 if (!super.CanReleaseAttachment(attachment))
12268 return false;
12269
12270 return GetInventory().AreChildrenAccessible();
12271 }
12272
12273
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12294 {
12295 int id = muzzle_owner.GetMuzzleID();
12296 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12297
12298 if (WPOF_array)
12299 {
12300 for (int i = 0; i < WPOF_array.Count(); i++)
12301 {
12302 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12303
12304 if (WPOF)
12305 {
12306 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12307 }
12308 }
12309 }
12310 }
12311
12312
12314 {
12315 int id = muzzle_owner.GetMuzzleID();
12317
12318 if (WPOBE_array)
12319 {
12320 for (int i = 0; i < WPOBE_array.Count(); i++)
12321 {
12322 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12323
12324 if (WPOBE)
12325 {
12326 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12327 }
12328 }
12329 }
12330 }
12331
12332
12334 {
12335 int id = muzzle_owner.GetMuzzleID();
12336 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12337
12338 if (WPOOH_array)
12339 {
12340 for (int i = 0; i < WPOOH_array.Count(); i++)
12341 {
12342 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12343
12344 if (WPOOH)
12345 {
12346 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12347 }
12348 }
12349 }
12350 }
12351
12352
12354 {
12355 int id = muzzle_owner.GetMuzzleID();
12356 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12357
12358 if (WPOOH_array)
12359 {
12360 for (int i = 0; i < WPOOH_array.Count(); i++)
12361 {
12362 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12363
12364 if (WPOOH)
12365 {
12366 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12367 }
12368 }
12369 }
12370 }
12371
12372
12374 {
12375 int id = muzzle_owner.GetMuzzleID();
12376 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12377
12378 if (WPOOH_array)
12379 {
12380 for (int i = 0; i < WPOOH_array.Count(); i++)
12381 {
12382 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12383
12384 if (WPOOH)
12385 {
12386 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12387 }
12388 }
12389 }
12390 }
12391
12392
12393
12395 {
12397 {
12398 return true;
12399 }
12400
12401 return false;
12402 }
12403
12405 {
12407 {
12408 return true;
12409 }
12410
12411 return false;
12412 }
12413
12415 {
12417 {
12418 return true;
12419 }
12420
12421 return false;
12422 }
12423
12425 {
12426 return false;
12427 }
12428
12431 {
12432 return UATimeSpent.DEFAULT_DEPLOY;
12433 }
12434
12435
12436
12437
12439 {
12441 SetSynchDirty();
12442 }
12443
12445 {
12447 }
12448
12449
12451 {
12452 return false;
12453 }
12454
12457 {
12458 string att_type = "None";
12459
12460 if (ConfigIsExisting("soundAttType"))
12461 {
12462 att_type = ConfigGetString("soundAttType");
12463 }
12464
12466 }
12467
12469 {
12471 }
12472
12473
12474
12475
12476
12480
12482 {
12485
12487 }
12488
12489
12491 {
12493 return;
12494
12496
12499
12502
12503 SoundParameters params = new SoundParameters();
12507 }
12508
12509
12511 {
12513 return;
12514
12516 SetSynchDirty();
12517
12520 }
12521
12522
12524 {
12526 return;
12527
12529 SetSynchDirty();
12530
12533 }
12534
12536 {
12538 }
12539
12541 {
12543 }
12544
12547 {
12548 if (!
GetGame().IsDedicatedServer())
12549 {
12550 if (ConfigIsExisting("attachSoundSet"))
12551 {
12552 string cfg_path = "";
12553 string soundset = "";
12554 string type_name =
GetType();
12555
12558 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12559 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12560
12561 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12562 {
12563 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12564 {
12565 if (cfg_slot_array[i] == slot_type)
12566 {
12567 soundset = cfg_soundset_array[i];
12568 break;
12569 }
12570 }
12571 }
12572
12573 if (soundset != "")
12574 {
12575 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12577 }
12578 }
12579 }
12580 }
12581
12583 {
12584
12585 }
12586
12587 void OnApply(PlayerBase player);
12588
12590 {
12591 return 1.0;
12592 };
12593
12595 {
12597 }
12598
12600 {
12602 }
12603
12605
12607 {
12608 SetDynamicPhysicsLifeTime(0.01);
12610 }
12611
12613 {
12614 array<string> zone_names = new array<string>;
12615 GetDamageZones(zone_names);
12616 for (int i = 0; i < zone_names.Count(); i++)
12617 {
12618 SetHealthMax(zone_names.Get(i),"Health");
12619 }
12620 SetHealthMax("","Health");
12621 }
12622
12625 {
12626 float global_health = GetHealth01("","Health");
12627 array<string> zones = new array<string>;
12628 GetDamageZones(zones);
12629
12630 for (int i = 0; i < zones.Count(); i++)
12631 {
12632 SetHealth01(zones.Get(i),"Health",global_health);
12633 }
12634 }
12635
12638 {
12639 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12640 }
12641
12643 {
12644 if (!hasRootAsPlayer)
12645 {
12646 if (refParentIB)
12647 {
12648
12649 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12650 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12651
12652 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12653 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12654
12657 }
12658 else
12659 {
12660
12663 }
12664 }
12665 }
12666
12668 {
12670 {
12671 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12672 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12673 {
12674 float heatPermCoef = 1.0;
12676 while (ent)
12677 {
12678 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12679 ent = ent.GetHierarchyParent();
12680 }
12681
12682 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12683 }
12684 }
12685 }
12686
12688 {
12689
12690 EntityAI parent = GetHierarchyParent();
12691 if (!parent)
12692 {
12693 hasParent = false;
12694 hasRootAsPlayer = false;
12695 }
12696 else
12697 {
12698 hasParent = true;
12699 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12700 refParentIB =
ItemBase.Cast(parent);
12701 }
12702 }
12703
12704 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12705 {
12706
12707 }
12708
12710 {
12711
12712 return false;
12713 }
12714
12716 {
12717
12718
12719 return false;
12720 }
12721
12723 {
12724
12725 return false;
12726 }
12727
12730 {
12731 return !GetIsFrozen() &&
IsOpen();
12732 }
12733
12735 {
12736 bool hasParent = false, hasRootAsPlayer = false;
12738
12739 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12740 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12741
12742 if (wwtu || foodDecay)
12743 {
12747
12748 if (processWetness || processTemperature || processDecay)
12749 {
12751
12752 if (processWetness)
12753 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12754
12755 if (processTemperature)
12757
12758 if (processDecay)
12759 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12760 }
12761 }
12762 }
12763
12766 {
12768 }
12769
12771 {
12774
12775 return super.GetTemperatureFreezeThreshold();
12776 }
12777
12779 {
12782
12783 return super.GetTemperatureThawThreshold();
12784 }
12785
12787 {
12790
12791 return super.GetItemOverheatThreshold();
12792 }
12793
12795 {
12797 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12798
12799 return super.GetTemperatureFreezeTime();
12800 }
12801
12803 {
12805 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12806
12807 return super.GetTemperatureThawTime();
12808 }
12809
12814
12816 {
12817 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12818 }
12819
12821 {
12822 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12823 }
12824
12827 {
12829 }
12830
12832 {
12834 }
12835
12837 {
12839 }
12840
12843 {
12844 return null;
12845 }
12846
12849 {
12850 return false;
12851 }
12852
12854 {
12856 {
12859 if (!trg)
12860 {
12862 explosive = this;
12863 }
12864
12865 explosive.PairRemote(trg);
12867
12868 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12869 trg.SetPersistentPairID(persistentID);
12870 explosive.SetPersistentPairID(persistentID);
12871
12872 return true;
12873 }
12874 return false;
12875 }
12876
12879 {
12880 float ret = 1.0;
12883 ret *= GetHealth01();
12884
12885 return ret;
12886 }
12887
12888 #ifdef DEVELOPER
12889 override void SetDebugItem()
12890 {
12891 super.SetDebugItem();
12892 _itemBase = this;
12893 }
12894
12896 {
12897 string text = super.GetDebugText();
12898
12900 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12901
12902 return text;
12903 }
12904 #endif
12905
12907 {
12908 return true;
12909 }
12910
12912
12914
12916 {
12919 }
12920
12921
12929
12945}
12946
12948{
12950 if (entity)
12951 {
12952 bool is_item = entity.IsInherited(
ItemBase);
12953 if (is_item && full_quantity)
12954 {
12957 }
12958 }
12959 else
12960 {
12962 return NULL;
12963 }
12964 return entity;
12965}
12966
12968{
12969 if (item)
12970 {
12971 if (health > 0)
12972 item.SetHealth("", "", health);
12973
12974 if (item.CanHaveTemperature())
12975 {
12977 if (item.CanFreeze())
12978 item.SetFrozen(false);
12979 }
12980
12981 if (item.HasEnergyManager())
12982 {
12983 if (quantity >= 0)
12984 {
12985 item.GetCompEM().SetEnergy0To1(quantity);
12986 }
12987 else
12988 {
12990 }
12991 }
12992 else if (item.IsMagazine())
12993 {
12994 Magazine mag = Magazine.Cast(item);
12995 if (quantity >= 0)
12996 {
12997 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12998 }
12999 else
13000 {
13002 }
13003
13004 }
13005 else
13006 {
13007 if (quantity >= 0)
13008 {
13009 item.SetQuantityNormalized(quantity, false);
13010 }
13011 else
13012 {
13014 }
13015
13016 }
13017 }
13018}
13019
13020#ifdef DEVELOPER
13022#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.