8295{
8297 {
8298 return true;
8299 }
8300};
8301
8302
8303
8305{
8309
8311
8314
8315
8316
8317
8318
8327
8333
8338
8343
8364 protected bool m_IsResultOfSplit
8365
8367
8372
8373
8374
8376
8380
8381
8382
8384
8387
8388
8389
8395
8396
8404
8407
8408
8410
8411
8413
8414
8419
8420
8425
8426
8428
8429
8431 {
8436
8437 if (!
GetGame().IsDedicatedServer())
8438 {
8440 {
8442
8444 {
8446 }
8447 }
8448
8451 }
8452
8453 m_OldLocation = null;
8454
8456 {
8458 }
8459
8460 if (ConfigIsExisting("headSelectionsToHide"))
8461 {
8464 }
8465
8467 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8468 {
8470 }
8471
8473
8474 m_IsResultOfSplit = false;
8475
8477 }
8478
8480 {
8481 super.InitItemVariables();
8482
8488 m_Count = ConfigGetInt(
"count");
8489
8492
8497
8500
8505
8517
8521
8522
8525 if (ConfigIsExisting("canBeSplit"))
8526 {
8529 }
8530
8532 if (ConfigIsExisting("itemBehaviour"))
8534
8535
8538 RegisterNetSyncVariableInt("m_VarLiquidType");
8539 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8540
8541 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8542 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8543 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8544
8545 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8546 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8547 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8548 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8549
8550 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8551 RegisterNetSyncVariableBool("m_IsTakeable");
8552 RegisterNetSyncVariableBool("m_IsHologram");
8553
8556 {
8559 }
8560
8562
8564 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8566
8567 }
8568
8570 {
8572 }
8573
8575 {
8578 {
8583 }
8584 }
8585
8586 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8587 {
8589 {
8592 }
8593
8595 }
8596
8598 {
8604 }
8605
8607
8609 {
8611
8612 if (!action)
8613 {
8614 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8615 return;
8616 }
8617
8619 if (!ai)
8620 {
8622 return;
8623 }
8624
8626 if (!action_array)
8627 {
8628 action_array = new array<ActionBase_Basic>;
8630 }
8631 if (LogManager.IsActionLogEnable())
8632 {
8633 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8634 }
8635
8636 if (action_array.Find(action) != -1)
8637 {
8638 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8639 }
8640 else
8641 {
8642 action_array.Insert(action);
8643 }
8644 }
8645
8647 {
8649 ActionBase action = player.GetActionManager().GetAction(actionName);
8652
8653 if (action_array)
8654 {
8655 action_array.RemoveItem(action);
8656 }
8657 }
8658
8659
8660
8662 {
8663 ActionOverrideData overrideData = new ActionOverrideData();
8667
8669 if (!actionMap)
8670 {
8673 }
8674
8675 actionMap.Insert(this.
Type(), overrideData);
8676
8677 }
8678
8680
8682
8683
8685 {
8688
8691
8692 string config_to_search = "CfgVehicles";
8693 string muzzle_owner_config;
8694
8696 {
8697 if (IsInherited(Weapon))
8698 config_to_search = "CfgWeapons";
8699
8700 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8701
8702 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8703
8705
8706 if (config_OnFire_subclass_count > 0)
8707 {
8708 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8709
8710 for (int i = 0; i < config_OnFire_subclass_count; i++)
8711 {
8712 string particle_class = "";
8714 string config_OnFire_entry = config_OnFire_class + particle_class;
8715 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8716 WPOF_array.Insert(WPOF);
8717 }
8718
8719
8721 }
8722 }
8723
8725 {
8726 config_to_search = "CfgWeapons";
8727 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8728
8729 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8730
8732
8733 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8734 {
8735 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8736
8737 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8738 {
8739 string particle_class2 = "";
8741 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8742 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8743 WPOBE_array.Insert(WPOBE);
8744 }
8745
8746
8748 }
8749 }
8750 }
8751
8752
8754 {
8757
8759 {
8760 string config_to_search = "CfgVehicles";
8761
8762 if (IsInherited(Weapon))
8763 config_to_search = "CfgWeapons";
8764
8765 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8766 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8767
8768 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8769 {
8770
8772
8774 {
8776 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8778 return;
8779 }
8780
8783
8784
8785
8787 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8788
8789 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8790 {
8791 string particle_class = "";
8793 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8795
8796 if (entry_type == CT_CLASS)
8797 {
8798 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8799 WPOOH_array.Insert(WPOF);
8800 }
8801 }
8802
8803
8805 }
8806 }
8807 }
8808
8810 {
8812 }
8813
8815 {
8817 {
8819
8822
8825
8826 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8827 }
8828 }
8829
8831 {
8833 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8834
8836 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8837
8839 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8840
8842 {
8844 }
8845 }
8846
8848 {
8850 }
8851
8853 {
8856 else
8858
8860 {
8863 }
8864 else
8865 {
8868
8871 }
8872
8874 }
8875
8877 {
8879 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8880 }
8881
8883 {
8885 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8887 }
8888
8890 {
8892 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8893 }
8894
8896 {
8899
8900 OverheatingParticle OP = new OverheatingParticle();
8905
8907 }
8908
8910 {
8913
8914 return -1;
8915 }
8916
8918 {
8920 {
8923
8924 for (int i = count; i > 0; --i)
8925 {
8926 int id = i - 1;
8929
8932
8933 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8934 {
8935 if (p)
8936 {
8939 }
8940 }
8941 }
8942 }
8943 }
8944
8946 {
8948 {
8950 {
8951 int id = i - 1;
8953
8954 if (OP)
8955 {
8957
8958 if (p)
8959 {
8961 }
8962
8963 delete OP;
8964 }
8965 }
8966
8969 }
8970 }
8971
8974 {
8975 return 0.0;
8976 }
8977
8978
8980 {
8981 return 250;
8982 }
8983
8985 {
8986 return 0;
8987 }
8988
8991 {
8993 return true;
8994
8995 return false;
8996 }
8997
9000 {
9003
9005 {
9007 }
9008 else
9009 {
9010
9012 }
9013
9015 }
9016
9023 {
9024 return -1;
9025 }
9026
9027
9028
9029
9031 {
9033 {
9035 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9036
9037 if (r_index >= 0)
9038 {
9039 InventoryLocation r_il = new InventoryLocation;
9040 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9041
9042 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9045 {
9046 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9047 }
9049 {
9050 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9051 }
9052
9053 }
9054
9055 player.GetHumanInventory().ClearUserReservedLocation(this);
9056 }
9057
9060 }
9061
9062
9063
9064
9066 {
9067 return ItemBase.m_DebugActionsMask;
9068 }
9069
9071 {
9072 return ItemBase.m_DebugActionsMask & mask;
9073 }
9074
9076 {
9077 ItemBase.m_DebugActionsMask = mask;
9078 }
9079
9081 {
9082 ItemBase.m_DebugActionsMask |= mask;
9083 }
9084
9086 {
9087 ItemBase.m_DebugActionsMask &= ~mask;
9088 }
9089
9091 {
9093 {
9095 }
9096 else
9097 {
9099 }
9100 }
9101
9102
9104 {
9105 if (GetEconomyProfile())
9106 {
9107 float q_max = GetEconomyProfile().GetQuantityMax();
9108 if (q_max > 0)
9109 {
9110 float q_min = GetEconomyProfile().GetQuantityMin();
9111 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9112
9114 {
9115 ComponentEnergyManager comp = GetCompEM();
9117 {
9119 }
9120 }
9122 {
9124
9125 }
9126
9127 }
9128 }
9129 }
9130
9133 {
9134 EntityAI parent = GetHierarchyParent();
9135
9136 if (parent)
9137 {
9138 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9139 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9140 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9141 }
9142 }
9143
9146 {
9147 EntityAI parent = GetHierarchyParent();
9148
9149 if (parent)
9150 {
9151 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9152 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9153 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9154 }
9155 }
9156
9158 {
9159
9160
9161
9162
9164
9166 {
9167 if (ScriptInputUserData.CanStoreInputUserData())
9168 {
9169 ScriptInputUserData ctx = new ScriptInputUserData;
9175 ctx.
Write(use_stack_max);
9178
9180 {
9181 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9182 }
9183 }
9184 }
9185 else if (!
GetGame().IsMultiplayer())
9186 {
9188 }
9189 }
9190
9192 {
9194 }
9195
9197 {
9199 }
9200
9202 {
9204 }
9205
9207 {
9208
9209 return false;
9210 }
9211
9213 {
9214 return false;
9215 }
9216
9220 {
9221 return false;
9222 }
9223
9225 {
9226 return "";
9227 }
9228
9230
9232 {
9233 return false;
9234 }
9235
9237 {
9238 return true;
9239 }
9240
9241
9242
9244 {
9245 return true;
9246 }
9247
9249 {
9250 return true;
9251 }
9252
9254 {
9255 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9257 }
9258
9260 {
9262 }
9263
9265 {
9267 if (!is_being_placed)
9269 SetSynchDirty();
9270 }
9271
9272
9274
9276 {
9278 }
9279
9281 {
9283 }
9284
9286 {
9287 return 1;
9288 }
9289
9291 {
9292 return false;
9293 }
9294
9296 {
9298 SetSynchDirty();
9299 }
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9336 {
9337 super.OnMovedInsideCargo(container);
9338
9339 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9340 }
9341
9342 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9343 {
9344 super.EEItemLocationChanged(oldLoc,newLoc);
9345
9346 PlayerBase new_player = null;
9347 PlayerBase old_player = null;
9348
9349 if (newLoc.GetParent())
9350 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9351
9352 if (oldLoc.GetParent())
9353 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9354
9356 {
9357 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9358
9359 if (r_index >= 0)
9360 {
9361 InventoryLocation r_il = new InventoryLocation;
9362 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9363
9364 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9367 {
9368 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9369 }
9371 {
9372 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9373 }
9374
9375 }
9376 }
9377
9379 {
9380 if (new_player)
9381 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9382
9383 if (new_player == old_player)
9384 {
9385
9386 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9387 {
9389 {
9390 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9391 {
9392 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9393 }
9394 }
9395 else
9396 {
9397 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9398 }
9399 }
9400
9401 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9402 {
9403 int type = oldLoc.GetType();
9405 {
9406 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9407 }
9409 {
9410 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9411 }
9412 }
9413 if (!m_OldLocation)
9414 {
9415 m_OldLocation = new InventoryLocation;
9416 }
9417 m_OldLocation.Copy(oldLoc);
9418 }
9419 else
9420 {
9421 if (m_OldLocation)
9422 {
9423 m_OldLocation.Reset();
9424 }
9425 }
9426
9428 }
9429 else
9430 {
9431 if (new_player)
9432 {
9433 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9434 if (res_index >= 0)
9435 {
9436 InventoryLocation il = new InventoryLocation;
9437 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9439 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9442 {
9443 il.
GetParent().GetOnReleaseLock().Invoke(it);
9444 }
9446 {
9448 }
9449
9450 }
9451 }
9453 {
9454
9456 }
9457
9458 if (m_OldLocation)
9459 {
9460 m_OldLocation.Reset();
9461 }
9462 }
9463 }
9464
9465 override void EOnContact(IEntity other, Contact extra)
9466 {
9468 {
9469 int liquidType = -1;
9471 if (impactSpeed > 0.0)
9472 {
9474 #ifndef SERVER
9476 #else
9478 SetSynchDirty();
9479 #endif
9481 }
9482 }
9483
9484 #ifdef SERVER
9485 if (GetCompEM() && GetCompEM().IsPlugged())
9486 {
9487 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9488 GetCompEM().UnplugThis();
9489 }
9490 #endif
9491 }
9492
9494
9496 {
9498 }
9499
9501 {
9502
9503 }
9504
9506 {
9507 super.OnItemLocationChanged(old_owner, new_owner);
9508
9509 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9510 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9511
9512 if (!relatedPlayer && playerNew)
9513 relatedPlayer = playerNew;
9514
9515 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9516 {
9518 if (actionMgr)
9519 {
9520 ActionBase currentAction = actionMgr.GetRunningAction();
9521 if (currentAction)
9523 }
9524 }
9525
9526 Man ownerPlayerOld = null;
9527 Man ownerPlayerNew = null;
9528
9529 if (old_owner)
9530 {
9531 if (old_owner.
IsMan())
9532 {
9533 ownerPlayerOld = Man.Cast(old_owner);
9534 }
9535 else
9536 {
9537 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9538 }
9539 }
9540 else
9541 {
9543 {
9545
9546 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9547 {
9548 GetCompEM().UnplugThis();
9549 }
9550 }
9551 }
9552
9553 if (new_owner)
9554 {
9555 if (new_owner.
IsMan())
9556 {
9557 ownerPlayerNew = Man.Cast(new_owner);
9558 }
9559 else
9560 {
9561 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9562 }
9563 }
9564
9565 if (ownerPlayerOld != ownerPlayerNew)
9566 {
9567 if (ownerPlayerOld)
9568 {
9569 array<EntityAI> subItemsExit = new array<EntityAI>;
9571 for (int i = 0; i < subItemsExit.Count(); i++)
9572 {
9575 }
9576 }
9577
9578 if (ownerPlayerNew)
9579 {
9580 array<EntityAI> subItemsEnter = new array<EntityAI>;
9582 for (int j = 0; j < subItemsEnter.Count(); j++)
9583 {
9586 }
9587 }
9588 }
9589 else if (ownerPlayerNew != null)
9590 {
9591 PlayerBase nplayer;
9592 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9593 {
9594 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9596 for (int k = 0; k < subItemsUpdate.Count(); k++)
9597 {
9599 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9600 }
9601 }
9602 }
9603
9604 if (old_owner)
9605 old_owner.OnChildItemRemoved(this);
9606 if (new_owner)
9607 new_owner.OnChildItemReceived(this);
9608 }
9609
9610
9612 {
9613 super.EEDelete(parent);
9614 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9615 if (player)
9616 {
9618
9619 if (player.IsAlive())
9620 {
9621 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9622 if (r_index >= 0)
9623 {
9624 InventoryLocation r_il = new InventoryLocation;
9625 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9626
9627 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9630 {
9631 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9632 }
9634 {
9635 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9636 }
9637
9638 }
9639
9640 player.RemoveQuickBarEntityShortcut(this);
9641 }
9642 }
9643 }
9644
9646 {
9647 super.EEKilled(killer);
9648
9651 {
9652 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9653 {
9654 if (IsMagazine())
9655 {
9656 if (Magazine.Cast(this).GetAmmoCount() > 0)
9657 {
9659 }
9660 }
9661 else
9662 {
9664 }
9665 }
9666 }
9667 }
9668
9670 {
9671 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9672
9673 super.OnWasAttached(parent, slot_id);
9674
9677
9679 }
9680
9682 {
9683 super.OnWasDetached(parent, slot_id);
9684
9687 }
9688
9690 {
9691 int idx;
9694
9695 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9696 if (inventory_slots.Count() < 1)
9697 {
9698 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9699 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9700 }
9701 else
9702 {
9703 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9704 }
9705
9706 idx = inventory_slots.Find(slot);
9707 if (idx < 0)
9708 return "";
9709
9710 return attach_types.Get(idx);
9711 }
9712
9714 {
9715 int idx = -1;
9716 string slot;
9717
9720
9721 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9722 if (inventory_slots.Count() < 1)
9723 {
9724 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9725 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9726 }
9727 else
9728 {
9729 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9730 if (detach_types.Count() < 1)
9731 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9732 }
9733
9734 for (int i = 0; i < inventory_slots.Count(); i++)
9735 {
9736 slot = inventory_slots.Get(i);
9737 }
9738
9739 if (slot != "")
9740 {
9741 if (detach_types.Count() == 1)
9742 idx = 0;
9743 else
9744 idx = inventory_slots.Find(slot);
9745 }
9746 if (idx < 0)
9747 return "";
9748
9749 return detach_types.Get(idx);
9750 }
9751
9753 {
9754
9756
9757
9758 float min_time = 1;
9759 float max_time = 3;
9760 float delay = Math.RandomFloat(min_time, max_time);
9761
9762 explode_timer.Run(delay, this, "DoAmmoExplosion");
9763 }
9764
9766 {
9767 Magazine magazine = Magazine.Cast(this);
9768 int pop_sounds_count = 6;
9769 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9770
9771
9772 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9773 string sound_name = pop_sounds[ sound_idx ];
9775
9776
9777 magazine.ServerAddAmmoCount(-1);
9778
9779
9780 float min_temp_to_explode = 100;
9781
9782 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9783 {
9785 }
9786 }
9787
9788
9789 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9790 {
9791 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9792
9793 const int CHANCE_DAMAGE_CARGO = 4;
9794 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9795 const int CHANCE_DAMAGE_NOTHING = 2;
9796
9798 {
9799 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9800 int chances;
9801 int rnd;
9802
9803 if (GetInventory().GetCargo())
9804 {
9805 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9806 rnd = Math.RandomInt(0,chances);
9807
9808 if (rnd < CHANCE_DAMAGE_CARGO)
9809 {
9811 }
9812 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9813 {
9815 }
9816 }
9817 else
9818 {
9819 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9820 rnd = Math.RandomInt(0,chances);
9821
9822 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9823 {
9825 }
9826 }
9827 }
9828 }
9829
9831 {
9832 if (GetInventory().GetCargo())
9833 {
9834 int item_count = GetInventory().GetCargo().GetItemCount();
9835 if (item_count > 0)
9836 {
9837 int random_pick = Math.RandomInt(0, item_count);
9839 if (!item.IsExplosive())
9840 {
9841 item.AddHealth("","",damage);
9842 return true;
9843 }
9844 }
9845 }
9846 return false;
9847 }
9848
9850 {
9851 int attachment_count = GetInventory().AttachmentCount();
9852 if (attachment_count > 0)
9853 {
9854 int random_pick = Math.RandomInt(0, attachment_count);
9855 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9856 if (!attachment.IsExplosive())
9857 {
9858 attachment.AddHealth("","",damage);
9859 return true;
9860 }
9861 }
9862 return false;
9863 }
9864
9866 {
9868 }
9869
9871 {
9873 return GetInventory().CanRemoveEntity();
9874
9875 return false;
9876 }
9877
9879 {
9880
9882 return false;
9883
9884
9886 return false;
9887
9888
9889
9891 if (delta == 0)
9892 return false;
9893
9894
9895 return true;
9896 }
9897
9899 {
9901 {
9902 if (ScriptInputUserData.CanStoreInputUserData())
9903 {
9904 ScriptInputUserData ctx = new ScriptInputUserData;
9909 ctx.
Write(destination_entity);
9913 }
9914 }
9915 else if (!
GetGame().IsMultiplayer())
9916 {
9918 }
9919 }
9920
9922 {
9923 float split_quantity_new;
9927 InventoryLocation loc = new InventoryLocation;
9928
9929 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9930 {
9932 split_quantity_new = stack_max;
9933 else
9935
9937 {
9938 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9939 if (new_item)
9940 {
9941 new_item.SetResultOfSplit(true);
9942 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9944 new_item.
SetQuantity(split_quantity_new,
false,
true);
9945 }
9946 }
9947 }
9948 else if (destination_entity && slot_id == -1)
9949 {
9950 if (quantity > stack_max)
9951 split_quantity_new = stack_max;
9952 else
9953 split_quantity_new = quantity;
9954
9956 {
9958 {
9961 }
9962
9963 if (new_item)
9964 {
9965 new_item.SetResultOfSplit(true);
9966 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9968 new_item.
SetQuantity(split_quantity_new,
false,
true);
9969 }
9970 }
9971 }
9972 else
9973 {
9974 if (stack_max != 0)
9975 {
9977 {
9979 }
9980
9981 if (split_quantity_new == 0)
9982 {
9983 if (!
GetGame().IsMultiplayer())
9984 player.PhysicalPredictiveDropItem(this);
9985 else
9986 player.ServerDropEntity(this);
9987 return;
9988 }
9989
9991 {
9993
9994 if (new_item)
9995 {
9996 new_item.SetResultOfSplit(true);
9997 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10000 new_item.PlaceOnSurface();
10001 }
10002 }
10003 }
10004 }
10005 }
10006
10008 {
10009 float split_quantity_new;
10013 InventoryLocation loc = new InventoryLocation;
10014
10015 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10016 {
10018 split_quantity_new = stack_max;
10019 else
10021
10023 {
10024 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10025 if (new_item)
10026 {
10027 new_item.SetResultOfSplit(true);
10028 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10030 new_item.
SetQuantity(split_quantity_new,
false,
true);
10031 }
10032 }
10033 }
10034 else if (destination_entity && slot_id == -1)
10035 {
10036 if (quantity > stack_max)
10037 split_quantity_new = stack_max;
10038 else
10039 split_quantity_new = quantity;
10040
10042 {
10044 {
10047 }
10048
10049 if (new_item)
10050 {
10051 new_item.SetResultOfSplit(true);
10052 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10054 new_item.
SetQuantity(split_quantity_new,
false,
true);
10055 }
10056 }
10057 }
10058 else
10059 {
10060 if (stack_max != 0)
10061 {
10063 {
10065 }
10066
10068 {
10070
10071 if (new_item)
10072 {
10073 new_item.SetResultOfSplit(true);
10074 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10077 new_item.PlaceOnSurface();
10078 }
10079 }
10080 }
10081 }
10082 }
10083
10085 {
10087 {
10088 if (ScriptInputUserData.CanStoreInputUserData())
10089 {
10090 ScriptInputUserData ctx = new ScriptInputUserData;
10095 dst.WriteToContext(ctx);
10097 }
10098 }
10099 else if (!
GetGame().IsMultiplayer())
10100 {
10102 }
10103 }
10104
10106 {
10108 {
10109 if (ScriptInputUserData.CanStoreInputUserData())
10110 {
10111 ScriptInputUserData ctx = new ScriptInputUserData;
10116 ctx.
Write(destination_entity);
10122 }
10123 }
10124 else if (!
GetGame().IsMultiplayer())
10125 {
10127 }
10128 }
10129
10131 {
10133 }
10134
10136 {
10138 float split_quantity_new;
10140 if (dst.IsValid())
10141 {
10142 int slot_id = dst.GetSlot();
10144
10145 if (quantity > stack_max)
10146 split_quantity_new = stack_max;
10147 else
10148 split_quantity_new = quantity;
10149
10151 {
10153
10154 if (new_item)
10155 {
10156 new_item.SetResultOfSplit(true);
10157 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10159 new_item.
SetQuantity(split_quantity_new,
false,
true);
10160 }
10161
10162 return new_item;
10163 }
10164 }
10165
10166 return null;
10167 }
10168
10170 {
10172 float split_quantity_new;
10174 if (destination_entity)
10175 {
10177 if (quantity > stackable)
10178 split_quantity_new = stackable;
10179 else
10180 split_quantity_new = quantity;
10181
10183 {
10184 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10185 if (new_item)
10186 {
10187 new_item.SetResultOfSplit(true);
10188 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10190 new_item.
SetQuantity(split_quantity_new,
false,
true);
10191 }
10192 }
10193 }
10194 }
10195
10197 {
10199 {
10200 if (ScriptInputUserData.CanStoreInputUserData())
10201 {
10202 ScriptInputUserData ctx = new ScriptInputUserData;
10207 ItemBase destination_entity =
this;
10208 ctx.
Write(destination_entity);
10212 }
10213 }
10214 else if (!
GetGame().IsMultiplayer())
10215 {
10217 }
10218 }
10219
10221 {
10223 float split_quantity_new;
10225 if (player)
10226 {
10228 if (quantity > stackable)
10229 split_quantity_new = stackable;
10230 else
10231 split_quantity_new = quantity;
10232
10234 {
10235 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10236 new_item =
ItemBase.Cast(in_hands);
10237 if (new_item)
10238 {
10239 new_item.SetResultOfSplit(true);
10240 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10242 new_item.SetQuantity(split_quantity_new, false, true);
10243 }
10244 }
10245 }
10246 }
10247
10249 {
10251 float split_quantity_new = Math.Floor(quantity * 0.5);
10252
10254 return;
10255
10257
10258 if (new_item)
10259 {
10260 if (new_item.GetQuantityMax() < split_quantity_new)
10261 {
10262 split_quantity_new = new_item.GetQuantityMax();
10263 }
10264
10265 new_item.SetResultOfSplit(true);
10266 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10267
10269 {
10272 }
10273 else
10274 {
10276 new_item.
SetQuantity(split_quantity_new,
false,
true);
10277 }
10278 }
10279 }
10280
10282 {
10284 float split_quantity_new = Math.Floor(quantity / 2);
10285
10287 return;
10288
10289 InventoryLocation invloc = new InventoryLocation;
10291
10293 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10294
10295 if (new_item)
10296 {
10297 if (new_item.GetQuantityMax() < split_quantity_new)
10298 {
10299 split_quantity_new = new_item.GetQuantityMax();
10300 }
10302 {
10305 }
10306 else if (split_quantity_new > 1)
10307 {
10309 new_item.
SetQuantity(split_quantity_new,
false,
true);
10310 }
10311 }
10312 }
10313
10316 {
10317 SetWeightDirty();
10319
10320 if (parent)
10321 parent.OnAttachmentQuantityChangedEx(this, delta);
10322
10324 {
10326 {
10328 }
10330 {
10331 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10333 }
10334 }
10335
10336 }
10337
10340 {
10341
10342 }
10343
10346 {
10348 }
10349
10351 {
10352 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10353
10355 {
10356 if (newLevel == GameConstants.STATE_RUINED)
10357 {
10359 EntityAI parent = GetHierarchyParent();
10360 if (parent && parent.IsFireplace())
10361 {
10362 CargoBase cargo = GetInventory().GetCargo();
10363 if (cargo)
10364 {
10366 {
10368 }
10369 }
10370 }
10371 }
10372
10374 {
10375
10377 return;
10378 }
10379
10380 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10381 {
10383 }
10384 }
10385 }
10386
10387
10389 {
10390 super.OnRightClick();
10391
10393 {
10395 {
10396 if (ScriptInputUserData.CanStoreInputUserData())
10397 {
10398 EntityAI root = GetHierarchyRoot();
10399 Man playerOwner = GetHierarchyRootPlayer();
10400 InventoryLocation dst = new InventoryLocation;
10401
10402
10403 if (!playerOwner && root && root == this)
10404 {
10406 }
10407 else
10408 {
10409
10410 GetInventory().GetCurrentInventoryLocation(dst);
10412 {
10415 {
10417 }
10418 else
10419 {
10421
10422
10423 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10424 {
10426 }
10427 else
10428 {
10429 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10430 }
10431 }
10432 }
10433 }
10434
10435 ScriptInputUserData ctx = new ScriptInputUserData;
10443 }
10444 }
10445 else if (!
GetGame().IsMultiplayer())
10446 {
10448 }
10449 }
10450 }
10451
10453 {
10454 if (root)
10455 {
10456 vector m4[4];
10457 root.GetTransform(m4);
10458 dst.SetGround(this, m4);
10459 }
10460 else
10461 {
10462 GetInventory().GetCurrentInventoryLocation(dst);
10463 }
10464 }
10465
10466 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10467 {
10468
10469 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10470 return false;
10471
10472 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10473 return false;
10474
10475
10477 return false;
10478
10479
10480 Magazine mag = Magazine.Cast(this);
10481 if (mag)
10482 {
10483 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10484 return false;
10485
10486 if (stack_max_limit)
10487 {
10488 Magazine other_mag = Magazine.Cast(other_item);
10489 if (other_item)
10490 {
10491 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10492 return false;
10493 }
10494
10495 }
10496 }
10497 else
10498 {
10499
10501 return false;
10502
10504 return false;
10505 }
10506
10507 PlayerBase player = null;
10508 if (CastTo(player, GetHierarchyRootPlayer()))
10509 {
10510 if (player.GetInventory().HasAttachment(this))
10511 return false;
10512
10513 if (player.IsItemsToDelete())
10514 return false;
10515 }
10516
10517 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10518 return false;
10519
10520 int slotID;
10522 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10523 return false;
10524
10525 return true;
10526 }
10527
10529 {
10531 }
10532
10534 {
10535 return m_IsResultOfSplit;
10536 }
10537
10539 {
10540 m_IsResultOfSplit = value;
10541 }
10542
10544 {
10546 }
10547
10549 {
10550 float other_item_quantity = other_item.GetQuantity();
10551 float this_free_space;
10552
10554
10556
10557 if (other_item_quantity > this_free_space)
10558 {
10559 return this_free_space;
10560 }
10561 else
10562 {
10563 return other_item_quantity;
10564 }
10565 }
10566
10568 {
10570 }
10571
10573 {
10575 return;
10576
10577 if (!IsMagazine() && other_item)
10578 {
10580 if (quantity_used != 0)
10581 {
10582 float hp1 = GetHealth01("","");
10583 float hp2 = other_item.GetHealth01("","");
10584 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10585 hpResult = hpResult / (
GetQuantity() + quantity_used);
10586
10587 hpResult *= GetMaxHealth();
10588 Math.Round(hpResult);
10589 SetHealth("", "Health", hpResult);
10590
10592 other_item.AddQuantity(-quantity_used);
10593 }
10594 }
10596 }
10597
10599 {
10600 #ifdef SERVER
10601 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10602 GetHierarchyParent().IncreaseLifetimeUp();
10603 #endif
10604 };
10605
10607 {
10608 PlayerBase p = PlayerBase.Cast(player);
10609
10610 array<int> recipesIds = p.m_Recipes;
10611 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10612 if (moduleRecipesManager)
10613 {
10614 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10615 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10616 }
10617
10618 for (int i = 0;i < recipesIds.Count(); i++)
10619 {
10620 int key = recipesIds.Get(i);
10621 string recipeName = moduleRecipesManager.GetRecipeName(key);
10623 }
10624 }
10625
10626
10627 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10628 {
10629 super.GetDebugActions(outputList);
10630
10631
10637
10638
10643
10648
10649
10653
10654
10656 {
10660 }
10661
10664
10665
10669
10671
10672 InventoryLocation loc = new InventoryLocation();
10673 GetInventory().GetCurrentInventoryLocation(loc);
10675 {
10676 if (Gizmo_IsSupported())
10679 }
10680
10682 }
10683
10684
10685
10686
10688 {
10689 super.OnAction(action_id, player, ctx);
10690
10692 {
10693 switch (action_id)
10694 {
10697 return true;
10700 return true;
10701 }
10702 }
10703
10705 {
10706 switch (action_id)
10707 {
10709 Delete();
10710 return true;
10711 }
10712 }
10713
10714 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10715 {
10716 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10717 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10718 PlayerBase p = PlayerBase.Cast(player);
10719 if (
EActions.RECIPES_RANGE_START < 1000)
10720 {
10721 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10722 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10723 }
10724 }
10725 #ifndef SERVER
10726 else if (action_id ==
EActions.WATCH_PLAYER)
10727 {
10728 PluginDeveloper.SetDeveloperItemClientEx(player);
10729 }
10730 #endif
10732 {
10733 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10734 {
10735 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10736 OnDebugButtonPressServer(id + 1);
10737 }
10738
10739 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10740 {
10741 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10743 }
10744
10745 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10746 {
10747 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10749 }
10750
10751 else if (action_id ==
EActions.ADD_QUANTITY)
10752 {
10753 if (IsMagazine())
10754 {
10755 Magazine mag = Magazine.Cast(this);
10756 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10757 }
10758 else
10759 {
10761 }
10762
10763 if (m_EM)
10764 {
10765 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10766 }
10767
10768 }
10769
10770 else if (action_id ==
EActions.REMOVE_QUANTITY)
10771 {
10772 if (IsMagazine())
10773 {
10774 Magazine mag2 = Magazine.Cast(this);
10775 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10776 }
10777 else
10778 {
10780 }
10781 if (m_EM)
10782 {
10783 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10784 }
10785
10786 }
10787
10788 else if (action_id ==
EActions.SET_QUANTITY_0)
10789 {
10791
10792 if (m_EM)
10793 {
10794 m_EM.SetEnergy(0);
10795 }
10796 }
10797
10798 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10799 {
10801
10802 if (m_EM)
10803 {
10804 m_EM.SetEnergy(m_EM.GetEnergyMax());
10805 }
10806 }
10807
10808 else if (action_id ==
EActions.ADD_HEALTH)
10809 {
10810 AddHealth("","",GetMaxHealth("","Health")/5);
10811 }
10812 else if (action_id ==
EActions.REMOVE_HEALTH)
10813 {
10814 AddHealth("","",-GetMaxHealth("","Health")/5);
10815 }
10816 else if (action_id ==
EActions.DESTROY_HEALTH)
10817 {
10818 SetHealth01("","",0);
10819 }
10820 else if (action_id ==
EActions.WATCH_ITEM)
10821 {
10823 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10824 #ifdef DEVELOPER
10825 SetDebugDeveloper_item(this);
10826 #endif
10827 }
10828
10829 else if (action_id ==
EActions.ADD_TEMPERATURE)
10830 {
10831 AddTemperature(20);
10832
10833 }
10834
10835 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10836 {
10837 AddTemperature(-20);
10838
10839 }
10840
10841 else if (action_id ==
EActions.FLIP_FROZEN)
10842 {
10843 SetFrozen(!GetIsFrozen());
10844
10845 }
10846
10847 else if (action_id ==
EActions.ADD_WETNESS)
10848 {
10850
10851 }
10852
10853 else if (action_id ==
EActions.REMOVE_WETNESS)
10854 {
10856
10857 }
10858
10859 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10860 {
10863
10864
10865 }
10866
10867 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10868 {
10871 }
10872
10873 else if (action_id ==
EActions.MAKE_SPECIAL)
10874 {
10875 auto debugParams = DebugSpawnParams.WithPlayer(player);
10876 OnDebugSpawnEx(debugParams);
10877 }
10878
10879 }
10880
10881
10882 return false;
10883 }
10884
10885
10886
10887
10891
10894
10895
10896
10898 {
10899 return false;
10900 }
10901
10902
10904 {
10905 return true;
10906 }
10907
10908
10910 {
10911 return true;
10912 }
10913
10914
10915
10917 {
10918 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10920 }
10921
10924 {
10925 return null;
10926 }
10927
10929 {
10930 return false;
10931 }
10932
10934 {
10935 return false;
10936 }
10937
10941
10942
10944 {
10945 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10946 return module_repairing.CanRepair(this, item_repair_kit);
10947 }
10948
10949
10950 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10951 {
10952 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10953 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10954 }
10955
10956
10958 {
10959
10960
10961
10962
10963
10964
10965
10966
10967 return 1;
10968 }
10969
10970
10971
10973 {
10975 }
10976
10977
10978
10980 {
10982 }
10983
10984
10993 {
10994 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10995
10996 if (player)
10997 {
10998 player.MessageStatus(text);
10999 }
11000 }
11001
11002
11011 {
11012 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11013
11014 if (player)
11015 {
11016 player.MessageAction(text);
11017 }
11018 }
11019
11020
11029 {
11030 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11031
11032 if (player)
11033 {
11034 player.MessageFriendly(text);
11035 }
11036 }
11037
11038
11047 {
11048 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11049
11050 if (player)
11051 {
11052 player.MessageImportant(text);
11053 }
11054 }
11055
11057 {
11058 return true;
11059 }
11060
11061
11062 override bool KindOf(
string tag)
11063 {
11064 bool found = false;
11065 string item_name = this.
GetType();
11068
11069 int array_size = item_tag_array.Count();
11070 for (int i = 0; i < array_size; i++)
11071 {
11072 if (item_tag_array.Get(i) == tag)
11073 {
11074 found = true;
11075 break;
11076 }
11077 }
11078 return found;
11079 }
11080
11081
11083 {
11084
11085 super.OnRPC(sender, rpc_type,ctx);
11086
11087
11088 switch (rpc_type)
11089 {
11090 #ifndef SERVER
11091 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11092 Param2<bool, string> p = new Param2<bool, string>(false, "");
11093
11095 return;
11096
11097 bool play = p.param1;
11098 string soundSet = p.param2;
11099
11100 if (play)
11101 {
11103 {
11105 {
11107 }
11108 }
11109 else
11110 {
11112 }
11113 }
11114 else
11115 {
11117 }
11118
11119 break;
11120 #endif
11121
11122 }
11123
11125 {
11127 }
11128 }
11129
11130
11131
11132
11134 {
11135 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11136 return plugin.GetID(
name);
11137 }
11138
11140 {
11141 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11142 return plugin.GetName(id);
11143 }
11144
11147 {
11148
11149
11150 int varFlags;
11151 if (!ctx.
Read(varFlags))
11152 return;
11153
11154 if (varFlags & ItemVariableFlags.FLOAT)
11155 {
11157 }
11158 }
11159
11161 {
11162
11163 super.SerializeNumericalVars(floats_out);
11164
11165
11166
11168 {
11170 }
11171
11173 {
11175 }
11176
11178 {
11180 }
11181
11183 {
11188 }
11189
11191 {
11193 }
11194 }
11195
11197 {
11198
11199 super.DeSerializeNumericalVars(floats);
11200
11201
11202 int index = 0;
11203 int mask = Math.Round(floats.Get(index));
11204
11205 index++;
11206
11208 {
11210 {
11212 }
11213 else
11214 {
11215 float quantity = floats.Get(index);
11216 SetQuantity(quantity,
true,
false,
false,
false);
11217 }
11218 index++;
11219 }
11220
11222 {
11223 float wet = floats.Get(index);
11225 index++;
11226 }
11227
11229 {
11230 int liquidtype = Math.Round(floats.Get(index));
11232 index++;
11233 }
11234
11236 {
11238 index++;
11240 index++;
11242 index++;
11244 index++;
11245 }
11246
11248 {
11249 int cleanness = Math.Round(floats.Get(index));
11251 index++;
11252 }
11253 }
11254
11256 {
11257 super.WriteVarsToCTX(ctx);
11258
11259
11261 {
11263 }
11264
11266 {
11268 }
11269
11271 {
11273 }
11274
11276 {
11277 int r,g,b,a;
11283 }
11284
11286 {
11288 }
11289 }
11290
11292 {
11293 if (!super.ReadVarsFromCTX(ctx,version))
11294 return false;
11295
11296 int intValue;
11297 float value;
11298
11299 if (version < 140)
11300 {
11301 if (!ctx.
Read(intValue))
11302 return false;
11303
11304 m_VariablesMask = intValue;
11305 }
11306
11308 {
11309 if (!ctx.
Read(value))
11310 return false;
11311
11313 {
11315 }
11316 else
11317 {
11319 }
11320 }
11321
11322 if (version < 140)
11323 {
11325 {
11326 if (!ctx.
Read(value))
11327 return false;
11328 SetTemperatureDirect(value);
11329 }
11330 }
11331
11333 {
11334 if (!ctx.
Read(value))
11335 return false;
11337 }
11338
11340 {
11341 if (!ctx.
Read(intValue))
11342 return false;
11344 }
11345
11347 {
11348 int r,g,b,a;
11350 return false;
11352 return false;
11354 return false;
11356 return false;
11357
11359 }
11360
11362 {
11363 if (!ctx.
Read(intValue))
11364 return false;
11366 }
11367
11368 if (version >= 138 && version < 140)
11369 {
11371 {
11372 if (!ctx.
Read(intValue))
11373 return false;
11374 SetFrozen(intValue);
11375 }
11376 }
11377
11378 return true;
11379 }
11380
11381
11383 {
11386 {
11388 }
11389
11390 if (!super.OnStoreLoad(ctx, version))
11391 {
11393 return false;
11394 }
11395
11396 if (version >= 114)
11397 {
11398 bool hasQuickBarIndexSaved;
11399
11400 if (!ctx.
Read(hasQuickBarIndexSaved))
11401 {
11403 return false;
11404 }
11405
11406 if (hasQuickBarIndexSaved)
11407 {
11408 int itmQBIndex;
11409
11410
11411 if (!ctx.
Read(itmQBIndex))
11412 {
11414 return false;
11415 }
11416
11417 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11418 if (itmQBIndex != -1 && parentPlayer)
11419 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11420 }
11421 }
11422 else
11423 {
11424
11425 PlayerBase player;
11426 int itemQBIndex;
11427 if (version ==
int.
MAX)
11428 {
11429 if (!ctx.
Read(itemQBIndex))
11430 {
11432 return false;
11433 }
11434 }
11435 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11436 {
11437
11438 if (!ctx.
Read(itemQBIndex))
11439 {
11441 return false;
11442 }
11443 if (itemQBIndex != -1 && player)
11444 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11445 }
11446 }
11447
11448 if (version < 140)
11449 {
11450
11451 if (!LoadVariables(ctx, version))
11452 {
11454 return false;
11455 }
11456 }
11457
11458
11460 {
11462 return false;
11463 }
11464 if (version >= 132)
11465 {
11467 if (raib)
11468 {
11470 {
11472 return false;
11473 }
11474 }
11475 }
11476
11478 return true;
11479 }
11480
11481
11482
11484 {
11485 super.OnStoreSave(ctx);
11486
11487 PlayerBase player;
11488 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11489 {
11491
11492 int itemQBIndex = -1;
11493 itemQBIndex = player.FindQuickBarEntityIndex(this);
11494 ctx.
Write(itemQBIndex);
11495 }
11496 else
11497 {
11499 }
11500
11502
11504 if (raib)
11505 {
11507 }
11508 }
11509
11510
11512 {
11513 super.AfterStoreLoad();
11514
11516 {
11518 }
11519
11521 {
11524 }
11525 }
11526
11528 {
11529 super.EEOnAfterLoad();
11530
11532 {
11534 }
11535
11538 }
11539
11541 {
11542 return false;
11543 }
11544
11545
11546
11548 {
11550 {
11551 #ifdef PLATFORM_CONSOLE
11552
11554 {
11556 if (menu)
11557 {
11559 }
11560 }
11561 #endif
11562 }
11563
11565 {
11568 }
11569
11571 {
11572 SetWeightDirty();
11574 }
11576 {
11579 }
11580
11582 {
11585 }
11587 {
11590 }
11591
11592 super.OnVariablesSynchronized();
11593 }
11594
11595
11596
11598 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11599 {
11600 if (!IsServerCheck(allow_client))
11601 return false;
11602
11604 return false;
11605
11608
11609 if (value <= (min + 0.001))
11610 value = min;
11611
11612 if (value == min)
11613 {
11614 if (destroy_config)
11615 {
11616 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11617 if (dstr)
11618 {
11620 this.Delete();
11621 return true;
11622 }
11623 }
11624 else if (destroy_forced)
11625 {
11627 this.Delete();
11628 return true;
11629 }
11630
11632 }
11633
11636
11638 {
11640
11641 if (delta)
11643 }
11644
11646
11647 return false;
11648 }
11649
11650
11652 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11653 {
11655 }
11656
11658 {
11661 }
11662
11664 {
11667 }
11668
11670 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11671 {
11672 float value_clamped = Math.Clamp(value, 0, 1);
11674 SetQuantity(result, destroy_config, destroy_forced);
11675 }
11676
11677
11680 {
11682 }
11683
11685 {
11687 }
11688
11689
11690
11691
11692
11693
11694
11695
11696
11697
11699 {
11700 int slot = -1;
11701 if (GetInventory())
11702 {
11703 InventoryLocation il = new InventoryLocation;
11704 GetInventory().GetCurrentInventoryLocation(il);
11706 }
11707
11709 }
11710
11712 {
11713 float quantity_max = 0;
11714
11716 {
11717 if (attSlotID != -1)
11718 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11719
11720 if (quantity_max <= 0)
11722 }
11723
11724 if (quantity_max <= 0)
11726
11727 return quantity_max;
11728 }
11729
11731 {
11733 }
11734
11736 {
11738 }
11739
11740
11742 {
11744 }
11745
11747 {
11749 }
11750
11752 {
11754 }
11755
11756
11758 {
11759
11760 float weightEx = GetWeightEx();
11761 float special = GetInventoryAndCargoWeight();
11762 return weightEx - special;
11763 }
11764
11765
11767 {
11769 }
11770
11772 {
11774 {
11775 #ifdef DEVELOPER
11776 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11777 {
11778 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11780 }
11781 #endif
11782
11783 return GetQuantity() * GetConfigWeightModified();
11784 }
11785 else if (HasEnergyManager())
11786 {
11787 #ifdef DEVELOPER
11788 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11789 {
11790 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11791 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11792 }
11793 #endif
11794 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11795 }
11796 else
11797 {
11798 #ifdef DEVELOPER
11799 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11800 {
11801 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11802 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11803 }
11804 #endif
11805 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11806 }
11807 }
11808
11811 {
11812 int item_count = 0;
11814
11815 if (GetInventory().GetCargo() != NULL)
11816 {
11817 item_count = GetInventory().GetCargo().GetItemCount();
11818 }
11819
11820 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11821 {
11822 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11823 if (item)
11824 item_count += item.GetNumberOfItems();
11825 }
11826 return item_count;
11827 }
11828
11831 {
11832 float weight = 0;
11833 float wetness = 1;
11834 if (include_wetness)
11837 {
11838 weight = wetness * m_ConfigWeight;
11839 }
11841 {
11842 weight = 1;
11843 }
11844 return weight;
11845 }
11846
11847
11848
11850 {
11851 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11852 {
11853 GameInventory inv = GetInventory();
11854 array<EntityAI> items = new array<EntityAI>;
11856 for (int i = 0; i < items.Count(); i++)
11857 {
11859 if (item)
11860 {
11862 }
11863 }
11864 }
11865 }
11866
11867
11868
11869
11871 {
11872 float energy = 0;
11873 if (HasEnergyManager())
11874 {
11875 energy = GetCompEM().GetEnergy();
11876 }
11877 return energy;
11878 }
11879
11880
11882 {
11883 super.OnEnergyConsumed();
11884
11886 }
11887
11889 {
11890 super.OnEnergyAdded();
11891
11893 }
11894
11895
11897 {
11898 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11899 {
11901 {
11902 float energy_0to1 = GetCompEM().GetEnergy0To1();
11904 }
11905 }
11906 }
11907
11908
11910 {
11911 return ConfigGetFloat("heatIsolation");
11912 }
11913
11915 {
11917 }
11918
11920 {
11921 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11922 if (
GetGame().ConfigIsExisting(paramPath))
11924
11925 return 0.0;
11926 }
11927
11929 {
11930 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11931 if (
GetGame().ConfigIsExisting(paramPath))
11933
11934 return 0.0;
11935 }
11936
11937 override void SetWet(
float value,
bool allow_client =
false)
11938 {
11939 if (!IsServerCheck(allow_client))
11940 return;
11941
11944
11946
11947 m_VarWet = Math.Clamp(value, min, max);
11948
11950 {
11953 }
11954 }
11955
11956 override void AddWet(
float value)
11957 {
11959 }
11960
11962 {
11964 }
11965
11967 {
11969 }
11970
11972 {
11974 }
11975
11977 {
11979 }
11980
11982 {
11984 }
11985
11986 override void OnWetChanged(
float newVal,
float oldVal)
11987 {
11990 if (newLevel != oldLevel)
11991 {
11993 }
11994 }
11995
11997 {
11998 SetWeightDirty();
11999 }
12000
12002 {
12003 return GetWetLevelInternal(
m_VarWet);
12004 }
12005
12006
12007
12009 {
12011 }
12012
12014 {
12016 }
12017
12019 {
12021 }
12022
12024 {
12026 }
12027
12028
12029
12031 {
12032 if (ConfigIsExisting("itemModelLength"))
12033 {
12034 return ConfigGetFloat("itemModelLength");
12035 }
12036 return 0;
12037 }
12038
12040 {
12041 if (ConfigIsExisting("itemAttachOffset"))
12042 {
12043 return ConfigGetFloat("itemAttachOffset");
12044 }
12045 return 0;
12046 }
12047
12048 override void SetCleanness(
int value,
bool allow_client =
false)
12049 {
12050 if (!IsServerCheck(allow_client))
12051 return;
12052
12054
12056
12059 }
12060
12062 {
12064 }
12065
12067 {
12068 return true;
12069 }
12070
12071
12072
12073
12075 {
12077 }
12078
12080 {
12082 }
12083
12084
12085
12086
12087 override void SetColor(
int r,
int g,
int b,
int a)
12088 {
12094 }
12096 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12097 {
12102 }
12103
12105 {
12107 }
12108
12111 {
12112 int r,g,b,a;
12114 r = r/255;
12115 g = g/255;
12116 b = b/255;
12117 a = a/255;
12118 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12119 }
12120
12121
12122
12123 override void SetLiquidType(
int value,
bool allow_client =
false)
12124 {
12125 if (!IsServerCheck(allow_client))
12126 return;
12127
12132 }
12133
12135 {
12136 return ConfigGetInt("varLiquidTypeInit");
12137 }
12138
12140 {
12142 }
12143
12145 {
12147 SetFrozen(false);
12148 }
12149
12152 {
12153 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12154 }
12155
12156
12159 {
12160 PlayerBase nplayer;
12161 if (PlayerBase.CastTo(nplayer, player))
12162 {
12164
12165 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12166 }
12167 }
12168
12169
12172 {
12173 PlayerBase nplayer;
12174 if (PlayerBase.CastTo(nplayer,player))
12175 {
12176
12177 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12178
12179 }
12180
12181
12182 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12183
12184
12185 if (HasEnergyManager())
12186 {
12187 GetCompEM().UpdatePlugState();
12188 }
12189 }
12190
12191
12193 {
12194 super.OnPlacementStarted(player);
12195
12197 }
12198
12199 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12200 {
12202 {
12203 m_AdminLog.OnPlacementComplete(player,
this);
12204 }
12205
12206 super.OnPlacementComplete(player, position, orientation);
12207 }
12208
12209
12210
12211
12212
12214 {
12216 {
12217 return true;
12218 }
12219 else
12220 {
12221 return false;
12222 }
12223 }
12224
12225
12227 {
12229 {
12231 }
12232 }
12233
12234
12236 {
12238 }
12239
12241 {
12243 }
12244
12245 override void InsertAgent(
int agent,
float count = 1)
12246 {
12247 if (count < 1)
12248 return;
12249
12251 }
12252
12255 {
12257 }
12258
12259
12261 {
12263 }
12264
12265
12266
12267
12268
12269
12270
12271
12272
12273
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12293
12294
12295
12296
12297
12298
12299
12300
12301
12302
12303
12304
12305
12307 {
12309 return false;
12310 return true;
12311 }
12312
12314 {
12315
12317 }
12318
12319
12322 {
12323 super.CheckForRoofLimited(timeTresholdMS);
12324
12326 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12327 {
12328 m_PreviousRoofTestTime = time;
12329 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12330 }
12331 }
12332
12333
12335 {
12337 {
12338 return 0;
12339 }
12340
12341 if (GetInventory().GetAttachmentSlotsCount() != 0)
12342 {
12343 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12344 if (filter)
12345 return filter.GetProtectionLevel(type, false, system);
12346 else
12347 return 0;
12348 }
12349
12350 string subclassPath, entryName;
12351
12352 switch (type)
12353 {
12355 entryName = "biological";
12356 break;
12358 entryName = "chemical";
12359 break;
12360 default:
12361 entryName = "biological";
12362 break;
12363 }
12364
12365 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12366
12368 }
12369
12370
12371
12374 {
12375 if (!IsMagazine())
12377
12379 }
12380
12381
12382
12383
12384
12389 {
12390 return true;
12391 }
12392
12394 {
12396 }
12397
12398
12399
12400
12401
12403 {
12404 if (parent)
12405 {
12406 if (parent.IsInherited(DayZInfected))
12407 return true;
12408
12409 if (!parent.IsRuined())
12410 return true;
12411 }
12412
12413 return true;
12414 }
12415
12417 {
12418 if (!super.CanPutAsAttachment(parent))
12419 {
12420 return false;
12421 }
12422
12423 if (!IsRuined() && !parent.IsRuined())
12424 {
12425 return true;
12426 }
12427
12428 return false;
12429 }
12430
12432 {
12433
12434
12435
12436
12437 return super.CanReceiveItemIntoCargo(item);
12438 }
12439
12441 {
12442
12443
12444
12445
12446 GameInventory attachmentInv = attachment.GetInventory();
12448 {
12449 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12450 return false;
12451 }
12452
12453 InventoryLocation loc = new InventoryLocation();
12454 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12455 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12456 return false;
12457
12458 return super.CanReceiveAttachment(attachment, slotId);
12459 }
12460
12462 {
12463 if (!super.CanReleaseAttachment(attachment))
12464 return false;
12465
12466 return GetInventory().AreChildrenAccessible();
12467 }
12468
12469
12470
12471
12472
12473
12474
12475
12476
12477
12478
12479
12480
12481
12482
12483
12484
12485
12486
12487
12488
12490 {
12491 int id = muzzle_owner.GetMuzzleID();
12492 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12493
12494 if (WPOF_array)
12495 {
12496 for (int i = 0; i < WPOF_array.Count(); i++)
12497 {
12498 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12499
12500 if (WPOF)
12501 {
12502 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12503 }
12504 }
12505 }
12506 }
12507
12508
12510 {
12511 int id = muzzle_owner.GetMuzzleID();
12513
12514 if (WPOBE_array)
12515 {
12516 for (int i = 0; i < WPOBE_array.Count(); i++)
12517 {
12518 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12519
12520 if (WPOBE)
12521 {
12522 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12523 }
12524 }
12525 }
12526 }
12527
12528
12530 {
12531 int id = muzzle_owner.GetMuzzleID();
12532 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12533
12534 if (WPOOH_array)
12535 {
12536 for (int i = 0; i < WPOOH_array.Count(); i++)
12537 {
12538 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12539
12540 if (WPOOH)
12541 {
12542 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12543 }
12544 }
12545 }
12546 }
12547
12548
12550 {
12551 int id = muzzle_owner.GetMuzzleID();
12552 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12553
12554 if (WPOOH_array)
12555 {
12556 for (int i = 0; i < WPOOH_array.Count(); i++)
12557 {
12558 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12559
12560 if (WPOOH)
12561 {
12562 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12563 }
12564 }
12565 }
12566 }
12567
12568
12570 {
12571 int id = muzzle_owner.GetMuzzleID();
12572 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12573
12574 if (WPOOH_array)
12575 {
12576 for (int i = 0; i < WPOOH_array.Count(); i++)
12577 {
12578 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12579
12580 if (WPOOH)
12581 {
12582 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12583 }
12584 }
12585 }
12586 }
12587
12588
12589
12591 {
12593 {
12594 return true;
12595 }
12596
12597 return false;
12598 }
12599
12601 {
12603 {
12604 return true;
12605 }
12606
12607 return false;
12608 }
12609
12611 {
12613 {
12614 return true;
12615 }
12616
12617 return false;
12618 }
12619
12621 {
12622 return false;
12623 }
12624
12627 {
12628 return UATimeSpent.DEFAULT_DEPLOY;
12629 }
12630
12631
12632
12633
12635 {
12637 SetSynchDirty();
12638 }
12639
12641 {
12643 }
12644
12645
12647 {
12648 return false;
12649 }
12650
12653 {
12654 string att_type = "None";
12655
12656 if (ConfigIsExisting("soundAttType"))
12657 {
12658 att_type = ConfigGetString("soundAttType");
12659 }
12660
12662 }
12663
12665 {
12667 }
12668
12669
12670
12671
12672
12678
12680 {
12683
12685 }
12686
12687
12689 {
12691 return;
12692
12694
12697
12700
12701 SoundParameters params = new SoundParameters();
12705 }
12706
12707
12709 {
12711 return;
12712
12714 SetSynchDirty();
12715
12718 }
12719
12720
12722 {
12724 return;
12725
12727 SetSynchDirty();
12728
12731 }
12732
12734 {
12736 }
12737
12739 {
12741 }
12742
12745 {
12746 if (!
GetGame().IsDedicatedServer())
12747 {
12748 if (ConfigIsExisting("attachSoundSet"))
12749 {
12750 string cfg_path = "";
12751 string soundset = "";
12752 string type_name =
GetType();
12753
12756 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12757 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12758
12759 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12760 {
12761 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12762 {
12763 if (cfg_slot_array[i] == slot_type)
12764 {
12765 soundset = cfg_soundset_array[i];
12766 break;
12767 }
12768 }
12769 }
12770
12771 if (soundset != "")
12772 {
12773 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12775 }
12776 }
12777 }
12778 }
12779
12781 {
12782
12783 }
12784
12785 void OnApply(PlayerBase player);
12786
12788 {
12789 return 1.0;
12790 };
12791
12793 {
12795 }
12796
12798 {
12800 }
12801
12803
12805 {
12806 SetDynamicPhysicsLifeTime(0.01);
12808 }
12809
12811 {
12812 array<string> zone_names = new array<string>;
12813 GetDamageZones(zone_names);
12814 for (int i = 0; i < zone_names.Count(); i++)
12815 {
12816 SetHealthMax(zone_names.Get(i),"Health");
12817 }
12818 SetHealthMax("","Health");
12819 }
12820
12823 {
12824 float global_health = GetHealth01("","Health");
12825 array<string> zones = new array<string>;
12826 GetDamageZones(zones);
12827
12828 for (int i = 0; i < zones.Count(); i++)
12829 {
12830 SetHealth01(zones.Get(i),"Health",global_health);
12831 }
12832 }
12833
12836 {
12837 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12838 }
12839
12841 {
12842 if (!hasRootAsPlayer)
12843 {
12844 if (refParentIB)
12845 {
12846
12847 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12848 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12849
12850 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12851 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12852
12855 }
12856 else
12857 {
12858
12861 }
12862 }
12863 }
12864
12866 {
12868 {
12869 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12870 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12871 {
12872 float heatPermCoef = 1.0;
12874 while (ent)
12875 {
12876 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12877 ent = ent.GetHierarchyParent();
12878 }
12879
12880 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12881 }
12882 }
12883 }
12884
12886 {
12887
12888 EntityAI parent = GetHierarchyParent();
12889 if (!parent)
12890 {
12891 hasParent = false;
12892 hasRootAsPlayer = false;
12893 }
12894 else
12895 {
12896 hasParent = true;
12897 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12898 refParentIB =
ItemBase.Cast(parent);
12899 }
12900 }
12901
12902 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12903 {
12904
12905 }
12906
12908 {
12909
12910 return false;
12911 }
12912
12914 {
12915
12916
12917 return false;
12918 }
12919
12921 {
12922
12923 return false;
12924 }
12925
12928 {
12929 return !GetIsFrozen() &&
IsOpen();
12930 }
12931
12933 {
12934 bool hasParent = false, hasRootAsPlayer = false;
12936
12937 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12938 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12939
12940 if (wwtu || foodDecay)
12941 {
12945
12946 if (processWetness || processTemperature || processDecay)
12947 {
12949
12950 if (processWetness)
12951 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12952
12953 if (processTemperature)
12955
12956 if (processDecay)
12957 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12958 }
12959 }
12960 }
12961
12964 {
12966 }
12967
12969 {
12972
12973 return super.GetTemperatureFreezeThreshold();
12974 }
12975
12977 {
12980
12981 return super.GetTemperatureThawThreshold();
12982 }
12983
12985 {
12988
12989 return super.GetItemOverheatThreshold();
12990 }
12991
12993 {
12995 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12996
12997 return super.GetTemperatureFreezeTime();
12998 }
12999
13001 {
13003 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13004
13005 return super.GetTemperatureThawTime();
13006 }
13007
13012
13014 {
13015 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13016 }
13017
13019 {
13020 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13021 }
13022
13025 {
13027 }
13028
13030 {
13032 }
13033
13035 {
13037 }
13038
13041 {
13042 return null;
13043 }
13044
13047 {
13048 return false;
13049 }
13050
13052 {
13054 {
13057 if (!trg)
13058 {
13060 explosive = this;
13061 }
13062
13063 explosive.PairRemote(trg);
13065
13066 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13067 trg.SetPersistentPairID(persistentID);
13068 explosive.SetPersistentPairID(persistentID);
13069
13070 return true;
13071 }
13072 return false;
13073 }
13074
13077 {
13078 float ret = 1.0;
13081 ret *= GetHealth01();
13082
13083 return ret;
13084 }
13085
13086 #ifdef DEVELOPER
13087 override void SetDebugItem()
13088 {
13089 super.SetDebugItem();
13090 _itemBase = this;
13091 }
13092
13094 {
13095 string text = super.GetDebugText();
13096
13098 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13099
13100 return text;
13101 }
13102 #endif
13103
13105 {
13106 return true;
13107 }
13108
13110
13112
13114 {
13117 }
13118
13119
13127
13143}
13144
13146{
13148 if (entity)
13149 {
13150 bool is_item = entity.IsInherited(
ItemBase);
13151 if (is_item && full_quantity)
13152 {
13155 }
13156 }
13157 else
13158 {
13160 return NULL;
13161 }
13162 return entity;
13163}
13164
13166{
13167 if (item)
13168 {
13169 if (health > 0)
13170 item.SetHealth("", "", health);
13171
13172 if (item.CanHaveTemperature())
13173 {
13175 if (item.CanFreeze())
13176 item.SetFrozen(false);
13177 }
13178
13179 if (item.HasEnergyManager())
13180 {
13181 if (quantity >= 0)
13182 {
13183 item.GetCompEM().SetEnergy0To1(quantity);
13184 }
13185 else
13186 {
13188 }
13189 }
13190 else if (item.IsMagazine())
13191 {
13192 Magazine mag = Magazine.Cast(item);
13193 if (quantity >= 0)
13194 {
13195 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13196 }
13197 else
13198 {
13200 }
13201
13202 }
13203 else
13204 {
13205 if (quantity >= 0)
13206 {
13207 item.SetQuantityNormalized(quantity, false);
13208 }
13209 else
13210 {
13212 }
13213
13214 }
13215 }
13216}
13217
13218#ifdef DEVELOPER
13220#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
Open
Implementations only.
override void EEOnCECreate()
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 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)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
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 void GizmoSelectObject(Object object)
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 native void GizmoSelectPhysics(Physics physics)
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
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto 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.