Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config(for Min 0 and Max 5000, setting 0.5 will result in value 2500)
8326{
8328 {
8329 return true;
8330 }
8331};
8332
8334{
8335
8336};
8337
8338
8339
8341{
8345
8347
8350
8351
8352
8353
8354
8363
8369
8374
8379
8400 protected bool m_IsResultOfSplit
8401
8403
8408
8409
8410
8412
8416
8417
8418
8420
8423
8424
8425
8431
8432
8440
8443
8444
8446
8447
8449
8450
8455
8456
8461
8463
8464
8466
8467
8469 {
8474
8475 if (!
g_Game.IsDedicatedServer())
8476 {
8478 {
8480
8482 {
8484 }
8485 }
8486
8489 }
8490
8491 m_OldLocation = null;
8492
8494 {
8496 }
8497
8498 if (ConfigIsExisting("headSelectionsToHide"))
8499 {
8502 }
8503
8505 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8506 {
8508 }
8509
8511
8512 m_IsResultOfSplit = false;
8513
8515 }
8516
8518 {
8519 super.InitItemVariables();
8520
8526 m_Count = ConfigGetInt(
"count");
8527
8530
8535
8538
8543
8555
8559
8560
8563 if (ConfigIsExisting("canBeSplit"))
8564 {
8567 }
8568
8570 if (ConfigIsExisting("itemBehaviour"))
8572
8573
8576 RegisterNetSyncVariableInt("m_VarLiquidType");
8577 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8578
8579 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8580 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8581 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8582
8583 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8584 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8585 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8586 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8587
8588 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8589 RegisterNetSyncVariableBool("m_IsTakeable");
8590 RegisterNetSyncVariableBool("m_IsHologram");
8591
8594 {
8597 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8598 }
8599
8601
8603 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8605
8607 }
8608
8610 {
8612 }
8613
8615 {
8618 {
8623 }
8624 }
8625
8626 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8627 {
8629 {
8632 }
8633
8635 }
8636
8638 {
8644 }
8645
8647
8649 {
8651
8652 if (!action)
8653 {
8654 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8655 return;
8656 }
8657
8659 if (!ai)
8660 {
8662 return;
8663 }
8664
8666 if (!action_array)
8667 {
8668 action_array = new array<ActionBase_Basic>;
8670 }
8671 if (LogManager.IsActionLogEnable())
8672 {
8673 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8674 }
8675
8676 if (action_array.Find(action) != -1)
8677 {
8678 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8679 }
8680 else
8681 {
8682 action_array.Insert(action);
8683 }
8684 }
8685
8687 {
8688 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8689 ActionBase action = player.GetActionManager().GetAction(actionName);
8692
8693 if (action_array)
8694 {
8695 action_array.RemoveItem(action);
8696 }
8697 }
8698
8699
8700
8702 {
8703 ActionOverrideData overrideData = new ActionOverrideData();
8707
8709 if (!actionMap)
8710 {
8713 }
8714
8715 actionMap.Insert(this.
Type(), overrideData);
8716
8717 }
8718
8720
8722
8723
8725 {
8728
8731
8732 string config_to_search = "CfgVehicles";
8733 string muzzle_owner_config;
8734
8736 {
8737 if (IsInherited(Weapon))
8738 config_to_search = "CfgWeapons";
8739
8740 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8741
8742 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8743
8744 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8745
8746 if (config_OnFire_subclass_count > 0)
8747 {
8748 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8749
8750 for (int i = 0; i < config_OnFire_subclass_count; i++)
8751 {
8752 string particle_class = "";
8753 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8754 string config_OnFire_entry = config_OnFire_class + particle_class;
8755 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8756 WPOF_array.Insert(WPOF);
8757 }
8758
8759
8761 }
8762 }
8763
8765 {
8766 config_to_search = "CfgWeapons";
8767 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8768
8769 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8770
8771 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8772
8773 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8774 {
8775 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8776
8777 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8778 {
8779 string particle_class2 = "";
8780 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8781 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8782 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8783 WPOBE_array.Insert(WPOBE);
8784 }
8785
8786
8788 }
8789 }
8790 }
8791
8792
8794 {
8797
8799 {
8800 string config_to_search = "CfgVehicles";
8801
8802 if (IsInherited(Weapon))
8803 config_to_search = "CfgWeapons";
8804
8805 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8806 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8807
8808 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8809 {
8810
8812
8814 {
8816 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8818 return;
8819 }
8820
8823
8824
8825
8826 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8827 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8828
8829 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8830 {
8831 string particle_class = "";
8832 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8833 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8834 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8835
8836 if (entry_type == CT_CLASS)
8837 {
8838 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8839 WPOOH_array.Insert(WPOF);
8840 }
8841 }
8842
8843
8845 }
8846 }
8847 }
8848
8850 {
8852 }
8853
8855 {
8857 {
8859
8862
8865
8866 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8867 }
8868 }
8869
8871 {
8873 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8874
8876 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8877
8879 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8880
8882 {
8884 }
8885 }
8886
8888 {
8890 }
8891
8893 {
8896 else
8898
8900 {
8903 }
8904 else
8905 {
8908
8911 }
8912
8914 }
8915
8917 {
8919 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8920 }
8921
8923 {
8925 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8927 }
8928
8930 {
8932 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8933 }
8934
8936 {
8939
8940 OverheatingParticle OP = new OverheatingParticle();
8945
8947 }
8948
8950 {
8953
8954 return -1;
8955 }
8956
8958 {
8960 {
8963
8964 for (int i = count; i > 0; --i)
8965 {
8966 int id = i - 1;
8969
8972
8973 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8974 {
8975 if (p)
8976 {
8979 }
8980 }
8981 }
8982 }
8983 }
8984
8986 {
8988 {
8990 {
8991 int id = i - 1;
8993
8994 if (OP)
8995 {
8997
8998 if (p)
8999 {
9001 }
9002
9003 delete OP;
9004 }
9005 }
9006
9009 }
9010 }
9011
9014 {
9015 return 0.0;
9016 }
9017
9018
9020 {
9021 return 250;
9022 }
9023
9025 {
9026 return 0;
9027 }
9028
9031 {
9033 return true;
9034
9035 return false;
9036 }
9037
9040 {
9043
9045 {
9047 }
9048 else
9049 {
9050
9052 }
9053
9055 }
9056
9063 {
9064 return -1;
9065 }
9066
9067
9068
9069
9071 {
9073 {
9074 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9075 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9076
9077 if (r_index >= 0)
9078 {
9079 InventoryLocation r_il = new InventoryLocation;
9080 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9081
9082 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9085 {
9086 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9087 }
9089 {
9090 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9091 }
9092
9093 }
9094
9095 player.GetHumanInventory().ClearUserReservedLocation(this);
9096 }
9097
9100 }
9101
9102
9103
9104
9106 {
9107 return ItemBase.m_DebugActionsMask;
9108 }
9109
9111 {
9112 return ItemBase.m_DebugActionsMask & mask;
9113 }
9114
9116 {
9117 ItemBase.m_DebugActionsMask = mask;
9118 }
9119
9121 {
9122 ItemBase.m_DebugActionsMask |= mask;
9123 }
9124
9126 {
9127 ItemBase.m_DebugActionsMask &= ~mask;
9128 }
9129
9131 {
9133 {
9135 }
9136 else
9137 {
9139 }
9140 }
9141
9142
9144 {
9145 if (GetEconomyProfile())
9146 {
9147 float q_max = GetEconomyProfile().GetQuantityMax();
9148 if (q_max > 0)
9149 {
9150 float q_min = GetEconomyProfile().GetQuantityMin();
9151 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9152
9154 {
9155 ComponentEnergyManager comp = GetCompEM();
9157 {
9159 }
9160 }
9162 {
9164
9165 }
9166
9167 }
9168 }
9169 }
9170
9173 {
9174 EntityAI parent = GetHierarchyParent();
9175
9176 if (parent)
9177 {
9178 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9179 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9180 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9181 }
9182 }
9183
9186 {
9187 EntityAI parent = GetHierarchyParent();
9188
9189 if (parent)
9190 {
9191 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9192 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9193 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9194 }
9195 }
9196
9198 {
9199
9200
9201
9202
9204
9206 {
9207 if (ScriptInputUserData.CanStoreInputUserData())
9208 {
9209 ScriptInputUserData ctx = new ScriptInputUserData;
9215 ctx.
Write(use_stack_max);
9218
9220 {
9221 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9222 }
9223 }
9224 }
9225 else if (!
g_Game.IsMultiplayer())
9226 {
9228 }
9229 }
9230
9232 {
9234 }
9235
9237 {
9239 }
9240
9242 {
9244 }
9245
9247 {
9248
9249 return false;
9250 }
9251
9253 {
9254 return false;
9255 }
9256
9260 {
9261 return false;
9262 }
9263
9265 {
9266 return "";
9267 }
9268
9270
9272 {
9273 return false;
9274 }
9275
9277 {
9278 return true;
9279 }
9280
9281
9282
9284 {
9285 return true;
9286 }
9287
9289 {
9290 return true;
9291 }
9292
9294 {
9295 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9297 }
9298
9300 {
9302 }
9303
9305 {
9307 if (!is_being_placed)
9309 SetSynchDirty();
9310 }
9311
9312
9314
9316 {
9318 }
9319
9321 {
9323 }
9324
9326 {
9327 return 1;
9328 }
9329
9331 {
9332 return false;
9333 }
9334
9336 {
9338 SetSynchDirty();
9339 }
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9371
9372
9373
9374
9376 {
9377 super.OnMovedInsideCargo(container);
9378
9379 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9380 }
9381
9382 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9383 {
9384 super.EEItemLocationChanged(oldLoc, newLoc);
9385
9386 PlayerBase newPlayer = null;
9387 PlayerBase oldPlayer = null;
9388
9389 if (newLoc.GetParent())
9390 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9391
9392 if (oldLoc.GetParent())
9393 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9394
9396 {
9397 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9398
9399 if (rIndex >= 0)
9400 {
9401 InventoryLocation rIl = new InventoryLocation;
9402 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9403
9404 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9407 {
9408 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9409 }
9411 {
9413 }
9414
9415 }
9416 }
9417
9419 {
9420 if (newPlayer)
9421 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9422
9423 if (newPlayer == oldPlayer)
9424 {
9425 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9426 {
9428 {
9429 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9430 {
9431 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9432 }
9433 }
9434 else
9435 {
9436 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9437 }
9438 }
9439
9440 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9441 {
9442 int type = oldLoc.GetType();
9444 {
9445 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9446 }
9448 {
9449 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9450 }
9451 }
9452 if (!m_OldLocation)
9453 {
9454 m_OldLocation = new InventoryLocation;
9455 }
9456 m_OldLocation.Copy(oldLoc);
9457 }
9458 else
9459 {
9460 if (m_OldLocation)
9461 {
9462 m_OldLocation.Reset();
9463 }
9464 }
9465
9466 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9467 }
9468 else
9469 {
9470 if (newPlayer)
9471 {
9472 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9473 if (resIndex >= 0)
9474 {
9475 InventoryLocation il = new InventoryLocation;
9476 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9478 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9481 {
9482 il.
GetParent().GetOnReleaseLock().Invoke(it);
9483 }
9485 {
9487 }
9488
9489 }
9490 }
9492 {
9493
9495 }
9496
9497 if (m_OldLocation)
9498 {
9499 m_OldLocation.Reset();
9500 }
9501 }
9502
9504 {
9505 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9506 }
9507
9509 {
9510 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9511 }
9512 }
9513
9514 override void EOnContact(IEntity other, Contact extra)
9515 {
9517 {
9518 int liquidType = -1;
9520 if (impactSpeed > 0.0)
9521 {
9523 #ifndef SERVER
9525 #else
9527 SetSynchDirty();
9528 #endif
9530 }
9531 }
9532
9533 #ifdef SERVER
9534 if (GetCompEM() && GetCompEM().IsPlugged())
9535 {
9536 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9537 GetCompEM().UnplugThis();
9538 }
9539 #endif
9540 }
9541
9543
9545 {
9547 }
9548
9550 {
9551
9552 }
9553
9555 {
9556 super.OnItemLocationChanged(old_owner, new_owner);
9557
9558 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9559 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9560
9561 if (!relatedPlayer && playerNew)
9562 relatedPlayer = playerNew;
9563
9564 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9565 {
9567 if (actionMgr)
9568 {
9569 ActionBase currentAction = actionMgr.GetRunningAction();
9570 if (currentAction)
9572 }
9573 }
9574
9575 Man ownerPlayerOld = null;
9576 Man ownerPlayerNew = null;
9577
9578 if (old_owner)
9579 {
9580 if (old_owner.
IsMan())
9581 {
9582 ownerPlayerOld = Man.Cast(old_owner);
9583 }
9584 else
9585 {
9586 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9587 }
9588 }
9589 else
9590 {
9592 {
9594
9595 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9596 {
9597 GetCompEM().UnplugThis();
9598 }
9599 }
9600 }
9601
9602 if (new_owner)
9603 {
9604 if (new_owner.
IsMan())
9605 {
9606 ownerPlayerNew = Man.Cast(new_owner);
9607 }
9608 else
9609 {
9610 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9611 }
9612 }
9613
9614 if (ownerPlayerOld != ownerPlayerNew)
9615 {
9616 if (ownerPlayerOld)
9617 {
9618 array<EntityAI> subItemsExit = new array<EntityAI>;
9620 for (int i = 0; i < subItemsExit.Count(); i++)
9621 {
9624 }
9625 }
9626
9627 if (ownerPlayerNew)
9628 {
9629 array<EntityAI> subItemsEnter = new array<EntityAI>;
9631 for (int j = 0; j < subItemsEnter.Count(); j++)
9632 {
9635 }
9636 }
9637 }
9638 else if (ownerPlayerNew != null)
9639 {
9640 PlayerBase nplayer;
9641 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9642 {
9643 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9645 for (int k = 0; k < subItemsUpdate.Count(); k++)
9646 {
9648 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9649 }
9650 }
9651 }
9652
9653 if (old_owner)
9654 old_owner.OnChildItemRemoved(this);
9655 if (new_owner)
9656 new_owner.OnChildItemReceived(this);
9657 }
9658
9659
9661 {
9662 super.EEDelete(parent);
9663 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9664 if (player)
9665 {
9667
9668 if (player.IsAlive())
9669 {
9670 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9671 if (r_index >= 0)
9672 {
9673 InventoryLocation r_il = new InventoryLocation;
9674 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9675
9676 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9679 {
9680 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9681 }
9683 {
9684 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9685 }
9686
9687 }
9688
9689 player.RemoveQuickBarEntityShortcut(this);
9690 }
9691 }
9692 }
9693
9695 {
9696 super.EEKilled(killer);
9697
9700 {
9701 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9702 {
9703 if (IsMagazine())
9704 {
9705 if (Magazine.Cast(this).GetAmmoCount() > 0)
9706 {
9708 }
9709 }
9710 else
9711 {
9713 }
9714 }
9715 }
9716 }
9717
9719 {
9720 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9721
9722 super.OnWasAttached(parent, slot_id);
9723
9726
9729 }
9730
9732 {
9733 super.OnWasDetached(parent, slot_id);
9734
9737
9740 }
9741
9743 {
9744 int idx;
9747
9748 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9749 if (inventory_slots.Count() < 1)
9750 {
9751 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9752 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9753 }
9754 else
9755 {
9756 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9757 }
9758
9759 idx = inventory_slots.Find(slot);
9760 if (idx < 0)
9761 return "";
9762
9763 return attach_types.Get(idx);
9764 }
9765
9767 {
9768 int idx = -1;
9769 string slot;
9770
9773
9774 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9775 if (inventory_slots.Count() < 1)
9776 {
9777 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9778 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9779 }
9780 else
9781 {
9782 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9783 if (detach_types.Count() < 1)
9784 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9785 }
9786
9787 for (int i = 0; i < inventory_slots.Count(); i++)
9788 {
9789 slot = inventory_slots.Get(i);
9790 }
9791
9792 if (slot != "")
9793 {
9794 if (detach_types.Count() == 1)
9795 idx = 0;
9796 else
9797 idx = inventory_slots.Find(slot);
9798 }
9799 if (idx < 0)
9800 return "";
9801
9802 return detach_types.Get(idx);
9803 }
9804
9806 {
9807
9809
9810
9811 float min_time = 1;
9812 float max_time = 3;
9813 float delay = Math.RandomFloat(min_time, max_time);
9814
9815 explode_timer.Run(delay, this, "DoAmmoExplosion");
9816 }
9817
9819 {
9820 Magazine magazine = Magazine.Cast(this);
9821 int pop_sounds_count = 6;
9822 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9823
9824
9825 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9826 string sound_name = pop_sounds[ sound_idx ];
9827 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9828
9829
9830 magazine.ServerAddAmmoCount(-1);
9831
9832
9833 float min_temp_to_explode = 100;
9834
9835 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9836 {
9838 }
9839 }
9840
9841
9842 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9843 {
9844 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9845
9846 const int CHANCE_DAMAGE_CARGO = 4;
9847 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9848 const int CHANCE_DAMAGE_NOTHING = 2;
9849
9851 {
9852 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9853 int chances;
9854 int rnd;
9855
9856 if (GetInventory().GetCargo())
9857 {
9858 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9859 rnd = Math.RandomInt(0,chances);
9860
9861 if (rnd < CHANCE_DAMAGE_CARGO)
9862 {
9864 }
9865 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9866 {
9868 }
9869 }
9870 else
9871 {
9872 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9873 rnd = Math.RandomInt(0,chances);
9874
9875 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9876 {
9878 }
9879 }
9880 }
9881 }
9882
9884 {
9885 CargoBase cargo = GetInventory().GetCargo();
9886 if (cargo)
9887 {
9889 if (item_count > 0)
9890 {
9891 int random_pick = Math.RandomInt(0, item_count);
9893 if (!item.IsExplosive())
9894 {
9895 item.AddHealth("","",damage);
9896 return true;
9897 }
9898 }
9899 }
9900 return false;
9901 }
9902
9904 {
9905 GameInventory inventory = GetInventory();
9907 if (attachment_count > 0)
9908 {
9909 int random_pick = Math.RandomInt(0, attachment_count);
9911 if (!attachment.IsExplosive())
9912 {
9913 attachment.AddHealth("","",damage);
9914 return true;
9915 }
9916 }
9917 return false;
9918 }
9919
9921 {
9923 }
9924
9926 {
9928 return GetInventory().CanRemoveEntity();
9929
9930 return false;
9931 }
9932
9934 {
9935
9937 return false;
9938
9939
9941 return false;
9942
9943
9944
9946 if (delta == 0)
9947 return false;
9948
9949
9950 return true;
9951 }
9952
9954 {
9956 {
9957 if (ScriptInputUserData.CanStoreInputUserData())
9958 {
9959 ScriptInputUserData ctx = new ScriptInputUserData;
9964 ctx.
Write(destination_entity);
9968 }
9969 }
9970 else if (!
g_Game.IsMultiplayer())
9971 {
9973 }
9974 }
9975
9977 {
9978 float split_quantity_new;
9982 InventoryLocation loc = new InventoryLocation;
9983
9984 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9985 {
9987 split_quantity_new = stack_max;
9988 else
9990
9992 {
9993 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9994 if (new_item)
9995 {
9996 new_item.SetResultOfSplit(true);
9997 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9999 new_item.
SetQuantity(split_quantity_new,
false,
true);
10000 }
10001 }
10002 }
10003 else if (destination_entity && slot_id == -1)
10004 {
10005 if (quantity > stack_max)
10006 split_quantity_new = stack_max;
10007 else
10008 split_quantity_new = quantity;
10009
10011 {
10012 GameInventory destinationInventory = destination_entity.GetInventory();
10014 {
10017 }
10018
10019 if (new_item)
10020 {
10021 new_item.SetResultOfSplit(true);
10022 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10024 new_item.
SetQuantity(split_quantity_new,
false,
true);
10025 }
10026 }
10027 }
10028 else
10029 {
10030 if (stack_max != 0)
10031 {
10033 {
10035 }
10036
10037 if (split_quantity_new == 0)
10038 {
10039 if (!
g_Game.IsMultiplayer())
10040 player.PhysicalPredictiveDropItem(this);
10041 else
10042 player.ServerDropEntity(this);
10043 return;
10044 }
10045
10047 {
10049
10050 if (new_item)
10051 {
10052 new_item.SetResultOfSplit(true);
10053 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10056 new_item.PlaceOnSurface();
10057 }
10058 }
10059 }
10060 }
10061 }
10062
10064 {
10065 float split_quantity_new;
10069 InventoryLocation loc = new InventoryLocation;
10070
10071 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10072 {
10074 split_quantity_new = stack_max;
10075 else
10077
10079 {
10080 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10081 if (new_item)
10082 {
10083 new_item.SetResultOfSplit(true);
10084 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10086 new_item.
SetQuantity(split_quantity_new,
false,
true);
10087 }
10088 }
10089 }
10090 else if (destination_entity && slot_id == -1)
10091 {
10092 if (quantity > stack_max)
10093 split_quantity_new = stack_max;
10094 else
10095 split_quantity_new = quantity;
10096
10098 {
10099 GameInventory destinationInventory = destination_entity.GetInventory();
10101 {
10104 }
10105
10106 if (new_item)
10107 {
10108 new_item.SetResultOfSplit(true);
10109 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10111 new_item.
SetQuantity(split_quantity_new,
false,
true);
10112 }
10113 }
10114 }
10115 else
10116 {
10117 if (stack_max != 0)
10118 {
10120 {
10122 }
10123
10125 {
10127
10128 if (new_item)
10129 {
10130 new_item.SetResultOfSplit(true);
10131 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10134 new_item.PlaceOnSurface();
10135 }
10136 }
10137 }
10138 }
10139 }
10140
10142 {
10144 {
10145 if (ScriptInputUserData.CanStoreInputUserData())
10146 {
10147 ScriptInputUserData ctx = new ScriptInputUserData;
10152 dst.WriteToContext(ctx);
10154 }
10155 }
10156 else if (!
g_Game.IsMultiplayer())
10157 {
10159 }
10160 }
10161
10163 {
10165 {
10166 if (ScriptInputUserData.CanStoreInputUserData())
10167 {
10168 ScriptInputUserData ctx = new ScriptInputUserData;
10173 ctx.
Write(destination_entity);
10179 }
10180 }
10181 else if (!
g_Game.IsMultiplayer())
10182 {
10184 }
10185 }
10186
10188 {
10190 }
10191
10193 {
10195 float split_quantity_new;
10197 if (dst.IsValid())
10198 {
10199 int slot_id = dst.GetSlot();
10201
10202 if (quantity > stack_max)
10203 split_quantity_new = stack_max;
10204 else
10205 split_quantity_new = quantity;
10206
10208 {
10210
10211 if (new_item)
10212 {
10213 new_item.SetResultOfSplit(true);
10214 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10216 new_item.
SetQuantity(split_quantity_new,
false,
true);
10217 }
10218
10219 return new_item;
10220 }
10221 }
10222
10223 return null;
10224 }
10225
10227 {
10229 float split_quantity_new;
10231 if (destination_entity)
10232 {
10234 if (quantity > stackable)
10235 split_quantity_new = stackable;
10236 else
10237 split_quantity_new = quantity;
10238
10240 {
10241 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10242 if (new_item)
10243 {
10244 new_item.SetResultOfSplit(true);
10245 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10247 new_item.
SetQuantity(split_quantity_new,
false,
true);
10248 }
10249 }
10250 }
10251 }
10252
10254 {
10256 {
10257 if (ScriptInputUserData.CanStoreInputUserData())
10258 {
10259 ScriptInputUserData ctx = new ScriptInputUserData;
10264 ItemBase destination_entity =
this;
10265 ctx.
Write(destination_entity);
10269 }
10270 }
10271 else if (!
g_Game.IsMultiplayer())
10272 {
10274 }
10275 }
10276
10278 {
10280 float split_quantity_new;
10282 if (player)
10283 {
10285 if (quantity > stackable)
10286 split_quantity_new = stackable;
10287 else
10288 split_quantity_new = quantity;
10289
10291 {
10292 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10293 new_item =
ItemBase.Cast(in_hands);
10294 if (new_item)
10295 {
10296 new_item.SetResultOfSplit(true);
10297 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10299 new_item.SetQuantity(split_quantity_new, false, true);
10300 }
10301 }
10302 }
10303 }
10304
10306 {
10308 float split_quantity_new = Math.Floor(quantity * 0.5);
10309
10311 return;
10312
10314
10315 if (new_item)
10316 {
10317 if (new_item.GetQuantityMax() < split_quantity_new)
10318 {
10319 split_quantity_new = new_item.GetQuantityMax();
10320 }
10321
10322 new_item.SetResultOfSplit(true);
10323 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10324
10326 {
10329 }
10330 else
10331 {
10333 new_item.
SetQuantity(split_quantity_new,
false,
true);
10334 }
10335 }
10336 }
10337
10339 {
10341 float split_quantity_new = Math.Floor(quantity / 2);
10342
10344 return;
10345
10346 InventoryLocation invloc = new InventoryLocation;
10348
10350 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10351
10352 if (new_item)
10353 {
10354 if (new_item.GetQuantityMax() < split_quantity_new)
10355 {
10356 split_quantity_new = new_item.GetQuantityMax();
10357 }
10359 {
10362 }
10363 else if (split_quantity_new > 1)
10364 {
10366 new_item.
SetQuantity(split_quantity_new,
false,
true);
10367 }
10368 }
10369 }
10370
10373 {
10374 SetWeightDirty();
10376
10377 if (parent)
10378 parent.OnAttachmentQuantityChangedEx(this, delta);
10379
10381 {
10383 {
10385 }
10387 {
10388 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10390 }
10391 }
10392 }
10393
10396 {
10397
10398 }
10399
10402 {
10404 }
10405
10407 {
10408 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10409
10411 {
10412 if (newLevel == GameConstants.STATE_RUINED)
10413 {
10415 EntityAI parent = GetHierarchyParent();
10416 if (parent && parent.IsFireplace())
10417 {
10418 CargoBase cargo = GetInventory().GetCargo();
10419 if (cargo)
10420 {
10422 {
10424 }
10425 }
10426 }
10427 }
10428
10430 {
10431
10433 return;
10434 }
10435
10436 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10437 {
10439 }
10440 }
10441 }
10442
10443
10445 {
10446 super.OnRightClick();
10447
10449 {
10451 {
10452 if (ScriptInputUserData.CanStoreInputUserData())
10453 {
10454 EntityAI root = GetHierarchyRoot();
10455 Man playerOwner = GetHierarchyRootPlayer();
10456 InventoryLocation dst = new InventoryLocation;
10457
10458
10459 if (!playerOwner && root && root == this)
10460 {
10462 }
10463 else
10464 {
10465
10466 GetInventory().GetCurrentInventoryLocation(dst);
10468 {
10469 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10471 {
10473 }
10474 else
10475 {
10477
10478
10479 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10480 {
10482 }
10483 else
10484 {
10485 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10486 }
10487 }
10488 }
10489 }
10490
10491 ScriptInputUserData ctx = new ScriptInputUserData;
10499 }
10500 }
10501 else if (!
g_Game.IsMultiplayer())
10502 {
10504 }
10505 }
10506 }
10507
10509 {
10510 if (root)
10511 {
10512 vector m4[4];
10513 root.GetTransform(m4);
10514 dst.SetGround(this, m4);
10515 }
10516 else
10517 {
10518 GetInventory().GetCurrentInventoryLocation(dst);
10519 }
10520 }
10521
10522 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10523 {
10524
10525 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10526 return false;
10527
10528 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10529 return false;
10530
10531
10533 return false;
10534
10535
10536 Magazine mag = Magazine.Cast(this);
10537 if (mag)
10538 {
10539 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10540 return false;
10541
10542 if (stack_max_limit)
10543 {
10544 Magazine other_mag = Magazine.Cast(other_item);
10545 if (other_item)
10546 {
10547 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10548 return false;
10549 }
10550
10551 }
10552 }
10553 else
10554 {
10555
10557 return false;
10558
10560 return false;
10561 }
10562
10563 PlayerBase player = null;
10564 if (CastTo(player, GetHierarchyRootPlayer()))
10565 {
10566 if (player.GetInventory().HasAttachment(this))
10567 return false;
10568
10569 if (player.IsItemsToDelete())
10570 return false;
10571 }
10572
10573 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10574 return false;
10575
10576 int slotID;
10578 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10579 return false;
10580
10581 return true;
10582 }
10583
10585 {
10587 }
10588
10590 {
10591 return m_IsResultOfSplit;
10592 }
10593
10595 {
10596 m_IsResultOfSplit = value;
10597 }
10598
10600 {
10602 }
10603
10605 {
10606 float other_item_quantity = other_item.GetQuantity();
10607 float this_free_space;
10608
10610
10612
10613 if (other_item_quantity > this_free_space)
10614 {
10615 return this_free_space;
10616 }
10617 else
10618 {
10619 return other_item_quantity;
10620 }
10621 }
10622
10624 {
10626 }
10627
10629 {
10631 return;
10632
10633 if (!IsMagazine() && other_item)
10634 {
10636 if (quantity_used != 0)
10637 {
10638 float hp1 = GetHealth01("","");
10639 float hp2 = other_item.GetHealth01("","");
10640 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10641 hpResult = hpResult / (
GetQuantity() + quantity_used);
10642
10643 hpResult *= GetMaxHealth();
10644 Math.Round(hpResult);
10645 SetHealth("", "Health", hpResult);
10646
10648 other_item.AddQuantity(-quantity_used);
10649 }
10650 }
10652 }
10653
10655 {
10656 #ifdef SERVER
10657 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10658 GetHierarchyParent().IncreaseLifetimeUp();
10659 #endif
10660 };
10661
10663 {
10664 PlayerBase p = PlayerBase.Cast(player);
10665
10666 array<int> recipesIds = p.m_Recipes;
10667 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10668 if (moduleRecipesManager)
10669 {
10670 EntityAI itemInHands = player.GetEntityInHands();
10671 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10672 }
10673
10674 for (int i = 0;i < recipesIds.Count(); i++)
10675 {
10676 int key = recipesIds.Get(i);
10677 string recipeName = moduleRecipesManager.GetRecipeName(key);
10679 }
10680 }
10681
10682
10683 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10684 {
10685 super.GetDebugActions(outputList);
10686
10687
10693
10694
10699
10704
10705
10709
10710
10712 {
10716 }
10717
10720
10721
10725
10727
10728 InventoryLocation loc = new InventoryLocation();
10729 GetInventory().GetCurrentInventoryLocation(loc);
10731 {
10732 if (Gizmo_IsSupported())
10735 }
10736
10738 }
10739
10740
10741
10742
10744 {
10745 super.OnAction(action_id, player, ctx);
10746
10748 {
10749 switch (action_id)
10750 {
10754 return true;
10758 return true;
10759 }
10760 }
10761
10763 {
10764 switch (action_id)
10765 {
10767 Delete();
10768 return true;
10769 }
10770 }
10771
10772 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10773 {
10774 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10775 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10776 PlayerBase p = PlayerBase.Cast(player);
10777 if (
EActions.RECIPES_RANGE_START < 1000)
10778 {
10779 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10780 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10781 }
10782 }
10783 #ifndef SERVER
10784 else if (action_id ==
EActions.WATCH_PLAYER)
10785 {
10786 PluginDeveloper.SetDeveloperItemClientEx(player);
10787 }
10788 #endif
10790 {
10791 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10792 {
10793 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10794 OnDebugButtonPressServer(id + 1);
10795 }
10796
10797 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10798 {
10799 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10801 }
10802
10803 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10804 {
10805 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10807 }
10808
10809 else if (action_id ==
EActions.ADD_QUANTITY)
10810 {
10811 if (IsMagazine())
10812 {
10813 Magazine mag = Magazine.Cast(this);
10814 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10815 }
10816 else
10817 {
10819 }
10820
10821 if (m_EM)
10822 {
10823 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10824 }
10825
10826 }
10827
10828 else if (action_id ==
EActions.REMOVE_QUANTITY)
10829 {
10830 if (IsMagazine())
10831 {
10832 Magazine mag2 = Magazine.Cast(this);
10833 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10834 }
10835 else
10836 {
10838 }
10839 if (m_EM)
10840 {
10841 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10842 }
10843
10844 }
10845
10846 else if (action_id ==
EActions.SET_QUANTITY_0)
10847 {
10849
10850 if (m_EM)
10851 {
10852 m_EM.SetEnergy(0);
10853 }
10854 }
10855
10856 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10857 {
10859
10860 if (m_EM)
10861 {
10862 m_EM.SetEnergy(m_EM.GetEnergyMax());
10863 }
10864 }
10865
10866 else if (action_id ==
EActions.ADD_HEALTH)
10867 {
10868 AddHealth("","",GetMaxHealth("","Health")/5);
10869 }
10870 else if (action_id ==
EActions.REMOVE_HEALTH)
10871 {
10872 AddHealth("","",-GetMaxHealth("","Health")/5);
10873 }
10874 else if (action_id ==
EActions.DESTROY_HEALTH)
10875 {
10876 SetHealth01("","",0);
10877 }
10878 else if (action_id ==
EActions.WATCH_ITEM)
10879 {
10881 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10882 #ifdef DEVELOPER
10883 SetDebugDeveloper_item(this);
10884 #endif
10885 }
10886
10887 else if (action_id ==
EActions.ADD_TEMPERATURE)
10888 {
10889 AddTemperature(20);
10890
10891 }
10892
10893 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10894 {
10895 AddTemperature(-20);
10896
10897 }
10898
10899 else if (action_id ==
EActions.FLIP_FROZEN)
10900 {
10901 SetFrozen(!GetIsFrozen());
10902
10903 }
10904
10905 else if (action_id ==
EActions.ADD_WETNESS)
10906 {
10908
10909 }
10910
10911 else if (action_id ==
EActions.REMOVE_WETNESS)
10912 {
10914
10915 }
10916
10917 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10918 {
10921
10922
10923 }
10924
10925 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10926 {
10929 }
10930
10931 else if (action_id ==
EActions.MAKE_SPECIAL)
10932 {
10933 auto debugParams = DebugSpawnParams.WithPlayer(player);
10934 OnDebugSpawnEx(debugParams);
10935 }
10936
10937 }
10938
10939
10940 return false;
10941 }
10942
10943
10944
10945
10949
10952
10953
10954
10956 {
10957 return false;
10958 }
10959
10960
10962 {
10963 return true;
10964 }
10965
10966
10968 {
10969 return true;
10970 }
10971
10972
10973
10975 {
10976 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10977 return g_Game.ConfigIsExisting(config_path);
10978 }
10979
10982 {
10983 return null;
10984 }
10985
10987 {
10988 return false;
10989 }
10990
10992 {
10993 return false;
10994 }
10995
10999
11000
11002 {
11003 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11004 return module_repairing.CanRepair(this, item_repair_kit);
11005 }
11006
11007
11008 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11009 {
11010 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11011 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11012 }
11013
11014
11016 {
11017
11018
11019
11020
11021
11022
11023
11024
11025 return 1;
11026 }
11027
11028
11029
11031 {
11033 }
11034
11035
11036
11038 {
11040 }
11041
11042
11051 {
11052 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11053
11054 if (player)
11055 {
11056 player.MessageStatus(text);
11057 }
11058 }
11059
11060
11069 {
11070 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11071
11072 if (player)
11073 {
11074 player.MessageAction(text);
11075 }
11076 }
11077
11078
11087 {
11088 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11089
11090 if (player)
11091 {
11092 player.MessageFriendly(text);
11093 }
11094 }
11095
11096
11105 {
11106 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11107
11108 if (player)
11109 {
11110 player.MessageImportant(text);
11111 }
11112 }
11113
11115 {
11116 return true;
11117 }
11118
11119
11120 override bool KindOf(
string tag)
11121 {
11122 bool found = false;
11123 string item_name = this.
GetType();
11125 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11126
11127 int array_size = item_tag_array.Count();
11128 for (int i = 0; i < array_size; i++)
11129 {
11130 if (item_tag_array.Get(i) == tag)
11131 {
11132 found = true;
11133 break;
11134 }
11135 }
11136 return found;
11137 }
11138
11139
11141 {
11142
11143 super.OnRPC(sender, rpc_type,ctx);
11144
11145
11146 switch (rpc_type)
11147 {
11148 #ifndef SERVER
11149 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11150 Param2<bool, string> p = new Param2<bool, string>(false, "");
11151
11153 return;
11154
11155 bool play = p.param1;
11156 string soundSet = p.param2;
11157
11158 if (play)
11159 {
11161 {
11163 {
11165 }
11166 }
11167 else
11168 {
11170 }
11171 }
11172 else
11173 {
11175 }
11176
11177 break;
11178 #endif
11179
11180 }
11181
11183 {
11185 }
11186 }
11187
11188
11189
11190
11192 {
11193 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11194 return plugin.GetID(
name);
11195 }
11196
11198 {
11199 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11200 return plugin.GetName(id);
11201 }
11202
11205 {
11206
11207
11208 int varFlags;
11209 if (!ctx.
Read(varFlags))
11210 return;
11211
11212 if (varFlags & ItemVariableFlags.FLOAT)
11213 {
11215 }
11216 }
11217
11219 {
11220
11221 super.SerializeNumericalVars(floats_out);
11222
11223
11224
11226 {
11228 }
11229
11231 {
11233 }
11234
11236 {
11238 }
11239
11241 {
11246 }
11247
11249 {
11251 }
11252 }
11253
11255 {
11256
11257 super.DeSerializeNumericalVars(floats);
11258
11259
11260 int index = 0;
11261 int mask = Math.Round(floats.Get(index));
11262
11263 index++;
11264
11266 {
11268 {
11270 }
11271 else
11272 {
11273 float quantity = floats.Get(index);
11274 SetQuantity(quantity,
true,
false,
false,
false);
11275 }
11276 index++;
11277 }
11278
11280 {
11281 float wet = floats.Get(index);
11283 index++;
11284 }
11285
11287 {
11288 int liquidtype = Math.Round(floats.Get(index));
11290 index++;
11291 }
11292
11294 {
11296 index++;
11298 index++;
11300 index++;
11302 index++;
11303 }
11304
11306 {
11307 int cleanness = Math.Round(floats.Get(index));
11309 index++;
11310 }
11311 }
11312
11314 {
11315 super.WriteVarsToCTX(ctx);
11316
11317
11319 {
11321 }
11322
11324 {
11326 }
11327
11329 {
11331 }
11332
11334 {
11335 int r,g,b,a;
11341 }
11342
11344 {
11346 }
11347 }
11348
11350 {
11351 if (!super.ReadVarsFromCTX(ctx,version))
11352 return false;
11353
11354 int intValue;
11355 float value;
11356
11357 if (version < 140)
11358 {
11359 if (!ctx.
Read(intValue))
11360 return false;
11361
11362 m_VariablesMask = intValue;
11363 }
11364
11366 {
11367 if (!ctx.
Read(value))
11368 return false;
11369
11371 {
11373 }
11374 else
11375 {
11377 }
11378 }
11379
11380 if (version < 140)
11381 {
11383 {
11384 if (!ctx.
Read(value))
11385 return false;
11386 SetTemperatureDirect(value);
11387 }
11388 }
11389
11391 {
11392 if (!ctx.
Read(value))
11393 return false;
11395 }
11396
11398 {
11399 if (!ctx.
Read(intValue))
11400 return false;
11402 }
11403
11405 {
11406 int r,g,b,a;
11408 return false;
11410 return false;
11412 return false;
11414 return false;
11415
11417 }
11418
11420 {
11421 if (!ctx.
Read(intValue))
11422 return false;
11424 }
11425
11426 if (version >= 138 && version < 140)
11427 {
11429 {
11430 if (!ctx.
Read(intValue))
11431 return false;
11432 SetFrozen(intValue);
11433 }
11434 }
11435
11436 return true;
11437 }
11438
11439
11441 {
11444 {
11446 }
11447
11448 if (!super.OnStoreLoad(ctx, version))
11449 {
11451 return false;
11452 }
11453
11454 if (version >= 114)
11455 {
11456 bool hasQuickBarIndexSaved;
11457
11458 if (!ctx.
Read(hasQuickBarIndexSaved))
11459 {
11461 return false;
11462 }
11463
11464 if (hasQuickBarIndexSaved)
11465 {
11466 int itmQBIndex;
11467
11468
11469 if (!ctx.
Read(itmQBIndex))
11470 {
11472 return false;
11473 }
11474
11475 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11476 if (itmQBIndex != -1 && parentPlayer)
11477 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11478 }
11479 }
11480 else
11481 {
11482
11483 PlayerBase player;
11484 int itemQBIndex;
11485 if (version ==
int.
MAX)
11486 {
11487 if (!ctx.
Read(itemQBIndex))
11488 {
11490 return false;
11491 }
11492 }
11493 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11494 {
11495
11496 if (!ctx.
Read(itemQBIndex))
11497 {
11499 return false;
11500 }
11501 if (itemQBIndex != -1 && player)
11502 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11503 }
11504 }
11505
11506 if (version < 140)
11507 {
11508
11509 if (!LoadVariables(ctx, version))
11510 {
11512 return false;
11513 }
11514 }
11515
11516
11518 {
11520 return false;
11521 }
11522 if (version >= 132)
11523 {
11525 if (raib)
11526 {
11528 {
11530 return false;
11531 }
11532 }
11533 }
11534
11536 return true;
11537 }
11538
11539
11540
11542 {
11543 super.OnStoreSave(ctx);
11544
11545 PlayerBase player;
11546 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11547 {
11549
11550 int itemQBIndex = -1;
11551 itemQBIndex = player.FindQuickBarEntityIndex(this);
11552 ctx.
Write(itemQBIndex);
11553 }
11554 else
11555 {
11557 }
11558
11560
11562 if (raib)
11563 {
11565 }
11566 }
11567
11568
11570 {
11571 super.AfterStoreLoad();
11572
11574 {
11576 }
11577
11579 {
11582 }
11583 }
11584
11586 {
11587 super.EEOnAfterLoad();
11588
11590 {
11592 }
11593
11596 }
11597
11599 {
11600 return false;
11601 }
11602
11603
11604
11606 {
11608 {
11609 #ifdef PLATFORM_CONSOLE
11610
11612 {
11614 if (menu)
11615 {
11617 }
11618 }
11619 #endif
11620 }
11621
11623 {
11626 }
11627
11629 {
11630 SetWeightDirty();
11632 }
11634 {
11637 }
11638
11640 {
11643
11646 }
11648 {
11652 }
11653
11654 super.OnVariablesSynchronized();
11655 }
11656
11657
11658
11660 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11661 {
11662 if (!IsServerCheck(allow_client))
11663 return false;
11664
11666 return false;
11667
11670
11671 if (value <= (min + 0.001))
11672 value = min;
11673
11674 if (value == min)
11675 {
11676 if (destroy_config)
11677 {
11678 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11679 if (dstr)
11680 {
11682 this.Delete();
11683 return true;
11684 }
11685 }
11686 else if (destroy_forced)
11687 {
11689 this.Delete();
11690 return true;
11691 }
11692
11694 }
11695
11698
11700 {
11701 EntityAI parent = GetHierarchyRoot();
11702 InventoryLocation iLoc = new InventoryLocation();
11703 GetInventory().GetCurrentInventoryLocation(iLoc);
11705 {
11706 int iLocSlot = iLoc.
GetSlot();
11708 {
11710 }
11712 {
11714 }
11715 }
11716 }
11717
11719 {
11721
11722 if (delta)
11724 }
11725
11727
11728 return false;
11729 }
11730
11731
11733 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11734 {
11736 }
11737
11739 {
11742 }
11743
11745 {
11748 }
11749
11751 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11752 {
11753 float value_clamped = Math.Clamp(value, 0, 1);
11755 SetQuantity(result, destroy_config, destroy_forced);
11756 }
11757
11758
11761 {
11763 }
11764
11766 {
11768 }
11769
11770
11771
11772
11773
11774
11775
11776
11777
11778
11780 {
11781 int slot = -1;
11782 GameInventory inventory = GetInventory();
11783 if (inventory)
11784 {
11785 InventoryLocation il = new InventoryLocation;
11788 }
11789
11791 }
11792
11794 {
11795 float quantity_max = 0;
11796
11798 {
11799 if (attSlotID != -1)
11800 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11801
11802 if (quantity_max <= 0)
11804 }
11805
11806 if (quantity_max <= 0)
11808
11809 return quantity_max;
11810 }
11811
11813 {
11815 }
11816
11818 {
11820 }
11821
11822
11824 {
11826 }
11827
11829 {
11831 }
11832
11834 {
11836 }
11837
11838
11840 {
11841
11842 float weightEx = GetWeightEx();
11843 float special = GetInventoryAndCargoWeight();
11844 return weightEx - special;
11845 }
11846
11847
11849 {
11851 }
11852
11854 {
11856 {
11857 #ifdef DEVELOPER
11858 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11859 {
11860 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11862 }
11863 #endif
11864
11865 return GetQuantity() * GetConfigWeightModified();
11866 }
11867 else if (HasEnergyManager())
11868 {
11869 #ifdef DEVELOPER
11870 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11871 {
11872 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11873 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11874 }
11875 #endif
11876 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11877 }
11878 else
11879 {
11880 #ifdef DEVELOPER
11881 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11882 {
11883 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11884 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11885 }
11886 #endif
11887 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11888 }
11889 }
11890
11893 {
11894 int item_count = 0;
11896
11897 GameInventory inventory = GetInventory();
11898 CargoBase cargo = inventory.
GetCargo();
11899 if (cargo != NULL)
11900 {
11902 }
11903
11905 for (int i = 0; i < nAttachments; ++i)
11906 {
11908 if (item)
11909 item_count += item.GetNumberOfItems();
11910 }
11911 return item_count;
11912 }
11913
11916 {
11917 float weight = 0;
11918 float wetness = 1;
11919 if (include_wetness)
11922 {
11923 weight = wetness * m_ConfigWeight;
11924 }
11926 {
11927 weight = 1;
11928 }
11929 return weight;
11930 }
11931
11932
11933
11935 {
11936 GameInventory inventory = GetInventory();
11937 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
11938 {
11939 array<EntityAI> items = new array<EntityAI>;
11941 for (int i = 0; i < items.Count(); ++i)
11942 {
11944 if (item)
11945 {
11946 g_Game.ObjectDelete(item);
11947 }
11948 }
11949 }
11950 }
11951
11952
11953
11954
11956 {
11957 float energy = 0;
11958 if (HasEnergyManager())
11959 {
11960 energy = GetCompEM().GetEnergy();
11961 }
11962 return energy;
11963 }
11964
11965
11967 {
11968 super.OnEnergyConsumed();
11969
11971 }
11972
11974 {
11975 super.OnEnergyAdded();
11976
11978 }
11979
11980
11982 {
11983 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11984 {
11986 {
11987 float energy_0to1 = GetCompEM().GetEnergy0To1();
11989 }
11990 }
11991 }
11992
11993
11995 {
11996 return ConfigGetFloat("heatIsolation");
11997 }
11998
12000 {
12002 }
12003
12005 {
12006 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12007 if (
g_Game.ConfigIsExisting(paramPath))
12008 return g_Game.ConfigGetFloat(paramPath);
12009
12010 return 0.0;
12011 }
12012
12014 {
12015 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12016 if (
g_Game.ConfigIsExisting(paramPath))
12017 return g_Game.ConfigGetFloat(paramPath);
12018
12019 return 0.0;
12020 }
12021
12022 override void SetWet(
float value,
bool allow_client =
false)
12023 {
12024 if (!IsServerCheck(allow_client))
12025 return;
12026
12029
12031
12032 m_VarWet = Math.Clamp(value, min, max);
12033
12035 {
12038 }
12039 }
12040
12041 override void AddWet(
float value)
12042 {
12044 }
12045
12047 {
12049 }
12050
12052 {
12054 }
12055
12057 {
12059 }
12060
12062 {
12064 }
12065
12067 {
12069 }
12070
12071 override void OnWetChanged(
float newVal,
float oldVal)
12072 {
12075 if (newLevel != oldLevel)
12076 {
12078 }
12079 }
12080
12082 {
12083 SetWeightDirty();
12084 }
12085
12087 {
12088 return GetWetLevelInternal(
m_VarWet);
12089 }
12090
12091
12092
12094 {
12096 }
12097
12099 {
12101 }
12102
12104 {
12106 }
12107
12109 {
12111 }
12112
12113
12114
12116 {
12117 if (ConfigIsExisting("itemModelLength"))
12118 {
12119 return ConfigGetFloat("itemModelLength");
12120 }
12121 return 0;
12122 }
12123
12125 {
12126 if (ConfigIsExisting("itemAttachOffset"))
12127 {
12128 return ConfigGetFloat("itemAttachOffset");
12129 }
12130 return 0;
12131 }
12132
12133 override void SetCleanness(
int value,
bool allow_client =
false)
12134 {
12135 if (!IsServerCheck(allow_client))
12136 return;
12137
12139
12141
12144 }
12145
12147 {
12149 }
12150
12152 {
12153 return true;
12154 }
12155
12156
12157
12158
12160 {
12162 }
12163
12165 {
12167 }
12168
12169
12170
12171
12172 override void SetColor(
int r,
int g,
int b,
int a)
12173 {
12179 }
12181 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12182 {
12187 }
12188
12190 {
12192 }
12193
12196 {
12197 int r,g,b,a;
12199 r = r/255;
12200 g = g/255;
12201 b = b/255;
12202 a = a/255;
12203 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12204 }
12205
12206
12207
12208 override void SetLiquidType(
int value,
bool allow_client =
false)
12209 {
12210 if (!IsServerCheck(allow_client))
12211 return;
12212
12217 }
12218
12220 {
12221 return ConfigGetInt("varLiquidTypeInit");
12222 }
12223
12225 {
12227 }
12228
12230 {
12232 SetFrozen(false);
12233 }
12234
12237 {
12238 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12239 }
12240
12241
12244 {
12245 PlayerBase nplayer;
12246 if (PlayerBase.CastTo(nplayer, player))
12247 {
12249 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12250 }
12251 }
12252
12253
12256 {
12257 PlayerBase nplayer;
12258 if (PlayerBase.CastTo(nplayer,player))
12259 {
12260 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12261 }
12262
12263 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12264
12265 if (HasEnergyManager())
12266 {
12267 GetCompEM().UpdatePlugState();
12268 }
12269 }
12270
12271
12273 {
12274 super.OnPlacementStarted(player);
12275
12277 }
12278
12279 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12280 {
12282 {
12283 m_AdminLog.OnPlacementComplete(player,
this);
12284 }
12285
12286 super.OnPlacementComplete(player, position, orientation);
12287 }
12288
12289
12290
12291
12292
12294 {
12296 {
12297 return true;
12298 }
12299 else
12300 {
12301 return false;
12302 }
12303 }
12304
12305
12307 {
12309 {
12311 }
12312 }
12313
12314
12316 {
12318 }
12319
12321 {
12323 }
12324
12325 override void InsertAgent(
int agent,
float count = 1)
12326 {
12327 if (count < 1)
12328 return;
12329
12331 }
12332
12335 {
12337 }
12338
12339
12341 {
12343 }
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
12356
12357
12358
12359
12360
12361
12362
12363
12364
12365
12366
12367
12368
12369
12370
12371
12372
12373
12374
12375
12376
12377
12378
12379
12380
12381
12382
12383
12384
12385
12387 {
12389 return false;
12390 return true;
12391 }
12392
12394 {
12395
12397 }
12398
12399
12402 {
12403 super.CheckForRoofLimited(timeTresholdMS);
12404
12405 float time =
g_Game.GetTime();
12406 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12407 {
12408 m_PreviousRoofTestTime = time;
12409 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12410 }
12411 }
12412
12413
12415 {
12417 {
12418 return 0;
12419 }
12420
12421 if (GetInventory().GetAttachmentSlotsCount() != 0)
12422 {
12423 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12424 if (filter)
12425 return filter.GetProtectionLevel(type, false, system);
12426 else
12427 return 0;
12428 }
12429
12430 string subclassPath, entryName;
12431
12432 switch (type)
12433 {
12435 entryName = "biological";
12436 break;
12438 entryName = "chemical";
12439 break;
12440 default:
12441 entryName = "biological";
12442 break;
12443 }
12444
12445 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12446
12447 return g_Game.ConfigGetFloat(subclassPath + entryName);
12448 }
12449
12450
12451
12454 {
12455 if (!IsMagazine())
12457
12459 }
12460
12461
12462
12463
12464
12469 {
12470 return true;
12471 }
12472
12474 {
12476 }
12477
12478
12479
12480
12481
12483 {
12484 if (parent)
12485 {
12486 if (parent.IsInherited(DayZInfected))
12487 return true;
12488
12489 if (!parent.IsRuined())
12490 return true;
12491 }
12492
12493 return true;
12494 }
12495
12497 {
12498 if (!super.CanPutAsAttachment(parent))
12499 {
12500 return false;
12501 }
12502
12503 if (!IsRuined() && !parent.IsRuined())
12504 {
12505 return true;
12506 }
12507
12508 return false;
12509 }
12510
12512 {
12513
12514
12515
12516
12517 return super.CanReceiveItemIntoCargo(item);
12518 }
12519
12521 {
12522
12523
12524
12525
12526 GameInventory attachmentInv = attachment.GetInventory();
12528 {
12529 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12530 return false;
12531 }
12532
12533 InventoryLocation loc = new InventoryLocation();
12534 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12535 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12536 return false;
12537
12538 return super.CanReceiveAttachment(attachment, slotId);
12539 }
12540
12542 {
12543 if (!super.CanReleaseAttachment(attachment))
12544 return false;
12545
12546 return GetInventory().AreChildrenAccessible();
12547 }
12548
12549
12550
12551
12552
12553
12554
12555
12556
12557
12558
12559
12560
12561
12562
12563
12564
12565
12566
12567
12568
12570 {
12571 int id = muzzle_owner.GetMuzzleID();
12572 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12573
12574 if (WPOF_array)
12575 {
12576 for (int i = 0; i < WPOF_array.Count(); i++)
12577 {
12578 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12579
12580 if (WPOF)
12581 {
12582 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12583 }
12584 }
12585 }
12586 }
12587
12588
12590 {
12591 int id = muzzle_owner.GetMuzzleID();
12593
12594 if (WPOBE_array)
12595 {
12596 for (int i = 0; i < WPOBE_array.Count(); i++)
12597 {
12598 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12599
12600 if (WPOBE)
12601 {
12602 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12603 }
12604 }
12605 }
12606 }
12607
12608
12610 {
12611 int id = muzzle_owner.GetMuzzleID();
12612 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12613
12614 if (WPOOH_array)
12615 {
12616 for (int i = 0; i < WPOOH_array.Count(); i++)
12617 {
12618 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12619
12620 if (WPOOH)
12621 {
12622 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12623 }
12624 }
12625 }
12626 }
12627
12628
12630 {
12631 int id = muzzle_owner.GetMuzzleID();
12632 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12633
12634 if (WPOOH_array)
12635 {
12636 for (int i = 0; i < WPOOH_array.Count(); i++)
12637 {
12638 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12639
12640 if (WPOOH)
12641 {
12642 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12643 }
12644 }
12645 }
12646 }
12647
12648
12650 {
12651 int id = muzzle_owner.GetMuzzleID();
12652 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12653
12654 if (WPOOH_array)
12655 {
12656 for (int i = 0; i < WPOOH_array.Count(); i++)
12657 {
12658 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12659
12660 if (WPOOH)
12661 {
12662 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12663 }
12664 }
12665 }
12666 }
12667
12668
12669
12671 {
12673 {
12674 return true;
12675 }
12676
12677 return false;
12678 }
12679
12681 {
12683 {
12684 return true;
12685 }
12686
12687 return false;
12688 }
12689
12691 {
12693 {
12694 return true;
12695 }
12696
12697 return false;
12698 }
12699
12701 {
12702 return false;
12703 }
12704
12707 {
12708 return UATimeSpent.DEFAULT_DEPLOY;
12709 }
12710
12711
12712
12713
12715 {
12717 SetSynchDirty();
12718 }
12719
12721 {
12723 }
12724
12725
12727 {
12728 return false;
12729 }
12730
12733 {
12734 string att_type = "None";
12735
12736 if (ConfigIsExisting("soundAttType"))
12737 {
12738 att_type = ConfigGetString("soundAttType");
12739 }
12740
12742 }
12743
12745 {
12747 }
12748
12749
12750
12751
12752
12758
12760 {
12763
12765 }
12766
12767
12769 {
12771 return;
12772
12774
12777
12780
12781 SoundParameters params = new SoundParameters();
12785 }
12786
12787
12789 {
12791 {
12794
12795 SetSynchDirty();
12796
12799 }
12800 }
12801
12803 {
12805 }
12806
12807
12809 {
12811 return;
12812
12814 SetSynchDirty();
12815
12818 }
12819
12821 {
12824 }
12825
12827 {
12829 }
12830
12831 void OnApply(PlayerBase player);
12832
12834 {
12835 return 1.0;
12836 };
12837
12839 {
12841 }
12842
12844 {
12846 }
12847
12849
12851 {
12852 SetDynamicPhysicsLifeTime(0.01);
12854 }
12855
12857 {
12858 array<string> zone_names = new array<string>;
12859 GetDamageZones(zone_names);
12860 for (int i = 0; i < zone_names.Count(); i++)
12861 {
12862 SetHealthMax(zone_names.Get(i),"Health");
12863 }
12864 SetHealthMax("","Health");
12865 }
12866
12869 {
12870 float global_health = GetHealth01("","Health");
12871 array<string> zones = new array<string>;
12872 GetDamageZones(zones);
12873
12874 for (int i = 0; i < zones.Count(); i++)
12875 {
12876 SetHealth01(zones.Get(i),"Health",global_health);
12877 }
12878 }
12879
12882 {
12883 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12884 }
12885
12887 {
12888 if (!hasRootAsPlayer)
12889 {
12890 if (refParentIB)
12891 {
12892
12893 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12894 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12895
12896 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12897 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12898
12901 }
12902 else
12903 {
12904
12907 }
12908 }
12909 }
12910
12912 {
12914 {
12915 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12916 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12917 {
12918 float heatPermCoef = 1.0;
12920 while (ent)
12921 {
12922 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12923 ent = ent.GetHierarchyParent();
12924 }
12925
12926 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12927 }
12928 }
12929 }
12930
12932 {
12933
12934 EntityAI parent = GetHierarchyParent();
12935 if (!parent)
12936 {
12937 hasParent = false;
12938 hasRootAsPlayer = false;
12939 }
12940 else
12941 {
12942 hasParent = true;
12943 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12944 refParentIB =
ItemBase.Cast(parent);
12945 }
12946 }
12947
12948 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12949 {
12950
12951 }
12952
12954 {
12955
12956 return false;
12957 }
12958
12960 {
12961
12962
12963 return false;
12964 }
12965
12967 {
12968
12969 return false;
12970 }
12971
12974 {
12975 return !GetIsFrozen() &&
IsOpen();
12976 }
12977
12979 {
12980 bool hasParent = false, hasRootAsPlayer = false;
12982
12983 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12984 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12985
12986 if (wwtu || foodDecay)
12987 {
12991
12992 if (processWetness || processTemperature || processDecay)
12993 {
12995
12996 if (processWetness)
12997 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12998
12999 if (processTemperature)
13001
13002 if (processDecay)
13003 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13004 }
13005 }
13006 }
13007
13010 {
13012 }
13013
13015 {
13018
13019 return super.GetTemperatureFreezeThreshold();
13020 }
13021
13023 {
13026
13027 return super.GetTemperatureThawThreshold();
13028 }
13029
13031 {
13034
13035 return super.GetItemOverheatThreshold();
13036 }
13037
13039 {
13041 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13042
13043 return super.GetTemperatureFreezeTime();
13044 }
13045
13047 {
13049 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13050
13051 return super.GetTemperatureThawTime();
13052 }
13053
13058
13060 {
13061 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13062 }
13063
13065 {
13066 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13067 }
13068
13071 {
13073 }
13074
13076 {
13078 }
13079
13081 {
13083 }
13084
13087 {
13088 return null;
13089 }
13090
13093 {
13094 return false;
13095 }
13096
13098 {
13100 {
13103 if (!trg)
13104 {
13106 explosive = this;
13107 }
13108
13109 explosive.PairRemote(trg);
13111
13112 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13113 trg.SetPersistentPairID(persistentID);
13114 explosive.SetPersistentPairID(persistentID);
13115
13116 return true;
13117 }
13118 return false;
13119 }
13120
13123 {
13124 float ret = 1.0;
13127 ret *= GetHealth01();
13128
13129 return ret;
13130 }
13131
13132 #ifdef DEVELOPER
13133 override void SetDebugItem()
13134 {
13135 super.SetDebugItem();
13136 _itemBase = this;
13137 }
13138
13140 {
13141 string text = super.GetDebugText();
13142
13144 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13145
13146 return text;
13147 }
13148 #endif
13149
13151 {
13152 return true;
13153 }
13154
13156
13158
13160 {
13163 }
13164
13165
13173
13189
13190 [
Obsolete(
"Use ItemSoundHandler instead")]
13193 {
13194 if (!
g_Game.IsDedicatedServer())
13195 {
13196 if (ConfigIsExisting("attachSoundSet"))
13197 {
13198 string cfg_path = "";
13199 string soundset = "";
13200 string type_name =
GetType();
13201
13204 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13205 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13206
13207 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13208 {
13209 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13210 {
13211 if (cfg_slot_array[i] == slot_type)
13212 {
13213 soundset = cfg_soundset_array[i];
13214 break;
13215 }
13216 }
13217 }
13218
13219 if (soundset != "")
13220 {
13221 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13223 }
13224 }
13225 }
13226 }
13227
13229}
13230
13232{
13234 if (entity)
13235 {
13236 bool is_item = entity.IsInherited(
ItemBase);
13237 if (is_item && full_quantity)
13238 {
13241 }
13242 }
13243 else
13244 {
13246 return NULL;
13247 }
13248 return entity;
13249}
13250
13252{
13253 if (item)
13254 {
13255 if (health > 0)
13256 item.SetHealth("", "", health);
13257
13258 if (item.CanHaveTemperature())
13259 {
13261 if (item.CanFreeze())
13262 item.SetFrozen(false);
13263 }
13264
13265 if (item.HasEnergyManager())
13266 {
13267 if (quantity >= 0)
13268 {
13269 item.GetCompEM().SetEnergy0To1(quantity);
13270 }
13271 else
13272 {
13274 }
13275 }
13276 else if (item.IsMagazine())
13277 {
13278 Magazine mag = Magazine.Cast(item);
13279 if (quantity >= 0)
13280 {
13281 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13282 }
13283 else
13284 {
13286 }
13287
13288 }
13289 else
13290 {
13291 if (quantity >= 0)
13292 {
13293 item.SetQuantityNormalized(quantity, false);
13294 }
13295 else
13296 {
13298 }
13299
13300 }
13301 }
13302}
13303
13304#ifdef DEVELOPER
13306#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.