8368{
8370 {
8371 return true;
8372 }
8373};
8374
8376{
8377
8378};
8379
8380
8381
8383{
8387
8389
8392
8393
8394
8395
8396
8405
8411
8416
8421
8442 protected bool m_IsResultOfSplit
8443
8445
8450
8451
8452
8454
8458
8459
8460
8462
8465
8466
8467
8473
8474
8482
8485
8486
8488
8489
8491
8492
8497
8498
8503
8505
8506
8508
8509
8511 {
8516
8517 if (!
g_Game.IsDedicatedServer())
8518 {
8520 {
8522
8524 {
8526 }
8527 }
8528
8531 }
8532
8533 m_OldLocation = null;
8534
8536 {
8538 }
8539
8540 if (ConfigIsExisting("headSelectionsToHide"))
8541 {
8544 }
8545
8547 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8548 {
8550 }
8551
8553
8554 m_IsResultOfSplit = false;
8555
8557 }
8558
8560 {
8561 super.InitItemVariables();
8562
8568 m_Count = ConfigGetInt(
"count");
8569
8572
8577
8580
8585
8597
8601
8602
8605 if (ConfigIsExisting("canBeSplit"))
8606 {
8609 }
8610
8612 if (ConfigIsExisting("itemBehaviour"))
8614
8615
8618 RegisterNetSyncVariableInt("m_VarLiquidType");
8619 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8620
8621 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8622 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8623 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8624
8625 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8626 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8627 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8628 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8629
8630 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8631 RegisterNetSyncVariableBool("m_IsTakeable");
8632 RegisterNetSyncVariableBool("m_IsHologram");
8633
8636 {
8639 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8640 }
8641
8643
8645 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8647
8649 }
8650
8652 {
8654 }
8655
8657 {
8660 {
8665 }
8666 }
8667
8668 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8669 {
8671 {
8674 }
8675
8677 }
8678
8680 {
8686 }
8687
8689
8691 {
8693
8694 if (!action)
8695 {
8696 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8697 return;
8698 }
8699
8701 if (!ai)
8702 {
8704 return;
8705 }
8706
8708 if (!action_array)
8709 {
8710 action_array = new array<ActionBase_Basic>;
8712 }
8713 if (LogManager.IsActionLogEnable())
8714 {
8715 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8716 }
8717
8718 if (action_array.Find(action) != -1)
8719 {
8720 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8721 }
8722 else
8723 {
8724 action_array.Insert(action);
8725 }
8726 }
8727
8729 {
8730 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8731 ActionBase action = player.GetActionManager().GetAction(actionName);
8734
8735 if (action_array)
8736 {
8737 action_array.RemoveItem(action);
8738 }
8739 }
8740
8741
8742
8744 {
8745 ActionOverrideData overrideData = new ActionOverrideData();
8749
8751 if (!actionMap)
8752 {
8755 }
8756
8757 actionMap.Insert(this.
Type(), overrideData);
8758
8759 }
8760
8762
8764
8765
8767 {
8770
8773
8774 string config_to_search = "CfgVehicles";
8775 string muzzle_owner_config;
8776
8778 {
8779 if (IsInherited(Weapon))
8780 config_to_search = "CfgWeapons";
8781
8782 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8783
8784 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8785
8786 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8787
8788 if (config_OnFire_subclass_count > 0)
8789 {
8790 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8791
8792 for (int i = 0; i < config_OnFire_subclass_count; i++)
8793 {
8794 string particle_class = "";
8795 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8796 string config_OnFire_entry = config_OnFire_class + particle_class;
8797 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8798 WPOF_array.Insert(WPOF);
8799 }
8800
8801
8803 }
8804 }
8805
8807 {
8808 config_to_search = "CfgWeapons";
8809 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8810
8811 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8812
8813 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8814
8815 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8816 {
8817 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8818
8819 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8820 {
8821 string particle_class2 = "";
8822 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8823 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8824 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8825 WPOBE_array.Insert(WPOBE);
8826 }
8827
8828
8830 }
8831 }
8832 }
8833
8834
8836 {
8839
8841 {
8842 string config_to_search = "CfgVehicles";
8843
8844 if (IsInherited(Weapon))
8845 config_to_search = "CfgWeapons";
8846
8847 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8848 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8849
8850 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8851 {
8852
8854
8856 {
8858 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8860 return;
8861 }
8862
8865
8866
8867
8868 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8869 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8870
8871 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8872 {
8873 string particle_class = "";
8874 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8875 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8876 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8877
8878 if (entry_type == CT_CLASS)
8879 {
8880 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8881 WPOOH_array.Insert(WPOF);
8882 }
8883 }
8884
8885
8887 }
8888 }
8889 }
8890
8892 {
8894 }
8895
8897 {
8899 {
8901
8904
8907
8908 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8909 }
8910 }
8911
8913 {
8915 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8916
8918 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8919
8921 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8922
8924 {
8926 }
8927 }
8928
8930 {
8932 }
8933
8935 {
8938 else
8940
8942 {
8945 }
8946 else
8947 {
8950
8953 }
8954
8956 }
8957
8959 {
8961 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8962 }
8963
8965 {
8967 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8969 }
8970
8972 {
8974 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8975 }
8976
8978 {
8981
8982 OverheatingParticle OP = new OverheatingParticle();
8987
8989 }
8990
8992 {
8995
8996 return -1;
8997 }
8998
9000 {
9002 {
9005
9006 for (int i = count; i > 0; --i)
9007 {
9008 int id = i - 1;
9011
9014
9015 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9016 {
9017 if (p)
9018 {
9021 }
9022 }
9023 }
9024 }
9025 }
9026
9028 {
9030 {
9032 {
9033 int id = i - 1;
9035
9036 if (OP)
9037 {
9039
9040 if (p)
9041 {
9043 }
9044
9045 delete OP;
9046 }
9047 }
9048
9051 }
9052 }
9053
9056 {
9057 return 0.0;
9058 }
9059
9060
9062 {
9063 return 250;
9064 }
9065
9067 {
9068 return 0;
9069 }
9070
9073 {
9075 return true;
9076
9077 return false;
9078 }
9079
9082 {
9085
9087 {
9089 }
9090 else
9091 {
9092
9094 }
9095
9097 }
9098
9105 {
9106 return -1;
9107 }
9108
9109
9110
9111
9113 {
9115 {
9116 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9117 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9118
9119 if (r_index >= 0)
9120 {
9121 InventoryLocation r_il = new InventoryLocation;
9122 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9123
9124 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9127 {
9128 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9129 }
9131 {
9132 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9133 }
9134
9135 }
9136
9137 player.GetHumanInventory().ClearUserReservedLocation(this);
9138 }
9139
9142 }
9143
9144
9145
9146
9148 {
9149 return ItemBase.m_DebugActionsMask;
9150 }
9151
9153 {
9154 return ItemBase.m_DebugActionsMask & mask;
9155 }
9156
9158 {
9159 ItemBase.m_DebugActionsMask = mask;
9160 }
9161
9163 {
9164 ItemBase.m_DebugActionsMask |= mask;
9165 }
9166
9168 {
9169 ItemBase.m_DebugActionsMask &= ~mask;
9170 }
9171
9173 {
9175 {
9177 }
9178 else
9179 {
9181 }
9182 }
9183
9184
9186 {
9187 if (GetEconomyProfile())
9188 {
9189 float q_max = GetEconomyProfile().GetQuantityMax();
9190 if (q_max > 0)
9191 {
9192 float q_min = GetEconomyProfile().GetQuantityMin();
9193 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9194
9196 {
9197 ComponentEnergyManager comp = GetCompEM();
9199 {
9201 }
9202 }
9204 {
9206
9207 }
9208
9209 }
9210 }
9211 }
9212
9215 {
9216 EntityAI parent = GetHierarchyParent();
9217
9218 if (parent)
9219 {
9220 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9221 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9222 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9223 }
9224 }
9225
9228 {
9229 EntityAI parent = GetHierarchyParent();
9230
9231 if (parent)
9232 {
9233 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9234 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9235 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9236 }
9237 }
9238
9240 {
9241
9242
9243
9244
9246
9248 {
9249 if (ScriptInputUserData.CanStoreInputUserData())
9250 {
9251 ScriptInputUserData ctx = new ScriptInputUserData;
9257 ctx.
Write(use_stack_max);
9260
9262 {
9263 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9264 }
9265 }
9266 }
9267 else if (!
g_Game.IsMultiplayer())
9268 {
9270 }
9271 }
9272
9274 {
9276 }
9277
9279 {
9281 }
9282
9284 {
9286 }
9287
9289 {
9290
9291 return false;
9292 }
9293
9295 {
9296 return false;
9297 }
9298
9302 {
9303 return false;
9304 }
9305
9307 {
9308 return "";
9309 }
9310
9312
9314 {
9315 return false;
9316 }
9317
9319 {
9320 return true;
9321 }
9322
9323
9324
9326 {
9327 return true;
9328 }
9329
9331 {
9332 return true;
9333 }
9334
9336 {
9337 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9339 }
9340
9342 {
9344 }
9345
9347 {
9349 if (!is_being_placed)
9351 SetSynchDirty();
9352 }
9353
9354
9356
9358 {
9360 }
9361
9363 {
9365 }
9366
9368 {
9369 return 1;
9370 }
9371
9373 {
9374 return false;
9375 }
9376
9378 {
9380 SetSynchDirty();
9381 }
9382
9383
9384
9385
9386
9387
9388
9389
9390
9391
9392
9393
9394
9395
9396
9397
9398
9399
9400
9401
9402
9403
9404
9405
9406
9407
9408
9409
9410
9411
9412
9413
9414
9415
9416
9418 {
9419 super.OnMovedInsideCargo(container);
9420
9421 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9422 }
9423
9424 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9425 {
9426 super.EEItemLocationChanged(oldLoc, newLoc);
9427
9428 PlayerBase newPlayer = null;
9429 PlayerBase oldPlayer = null;
9430
9431 if (newLoc.GetParent())
9432 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9433
9434 if (oldLoc.GetParent())
9435 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9436
9438 {
9439 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9440
9441 if (rIndex >= 0)
9442 {
9443 InventoryLocation rIl = new InventoryLocation;
9444 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9445
9446 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9449 {
9450 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9451 }
9453 {
9455 }
9456
9457 }
9458 }
9459
9461 {
9462 if (newPlayer)
9463 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9464
9465 if (newPlayer == oldPlayer)
9466 {
9467 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9468 {
9470 {
9471 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9472 {
9473 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9474 }
9475 }
9476 else
9477 {
9478 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9479 }
9480 }
9481
9482 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9483 {
9484 int type = oldLoc.GetType();
9486 {
9487 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9488 }
9490 {
9491 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9492 }
9493 }
9494 if (!m_OldLocation)
9495 {
9496 m_OldLocation = new InventoryLocation;
9497 }
9498 m_OldLocation.Copy(oldLoc);
9499 }
9500 else
9501 {
9502 if (m_OldLocation)
9503 {
9504 m_OldLocation.Reset();
9505 }
9506 }
9507
9508 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9509 }
9510 else
9511 {
9512 if (newPlayer)
9513 {
9514 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9515 if (resIndex >= 0)
9516 {
9517 InventoryLocation il = new InventoryLocation;
9518 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9520 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9523 {
9524 il.
GetParent().GetOnReleaseLock().Invoke(it);
9525 }
9527 {
9529 }
9530
9531 }
9532 }
9534 {
9535
9537 }
9538
9539 if (m_OldLocation)
9540 {
9541 m_OldLocation.Reset();
9542 }
9543 }
9544
9546 {
9547 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9548 }
9549
9551 {
9552 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9553 }
9554 }
9555
9556 override void EOnContact(IEntity other, Contact extra)
9557 {
9559 {
9560 int liquidType = -1;
9562 if (impactSpeed > 0.0)
9563 {
9565 #ifndef SERVER
9567 #else
9569 SetSynchDirty();
9570 #endif
9572 }
9573 }
9574
9575 #ifdef SERVER
9576 if (GetCompEM() && GetCompEM().IsPlugged())
9577 {
9578 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9579 GetCompEM().UnplugThis();
9580 }
9581 #endif
9582 }
9583
9585
9587 {
9589 }
9590
9592 {
9593
9594 }
9595
9597 {
9598 super.OnItemLocationChanged(old_owner, new_owner);
9599
9600 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9601 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9602
9603 if (!relatedPlayer && playerNew)
9604 relatedPlayer = playerNew;
9605
9606 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9607 {
9609 if (actionMgr)
9610 {
9611 ActionBase currentAction = actionMgr.GetRunningAction();
9612 if (currentAction)
9614 }
9615 }
9616
9617 Man ownerPlayerOld = null;
9618 Man ownerPlayerNew = null;
9619
9620 if (old_owner)
9621 {
9622 if (old_owner.
IsMan())
9623 {
9624 ownerPlayerOld = Man.Cast(old_owner);
9625 }
9626 else
9627 {
9628 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9629 }
9630 }
9631 else
9632 {
9634 {
9636
9637 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9638 {
9639 GetCompEM().UnplugThis();
9640 }
9641 }
9642 }
9643
9644 if (new_owner)
9645 {
9646 if (new_owner.
IsMan())
9647 {
9648 ownerPlayerNew = Man.Cast(new_owner);
9649 }
9650 else
9651 {
9652 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9653 }
9654 }
9655
9656 if (ownerPlayerOld != ownerPlayerNew)
9657 {
9658 if (ownerPlayerOld)
9659 {
9660 array<EntityAI> subItemsExit = new array<EntityAI>;
9662 for (int i = 0; i < subItemsExit.Count(); i++)
9663 {
9666 }
9667 }
9668
9669 if (ownerPlayerNew)
9670 {
9671 array<EntityAI> subItemsEnter = new array<EntityAI>;
9673 for (int j = 0; j < subItemsEnter.Count(); j++)
9674 {
9677 }
9678 }
9679 }
9680 else if (ownerPlayerNew != null)
9681 {
9682 PlayerBase nplayer;
9683 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9684 {
9685 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9687 for (int k = 0; k < subItemsUpdate.Count(); k++)
9688 {
9690 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9691 }
9692 }
9693 }
9694
9695 if (old_owner)
9696 old_owner.OnChildItemRemoved(this);
9697 if (new_owner)
9698 new_owner.OnChildItemReceived(this);
9699 }
9700
9701
9703 {
9704 super.EEDelete(parent);
9705 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9706 if (player)
9707 {
9709
9710 if (player.IsAlive())
9711 {
9712 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9713 if (r_index >= 0)
9714 {
9715 InventoryLocation r_il = new InventoryLocation;
9716 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9717
9718 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9721 {
9722 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9723 }
9725 {
9726 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9727 }
9728
9729 }
9730
9731 player.RemoveQuickBarEntityShortcut(this);
9732 }
9733 }
9734 }
9735
9737 {
9738 super.EEKilled(killer);
9739
9742 {
9743 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9744 {
9745 if (IsMagazine())
9746 {
9747 if (Magazine.Cast(this).GetAmmoCount() > 0)
9748 {
9750 }
9751 }
9752 else
9753 {
9755 }
9756 }
9757 }
9758 }
9759
9761 {
9762 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9763
9764 super.OnWasAttached(parent, slot_id);
9765
9768
9771 }
9772
9774 {
9775 super.OnWasDetached(parent, slot_id);
9776
9779
9782 }
9783
9785 {
9786 int idx;
9789
9790 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9791 if (inventory_slots.Count() < 1)
9792 {
9793 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9794 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9795 }
9796 else
9797 {
9798 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9799 }
9800
9801 idx = inventory_slots.Find(slot);
9802 if (idx < 0)
9803 return "";
9804
9805 return attach_types.Get(idx);
9806 }
9807
9809 {
9810 int idx = -1;
9811 string slot;
9812
9815
9816 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9817 if (inventory_slots.Count() < 1)
9818 {
9819 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9820 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9821 }
9822 else
9823 {
9824 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9825 if (detach_types.Count() < 1)
9826 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9827 }
9828
9829 for (int i = 0; i < inventory_slots.Count(); i++)
9830 {
9831 slot = inventory_slots.Get(i);
9832 }
9833
9834 if (slot != "")
9835 {
9836 if (detach_types.Count() == 1)
9837 idx = 0;
9838 else
9839 idx = inventory_slots.Find(slot);
9840 }
9841 if (idx < 0)
9842 return "";
9843
9844 return detach_types.Get(idx);
9845 }
9846
9848 {
9849
9851
9852
9853 float min_time = 1;
9854 float max_time = 3;
9855 float delay = Math.RandomFloat(min_time, max_time);
9856
9857 explode_timer.Run(delay, this, "DoAmmoExplosion");
9858 }
9859
9861 {
9862 Magazine magazine = Magazine.Cast(this);
9863 int pop_sounds_count = 6;
9864 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9865
9866
9867 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9868 string sound_name = pop_sounds[ sound_idx ];
9869 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9870
9871
9872 magazine.ServerAddAmmoCount(-1);
9873
9874
9875 float min_temp_to_explode = 100;
9876
9877 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9878 {
9880 }
9881 }
9882
9883
9884 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9885 {
9886 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9887
9888 const int CHANCE_DAMAGE_CARGO = 4;
9889 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9890 const int CHANCE_DAMAGE_NOTHING = 2;
9891
9893 {
9894 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9895 int chances;
9896 int rnd;
9897
9898 if (GetInventory().GetCargo())
9899 {
9900 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9901 rnd = Math.RandomInt(0,chances);
9902
9903 if (rnd < CHANCE_DAMAGE_CARGO)
9904 {
9906 }
9907 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9908 {
9910 }
9911 }
9912 else
9913 {
9914 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9915 rnd = Math.RandomInt(0,chances);
9916
9917 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9918 {
9920 }
9921 }
9922 }
9923 }
9924
9926 {
9927 CargoBase cargo = GetInventory().GetCargo();
9928 if (cargo)
9929 {
9931 if (item_count > 0)
9932 {
9933 int random_pick = Math.RandomInt(0, item_count);
9935 if (!item.IsExplosive())
9936 {
9937 item.AddHealth("","",damage);
9938 return true;
9939 }
9940 }
9941 }
9942 return false;
9943 }
9944
9946 {
9947 GameInventory inventory = GetInventory();
9949 if (attachment_count > 0)
9950 {
9951 int random_pick = Math.RandomInt(0, attachment_count);
9953 if (!attachment.IsExplosive())
9954 {
9955 attachment.AddHealth("","",damage);
9956 return true;
9957 }
9958 }
9959 return false;
9960 }
9961
9963 {
9965 }
9966
9968 {
9970 return GetInventory().CanRemoveEntity();
9971
9972 return false;
9973 }
9974
9976 {
9977
9979 return false;
9980
9981
9983 return false;
9984
9985
9986
9988 if (delta == 0)
9989 return false;
9990
9991
9992 return true;
9993 }
9994
9996 {
9998 {
9999 if (ScriptInputUserData.CanStoreInputUserData())
10000 {
10001 ScriptInputUserData ctx = new ScriptInputUserData;
10006 ctx.
Write(destination_entity);
10008 ctx.
Write(slot_id);
10010 }
10011 }
10012 else if (!
g_Game.IsMultiplayer())
10013 {
10015 }
10016 }
10017
10019 {
10020 float split_quantity_new;
10024 InventoryLocation loc = new InventoryLocation;
10025
10026 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10027 {
10029 split_quantity_new = stack_max;
10030 else
10032
10034 {
10035 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10036 if (new_item)
10037 {
10038 new_item.SetResultOfSplit(true);
10039 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10041 new_item.
SetQuantity(split_quantity_new,
false,
true);
10042 }
10043 }
10044 }
10045 else if (destination_entity && slot_id == -1)
10046 {
10047 if (quantity > stack_max)
10048 split_quantity_new = stack_max;
10049 else
10050 split_quantity_new = quantity;
10051
10053 {
10054 GameInventory destinationInventory = destination_entity.GetInventory();
10056 {
10059 }
10060
10061 if (new_item)
10062 {
10063 new_item.SetResultOfSplit(true);
10064 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10066 new_item.
SetQuantity(split_quantity_new,
false,
true);
10067 }
10068 }
10069 }
10070 else
10071 {
10072 if (stack_max != 0)
10073 {
10075 {
10077 }
10078
10079 if (split_quantity_new == 0)
10080 {
10081 if (!
g_Game.IsMultiplayer())
10082 player.PhysicalPredictiveDropItem(this);
10083 else
10084 player.ServerDropEntity(this);
10085 return;
10086 }
10087
10089 {
10091
10092 if (new_item)
10093 {
10094 new_item.SetResultOfSplit(true);
10095 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10098 new_item.PlaceOnSurface();
10099 }
10100 }
10101 }
10102 }
10103 }
10104
10106 {
10107 float split_quantity_new;
10111 InventoryLocation loc = new InventoryLocation;
10112
10113 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10114 {
10116 split_quantity_new = stack_max;
10117 else
10119
10121 {
10122 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10123 if (new_item)
10124 {
10125 new_item.SetResultOfSplit(true);
10126 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10128 new_item.
SetQuantity(split_quantity_new,
false,
true);
10129 }
10130 }
10131 }
10132 else if (destination_entity && slot_id == -1)
10133 {
10134 if (quantity > stack_max)
10135 split_quantity_new = stack_max;
10136 else
10137 split_quantity_new = quantity;
10138
10140 {
10141 GameInventory destinationInventory = destination_entity.GetInventory();
10143 {
10146 }
10147
10148 if (new_item)
10149 {
10150 new_item.SetResultOfSplit(true);
10151 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10153 new_item.
SetQuantity(split_quantity_new,
false,
true);
10154 }
10155 }
10156 }
10157 else
10158 {
10159 if (stack_max != 0)
10160 {
10162 {
10164 }
10165
10167 {
10169
10170 if (new_item)
10171 {
10172 new_item.SetResultOfSplit(true);
10173 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10176 new_item.PlaceOnSurface();
10177 }
10178 }
10179 }
10180 }
10181 }
10182
10184 {
10186 {
10187 if (ScriptInputUserData.CanStoreInputUserData())
10188 {
10189 ScriptInputUserData ctx = new ScriptInputUserData;
10194 dst.WriteToContext(ctx);
10196 }
10197 }
10198 else if (!
g_Game.IsMultiplayer())
10199 {
10201 }
10202 }
10203
10205 {
10207 {
10208 if (ScriptInputUserData.CanStoreInputUserData())
10209 {
10210 ScriptInputUserData ctx = new ScriptInputUserData;
10215 ctx.
Write(destination_entity);
10221 }
10222 }
10223 else if (!
g_Game.IsMultiplayer())
10224 {
10226 }
10227 }
10228
10230 {
10232 }
10233
10235 {
10237 float split_quantity_new;
10239 if (dst.IsValid())
10240 {
10241 int slot_id = dst.GetSlot();
10243
10244 if (quantity > stack_max)
10245 split_quantity_new = stack_max;
10246 else
10247 split_quantity_new = quantity;
10248
10250 {
10252
10253 if (new_item)
10254 {
10255 new_item.SetResultOfSplit(true);
10256 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10258 new_item.
SetQuantity(split_quantity_new,
false,
true);
10259 }
10260
10261 return new_item;
10262 }
10263 }
10264
10265 return null;
10266 }
10267
10269 {
10271 float split_quantity_new;
10273 if (destination_entity)
10274 {
10276 if (quantity > stackable)
10277 split_quantity_new = stackable;
10278 else
10279 split_quantity_new = quantity;
10280
10282 {
10283 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10284 if (new_item)
10285 {
10286 new_item.SetResultOfSplit(true);
10287 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10289 new_item.
SetQuantity(split_quantity_new,
false,
true);
10290 }
10291 }
10292 }
10293 }
10294
10296 {
10298 {
10299 if (ScriptInputUserData.CanStoreInputUserData())
10300 {
10301 ScriptInputUserData ctx = new ScriptInputUserData;
10306 ItemBase destination_entity =
this;
10307 ctx.
Write(destination_entity);
10311 }
10312 }
10313 else if (!
g_Game.IsMultiplayer())
10314 {
10316 }
10317 }
10318
10320 {
10322 float split_quantity_new;
10324 if (player)
10325 {
10327 if (quantity > stackable)
10328 split_quantity_new = stackable;
10329 else
10330 split_quantity_new = quantity;
10331
10333 {
10334 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10335 new_item =
ItemBase.Cast(in_hands);
10336 if (new_item)
10337 {
10338 new_item.SetResultOfSplit(true);
10339 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10341 new_item.SetQuantity(split_quantity_new, false, true);
10342 }
10343 }
10344 }
10345 }
10346
10348 {
10350 float split_quantity_new = Math.Floor(quantity * 0.5);
10351
10353 return;
10354
10356
10357 if (new_item)
10358 {
10359 if (new_item.GetQuantityMax() < split_quantity_new)
10360 {
10361 split_quantity_new = new_item.GetQuantityMax();
10362 }
10363
10364 new_item.SetResultOfSplit(true);
10365 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10366
10368 {
10371 }
10372 else
10373 {
10375 new_item.
SetQuantity(split_quantity_new,
false,
true);
10376 }
10377 }
10378 }
10379
10381 {
10383 float split_quantity_new = Math.Floor(quantity / 2);
10384
10386 return;
10387
10388 InventoryLocation invloc = new InventoryLocation;
10390
10392 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10393
10394 if (new_item)
10395 {
10396 if (new_item.GetQuantityMax() < split_quantity_new)
10397 {
10398 split_quantity_new = new_item.GetQuantityMax();
10399 }
10401 {
10404 }
10405 else if (split_quantity_new > 1)
10406 {
10408 new_item.
SetQuantity(split_quantity_new,
false,
true);
10409 }
10410 }
10411 }
10412
10415 {
10416 SetWeightDirty();
10418
10419 if (parent)
10420 parent.OnAttachmentQuantityChangedEx(this, delta);
10421
10423 {
10425 {
10427 }
10429 {
10430 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10432 }
10433 }
10434 }
10435
10438 {
10439
10440 }
10441
10444 {
10446 }
10447
10449 {
10450 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10451
10453 {
10454 if (newLevel == GameConstants.STATE_RUINED)
10455 {
10457 EntityAI parent = GetHierarchyParent();
10458 if (parent && parent.IsFireplace())
10459 {
10460 CargoBase cargo = GetInventory().GetCargo();
10461 if (cargo)
10462 {
10464 {
10466 }
10467 }
10468 }
10469 }
10470
10472 {
10473
10475 return;
10476 }
10477
10478 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10479 {
10481 }
10482 }
10483 }
10484
10485
10487 {
10488 super.OnRightClick();
10489
10491 {
10493 {
10494 if (ScriptInputUserData.CanStoreInputUserData())
10495 {
10496 EntityAI root = GetHierarchyRoot();
10497 Man playerOwner = GetHierarchyRootPlayer();
10498 InventoryLocation dst = new InventoryLocation;
10499
10500
10501 if (!playerOwner && root && root == this)
10502 {
10504 }
10505 else
10506 {
10507
10508 GetInventory().GetCurrentInventoryLocation(dst);
10510 {
10511 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10513 {
10515 }
10516 else
10517 {
10519
10520
10521 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10522 {
10524 }
10525 else
10526 {
10527 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10528 }
10529 }
10530 }
10531 }
10532
10533 ScriptInputUserData ctx = new ScriptInputUserData;
10541 }
10542 }
10543 else if (!
g_Game.IsMultiplayer())
10544 {
10546 }
10547 }
10548 }
10549
10551 {
10552 if (root)
10553 {
10554 vector m4[4];
10555 root.GetTransform(m4);
10556 dst.SetGround(this, m4);
10557 }
10558 else
10559 {
10560 GetInventory().GetCurrentInventoryLocation(dst);
10561 }
10562 }
10563
10564 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10565 {
10566
10567 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10568 return false;
10569
10570 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10571 return false;
10572
10573
10575 return false;
10576
10577
10578 Magazine mag = Magazine.Cast(this);
10579 if (mag)
10580 {
10581 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10582 return false;
10583
10584 if (stack_max_limit)
10585 {
10586 Magazine other_mag = Magazine.Cast(other_item);
10587 if (other_item)
10588 {
10589 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10590 return false;
10591 }
10592
10593 }
10594 }
10595 else
10596 {
10597
10599 return false;
10600
10602 return false;
10603 }
10604
10605 PlayerBase player = null;
10606 if (CastTo(player, GetHierarchyRootPlayer()))
10607 {
10608 if (player.GetInventory().HasAttachment(this))
10609 return false;
10610
10611 if (player.IsItemsToDelete())
10612 return false;
10613 }
10614
10615 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10616 return false;
10617
10618 int slotID;
10620 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10621 return false;
10622
10623 return true;
10624 }
10625
10627 {
10629 }
10630
10632 {
10633 return m_IsResultOfSplit;
10634 }
10635
10637 {
10638 m_IsResultOfSplit = value;
10639 }
10640
10642 {
10644 }
10645
10647 {
10648 float other_item_quantity = other_item.GetQuantity();
10649 float this_free_space;
10650
10652
10654
10655 if (other_item_quantity > this_free_space)
10656 {
10657 return this_free_space;
10658 }
10659 else
10660 {
10661 return other_item_quantity;
10662 }
10663 }
10664
10666 {
10668 }
10669
10671 {
10673 return;
10674
10675 if (!IsMagazine() && other_item)
10676 {
10678 if (quantity_used != 0)
10679 {
10680 float hp1 = GetHealth01("","");
10681 float hp2 = other_item.GetHealth01("","");
10682 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10683 hpResult = hpResult / (
GetQuantity() + quantity_used);
10684
10685 hpResult *= GetMaxHealth();
10686 Math.Round(hpResult);
10687 SetHealth("", "Health", hpResult);
10688
10690 other_item.AddQuantity(-quantity_used);
10691 }
10692 }
10694 }
10695
10697 {
10698 #ifdef SERVER
10699 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10700 GetHierarchyParent().IncreaseLifetimeUp();
10701 #endif
10702 };
10703
10705 {
10706 PlayerBase p = PlayerBase.Cast(player);
10707
10708 array<int> recipesIds = p.m_Recipes;
10709 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10710 if (moduleRecipesManager)
10711 {
10712 EntityAI itemInHands = player.GetEntityInHands();
10713 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10714 }
10715
10716 for (int i = 0;i < recipesIds.Count(); i++)
10717 {
10718 int key = recipesIds.Get(i);
10719 string recipeName = moduleRecipesManager.GetRecipeName(key);
10721 }
10722 }
10723
10724
10725 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10726 {
10727 super.GetDebugActions(outputList);
10728
10729
10735
10736
10741
10746
10747
10751
10752
10754 {
10758 }
10759
10762
10763
10767
10769
10770 InventoryLocation loc = new InventoryLocation();
10771 GetInventory().GetCurrentInventoryLocation(loc);
10773 {
10774 if (Gizmo_IsSupported())
10777 }
10778
10780 }
10781
10782
10783
10784
10786 {
10787 super.OnAction(action_id, player, ctx);
10788
10790 {
10791 switch (action_id)
10792 {
10796 return true;
10800 return true;
10801 }
10802 }
10803
10805 {
10806 switch (action_id)
10807 {
10809 Delete();
10810 return true;
10811 }
10812 }
10813
10814 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10815 {
10816 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10817 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10818 PlayerBase p = PlayerBase.Cast(player);
10819 if (
EActions.RECIPES_RANGE_START < 1000)
10820 {
10821 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10822 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10823 }
10824 }
10825 #ifndef SERVER
10826 else if (action_id ==
EActions.WATCH_PLAYER)
10827 {
10828 PluginDeveloper.SetDeveloperItemClientEx(player);
10829 }
10830 #endif
10832 {
10833 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10834 {
10835 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10836 OnDebugButtonPressServer(id + 1);
10837 }
10838
10839 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10840 {
10841 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10843 }
10844
10845 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10846 {
10847 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10849 }
10850
10851 else if (action_id ==
EActions.ADD_QUANTITY)
10852 {
10853 if (IsMagazine())
10854 {
10855 Magazine mag = Magazine.Cast(this);
10856 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10857 }
10858 else
10859 {
10861 }
10862
10863 if (m_EM)
10864 {
10865 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10866 }
10867
10868 }
10869
10870 else if (action_id ==
EActions.REMOVE_QUANTITY)
10871 {
10872 if (IsMagazine())
10873 {
10874 Magazine mag2 = Magazine.Cast(this);
10875 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10876 }
10877 else
10878 {
10880 }
10881 if (m_EM)
10882 {
10883 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10884 }
10885
10886 }
10887
10888 else if (action_id ==
EActions.SET_QUANTITY_0)
10889 {
10891
10892 if (m_EM)
10893 {
10894 m_EM.SetEnergy(0);
10895 }
10896 }
10897
10898 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10899 {
10901
10902 if (m_EM)
10903 {
10904 m_EM.SetEnergy(m_EM.GetEnergyMax());
10905 }
10906 }
10907
10908 else if (action_id ==
EActions.ADD_HEALTH)
10909 {
10910 AddHealth("","",GetMaxHealth("","Health")/5);
10911 }
10912 else if (action_id ==
EActions.REMOVE_HEALTH)
10913 {
10914 AddHealth("","",-GetMaxHealth("","Health")/5);
10915 }
10916 else if (action_id ==
EActions.DESTROY_HEALTH)
10917 {
10918 SetHealth01("","",0);
10919 }
10920 else if (action_id ==
EActions.WATCH_ITEM)
10921 {
10923 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10924 #ifdef DEVELOPER
10925 SetDebugDeveloper_item(this);
10926 #endif
10927 }
10928
10929 else if (action_id ==
EActions.ADD_TEMPERATURE)
10930 {
10931 AddTemperature(20);
10932
10933 }
10934
10935 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10936 {
10937 AddTemperature(-20);
10938
10939 }
10940
10941 else if (action_id ==
EActions.FLIP_FROZEN)
10942 {
10943 SetFrozen(!GetIsFrozen());
10944
10945 }
10946
10947 else if (action_id ==
EActions.ADD_WETNESS)
10948 {
10950
10951 }
10952
10953 else if (action_id ==
EActions.REMOVE_WETNESS)
10954 {
10956
10957 }
10958
10959 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10960 {
10963
10964
10965 }
10966
10967 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10968 {
10971 }
10972
10973 else if (action_id ==
EActions.MAKE_SPECIAL)
10974 {
10975 auto debugParams = DebugSpawnParams.WithPlayer(player);
10976 OnDebugSpawnEx(debugParams);
10977 }
10978
10979 }
10980
10981
10982 return false;
10983 }
10984
10985
10986
10987
10991
10994
10995
10996
10998 {
10999 return false;
11000 }
11001
11002
11004 {
11005 return true;
11006 }
11007
11008
11010 {
11011 return true;
11012 }
11013
11014
11015
11017 {
11018 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11019 return g_Game.ConfigIsExisting(config_path);
11020 }
11021
11024 {
11025 return null;
11026 }
11027
11029 {
11030 return false;
11031 }
11032
11034 {
11035 return false;
11036 }
11037
11041
11042
11044 {
11045 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11046 return module_repairing.CanRepair(this, item_repair_kit);
11047 }
11048
11049
11050 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11051 {
11052 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11053 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11054 }
11055
11056
11058 {
11059
11060
11061
11062
11063
11064
11065
11066
11067 return 1;
11068 }
11069
11070
11071
11073 {
11075 }
11076
11077
11078
11080 {
11082 }
11083
11084
11093 {
11094 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11095
11096 if (player)
11097 {
11098 player.MessageStatus(text);
11099 }
11100 }
11101
11102
11111 {
11112 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11113
11114 if (player)
11115 {
11116 player.MessageAction(text);
11117 }
11118 }
11119
11120
11129 {
11130 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11131
11132 if (player)
11133 {
11134 player.MessageFriendly(text);
11135 }
11136 }
11137
11138
11147 {
11148 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11149
11150 if (player)
11151 {
11152 player.MessageImportant(text);
11153 }
11154 }
11155
11157 {
11158 return true;
11159 }
11160
11161
11162 override bool KindOf(
string tag)
11163 {
11164 bool found = false;
11165 string item_name = this.
GetType();
11167 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11168
11169 int array_size = item_tag_array.Count();
11170 for (int i = 0; i < array_size; i++)
11171 {
11172 if (item_tag_array.Get(i) == tag)
11173 {
11174 found = true;
11175 break;
11176 }
11177 }
11178 return found;
11179 }
11180
11181
11183 {
11184
11185 super.OnRPC(sender, rpc_type,ctx);
11186
11187
11188 switch (rpc_type)
11189 {
11190 #ifndef SERVER
11191 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11192 Param2<bool, string> p = new Param2<bool, string>(false, "");
11193
11195 return;
11196
11197 bool play = p.param1;
11198 string soundSet = p.param2;
11199
11200 if (play)
11201 {
11203 {
11205 {
11207 }
11208 }
11209 else
11210 {
11212 }
11213 }
11214 else
11215 {
11217 }
11218
11219 break;
11220 #endif
11221
11222 }
11223
11225 {
11227 }
11228 }
11229
11230
11231
11232
11234 {
11235 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11236 return plugin.GetID(
name);
11237 }
11238
11240 {
11241 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11242 return plugin.GetName(id);
11243 }
11244
11247 {
11248
11249
11250 int varFlags;
11251 if (!ctx.
Read(varFlags))
11252 return;
11253
11254 if (varFlags & ItemVariableFlags.FLOAT)
11255 {
11257 }
11258 }
11259
11261 {
11262
11263 super.SerializeNumericalVars(floats_out);
11264
11265
11266
11268 {
11270 }
11271
11273 {
11275 }
11276
11278 {
11280 }
11281
11283 {
11288 }
11289
11291 {
11293 }
11294 }
11295
11297 {
11298
11299 super.DeSerializeNumericalVars(floats);
11300
11301
11302 int index = 0;
11303 int mask = Math.Round(floats.Get(index));
11304
11305 index++;
11306
11308 {
11310 {
11312 }
11313 else
11314 {
11315 float quantity = floats.Get(index);
11316 SetQuantity(quantity,
true,
false,
false,
false);
11317 }
11318 index++;
11319 }
11320
11322 {
11323 float wet = floats.Get(index);
11325 index++;
11326 }
11327
11329 {
11330 int liquidtype = Math.Round(floats.Get(index));
11332 index++;
11333 }
11334
11336 {
11338 index++;
11340 index++;
11342 index++;
11344 index++;
11345 }
11346
11348 {
11349 int cleanness = Math.Round(floats.Get(index));
11351 index++;
11352 }
11353 }
11354
11356 {
11357 super.WriteVarsToCTX(ctx);
11358
11359
11361 {
11363 }
11364
11366 {
11368 }
11369
11371 {
11373 }
11374
11376 {
11377 int r,g,b,a;
11383 }
11384
11386 {
11388 }
11389 }
11390
11392 {
11393 if (!super.ReadVarsFromCTX(ctx,version))
11394 return false;
11395
11396 int intValue;
11397 float value;
11398
11399 if (version < 140)
11400 {
11401 if (!ctx.
Read(intValue))
11402 return false;
11403
11404 m_VariablesMask = intValue;
11405 }
11406
11408 {
11409 if (!ctx.
Read(value))
11410 return false;
11411
11413 {
11415 }
11416 else
11417 {
11419 }
11420 }
11421
11422 if (version < 140)
11423 {
11425 {
11426 if (!ctx.
Read(value))
11427 return false;
11428 SetTemperatureDirect(value);
11429 }
11430 }
11431
11433 {
11434 if (!ctx.
Read(value))
11435 return false;
11437 }
11438
11440 {
11441 if (!ctx.
Read(intValue))
11442 return false;
11444 }
11445
11447 {
11448 int r,g,b,a;
11450 return false;
11452 return false;
11454 return false;
11456 return false;
11457
11459 }
11460
11462 {
11463 if (!ctx.
Read(intValue))
11464 return false;
11466 }
11467
11468 if (version >= 138 && version < 140)
11469 {
11471 {
11472 if (!ctx.
Read(intValue))
11473 return false;
11474 SetFrozen(intValue);
11475 }
11476 }
11477
11478 return true;
11479 }
11480
11481
11483 {
11486 {
11488 }
11489
11490 if (!super.OnStoreLoad(ctx, version))
11491 {
11493 return false;
11494 }
11495
11496 if (version >= 114)
11497 {
11498 bool hasQuickBarIndexSaved;
11499
11500 if (!ctx.
Read(hasQuickBarIndexSaved))
11501 {
11503 return false;
11504 }
11505
11506 if (hasQuickBarIndexSaved)
11507 {
11508 int itmQBIndex;
11509
11510
11511 if (!ctx.
Read(itmQBIndex))
11512 {
11514 return false;
11515 }
11516
11517 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11518 if (itmQBIndex != -1 && parentPlayer)
11519 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11520 }
11521 }
11522 else
11523 {
11524
11525 PlayerBase player;
11526 int itemQBIndex;
11527 if (version ==
int.
MAX)
11528 {
11529 if (!ctx.
Read(itemQBIndex))
11530 {
11532 return false;
11533 }
11534 }
11535 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11536 {
11537
11538 if (!ctx.
Read(itemQBIndex))
11539 {
11541 return false;
11542 }
11543 if (itemQBIndex != -1 && player)
11544 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11545 }
11546 }
11547
11548 if (version < 140)
11549 {
11550
11551 if (!LoadVariables(ctx, version))
11552 {
11554 return false;
11555 }
11556 }
11557
11558
11560 {
11562 return false;
11563 }
11564 if (version >= 132)
11565 {
11567 if (raib)
11568 {
11570 {
11572 return false;
11573 }
11574 }
11575 }
11576
11578 return true;
11579 }
11580
11581
11582
11584 {
11585 super.OnStoreSave(ctx);
11586
11587 PlayerBase player;
11588 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11589 {
11591
11592 int itemQBIndex = -1;
11593 itemQBIndex = player.FindQuickBarEntityIndex(this);
11594 ctx.
Write(itemQBIndex);
11595 }
11596 else
11597 {
11599 }
11600
11602
11604 if (raib)
11605 {
11607 }
11608 }
11609
11610
11612 {
11613 super.AfterStoreLoad();
11614
11616 {
11618 }
11619
11621 {
11624 }
11625 }
11626
11628 {
11629 super.EEOnAfterLoad();
11630
11632 {
11634 }
11635
11638 }
11639
11641 {
11642 return false;
11643 }
11644
11645
11646
11648 {
11650 {
11651 #ifdef PLATFORM_CONSOLE
11652
11654 {
11656 if (menu)
11657 {
11659 }
11660 }
11661 #endif
11662 }
11663
11665 {
11668 }
11669
11671 {
11672 SetWeightDirty();
11674 }
11676 {
11679 }
11680
11682 {
11685
11688 }
11690 {
11694 }
11695
11696 super.OnVariablesSynchronized();
11697 }
11698
11699
11700
11702 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11703 {
11704 if (!IsServerCheck(allow_client))
11705 return false;
11706
11708 return false;
11709
11712
11713 if (value <= (min + 0.001))
11714 value = min;
11715
11716 if (value == min)
11717 {
11718 if (destroy_config)
11719 {
11720 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11721 if (dstr)
11722 {
11724 this.Delete();
11725 return true;
11726 }
11727 }
11728 else if (destroy_forced)
11729 {
11731 this.Delete();
11732 return true;
11733 }
11734
11736 }
11737
11740
11742 {
11743 EntityAI parent = GetHierarchyRoot();
11744 InventoryLocation iLoc = new InventoryLocation();
11745 GetInventory().GetCurrentInventoryLocation(iLoc);
11747 {
11748 int iLocSlot = iLoc.
GetSlot();
11750 {
11752 }
11754 {
11756 }
11757 }
11758 }
11759
11761 {
11763
11764 if (delta)
11766 }
11767
11769
11770 return false;
11771 }
11772
11773
11775 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11776 {
11778 }
11779
11781 {
11784 }
11785
11787 {
11790 }
11791
11793 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11794 {
11795 float value_clamped = Math.Clamp(value, 0, 1);
11797 SetQuantity(result, destroy_config, destroy_forced);
11798 }
11799
11800
11803 {
11805 }
11806
11808 {
11810 }
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11822 {
11823 int slot = -1;
11824 GameInventory inventory = GetInventory();
11825 if (inventory)
11826 {
11827 InventoryLocation il = new InventoryLocation;
11830 }
11831
11833 }
11834
11836 {
11837 float quantity_max = 0;
11838
11840 {
11841 if (attSlotID != -1)
11842 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11843
11844 if (quantity_max <= 0)
11846 }
11847
11848 if (quantity_max <= 0)
11850
11851 return quantity_max;
11852 }
11853
11855 {
11857 }
11858
11860 {
11862 }
11863
11864
11866 {
11868 }
11869
11871 {
11873 }
11874
11876 {
11878 }
11879
11880
11882 {
11883
11884 float weightEx = GetWeightEx();
11885 float special = GetInventoryAndCargoWeight();
11886 return weightEx - special;
11887 }
11888
11889
11891 {
11893 }
11894
11896 {
11898 {
11899 #ifdef DEVELOPER
11900 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11901 {
11902 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11904 }
11905 #endif
11906
11907 return GetQuantity() * GetConfigWeightModified();
11908 }
11909 else if (HasEnergyManager())
11910 {
11911 #ifdef DEVELOPER
11912 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11913 {
11914 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11915 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11916 }
11917 #endif
11918 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11919 }
11920 else
11921 {
11922 #ifdef DEVELOPER
11923 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11924 {
11925 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11926 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11927 }
11928 #endif
11929 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11930 }
11931 }
11932
11935 {
11936 int item_count = 0;
11938
11939 GameInventory inventory = GetInventory();
11940 CargoBase cargo = inventory.
GetCargo();
11941 if (cargo != NULL)
11942 {
11944 }
11945
11947 for (int i = 0; i < nAttachments; ++i)
11948 {
11950 if (item)
11951 item_count += item.GetNumberOfItems();
11952 }
11953 return item_count;
11954 }
11955
11958 {
11959 float weight = 0;
11960 float wetness = 1;
11961 if (include_wetness)
11964 {
11965 weight = wetness * m_ConfigWeight;
11966 }
11968 {
11969 weight = 1;
11970 }
11971 return weight;
11972 }
11973
11974
11975
11977 {
11978 GameInventory inventory = GetInventory();
11979 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
11980 {
11981 array<EntityAI> items = new array<EntityAI>;
11983 for (int i = 0; i < items.Count(); ++i)
11984 {
11986 if (item)
11987 {
11988 g_Game.ObjectDelete(item);
11989 }
11990 }
11991 }
11992 }
11993
11994
11995
11996
11998 {
11999 float energy = 0;
12000 if (HasEnergyManager())
12001 {
12002 energy = GetCompEM().GetEnergy();
12003 }
12004 return energy;
12005 }
12006
12007
12009 {
12010 super.OnEnergyConsumed();
12011
12013 }
12014
12016 {
12017 super.OnEnergyAdded();
12018
12020 }
12021
12022
12024 {
12025 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12026 {
12028 {
12029 float energy_0to1 = GetCompEM().GetEnergy0To1();
12031 }
12032 }
12033 }
12034
12035
12037 {
12038 return ConfigGetFloat("heatIsolation");
12039 }
12040
12042 {
12044 }
12045
12047 {
12048 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12049 if (
g_Game.ConfigIsExisting(paramPath))
12050 return g_Game.ConfigGetFloat(paramPath);
12051
12052 return 0.0;
12053 }
12054
12056 {
12057 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12058 if (
g_Game.ConfigIsExisting(paramPath))
12059 return g_Game.ConfigGetFloat(paramPath);
12060
12061 return 0.0;
12062 }
12063
12064 override void SetWet(
float value,
bool allow_client =
false)
12065 {
12066 if (!IsServerCheck(allow_client))
12067 return;
12068
12071
12073
12074 m_VarWet = Math.Clamp(value, min, max);
12075
12077 {
12080 }
12081 }
12082
12083 override void AddWet(
float value)
12084 {
12086 }
12087
12089 {
12091 }
12092
12094 {
12096 }
12097
12099 {
12101 }
12102
12104 {
12106 }
12107
12109 {
12111 }
12112
12113 override void OnWetChanged(
float newVal,
float oldVal)
12114 {
12117 if (newLevel != oldLevel)
12118 {
12120 }
12121 }
12122
12124 {
12125 SetWeightDirty();
12126 }
12127
12129 {
12130 return GetWetLevelInternal(
m_VarWet);
12131 }
12132
12133
12134
12136 {
12138 }
12139
12141 {
12143 }
12144
12146 {
12148 }
12149
12151 {
12153 }
12154
12155
12156
12158 {
12159 if (ConfigIsExisting("itemModelLength"))
12160 {
12161 return ConfigGetFloat("itemModelLength");
12162 }
12163 return 0;
12164 }
12165
12167 {
12168 if (ConfigIsExisting("itemAttachOffset"))
12169 {
12170 return ConfigGetFloat("itemAttachOffset");
12171 }
12172 return 0;
12173 }
12174
12175 override void SetCleanness(
int value,
bool allow_client =
false)
12176 {
12177 if (!IsServerCheck(allow_client))
12178 return;
12179
12181
12183
12186 }
12187
12189 {
12191 }
12192
12194 {
12195 return true;
12196 }
12197
12198
12199
12200
12202 {
12204 }
12205
12207 {
12209 }
12210
12211
12212
12213
12214 override void SetColor(
int r,
int g,
int b,
int a)
12215 {
12221 }
12223 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12224 {
12229 }
12230
12232 {
12234 }
12235
12238 {
12239 int r,g,b,a;
12241 r = r/255;
12242 g = g/255;
12243 b = b/255;
12244 a = a/255;
12245 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12246 }
12247
12248
12249
12250 override void SetLiquidType(
int value,
bool allow_client =
false)
12251 {
12252 if (!IsServerCheck(allow_client))
12253 return;
12254
12259 }
12260
12262 {
12263 return ConfigGetInt("varLiquidTypeInit");
12264 }
12265
12267 {
12269 }
12270
12272 {
12274 SetFrozen(false);
12275 }
12276
12279 {
12280 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12281 }
12282
12283
12286 {
12287 PlayerBase nplayer;
12288 if (PlayerBase.CastTo(nplayer, player))
12289 {
12291 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12292 }
12293 }
12294
12295
12298 {
12299 PlayerBase nplayer;
12300 if (PlayerBase.CastTo(nplayer,player))
12301 {
12302 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12303 }
12304
12305 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12306
12307 if (HasEnergyManager())
12308 {
12309 GetCompEM().UpdatePlugState();
12310 }
12311 }
12312
12313
12315 {
12316 super.OnPlacementStarted(player);
12317
12319 }
12320
12321 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12322 {
12324 {
12325 m_AdminLog.OnPlacementComplete(player,
this);
12326 }
12327
12328 super.OnPlacementComplete(player, position, orientation);
12329 }
12330
12331
12332
12333
12334
12336 {
12338 {
12339 return true;
12340 }
12341 else
12342 {
12343 return false;
12344 }
12345 }
12346
12347
12349 {
12351 {
12353 }
12354 }
12355
12356
12358 {
12360 }
12361
12363 {
12365 }
12366
12367 override void InsertAgent(
int agent,
float count = 1)
12368 {
12369 if (count < 1)
12370 return;
12371
12373 }
12374
12377 {
12379 }
12380
12381
12383 {
12385 }
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12406
12407
12408
12409
12410
12411
12412
12413
12414
12415
12416
12417
12418
12419
12420
12421
12422
12423
12424
12425
12426
12427
12429 {
12431 return false;
12432 return true;
12433 }
12434
12436 {
12437
12439 }
12440
12441
12444 {
12445 super.CheckForRoofLimited(timeTresholdMS);
12446
12447 float time =
g_Game.GetTime();
12448 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12449 {
12450 m_PreviousRoofTestTime = time;
12451 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12452 }
12453 }
12454
12455
12457 {
12459 {
12460 return 0;
12461 }
12462
12463 if (GetInventory().GetAttachmentSlotsCount() != 0)
12464 {
12465 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12466 if (filter)
12467 return filter.GetProtectionLevel(type, false, system);
12468 else
12469 return 0;
12470 }
12471
12472 string subclassPath, entryName;
12473
12474 switch (type)
12475 {
12477 entryName = "biological";
12478 break;
12480 entryName = "chemical";
12481 break;
12482 default:
12483 entryName = "biological";
12484 break;
12485 }
12486
12487 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12488
12489 return g_Game.ConfigGetFloat(subclassPath + entryName);
12490 }
12491
12492
12493
12496 {
12497 if (!IsMagazine())
12499
12501 }
12502
12503
12504
12505
12506
12511 {
12512 return true;
12513 }
12514
12516 {
12518 }
12519
12520
12521
12522
12523
12525 {
12526 if (parent)
12527 {
12528 if (parent.IsInherited(DayZInfected))
12529 return true;
12530
12531 if (!parent.IsRuined())
12532 return true;
12533 }
12534
12535 return true;
12536 }
12537
12539 {
12540 if (!super.CanPutAsAttachment(parent))
12541 {
12542 return false;
12543 }
12544
12545 if (!IsRuined() && !parent.IsRuined())
12546 {
12547 return true;
12548 }
12549
12550 return false;
12551 }
12552
12554 {
12555
12556
12557
12558
12559 return super.CanReceiveItemIntoCargo(item);
12560 }
12561
12563 {
12564
12565
12566
12567
12568 GameInventory attachmentInv = attachment.GetInventory();
12570 {
12571 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12572 return false;
12573 }
12574
12575 InventoryLocation loc = new InventoryLocation();
12576 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12577 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12578 return false;
12579
12580 return super.CanReceiveAttachment(attachment, slotId);
12581 }
12582
12584 {
12585 if (!super.CanReleaseAttachment(attachment))
12586 return false;
12587
12588 return GetInventory().AreChildrenAccessible();
12589 }
12590
12591
12592
12593
12594
12595
12596
12597
12598
12599
12600
12601
12602
12603
12604
12605
12606
12607
12608
12609
12610
12612 {
12613 int id = muzzle_owner.GetMuzzleID();
12614 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12615
12616 if (WPOF_array)
12617 {
12618 for (int i = 0; i < WPOF_array.Count(); i++)
12619 {
12620 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12621
12622 if (WPOF)
12623 {
12624 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12625 }
12626 }
12627 }
12628 }
12629
12630
12632 {
12633 int id = muzzle_owner.GetMuzzleID();
12635
12636 if (WPOBE_array)
12637 {
12638 for (int i = 0; i < WPOBE_array.Count(); i++)
12639 {
12640 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12641
12642 if (WPOBE)
12643 {
12644 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12645 }
12646 }
12647 }
12648 }
12649
12650
12652 {
12653 int id = muzzle_owner.GetMuzzleID();
12654 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12655
12656 if (WPOOH_array)
12657 {
12658 for (int i = 0; i < WPOOH_array.Count(); i++)
12659 {
12660 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12661
12662 if (WPOOH)
12663 {
12664 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12665 }
12666 }
12667 }
12668 }
12669
12670
12672 {
12673 int id = muzzle_owner.GetMuzzleID();
12674 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12675
12676 if (WPOOH_array)
12677 {
12678 for (int i = 0; i < WPOOH_array.Count(); i++)
12679 {
12680 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12681
12682 if (WPOOH)
12683 {
12684 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12685 }
12686 }
12687 }
12688 }
12689
12690
12692 {
12693 int id = muzzle_owner.GetMuzzleID();
12694 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12695
12696 if (WPOOH_array)
12697 {
12698 for (int i = 0; i < WPOOH_array.Count(); i++)
12699 {
12700 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12701
12702 if (WPOOH)
12703 {
12704 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12705 }
12706 }
12707 }
12708 }
12709
12710
12711
12713 {
12715 {
12716 return true;
12717 }
12718
12719 return false;
12720 }
12721
12723 {
12725 {
12726 return true;
12727 }
12728
12729 return false;
12730 }
12731
12733 {
12735 {
12736 return true;
12737 }
12738
12739 return false;
12740 }
12741
12743 {
12744 return false;
12745 }
12746
12749 {
12750 return UATimeSpent.DEFAULT_DEPLOY;
12751 }
12752
12753
12754
12755
12757 {
12759 SetSynchDirty();
12760 }
12761
12763 {
12765 }
12766
12767
12769 {
12770 return false;
12771 }
12772
12775 {
12776 string att_type = "None";
12777
12778 if (ConfigIsExisting("soundAttType"))
12779 {
12780 att_type = ConfigGetString("soundAttType");
12781 }
12782
12784 }
12785
12787 {
12789 }
12790
12791
12792
12793
12794
12800
12802 {
12805
12807 }
12808
12809
12811 {
12813 return;
12814
12816
12819
12822
12823 SoundParameters params = new SoundParameters();
12827 }
12828
12829
12831 {
12833 {
12836
12837 SetSynchDirty();
12838
12841 }
12842 }
12843
12845 {
12847 }
12848
12849
12851 {
12853 return;
12854
12856 SetSynchDirty();
12857
12860 }
12861
12863 {
12866 }
12867
12869 {
12871 }
12872
12873 void OnApply(PlayerBase player);
12874
12876 {
12877 return 1.0;
12878 };
12879
12881 {
12883 }
12884
12886 {
12888 }
12889
12891
12893 {
12894 SetDynamicPhysicsLifeTime(0.01);
12896 }
12897
12899 {
12900 array<string> zone_names = new array<string>;
12901 GetDamageZones(zone_names);
12902 for (int i = 0; i < zone_names.Count(); i++)
12903 {
12904 SetHealthMax(zone_names.Get(i),"Health");
12905 }
12906 SetHealthMax("","Health");
12907 }
12908
12911 {
12912 float global_health = GetHealth01("","Health");
12913 array<string> zones = new array<string>;
12914 GetDamageZones(zones);
12915
12916 for (int i = 0; i < zones.Count(); i++)
12917 {
12918 SetHealth01(zones.Get(i),"Health",global_health);
12919 }
12920 }
12921
12924 {
12925 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12926 }
12927
12929 {
12930 if (!hasRootAsPlayer)
12931 {
12932 if (refParentIB)
12933 {
12934
12935 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12936 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12937
12938 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12939 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12940
12943 }
12944 else
12945 {
12946
12949 }
12950 }
12951 }
12952
12954 {
12956 {
12957 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12958 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12959 {
12960 float heatPermCoef = 1.0;
12962 while (ent)
12963 {
12964 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12965 ent = ent.GetHierarchyParent();
12966 }
12967
12968 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12969 }
12970 }
12971 }
12972
12974 {
12975
12976 EntityAI parent = GetHierarchyParent();
12977 if (!parent)
12978 {
12979 hasParent = false;
12980 hasRootAsPlayer = false;
12981 }
12982 else
12983 {
12984 hasParent = true;
12985 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12986 refParentIB =
ItemBase.Cast(parent);
12987 }
12988 }
12989
12990 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12991 {
12992
12993 }
12994
12996 {
12997
12998 return false;
12999 }
13000
13002 {
13003
13004
13005 return false;
13006 }
13007
13009 {
13010
13011 return false;
13012 }
13013
13016 {
13017 return !GetIsFrozen() &&
IsOpen();
13018 }
13019
13021 {
13022 bool hasParent = false, hasRootAsPlayer = false;
13024
13025 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13026 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13027
13028 if (wwtu || foodDecay)
13029 {
13033
13034 if (processWetness || processTemperature || processDecay)
13035 {
13037
13038 if (processWetness)
13039 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13040
13041 if (processTemperature)
13043
13044 if (processDecay)
13045 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13046 }
13047 }
13048 }
13049
13052 {
13054 }
13055
13057 {
13060
13061 return super.GetTemperatureFreezeThreshold();
13062 }
13063
13065 {
13068
13069 return super.GetTemperatureThawThreshold();
13070 }
13071
13073 {
13076
13077 return super.GetItemOverheatThreshold();
13078 }
13079
13081 {
13083 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13084
13085 return super.GetTemperatureFreezeTime();
13086 }
13087
13089 {
13091 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13092
13093 return super.GetTemperatureThawTime();
13094 }
13095
13100
13102 {
13103 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13104 }
13105
13107 {
13108 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13109 }
13110
13113 {
13115 }
13116
13118 {
13120 }
13121
13123 {
13125 }
13126
13129 {
13130 return null;
13131 }
13132
13135 {
13136 return false;
13137 }
13138
13140 {
13142 {
13145 if (!trg)
13146 {
13148 explosive = this;
13149 }
13150
13151 explosive.PairRemote(trg);
13153
13154 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13155 trg.SetPersistentPairID(persistentID);
13156 explosive.SetPersistentPairID(persistentID);
13157
13158 return true;
13159 }
13160 return false;
13161 }
13162
13165 {
13166 float ret = 1.0;
13169 ret *= GetHealth01();
13170
13171 return ret;
13172 }
13173
13174 #ifdef DEVELOPER
13175 override void SetDebugItem()
13176 {
13177 super.SetDebugItem();
13178 _itemBase = this;
13179 }
13180
13182 {
13183 string text = super.GetDebugText();
13184
13186 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13187
13188 return text;
13189 }
13190 #endif
13191
13193 {
13194 return true;
13195 }
13196
13198
13200
13202 {
13205 }
13206
13207
13215
13231
13232 [
Obsolete(
"Use ItemSoundHandler instead")]
13235 {
13236 if (!
g_Game.IsDedicatedServer())
13237 {
13238 if (ConfigIsExisting("attachSoundSet"))
13239 {
13240 string cfg_path = "";
13241 string soundset = "";
13242 string type_name =
GetType();
13243
13246 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13247 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13248
13249 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13250 {
13251 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13252 {
13253 if (cfg_slot_array[i] == slot_type)
13254 {
13255 soundset = cfg_soundset_array[i];
13256 break;
13257 }
13258 }
13259 }
13260
13261 if (soundset != "")
13262 {
13263 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13265 }
13266 }
13267 }
13268 }
13269
13271}
13272
13274{
13276 if (entity)
13277 {
13278 bool is_item = entity.IsInherited(
ItemBase);
13279 if (is_item && full_quantity)
13280 {
13283 }
13284 }
13285 else
13286 {
13288 return NULL;
13289 }
13290 return entity;
13291}
13292
13294{
13295 if (item)
13296 {
13297 if (health > 0)
13298 item.SetHealth("", "", health);
13299
13300 if (item.CanHaveTemperature())
13301 {
13303 if (item.CanFreeze())
13304 item.SetFrozen(false);
13305 }
13306
13307 if (item.HasEnergyManager())
13308 {
13309 if (quantity >= 0)
13310 {
13311 item.GetCompEM().SetEnergy0To1(quantity);
13312 }
13313 else
13314 {
13316 }
13317 }
13318 else if (item.IsMagazine())
13319 {
13320 Magazine mag = Magazine.Cast(item);
13321 if (quantity >= 0)
13322 {
13323 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13324 }
13325 else
13326 {
13328 }
13329
13330 }
13331 else
13332 {
13333 if (quantity >= 0)
13334 {
13335 item.SetQuantityNormalized(quantity, false);
13336 }
13337 else
13338 {
13340 }
13341
13342 }
13343 }
13344}
13345
13346#ifdef DEVELOPER
13348#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
bool ShouldSplitQuantity(float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
override void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
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)
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override string GetFoldSoundset()
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override string GetLoopFoldSoundset()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.