8321{
8323 {
8324 return true;
8325 }
8326};
8327
8328
8329
8331{
8335
8337
8340
8341
8342
8343
8344
8353
8359
8364
8369
8390 protected bool m_IsResultOfSplit
8391
8393
8398
8399
8400
8402
8406
8407
8408
8410
8413
8414
8415
8421
8422
8430
8433
8434
8436
8437
8439
8440
8445
8446
8451
8452
8454
8455
8457 {
8462
8463 if (!
GetGame().IsDedicatedServer())
8464 {
8466 {
8468
8470 {
8472 }
8473 }
8474
8477 }
8478
8479 m_OldLocation = null;
8480
8482 {
8484 }
8485
8486 if (ConfigIsExisting("headSelectionsToHide"))
8487 {
8490 }
8491
8493 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8494 {
8496 }
8497
8499
8500 m_IsResultOfSplit = false;
8501
8503 }
8504
8506 {
8507 super.InitItemVariables();
8508
8514 m_Count = ConfigGetInt(
"count");
8515
8518
8523
8526
8531
8543
8547
8548
8551 if (ConfigIsExisting("canBeSplit"))
8552 {
8555 }
8556
8558 if (ConfigIsExisting("itemBehaviour"))
8560
8561
8564 RegisterNetSyncVariableInt("m_VarLiquidType");
8565 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8566
8567 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8568 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8569 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8570
8571 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8572 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8573 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8574 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8575
8576 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8577 RegisterNetSyncVariableBool("m_IsTakeable");
8578 RegisterNetSyncVariableBool("m_IsHologram");
8579
8582 {
8585 }
8586
8588
8590 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8592
8593 }
8594
8596 {
8598 }
8599
8601 {
8604 {
8609 }
8610 }
8611
8612 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8613 {
8615 {
8618 }
8619
8621 }
8622
8624 {
8630 }
8631
8633
8635 {
8637
8638 if (!action)
8639 {
8640 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8641 return;
8642 }
8643
8645 if (!ai)
8646 {
8648 return;
8649 }
8650
8652 if (!action_array)
8653 {
8654 action_array = new array<ActionBase_Basic>;
8656 }
8657 if (LogManager.IsActionLogEnable())
8658 {
8659 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8660 }
8661
8662 if (action_array.Find(action) != -1)
8663 {
8664 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8665 }
8666 else
8667 {
8668 action_array.Insert(action);
8669 }
8670 }
8671
8673 {
8675 ActionBase action = player.GetActionManager().GetAction(actionName);
8678
8679 if (action_array)
8680 {
8681 action_array.RemoveItem(action);
8682 }
8683 }
8684
8685
8686
8688 {
8689 ActionOverrideData overrideData = new ActionOverrideData();
8693
8695 if (!actionMap)
8696 {
8699 }
8700
8701 actionMap.Insert(this.
Type(), overrideData);
8702
8703 }
8704
8706
8708
8709
8711 {
8714
8717
8718 string config_to_search = "CfgVehicles";
8719 string muzzle_owner_config;
8720
8722 {
8723 if (IsInherited(Weapon))
8724 config_to_search = "CfgWeapons";
8725
8726 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8727
8728 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8729
8731
8732 if (config_OnFire_subclass_count > 0)
8733 {
8734 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8735
8736 for (int i = 0; i < config_OnFire_subclass_count; i++)
8737 {
8738 string particle_class = "";
8740 string config_OnFire_entry = config_OnFire_class + particle_class;
8741 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8742 WPOF_array.Insert(WPOF);
8743 }
8744
8745
8747 }
8748 }
8749
8751 {
8752 config_to_search = "CfgWeapons";
8753 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8754
8755 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8756
8758
8759 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8760 {
8761 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8762
8763 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8764 {
8765 string particle_class2 = "";
8767 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8768 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8769 WPOBE_array.Insert(WPOBE);
8770 }
8771
8772
8774 }
8775 }
8776 }
8777
8778
8780 {
8783
8785 {
8786 string config_to_search = "CfgVehicles";
8787
8788 if (IsInherited(Weapon))
8789 config_to_search = "CfgWeapons";
8790
8791 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8792 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8793
8794 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8795 {
8796
8798
8800 {
8802 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8804 return;
8805 }
8806
8809
8810
8811
8813 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8814
8815 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8816 {
8817 string particle_class = "";
8819 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8821
8822 if (entry_type == CT_CLASS)
8823 {
8824 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8825 WPOOH_array.Insert(WPOF);
8826 }
8827 }
8828
8829
8831 }
8832 }
8833 }
8834
8836 {
8838 }
8839
8841 {
8843 {
8845
8848
8851
8852 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8853 }
8854 }
8855
8857 {
8859 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8860
8862 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8863
8865 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8866
8868 {
8870 }
8871 }
8872
8874 {
8876 }
8877
8879 {
8882 else
8884
8886 {
8889 }
8890 else
8891 {
8894
8897 }
8898
8900 }
8901
8903 {
8905 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8906 }
8907
8909 {
8911 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8913 }
8914
8916 {
8918 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8919 }
8920
8922 {
8925
8926 OverheatingParticle OP = new OverheatingParticle();
8931
8933 }
8934
8936 {
8939
8940 return -1;
8941 }
8942
8944 {
8946 {
8949
8950 for (int i = count; i > 0; --i)
8951 {
8952 int id = i - 1;
8955
8958
8959 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8960 {
8961 if (p)
8962 {
8965 }
8966 }
8967 }
8968 }
8969 }
8970
8972 {
8974 {
8976 {
8977 int id = i - 1;
8979
8980 if (OP)
8981 {
8983
8984 if (p)
8985 {
8987 }
8988
8989 delete OP;
8990 }
8991 }
8992
8995 }
8996 }
8997
9000 {
9001 return 0.0;
9002 }
9003
9004
9006 {
9007 return 250;
9008 }
9009
9011 {
9012 return 0;
9013 }
9014
9017 {
9019 return true;
9020
9021 return false;
9022 }
9023
9026 {
9029
9031 {
9033 }
9034 else
9035 {
9036
9038 }
9039
9041 }
9042
9049 {
9050 return -1;
9051 }
9052
9053
9054
9055
9057 {
9059 {
9061 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9062
9063 if (r_index >= 0)
9064 {
9065 InventoryLocation r_il = new InventoryLocation;
9066 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9067
9068 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9071 {
9072 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9073 }
9075 {
9076 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9077 }
9078
9079 }
9080
9081 player.GetHumanInventory().ClearUserReservedLocation(this);
9082 }
9083
9086 }
9087
9088
9089
9090
9092 {
9093 return ItemBase.m_DebugActionsMask;
9094 }
9095
9097 {
9098 return ItemBase.m_DebugActionsMask & mask;
9099 }
9100
9102 {
9103 ItemBase.m_DebugActionsMask = mask;
9104 }
9105
9107 {
9108 ItemBase.m_DebugActionsMask |= mask;
9109 }
9110
9112 {
9113 ItemBase.m_DebugActionsMask &= ~mask;
9114 }
9115
9117 {
9119 {
9121 }
9122 else
9123 {
9125 }
9126 }
9127
9128
9130 {
9131 if (GetEconomyProfile())
9132 {
9133 float q_max = GetEconomyProfile().GetQuantityMax();
9134 if (q_max > 0)
9135 {
9136 float q_min = GetEconomyProfile().GetQuantityMin();
9137 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9138
9140 {
9141 ComponentEnergyManager comp = GetCompEM();
9143 {
9145 }
9146 }
9148 {
9150
9151 }
9152
9153 }
9154 }
9155 }
9156
9159 {
9160 EntityAI parent = GetHierarchyParent();
9161
9162 if (parent)
9163 {
9164 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9165 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9166 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9167 }
9168 }
9169
9172 {
9173 EntityAI parent = GetHierarchyParent();
9174
9175 if (parent)
9176 {
9177 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9178 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9179 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9180 }
9181 }
9182
9184 {
9185
9186
9187
9188
9190
9192 {
9193 if (ScriptInputUserData.CanStoreInputUserData())
9194 {
9195 ScriptInputUserData ctx = new ScriptInputUserData;
9201 ctx.
Write(use_stack_max);
9204
9206 {
9207 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9208 }
9209 }
9210 }
9211 else if (!
GetGame().IsMultiplayer())
9212 {
9214 }
9215 }
9216
9218 {
9220 }
9221
9223 {
9225 }
9226
9228 {
9230 }
9231
9233 {
9234
9235 return false;
9236 }
9237
9239 {
9240 return false;
9241 }
9242
9246 {
9247 return false;
9248 }
9249
9251 {
9252 return "";
9253 }
9254
9256
9258 {
9259 return false;
9260 }
9261
9263 {
9264 return true;
9265 }
9266
9267
9268
9270 {
9271 return true;
9272 }
9273
9275 {
9276 return true;
9277 }
9278
9280 {
9281 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9283 }
9284
9286 {
9288 }
9289
9291 {
9293 if (!is_being_placed)
9295 SetSynchDirty();
9296 }
9297
9298
9300
9302 {
9304 }
9305
9307 {
9309 }
9310
9312 {
9313 return 1;
9314 }
9315
9317 {
9318 return false;
9319 }
9320
9322 {
9324 SetSynchDirty();
9325 }
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9362 {
9363 super.OnMovedInsideCargo(container);
9364
9365 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9366 }
9367
9368 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9369 {
9370 super.EEItemLocationChanged(oldLoc,newLoc);
9371
9372 PlayerBase new_player = null;
9373 PlayerBase old_player = null;
9374
9375 if (newLoc.GetParent())
9376 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9377
9378 if (oldLoc.GetParent())
9379 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9380
9382 {
9383 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9384
9385 if (r_index >= 0)
9386 {
9387 InventoryLocation r_il = new InventoryLocation;
9388 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9389
9390 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9393 {
9394 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9395 }
9397 {
9398 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9399 }
9400
9401 }
9402 }
9403
9405 {
9406 if (new_player)
9407 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9408
9409 if (new_player == old_player)
9410 {
9411
9412 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9413 {
9415 {
9416 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9417 {
9418 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9419 }
9420 }
9421 else
9422 {
9423 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9424 }
9425 }
9426
9427 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9428 {
9429 int type = oldLoc.GetType();
9431 {
9432 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9433 }
9435 {
9436 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9437 }
9438 }
9439 if (!m_OldLocation)
9440 {
9441 m_OldLocation = new InventoryLocation;
9442 }
9443 m_OldLocation.Copy(oldLoc);
9444 }
9445 else
9446 {
9447 if (m_OldLocation)
9448 {
9449 m_OldLocation.Reset();
9450 }
9451 }
9452
9454 }
9455 else
9456 {
9457 if (new_player)
9458 {
9459 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9460 if (res_index >= 0)
9461 {
9462 InventoryLocation il = new InventoryLocation;
9463 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9465 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9468 {
9469 il.
GetParent().GetOnReleaseLock().Invoke(it);
9470 }
9472 {
9474 }
9475
9476 }
9477 }
9479 {
9480
9482 }
9483
9484 if (m_OldLocation)
9485 {
9486 m_OldLocation.Reset();
9487 }
9488 }
9489 }
9490
9491 override void EOnContact(IEntity other, Contact extra)
9492 {
9494 {
9495 int liquidType = -1;
9497 if (impactSpeed > 0.0)
9498 {
9500 #ifndef SERVER
9502 #else
9504 SetSynchDirty();
9505 #endif
9507 }
9508 }
9509
9510 #ifdef SERVER
9511 if (GetCompEM() && GetCompEM().IsPlugged())
9512 {
9513 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9514 GetCompEM().UnplugThis();
9515 }
9516 #endif
9517 }
9518
9520
9522 {
9524 }
9525
9527 {
9528
9529 }
9530
9532 {
9533 super.OnItemLocationChanged(old_owner, new_owner);
9534
9535 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9536 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9537
9538 if (!relatedPlayer && playerNew)
9539 relatedPlayer = playerNew;
9540
9541 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9542 {
9544 if (actionMgr)
9545 {
9546 ActionBase currentAction = actionMgr.GetRunningAction();
9547 if (currentAction)
9549 }
9550 }
9551
9552 Man ownerPlayerOld = null;
9553 Man ownerPlayerNew = null;
9554
9555 if (old_owner)
9556 {
9557 if (old_owner.
IsMan())
9558 {
9559 ownerPlayerOld = Man.Cast(old_owner);
9560 }
9561 else
9562 {
9563 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9564 }
9565 }
9566 else
9567 {
9569 {
9571
9572 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9573 {
9574 GetCompEM().UnplugThis();
9575 }
9576 }
9577 }
9578
9579 if (new_owner)
9580 {
9581 if (new_owner.
IsMan())
9582 {
9583 ownerPlayerNew = Man.Cast(new_owner);
9584 }
9585 else
9586 {
9587 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9588 }
9589 }
9590
9591 if (ownerPlayerOld != ownerPlayerNew)
9592 {
9593 if (ownerPlayerOld)
9594 {
9595 array<EntityAI> subItemsExit = new array<EntityAI>;
9597 for (int i = 0; i < subItemsExit.Count(); i++)
9598 {
9601 }
9602 }
9603
9604 if (ownerPlayerNew)
9605 {
9606 array<EntityAI> subItemsEnter = new array<EntityAI>;
9608 for (int j = 0; j < subItemsEnter.Count(); j++)
9609 {
9612 }
9613 }
9614 }
9615 else if (ownerPlayerNew != null)
9616 {
9617 PlayerBase nplayer;
9618 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9619 {
9620 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9622 for (int k = 0; k < subItemsUpdate.Count(); k++)
9623 {
9625 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9626 }
9627 }
9628 }
9629
9630 if (old_owner)
9631 old_owner.OnChildItemRemoved(this);
9632 if (new_owner)
9633 new_owner.OnChildItemReceived(this);
9634 }
9635
9636
9638 {
9639 super.EEDelete(parent);
9640 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9641 if (player)
9642 {
9644
9645 if (player.IsAlive())
9646 {
9647 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9648 if (r_index >= 0)
9649 {
9650 InventoryLocation r_il = new InventoryLocation;
9651 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9652
9653 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9656 {
9657 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9658 }
9660 {
9661 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9662 }
9663
9664 }
9665
9666 player.RemoveQuickBarEntityShortcut(this);
9667 }
9668 }
9669 }
9670
9672 {
9673 super.EEKilled(killer);
9674
9677 {
9678 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9679 {
9680 if (IsMagazine())
9681 {
9682 if (Magazine.Cast(this).GetAmmoCount() > 0)
9683 {
9685 }
9686 }
9687 else
9688 {
9690 }
9691 }
9692 }
9693 }
9694
9696 {
9697 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9698
9699 super.OnWasAttached(parent, slot_id);
9700
9703
9705 }
9706
9708 {
9709 super.OnWasDetached(parent, slot_id);
9710
9713 }
9714
9716 {
9717 int idx;
9720
9721 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9722 if (inventory_slots.Count() < 1)
9723 {
9724 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9725 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9726 }
9727 else
9728 {
9729 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9730 }
9731
9732 idx = inventory_slots.Find(slot);
9733 if (idx < 0)
9734 return "";
9735
9736 return attach_types.Get(idx);
9737 }
9738
9740 {
9741 int idx = -1;
9742 string slot;
9743
9746
9747 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9748 if (inventory_slots.Count() < 1)
9749 {
9750 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9751 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9752 }
9753 else
9754 {
9755 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9756 if (detach_types.Count() < 1)
9757 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9758 }
9759
9760 for (int i = 0; i < inventory_slots.Count(); i++)
9761 {
9762 slot = inventory_slots.Get(i);
9763 }
9764
9765 if (slot != "")
9766 {
9767 if (detach_types.Count() == 1)
9768 idx = 0;
9769 else
9770 idx = inventory_slots.Find(slot);
9771 }
9772 if (idx < 0)
9773 return "";
9774
9775 return detach_types.Get(idx);
9776 }
9777
9779 {
9780
9782
9783
9784 float min_time = 1;
9785 float max_time = 3;
9786 float delay = Math.RandomFloat(min_time, max_time);
9787
9788 explode_timer.Run(delay, this, "DoAmmoExplosion");
9789 }
9790
9792 {
9793 Magazine magazine = Magazine.Cast(this);
9794 int pop_sounds_count = 6;
9795 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9796
9797
9798 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9799 string sound_name = pop_sounds[ sound_idx ];
9801
9802
9803 magazine.ServerAddAmmoCount(-1);
9804
9805
9806 float min_temp_to_explode = 100;
9807
9808 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9809 {
9811 }
9812 }
9813
9814
9815 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9816 {
9817 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9818
9819 const int CHANCE_DAMAGE_CARGO = 4;
9820 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9821 const int CHANCE_DAMAGE_NOTHING = 2;
9822
9824 {
9825 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9826 int chances;
9827 int rnd;
9828
9829 if (GetInventory().GetCargo())
9830 {
9831 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9832 rnd = Math.RandomInt(0,chances);
9833
9834 if (rnd < CHANCE_DAMAGE_CARGO)
9835 {
9837 }
9838 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9839 {
9841 }
9842 }
9843 else
9844 {
9845 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9846 rnd = Math.RandomInt(0,chances);
9847
9848 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9849 {
9851 }
9852 }
9853 }
9854 }
9855
9857 {
9858 if (GetInventory().GetCargo())
9859 {
9860 int item_count = GetInventory().GetCargo().GetItemCount();
9861 if (item_count > 0)
9862 {
9863 int random_pick = Math.RandomInt(0, item_count);
9865 if (!item.IsExplosive())
9866 {
9867 item.AddHealth("","",damage);
9868 return true;
9869 }
9870 }
9871 }
9872 return false;
9873 }
9874
9876 {
9877 int attachment_count = GetInventory().AttachmentCount();
9878 if (attachment_count > 0)
9879 {
9880 int random_pick = Math.RandomInt(0, attachment_count);
9881 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9882 if (!attachment.IsExplosive())
9883 {
9884 attachment.AddHealth("","",damage);
9885 return true;
9886 }
9887 }
9888 return false;
9889 }
9890
9892 {
9894 }
9895
9897 {
9899 return GetInventory().CanRemoveEntity();
9900
9901 return false;
9902 }
9903
9905 {
9907 return;
9908
9910 {
9911 if (ScriptInputUserData.CanStoreInputUserData())
9912 {
9913 ScriptInputUserData ctx = new ScriptInputUserData;
9918 ctx.
Write(destination_entity);
9922 }
9923 }
9924 else if (!
GetGame().IsMultiplayer())
9925 {
9927 }
9928 }
9929
9931 {
9933 return;
9934
9935 float split_quantity_new;
9939 InventoryLocation loc = new InventoryLocation;
9940
9941 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9942 {
9944 split_quantity_new = stack_max;
9945 else
9947
9948 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9949 if (new_item)
9950 {
9951 new_item.SetResultOfSplit(true);
9952 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9954 new_item.SetQuantity(split_quantity_new);
9955 }
9956 }
9957 else if (destination_entity && slot_id == -1)
9958 {
9959 if (quantity > stack_max)
9960 split_quantity_new = stack_max;
9961 else
9962 split_quantity_new = quantity;
9963
9965 {
9968 }
9969
9970 if (new_item)
9971 {
9972 new_item.SetResultOfSplit(true);
9973 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9975 new_item.SetQuantity(split_quantity_new);
9976 }
9977 }
9978 else
9979 {
9980 if (stack_max != 0)
9981 {
9983 {
9985 }
9986
9987 if (split_quantity_new == 0)
9988 {
9989 if (!
GetGame().IsMultiplayer())
9990 player.PhysicalPredictiveDropItem(this);
9991 else
9992 player.ServerDropEntity(this);
9993 return;
9994 }
9995
9997
9998 if (new_item)
9999 {
10000 new_item.SetResultOfSplit(true);
10001 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10003 new_item.SetQuantity(stack_max);
10004 new_item.PlaceOnSurface();
10005 }
10006 }
10007 }
10008 }
10009
10011 {
10013 return;
10014
10015 float split_quantity_new;
10019 InventoryLocation loc = new InventoryLocation;
10020
10021 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10022 {
10024 split_quantity_new = stack_max;
10025 else
10027
10028 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10029 if (new_item)
10030 {
10031 new_item.SetResultOfSplit(true);
10032 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10034 new_item.SetQuantity(split_quantity_new);
10035 }
10036 }
10037 else if (destination_entity && slot_id == -1)
10038 {
10039 if (quantity > stack_max)
10040 split_quantity_new = stack_max;
10041 else
10042 split_quantity_new = quantity;
10043
10045 {
10048 }
10049
10050 if (new_item)
10051 {
10052 new_item.SetResultOfSplit(true);
10053 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10055 new_item.SetQuantity(split_quantity_new);
10056 }
10057 }
10058 else
10059 {
10060 if (stack_max != 0)
10061 {
10063 {
10065 }
10066
10068
10069 if (new_item)
10070 {
10071 new_item.SetResultOfSplit(true);
10072 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10074 new_item.SetQuantity(stack_max);
10075 new_item.PlaceOnSurface();
10076 }
10077 }
10078 }
10079 }
10080
10082 {
10084 return;
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 return;
10109
10111 {
10112 if (ScriptInputUserData.CanStoreInputUserData())
10113 {
10114 ScriptInputUserData ctx = new ScriptInputUserData;
10119 ctx.
Write(destination_entity);
10125 }
10126 }
10127 else if (!
GetGame().IsMultiplayer())
10128 {
10130 }
10131 }
10132
10134 {
10136 }
10137
10139 {
10141 return this;
10142
10144 float split_quantity_new;
10146 if (dst.IsValid())
10147 {
10148 int slot_id = dst.GetSlot();
10150
10151 if (quantity > stack_max)
10152 split_quantity_new = stack_max;
10153 else
10154 split_quantity_new = quantity;
10155
10157
10158 if (new_item)
10159 {
10160 new_item.SetResultOfSplit(true);
10161 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10164 }
10165
10166 return new_item;
10167 }
10168
10169 return null;
10170 }
10171
10173 {
10175 return;
10176
10178 float split_quantity_new;
10180 if (destination_entity)
10181 {
10183 if (quantity > stackable)
10184 split_quantity_new = stackable;
10185 else
10186 split_quantity_new = quantity;
10187
10188 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10189 if (new_item)
10190 {
10191 new_item.SetResultOfSplit(true);
10192 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10194 new_item.SetQuantity(split_quantity_new);
10195 }
10196 }
10197 }
10198
10200 {
10202 return;
10203
10205 {
10206 if (ScriptInputUserData.CanStoreInputUserData())
10207 {
10208 ScriptInputUserData ctx = new ScriptInputUserData;
10213 ItemBase destination_entity =
this;
10214 ctx.
Write(destination_entity);
10218 }
10219 }
10220 else if (!
GetGame().IsMultiplayer())
10221 {
10223 }
10224 }
10225
10227 {
10229 return;
10230
10232 float split_quantity_new;
10234 if (player)
10235 {
10237 if (quantity > stackable)
10238 split_quantity_new = stackable;
10239 else
10240 split_quantity_new = quantity;
10241
10242 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10243 new_item =
ItemBase.Cast(in_hands);
10244 if (new_item)
10245 {
10246 new_item.SetResultOfSplit(true);
10247 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10249 new_item.SetQuantity(split_quantity_new);
10250 }
10251 }
10252 }
10253
10255 {
10257 return;
10258
10260 float split_quantity_new = Math.Floor(quantity * 0.5);
10261
10263
10264 if (new_item)
10265 {
10266 if (new_item.GetQuantityMax() < split_quantity_new)
10267 {
10268 split_quantity_new = new_item.GetQuantityMax();
10269 }
10270
10271 new_item.SetResultOfSplit(true);
10272 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10273
10275 {
10278 }
10279 else
10280 {
10283 }
10284 }
10285 }
10286
10288 {
10290 return;
10291
10293 float split_quantity_new = Math.Floor(quantity / 2);
10294
10295 InventoryLocation invloc = new InventoryLocation;
10297
10299 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10300
10301 if (new_item)
10302 {
10303 if (new_item.GetQuantityMax() < split_quantity_new)
10304 {
10305 split_quantity_new = new_item.GetQuantityMax();
10306 }
10308 {
10311 }
10312 else
10313 {
10316 }
10317 }
10318 }
10319
10322 {
10323 SetWeightDirty();
10325
10326 if (parent)
10327 parent.OnAttachmentQuantityChangedEx(this, delta);
10328
10330 {
10332 {
10334 }
10336 {
10337 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10339 }
10340 }
10341
10342 }
10343
10346 {
10347
10348 }
10349
10352 {
10354 }
10355
10357 {
10358 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10359
10361 {
10362 if (newLevel == GameConstants.STATE_RUINED)
10363 {
10365 EntityAI parent = GetHierarchyParent();
10366 if (parent && parent.IsFireplace())
10367 {
10368 CargoBase cargo = GetInventory().GetCargo();
10369 if (cargo)
10370 {
10372 {
10374 }
10375 }
10376 }
10377 }
10378
10380 {
10381
10383 return;
10384 }
10385
10386 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10387 {
10389 }
10390 }
10391 }
10392
10393
10395 {
10396 super.OnRightClick();
10397
10399 {
10401 {
10402 if (ScriptInputUserData.CanStoreInputUserData())
10403 {
10404 vector m4[4];
10406
10407 EntityAI root = GetHierarchyRoot();
10408
10409 InventoryLocation dst = new InventoryLocation;
10411 {
10412 if (root)
10413 {
10414 root.GetTransform(m4);
10416 }
10417 else
10418 GetInventory().GetCurrentInventoryLocation(dst);
10419 }
10420 else
10421 {
10423
10424
10425 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10426 {
10427 if (root)
10428 {
10429 root.GetTransform(m4);
10431 }
10432 else
10433 GetInventory().GetCurrentInventoryLocation(dst);
10434 }
10435 else
10436 {
10437 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10438 }
10439 }
10440
10441 ScriptInputUserData ctx = new ScriptInputUserData;
10449 }
10450 }
10451 else if (!
GetGame().IsMultiplayer())
10452 {
10454 }
10455 }
10456 }
10457
10458 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10459 {
10460
10461 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10462 return false;
10463
10464 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10465 return false;
10466
10467
10469 return false;
10470
10471
10472 Magazine mag = Magazine.Cast(this);
10473 if (mag)
10474 {
10475 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10476 return false;
10477
10478 if (stack_max_limit)
10479 {
10480 Magazine other_mag = Magazine.Cast(other_item);
10481 if (other_item)
10482 {
10483 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10484 return false;
10485 }
10486
10487 }
10488 }
10489 else
10490 {
10491
10493 return false;
10494
10496 return false;
10497 }
10498
10499 PlayerBase player = null;
10500 if (CastTo(player, GetHierarchyRootPlayer()))
10501 {
10502 if (player.GetInventory().HasAttachment(this))
10503 return false;
10504
10505 if (player.IsItemsToDelete())
10506 return false;
10507 }
10508
10509 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10510 return false;
10511
10512 int slotID;
10514 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10515 return false;
10516
10517 return true;
10518 }
10519
10521 {
10523 }
10524
10526 {
10527 return m_IsResultOfSplit;
10528 }
10529
10531 {
10532 m_IsResultOfSplit = value;
10533 }
10534
10536 {
10538 }
10539
10541 {
10542 float other_item_quantity = other_item.GetQuantity();
10543 float this_free_space;
10544
10546
10548
10549 if (other_item_quantity > this_free_space)
10550 {
10551 return this_free_space;
10552 }
10553 else
10554 {
10555 return other_item_quantity;
10556 }
10557 }
10558
10560 {
10562 }
10563
10565 {
10567 return;
10568
10569 if (!IsMagazine() && other_item)
10570 {
10572 if (quantity_used != 0)
10573 {
10574 float hp1 = GetHealth01("","");
10575 float hp2 = other_item.GetHealth01("","");
10576 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10577 hpResult = hpResult / (
GetQuantity() + quantity_used);
10578
10579 hpResult *= GetMaxHealth();
10580 Math.Round(hpResult);
10581 SetHealth("", "Health", hpResult);
10582
10584 other_item.AddQuantity(-quantity_used);
10585 }
10586 }
10588 }
10589
10591 {
10592 #ifdef SERVER
10593 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10594 GetHierarchyParent().IncreaseLifetimeUp();
10595 #endif
10596 };
10597
10599 {
10600 PlayerBase p = PlayerBase.Cast(player);
10601
10602 array<int> recipesIds = p.m_Recipes;
10603 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10604 if (moduleRecipesManager)
10605 {
10606 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10607 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10608 }
10609
10610 for (int i = 0;i < recipesIds.Count(); i++)
10611 {
10612 int key = recipesIds.Get(i);
10613 string recipeName = moduleRecipesManager.GetRecipeName(key);
10615 }
10616 }
10617
10618
10619 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10620 {
10621 super.GetDebugActions(outputList);
10622
10623
10628
10629
10633
10637
10638
10641
10642
10644 {
10647 }
10648
10650
10653
10657 }
10658
10659
10660
10661
10663 {
10664 super.OnAction(action_id, player, ctx);
10665 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10666 {
10667 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10668 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10669 PlayerBase p = PlayerBase.Cast(player);
10670 if (
EActions.RECIPES_RANGE_START < 1000)
10671 {
10672 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10673 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10674 }
10675 }
10676 #ifndef SERVER
10677 else if (action_id ==
EActions.WATCH_PLAYER)
10678 {
10679 PluginDeveloper.SetDeveloperItemClientEx(player);
10680 }
10681 #endif
10683 {
10684 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10685 {
10686 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10687 OnDebugButtonPressServer(id + 1);
10688 }
10689
10690 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10691 {
10692 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10694 }
10695
10696 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10697 {
10698 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10700 }
10701
10702 else if (action_id ==
EActions.ADD_QUANTITY)
10703 {
10704 if (IsMagazine())
10705 {
10706 Magazine mag = Magazine.Cast(this);
10707 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10708 }
10709 else
10710 {
10712 }
10713
10714 if (m_EM)
10715 {
10716 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10717 }
10718
10719 }
10720
10721 else if (action_id ==
EActions.REMOVE_QUANTITY)
10722 {
10723 if (IsMagazine())
10724 {
10725 Magazine mag2 = Magazine.Cast(this);
10726 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10727 }
10728 else
10729 {
10731 }
10732 if (m_EM)
10733 {
10734 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10735 }
10736
10737 }
10738
10739 else if (action_id ==
EActions.SET_QUANTITY_0)
10740 {
10742
10743 if (m_EM)
10744 {
10745 m_EM.SetEnergy(0);
10746 }
10747 }
10748
10749 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10750 {
10752
10753 if (m_EM)
10754 {
10755 m_EM.SetEnergy(m_EM.GetEnergyMax());
10756 }
10757 }
10758
10759 else if (action_id ==
EActions.ADD_HEALTH)
10760 {
10761 AddHealth("","",GetMaxHealth("","Health")/5);
10762 }
10763 else if (action_id ==
EActions.REMOVE_HEALTH)
10764 {
10765 AddHealth("","",-GetMaxHealth("","Health")/5);
10766 }
10767 else if (action_id ==
EActions.DESTROY_HEALTH)
10768 {
10769 SetHealth01("","",0);
10770 }
10771 else if (action_id ==
EActions.WATCH_ITEM)
10772 {
10774 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10775 #ifdef DEVELOPER
10776 SetDebugDeveloper_item(this);
10777 #endif
10778 }
10779
10780 else if (action_id ==
EActions.ADD_TEMPERATURE)
10781 {
10782 AddTemperature(20);
10783
10784 }
10785
10786 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10787 {
10788 AddTemperature(-20);
10789
10790 }
10791
10792 else if (action_id ==
EActions.FLIP_FROZEN)
10793 {
10794 SetFrozen(!GetIsFrozen());
10795
10796 }
10797
10798 else if (action_id ==
EActions.ADD_WETNESS)
10799 {
10801
10802 }
10803
10804 else if (action_id ==
EActions.REMOVE_WETNESS)
10805 {
10807
10808 }
10809
10810 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10811 {
10814
10815
10816 }
10817
10818 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10819 {
10822 }
10823
10824 else if (action_id ==
EActions.MAKE_SPECIAL)
10825 {
10826 auto debugParams = DebugSpawnParams.WithPlayer(player);
10827 OnDebugSpawnEx(debugParams);
10828 }
10829
10830 else if (action_id ==
EActions.DELETE)
10831 {
10832 Delete();
10833 }
10834
10835 }
10836
10837
10838 return false;
10839 }
10840
10841
10842
10843
10847
10850
10851
10852
10854 {
10855 return false;
10856 }
10857
10858
10860 {
10861 return true;
10862 }
10863
10864
10866 {
10867 return true;
10868 }
10869
10870
10871
10873 {
10874 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10876 }
10877
10880 {
10881 return null;
10882 }
10883
10885 {
10886 return false;
10887 }
10888
10890 {
10891 return false;
10892 }
10893
10897
10898
10900 {
10901 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10902 return module_repairing.CanRepair(this, item_repair_kit);
10903 }
10904
10905
10906 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10907 {
10908 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10909 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10910 }
10911
10912
10914 {
10915
10916
10917
10918
10919
10920
10921
10922
10923 return 1;
10924 }
10925
10926
10927
10929 {
10931 }
10932
10933
10934
10936 {
10938 }
10939
10940
10949 {
10950 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10951
10952 if (player)
10953 {
10954 player.MessageStatus(text);
10955 }
10956 }
10957
10958
10967 {
10968 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10969
10970 if (player)
10971 {
10972 player.MessageAction(text);
10973 }
10974 }
10975
10976
10985 {
10986 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10987
10988 if (player)
10989 {
10990 player.MessageFriendly(text);
10991 }
10992 }
10993
10994
11003 {
11004 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11005
11006 if (player)
11007 {
11008 player.MessageImportant(text);
11009 }
11010 }
11011
11013 {
11014 return true;
11015 }
11016
11017
11018 override bool KindOf(
string tag)
11019 {
11020 bool found = false;
11021 string item_name = this.
GetType();
11024
11025 int array_size = item_tag_array.Count();
11026 for (int i = 0; i < array_size; i++)
11027 {
11028 if (item_tag_array.Get(i) == tag)
11029 {
11030 found = true;
11031 break;
11032 }
11033 }
11034 return found;
11035 }
11036
11037
11039 {
11040
11041 super.OnRPC(sender, rpc_type,ctx);
11042
11043
11044 switch (rpc_type)
11045 {
11046 #ifndef SERVER
11047 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11048 Param2<bool, string> p = new Param2<bool, string>(false, "");
11049
11051 return;
11052
11053 bool play = p.param1;
11054 string soundSet = p.param2;
11055
11056 if (play)
11057 {
11059 {
11061 {
11063 }
11064 }
11065 else
11066 {
11068 }
11069 }
11070 else
11071 {
11073 }
11074
11075 break;
11076 #endif
11077
11078 }
11079
11081 {
11083 }
11084 }
11085
11086
11087
11088
11090 {
11091 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11092 return plugin.GetID(
name);
11093 }
11094
11096 {
11097 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11098 return plugin.GetName(id);
11099 }
11100
11103 {
11104
11105
11106 int varFlags;
11107 if (!ctx.
Read(varFlags))
11108 return;
11109
11110 if (varFlags & ItemVariableFlags.FLOAT)
11111 {
11113 }
11114 }
11115
11117 {
11118
11119 super.SerializeNumericalVars(floats_out);
11120
11121
11122
11124 {
11126 }
11127
11129 {
11131 }
11132
11134 {
11136 }
11137
11139 {
11144 }
11145
11147 {
11149 }
11150 }
11151
11153 {
11154
11155 super.DeSerializeNumericalVars(floats);
11156
11157
11158 int index = 0;
11159 int mask = Math.Round(floats.Get(index));
11160
11161 index++;
11162
11164 {
11166 {
11168 }
11169 else
11170 {
11171 float quantity = floats.Get(index);
11172 SetQuantity(quantity,
true,
false,
false,
false);
11173 }
11174 index++;
11175 }
11176
11178 {
11179 float wet = floats.Get(index);
11181 index++;
11182 }
11183
11185 {
11186 int liquidtype = Math.Round(floats.Get(index));
11188 index++;
11189 }
11190
11192 {
11194 index++;
11196 index++;
11198 index++;
11200 index++;
11201 }
11202
11204 {
11205 int cleanness = Math.Round(floats.Get(index));
11207 index++;
11208 }
11209 }
11210
11212 {
11213 super.WriteVarsToCTX(ctx);
11214
11215
11217 {
11219 }
11220
11222 {
11224 }
11225
11227 {
11229 }
11230
11232 {
11233 int r,g,b,a;
11239 }
11240
11242 {
11244 }
11245 }
11246
11248 {
11249 if (!super.ReadVarsFromCTX(ctx,version))
11250 return false;
11251
11252 int intValue;
11253 float value;
11254
11255 if (version < 140)
11256 {
11257 if (!ctx.
Read(intValue))
11258 return false;
11259
11260 m_VariablesMask = intValue;
11261 }
11262
11264 {
11265 if (!ctx.
Read(value))
11266 return false;
11267
11269 {
11271 }
11272 else
11273 {
11275 }
11276 }
11277
11278 if (version < 140)
11279 {
11281 {
11282 if (!ctx.
Read(value))
11283 return false;
11284 SetTemperatureDirect(value);
11285 }
11286 }
11287
11289 {
11290 if (!ctx.
Read(value))
11291 return false;
11293 }
11294
11296 {
11297 if (!ctx.
Read(intValue))
11298 return false;
11300 }
11301
11303 {
11304 int r,g,b,a;
11306 return false;
11308 return false;
11310 return false;
11312 return false;
11313
11315 }
11316
11318 {
11319 if (!ctx.
Read(intValue))
11320 return false;
11322 }
11323
11324 if (version >= 138 && version < 140)
11325 {
11327 {
11328 if (!ctx.
Read(intValue))
11329 return false;
11330 SetFrozen(intValue);
11331 }
11332 }
11333
11334 return true;
11335 }
11336
11337
11339 {
11342 {
11344 }
11345
11346 if (!super.OnStoreLoad(ctx, version))
11347 {
11349 return false;
11350 }
11351
11352 if (version >= 114)
11353 {
11354 bool hasQuickBarIndexSaved;
11355
11356 if (!ctx.
Read(hasQuickBarIndexSaved))
11357 {
11359 return false;
11360 }
11361
11362 if (hasQuickBarIndexSaved)
11363 {
11364 int itmQBIndex;
11365
11366
11367 if (!ctx.
Read(itmQBIndex))
11368 {
11370 return false;
11371 }
11372
11373 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11374 if (itmQBIndex != -1 && parentPlayer)
11375 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11376 }
11377 }
11378 else
11379 {
11380
11381 PlayerBase player;
11382 int itemQBIndex;
11383 if (version ==
int.
MAX)
11384 {
11385 if (!ctx.
Read(itemQBIndex))
11386 {
11388 return false;
11389 }
11390 }
11391 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11392 {
11393
11394 if (!ctx.
Read(itemQBIndex))
11395 {
11397 return false;
11398 }
11399 if (itemQBIndex != -1 && player)
11400 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11401 }
11402 }
11403
11404 if (version < 140)
11405 {
11406
11407 if (!LoadVariables(ctx, version))
11408 {
11410 return false;
11411 }
11412 }
11413
11414
11416 {
11418 return false;
11419 }
11420 if (version >= 132)
11421 {
11423 if (raib)
11424 {
11426 {
11428 return false;
11429 }
11430 }
11431 }
11432
11434 return true;
11435 }
11436
11437
11438
11440 {
11441 super.OnStoreSave(ctx);
11442
11443 PlayerBase player;
11444 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11445 {
11447
11448 int itemQBIndex = -1;
11449 itemQBIndex = player.FindQuickBarEntityIndex(this);
11450 ctx.
Write(itemQBIndex);
11451 }
11452 else
11453 {
11455 }
11456
11458
11460 if (raib)
11461 {
11463 }
11464 }
11465
11466
11468 {
11469 super.AfterStoreLoad();
11470
11472 {
11474 }
11475
11477 {
11480 }
11481 }
11482
11484 {
11485 super.EEOnAfterLoad();
11486
11488 {
11490 }
11491
11494 }
11495
11497 {
11498 return false;
11499 }
11500
11501
11502
11504 {
11506 {
11507 #ifdef PLATFORM_CONSOLE
11508
11510 {
11512 if (menu)
11513 {
11515 }
11516 }
11517 #endif
11518 }
11519
11521 {
11524 }
11525
11527 {
11528 SetWeightDirty();
11530 }
11532 {
11535 }
11536
11538 {
11541 }
11543 {
11546 }
11547
11548 super.OnVariablesSynchronized();
11549 }
11550
11551
11552
11554 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11555 {
11556 if (!IsServerCheck(allow_client))
11557 return false;
11558
11560 return false;
11561
11564
11565 if (value <= (min + 0.001))
11566 value = min;
11567
11568 if (value == min)
11569 {
11570 if (destroy_config)
11571 {
11572 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11573 if (dstr)
11574 {
11576 this.Delete();
11577 return true;
11578 }
11579 }
11580 else if (destroy_forced)
11581 {
11583 this.Delete();
11584 return true;
11585 }
11586
11588 }
11589
11592
11594 {
11596
11597 if (delta)
11599 }
11600
11602
11603 return false;
11604 }
11605
11606
11608 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11609 {
11611 }
11612
11614 {
11617 }
11618
11620 {
11623 }
11624
11627 {
11628 float value_clamped = Math.Clamp(value, 0, 1);
11630 SetQuantity(result, destroy_config, destroy_forced);
11631 }
11632
11633
11636 {
11638 }
11639
11641 {
11643 }
11644
11645
11646
11647
11648
11649
11650
11651
11652
11653
11655 {
11656 int slot = -1;
11657 if (GetInventory())
11658 {
11659 InventoryLocation il = new InventoryLocation;
11660 GetInventory().GetCurrentInventoryLocation(il);
11662 }
11663
11665 }
11666
11668 {
11669 float quantity_max = 0;
11670
11672 {
11673 if (attSlotID != -1)
11674 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11675
11676 if (quantity_max <= 0)
11678 }
11679
11680 if (quantity_max <= 0)
11682
11683 return quantity_max;
11684 }
11685
11687 {
11689 }
11690
11692 {
11694 }
11695
11696
11698 {
11700 }
11701
11703 {
11705 }
11706
11708 {
11710 }
11711
11712
11714 {
11715
11716 float weightEx = GetWeightEx();
11717 float special = GetInventoryAndCargoWeight();
11718 return weightEx - special;
11719 }
11720
11721
11723 {
11725 }
11726
11728 {
11730 {
11731 #ifdef DEVELOPER
11732 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11733 {
11734 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11736 }
11737 #endif
11738
11739 return GetQuantity() * GetConfigWeightModified();
11740 }
11741 else if (HasEnergyManager())
11742 {
11743 #ifdef DEVELOPER
11744 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11745 {
11746 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11747 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11748 }
11749 #endif
11750 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11751 }
11752 else
11753 {
11754 #ifdef DEVELOPER
11755 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11756 {
11757 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11758 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11759 }
11760 #endif
11761 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11762 }
11763 }
11764
11767 {
11768 int item_count = 0;
11770
11771 if (GetInventory().GetCargo() != NULL)
11772 {
11773 item_count = GetInventory().GetCargo().GetItemCount();
11774 }
11775
11776 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11777 {
11778 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11779 if (item)
11780 item_count += item.GetNumberOfItems();
11781 }
11782 return item_count;
11783 }
11784
11787 {
11788 float weight = 0;
11789 float wetness = 1;
11790 if (include_wetness)
11793 {
11794 weight = wetness * m_ConfigWeight;
11795 }
11797 {
11798 weight = 1;
11799 }
11800 return weight;
11801 }
11802
11803
11804
11806 {
11807 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11808 {
11809 GameInventory inv = GetInventory();
11810 array<EntityAI> items = new array<EntityAI>;
11812 for (int i = 0; i < items.Count(); i++)
11813 {
11815 if (item)
11816 {
11818 }
11819 }
11820 }
11821 }
11822
11823
11824
11825
11827 {
11828 float energy = 0;
11829 if (HasEnergyManager())
11830 {
11831 energy = GetCompEM().GetEnergy();
11832 }
11833 return energy;
11834 }
11835
11836
11838 {
11839 super.OnEnergyConsumed();
11840
11842 }
11843
11845 {
11846 super.OnEnergyAdded();
11847
11849 }
11850
11851
11853 {
11854 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11855 {
11857 {
11858 float energy_0to1 = GetCompEM().GetEnergy0To1();
11860 }
11861 }
11862 }
11863
11864
11866 {
11867 return ConfigGetFloat("heatIsolation");
11868 }
11869
11871 {
11873 }
11874
11876 {
11877 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11878 if (
GetGame().ConfigIsExisting(paramPath))
11880
11881 return 0.0;
11882 }
11883
11885 {
11886 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11887 if (
GetGame().ConfigIsExisting(paramPath))
11889
11890 return 0.0;
11891 }
11892
11893 override void SetWet(
float value,
bool allow_client =
false)
11894 {
11895 if (!IsServerCheck(allow_client))
11896 return;
11897
11900
11902
11903 m_VarWet = Math.Clamp(value, min, max);
11904
11906 {
11909 }
11910 }
11911
11912 override void AddWet(
float value)
11913 {
11915 }
11916
11918 {
11920 }
11921
11923 {
11925 }
11926
11928 {
11930 }
11931
11933 {
11935 }
11936
11938 {
11940 }
11941
11942 override void OnWetChanged(
float newVal,
float oldVal)
11943 {
11946 if (newLevel != oldLevel)
11947 {
11949 }
11950 }
11951
11953 {
11954 SetWeightDirty();
11955 }
11956
11958 {
11959 return GetWetLevelInternal(
m_VarWet);
11960 }
11961
11962
11963
11965 {
11967 }
11968
11970 {
11972 }
11973
11975 {
11977 }
11978
11980 {
11982 }
11983
11984
11985
11987 {
11988 if (ConfigIsExisting("itemModelLength"))
11989 {
11990 return ConfigGetFloat("itemModelLength");
11991 }
11992 return 0;
11993 }
11994
11996 {
11997 if (ConfigIsExisting("itemAttachOffset"))
11998 {
11999 return ConfigGetFloat("itemAttachOffset");
12000 }
12001 return 0;
12002 }
12003
12004 override void SetCleanness(
int value,
bool allow_client =
false)
12005 {
12006 if (!IsServerCheck(allow_client))
12007 return;
12008
12010
12012
12015 }
12016
12018 {
12020 }
12021
12023 {
12024 return true;
12025 }
12026
12027
12028
12029
12031 {
12033 }
12034
12036 {
12038 }
12039
12040
12041
12042
12043 override void SetColor(
int r,
int g,
int b,
int a)
12044 {
12050 }
12052 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12053 {
12058 }
12059
12061 {
12063 }
12064
12067 {
12068 int r,g,b,a;
12070 r = r/255;
12071 g = g/255;
12072 b = b/255;
12073 a = a/255;
12074 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12075 }
12076
12077
12078
12079 override void SetLiquidType(
int value,
bool allow_client =
false)
12080 {
12081 if (!IsServerCheck(allow_client))
12082 return;
12083
12088 }
12089
12091 {
12092 return ConfigGetInt("varLiquidTypeInit");
12093 }
12094
12096 {
12098 }
12099
12101 {
12103 SetFrozen(false);
12104 }
12105
12108 {
12109 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12110 }
12111
12112
12115 {
12116 PlayerBase nplayer;
12117 if (PlayerBase.CastTo(nplayer, player))
12118 {
12120
12121 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12122 }
12123 }
12124
12125
12128 {
12129 PlayerBase nplayer;
12130 if (PlayerBase.CastTo(nplayer,player))
12131 {
12132
12133 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12134
12135 }
12136
12137
12138 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12139
12140
12141 if (HasEnergyManager())
12142 {
12143 GetCompEM().UpdatePlugState();
12144 }
12145 }
12146
12147
12149 {
12150 super.OnPlacementStarted(player);
12151
12153 }
12154
12155 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12156 {
12158 {
12159 m_AdminLog.OnPlacementComplete(player,
this);
12160 }
12161
12162 super.OnPlacementComplete(player, position, orientation);
12163 }
12164
12165
12166
12167
12168
12170 {
12172 {
12173 return true;
12174 }
12175 else
12176 {
12177 return false;
12178 }
12179 }
12180
12181
12183 {
12185 {
12187 }
12188 }
12189
12190
12192 {
12194 }
12195
12197 {
12199 }
12200
12201 override void InsertAgent(
int agent,
float count = 1)
12202 {
12203 if (count < 1)
12204 return;
12205
12207 }
12208
12211 {
12213 }
12214
12215
12217 {
12219 }
12220
12221
12222
12223
12224
12225
12226
12227
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12263 {
12265 return false;
12266 return true;
12267 }
12268
12270 {
12271
12273 }
12274
12275
12278 {
12279 super.CheckForRoofLimited(timeTresholdMS);
12280
12282 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12283 {
12284 m_PreviousRoofTestTime = time;
12285 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12286 }
12287 }
12288
12289
12291 {
12293 {
12294 return 0;
12295 }
12296
12297 if (GetInventory().GetAttachmentSlotsCount() != 0)
12298 {
12299 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12300 if (filter)
12301 return filter.GetProtectionLevel(type, false, system);
12302 else
12303 return 0;
12304 }
12305
12306 string subclassPath, entryName;
12307
12308 switch (type)
12309 {
12311 entryName = "biological";
12312 break;
12314 entryName = "chemical";
12315 break;
12316 default:
12317 entryName = "biological";
12318 break;
12319 }
12320
12321 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12322
12324 }
12325
12326
12327
12330 {
12331 if (!IsMagazine())
12333
12335 }
12336
12337
12338
12339
12340
12345 {
12346 return true;
12347 }
12348
12350 {
12352 }
12353
12354
12355
12356
12357
12359 {
12360 if (parent)
12361 {
12362 if (parent.IsInherited(DayZInfected))
12363 return true;
12364
12365 if (!parent.IsRuined())
12366 return true;
12367 }
12368
12369 return true;
12370 }
12371
12373 {
12374 if (!super.CanPutAsAttachment(parent))
12375 {
12376 return false;
12377 }
12378
12379 if (!IsRuined() && !parent.IsRuined())
12380 {
12381 return true;
12382 }
12383
12384 return false;
12385 }
12386
12388 {
12389
12390
12391
12392
12393 return super.CanReceiveItemIntoCargo(item);
12394 }
12395
12397 {
12398
12399
12400
12401
12402 GameInventory attachmentInv = attachment.GetInventory();
12404 {
12405 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12406 return false;
12407 }
12408
12409 InventoryLocation loc = new InventoryLocation();
12410 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12411 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12412 return false;
12413
12414 return super.CanReceiveAttachment(attachment, slotId);
12415 }
12416
12418 {
12419 if (!super.CanReleaseAttachment(attachment))
12420 return false;
12421
12422 return GetInventory().AreChildrenAccessible();
12423 }
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12446 {
12447 int id = muzzle_owner.GetMuzzleID();
12448 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12449
12450 if (WPOF_array)
12451 {
12452 for (int i = 0; i < WPOF_array.Count(); i++)
12453 {
12454 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12455
12456 if (WPOF)
12457 {
12458 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12459 }
12460 }
12461 }
12462 }
12463
12464
12466 {
12467 int id = muzzle_owner.GetMuzzleID();
12469
12470 if (WPOBE_array)
12471 {
12472 for (int i = 0; i < WPOBE_array.Count(); i++)
12473 {
12474 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12475
12476 if (WPOBE)
12477 {
12478 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12479 }
12480 }
12481 }
12482 }
12483
12484
12486 {
12487 int id = muzzle_owner.GetMuzzleID();
12488 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12489
12490 if (WPOOH_array)
12491 {
12492 for (int i = 0; i < WPOOH_array.Count(); i++)
12493 {
12494 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12495
12496 if (WPOOH)
12497 {
12498 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12499 }
12500 }
12501 }
12502 }
12503
12504
12506 {
12507 int id = muzzle_owner.GetMuzzleID();
12508 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12509
12510 if (WPOOH_array)
12511 {
12512 for (int i = 0; i < WPOOH_array.Count(); i++)
12513 {
12514 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12515
12516 if (WPOOH)
12517 {
12518 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12519 }
12520 }
12521 }
12522 }
12523
12524
12526 {
12527 int id = muzzle_owner.GetMuzzleID();
12528 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12529
12530 if (WPOOH_array)
12531 {
12532 for (int i = 0; i < WPOOH_array.Count(); i++)
12533 {
12534 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12535
12536 if (WPOOH)
12537 {
12538 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12539 }
12540 }
12541 }
12542 }
12543
12544
12545
12547 {
12549 {
12550 return true;
12551 }
12552
12553 return false;
12554 }
12555
12557 {
12559 {
12560 return true;
12561 }
12562
12563 return false;
12564 }
12565
12567 {
12569 {
12570 return true;
12571 }
12572
12573 return false;
12574 }
12575
12577 {
12578 return false;
12579 }
12580
12583 {
12584 return UATimeSpent.DEFAULT_DEPLOY;
12585 }
12586
12587
12588
12589
12591 {
12593 SetSynchDirty();
12594 }
12595
12597 {
12599 }
12600
12601
12603 {
12604 return false;
12605 }
12606
12609 {
12610 string att_type = "None";
12611
12612 if (ConfigIsExisting("soundAttType"))
12613 {
12614 att_type = ConfigGetString("soundAttType");
12615 }
12616
12618 }
12619
12621 {
12623 }
12624
12625
12626
12627
12628
12632
12634 {
12637
12639 }
12640
12641
12643 {
12645 return;
12646
12648
12651
12654
12655 SoundParameters params = new SoundParameters();
12659 }
12660
12661
12663 {
12665 return;
12666
12668 SetSynchDirty();
12669
12672 }
12673
12674
12676 {
12678 return;
12679
12681 SetSynchDirty();
12682
12685 }
12686
12688 {
12690 }
12691
12693 {
12695 }
12696
12699 {
12700 if (!
GetGame().IsDedicatedServer())
12701 {
12702 if (ConfigIsExisting("attachSoundSet"))
12703 {
12704 string cfg_path = "";
12705 string soundset = "";
12706 string type_name =
GetType();
12707
12710 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12711 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12712
12713 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12714 {
12715 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12716 {
12717 if (cfg_slot_array[i] == slot_type)
12718 {
12719 soundset = cfg_soundset_array[i];
12720 break;
12721 }
12722 }
12723 }
12724
12725 if (soundset != "")
12726 {
12727 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12729 }
12730 }
12731 }
12732 }
12733
12735 {
12736
12737 }
12738
12739 void OnApply(PlayerBase player);
12740
12742 {
12743 return 1.0;
12744 };
12745
12747 {
12749 }
12750
12752 {
12754 }
12755
12757
12759 {
12760 SetDynamicPhysicsLifeTime(0.01);
12762 }
12763
12765 {
12766 array<string> zone_names = new array<string>;
12767 GetDamageZones(zone_names);
12768 for (int i = 0; i < zone_names.Count(); i++)
12769 {
12770 SetHealthMax(zone_names.Get(i),"Health");
12771 }
12772 SetHealthMax("","Health");
12773 }
12774
12777 {
12778 float global_health = GetHealth01("","Health");
12779 array<string> zones = new array<string>;
12780 GetDamageZones(zones);
12781
12782 for (int i = 0; i < zones.Count(); i++)
12783 {
12784 SetHealth01(zones.Get(i),"Health",global_health);
12785 }
12786 }
12787
12790 {
12791 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12792 }
12793
12795 {
12796 if (!hasRootAsPlayer)
12797 {
12798 if (refParentIB)
12799 {
12800
12801 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12802 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12803
12804 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12805 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12806
12809 }
12810 else
12811 {
12812
12815 }
12816 }
12817 }
12818
12820 {
12822 {
12823 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12824 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12825 {
12826 float heatPermCoef = 1.0;
12828 while (ent)
12829 {
12830 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12831 ent = ent.GetHierarchyParent();
12832 }
12833
12834 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12835 }
12836 }
12837 }
12838
12840 {
12841
12842 EntityAI parent = GetHierarchyParent();
12843 if (!parent)
12844 {
12845 hasParent = false;
12846 hasRootAsPlayer = false;
12847 }
12848 else
12849 {
12850 hasParent = true;
12851 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12852 refParentIB =
ItemBase.Cast(parent);
12853 }
12854 }
12855
12856 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12857 {
12858
12859 }
12860
12862 {
12863
12864 return false;
12865 }
12866
12868 {
12869
12870
12871 return false;
12872 }
12873
12875 {
12876
12877 return false;
12878 }
12879
12882 {
12883 return !GetIsFrozen() &&
IsOpen();
12884 }
12885
12887 {
12888 bool hasParent = false, hasRootAsPlayer = false;
12890
12891 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12892 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12893
12894 if (wwtu || foodDecay)
12895 {
12899
12900 if (processWetness || processTemperature || processDecay)
12901 {
12903
12904 if (processWetness)
12905 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12906
12907 if (processTemperature)
12909
12910 if (processDecay)
12911 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12912 }
12913 }
12914 }
12915
12918 {
12920 }
12921
12923 {
12926
12927 return super.GetTemperatureFreezeThreshold();
12928 }
12929
12931 {
12934
12935 return super.GetTemperatureThawThreshold();
12936 }
12937
12939 {
12942
12943 return super.GetItemOverheatThreshold();
12944 }
12945
12947 {
12949 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12950
12951 return super.GetTemperatureFreezeTime();
12952 }
12953
12955 {
12957 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12958
12959 return super.GetTemperatureThawTime();
12960 }
12961
12966
12968 {
12969 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12970 }
12971
12973 {
12974 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12975 }
12976
12979 {
12981 }
12982
12984 {
12986 }
12987
12989 {
12991 }
12992
12995 {
12996 return null;
12997 }
12998
13001 {
13002 return false;
13003 }
13004
13006 {
13008 {
13011 if (!trg)
13012 {
13014 explosive = this;
13015 }
13016
13017 explosive.PairRemote(trg);
13019
13020 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13021 trg.SetPersistentPairID(persistentID);
13022 explosive.SetPersistentPairID(persistentID);
13023
13024 return true;
13025 }
13026 return false;
13027 }
13028
13031 {
13032 float ret = 1.0;
13035 ret *= GetHealth01();
13036
13037 return ret;
13038 }
13039
13040 #ifdef DEVELOPER
13041 override void SetDebugItem()
13042 {
13043 super.SetDebugItem();
13044 _itemBase = this;
13045 }
13046
13048 {
13049 string text = super.GetDebugText();
13050
13052 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13053
13054 return text;
13055 }
13056 #endif
13057
13059 {
13060 return true;
13061 }
13062
13064
13066
13068 {
13071 }
13072
13073
13081
13097}
13098
13100{
13102 if (entity)
13103 {
13104 bool is_item = entity.IsInherited(
ItemBase);
13105 if (is_item && full_quantity)
13106 {
13109 }
13110 }
13111 else
13112 {
13114 return NULL;
13115 }
13116 return entity;
13117}
13118
13120{
13121 if (item)
13122 {
13123 if (health > 0)
13124 item.SetHealth("", "", health);
13125
13126 if (item.CanHaveTemperature())
13127 {
13129 if (item.CanFreeze())
13130 item.SetFrozen(false);
13131 }
13132
13133 if (item.HasEnergyManager())
13134 {
13135 if (quantity >= 0)
13136 {
13137 item.GetCompEM().SetEnergy0To1(quantity);
13138 }
13139 else
13140 {
13142 }
13143 }
13144 else if (item.IsMagazine())
13145 {
13146 Magazine mag = Magazine.Cast(item);
13147 if (quantity >= 0)
13148 {
13149 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13150 }
13151 else
13152 {
13154 }
13155
13156 }
13157 else
13158 {
13159 if (quantity >= 0)
13160 {
13161 item.SetQuantityNormalized(quantity, false);
13162 }
13163 else
13164 {
13166 }
13167
13168 }
13169 }
13170}
13171
13172#ifdef DEVELOPER
13174#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.