8349{
8351 {
8352 return true;
8353 }
8354};
8355
8356
8357
8359{
8363
8365
8368
8369
8370
8371
8372
8381
8387
8392
8397
8418 protected bool m_IsResultOfSplit
8419
8421
8426
8427
8428
8430
8434
8435
8436
8438
8441
8442
8443
8449
8450
8458
8461
8462
8464
8465
8467
8468
8473
8474
8479
8480
8482
8483
8485 {
8490
8491 if (!
GetGame().IsDedicatedServer())
8492 {
8494 {
8496
8498 {
8500 }
8501 }
8502
8505 }
8506
8507 m_OldLocation = null;
8508
8510 {
8512 }
8513
8514 if (ConfigIsExisting("headSelectionsToHide"))
8515 {
8518 }
8519
8521 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8522 {
8524 }
8525
8527
8528 m_IsResultOfSplit = false;
8529
8531 }
8532
8534 {
8535 super.InitItemVariables();
8536
8542 m_Count = ConfigGetInt(
"count");
8543
8546
8551
8554
8559
8571
8575
8576
8579 if (ConfigIsExisting("canBeSplit"))
8580 {
8583 }
8584
8586 if (ConfigIsExisting("itemBehaviour"))
8588
8589
8592 RegisterNetSyncVariableInt("m_VarLiquidType");
8593 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8594
8595 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8596 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8597 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8598
8599 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8600 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8601 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8602 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8603
8604 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8605 RegisterNetSyncVariableBool("m_IsTakeable");
8606 RegisterNetSyncVariableBool("m_IsHologram");
8607
8610 {
8613 }
8614
8616
8618 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8620
8621 }
8622
8624 {
8626 }
8627
8629 {
8632 {
8637 }
8638 }
8639
8640 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8641 {
8643 {
8646 }
8647
8649 }
8650
8652 {
8658 }
8659
8661
8663 {
8665
8666 if (!action)
8667 {
8668 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8669 return;
8670 }
8671
8673 if (!ai)
8674 {
8676 return;
8677 }
8678
8680 if (!action_array)
8681 {
8682 action_array = new array<ActionBase_Basic>;
8684 }
8685 if (LogManager.IsActionLogEnable())
8686 {
8687 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8688 }
8689
8690 if (action_array.Find(action) != -1)
8691 {
8692 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8693 }
8694 else
8695 {
8696 action_array.Insert(action);
8697 }
8698 }
8699
8701 {
8703 ActionBase action = player.GetActionManager().GetAction(actionName);
8706
8707 if (action_array)
8708 {
8709 action_array.RemoveItem(action);
8710 }
8711 }
8712
8713
8714
8716 {
8717 ActionOverrideData overrideData = new ActionOverrideData();
8721
8723 if (!actionMap)
8724 {
8727 }
8728
8729 actionMap.Insert(this.
Type(), overrideData);
8730
8731 }
8732
8734
8736
8737
8739 {
8742
8745
8746 string config_to_search = "CfgVehicles";
8747 string muzzle_owner_config;
8748
8750 {
8751 if (IsInherited(Weapon))
8752 config_to_search = "CfgWeapons";
8753
8754 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8755
8756 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8757
8759
8760 if (config_OnFire_subclass_count > 0)
8761 {
8762 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8763
8764 for (int i = 0; i < config_OnFire_subclass_count; i++)
8765 {
8766 string particle_class = "";
8768 string config_OnFire_entry = config_OnFire_class + particle_class;
8769 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8770 WPOF_array.Insert(WPOF);
8771 }
8772
8773
8775 }
8776 }
8777
8779 {
8780 config_to_search = "CfgWeapons";
8781 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8782
8783 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8784
8786
8787 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8788 {
8789 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8790
8791 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8792 {
8793 string particle_class2 = "";
8795 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8796 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8797 WPOBE_array.Insert(WPOBE);
8798 }
8799
8800
8802 }
8803 }
8804 }
8805
8806
8808 {
8811
8813 {
8814 string config_to_search = "CfgVehicles";
8815
8816 if (IsInherited(Weapon))
8817 config_to_search = "CfgWeapons";
8818
8819 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8820 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8821
8822 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8823 {
8824
8826
8828 {
8830 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8832 return;
8833 }
8834
8837
8838
8839
8841 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8842
8843 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8844 {
8845 string particle_class = "";
8847 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8849
8850 if (entry_type == CT_CLASS)
8851 {
8852 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8853 WPOOH_array.Insert(WPOF);
8854 }
8855 }
8856
8857
8859 }
8860 }
8861 }
8862
8864 {
8866 }
8867
8869 {
8871 {
8873
8876
8879
8880 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8881 }
8882 }
8883
8885 {
8887 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8888
8890 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8891
8893 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8894
8896 {
8898 }
8899 }
8900
8902 {
8904 }
8905
8907 {
8910 else
8912
8914 {
8917 }
8918 else
8919 {
8922
8925 }
8926
8928 }
8929
8931 {
8933 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8934 }
8935
8937 {
8939 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8941 }
8942
8944 {
8946 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8947 }
8948
8950 {
8953
8954 OverheatingParticle OP = new OverheatingParticle();
8959
8961 }
8962
8964 {
8967
8968 return -1;
8969 }
8970
8972 {
8974 {
8977
8978 for (int i = count; i > 0; --i)
8979 {
8980 int id = i - 1;
8983
8986
8987 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8988 {
8989 if (p)
8990 {
8993 }
8994 }
8995 }
8996 }
8997 }
8998
9000 {
9002 {
9004 {
9005 int id = i - 1;
9007
9008 if (OP)
9009 {
9011
9012 if (p)
9013 {
9015 }
9016
9017 delete OP;
9018 }
9019 }
9020
9023 }
9024 }
9025
9028 {
9029 return 0.0;
9030 }
9031
9032
9034 {
9035 return 250;
9036 }
9037
9039 {
9040 return 0;
9041 }
9042
9045 {
9047 return true;
9048
9049 return false;
9050 }
9051
9054 {
9057
9059 {
9061 }
9062 else
9063 {
9064
9066 }
9067
9069 }
9070
9077 {
9078 return -1;
9079 }
9080
9081
9082
9083
9085 {
9087 {
9089 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9090
9091 if (r_index >= 0)
9092 {
9093 InventoryLocation r_il = new InventoryLocation;
9094 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9095
9096 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9099 {
9100 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9101 }
9103 {
9104 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9105 }
9106
9107 }
9108
9109 player.GetHumanInventory().ClearUserReservedLocation(this);
9110 }
9111
9114 }
9115
9116
9117
9118
9120 {
9121 return ItemBase.m_DebugActionsMask;
9122 }
9123
9125 {
9126 return ItemBase.m_DebugActionsMask & mask;
9127 }
9128
9130 {
9131 ItemBase.m_DebugActionsMask = mask;
9132 }
9133
9135 {
9136 ItemBase.m_DebugActionsMask |= mask;
9137 }
9138
9140 {
9141 ItemBase.m_DebugActionsMask &= ~mask;
9142 }
9143
9145 {
9147 {
9149 }
9150 else
9151 {
9153 }
9154 }
9155
9156
9158 {
9159 if (GetEconomyProfile())
9160 {
9161 float q_max = GetEconomyProfile().GetQuantityMax();
9162 if (q_max > 0)
9163 {
9164 float q_min = GetEconomyProfile().GetQuantityMin();
9165 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9166
9168 {
9169 ComponentEnergyManager comp = GetCompEM();
9171 {
9173 }
9174 }
9176 {
9178
9179 }
9180
9181 }
9182 }
9183 }
9184
9187 {
9188 EntityAI parent = GetHierarchyParent();
9189
9190 if (parent)
9191 {
9192 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9193 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9194 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9195 }
9196 }
9197
9200 {
9201 EntityAI parent = GetHierarchyParent();
9202
9203 if (parent)
9204 {
9205 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9206 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9207 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9208 }
9209 }
9210
9212 {
9213
9214
9215
9216
9218
9220 {
9221 if (ScriptInputUserData.CanStoreInputUserData())
9222 {
9223 ScriptInputUserData ctx = new ScriptInputUserData;
9229 ctx.
Write(use_stack_max);
9232
9234 {
9235 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9236 }
9237 }
9238 }
9239 else if (!
GetGame().IsMultiplayer())
9240 {
9242 }
9243 }
9244
9246 {
9248 }
9249
9251 {
9253 }
9254
9256 {
9258 }
9259
9261 {
9262
9263 return false;
9264 }
9265
9267 {
9268 return false;
9269 }
9270
9274 {
9275 return false;
9276 }
9277
9279 {
9280 return "";
9281 }
9282
9284
9286 {
9287 return false;
9288 }
9289
9291 {
9292 return true;
9293 }
9294
9295
9296
9298 {
9299 return true;
9300 }
9301
9303 {
9304 return true;
9305 }
9306
9308 {
9309 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9311 }
9312
9314 {
9316 }
9317
9319 {
9321 if (!is_being_placed)
9323 SetSynchDirty();
9324 }
9325
9326
9328
9330 {
9332 }
9333
9335 {
9337 }
9338
9340 {
9341 return 1;
9342 }
9343
9345 {
9346 return false;
9347 }
9348
9350 {
9352 SetSynchDirty();
9353 }
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9375
9376
9377
9378
9379
9380
9381
9382
9383
9384
9385
9386
9387
9388
9390 {
9391 super.OnMovedInsideCargo(container);
9392
9393 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9394 }
9395
9396 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9397 {
9398 super.EEItemLocationChanged(oldLoc,newLoc);
9399
9400 PlayerBase new_player = null;
9401 PlayerBase old_player = null;
9402
9403 if (newLoc.GetParent())
9404 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9405
9406 if (oldLoc.GetParent())
9407 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9408
9410 {
9411 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9412
9413 if (r_index >= 0)
9414 {
9415 InventoryLocation r_il = new InventoryLocation;
9416 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9417
9418 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9421 {
9422 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9423 }
9425 {
9426 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9427 }
9428
9429 }
9430 }
9431
9433 {
9434 if (new_player)
9435 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9436
9437 if (new_player == old_player)
9438 {
9439
9440 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9441 {
9443 {
9444 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9445 {
9446 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9447 }
9448 }
9449 else
9450 {
9451 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9452 }
9453 }
9454
9455 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9456 {
9457 int type = oldLoc.GetType();
9459 {
9460 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9461 }
9463 {
9464 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9465 }
9466 }
9467 if (!m_OldLocation)
9468 {
9469 m_OldLocation = new InventoryLocation;
9470 }
9471 m_OldLocation.Copy(oldLoc);
9472 }
9473 else
9474 {
9475 if (m_OldLocation)
9476 {
9477 m_OldLocation.Reset();
9478 }
9479 }
9480
9482 }
9483 else
9484 {
9485 if (new_player)
9486 {
9487 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9488 if (res_index >= 0)
9489 {
9490 InventoryLocation il = new InventoryLocation;
9491 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9493 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9496 {
9497 il.
GetParent().GetOnReleaseLock().Invoke(it);
9498 }
9500 {
9502 }
9503
9504 }
9505 }
9507 {
9508
9510 }
9511
9512 if (m_OldLocation)
9513 {
9514 m_OldLocation.Reset();
9515 }
9516 }
9517 }
9518
9519 override void EOnContact(IEntity other, Contact extra)
9520 {
9522 {
9523 int liquidType = -1;
9525 if (impactSpeed > 0.0)
9526 {
9528 #ifndef SERVER
9530 #else
9532 SetSynchDirty();
9533 #endif
9535 }
9536 }
9537
9538 #ifdef SERVER
9539 if (GetCompEM() && GetCompEM().IsPlugged())
9540 {
9541 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9542 GetCompEM().UnplugThis();
9543 }
9544 #endif
9545 }
9546
9548
9550 {
9552 }
9553
9555 {
9556
9557 }
9558
9560 {
9561 super.OnItemLocationChanged(old_owner, new_owner);
9562
9563 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9564 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9565
9566 if (!relatedPlayer && playerNew)
9567 relatedPlayer = playerNew;
9568
9569 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9570 {
9572 if (actionMgr)
9573 {
9574 ActionBase currentAction = actionMgr.GetRunningAction();
9575 if (currentAction)
9577 }
9578 }
9579
9580 Man ownerPlayerOld = null;
9581 Man ownerPlayerNew = null;
9582
9583 if (old_owner)
9584 {
9585 if (old_owner.
IsMan())
9586 {
9587 ownerPlayerOld = Man.Cast(old_owner);
9588 }
9589 else
9590 {
9591 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9592 }
9593 }
9594 else
9595 {
9597 {
9599
9600 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9601 {
9602 GetCompEM().UnplugThis();
9603 }
9604 }
9605 }
9606
9607 if (new_owner)
9608 {
9609 if (new_owner.
IsMan())
9610 {
9611 ownerPlayerNew = Man.Cast(new_owner);
9612 }
9613 else
9614 {
9615 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9616 }
9617 }
9618
9619 if (ownerPlayerOld != ownerPlayerNew)
9620 {
9621 if (ownerPlayerOld)
9622 {
9623 array<EntityAI> subItemsExit = new array<EntityAI>;
9625 for (int i = 0; i < subItemsExit.Count(); i++)
9626 {
9629 }
9630 }
9631
9632 if (ownerPlayerNew)
9633 {
9634 array<EntityAI> subItemsEnter = new array<EntityAI>;
9636 for (int j = 0; j < subItemsEnter.Count(); j++)
9637 {
9640 }
9641 }
9642 }
9643 else if (ownerPlayerNew != null)
9644 {
9645 PlayerBase nplayer;
9646 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9647 {
9648 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9650 for (int k = 0; k < subItemsUpdate.Count(); k++)
9651 {
9653 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9654 }
9655 }
9656 }
9657
9658 if (old_owner)
9659 old_owner.OnChildItemRemoved(this);
9660 if (new_owner)
9661 new_owner.OnChildItemReceived(this);
9662 }
9663
9664
9666 {
9667 super.EEDelete(parent);
9668 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9669 if (player)
9670 {
9672
9673 if (player.IsAlive())
9674 {
9675 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9676 if (r_index >= 0)
9677 {
9678 InventoryLocation r_il = new InventoryLocation;
9679 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9680
9681 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9684 {
9685 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9686 }
9688 {
9689 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9690 }
9691
9692 }
9693
9694 player.RemoveQuickBarEntityShortcut(this);
9695 }
9696 }
9697 }
9698
9700 {
9701 super.EEKilled(killer);
9702
9705 {
9706 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9707 {
9708 if (IsMagazine())
9709 {
9710 if (Magazine.Cast(this).GetAmmoCount() > 0)
9711 {
9713 }
9714 }
9715 else
9716 {
9718 }
9719 }
9720 }
9721 }
9722
9724 {
9725 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9726
9727 super.OnWasAttached(parent, slot_id);
9728
9731
9733 }
9734
9736 {
9737 super.OnWasDetached(parent, slot_id);
9738
9741 }
9742
9744 {
9745 int idx;
9748
9749 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9750 if (inventory_slots.Count() < 1)
9751 {
9752 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9753 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9754 }
9755 else
9756 {
9757 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9758 }
9759
9760 idx = inventory_slots.Find(slot);
9761 if (idx < 0)
9762 return "";
9763
9764 return attach_types.Get(idx);
9765 }
9766
9768 {
9769 int idx = -1;
9770 string slot;
9771
9774
9775 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9776 if (inventory_slots.Count() < 1)
9777 {
9778 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9779 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9780 }
9781 else
9782 {
9783 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9784 if (detach_types.Count() < 1)
9785 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9786 }
9787
9788 for (int i = 0; i < inventory_slots.Count(); i++)
9789 {
9790 slot = inventory_slots.Get(i);
9791 }
9792
9793 if (slot != "")
9794 {
9795 if (detach_types.Count() == 1)
9796 idx = 0;
9797 else
9798 idx = inventory_slots.Find(slot);
9799 }
9800 if (idx < 0)
9801 return "";
9802
9803 return detach_types.Get(idx);
9804 }
9805
9807 {
9808
9810
9811
9812 float min_time = 1;
9813 float max_time = 3;
9814 float delay = Math.RandomFloat(min_time, max_time);
9815
9816 explode_timer.Run(delay, this, "DoAmmoExplosion");
9817 }
9818
9820 {
9821 Magazine magazine = Magazine.Cast(this);
9822 int pop_sounds_count = 6;
9823 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9824
9825
9826 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9827 string sound_name = pop_sounds[ sound_idx ];
9829
9830
9831 magazine.ServerAddAmmoCount(-1);
9832
9833
9834 float min_temp_to_explode = 100;
9835
9836 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9837 {
9839 }
9840 }
9841
9842
9843 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9844 {
9845 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9846
9847 const int CHANCE_DAMAGE_CARGO = 4;
9848 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9849 const int CHANCE_DAMAGE_NOTHING = 2;
9850
9852 {
9853 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9854 int chances;
9855 int rnd;
9856
9857 if (GetInventory().GetCargo())
9858 {
9859 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9860 rnd = Math.RandomInt(0,chances);
9861
9862 if (rnd < CHANCE_DAMAGE_CARGO)
9863 {
9865 }
9866 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9867 {
9869 }
9870 }
9871 else
9872 {
9873 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9874 rnd = Math.RandomInt(0,chances);
9875
9876 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9877 {
9879 }
9880 }
9881 }
9882 }
9883
9885 {
9886 if (GetInventory().GetCargo())
9887 {
9888 int item_count = GetInventory().GetCargo().GetItemCount();
9889 if (item_count > 0)
9890 {
9891 int random_pick = Math.RandomInt(0, item_count);
9893 if (!item.IsExplosive())
9894 {
9895 item.AddHealth("","",damage);
9896 return true;
9897 }
9898 }
9899 }
9900 return false;
9901 }
9902
9904 {
9905 int attachment_count = GetInventory().AttachmentCount();
9906 if (attachment_count > 0)
9907 {
9908 int random_pick = Math.RandomInt(0, attachment_count);
9909 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9910 if (!attachment.IsExplosive())
9911 {
9912 attachment.AddHealth("","",damage);
9913 return true;
9914 }
9915 }
9916 return false;
9917 }
9918
9920 {
9922 }
9923
9925 {
9927 return GetInventory().CanRemoveEntity();
9928
9929 return false;
9930 }
9931
9933 {
9935 return;
9936
9938 {
9939 if (ScriptInputUserData.CanStoreInputUserData())
9940 {
9941 ScriptInputUserData ctx = new ScriptInputUserData;
9946 ctx.
Write(destination_entity);
9950 }
9951 }
9952 else if (!
GetGame().IsMultiplayer())
9953 {
9955 }
9956 }
9957
9959 {
9961 return;
9962
9963 float split_quantity_new;
9967 InventoryLocation loc = new InventoryLocation;
9968
9969 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9970 {
9972 split_quantity_new = stack_max;
9973 else
9975
9976 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9977 if (new_item)
9978 {
9979 new_item.SetResultOfSplit(true);
9980 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9982 new_item.SetQuantity(split_quantity_new);
9983 }
9984 }
9985 else if (destination_entity && slot_id == -1)
9986 {
9987 if (quantity > stack_max)
9988 split_quantity_new = stack_max;
9989 else
9990 split_quantity_new = quantity;
9991
9993 {
9996 }
9997
9998 if (new_item)
9999 {
10000 new_item.SetResultOfSplit(true);
10001 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10003 new_item.SetQuantity(split_quantity_new);
10004 }
10005 }
10006 else
10007 {
10008 if (stack_max != 0)
10009 {
10011 {
10013 }
10014
10015 if (split_quantity_new == 0)
10016 {
10017 if (!
GetGame().IsMultiplayer())
10018 player.PhysicalPredictiveDropItem(this);
10019 else
10020 player.ServerDropEntity(this);
10021 return;
10022 }
10023
10025
10026 if (new_item)
10027 {
10028 new_item.SetResultOfSplit(true);
10029 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10031 new_item.SetQuantity(stack_max);
10032 new_item.PlaceOnSurface();
10033 }
10034 }
10035 }
10036 }
10037
10039 {
10041 return;
10042
10043 float split_quantity_new;
10047 InventoryLocation loc = new InventoryLocation;
10048
10049 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10050 {
10052 split_quantity_new = stack_max;
10053 else
10055
10056 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10057 if (new_item)
10058 {
10059 new_item.SetResultOfSplit(true);
10060 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10062 new_item.SetQuantity(split_quantity_new);
10063 }
10064 }
10065 else if (destination_entity && slot_id == -1)
10066 {
10067 if (quantity > stack_max)
10068 split_quantity_new = stack_max;
10069 else
10070 split_quantity_new = quantity;
10071
10073 {
10076 }
10077
10078 if (new_item)
10079 {
10080 new_item.SetResultOfSplit(true);
10081 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10083 new_item.SetQuantity(split_quantity_new);
10084 }
10085 }
10086 else
10087 {
10088 if (stack_max != 0)
10089 {
10091 {
10093 }
10094
10096
10097 if (new_item)
10098 {
10099 new_item.SetResultOfSplit(true);
10100 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10102 new_item.SetQuantity(stack_max);
10103 new_item.PlaceOnSurface();
10104 }
10105 }
10106 }
10107 }
10108
10110 {
10112 return;
10113
10115 {
10116 if (ScriptInputUserData.CanStoreInputUserData())
10117 {
10118 ScriptInputUserData ctx = new ScriptInputUserData;
10123 dst.WriteToContext(ctx);
10125 }
10126 }
10127 else if (!
GetGame().IsMultiplayer())
10128 {
10130 }
10131 }
10132
10134 {
10136 return;
10137
10139 {
10140 if (ScriptInputUserData.CanStoreInputUserData())
10141 {
10142 ScriptInputUserData ctx = new ScriptInputUserData;
10147 ctx.
Write(destination_entity);
10153 }
10154 }
10155 else if (!
GetGame().IsMultiplayer())
10156 {
10158 }
10159 }
10160
10162 {
10164 }
10165
10167 {
10169 return this;
10170
10172 float split_quantity_new;
10174 if (dst.IsValid())
10175 {
10176 int slot_id = dst.GetSlot();
10178
10179 if (quantity > stack_max)
10180 split_quantity_new = stack_max;
10181 else
10182 split_quantity_new = quantity;
10183
10185
10186 if (new_item)
10187 {
10188 new_item.SetResultOfSplit(true);
10189 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10192 }
10193
10194 return new_item;
10195 }
10196
10197 return null;
10198 }
10199
10201 {
10203 return;
10204
10206 float split_quantity_new;
10208 if (destination_entity)
10209 {
10211 if (quantity > stackable)
10212 split_quantity_new = stackable;
10213 else
10214 split_quantity_new = quantity;
10215
10216 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10217 if (new_item)
10218 {
10219 new_item.SetResultOfSplit(true);
10220 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10222 new_item.SetQuantity(split_quantity_new);
10223 }
10224 }
10225 }
10226
10228 {
10230 return;
10231
10233 {
10234 if (ScriptInputUserData.CanStoreInputUserData())
10235 {
10236 ScriptInputUserData ctx = new ScriptInputUserData;
10241 ItemBase destination_entity =
this;
10242 ctx.
Write(destination_entity);
10246 }
10247 }
10248 else if (!
GetGame().IsMultiplayer())
10249 {
10251 }
10252 }
10253
10255 {
10257 return;
10258
10260 float split_quantity_new;
10262 if (player)
10263 {
10265 if (quantity > stackable)
10266 split_quantity_new = stackable;
10267 else
10268 split_quantity_new = quantity;
10269
10270 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10271 new_item =
ItemBase.Cast(in_hands);
10272 if (new_item)
10273 {
10274 new_item.SetResultOfSplit(true);
10275 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10277 new_item.SetQuantity(split_quantity_new);
10278 }
10279 }
10280 }
10281
10283 {
10285 return;
10286
10288 float split_quantity_new = Math.Floor(quantity * 0.5);
10289
10291
10292 if (new_item)
10293 {
10294 if (new_item.GetQuantityMax() < split_quantity_new)
10295 {
10296 split_quantity_new = new_item.GetQuantityMax();
10297 }
10298
10299 new_item.SetResultOfSplit(true);
10300 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10301
10303 {
10306 }
10307 else
10308 {
10311 }
10312 }
10313 }
10314
10316 {
10318 return;
10319
10321 float split_quantity_new = Math.Floor(quantity / 2);
10322
10323 InventoryLocation invloc = new InventoryLocation;
10325
10327 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10328
10329 if (new_item)
10330 {
10331 if (new_item.GetQuantityMax() < split_quantity_new)
10332 {
10333 split_quantity_new = new_item.GetQuantityMax();
10334 }
10336 {
10339 }
10340 else
10341 {
10344 }
10345 }
10346 }
10347
10350 {
10351 SetWeightDirty();
10353
10354 if (parent)
10355 parent.OnAttachmentQuantityChangedEx(this, delta);
10356
10358 {
10360 {
10362 }
10364 {
10365 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10367 }
10368 }
10369
10370 }
10371
10374 {
10375
10376 }
10377
10380 {
10382 }
10383
10385 {
10386 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10387
10389 {
10390 if (newLevel == GameConstants.STATE_RUINED)
10391 {
10393 EntityAI parent = GetHierarchyParent();
10394 if (parent && parent.IsFireplace())
10395 {
10396 CargoBase cargo = GetInventory().GetCargo();
10397 if (cargo)
10398 {
10400 {
10402 }
10403 }
10404 }
10405 }
10406
10408 {
10409
10411 return;
10412 }
10413
10414 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10415 {
10417 }
10418 }
10419 }
10420
10421
10423 {
10424 super.OnRightClick();
10425
10427 {
10429 {
10430 if (ScriptInputUserData.CanStoreInputUserData())
10431 {
10432 vector m4[4];
10434
10435 EntityAI root = GetHierarchyRoot();
10436
10437 InventoryLocation dst = new InventoryLocation;
10439 {
10440 if (root)
10441 {
10442 root.GetTransform(m4);
10444 }
10445 else
10446 GetInventory().GetCurrentInventoryLocation(dst);
10447 }
10448 else
10449 {
10451
10452
10453 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10454 {
10455 if (root)
10456 {
10457 root.GetTransform(m4);
10459 }
10460 else
10461 GetInventory().GetCurrentInventoryLocation(dst);
10462 }
10463 else
10464 {
10465 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10466 }
10467 }
10468
10469 ScriptInputUserData ctx = new ScriptInputUserData;
10477 }
10478 }
10479 else if (!
GetGame().IsMultiplayer())
10480 {
10482 }
10483 }
10484 }
10485
10486 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10487 {
10488
10489 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10490 return false;
10491
10492 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10493 return false;
10494
10495
10497 return false;
10498
10499
10500 Magazine mag = Magazine.Cast(this);
10501 if (mag)
10502 {
10503 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10504 return false;
10505
10506 if (stack_max_limit)
10507 {
10508 Magazine other_mag = Magazine.Cast(other_item);
10509 if (other_item)
10510 {
10511 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10512 return false;
10513 }
10514
10515 }
10516 }
10517 else
10518 {
10519
10521 return false;
10522
10524 return false;
10525 }
10526
10527 PlayerBase player = null;
10528 if (CastTo(player, GetHierarchyRootPlayer()))
10529 {
10530 if (player.GetInventory().HasAttachment(this))
10531 return false;
10532
10533 if (player.IsItemsToDelete())
10534 return false;
10535 }
10536
10537 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10538 return false;
10539
10540 int slotID;
10542 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10543 return false;
10544
10545 return true;
10546 }
10547
10549 {
10551 }
10552
10554 {
10555 return m_IsResultOfSplit;
10556 }
10557
10559 {
10560 m_IsResultOfSplit = value;
10561 }
10562
10564 {
10566 }
10567
10569 {
10570 float other_item_quantity = other_item.GetQuantity();
10571 float this_free_space;
10572
10574
10576
10577 if (other_item_quantity > this_free_space)
10578 {
10579 return this_free_space;
10580 }
10581 else
10582 {
10583 return other_item_quantity;
10584 }
10585 }
10586
10588 {
10590 }
10591
10593 {
10595 return;
10596
10597 if (!IsMagazine() && other_item)
10598 {
10600 if (quantity_used != 0)
10601 {
10602 float hp1 = GetHealth01("","");
10603 float hp2 = other_item.GetHealth01("","");
10604 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10605 hpResult = hpResult / (
GetQuantity() + quantity_used);
10606
10607 hpResult *= GetMaxHealth();
10608 Math.Round(hpResult);
10609 SetHealth("", "Health", hpResult);
10610
10612 other_item.AddQuantity(-quantity_used);
10613 }
10614 }
10616 }
10617
10619 {
10620 #ifdef SERVER
10621 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10622 GetHierarchyParent().IncreaseLifetimeUp();
10623 #endif
10624 };
10625
10627 {
10628 PlayerBase p = PlayerBase.Cast(player);
10629
10630 array<int> recipesIds = p.m_Recipes;
10631 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10632 if (moduleRecipesManager)
10633 {
10634 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10635 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10636 }
10637
10638 for (int i = 0;i < recipesIds.Count(); i++)
10639 {
10640 int key = recipesIds.Get(i);
10641 string recipeName = moduleRecipesManager.GetRecipeName(key);
10643 }
10644 }
10645
10646
10647 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10648 {
10649 super.GetDebugActions(outputList);
10650
10651
10656
10657
10661
10665
10666
10669
10670
10672 {
10675 }
10676
10678
10681
10685 }
10686
10687
10688
10689
10691 {
10692 super.OnAction(action_id, player, ctx);
10693 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10694 {
10695 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10696 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10697 PlayerBase p = PlayerBase.Cast(player);
10698 if (
EActions.RECIPES_RANGE_START < 1000)
10699 {
10700 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10701 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10702 }
10703 }
10704 #ifndef SERVER
10705 else if (action_id ==
EActions.WATCH_PLAYER)
10706 {
10707 PluginDeveloper.SetDeveloperItemClientEx(player);
10708 }
10709 #endif
10711 {
10712 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10713 {
10714 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10715 OnDebugButtonPressServer(id + 1);
10716 }
10717
10718 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10719 {
10720 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10722 }
10723
10724 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10725 {
10726 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10728 }
10729
10730 else if (action_id ==
EActions.ADD_QUANTITY)
10731 {
10732 if (IsMagazine())
10733 {
10734 Magazine mag = Magazine.Cast(this);
10735 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10736 }
10737 else
10738 {
10740 }
10741
10742 if (m_EM)
10743 {
10744 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10745 }
10746
10747 }
10748
10749 else if (action_id ==
EActions.REMOVE_QUANTITY)
10750 {
10751 if (IsMagazine())
10752 {
10753 Magazine mag2 = Magazine.Cast(this);
10754 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10755 }
10756 else
10757 {
10759 }
10760 if (m_EM)
10761 {
10762 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10763 }
10764
10765 }
10766
10767 else if (action_id ==
EActions.SET_QUANTITY_0)
10768 {
10770
10771 if (m_EM)
10772 {
10773 m_EM.SetEnergy(0);
10774 }
10775 }
10776
10777 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10778 {
10780
10781 if (m_EM)
10782 {
10783 m_EM.SetEnergy(m_EM.GetEnergyMax());
10784 }
10785 }
10786
10787 else if (action_id ==
EActions.ADD_HEALTH)
10788 {
10789 AddHealth("","",GetMaxHealth("","Health")/5);
10790 }
10791 else if (action_id ==
EActions.REMOVE_HEALTH)
10792 {
10793 AddHealth("","",-GetMaxHealth("","Health")/5);
10794 }
10795 else if (action_id ==
EActions.DESTROY_HEALTH)
10796 {
10797 SetHealth01("","",0);
10798 }
10799 else if (action_id ==
EActions.WATCH_ITEM)
10800 {
10802 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10803 #ifdef DEVELOPER
10804 SetDebugDeveloper_item(this);
10805 #endif
10806 }
10807
10808 else if (action_id ==
EActions.ADD_TEMPERATURE)
10809 {
10810 AddTemperature(20);
10811
10812 }
10813
10814 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10815 {
10816 AddTemperature(-20);
10817
10818 }
10819
10820 else if (action_id ==
EActions.FLIP_FROZEN)
10821 {
10822 SetFrozen(!GetIsFrozen());
10823
10824 }
10825
10826 else if (action_id ==
EActions.ADD_WETNESS)
10827 {
10829
10830 }
10831
10832 else if (action_id ==
EActions.REMOVE_WETNESS)
10833 {
10835
10836 }
10837
10838 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10839 {
10842
10843
10844 }
10845
10846 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10847 {
10850 }
10851
10852 else if (action_id ==
EActions.MAKE_SPECIAL)
10853 {
10854 auto debugParams = DebugSpawnParams.WithPlayer(player);
10855 OnDebugSpawnEx(debugParams);
10856 }
10857
10858 else if (action_id ==
EActions.DELETE)
10859 {
10860 Delete();
10861 }
10862
10863 }
10864
10865
10866 return false;
10867 }
10868
10869
10870
10871
10875
10878
10879
10880
10882 {
10883 return false;
10884 }
10885
10886
10888 {
10889 return true;
10890 }
10891
10892
10894 {
10895 return true;
10896 }
10897
10898
10899
10901 {
10902 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10904 }
10905
10908 {
10909 return null;
10910 }
10911
10913 {
10914 return false;
10915 }
10916
10918 {
10919 return false;
10920 }
10921
10925
10926
10928 {
10929 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10930 return module_repairing.CanRepair(this, item_repair_kit);
10931 }
10932
10933
10934 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10935 {
10936 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10937 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10938 }
10939
10940
10942 {
10943
10944
10945
10946
10947
10948
10949
10950
10951 return 1;
10952 }
10953
10954
10955
10957 {
10959 }
10960
10961
10962
10964 {
10966 }
10967
10968
10977 {
10978 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10979
10980 if (player)
10981 {
10982 player.MessageStatus(text);
10983 }
10984 }
10985
10986
10995 {
10996 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10997
10998 if (player)
10999 {
11000 player.MessageAction(text);
11001 }
11002 }
11003
11004
11013 {
11014 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11015
11016 if (player)
11017 {
11018 player.MessageFriendly(text);
11019 }
11020 }
11021
11022
11031 {
11032 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11033
11034 if (player)
11035 {
11036 player.MessageImportant(text);
11037 }
11038 }
11039
11041 {
11042 return true;
11043 }
11044
11045
11046 override bool KindOf(
string tag)
11047 {
11048 bool found = false;
11049 string item_name = this.
GetType();
11052
11053 int array_size = item_tag_array.Count();
11054 for (int i = 0; i < array_size; i++)
11055 {
11056 if (item_tag_array.Get(i) == tag)
11057 {
11058 found = true;
11059 break;
11060 }
11061 }
11062 return found;
11063 }
11064
11065
11067 {
11068
11069 super.OnRPC(sender, rpc_type,ctx);
11070
11071
11072 switch (rpc_type)
11073 {
11074 #ifndef SERVER
11075 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11076 Param2<bool, string> p = new Param2<bool, string>(false, "");
11077
11079 return;
11080
11081 bool play = p.param1;
11082 string soundSet = p.param2;
11083
11084 if (play)
11085 {
11087 {
11089 {
11091 }
11092 }
11093 else
11094 {
11096 }
11097 }
11098 else
11099 {
11101 }
11102
11103 break;
11104 #endif
11105
11106 }
11107
11109 {
11111 }
11112 }
11113
11114
11115
11116
11118 {
11119 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11120 return plugin.GetID(
name);
11121 }
11122
11124 {
11125 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11126 return plugin.GetName(id);
11127 }
11128
11131 {
11132
11133
11134 int varFlags;
11135 if (!ctx.
Read(varFlags))
11136 return;
11137
11138 if (varFlags & ItemVariableFlags.FLOAT)
11139 {
11141 }
11142 }
11143
11145 {
11146
11147 super.SerializeNumericalVars(floats_out);
11148
11149
11150
11152 {
11154 }
11155
11157 {
11159 }
11160
11162 {
11164 }
11165
11167 {
11172 }
11173
11175 {
11177 }
11178 }
11179
11181 {
11182
11183 super.DeSerializeNumericalVars(floats);
11184
11185
11186 int index = 0;
11187 int mask = Math.Round(floats.Get(index));
11188
11189 index++;
11190
11192 {
11194 {
11196 }
11197 else
11198 {
11199 float quantity = floats.Get(index);
11200 SetQuantity(quantity,
true,
false,
false,
false);
11201 }
11202 index++;
11203 }
11204
11206 {
11207 float wet = floats.Get(index);
11209 index++;
11210 }
11211
11213 {
11214 int liquidtype = Math.Round(floats.Get(index));
11216 index++;
11217 }
11218
11220 {
11222 index++;
11224 index++;
11226 index++;
11228 index++;
11229 }
11230
11232 {
11233 int cleanness = Math.Round(floats.Get(index));
11235 index++;
11236 }
11237 }
11238
11240 {
11241 super.WriteVarsToCTX(ctx);
11242
11243
11245 {
11247 }
11248
11250 {
11252 }
11253
11255 {
11257 }
11258
11260 {
11261 int r,g,b,a;
11267 }
11268
11270 {
11272 }
11273 }
11274
11276 {
11277 if (!super.ReadVarsFromCTX(ctx,version))
11278 return false;
11279
11280 int intValue;
11281 float value;
11282
11283 if (version < 140)
11284 {
11285 if (!ctx.
Read(intValue))
11286 return false;
11287
11288 m_VariablesMask = intValue;
11289 }
11290
11292 {
11293 if (!ctx.
Read(value))
11294 return false;
11295
11297 {
11299 }
11300 else
11301 {
11303 }
11304 }
11305
11306 if (version < 140)
11307 {
11309 {
11310 if (!ctx.
Read(value))
11311 return false;
11312 SetTemperatureDirect(value);
11313 }
11314 }
11315
11317 {
11318 if (!ctx.
Read(value))
11319 return false;
11321 }
11322
11324 {
11325 if (!ctx.
Read(intValue))
11326 return false;
11328 }
11329
11331 {
11332 int r,g,b,a;
11334 return false;
11336 return false;
11338 return false;
11340 return false;
11341
11343 }
11344
11346 {
11347 if (!ctx.
Read(intValue))
11348 return false;
11350 }
11351
11352 if (version >= 138 && version < 140)
11353 {
11355 {
11356 if (!ctx.
Read(intValue))
11357 return false;
11358 SetFrozen(intValue);
11359 }
11360 }
11361
11362 return true;
11363 }
11364
11365
11367 {
11370 {
11372 }
11373
11374 if (!super.OnStoreLoad(ctx, version))
11375 {
11377 return false;
11378 }
11379
11380 if (version >= 114)
11381 {
11382 bool hasQuickBarIndexSaved;
11383
11384 if (!ctx.
Read(hasQuickBarIndexSaved))
11385 {
11387 return false;
11388 }
11389
11390 if (hasQuickBarIndexSaved)
11391 {
11392 int itmQBIndex;
11393
11394
11395 if (!ctx.
Read(itmQBIndex))
11396 {
11398 return false;
11399 }
11400
11401 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11402 if (itmQBIndex != -1 && parentPlayer)
11403 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11404 }
11405 }
11406 else
11407 {
11408
11409 PlayerBase player;
11410 int itemQBIndex;
11411 if (version ==
int.
MAX)
11412 {
11413 if (!ctx.
Read(itemQBIndex))
11414 {
11416 return false;
11417 }
11418 }
11419 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11420 {
11421
11422 if (!ctx.
Read(itemQBIndex))
11423 {
11425 return false;
11426 }
11427 if (itemQBIndex != -1 && player)
11428 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11429 }
11430 }
11431
11432 if (version < 140)
11433 {
11434
11435 if (!LoadVariables(ctx, version))
11436 {
11438 return false;
11439 }
11440 }
11441
11442
11444 {
11446 return false;
11447 }
11448 if (version >= 132)
11449 {
11451 if (raib)
11452 {
11454 {
11456 return false;
11457 }
11458 }
11459 }
11460
11462 return true;
11463 }
11464
11465
11466
11468 {
11469 super.OnStoreSave(ctx);
11470
11471 PlayerBase player;
11472 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11473 {
11475
11476 int itemQBIndex = -1;
11477 itemQBIndex = player.FindQuickBarEntityIndex(this);
11478 ctx.
Write(itemQBIndex);
11479 }
11480 else
11481 {
11483 }
11484
11486
11488 if (raib)
11489 {
11491 }
11492 }
11493
11494
11496 {
11497 super.AfterStoreLoad();
11498
11500 {
11502 }
11503
11505 {
11508 }
11509 }
11510
11512 {
11513 super.EEOnAfterLoad();
11514
11516 {
11518 }
11519
11522 }
11523
11525 {
11526 return false;
11527 }
11528
11529
11530
11532 {
11534 {
11535 #ifdef PLATFORM_CONSOLE
11536
11538 {
11540 if (menu)
11541 {
11543 }
11544 }
11545 #endif
11546 }
11547
11549 {
11552 }
11553
11555 {
11556 SetWeightDirty();
11558 }
11560 {
11563 }
11564
11566 {
11569 }
11571 {
11574 }
11575
11576 super.OnVariablesSynchronized();
11577 }
11578
11579
11580
11582 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11583 {
11584 if (!IsServerCheck(allow_client))
11585 return false;
11586
11588 return false;
11589
11592
11593 if (value <= (min + 0.001))
11594 value = min;
11595
11596 if (value == min)
11597 {
11598 if (destroy_config)
11599 {
11600 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11601 if (dstr)
11602 {
11604 this.Delete();
11605 return true;
11606 }
11607 }
11608 else if (destroy_forced)
11609 {
11611 this.Delete();
11612 return true;
11613 }
11614
11616 }
11617
11620
11622 {
11624
11625 if (delta)
11627 }
11628
11630
11631 return false;
11632 }
11633
11634
11636 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11637 {
11639 }
11640
11642 {
11645 }
11646
11648 {
11651 }
11652
11655 {
11656 float value_clamped = Math.Clamp(value, 0, 1);
11658 SetQuantity(result, destroy_config, destroy_forced);
11659 }
11660
11661
11664 {
11666 }
11667
11669 {
11671 }
11672
11673
11674
11675
11676
11677
11678
11679
11680
11681
11683 {
11684 int slot = -1;
11685 if (GetInventory())
11686 {
11687 InventoryLocation il = new InventoryLocation;
11688 GetInventory().GetCurrentInventoryLocation(il);
11690 }
11691
11693 }
11694
11696 {
11697 float quantity_max = 0;
11698
11700 {
11701 if (attSlotID != -1)
11702 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11703
11704 if (quantity_max <= 0)
11706 }
11707
11708 if (quantity_max <= 0)
11710
11711 return quantity_max;
11712 }
11713
11715 {
11717 }
11718
11720 {
11722 }
11723
11724
11726 {
11728 }
11729
11731 {
11733 }
11734
11736 {
11738 }
11739
11740
11742 {
11743
11744 float weightEx = GetWeightEx();
11745 float special = GetInventoryAndCargoWeight();
11746 return weightEx - special;
11747 }
11748
11749
11751 {
11753 }
11754
11756 {
11758 {
11759 #ifdef DEVELOPER
11760 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11761 {
11762 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11764 }
11765 #endif
11766
11767 return GetQuantity() * GetConfigWeightModified();
11768 }
11769 else if (HasEnergyManager())
11770 {
11771 #ifdef DEVELOPER
11772 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11773 {
11774 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11775 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11776 }
11777 #endif
11778 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11779 }
11780 else
11781 {
11782 #ifdef DEVELOPER
11783 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11784 {
11785 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11786 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11787 }
11788 #endif
11789 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11790 }
11791 }
11792
11795 {
11796 int item_count = 0;
11798
11799 if (GetInventory().GetCargo() != NULL)
11800 {
11801 item_count = GetInventory().GetCargo().GetItemCount();
11802 }
11803
11804 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11805 {
11806 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11807 if (item)
11808 item_count += item.GetNumberOfItems();
11809 }
11810 return item_count;
11811 }
11812
11815 {
11816 float weight = 0;
11817 float wetness = 1;
11818 if (include_wetness)
11821 {
11822 weight = wetness * m_ConfigWeight;
11823 }
11825 {
11826 weight = 1;
11827 }
11828 return weight;
11829 }
11830
11831
11832
11834 {
11835 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11836 {
11837 GameInventory inv = GetInventory();
11838 array<EntityAI> items = new array<EntityAI>;
11840 for (int i = 0; i < items.Count(); i++)
11841 {
11843 if (item)
11844 {
11846 }
11847 }
11848 }
11849 }
11850
11851
11852
11853
11855 {
11856 float energy = 0;
11857 if (HasEnergyManager())
11858 {
11859 energy = GetCompEM().GetEnergy();
11860 }
11861 return energy;
11862 }
11863
11864
11866 {
11867 super.OnEnergyConsumed();
11868
11870 }
11871
11873 {
11874 super.OnEnergyAdded();
11875
11877 }
11878
11879
11881 {
11882 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11883 {
11885 {
11886 float energy_0to1 = GetCompEM().GetEnergy0To1();
11888 }
11889 }
11890 }
11891
11892
11894 {
11895 return ConfigGetFloat("heatIsolation");
11896 }
11897
11899 {
11901 }
11902
11904 {
11905 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11906 if (
GetGame().ConfigIsExisting(paramPath))
11908
11909 return 0.0;
11910 }
11911
11913 {
11914 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11915 if (
GetGame().ConfigIsExisting(paramPath))
11917
11918 return 0.0;
11919 }
11920
11921 override void SetWet(
float value,
bool allow_client =
false)
11922 {
11923 if (!IsServerCheck(allow_client))
11924 return;
11925
11928
11930
11931 m_VarWet = Math.Clamp(value, min, max);
11932
11934 {
11937 }
11938 }
11939
11940 override void AddWet(
float value)
11941 {
11943 }
11944
11946 {
11948 }
11949
11951 {
11953 }
11954
11956 {
11958 }
11959
11961 {
11963 }
11964
11966 {
11968 }
11969
11970 override void OnWetChanged(
float newVal,
float oldVal)
11971 {
11974 if (newLevel != oldLevel)
11975 {
11977 }
11978 }
11979
11981 {
11982 SetWeightDirty();
11983 }
11984
11986 {
11987 return GetWetLevelInternal(
m_VarWet);
11988 }
11989
11990
11991
11993 {
11995 }
11996
11998 {
12000 }
12001
12003 {
12005 }
12006
12008 {
12010 }
12011
12012
12013
12015 {
12016 if (ConfigIsExisting("itemModelLength"))
12017 {
12018 return ConfigGetFloat("itemModelLength");
12019 }
12020 return 0;
12021 }
12022
12024 {
12025 if (ConfigIsExisting("itemAttachOffset"))
12026 {
12027 return ConfigGetFloat("itemAttachOffset");
12028 }
12029 return 0;
12030 }
12031
12032 override void SetCleanness(
int value,
bool allow_client =
false)
12033 {
12034 if (!IsServerCheck(allow_client))
12035 return;
12036
12038
12040
12043 }
12044
12046 {
12048 }
12049
12051 {
12052 return true;
12053 }
12054
12055
12056
12057
12059 {
12061 }
12062
12064 {
12066 }
12067
12068
12069
12070
12071 override void SetColor(
int r,
int g,
int b,
int a)
12072 {
12078 }
12080 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12081 {
12086 }
12087
12089 {
12091 }
12092
12095 {
12096 int r,g,b,a;
12098 r = r/255;
12099 g = g/255;
12100 b = b/255;
12101 a = a/255;
12102 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12103 }
12104
12105
12106
12107 override void SetLiquidType(
int value,
bool allow_client =
false)
12108 {
12109 if (!IsServerCheck(allow_client))
12110 return;
12111
12116 }
12117
12119 {
12120 return ConfigGetInt("varLiquidTypeInit");
12121 }
12122
12124 {
12126 }
12127
12129 {
12131 SetFrozen(false);
12132 }
12133
12136 {
12137 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12138 }
12139
12140
12143 {
12144 PlayerBase nplayer;
12145 if (PlayerBase.CastTo(nplayer, player))
12146 {
12148
12149 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12150 }
12151 }
12152
12153
12156 {
12157 PlayerBase nplayer;
12158 if (PlayerBase.CastTo(nplayer,player))
12159 {
12160
12161 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12162
12163 }
12164
12165
12166 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12167
12168
12169 if (HasEnergyManager())
12170 {
12171 GetCompEM().UpdatePlugState();
12172 }
12173 }
12174
12175
12177 {
12178 super.OnPlacementStarted(player);
12179
12181 }
12182
12183 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12184 {
12186 {
12187 m_AdminLog.OnPlacementComplete(player,
this);
12188 }
12189
12190 super.OnPlacementComplete(player, position, orientation);
12191 }
12192
12193
12194
12195
12196
12198 {
12200 {
12201 return true;
12202 }
12203 else
12204 {
12205 return false;
12206 }
12207 }
12208
12209
12211 {
12213 {
12215 }
12216 }
12217
12218
12220 {
12222 }
12223
12225 {
12227 }
12228
12229 override void InsertAgent(
int agent,
float count = 1)
12230 {
12231 if (count < 1)
12232 return;
12233
12235 }
12236
12239 {
12241 }
12242
12243
12245 {
12247 }
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12262
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
12291 {
12293 return false;
12294 return true;
12295 }
12296
12298 {
12299
12301 }
12302
12303
12306 {
12307 super.CheckForRoofLimited(timeTresholdMS);
12308
12310 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12311 {
12312 m_PreviousRoofTestTime = time;
12313 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12314 }
12315 }
12316
12317
12319 {
12321 {
12322 return 0;
12323 }
12324
12325 if (GetInventory().GetAttachmentSlotsCount() != 0)
12326 {
12327 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12328 if (filter)
12329 return filter.GetProtectionLevel(type, false, system);
12330 else
12331 return 0;
12332 }
12333
12334 string subclassPath, entryName;
12335
12336 switch (type)
12337 {
12339 entryName = "biological";
12340 break;
12342 entryName = "chemical";
12343 break;
12344 default:
12345 entryName = "biological";
12346 break;
12347 }
12348
12349 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12350
12352 }
12353
12354
12355
12358 {
12359 if (!IsMagazine())
12361
12363 }
12364
12365
12366
12367
12368
12373 {
12374 return true;
12375 }
12376
12378 {
12380 }
12381
12382
12383
12384
12385
12387 {
12388 if (parent)
12389 {
12390 if (parent.IsInherited(DayZInfected))
12391 return true;
12392
12393 if (!parent.IsRuined())
12394 return true;
12395 }
12396
12397 return true;
12398 }
12399
12401 {
12402 if (!super.CanPutAsAttachment(parent))
12403 {
12404 return false;
12405 }
12406
12407 if (!IsRuined() && !parent.IsRuined())
12408 {
12409 return true;
12410 }
12411
12412 return false;
12413 }
12414
12416 {
12417
12418
12419
12420
12421 return super.CanReceiveItemIntoCargo(item);
12422 }
12423
12425 {
12426
12427
12428
12429
12430 GameInventory attachmentInv = attachment.GetInventory();
12432 {
12433 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12434 return false;
12435 }
12436
12437 InventoryLocation loc = new InventoryLocation();
12438 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12439 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12440 return false;
12441
12442 return super.CanReceiveAttachment(attachment, slotId);
12443 }
12444
12446 {
12447 if (!super.CanReleaseAttachment(attachment))
12448 return false;
12449
12450 return GetInventory().AreChildrenAccessible();
12451 }
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12463
12464
12465
12466
12467
12468
12469
12470
12471
12472
12474 {
12475 int id = muzzle_owner.GetMuzzleID();
12476 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12477
12478 if (WPOF_array)
12479 {
12480 for (int i = 0; i < WPOF_array.Count(); i++)
12481 {
12482 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12483
12484 if (WPOF)
12485 {
12486 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12487 }
12488 }
12489 }
12490 }
12491
12492
12494 {
12495 int id = muzzle_owner.GetMuzzleID();
12497
12498 if (WPOBE_array)
12499 {
12500 for (int i = 0; i < WPOBE_array.Count(); i++)
12501 {
12502 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12503
12504 if (WPOBE)
12505 {
12506 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12507 }
12508 }
12509 }
12510 }
12511
12512
12514 {
12515 int id = muzzle_owner.GetMuzzleID();
12516 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12517
12518 if (WPOOH_array)
12519 {
12520 for (int i = 0; i < WPOOH_array.Count(); i++)
12521 {
12522 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12523
12524 if (WPOOH)
12525 {
12526 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12527 }
12528 }
12529 }
12530 }
12531
12532
12534 {
12535 int id = muzzle_owner.GetMuzzleID();
12536 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12537
12538 if (WPOOH_array)
12539 {
12540 for (int i = 0; i < WPOOH_array.Count(); i++)
12541 {
12542 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12543
12544 if (WPOOH)
12545 {
12546 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12547 }
12548 }
12549 }
12550 }
12551
12552
12554 {
12555 int id = muzzle_owner.GetMuzzleID();
12556 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12557
12558 if (WPOOH_array)
12559 {
12560 for (int i = 0; i < WPOOH_array.Count(); i++)
12561 {
12562 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12563
12564 if (WPOOH)
12565 {
12566 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12567 }
12568 }
12569 }
12570 }
12571
12572
12573
12575 {
12577 {
12578 return true;
12579 }
12580
12581 return false;
12582 }
12583
12585 {
12587 {
12588 return true;
12589 }
12590
12591 return false;
12592 }
12593
12595 {
12597 {
12598 return true;
12599 }
12600
12601 return false;
12602 }
12603
12605 {
12606 return false;
12607 }
12608
12611 {
12612 return UATimeSpent.DEFAULT_DEPLOY;
12613 }
12614
12615
12616
12617
12619 {
12621 SetSynchDirty();
12622 }
12623
12625 {
12627 }
12628
12629
12631 {
12632 return false;
12633 }
12634
12637 {
12638 string att_type = "None";
12639
12640 if (ConfigIsExisting("soundAttType"))
12641 {
12642 att_type = ConfigGetString("soundAttType");
12643 }
12644
12646 }
12647
12649 {
12651 }
12652
12653
12654
12655
12656
12660
12662 {
12665
12667 }
12668
12669
12671 {
12673 return;
12674
12676
12679
12682
12683 SoundParameters params = new SoundParameters();
12687 }
12688
12689
12691 {
12693 return;
12694
12696 SetSynchDirty();
12697
12700 }
12701
12702
12704 {
12706 return;
12707
12709 SetSynchDirty();
12710
12713 }
12714
12716 {
12718 }
12719
12721 {
12723 }
12724
12727 {
12728 if (!
GetGame().IsDedicatedServer())
12729 {
12730 if (ConfigIsExisting("attachSoundSet"))
12731 {
12732 string cfg_path = "";
12733 string soundset = "";
12734 string type_name =
GetType();
12735
12738 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12739 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12740
12741 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12742 {
12743 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12744 {
12745 if (cfg_slot_array[i] == slot_type)
12746 {
12747 soundset = cfg_soundset_array[i];
12748 break;
12749 }
12750 }
12751 }
12752
12753 if (soundset != "")
12754 {
12755 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12757 }
12758 }
12759 }
12760 }
12761
12763 {
12764
12765 }
12766
12767 void OnApply(PlayerBase player);
12768
12770 {
12771 return 1.0;
12772 };
12773
12775 {
12777 }
12778
12780 {
12782 }
12783
12785
12787 {
12788 SetDynamicPhysicsLifeTime(0.01);
12790 }
12791
12793 {
12794 array<string> zone_names = new array<string>;
12795 GetDamageZones(zone_names);
12796 for (int i = 0; i < zone_names.Count(); i++)
12797 {
12798 SetHealthMax(zone_names.Get(i),"Health");
12799 }
12800 SetHealthMax("","Health");
12801 }
12802
12805 {
12806 float global_health = GetHealth01("","Health");
12807 array<string> zones = new array<string>;
12808 GetDamageZones(zones);
12809
12810 for (int i = 0; i < zones.Count(); i++)
12811 {
12812 SetHealth01(zones.Get(i),"Health",global_health);
12813 }
12814 }
12815
12818 {
12819 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12820 }
12821
12823 {
12824 if (!hasRootAsPlayer)
12825 {
12826 if (refParentIB)
12827 {
12828
12829 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12830 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12831
12832 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12833 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12834
12837 }
12838 else
12839 {
12840
12843 }
12844 }
12845 }
12846
12848 {
12850 {
12851 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12852 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12853 {
12854 float heatPermCoef = 1.0;
12856 while (ent)
12857 {
12858 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12859 ent = ent.GetHierarchyParent();
12860 }
12861
12862 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12863 }
12864 }
12865 }
12866
12868 {
12869
12870 EntityAI parent = GetHierarchyParent();
12871 if (!parent)
12872 {
12873 hasParent = false;
12874 hasRootAsPlayer = false;
12875 }
12876 else
12877 {
12878 hasParent = true;
12879 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12880 refParentIB =
ItemBase.Cast(parent);
12881 }
12882 }
12883
12884 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12885 {
12886
12887 }
12888
12890 {
12891
12892 return false;
12893 }
12894
12896 {
12897
12898
12899 return false;
12900 }
12901
12903 {
12904
12905 return false;
12906 }
12907
12910 {
12911 return !GetIsFrozen() &&
IsOpen();
12912 }
12913
12915 {
12916 bool hasParent = false, hasRootAsPlayer = false;
12918
12919 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12920 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12921
12922 if (wwtu || foodDecay)
12923 {
12927
12928 if (processWetness || processTemperature || processDecay)
12929 {
12931
12932 if (processWetness)
12933 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12934
12935 if (processTemperature)
12937
12938 if (processDecay)
12939 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12940 }
12941 }
12942 }
12943
12946 {
12948 }
12949
12951 {
12954
12955 return super.GetTemperatureFreezeThreshold();
12956 }
12957
12959 {
12962
12963 return super.GetTemperatureThawThreshold();
12964 }
12965
12967 {
12970
12971 return super.GetItemOverheatThreshold();
12972 }
12973
12975 {
12977 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12978
12979 return super.GetTemperatureFreezeTime();
12980 }
12981
12983 {
12985 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12986
12987 return super.GetTemperatureThawTime();
12988 }
12989
12994
12996 {
12997 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12998 }
12999
13001 {
13002 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13003 }
13004
13007 {
13009 }
13010
13012 {
13014 }
13015
13017 {
13019 }
13020
13023 {
13024 return null;
13025 }
13026
13029 {
13030 return false;
13031 }
13032
13034 {
13036 {
13039 if (!trg)
13040 {
13042 explosive = this;
13043 }
13044
13045 explosive.PairRemote(trg);
13047
13048 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13049 trg.SetPersistentPairID(persistentID);
13050 explosive.SetPersistentPairID(persistentID);
13051
13052 return true;
13053 }
13054 return false;
13055 }
13056
13059 {
13060 float ret = 1.0;
13063 ret *= GetHealth01();
13064
13065 return ret;
13066 }
13067
13068 #ifdef DEVELOPER
13069 override void SetDebugItem()
13070 {
13071 super.SetDebugItem();
13072 _itemBase = this;
13073 }
13074
13076 {
13077 string text = super.GetDebugText();
13078
13080 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13081
13082 return text;
13083 }
13084 #endif
13085
13087 {
13088 return true;
13089 }
13090
13092
13094
13096 {
13099 }
13100
13101
13109
13125}
13126
13128{
13130 if (entity)
13131 {
13132 bool is_item = entity.IsInherited(
ItemBase);
13133 if (is_item && full_quantity)
13134 {
13137 }
13138 }
13139 else
13140 {
13142 return NULL;
13143 }
13144 return entity;
13145}
13146
13148{
13149 if (item)
13150 {
13151 if (health > 0)
13152 item.SetHealth("", "", health);
13153
13154 if (item.CanHaveTemperature())
13155 {
13157 if (item.CanFreeze())
13158 item.SetFrozen(false);
13159 }
13160
13161 if (item.HasEnergyManager())
13162 {
13163 if (quantity >= 0)
13164 {
13165 item.GetCompEM().SetEnergy0To1(quantity);
13166 }
13167 else
13168 {
13170 }
13171 }
13172 else if (item.IsMagazine())
13173 {
13174 Magazine mag = Magazine.Cast(item);
13175 if (quantity >= 0)
13176 {
13177 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13178 }
13179 else
13180 {
13182 }
13183
13184 }
13185 else
13186 {
13187 if (quantity >= 0)
13188 {
13189 item.SetQuantityNormalized(quantity, false);
13190 }
13191 else
13192 {
13194 }
13195
13196 }
13197 }
13198}
13199
13200#ifdef DEVELOPER
13202#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.