8403{
8405 {
8406 return true;
8407 }
8408};
8409
8411{
8412
8413};
8414
8415
8416
8418{
8422
8424
8427
8428
8429
8430
8431
8440
8446
8451
8456
8477 protected bool m_IsResultOfSplit
8478
8480
8485
8486
8487
8489
8493
8494
8495
8497
8500
8501
8502
8508
8509
8517
8520
8521
8523
8524
8526
8527
8532
8533
8538
8540
8541
8543
8544
8546 {
8551
8552 if (!
g_Game.IsDedicatedServer())
8553 {
8555 {
8557
8559 {
8561 }
8562 }
8563
8566 }
8567
8568 m_OldLocation = null;
8569
8571 {
8573 }
8574
8575 if (ConfigIsExisting("headSelectionsToHide"))
8576 {
8579 }
8580
8582 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8583 {
8585 }
8586
8588
8589 m_IsResultOfSplit = false;
8590
8592 }
8593
8595 {
8596 super.InitItemVariables();
8597
8603 m_Count = ConfigGetInt(
"count");
8604
8607
8612
8615
8620
8632
8636
8637
8640 if (ConfigIsExisting("canBeSplit"))
8641 {
8644 }
8645
8647 if (ConfigIsExisting("itemBehaviour"))
8649
8650
8653 RegisterNetSyncVariableInt("m_VarLiquidType");
8654 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8655
8656 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8657 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8658 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8659
8660 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8661 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8662 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8663 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8664
8665 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8666 RegisterNetSyncVariableBool("m_IsTakeable");
8667 RegisterNetSyncVariableBool("m_IsHologram");
8668
8671 {
8674 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8675 }
8676
8678
8680 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8682
8684 }
8685
8687 {
8689 }
8690
8692 {
8695 {
8700 }
8701 }
8702
8703 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8704 {
8706 {
8709 }
8710
8712 }
8713
8715 {
8721 }
8722
8724
8726 {
8728
8729 if (!action)
8730 {
8731 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8732 return;
8733 }
8734
8736 if (!ai)
8737 {
8739 return;
8740 }
8741
8743 if (!action_array)
8744 {
8745 action_array = new array<ActionBase_Basic>;
8747 }
8748 if (LogManager.IsActionLogEnable())
8749 {
8750 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8751 }
8752
8753 if (action_array.Find(action) != -1)
8754 {
8755 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8756 }
8757 else
8758 {
8759 action_array.Insert(action);
8760 }
8761 }
8762
8764 {
8765 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8766 ActionBase action = player.GetActionManager().GetAction(actionName);
8769
8770 if (action_array)
8771 {
8772 action_array.RemoveItem(action);
8773 }
8774 }
8775
8776
8777
8779 {
8780 ActionOverrideData overrideData = new ActionOverrideData();
8784
8786 if (!actionMap)
8787 {
8790 }
8791
8792 actionMap.Insert(this.
Type(), overrideData);
8793
8794 }
8795
8797
8799
8800
8802 {
8805
8808
8809 string config_to_search = "CfgVehicles";
8810 string muzzle_owner_config;
8811
8813 {
8814 if (IsInherited(Weapon))
8815 config_to_search = "CfgWeapons";
8816
8817 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8818
8819 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8820
8821 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8822
8823 if (config_OnFire_subclass_count > 0)
8824 {
8825 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8826
8827 for (int i = 0; i < config_OnFire_subclass_count; i++)
8828 {
8829 string particle_class = "";
8830 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8831 string config_OnFire_entry = config_OnFire_class + particle_class;
8832 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8833 WPOF_array.Insert(WPOF);
8834 }
8835
8836
8838 }
8839 }
8840
8842 {
8843 config_to_search = "CfgWeapons";
8844 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8845
8846 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8847
8848 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8849
8850 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8851 {
8852 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8853
8854 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8855 {
8856 string particle_class2 = "";
8857 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8858 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8859 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8860 WPOBE_array.Insert(WPOBE);
8861 }
8862
8863
8865 }
8866 }
8867 }
8868
8869
8871 {
8874
8876 {
8877 string config_to_search = "CfgVehicles";
8878
8879 if (IsInherited(Weapon))
8880 config_to_search = "CfgWeapons";
8881
8882 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8883 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8884
8885 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8886 {
8887
8889
8891 {
8893 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8895 return;
8896 }
8897
8900
8901
8902
8903 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8904 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8905
8906 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8907 {
8908 string particle_class = "";
8909 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8910 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8911 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8912
8913 if (entry_type == CT_CLASS)
8914 {
8915 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8916 WPOOH_array.Insert(WPOF);
8917 }
8918 }
8919
8920
8922 }
8923 }
8924 }
8925
8927 {
8929 }
8930
8932 {
8934 {
8936
8939
8942
8943 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8944 }
8945 }
8946
8948 {
8950 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8951
8953 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8954
8956 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8957
8959 {
8961 }
8962 }
8963
8965 {
8967 }
8968
8970 {
8973 else
8975
8977 {
8980 }
8981 else
8982 {
8985
8988 }
8989
8991 }
8992
8994 {
8996 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8997 }
8998
9000 {
9002 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
9004 }
9005
9007 {
9009 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9010 }
9011
9013 {
9016
9017 OverheatingParticle OP = new OverheatingParticle();
9022
9024 }
9025
9027 {
9030
9031 return -1;
9032 }
9033
9035 {
9037 {
9040
9041 for (int i = count; i > 0; --i)
9042 {
9043 int id = i - 1;
9046
9049
9050 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9051 {
9052 if (p)
9053 {
9056 }
9057 }
9058 }
9059 }
9060 }
9061
9063 {
9065 {
9067 {
9068 int id = i - 1;
9070
9071 if (OP)
9072 {
9074
9075 if (p)
9076 {
9078 }
9079
9080 delete OP;
9081 }
9082 }
9083
9086 }
9087 }
9088
9091 {
9092 return 0.0;
9093 }
9094
9095
9097 {
9098 return 250;
9099 }
9100
9102 {
9103 return 0;
9104 }
9105
9108 {
9110 return true;
9111
9112 return false;
9113 }
9114
9117 {
9120
9122 {
9124 }
9125 else
9126 {
9127
9129 }
9130
9132 }
9133
9140 {
9141 return -1;
9142 }
9143
9144
9145
9146
9148 {
9150 {
9151 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9152 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9153
9154 if (r_index >= 0)
9155 {
9156 InventoryLocation r_il = new InventoryLocation;
9157 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9158
9159 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9162 {
9163 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9164 }
9166 {
9167 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9168 }
9169
9170 }
9171
9172 player.GetHumanInventory().ClearUserReservedLocation(this);
9173 }
9174
9177 }
9178
9179
9180
9181
9183 {
9184 return ItemBase.m_DebugActionsMask;
9185 }
9186
9188 {
9189 return ItemBase.m_DebugActionsMask & mask;
9190 }
9191
9193 {
9194 ItemBase.m_DebugActionsMask = mask;
9195 }
9196
9198 {
9199 ItemBase.m_DebugActionsMask |= mask;
9200 }
9201
9203 {
9204 ItemBase.m_DebugActionsMask &= ~mask;
9205 }
9206
9208 {
9210 {
9212 }
9213 else
9214 {
9216 }
9217 }
9218
9219
9221 {
9222 if (GetEconomyProfile())
9223 {
9224 float q_max = GetEconomyProfile().GetQuantityMax();
9225 if (q_max > 0)
9226 {
9227 float q_min = GetEconomyProfile().GetQuantityMin();
9228 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9229
9231 {
9232 ComponentEnergyManager comp = GetCompEM();
9234 {
9236 }
9237 }
9239 {
9241
9242 }
9243
9244 }
9245 }
9246 }
9247
9250 {
9251 EntityAI parent = GetHierarchyParent();
9252
9253 if (parent)
9254 {
9255 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9256 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9257 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9258 }
9259 }
9260
9263 {
9264 EntityAI parent = GetHierarchyParent();
9265
9266 if (parent)
9267 {
9268 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9269 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9270 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9271 }
9272 }
9273
9275 {
9276
9277
9278
9279
9281
9283 {
9284 if (ScriptInputUserData.CanStoreInputUserData())
9285 {
9286 ScriptInputUserData ctx = new ScriptInputUserData;
9292 ctx.
Write(use_stack_max);
9295
9297 {
9298 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9299 }
9300 }
9301 }
9302 else if (!
g_Game.IsMultiplayer())
9303 {
9305 }
9306 }
9307
9309 {
9311 }
9312
9314 {
9316 }
9317
9319 {
9321 }
9322
9324 {
9325
9326 return false;
9327 }
9328
9330 {
9331 return false;
9332 }
9333
9337 {
9338 return false;
9339 }
9340
9342 {
9343 return "";
9344 }
9345
9347
9349 {
9350 return false;
9351 }
9352
9354 {
9355 return true;
9356 }
9357
9358
9359
9361 {
9362 return true;
9363 }
9364
9366 {
9367 return true;
9368 }
9369
9371 {
9372 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9374 }
9375
9377 {
9379 }
9380
9382 {
9384 if (!is_being_placed)
9386 SetSynchDirty();
9387 }
9388
9389
9391
9393 {
9395 }
9396
9398 {
9400 }
9401
9403 {
9404 return 1;
9405 }
9406
9408 {
9409 return false;
9410 }
9411
9413 {
9415 SetSynchDirty();
9416 }
9417
9418
9419
9420
9421
9422
9423
9424
9425
9426
9427
9428
9429
9430
9431
9432
9433
9434
9435
9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449
9450
9451
9453 {
9454 super.OnMovedInsideCargo(container);
9455
9456 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9457 }
9458
9459 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9460 {
9461 super.EEItemLocationChanged(oldLoc, newLoc);
9462
9463 PlayerBase newPlayer = null;
9464 PlayerBase oldPlayer = null;
9465
9466 if (newLoc.GetParent())
9467 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9468
9469 if (oldLoc.GetParent())
9470 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9471
9473 {
9474 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9475
9476 if (rIndex >= 0)
9477 {
9478 InventoryLocation rIl = new InventoryLocation;
9479 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9480
9481 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9484 {
9485 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9486 }
9488 {
9490 }
9491
9492 }
9493 }
9494
9496 {
9497 if (newPlayer)
9498 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9499
9500 if (newPlayer == oldPlayer)
9501 {
9502 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9503 {
9505 {
9506 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9507 {
9508 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9509 }
9510 }
9511 else
9512 {
9513 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9514 }
9515 }
9516
9517 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9518 {
9519 int type = oldLoc.GetType();
9521 {
9522 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9523 }
9525 {
9526 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9527 }
9528 }
9529 if (!m_OldLocation)
9530 {
9531 m_OldLocation = new InventoryLocation;
9532 }
9533 m_OldLocation.Copy(oldLoc);
9534 }
9535 else
9536 {
9537 if (m_OldLocation)
9538 {
9539 m_OldLocation.Reset();
9540 }
9541 }
9542
9543 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9544 }
9545 else
9546 {
9547 if (newPlayer)
9548 {
9549 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9550 if (resIndex >= 0)
9551 {
9552 InventoryLocation il = new InventoryLocation;
9553 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9555 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9558 {
9559 il.
GetParent().GetOnReleaseLock().Invoke(it);
9560 }
9562 {
9564 }
9565
9566 }
9567 }
9569 {
9570
9572 }
9573
9574 if (m_OldLocation)
9575 {
9576 m_OldLocation.Reset();
9577 }
9578 }
9579
9581 {
9582 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9583 }
9584
9586 {
9587 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9588 }
9589 }
9590
9591 override void EOnContact(IEntity other, Contact extra)
9592 {
9594 {
9595 int liquidType = -1;
9597 if (impactSpeed > 0.0)
9598 {
9600 #ifndef SERVER
9602 #else
9604 SetSynchDirty();
9605 #endif
9607 }
9608 }
9609
9610 #ifdef SERVER
9611 if (GetCompEM() && GetCompEM().IsPlugged())
9612 {
9613 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9614 GetCompEM().UnplugThis();
9615 }
9616 #endif
9617 }
9618
9620
9622 {
9624 }
9625
9627 {
9628
9629 }
9630
9632 {
9633 super.OnItemLocationChanged(old_owner, new_owner);
9634
9635 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9636 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9637
9638 if (!relatedPlayer && playerNew)
9639 relatedPlayer = playerNew;
9640
9641 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9642 {
9644 if (actionMgr)
9645 {
9646 ActionBase currentAction = actionMgr.GetRunningAction();
9647 if (currentAction)
9649 }
9650 }
9651
9652 Man ownerPlayerOld = null;
9653 Man ownerPlayerNew = null;
9654
9655 if (old_owner)
9656 {
9657 if (old_owner.
IsMan())
9658 {
9659 ownerPlayerOld = Man.Cast(old_owner);
9660 }
9661 else
9662 {
9663 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9664 }
9665 }
9666 else
9667 {
9669 {
9671
9672 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9673 {
9674 GetCompEM().UnplugThis();
9675 }
9676 }
9677 }
9678
9679 if (new_owner)
9680 {
9681 if (new_owner.
IsMan())
9682 {
9683 ownerPlayerNew = Man.Cast(new_owner);
9684 }
9685 else
9686 {
9687 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9688 }
9689 }
9690
9691 if (ownerPlayerOld != ownerPlayerNew)
9692 {
9693 if (ownerPlayerOld)
9694 {
9695 array<EntityAI> subItemsExit = new array<EntityAI>;
9697 for (int i = 0; i < subItemsExit.Count(); i++)
9698 {
9701 }
9702 }
9703
9704 if (ownerPlayerNew)
9705 {
9706 array<EntityAI> subItemsEnter = new array<EntityAI>;
9708 for (int j = 0; j < subItemsEnter.Count(); j++)
9709 {
9712 }
9713 }
9714 }
9715 else if (ownerPlayerNew != null)
9716 {
9717 PlayerBase nplayer;
9718 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9719 {
9720 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9722 for (int k = 0; k < subItemsUpdate.Count(); k++)
9723 {
9725 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9726 }
9727 }
9728 }
9729
9730 if (old_owner)
9731 old_owner.OnChildItemRemoved(this);
9732 if (new_owner)
9733 new_owner.OnChildItemReceived(this);
9734 }
9735
9736
9738 {
9739 super.EEDelete(parent);
9740 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9741 if (player)
9742 {
9744
9745 if (player.IsAlive())
9746 {
9747 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9748 if (r_index >= 0)
9749 {
9750 InventoryLocation r_il = new InventoryLocation;
9751 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9752
9753 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9756 {
9757 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9758 }
9760 {
9761 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9762 }
9763
9764 }
9765
9766 player.RemoveQuickBarEntityShortcut(this);
9767 }
9768 }
9769 }
9770
9772 {
9773 super.EEKilled(killer);
9774
9777 {
9778 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9779 {
9780 if (IsMagazine())
9781 {
9782 if (Magazine.Cast(this).GetAmmoCount() > 0)
9783 {
9785 }
9786 }
9787 else
9788 {
9790 }
9791 }
9792 }
9793 }
9794
9796 {
9797 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9798
9799 super.OnWasAttached(parent, slot_id);
9800
9803
9806 }
9807
9809 {
9810 super.OnWasDetached(parent, slot_id);
9811
9814
9817 }
9818
9820 {
9821 int idx;
9824
9825 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9826 if (inventory_slots.Count() < 1)
9827 {
9828 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9829 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9830 }
9831 else
9832 {
9833 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9834 }
9835
9836 idx = inventory_slots.Find(slot);
9837 if (idx < 0)
9838 return "";
9839
9840 return attach_types.Get(idx);
9841 }
9842
9844 {
9845 int idx = -1;
9846 string slot;
9847
9850
9851 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9852 if (inventory_slots.Count() < 1)
9853 {
9854 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9855 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9856 }
9857 else
9858 {
9859 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9860 if (detach_types.Count() < 1)
9861 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9862 }
9863
9864 for (int i = 0; i < inventory_slots.Count(); i++)
9865 {
9866 slot = inventory_slots.Get(i);
9867 }
9868
9869 if (slot != "")
9870 {
9871 if (detach_types.Count() == 1)
9872 idx = 0;
9873 else
9874 idx = inventory_slots.Find(slot);
9875 }
9876 if (idx < 0)
9877 return "";
9878
9879 return detach_types.Get(idx);
9880 }
9881
9883 {
9884
9886
9887
9888 float min_time = 1;
9889 float max_time = 3;
9890 float delay = Math.RandomFloat(min_time, max_time);
9891
9892 explode_timer.Run(delay, this, "DoAmmoExplosion");
9893 }
9894
9896 {
9897 Magazine magazine = Magazine.Cast(this);
9898 int pop_sounds_count = 6;
9899 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9900
9901
9902 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9903 string sound_name = pop_sounds[ sound_idx ];
9904 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9905
9906
9907 magazine.ServerAddAmmoCount(-1);
9908
9909
9910 float min_temp_to_explode = 100;
9911
9912 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9913 {
9915 }
9916 }
9917
9918
9919 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9920 {
9921 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9922
9923 const int CHANCE_DAMAGE_CARGO = 4;
9924 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9925 const int CHANCE_DAMAGE_NOTHING = 2;
9926
9928 {
9929 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9930 int chances;
9931 int rnd;
9932
9933 if (GetInventory().GetCargo())
9934 {
9935 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9936 rnd = Math.RandomInt(0,chances);
9937
9938 if (rnd < CHANCE_DAMAGE_CARGO)
9939 {
9941 }
9942 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9943 {
9945 }
9946 }
9947 else
9948 {
9949 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9950 rnd = Math.RandomInt(0,chances);
9951
9952 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9953 {
9955 }
9956 }
9957 }
9958 }
9959
9961 {
9962 CargoBase cargo = GetInventory().GetCargo();
9963 if (cargo)
9964 {
9966 if (item_count > 0)
9967 {
9968 int random_pick = Math.RandomInt(0, item_count);
9970 if (!item.IsExplosive())
9971 {
9972 item.AddHealth("","",damage);
9973 return true;
9974 }
9975 }
9976 }
9977 return false;
9978 }
9979
9981 {
9982 GameInventory inventory = GetInventory();
9984 if (attachment_count > 0)
9985 {
9986 int random_pick = Math.RandomInt(0, attachment_count);
9988 if (!attachment.IsExplosive())
9989 {
9990 attachment.AddHealth("","",damage);
9991 return true;
9992 }
9993 }
9994 return false;
9995 }
9996
9998 {
10000 }
10001
10003 {
10005 return GetInventory().CanRemoveEntity();
10006
10007 return false;
10008 }
10009
10011 {
10012
10014 return false;
10015
10016
10018 return false;
10019
10020
10021
10023 if (delta == 0)
10024 return false;
10025
10026
10027 return true;
10028 }
10029
10031 {
10033 {
10034 if (ScriptInputUserData.CanStoreInputUserData())
10035 {
10036 ScriptInputUserData ctx = new ScriptInputUserData;
10041 ctx.
Write(destination_entity);
10043 ctx.
Write(slot_id);
10045 }
10046 }
10047 else if (!
g_Game.IsMultiplayer())
10048 {
10050 }
10051 }
10052
10054 {
10055 float split_quantity_new;
10059 InventoryLocation loc = new InventoryLocation;
10060
10061 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10062 {
10064 split_quantity_new = stack_max;
10065 else
10067
10069 {
10070 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10071 if (new_item)
10072 {
10073 new_item.SetResultOfSplit(true);
10074 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10076 new_item.
SetQuantity(split_quantity_new,
false,
true);
10077 }
10078 }
10079 }
10080 else if (destination_entity && slot_id == -1)
10081 {
10082 if (quantity > stack_max)
10083 split_quantity_new = stack_max;
10084 else
10085 split_quantity_new = quantity;
10086
10088 {
10089 GameInventory destinationInventory = destination_entity.GetInventory();
10091 {
10094 }
10095
10096 if (new_item)
10097 {
10098 new_item.SetResultOfSplit(true);
10099 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10101 new_item.
SetQuantity(split_quantity_new,
false,
true);
10102 }
10103 }
10104 }
10105 else
10106 {
10107 if (stack_max != 0)
10108 {
10110 {
10112 }
10113
10114 if (split_quantity_new == 0)
10115 {
10116 if (!
g_Game.IsMultiplayer())
10117 player.PhysicalPredictiveDropItem(this);
10118 else
10119 player.ServerDropEntity(this);
10120 return;
10121 }
10122
10124 {
10126
10127 if (new_item)
10128 {
10129 new_item.SetResultOfSplit(true);
10130 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10133 new_item.PlaceOnSurface();
10134 }
10135 }
10136 }
10137 }
10138 }
10139
10141 {
10142 float split_quantity_new;
10146 InventoryLocation loc = new InventoryLocation;
10147
10148 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10149 {
10151 split_quantity_new = stack_max;
10152 else
10154
10156 {
10157 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10158 if (new_item)
10159 {
10160 new_item.SetResultOfSplit(true);
10161 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10163 new_item.
SetQuantity(split_quantity_new,
false,
true);
10164 }
10165 }
10166 }
10167 else if (destination_entity && slot_id == -1)
10168 {
10169 if (quantity > stack_max)
10170 split_quantity_new = stack_max;
10171 else
10172 split_quantity_new = quantity;
10173
10175 {
10176 GameInventory destinationInventory = destination_entity.GetInventory();
10178 {
10181 }
10182
10183 if (new_item)
10184 {
10185 new_item.SetResultOfSplit(true);
10186 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10188 new_item.
SetQuantity(split_quantity_new,
false,
true);
10189 }
10190 }
10191 }
10192 else
10193 {
10194 if (stack_max != 0)
10195 {
10197 {
10199 }
10200
10202 {
10204
10205 if (new_item)
10206 {
10207 new_item.SetResultOfSplit(true);
10208 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10211 new_item.PlaceOnSurface();
10212 }
10213 }
10214 }
10215 }
10216 }
10217
10219 {
10221 {
10222 if (ScriptInputUserData.CanStoreInputUserData())
10223 {
10224 ScriptInputUserData ctx = new ScriptInputUserData;
10229 dst.WriteToContext(ctx);
10231 }
10232 }
10233 else if (!
g_Game.IsMultiplayer())
10234 {
10236 }
10237 }
10238
10240 {
10242 {
10243 if (ScriptInputUserData.CanStoreInputUserData())
10244 {
10245 ScriptInputUserData ctx = new ScriptInputUserData;
10250 ctx.
Write(destination_entity);
10256 }
10257 }
10258 else if (!
g_Game.IsMultiplayer())
10259 {
10261 }
10262 }
10263
10265 {
10267 }
10268
10270 {
10272 float split_quantity_new;
10274 if (dst.IsValid())
10275 {
10276 int slot_id = dst.GetSlot();
10278
10279 if (quantity > stack_max)
10280 split_quantity_new = stack_max;
10281 else
10282 split_quantity_new = quantity;
10283
10285 {
10287
10288 if (new_item)
10289 {
10290 new_item.SetResultOfSplit(true);
10291 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10293 new_item.
SetQuantity(split_quantity_new,
false,
true);
10294 }
10295
10296 return new_item;
10297 }
10298 }
10299
10300 return null;
10301 }
10302
10304 {
10306 float split_quantity_new;
10308 if (destination_entity)
10309 {
10311 if (quantity > stackable)
10312 split_quantity_new = stackable;
10313 else
10314 split_quantity_new = quantity;
10315
10317 {
10318 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10319 if (new_item)
10320 {
10321 new_item.SetResultOfSplit(true);
10322 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10324 new_item.
SetQuantity(split_quantity_new,
false,
true);
10325 }
10326 }
10327 }
10328 }
10329
10331 {
10333 {
10334 if (ScriptInputUserData.CanStoreInputUserData())
10335 {
10336 ScriptInputUserData ctx = new ScriptInputUserData;
10341 ItemBase destination_entity =
this;
10342 ctx.
Write(destination_entity);
10346 }
10347 }
10348 else if (!
g_Game.IsMultiplayer())
10349 {
10351 }
10352 }
10353
10355 {
10357 float split_quantity_new;
10359 if (player)
10360 {
10362 if (quantity > stackable)
10363 split_quantity_new = stackable;
10364 else
10365 split_quantity_new = quantity;
10366
10368 {
10369 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10370 new_item =
ItemBase.Cast(in_hands);
10371 if (new_item)
10372 {
10373 new_item.SetResultOfSplit(true);
10374 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10376 new_item.SetQuantity(split_quantity_new, false, true);
10377 }
10378 }
10379 }
10380 }
10381
10383 {
10385 float split_quantity_new = Math.Floor(quantity * 0.5);
10386
10388 return;
10389
10391
10392 if (new_item)
10393 {
10394 if (new_item.GetQuantityMax() < split_quantity_new)
10395 {
10396 split_quantity_new = new_item.GetQuantityMax();
10397 }
10398
10399 new_item.SetResultOfSplit(true);
10400 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10401
10403 {
10406 }
10407 else
10408 {
10410 new_item.
SetQuantity(split_quantity_new,
false,
true);
10411 }
10412 }
10413 }
10414
10416 {
10418 float split_quantity_new = Math.Floor(quantity / 2);
10419
10421 return;
10422
10423 InventoryLocation invloc = new InventoryLocation;
10425
10427 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10428
10429 if (new_item)
10430 {
10431 if (new_item.GetQuantityMax() < split_quantity_new)
10432 {
10433 split_quantity_new = new_item.GetQuantityMax();
10434 }
10436 {
10439 }
10440 else if (split_quantity_new > 1)
10441 {
10443 new_item.
SetQuantity(split_quantity_new,
false,
true);
10444 }
10445 }
10446 }
10447
10450 {
10451 SetWeightDirty();
10453
10454 if (parent)
10455 parent.OnAttachmentQuantityChangedEx(this, delta);
10456
10458 {
10460 {
10462 }
10464 {
10465 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10467 }
10468 }
10469 }
10470
10473 {
10474
10475 }
10476
10479 {
10481 }
10482
10484 {
10485 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10486
10488 {
10489 if (newLevel == GameConstants.STATE_RUINED)
10490 {
10492 EntityAI parent = GetHierarchyParent();
10493 if (parent && parent.IsFireplace())
10494 {
10495 CargoBase cargo = GetInventory().GetCargo();
10496 if (cargo)
10497 {
10499 {
10501 }
10502 }
10503 }
10504 }
10505
10507 {
10508
10510 return;
10511 }
10512
10513 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10514 {
10516 }
10517 }
10518 }
10519
10520
10522 {
10523 super.OnRightClick();
10524
10526 {
10528 {
10529 if (ScriptInputUserData.CanStoreInputUserData())
10530 {
10531 EntityAI root = GetHierarchyRoot();
10532 Man playerOwner = GetHierarchyRootPlayer();
10533 InventoryLocation dst = new InventoryLocation;
10534
10535
10536 if (!playerOwner && root && root == this)
10537 {
10539 }
10540 else
10541 {
10542
10543 GetInventory().GetCurrentInventoryLocation(dst);
10545 {
10546 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10548 {
10550 }
10551 else
10552 {
10554
10555
10556 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10557 {
10559 }
10560 else
10561 {
10562 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10563 }
10564 }
10565 }
10566 }
10567
10568 ScriptInputUserData ctx = new ScriptInputUserData;
10576 }
10577 }
10578 else if (!
g_Game.IsMultiplayer())
10579 {
10581 }
10582 }
10583 }
10584
10586 {
10587 if (root)
10588 {
10589 vector m4[4];
10590 root.GetTransform(m4);
10591 dst.SetGround(this, m4);
10592 }
10593 else
10594 {
10595 GetInventory().GetCurrentInventoryLocation(dst);
10596 }
10597 }
10598
10599 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10600 {
10601
10602 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10603 return false;
10604
10605 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10606 return false;
10607
10608
10610 return false;
10611
10612
10613 Magazine mag = Magazine.Cast(this);
10614 if (mag)
10615 {
10616 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10617 return false;
10618
10619 if (stack_max_limit)
10620 {
10621 Magazine other_mag = Magazine.Cast(other_item);
10622 if (other_item)
10623 {
10624 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10625 return false;
10626 }
10627
10628 }
10629 }
10630 else
10631 {
10632
10634 return false;
10635
10637 return false;
10638 }
10639
10640 PlayerBase player = null;
10641 if (CastTo(player, GetHierarchyRootPlayer()))
10642 {
10643 if (player.GetInventory().HasAttachment(this))
10644 return false;
10645
10646 if (player.IsItemsToDelete())
10647 return false;
10648 }
10649
10650 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10651 return false;
10652
10653 int slotID;
10655 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10656 return false;
10657
10658 return true;
10659 }
10660
10662 {
10664 }
10665
10667 {
10668 return m_IsResultOfSplit;
10669 }
10670
10672 {
10673 m_IsResultOfSplit = value;
10674 }
10675
10677 {
10679 }
10680
10682 {
10683 float other_item_quantity = other_item.GetQuantity();
10684 float this_free_space;
10685
10687
10689
10690 if (other_item_quantity > this_free_space)
10691 {
10692 return this_free_space;
10693 }
10694 else
10695 {
10696 return other_item_quantity;
10697 }
10698 }
10699
10701 {
10703 }
10704
10706 {
10708 return;
10709
10710 if (!IsMagazine() && other_item)
10711 {
10713 if (quantity_used != 0)
10714 {
10715 float hp1 = GetHealth01("","");
10716 float hp2 = other_item.GetHealth01("","");
10717 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10718 hpResult = hpResult / (
GetQuantity() + quantity_used);
10719
10720 hpResult *= GetMaxHealth();
10721 Math.Round(hpResult);
10722 SetHealth("", "Health", hpResult);
10723
10725 other_item.AddQuantity(-quantity_used);
10726 }
10727 }
10729 }
10730
10732 {
10733 #ifdef SERVER
10734 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10735 GetHierarchyParent().IncreaseLifetimeUp();
10736 #endif
10737 };
10738
10740 {
10741 PlayerBase p = PlayerBase.Cast(player);
10742
10743 array<int> recipesIds = p.m_Recipes;
10744 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10745 if (moduleRecipesManager)
10746 {
10747 EntityAI itemInHands = player.GetEntityInHands();
10748 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10749 }
10750
10751 for (int i = 0;i < recipesIds.Count(); i++)
10752 {
10753 int key = recipesIds.Get(i);
10754 string recipeName = moduleRecipesManager.GetRecipeName(key);
10756 }
10757 }
10758
10759
10760 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10761 {
10762 super.GetDebugActions(outputList);
10763
10764
10770
10771
10776
10781
10782
10786
10787
10789 {
10793 }
10794
10797
10798
10802
10804
10805 InventoryLocation loc = new InventoryLocation();
10806 GetInventory().GetCurrentInventoryLocation(loc);
10808 {
10809 if (Gizmo_IsSupported())
10812 }
10813
10815 }
10816
10817
10818
10819
10821 {
10822 super.OnAction(action_id, player, ctx);
10823
10825 {
10826 switch (action_id)
10827 {
10831 return true;
10835 return true;
10836 }
10837 }
10838
10840 {
10841 switch (action_id)
10842 {
10844 Delete();
10845 return true;
10846 }
10847 }
10848
10849 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10850 {
10851 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10852 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10853 PlayerBase p = PlayerBase.Cast(player);
10854 if (
EActions.RECIPES_RANGE_START < 1000)
10855 {
10856 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10857 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10858 }
10859 }
10860 #ifndef SERVER
10861 else if (action_id ==
EActions.WATCH_PLAYER)
10862 {
10863 PluginDeveloper.SetDeveloperItemClientEx(player);
10864 }
10865 #endif
10867 {
10868 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10869 {
10870 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10871 OnDebugButtonPressServer(id + 1);
10872 }
10873
10874 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10875 {
10876 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10878 }
10879
10880 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10881 {
10882 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10884 }
10885
10886 else if (action_id ==
EActions.ADD_QUANTITY)
10887 {
10888 if (IsMagazine())
10889 {
10890 Magazine mag = Magazine.Cast(this);
10891 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10892 }
10893 else
10894 {
10896 }
10897
10898 if (m_EM)
10899 {
10900 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10901 }
10902
10903 }
10904
10905 else if (action_id ==
EActions.REMOVE_QUANTITY)
10906 {
10907 if (IsMagazine())
10908 {
10909 Magazine mag2 = Magazine.Cast(this);
10910 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10911 }
10912 else
10913 {
10915 }
10916 if (m_EM)
10917 {
10918 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10919 }
10920
10921 }
10922
10923 else if (action_id ==
EActions.SET_QUANTITY_0)
10924 {
10926
10927 if (m_EM)
10928 {
10929 m_EM.SetEnergy(0);
10930 }
10931 }
10932
10933 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10934 {
10936
10937 if (m_EM)
10938 {
10939 m_EM.SetEnergy(m_EM.GetEnergyMax());
10940 }
10941 }
10942
10943 else if (action_id ==
EActions.ADD_HEALTH)
10944 {
10945 AddHealth("","",GetMaxHealth("","Health")/5);
10946 }
10947 else if (action_id ==
EActions.REMOVE_HEALTH)
10948 {
10949 AddHealth("","",-GetMaxHealth("","Health")/5);
10950 }
10951 else if (action_id ==
EActions.DESTROY_HEALTH)
10952 {
10953 SetHealth01("","",0);
10954 }
10955 else if (action_id ==
EActions.WATCH_ITEM)
10956 {
10958 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10959 #ifdef DEVELOPER
10960 SetDebugDeveloper_item(this);
10961 #endif
10962 }
10963
10964 else if (action_id ==
EActions.ADD_TEMPERATURE)
10965 {
10966 AddTemperature(20);
10967
10968 }
10969
10970 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10971 {
10972 AddTemperature(-20);
10973
10974 }
10975
10976 else if (action_id ==
EActions.FLIP_FROZEN)
10977 {
10978 SetFrozen(!GetIsFrozen());
10979
10980 }
10981
10982 else if (action_id ==
EActions.ADD_WETNESS)
10983 {
10985
10986 }
10987
10988 else if (action_id ==
EActions.REMOVE_WETNESS)
10989 {
10991
10992 }
10993
10994 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10995 {
10998
10999
11000 }
11001
11002 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
11003 {
11006 }
11007
11008 else if (action_id ==
EActions.MAKE_SPECIAL)
11009 {
11010 auto debugParams = DebugSpawnParams.WithPlayer(player);
11011 OnDebugSpawnEx(debugParams);
11012 }
11013
11014 }
11015
11016
11017 return false;
11018 }
11019
11020
11021
11022
11026
11029
11030
11031
11033 {
11034 return false;
11035 }
11036
11037
11039 {
11040 return true;
11041 }
11042
11043
11045 {
11046 return true;
11047 }
11048
11049
11050
11052 {
11053 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
11054 return g_Game.ConfigIsExisting(config_path);
11055 }
11056
11059 {
11060 return null;
11061 }
11062
11064 {
11065 return false;
11066 }
11067
11069 {
11070 return false;
11071 }
11072
11076
11077
11079 {
11080 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11081 return module_repairing.CanRepair(this, item_repair_kit);
11082 }
11083
11084
11085 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
11086 {
11087 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
11088 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11089 }
11090
11091
11093 {
11094
11095
11096
11097
11098
11099
11100
11101
11102 return 1;
11103 }
11104
11105
11106
11108 {
11110 }
11111
11112
11113
11115 {
11117 }
11118
11119
11128 {
11129 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11130
11131 if (player)
11132 {
11133 player.MessageStatus(text);
11134 }
11135 }
11136
11137
11146 {
11147 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11148
11149 if (player)
11150 {
11151 player.MessageAction(text);
11152 }
11153 }
11154
11155
11164 {
11165 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11166
11167 if (player)
11168 {
11169 player.MessageFriendly(text);
11170 }
11171 }
11172
11173
11182 {
11183 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11184
11185 if (player)
11186 {
11187 player.MessageImportant(text);
11188 }
11189 }
11190
11192 {
11193 return true;
11194 }
11195
11196
11197 override bool KindOf(
string tag)
11198 {
11199 bool found = false;
11200 string item_name = this.
GetType();
11202 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11203
11204 int array_size = item_tag_array.Count();
11205 for (int i = 0; i < array_size; i++)
11206 {
11207 if (item_tag_array.Get(i) == tag)
11208 {
11209 found = true;
11210 break;
11211 }
11212 }
11213 return found;
11214 }
11215
11216
11218 {
11219
11220 super.OnRPC(sender, rpc_type,ctx);
11221
11222
11223 switch (rpc_type)
11224 {
11225 #ifndef SERVER
11226 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11227 Param2<bool, string> p = new Param2<bool, string>(false, "");
11228
11230 return;
11231
11232 bool play = p.param1;
11233 string soundSet = p.param2;
11234
11235 if (play)
11236 {
11238 {
11240 {
11242 }
11243 }
11244 else
11245 {
11247 }
11248 }
11249 else
11250 {
11252 }
11253
11254 break;
11255 #endif
11256
11257 }
11258
11260 {
11262 }
11263 }
11264
11265
11266
11267
11269 {
11270 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11271 return plugin.GetID(
name);
11272 }
11273
11275 {
11276 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11277 return plugin.GetName(id);
11278 }
11279
11282 {
11283
11284
11285 int varFlags;
11286 if (!ctx.
Read(varFlags))
11287 return;
11288
11289 if (varFlags & ItemVariableFlags.FLOAT)
11290 {
11292 }
11293 }
11294
11296 {
11297
11298 super.SerializeNumericalVars(floats_out);
11299
11300
11301
11303 {
11305 }
11306
11308 {
11310 }
11311
11313 {
11315 }
11316
11318 {
11323 }
11324
11326 {
11328 }
11329 }
11330
11332 {
11333
11334 super.DeSerializeNumericalVars(floats);
11335
11336
11337 int index = 0;
11338 int mask = Math.Round(floats.Get(index));
11339
11340 index++;
11341
11343 {
11345 {
11347 }
11348 else
11349 {
11350 float quantity = floats.Get(index);
11351 SetQuantity(quantity,
true,
false,
false,
false);
11352 }
11353 index++;
11354 }
11355
11357 {
11358 float wet = floats.Get(index);
11360 index++;
11361 }
11362
11364 {
11365 int liquidtype = Math.Round(floats.Get(index));
11367 index++;
11368 }
11369
11371 {
11373 index++;
11375 index++;
11377 index++;
11379 index++;
11380 }
11381
11383 {
11384 int cleanness = Math.Round(floats.Get(index));
11386 index++;
11387 }
11388 }
11389
11391 {
11392 super.WriteVarsToCTX(ctx);
11393
11394
11396 {
11398 }
11399
11401 {
11403 }
11404
11406 {
11408 }
11409
11411 {
11412 int r,g,b,a;
11418 }
11419
11421 {
11423 }
11424 }
11425
11427 {
11428 if (!super.ReadVarsFromCTX(ctx,version))
11429 return false;
11430
11431 int intValue;
11432 float value;
11433
11434 if (version < 140)
11435 {
11436 if (!ctx.
Read(intValue))
11437 return false;
11438
11439 m_VariablesMask = intValue;
11440 }
11441
11443 {
11444 if (!ctx.
Read(value))
11445 return false;
11446
11448 {
11450 }
11451 else
11452 {
11454 }
11455 }
11456
11457 if (version < 140)
11458 {
11460 {
11461 if (!ctx.
Read(value))
11462 return false;
11463 SetTemperatureDirect(value);
11464 }
11465 }
11466
11468 {
11469 if (!ctx.
Read(value))
11470 return false;
11472 }
11473
11475 {
11476 if (!ctx.
Read(intValue))
11477 return false;
11479 }
11480
11482 {
11483 int r,g,b,a;
11485 return false;
11487 return false;
11489 return false;
11491 return false;
11492
11494 }
11495
11497 {
11498 if (!ctx.
Read(intValue))
11499 return false;
11501 }
11502
11503 if (version >= 138 && version < 140)
11504 {
11506 {
11507 if (!ctx.
Read(intValue))
11508 return false;
11509 SetFrozen(intValue);
11510 }
11511 }
11512
11513 return true;
11514 }
11515
11516
11518 {
11521 {
11523 }
11524
11525 if (!super.OnStoreLoad(ctx, version))
11526 {
11528 return false;
11529 }
11530
11531 if (version >= 114)
11532 {
11533 bool hasQuickBarIndexSaved;
11534
11535 if (!ctx.
Read(hasQuickBarIndexSaved))
11536 {
11538 return false;
11539 }
11540
11541 if (hasQuickBarIndexSaved)
11542 {
11543 int itmQBIndex;
11544
11545
11546 if (!ctx.
Read(itmQBIndex))
11547 {
11549 return false;
11550 }
11551
11552 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11553 if (itmQBIndex != -1 && parentPlayer)
11554 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11555 }
11556 }
11557 else
11558 {
11559
11560 PlayerBase player;
11561 int itemQBIndex;
11562 if (version ==
int.
MAX)
11563 {
11564 if (!ctx.
Read(itemQBIndex))
11565 {
11567 return false;
11568 }
11569 }
11570 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11571 {
11572
11573 if (!ctx.
Read(itemQBIndex))
11574 {
11576 return false;
11577 }
11578 if (itemQBIndex != -1 && player)
11579 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11580 }
11581 }
11582
11583 if (version < 140)
11584 {
11585
11586 if (!LoadVariables(ctx, version))
11587 {
11589 return false;
11590 }
11591 }
11592
11593
11595 {
11597 return false;
11598 }
11599 if (version >= 132)
11600 {
11602 if (raib)
11603 {
11605 {
11607 return false;
11608 }
11609 }
11610 }
11611
11613 return true;
11614 }
11615
11616
11617
11619 {
11620 super.OnStoreSave(ctx);
11621
11622 PlayerBase player;
11623 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11624 {
11626
11627 int itemQBIndex = -1;
11628 itemQBIndex = player.FindQuickBarEntityIndex(this);
11629 ctx.
Write(itemQBIndex);
11630 }
11631 else
11632 {
11634 }
11635
11637
11639 if (raib)
11640 {
11642 }
11643 }
11644
11645
11647 {
11648 super.AfterStoreLoad();
11649
11651 {
11653 }
11654
11656 {
11659 }
11660 }
11661
11663 {
11664 super.EEOnAfterLoad();
11665
11667 {
11669 }
11670
11673 }
11674
11676 {
11677 return false;
11678 }
11679
11680
11681
11683 {
11685 {
11686 #ifdef PLATFORM_CONSOLE
11687
11689 {
11691 if (menu)
11692 {
11694 }
11695 }
11696 #endif
11697 }
11698
11700 {
11703 }
11704
11706 {
11707 SetWeightDirty();
11709 }
11711 {
11714 }
11715
11717 {
11720
11723 }
11725 {
11729 }
11730
11731 super.OnVariablesSynchronized();
11732 }
11733
11734
11735
11737 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11738 {
11739 if (!IsServerCheck(allow_client))
11740 return false;
11741
11743 return false;
11744
11747
11748 if (value <= (min + 0.001))
11749 value = min;
11750
11751 if (value == min)
11752 {
11753 if (destroy_config)
11754 {
11755 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11756 if (dstr)
11757 {
11759 this.Delete();
11760 return true;
11761 }
11762 }
11763 else if (destroy_forced)
11764 {
11766 this.Delete();
11767 return true;
11768 }
11769
11771 }
11772
11775
11777 {
11778 EntityAI parent = GetHierarchyRoot();
11779 InventoryLocation iLoc = new InventoryLocation();
11780 GetInventory().GetCurrentInventoryLocation(iLoc);
11782 {
11783 int iLocSlot = iLoc.
GetSlot();
11785 {
11787 }
11789 {
11791 }
11792 }
11793 }
11794
11796 {
11798
11799 if (delta)
11801 }
11802
11804
11805 return false;
11806 }
11807
11808
11810 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11811 {
11813 }
11814
11816 {
11819 }
11820
11822 {
11825 }
11826
11828 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11829 {
11830 float value_clamped = Math.Clamp(value, 0, 1);
11832 SetQuantity(result, destroy_config, destroy_forced);
11833 }
11834
11835
11838 {
11840 }
11841
11843 {
11845 }
11846
11847
11848
11849
11850
11851
11852
11853
11854
11855
11857 {
11858 int slot = -1;
11859 GameInventory inventory = GetInventory();
11860 if (inventory)
11861 {
11862 InventoryLocation il = new InventoryLocation;
11865 }
11866
11868 }
11869
11871 {
11872 float quantity_max = 0;
11873
11875 {
11876 if (attSlotID != -1)
11877 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11878
11879 if (quantity_max <= 0)
11881 }
11882
11883 if (quantity_max <= 0)
11885
11886 return quantity_max;
11887 }
11888
11890 {
11892 }
11893
11895 {
11897 }
11898
11899
11901 {
11903 }
11904
11906 {
11908 }
11909
11911 {
11913 }
11914
11915
11917 {
11918
11919 float weightEx = GetWeightEx();
11920 float special = GetInventoryAndCargoWeight();
11921 return weightEx - special;
11922 }
11923
11924
11926 {
11928 }
11929
11931 {
11933 {
11934 #ifdef DEVELOPER
11935 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11936 {
11937 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11939 }
11940 #endif
11941
11942 return GetQuantity() * GetConfigWeightModified();
11943 }
11944 else if (HasEnergyManager())
11945 {
11946 #ifdef DEVELOPER
11947 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11948 {
11949 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11950 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11951 }
11952 #endif
11953 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11954 }
11955 else
11956 {
11957 #ifdef DEVELOPER
11958 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11959 {
11960 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11961 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11962 }
11963 #endif
11964 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11965 }
11966 }
11967
11970 {
11971 int item_count = 0;
11973
11974 GameInventory inventory = GetInventory();
11975 CargoBase cargo = inventory.
GetCargo();
11976 if (cargo != NULL)
11977 {
11979 }
11980
11982 for (int i = 0; i < nAttachments; ++i)
11983 {
11985 if (item)
11986 item_count += item.GetNumberOfItems();
11987 }
11988 return item_count;
11989 }
11990
11993 {
11994 float weight = 0;
11995 float wetness = 1;
11996 if (include_wetness)
11999 {
12000 weight = wetness * m_ConfigWeight;
12001 }
12003 {
12004 weight = 1;
12005 }
12006 return weight;
12007 }
12008
12009
12010
12012 {
12013 GameInventory inventory = GetInventory();
12014 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
12015 {
12016 array<EntityAI> items = new array<EntityAI>;
12018 for (int i = 0; i < items.Count(); ++i)
12019 {
12021 if (item)
12022 {
12023 g_Game.ObjectDelete(item);
12024 }
12025 }
12026 }
12027 }
12028
12029
12030
12031
12033 {
12034 float energy = 0;
12035 if (HasEnergyManager())
12036 {
12037 energy = GetCompEM().GetEnergy();
12038 }
12039 return energy;
12040 }
12041
12042
12044 {
12045 super.OnEnergyConsumed();
12046
12048 }
12049
12051 {
12052 super.OnEnergyAdded();
12053
12055 }
12056
12057
12059 {
12060 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12061 {
12063 {
12064 float energy_0to1 = GetCompEM().GetEnergy0To1();
12066 }
12067 }
12068 }
12069
12070
12072 {
12073 return ConfigGetFloat("heatIsolation");
12074 }
12075
12077 {
12079 }
12080
12082 {
12083 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
12084 if (
g_Game.ConfigIsExisting(paramPath))
12085 return g_Game.ConfigGetFloat(paramPath);
12086
12087 return 0.0;
12088 }
12089
12091 {
12092 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12093 if (
g_Game.ConfigIsExisting(paramPath))
12094 return g_Game.ConfigGetFloat(paramPath);
12095
12096 return 0.0;
12097 }
12098
12099 override void SetWet(
float value,
bool allow_client =
false)
12100 {
12101 if (!IsServerCheck(allow_client))
12102 return;
12103
12106
12108
12109 m_VarWet = Math.Clamp(value, min, max);
12110
12112 {
12115 }
12116 }
12117
12118 override void AddWet(
float value)
12119 {
12121 }
12122
12124 {
12126 }
12127
12129 {
12131 }
12132
12134 {
12136 }
12137
12139 {
12141 }
12142
12144 {
12146 }
12147
12148 override void OnWetChanged(
float newVal,
float oldVal)
12149 {
12152 if (newLevel != oldLevel)
12153 {
12155 }
12156 }
12157
12159 {
12160 SetWeightDirty();
12161 }
12162
12164 {
12165 return GetWetLevelInternal(
m_VarWet);
12166 }
12167
12168
12169
12171 {
12173 }
12174
12176 {
12178 }
12179
12181 {
12183 }
12184
12186 {
12188 }
12189
12190
12191
12193 {
12194 if (ConfigIsExisting("itemModelLength"))
12195 {
12196 return ConfigGetFloat("itemModelLength");
12197 }
12198 return 0;
12199 }
12200
12202 {
12203 if (ConfigIsExisting("itemAttachOffset"))
12204 {
12205 return ConfigGetFloat("itemAttachOffset");
12206 }
12207 return 0;
12208 }
12209
12210 override void SetCleanness(
int value,
bool allow_client =
false)
12211 {
12212 if (!IsServerCheck(allow_client))
12213 return;
12214
12216
12218
12221 }
12222
12224 {
12226 }
12227
12229 {
12230 return true;
12231 }
12232
12233
12234
12235
12237 {
12239 }
12240
12242 {
12244 }
12245
12246
12247
12248
12249 override void SetColor(
int r,
int g,
int b,
int a)
12250 {
12256 }
12258 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12259 {
12264 }
12265
12267 {
12269 }
12270
12273 {
12274 int r,g,b,a;
12276 r = r/255;
12277 g = g/255;
12278 b = b/255;
12279 a = a/255;
12280 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12281 }
12282
12283
12284
12285 override void SetLiquidType(
int value,
bool allow_client =
false)
12286 {
12287 if (!IsServerCheck(allow_client))
12288 return;
12289
12294 }
12295
12297 {
12298 return ConfigGetInt("varLiquidTypeInit");
12299 }
12300
12302 {
12304 }
12305
12307 {
12309 SetFrozen(false);
12310 }
12311
12314 {
12315 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12316 }
12317
12318
12321 {
12322 PlayerBase nplayer;
12323 if (PlayerBase.CastTo(nplayer, player))
12324 {
12326 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12327 }
12328 }
12329
12330
12333 {
12334 PlayerBase nplayer;
12335 if (PlayerBase.CastTo(nplayer,player))
12336 {
12337 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12338 }
12339
12340 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12341
12342 if (HasEnergyManager())
12343 {
12344 GetCompEM().UpdatePlugState();
12345 }
12346 }
12347
12348
12350 {
12351 super.OnPlacementStarted(player);
12352
12354 }
12355
12356 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12357 {
12359 {
12360 m_AdminLog.OnPlacementComplete(player,
this);
12361 }
12362
12363 super.OnPlacementComplete(player, position, orientation);
12364 }
12365
12366
12367
12368
12369
12371 {
12373 {
12374 return true;
12375 }
12376 else
12377 {
12378 return false;
12379 }
12380 }
12381
12382
12384 {
12386 {
12388 }
12389 }
12390
12391
12393 {
12395 }
12396
12398 {
12400 }
12401
12402 override void InsertAgent(
int agent,
float count = 1)
12403 {
12404 if (count < 1)
12405 return;
12406
12408 }
12409
12412 {
12414 }
12415
12416
12418 {
12420 }
12421
12422
12423
12424
12425
12426
12427
12428
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12450
12451
12452
12453
12454
12455
12456
12457
12458
12459
12460
12461
12462
12464 {
12466 return false;
12467 return true;
12468 }
12469
12471 {
12472
12474 }
12475
12476
12479 {
12480 super.CheckForRoofLimited(timeTresholdMS);
12481
12482 float time =
g_Game.GetTime();
12483 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12484 {
12485 m_PreviousRoofTestTime = time;
12486 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12487 }
12488 }
12489
12490
12492 {
12494 {
12495 return 0;
12496 }
12497
12498 if (GetInventory().GetAttachmentSlotsCount() != 0)
12499 {
12500 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12501 if (filter)
12502 return filter.GetProtectionLevel(type, false, system);
12503 else
12504 return 0;
12505 }
12506
12507 string subclassPath, entryName;
12508
12509 switch (type)
12510 {
12512 entryName = "biological";
12513 break;
12515 entryName = "chemical";
12516 break;
12517 default:
12518 entryName = "biological";
12519 break;
12520 }
12521
12522 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12523
12524 return g_Game.ConfigGetFloat(subclassPath + entryName);
12525 }
12526
12527
12528
12531 {
12532 if (!IsMagazine())
12534
12536 }
12537
12538
12539
12540
12541
12546 {
12547 return true;
12548 }
12549
12551 {
12553 }
12554
12555
12556
12557
12558
12560 {
12561 if (parent)
12562 {
12563 if (parent.IsInherited(DayZInfected))
12564 return true;
12565
12566 if (!parent.IsRuined())
12567 return true;
12568 }
12569
12570 return true;
12571 }
12572
12574 {
12575 if (!super.CanPutAsAttachment(parent))
12576 {
12577 return false;
12578 }
12579
12580 if (!IsRuined() && !parent.IsRuined())
12581 {
12582 return true;
12583 }
12584
12585 return false;
12586 }
12587
12589 {
12590
12591
12592
12593
12594 return super.CanReceiveItemIntoCargo(item);
12595 }
12596
12598 {
12599
12600
12601
12602
12603 GameInventory attachmentInv = attachment.GetInventory();
12605 {
12606 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12607 return false;
12608 }
12609
12610 InventoryLocation loc = new InventoryLocation();
12611 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12612 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12613 return false;
12614
12615 return super.CanReceiveAttachment(attachment, slotId);
12616 }
12617
12619 {
12620 if (!super.CanReleaseAttachment(attachment))
12621 return false;
12622
12623 return GetInventory().AreChildrenAccessible();
12624 }
12625
12626
12627
12628
12629
12630
12631
12632
12633
12634
12635
12636
12637
12638
12639
12640
12641
12642
12643
12644
12645
12647 {
12648 int id = muzzle_owner.GetMuzzleID();
12649 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12650
12651 if (WPOF_array)
12652 {
12653 for (int i = 0; i < WPOF_array.Count(); i++)
12654 {
12655 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12656
12657 if (WPOF)
12658 {
12659 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12660 }
12661 }
12662 }
12663 }
12664
12665
12667 {
12668 int id = muzzle_owner.GetMuzzleID();
12670
12671 if (WPOBE_array)
12672 {
12673 for (int i = 0; i < WPOBE_array.Count(); i++)
12674 {
12675 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12676
12677 if (WPOBE)
12678 {
12679 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12680 }
12681 }
12682 }
12683 }
12684
12685
12687 {
12688 int id = muzzle_owner.GetMuzzleID();
12689 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12690
12691 if (WPOOH_array)
12692 {
12693 for (int i = 0; i < WPOOH_array.Count(); i++)
12694 {
12695 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12696
12697 if (WPOOH)
12698 {
12699 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12700 }
12701 }
12702 }
12703 }
12704
12705
12707 {
12708 int id = muzzle_owner.GetMuzzleID();
12709 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12710
12711 if (WPOOH_array)
12712 {
12713 for (int i = 0; i < WPOOH_array.Count(); i++)
12714 {
12715 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12716
12717 if (WPOOH)
12718 {
12719 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12720 }
12721 }
12722 }
12723 }
12724
12725
12727 {
12728 int id = muzzle_owner.GetMuzzleID();
12729 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12730
12731 if (WPOOH_array)
12732 {
12733 for (int i = 0; i < WPOOH_array.Count(); i++)
12734 {
12735 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12736
12737 if (WPOOH)
12738 {
12739 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12740 }
12741 }
12742 }
12743 }
12744
12745
12746
12748 {
12750 {
12751 return true;
12752 }
12753
12754 return false;
12755 }
12756
12758 {
12760 {
12761 return true;
12762 }
12763
12764 return false;
12765 }
12766
12768 {
12770 {
12771 return true;
12772 }
12773
12774 return false;
12775 }
12776
12778 {
12779 return false;
12780 }
12781
12784 {
12785 return UATimeSpent.DEFAULT_DEPLOY;
12786 }
12787
12788
12789
12790
12792 {
12794 SetSynchDirty();
12795 }
12796
12798 {
12800 }
12801
12802
12804 {
12805 return false;
12806 }
12807
12810 {
12811 string att_type = "None";
12812
12813 if (ConfigIsExisting("soundAttType"))
12814 {
12815 att_type = ConfigGetString("soundAttType");
12816 }
12817
12819 }
12820
12822 {
12824 }
12825
12826
12827
12828
12829
12835
12837 {
12840
12842 }
12843
12844
12846 {
12848 return;
12849
12851
12854
12857
12858 SoundParameters params = new SoundParameters();
12862 }
12863
12864
12866 {
12868 {
12871
12872 SetSynchDirty();
12873
12876 }
12877 }
12878
12880 {
12882 }
12883
12884
12886 {
12888 return;
12889
12891 SetSynchDirty();
12892
12895 }
12896
12898 {
12901 }
12902
12904 {
12906 }
12907
12908 void OnApply(PlayerBase player);
12909
12911 {
12912 return 1.0;
12913 };
12914
12916 {
12918 }
12919
12921 {
12923 }
12924
12926
12928 {
12929 SetDynamicPhysicsLifeTime(0.01);
12931 }
12932
12934 {
12935 array<string> zone_names = new array<string>;
12936 GetDamageZones(zone_names);
12937 for (int i = 0; i < zone_names.Count(); i++)
12938 {
12939 SetHealthMax(zone_names.Get(i),"Health");
12940 }
12941 SetHealthMax("","Health");
12942 }
12943
12946 {
12947 float global_health = GetHealth01("","Health");
12948 array<string> zones = new array<string>;
12949 GetDamageZones(zones);
12950
12951 for (int i = 0; i < zones.Count(); i++)
12952 {
12953 SetHealth01(zones.Get(i),"Health",global_health);
12954 }
12955 }
12956
12959 {
12960 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12961 }
12962
12964 {
12965 if (!hasRootAsPlayer)
12966 {
12967 if (refParentIB)
12968 {
12969
12970 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12971 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12972
12973 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12974 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12975
12978 }
12979 else
12980 {
12981
12984 }
12985 }
12986 }
12987
12989 {
12991 {
12992 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12993 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12994 {
12995 float heatPermCoef = 1.0;
12997 while (ent)
12998 {
12999 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13000 ent = ent.GetHierarchyParent();
13001 }
13002
13003 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13004 }
13005 }
13006 }
13007
13009 {
13010
13011 EntityAI parent = GetHierarchyParent();
13012 if (!parent)
13013 {
13014 hasParent = false;
13015 hasRootAsPlayer = false;
13016 }
13017 else
13018 {
13019 hasParent = true;
13020 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13021 refParentIB =
ItemBase.Cast(parent);
13022 }
13023 }
13024
13025 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
13026 {
13027
13028 }
13029
13031 {
13032
13033 return false;
13034 }
13035
13037 {
13038
13039
13040 return false;
13041 }
13042
13044 {
13045
13046 return false;
13047 }
13048
13051 {
13052 return !GetIsFrozen() &&
IsOpen();
13053 }
13054
13056 {
13057 bool hasParent = false, hasRootAsPlayer = false;
13059
13060 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
13061 bool foodDecay =
g_Game.IsFoodDecayEnabled();
13062
13063 if (wwtu || foodDecay)
13064 {
13068
13069 if (processWetness || processTemperature || processDecay)
13070 {
13072
13073 if (processWetness)
13074 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13075
13076 if (processTemperature)
13078
13079 if (processDecay)
13080 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13081 }
13082 }
13083 }
13084
13087 {
13089 }
13090
13092 {
13095
13096 return super.GetTemperatureFreezeThreshold();
13097 }
13098
13100 {
13103
13104 return super.GetTemperatureThawThreshold();
13105 }
13106
13108 {
13111
13112 return super.GetItemOverheatThreshold();
13113 }
13114
13116 {
13118 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13119
13120 return super.GetTemperatureFreezeTime();
13121 }
13122
13124 {
13126 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13127
13128 return super.GetTemperatureThawTime();
13129 }
13130
13135
13137 {
13138 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13139 }
13140
13142 {
13143 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13144 }
13145
13148 {
13150 }
13151
13153 {
13155 }
13156
13158 {
13160 }
13161
13164 {
13165 return null;
13166 }
13167
13170 {
13171 return false;
13172 }
13173
13175 {
13177 {
13180 if (!trg)
13181 {
13183 explosive = this;
13184 }
13185
13186 explosive.PairRemote(trg);
13188
13189 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13190 trg.SetPersistentPairID(persistentID);
13191 explosive.SetPersistentPairID(persistentID);
13192
13193 return true;
13194 }
13195 return false;
13196 }
13197
13200 {
13201 float ret = 1.0;
13204 ret *= GetHealth01();
13205
13206 return ret;
13207 }
13208
13209 #ifdef DEVELOPER
13210 override void SetDebugItem()
13211 {
13212 super.SetDebugItem();
13213 _itemBase = this;
13214 }
13215
13217 {
13218 string text = super.GetDebugText();
13219
13221 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13222
13223 return text;
13224 }
13225 #endif
13226
13228 {
13229 return true;
13230 }
13231
13233
13235
13237 {
13240 }
13241
13242
13250
13266
13267 [
Obsolete(
"Use ItemSoundHandler instead")]
13270 {
13271 if (!
g_Game.IsDedicatedServer())
13272 {
13273 if (ConfigIsExisting("attachSoundSet"))
13274 {
13275 string cfg_path = "";
13276 string soundset = "";
13277 string type_name =
GetType();
13278
13281 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13282 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13283
13284 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13285 {
13286 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13287 {
13288 if (cfg_slot_array[i] == slot_type)
13289 {
13290 soundset = cfg_soundset_array[i];
13291 break;
13292 }
13293 }
13294 }
13295
13296 if (soundset != "")
13297 {
13298 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13300 }
13301 }
13302 }
13303 }
13304
13306}
13307
13309{
13311 if (entity)
13312 {
13313 bool is_item = entity.IsInherited(
ItemBase);
13314 if (is_item && full_quantity)
13315 {
13318 }
13319 }
13320 else
13321 {
13323 return NULL;
13324 }
13325 return entity;
13326}
13327
13329{
13330 if (item)
13331 {
13332 if (health > 0)
13333 item.SetHealth("", "", health);
13334
13335 if (item.CanHaveTemperature())
13336 {
13338 if (item.CanFreeze())
13339 item.SetFrozen(false);
13340 }
13341
13342 if (item.HasEnergyManager())
13343 {
13344 if (quantity >= 0)
13345 {
13346 item.GetCompEM().SetEnergy0To1(quantity);
13347 }
13348 else
13349 {
13351 }
13352 }
13353 else if (item.IsMagazine())
13354 {
13355 Magazine mag = Magazine.Cast(item);
13356 if (quantity >= 0)
13357 {
13358 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13359 }
13360 else
13361 {
13363 }
13364
13365 }
13366 else
13367 {
13368 if (quantity >= 0)
13369 {
13370 item.SetQuantityNormalized(quantity, false);
13371 }
13372 else
13373 {
13375 }
13376
13377 }
13378 }
13379}
13380
13381#ifdef DEVELOPER
13383#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.