8211{
8213 {
8214 return true;
8215 }
8216};
8217
8218
8219
8221{
8225
8227
8230
8231
8232
8233
8234
8243
8249
8254
8259
8280 protected bool m_IsResultOfSplit
8281
8283
8288
8289
8290
8292
8296
8297
8298
8300
8303
8304
8305
8311
8312
8320
8323
8324
8326
8327
8329
8330
8335
8336
8341
8342
8344
8345
8347 {
8352
8353 if (!
GetGame().IsDedicatedServer())
8354 {
8356 {
8358
8360 {
8362 }
8363 }
8364
8367 }
8368
8369 m_OldLocation = null;
8370
8372 {
8374 }
8375
8376 if (ConfigIsExisting("headSelectionsToHide"))
8377 {
8380 }
8381
8383 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8384 {
8386 }
8387
8389
8390 m_IsResultOfSplit = false;
8391
8393 }
8394
8396 {
8397 super.InitItemVariables();
8398
8404 m_Count = ConfigGetInt(
"count");
8405
8408
8413
8416
8421
8433
8437
8438
8441 if (ConfigIsExisting("canBeSplit"))
8442 {
8445 }
8446
8448 if (ConfigIsExisting("itemBehaviour"))
8450
8451
8454 RegisterNetSyncVariableInt("m_VarLiquidType");
8455 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8456
8457 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8458 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8459 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8460
8461 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8462 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8463 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8464 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8465
8466 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8467 RegisterNetSyncVariableBool("m_IsTakeable");
8468 RegisterNetSyncVariableBool("m_IsHologram");
8469
8472 {
8475 }
8476
8478
8480 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8482
8483 }
8484
8486 {
8488 }
8489
8491 {
8494 {
8499 }
8500 }
8501
8502 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8503 {
8505 {
8508 }
8509
8511 }
8512
8514 {
8520 }
8521
8523
8525 {
8527
8528 if (!action)
8529 {
8530 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8531 return;
8532 }
8533
8535 if (!ai)
8536 {
8538 return;
8539 }
8540
8542 if (!action_array)
8543 {
8544 action_array = new array<ActionBase_Basic>;
8546 }
8547 if (LogManager.IsActionLogEnable())
8548 {
8549 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8550 }
8551
8552 if (action_array.Find(action) != -1)
8553 {
8554 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8555 }
8556 else
8557 {
8558 action_array.Insert(action);
8559 }
8560 }
8561
8563 {
8565 ActionBase action = player.GetActionManager().GetAction(actionName);
8568
8569 if (action_array)
8570 {
8571 action_array.RemoveItem(action);
8572 }
8573 }
8574
8575
8576
8578 {
8579 ActionOverrideData overrideData = new ActionOverrideData();
8583
8585 if (!actionMap)
8586 {
8589 }
8590
8591 actionMap.Insert(this.
Type(), overrideData);
8592
8593 }
8594
8596
8598
8599
8601 {
8604
8607
8608 string config_to_search = "CfgVehicles";
8609 string muzzle_owner_config;
8610
8612 {
8613 if (IsInherited(Weapon))
8614 config_to_search = "CfgWeapons";
8615
8616 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8617
8618 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8619
8621
8622 if (config_OnFire_subclass_count > 0)
8623 {
8624 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8625
8626 for (int i = 0; i < config_OnFire_subclass_count; i++)
8627 {
8628 string particle_class = "";
8630 string config_OnFire_entry = config_OnFire_class + particle_class;
8631 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8632 WPOF_array.Insert(WPOF);
8633 }
8634
8635
8637 }
8638 }
8639
8641 {
8642 config_to_search = "CfgWeapons";
8643 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8644
8645 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8646
8648
8649 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8650 {
8651 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8652
8653 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8654 {
8655 string particle_class2 = "";
8657 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8658 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8659 WPOBE_array.Insert(WPOBE);
8660 }
8661
8662
8664 }
8665 }
8666 }
8667
8668
8670 {
8673
8675 {
8676 string config_to_search = "CfgVehicles";
8677
8678 if (IsInherited(Weapon))
8679 config_to_search = "CfgWeapons";
8680
8681 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8682 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8683
8684 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8685 {
8686
8688
8690 {
8692 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8694 return;
8695 }
8696
8699
8700
8701
8703 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8704
8705 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8706 {
8707 string particle_class = "";
8709 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8711
8712 if (entry_type == CT_CLASS)
8713 {
8714 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8715 WPOOH_array.Insert(WPOF);
8716 }
8717 }
8718
8719
8721 }
8722 }
8723 }
8724
8726 {
8728 }
8729
8731 {
8733 {
8735
8738
8741
8742 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8743 }
8744 }
8745
8747 {
8749 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8750
8752 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8753
8755 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8756
8758 {
8760 }
8761 }
8762
8764 {
8766 }
8767
8769 {
8772 else
8774
8776 {
8779 }
8780 else
8781 {
8784
8787 }
8788
8790 }
8791
8793 {
8795 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8796 }
8797
8799 {
8801 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8803 }
8804
8806 {
8808 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8809 }
8810
8812 {
8815
8816 OverheatingParticle OP = new OverheatingParticle();
8821
8823 }
8824
8826 {
8829
8830 return -1;
8831 }
8832
8834 {
8836 {
8839
8840 for (int i = count; i > 0; --i)
8841 {
8842 int id = i - 1;
8845
8848
8849 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8850 {
8851 if (p)
8852 {
8855 }
8856 }
8857 }
8858 }
8859 }
8860
8862 {
8864 {
8866 {
8867 int id = i - 1;
8869
8870 if (OP)
8871 {
8873
8874 if (p)
8875 {
8877 }
8878
8879 delete OP;
8880 }
8881 }
8882
8885 }
8886 }
8887
8890 {
8891 return 0.0;
8892 }
8893
8894
8896 {
8897 return 250;
8898 }
8899
8901 {
8902 return 0;
8903 }
8904
8907 {
8909 return true;
8910
8911 return false;
8912 }
8913
8916 {
8919
8921 {
8923 }
8924 else
8925 {
8926
8928 }
8929
8931 }
8932
8939 {
8940 return -1;
8941 }
8942
8943
8944
8945
8947 {
8949 {
8951 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8952
8953 if (r_index >= 0)
8954 {
8955 InventoryLocation r_il = new InventoryLocation;
8956 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8957
8958 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8961 {
8962 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8963 }
8965 {
8966 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8967 }
8968
8969 }
8970
8971 player.GetHumanInventory().ClearUserReservedLocation(this);
8972 }
8973
8976 }
8977
8978
8979
8980
8982 {
8983 return ItemBase.m_DebugActionsMask;
8984 }
8985
8987 {
8988 return ItemBase.m_DebugActionsMask & mask;
8989 }
8990
8992 {
8993 ItemBase.m_DebugActionsMask = mask;
8994 }
8995
8997 {
8998 ItemBase.m_DebugActionsMask |= mask;
8999 }
9000
9002 {
9003 ItemBase.m_DebugActionsMask &= ~mask;
9004 }
9005
9007 {
9009 {
9011 }
9012 else
9013 {
9015 }
9016 }
9017
9018
9020 {
9021 if (GetEconomyProfile())
9022 {
9023 float q_max = GetEconomyProfile().GetQuantityMax();
9024 if (q_max > 0)
9025 {
9026 float q_min = GetEconomyProfile().GetQuantityMin();
9027 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9028
9030 {
9031 ComponentEnergyManager comp = GetCompEM();
9033 {
9035 }
9036 }
9038 {
9040
9041 }
9042
9043 }
9044 }
9045 }
9046
9049 {
9050 EntityAI parent = GetHierarchyParent();
9051
9052 if (parent)
9053 {
9054 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9055 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9056 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9057 }
9058 }
9059
9062 {
9063 EntityAI parent = GetHierarchyParent();
9064
9065 if (parent)
9066 {
9067 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9068 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9069 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9070 }
9071 }
9072
9074 {
9075
9076
9077
9078
9080
9082 {
9083 if (ScriptInputUserData.CanStoreInputUserData())
9084 {
9085 ScriptInputUserData ctx = new ScriptInputUserData;
9091 ctx.
Write(use_stack_max);
9094
9096 {
9097 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9098 }
9099 }
9100 }
9101 else if (!
GetGame().IsMultiplayer())
9102 {
9104 }
9105 }
9106
9108 {
9110 }
9111
9113 {
9115 }
9116
9118 {
9120 }
9121
9123 {
9124
9125 return false;
9126 }
9127
9129 {
9130 return false;
9131 }
9132
9136 {
9137 return false;
9138 }
9139
9141 {
9142 return "";
9143 }
9144
9146
9148 {
9149 return false;
9150 }
9151
9153 {
9154 return true;
9155 }
9156
9157
9158
9160 {
9161 return true;
9162 }
9163
9165 {
9166 return true;
9167 }
9168
9170 {
9171 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9173 }
9174
9176 {
9178 }
9179
9181 {
9183 if (!is_being_placed)
9185 SetSynchDirty();
9186 }
9187
9188
9190
9192 {
9194 }
9195
9197 {
9199 }
9200
9202 {
9203 return 1;
9204 }
9205
9207 {
9208 return false;
9209 }
9210
9212 {
9214 SetSynchDirty();
9215 }
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9252 {
9253 super.OnMovedInsideCargo(container);
9254
9255 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9256 }
9257
9258 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9259 {
9260 super.EEItemLocationChanged(oldLoc,newLoc);
9261
9262 PlayerBase new_player = null;
9263 PlayerBase old_player = null;
9264
9265 if (newLoc.GetParent())
9266 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9267
9268 if (oldLoc.GetParent())
9269 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9270
9272 {
9273 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9274
9275 if (r_index >= 0)
9276 {
9277 InventoryLocation r_il = new InventoryLocation;
9278 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9279
9280 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9283 {
9284 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9285 }
9287 {
9288 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9289 }
9290
9291 }
9292 }
9293
9295 {
9296 if (new_player)
9297 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9298
9299 if (new_player == old_player)
9300 {
9301
9302 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9303 {
9305 {
9306 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9307 {
9308 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9309 }
9310 }
9311 else
9312 {
9313 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9314 }
9315 }
9316
9317 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9318 {
9319 int type = oldLoc.GetType();
9321 {
9322 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9323 }
9325 {
9326 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9327 }
9328 }
9329 if (!m_OldLocation)
9330 {
9331 m_OldLocation = new InventoryLocation;
9332 }
9333 m_OldLocation.Copy(oldLoc);
9334 }
9335 else
9336 {
9337 if (m_OldLocation)
9338 {
9339 m_OldLocation.Reset();
9340 }
9341 }
9342
9344 }
9345 else
9346 {
9347 if (new_player)
9348 {
9349 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9350 if (res_index >= 0)
9351 {
9352 InventoryLocation il = new InventoryLocation;
9353 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9355 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9358 {
9359 il.
GetParent().GetOnReleaseLock().Invoke(it);
9360 }
9362 {
9364 }
9365
9366 }
9367 }
9369 {
9370
9372 }
9373
9374 if (m_OldLocation)
9375 {
9376 m_OldLocation.Reset();
9377 }
9378 }
9379 }
9380
9381 override void EOnContact(IEntity other, Contact extra)
9382 {
9384 {
9385 int liquidType = -1;
9387 if (impactSpeed > 0.0)
9388 {
9390 #ifndef SERVER
9392 #else
9394 SetSynchDirty();
9395 #endif
9397 }
9398 }
9399
9400 #ifdef SERVER
9401 if (GetCompEM() && GetCompEM().IsPlugged())
9402 {
9403 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9404 GetCompEM().UnplugThis();
9405 }
9406 #endif
9407 }
9408
9410
9412 {
9414 }
9415
9417 {
9418
9419 }
9420
9422 {
9423 super.OnItemLocationChanged(old_owner, new_owner);
9424
9425 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9426 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9427
9428 if (!relatedPlayer && playerNew)
9429 relatedPlayer = playerNew;
9430
9431 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9432 {
9434 if (actionMgr)
9435 {
9436 ActionBase currentAction = actionMgr.GetRunningAction();
9437 if (currentAction)
9439 }
9440 }
9441
9442 Man ownerPlayerOld = null;
9443 Man ownerPlayerNew = null;
9444
9445 if (old_owner)
9446 {
9447 if (old_owner.
IsMan())
9448 {
9449 ownerPlayerOld = Man.Cast(old_owner);
9450 }
9451 else
9452 {
9453 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9454 }
9455 }
9456 else
9457 {
9459 {
9461
9462 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9463 {
9464 GetCompEM().UnplugThis();
9465 }
9466 }
9467 }
9468
9469 if (new_owner)
9470 {
9471 if (new_owner.
IsMan())
9472 {
9473 ownerPlayerNew = Man.Cast(new_owner);
9474 }
9475 else
9476 {
9477 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9478 }
9479 }
9480
9481 if (ownerPlayerOld != ownerPlayerNew)
9482 {
9483 if (ownerPlayerOld)
9484 {
9485 array<EntityAI> subItemsExit = new array<EntityAI>;
9487 for (int i = 0; i < subItemsExit.Count(); i++)
9488 {
9491 }
9492 }
9493
9494 if (ownerPlayerNew)
9495 {
9496 array<EntityAI> subItemsEnter = new array<EntityAI>;
9498 for (int j = 0; j < subItemsEnter.Count(); j++)
9499 {
9502 }
9503 }
9504 }
9505 else if (ownerPlayerNew != null)
9506 {
9507 PlayerBase nplayer;
9508 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9509 {
9510 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9512 for (int k = 0; k < subItemsUpdate.Count(); k++)
9513 {
9515 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9516 }
9517 }
9518 }
9519
9520 if (old_owner)
9521 old_owner.OnChildItemRemoved(this);
9522 if (new_owner)
9523 new_owner.OnChildItemReceived(this);
9524 }
9525
9526
9528 {
9529 super.EEDelete(parent);
9530 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9531 if (player)
9532 {
9534
9535 if (player.IsAlive())
9536 {
9537 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9538 if (r_index >= 0)
9539 {
9540 InventoryLocation r_il = new InventoryLocation;
9541 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9542
9543 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9546 {
9547 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9548 }
9550 {
9551 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9552 }
9553
9554 }
9555
9556 player.RemoveQuickBarEntityShortcut(this);
9557 }
9558 }
9559 }
9560
9562 {
9563 super.EEKilled(killer);
9564
9567 {
9568 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9569 {
9570 if (IsMagazine())
9571 {
9572 if (Magazine.Cast(this).GetAmmoCount() > 0)
9573 {
9575 }
9576 }
9577 else
9578 {
9580 }
9581 }
9582 }
9583 }
9584
9586 {
9587 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9588
9589 super.OnWasAttached(parent, slot_id);
9590
9593
9595 }
9596
9598 {
9599 super.OnWasDetached(parent, slot_id);
9600
9603 }
9604
9606 {
9607 int idx;
9610
9611 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9612 if (inventory_slots.Count() < 1)
9613 {
9614 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9615 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9616 }
9617 else
9618 {
9619 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9620 }
9621
9622 idx = inventory_slots.Find(slot);
9623 if (idx < 0)
9624 return "";
9625
9626 return attach_types.Get(idx);
9627 }
9628
9630 {
9631 int idx = -1;
9632 string slot;
9633
9636
9637 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9638 if (inventory_slots.Count() < 1)
9639 {
9640 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9641 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9642 }
9643 else
9644 {
9645 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9646 if (detach_types.Count() < 1)
9647 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9648 }
9649
9650 for (int i = 0; i < inventory_slots.Count(); i++)
9651 {
9652 slot = inventory_slots.Get(i);
9653 }
9654
9655 if (slot != "")
9656 {
9657 if (detach_types.Count() == 1)
9658 idx = 0;
9659 else
9660 idx = inventory_slots.Find(slot);
9661 }
9662 if (idx < 0)
9663 return "";
9664
9665 return detach_types.Get(idx);
9666 }
9667
9669 {
9670
9672
9673
9674 float min_time = 1;
9675 float max_time = 3;
9676 float delay = Math.RandomFloat(min_time, max_time);
9677
9678 explode_timer.Run(delay, this, "DoAmmoExplosion");
9679 }
9680
9682 {
9683 Magazine magazine = Magazine.Cast(this);
9684 int pop_sounds_count = 6;
9685 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9686
9687
9688 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9689 string sound_name = pop_sounds[ sound_idx ];
9691
9692
9693 magazine.ServerAddAmmoCount(-1);
9694
9695
9696 float min_temp_to_explode = 100;
9697
9698 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9699 {
9701 }
9702 }
9703
9704
9705 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9706 {
9707 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9708
9709 const int CHANCE_DAMAGE_CARGO = 4;
9710 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9711 const int CHANCE_DAMAGE_NOTHING = 2;
9712
9714 {
9715 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9716 int chances;
9717 int rnd;
9718
9719 if (GetInventory().GetCargo())
9720 {
9721 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9722 rnd = Math.RandomInt(0,chances);
9723
9724 if (rnd < CHANCE_DAMAGE_CARGO)
9725 {
9727 }
9728 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9729 {
9731 }
9732 }
9733 else
9734 {
9735 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9736 rnd = Math.RandomInt(0,chances);
9737
9738 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9739 {
9741 }
9742 }
9743 }
9744 }
9745
9747 {
9748 if (GetInventory().GetCargo())
9749 {
9750 int item_count = GetInventory().GetCargo().GetItemCount();
9751 if (item_count > 0)
9752 {
9753 int random_pick = Math.RandomInt(0, item_count);
9755 if (!item.IsExplosive())
9756 {
9757 item.AddHealth("","",damage);
9758 return true;
9759 }
9760 }
9761 }
9762 return false;
9763 }
9764
9766 {
9767 int attachment_count = GetInventory().AttachmentCount();
9768 if (attachment_count > 0)
9769 {
9770 int random_pick = Math.RandomInt(0, attachment_count);
9771 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9772 if (!attachment.IsExplosive())
9773 {
9774 attachment.AddHealth("","",damage);
9775 return true;
9776 }
9777 }
9778 return false;
9779 }
9780
9782 {
9784 }
9785
9787 {
9789 return GetInventory().CanRemoveEntity();
9790
9791 return false;
9792 }
9793
9795 {
9796
9798 return false;
9799
9800
9802 return false;
9803
9804
9805
9807 if (delta == 0)
9808 return false;
9809
9810
9811 return true;
9812 }
9813
9815 {
9817 {
9818 if (ScriptInputUserData.CanStoreInputUserData())
9819 {
9820 ScriptInputUserData ctx = new ScriptInputUserData;
9825 ctx.
Write(destination_entity);
9829 }
9830 }
9831 else if (!
GetGame().IsMultiplayer())
9832 {
9834 }
9835 }
9836
9838 {
9839 float split_quantity_new;
9843 InventoryLocation loc = new InventoryLocation;
9844
9845 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9846 {
9848 split_quantity_new = stack_max;
9849 else
9851
9853 {
9854 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9855 if (new_item)
9856 {
9857 new_item.SetResultOfSplit(true);
9858 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9860 new_item.
SetQuantity(split_quantity_new,
false,
true);
9861 }
9862 }
9863 }
9864 else if (destination_entity && slot_id == -1)
9865 {
9866 if (quantity > stack_max)
9867 split_quantity_new = stack_max;
9868 else
9869 split_quantity_new = quantity;
9870
9872 {
9874 {
9877 }
9878
9879 if (new_item)
9880 {
9881 new_item.SetResultOfSplit(true);
9882 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9884 new_item.
SetQuantity(split_quantity_new,
false,
true);
9885 }
9886 }
9887 }
9888 else
9889 {
9890 if (stack_max != 0)
9891 {
9893 {
9895 }
9896
9897 if (split_quantity_new == 0)
9898 {
9899 if (!
GetGame().IsMultiplayer())
9900 player.PhysicalPredictiveDropItem(this);
9901 else
9902 player.ServerDropEntity(this);
9903 return;
9904 }
9905
9907 {
9909
9910 if (new_item)
9911 {
9912 new_item.SetResultOfSplit(true);
9913 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9916 new_item.PlaceOnSurface();
9917 }
9918 }
9919 }
9920 }
9921 }
9922
9924 {
9925 float split_quantity_new;
9929 InventoryLocation loc = new InventoryLocation;
9930
9931 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9932 {
9934 split_quantity_new = stack_max;
9935 else
9937
9939 {
9940 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9941 if (new_item)
9942 {
9943 new_item.SetResultOfSplit(true);
9944 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9946 new_item.
SetQuantity(split_quantity_new,
false,
true);
9947 }
9948 }
9949 }
9950 else if (destination_entity && slot_id == -1)
9951 {
9952 if (quantity > stack_max)
9953 split_quantity_new = stack_max;
9954 else
9955 split_quantity_new = quantity;
9956
9958 {
9960 {
9963 }
9964
9965 if (new_item)
9966 {
9967 new_item.SetResultOfSplit(true);
9968 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9970 new_item.
SetQuantity(split_quantity_new,
false,
true);
9971 }
9972 }
9973 }
9974 else
9975 {
9976 if (stack_max != 0)
9977 {
9979 {
9981 }
9982
9984 {
9986
9987 if (new_item)
9988 {
9989 new_item.SetResultOfSplit(true);
9990 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9993 new_item.PlaceOnSurface();
9994 }
9995 }
9996 }
9997 }
9998 }
9999
10001 {
10003 {
10004 if (ScriptInputUserData.CanStoreInputUserData())
10005 {
10006 ScriptInputUserData ctx = new ScriptInputUserData;
10011 dst.WriteToContext(ctx);
10013 }
10014 }
10015 else if (!
GetGame().IsMultiplayer())
10016 {
10018 }
10019 }
10020
10022 {
10024 {
10025 if (ScriptInputUserData.CanStoreInputUserData())
10026 {
10027 ScriptInputUserData ctx = new ScriptInputUserData;
10032 ctx.
Write(destination_entity);
10038 }
10039 }
10040 else if (!
GetGame().IsMultiplayer())
10041 {
10043 }
10044 }
10045
10047 {
10049 }
10050
10052 {
10054 float split_quantity_new;
10056 if (dst.IsValid())
10057 {
10058 int slot_id = dst.GetSlot();
10060
10061 if (quantity > stack_max)
10062 split_quantity_new = stack_max;
10063 else
10064 split_quantity_new = quantity;
10065
10067 {
10069
10070 if (new_item)
10071 {
10072 new_item.SetResultOfSplit(true);
10073 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10075 new_item.
SetQuantity(split_quantity_new,
false,
true);
10076 }
10077
10078 return new_item;
10079 }
10080 }
10081
10082 return null;
10083 }
10084
10086 {
10088 float split_quantity_new;
10090 if (destination_entity)
10091 {
10093 if (quantity > stackable)
10094 split_quantity_new = stackable;
10095 else
10096 split_quantity_new = quantity;
10097
10099 {
10100 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10101 if (new_item)
10102 {
10103 new_item.SetResultOfSplit(true);
10104 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10106 new_item.
SetQuantity(split_quantity_new,
false,
true);
10107 }
10108 }
10109 }
10110 }
10111
10113 {
10115 {
10116 if (ScriptInputUserData.CanStoreInputUserData())
10117 {
10118 ScriptInputUserData ctx = new ScriptInputUserData;
10123 ItemBase destination_entity =
this;
10124 ctx.
Write(destination_entity);
10128 }
10129 }
10130 else if (!
GetGame().IsMultiplayer())
10131 {
10133 }
10134 }
10135
10137 {
10139 float split_quantity_new;
10141 if (player)
10142 {
10144 if (quantity > stackable)
10145 split_quantity_new = stackable;
10146 else
10147 split_quantity_new = quantity;
10148
10150 {
10151 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10152 new_item =
ItemBase.Cast(in_hands);
10153 if (new_item)
10154 {
10155 new_item.SetResultOfSplit(true);
10156 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10158 new_item.SetQuantity(split_quantity_new, false, true);
10159 }
10160 }
10161 }
10162 }
10163
10165 {
10167 float split_quantity_new = Math.Floor(quantity * 0.5);
10168
10170 return;
10171
10173
10174 if (new_item)
10175 {
10176 if (new_item.GetQuantityMax() < split_quantity_new)
10177 {
10178 split_quantity_new = new_item.GetQuantityMax();
10179 }
10180
10181 new_item.SetResultOfSplit(true);
10182 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10183
10185 {
10188 }
10189 else
10190 {
10192 new_item.
SetQuantity(split_quantity_new,
false,
true);
10193 }
10194 }
10195 }
10196
10198 {
10200 float split_quantity_new = Math.Floor(quantity / 2);
10201
10203 return;
10204
10205 InventoryLocation invloc = new InventoryLocation;
10207
10209 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10210
10211 if (new_item)
10212 {
10213 if (new_item.GetQuantityMax() < split_quantity_new)
10214 {
10215 split_quantity_new = new_item.GetQuantityMax();
10216 }
10218 {
10221 }
10222 else if (split_quantity_new > 1)
10223 {
10225 new_item.
SetQuantity(split_quantity_new,
false,
true);
10226 }
10227 }
10228 }
10229
10232 {
10233 SetWeightDirty();
10235
10236 if (parent)
10237 parent.OnAttachmentQuantityChangedEx(this, delta);
10238
10240 {
10242 {
10244 }
10246 {
10247 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10249 }
10250 }
10251
10252 }
10253
10256 {
10257
10258 }
10259
10262 {
10264 }
10265
10267 {
10268 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10269
10271 {
10272 if (newLevel == GameConstants.STATE_RUINED)
10273 {
10275 EntityAI parent = GetHierarchyParent();
10276 if (parent && parent.IsFireplace())
10277 {
10278 CargoBase cargo = GetInventory().GetCargo();
10279 if (cargo)
10280 {
10282 {
10284 }
10285 }
10286 }
10287 }
10288
10290 {
10291
10293 return;
10294 }
10295
10296 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10297 {
10299 }
10300 }
10301 }
10302
10303
10305 {
10306 super.OnRightClick();
10307
10309 {
10311 {
10312 if (ScriptInputUserData.CanStoreInputUserData())
10313 {
10314 EntityAI root = GetHierarchyRoot();
10315 Man playerOwner = GetHierarchyRootPlayer();
10316 InventoryLocation dst = new InventoryLocation;
10317
10318
10319 if (!playerOwner && root && root == this)
10320 {
10322 }
10323 else
10324 {
10325
10326 GetInventory().GetCurrentInventoryLocation(dst);
10328 {
10331 {
10333 }
10334 else
10335 {
10337
10338
10339 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10340 {
10342 }
10343 else
10344 {
10345 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10346 }
10347 }
10348 }
10349 }
10350
10351 ScriptInputUserData ctx = new ScriptInputUserData;
10359 }
10360 }
10361 else if (!
GetGame().IsMultiplayer())
10362 {
10364 }
10365 }
10366 }
10367
10369 {
10370 if (root)
10371 {
10372 vector m4[4];
10373 root.GetTransform(m4);
10374 dst.SetGround(this, m4);
10375 }
10376 else
10377 {
10378 GetInventory().GetCurrentInventoryLocation(dst);
10379 }
10380 }
10381
10382 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10383 {
10384
10385 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10386 return false;
10387
10388 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10389 return false;
10390
10391
10393 return false;
10394
10395
10396 Magazine mag = Magazine.Cast(this);
10397 if (mag)
10398 {
10399 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10400 return false;
10401
10402 if (stack_max_limit)
10403 {
10404 Magazine other_mag = Magazine.Cast(other_item);
10405 if (other_item)
10406 {
10407 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10408 return false;
10409 }
10410
10411 }
10412 }
10413 else
10414 {
10415
10417 return false;
10418
10420 return false;
10421 }
10422
10423 PlayerBase player = null;
10424 if (CastTo(player, GetHierarchyRootPlayer()))
10425 {
10426 if (player.GetInventory().HasAttachment(this))
10427 return false;
10428
10429 if (player.IsItemsToDelete())
10430 return false;
10431 }
10432
10433 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10434 return false;
10435
10436 int slotID;
10438 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10439 return false;
10440
10441 return true;
10442 }
10443
10445 {
10447 }
10448
10450 {
10451 return m_IsResultOfSplit;
10452 }
10453
10455 {
10456 m_IsResultOfSplit = value;
10457 }
10458
10460 {
10462 }
10463
10465 {
10466 float other_item_quantity = other_item.GetQuantity();
10467 float this_free_space;
10468
10470
10472
10473 if (other_item_quantity > this_free_space)
10474 {
10475 return this_free_space;
10476 }
10477 else
10478 {
10479 return other_item_quantity;
10480 }
10481 }
10482
10484 {
10486 }
10487
10489 {
10491 return;
10492
10493 if (!IsMagazine() && other_item)
10494 {
10496 if (quantity_used != 0)
10497 {
10498 float hp1 = GetHealth01("","");
10499 float hp2 = other_item.GetHealth01("","");
10500 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10501 hpResult = hpResult / (
GetQuantity() + quantity_used);
10502
10503 hpResult *= GetMaxHealth();
10504 Math.Round(hpResult);
10505 SetHealth("", "Health", hpResult);
10506
10508 other_item.AddQuantity(-quantity_used);
10509 }
10510 }
10512 }
10513
10515 {
10516 #ifdef SERVER
10517 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10518 GetHierarchyParent().IncreaseLifetimeUp();
10519 #endif
10520 };
10521
10523 {
10524 PlayerBase p = PlayerBase.Cast(player);
10525
10526 array<int> recipesIds = p.m_Recipes;
10527 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10528 if (moduleRecipesManager)
10529 {
10530 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10531 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10532 }
10533
10534 for (int i = 0;i < recipesIds.Count(); i++)
10535 {
10536 int key = recipesIds.Get(i);
10537 string recipeName = moduleRecipesManager.GetRecipeName(key);
10539 }
10540 }
10541
10542
10543 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10544 {
10545 super.GetDebugActions(outputList);
10546
10547
10553
10554
10559
10564
10565
10569
10570
10572 {
10576 }
10577
10580
10581
10585
10587
10588 InventoryLocation loc = new InventoryLocation();
10589 GetInventory().GetCurrentInventoryLocation(loc);
10591 {
10592 if (Gizmo_IsSupported())
10595 }
10596
10598 }
10599
10600
10601
10602
10604 {
10605 super.OnAction(action_id, player, ctx);
10606
10608 {
10609 switch (action_id)
10610 {
10613 return true;
10616 return true;
10617 }
10618 }
10619
10621 {
10622 switch (action_id)
10623 {
10625 Delete();
10626 return true;
10627 }
10628 }
10629
10630 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10631 {
10632 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10633 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10634 PlayerBase p = PlayerBase.Cast(player);
10635 if (
EActions.RECIPES_RANGE_START < 1000)
10636 {
10637 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10638 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10639 }
10640 }
10641 #ifndef SERVER
10642 else if (action_id ==
EActions.WATCH_PLAYER)
10643 {
10644 PluginDeveloper.SetDeveloperItemClientEx(player);
10645 }
10646 #endif
10648 {
10649 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10650 {
10651 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10652 OnDebugButtonPressServer(id + 1);
10653 }
10654
10655 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10656 {
10657 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10659 }
10660
10661 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10662 {
10663 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10665 }
10666
10667 else if (action_id ==
EActions.ADD_QUANTITY)
10668 {
10669 if (IsMagazine())
10670 {
10671 Magazine mag = Magazine.Cast(this);
10672 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10673 }
10674 else
10675 {
10677 }
10678
10679 if (m_EM)
10680 {
10681 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10682 }
10683
10684 }
10685
10686 else if (action_id ==
EActions.REMOVE_QUANTITY)
10687 {
10688 if (IsMagazine())
10689 {
10690 Magazine mag2 = Magazine.Cast(this);
10691 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10692 }
10693 else
10694 {
10696 }
10697 if (m_EM)
10698 {
10699 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10700 }
10701
10702 }
10703
10704 else if (action_id ==
EActions.SET_QUANTITY_0)
10705 {
10707
10708 if (m_EM)
10709 {
10710 m_EM.SetEnergy(0);
10711 }
10712 }
10713
10714 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10715 {
10717
10718 if (m_EM)
10719 {
10720 m_EM.SetEnergy(m_EM.GetEnergyMax());
10721 }
10722 }
10723
10724 else if (action_id ==
EActions.ADD_HEALTH)
10725 {
10726 AddHealth("","",GetMaxHealth("","Health")/5);
10727 }
10728 else if (action_id ==
EActions.REMOVE_HEALTH)
10729 {
10730 AddHealth("","",-GetMaxHealth("","Health")/5);
10731 }
10732 else if (action_id ==
EActions.DESTROY_HEALTH)
10733 {
10734 SetHealth01("","",0);
10735 }
10736 else if (action_id ==
EActions.WATCH_ITEM)
10737 {
10739 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10740 #ifdef DEVELOPER
10741 SetDebugDeveloper_item(this);
10742 #endif
10743 }
10744
10745 else if (action_id ==
EActions.ADD_TEMPERATURE)
10746 {
10747 AddTemperature(20);
10748
10749 }
10750
10751 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10752 {
10753 AddTemperature(-20);
10754
10755 }
10756
10757 else if (action_id ==
EActions.FLIP_FROZEN)
10758 {
10759 SetFrozen(!GetIsFrozen());
10760
10761 }
10762
10763 else if (action_id ==
EActions.ADD_WETNESS)
10764 {
10766
10767 }
10768
10769 else if (action_id ==
EActions.REMOVE_WETNESS)
10770 {
10772
10773 }
10774
10775 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10776 {
10779
10780
10781 }
10782
10783 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10784 {
10787 }
10788
10789 else if (action_id ==
EActions.MAKE_SPECIAL)
10790 {
10791 auto debugParams = DebugSpawnParams.WithPlayer(player);
10792 OnDebugSpawnEx(debugParams);
10793 }
10794
10795 }
10796
10797
10798 return false;
10799 }
10800
10801
10802
10803
10807
10810
10811
10812
10814 {
10815 return false;
10816 }
10817
10818
10820 {
10821 return true;
10822 }
10823
10824
10826 {
10827 return true;
10828 }
10829
10830
10831
10833 {
10834 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10836 }
10837
10840 {
10841 return null;
10842 }
10843
10845 {
10846 return false;
10847 }
10848
10850 {
10851 return false;
10852 }
10853
10857
10858
10860 {
10861 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10862 return module_repairing.CanRepair(this, item_repair_kit);
10863 }
10864
10865
10866 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10867 {
10868 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10869 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10870 }
10871
10872
10874 {
10875
10876
10877
10878
10879
10880
10881
10882
10883 return 1;
10884 }
10885
10886
10887
10889 {
10891 }
10892
10893
10894
10896 {
10898 }
10899
10900
10909 {
10910 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10911
10912 if (player)
10913 {
10914 player.MessageStatus(text);
10915 }
10916 }
10917
10918
10927 {
10928 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10929
10930 if (player)
10931 {
10932 player.MessageAction(text);
10933 }
10934 }
10935
10936
10945 {
10946 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10947
10948 if (player)
10949 {
10950 player.MessageFriendly(text);
10951 }
10952 }
10953
10954
10963 {
10964 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10965
10966 if (player)
10967 {
10968 player.MessageImportant(text);
10969 }
10970 }
10971
10973 {
10974 return true;
10975 }
10976
10977
10978 override bool KindOf(
string tag)
10979 {
10980 bool found = false;
10981 string item_name = this.
GetType();
10984
10985 int array_size = item_tag_array.Count();
10986 for (int i = 0; i < array_size; i++)
10987 {
10988 if (item_tag_array.Get(i) == tag)
10989 {
10990 found = true;
10991 break;
10992 }
10993 }
10994 return found;
10995 }
10996
10997
10999 {
11000
11001 super.OnRPC(sender, rpc_type,ctx);
11002
11003
11004 switch (rpc_type)
11005 {
11006 #ifndef SERVER
11007 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11008 Param2<bool, string> p = new Param2<bool, string>(false, "");
11009
11011 return;
11012
11013 bool play = p.param1;
11014 string soundSet = p.param2;
11015
11016 if (play)
11017 {
11019 {
11021 {
11023 }
11024 }
11025 else
11026 {
11028 }
11029 }
11030 else
11031 {
11033 }
11034
11035 break;
11036 #endif
11037
11038 }
11039
11041 {
11043 }
11044 }
11045
11046
11047
11048
11050 {
11051 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11052 return plugin.GetID(
name);
11053 }
11054
11056 {
11057 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11058 return plugin.GetName(id);
11059 }
11060
11063 {
11064
11065
11066 int varFlags;
11067 if (!ctx.
Read(varFlags))
11068 return;
11069
11070 if (varFlags & ItemVariableFlags.FLOAT)
11071 {
11073 }
11074 }
11075
11077 {
11078
11079 super.SerializeNumericalVars(floats_out);
11080
11081
11082
11084 {
11086 }
11087
11089 {
11091 }
11092
11094 {
11096 }
11097
11099 {
11104 }
11105
11107 {
11109 }
11110 }
11111
11113 {
11114
11115 super.DeSerializeNumericalVars(floats);
11116
11117
11118 int index = 0;
11119 int mask = Math.Round(floats.Get(index));
11120
11121 index++;
11122
11124 {
11126 {
11128 }
11129 else
11130 {
11131 float quantity = floats.Get(index);
11132 SetQuantity(quantity,
true,
false,
false,
false);
11133 }
11134 index++;
11135 }
11136
11138 {
11139 float wet = floats.Get(index);
11141 index++;
11142 }
11143
11145 {
11146 int liquidtype = Math.Round(floats.Get(index));
11148 index++;
11149 }
11150
11152 {
11154 index++;
11156 index++;
11158 index++;
11160 index++;
11161 }
11162
11164 {
11165 int cleanness = Math.Round(floats.Get(index));
11167 index++;
11168 }
11169 }
11170
11172 {
11173 super.WriteVarsToCTX(ctx);
11174
11175
11177 {
11179 }
11180
11182 {
11184 }
11185
11187 {
11189 }
11190
11192 {
11193 int r,g,b,a;
11199 }
11200
11202 {
11204 }
11205 }
11206
11208 {
11209 if (!super.ReadVarsFromCTX(ctx,version))
11210 return false;
11211
11212 int intValue;
11213 float value;
11214
11215 if (version < 140)
11216 {
11217 if (!ctx.
Read(intValue))
11218 return false;
11219
11220 m_VariablesMask = intValue;
11221 }
11222
11224 {
11225 if (!ctx.
Read(value))
11226 return false;
11227
11229 {
11231 }
11232 else
11233 {
11235 }
11236 }
11237
11238 if (version < 140)
11239 {
11241 {
11242 if (!ctx.
Read(value))
11243 return false;
11244 SetTemperatureDirect(value);
11245 }
11246 }
11247
11249 {
11250 if (!ctx.
Read(value))
11251 return false;
11253 }
11254
11256 {
11257 if (!ctx.
Read(intValue))
11258 return false;
11260 }
11261
11263 {
11264 int r,g,b,a;
11266 return false;
11268 return false;
11270 return false;
11272 return false;
11273
11275 }
11276
11278 {
11279 if (!ctx.
Read(intValue))
11280 return false;
11282 }
11283
11284 if (version >= 138 && version < 140)
11285 {
11287 {
11288 if (!ctx.
Read(intValue))
11289 return false;
11290 SetFrozen(intValue);
11291 }
11292 }
11293
11294 return true;
11295 }
11296
11297
11299 {
11302 {
11304 }
11305
11306 if (!super.OnStoreLoad(ctx, version))
11307 {
11309 return false;
11310 }
11311
11312 if (version >= 114)
11313 {
11314 bool hasQuickBarIndexSaved;
11315
11316 if (!ctx.
Read(hasQuickBarIndexSaved))
11317 {
11319 return false;
11320 }
11321
11322 if (hasQuickBarIndexSaved)
11323 {
11324 int itmQBIndex;
11325
11326
11327 if (!ctx.
Read(itmQBIndex))
11328 {
11330 return false;
11331 }
11332
11333 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11334 if (itmQBIndex != -1 && parentPlayer)
11335 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11336 }
11337 }
11338 else
11339 {
11340
11341 PlayerBase player;
11342 int itemQBIndex;
11343 if (version ==
int.
MAX)
11344 {
11345 if (!ctx.
Read(itemQBIndex))
11346 {
11348 return false;
11349 }
11350 }
11351 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11352 {
11353
11354 if (!ctx.
Read(itemQBIndex))
11355 {
11357 return false;
11358 }
11359 if (itemQBIndex != -1 && player)
11360 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11361 }
11362 }
11363
11364 if (version < 140)
11365 {
11366
11367 if (!LoadVariables(ctx, version))
11368 {
11370 return false;
11371 }
11372 }
11373
11374
11376 {
11378 return false;
11379 }
11380 if (version >= 132)
11381 {
11383 if (raib)
11384 {
11386 {
11388 return false;
11389 }
11390 }
11391 }
11392
11394 return true;
11395 }
11396
11397
11398
11400 {
11401 super.OnStoreSave(ctx);
11402
11403 PlayerBase player;
11404 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11405 {
11407
11408 int itemQBIndex = -1;
11409 itemQBIndex = player.FindQuickBarEntityIndex(this);
11410 ctx.
Write(itemQBIndex);
11411 }
11412 else
11413 {
11415 }
11416
11418
11420 if (raib)
11421 {
11423 }
11424 }
11425
11426
11428 {
11429 super.AfterStoreLoad();
11430
11432 {
11434 }
11435
11437 {
11440 }
11441 }
11442
11444 {
11445 super.EEOnAfterLoad();
11446
11448 {
11450 }
11451
11454 }
11455
11457 {
11458 return false;
11459 }
11460
11461
11462
11464 {
11466 {
11467 #ifdef PLATFORM_CONSOLE
11468
11470 {
11472 if (menu)
11473 {
11475 }
11476 }
11477 #endif
11478 }
11479
11481 {
11484 }
11485
11487 {
11488 SetWeightDirty();
11490 }
11492 {
11495 }
11496
11498 {
11501 }
11503 {
11506 }
11507
11508 super.OnVariablesSynchronized();
11509 }
11510
11511
11512
11514 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11515 {
11516 if (!IsServerCheck(allow_client))
11517 return false;
11518
11520 return false;
11521
11524
11525 if (value <= (min + 0.001))
11526 value = min;
11527
11528 if (value == min)
11529 {
11530 if (destroy_config)
11531 {
11532 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11533 if (dstr)
11534 {
11536 this.Delete();
11537 return true;
11538 }
11539 }
11540 else if (destroy_forced)
11541 {
11543 this.Delete();
11544 return true;
11545 }
11546
11548 }
11549
11552
11554 {
11556
11557 if (delta)
11559 }
11560
11562
11563 return false;
11564 }
11565
11566
11568 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11569 {
11571 }
11572
11574 {
11577 }
11578
11580 {
11583 }
11584
11586 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11587 {
11588 float value_clamped = Math.Clamp(value, 0, 1);
11590 SetQuantity(result, destroy_config, destroy_forced);
11591 }
11592
11593
11596 {
11598 }
11599
11601 {
11603 }
11604
11605
11606
11607
11608
11609
11610
11611
11612
11613
11615 {
11616 int slot = -1;
11617 if (GetInventory())
11618 {
11619 InventoryLocation il = new InventoryLocation;
11620 GetInventory().GetCurrentInventoryLocation(il);
11622 }
11623
11625 }
11626
11628 {
11629 float quantity_max = 0;
11630
11632 {
11633 if (attSlotID != -1)
11634 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11635
11636 if (quantity_max <= 0)
11638 }
11639
11640 if (quantity_max <= 0)
11642
11643 return quantity_max;
11644 }
11645
11647 {
11649 }
11650
11652 {
11654 }
11655
11656
11658 {
11660 }
11661
11663 {
11665 }
11666
11668 {
11670 }
11671
11672
11674 {
11675
11676 float weightEx = GetWeightEx();
11677 float special = GetInventoryAndCargoWeight();
11678 return weightEx - special;
11679 }
11680
11681
11683 {
11685 }
11686
11688 {
11690 {
11691 #ifdef DEVELOPER
11692 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11693 {
11694 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11696 }
11697 #endif
11698
11699 return GetQuantity() * GetConfigWeightModified();
11700 }
11701 else if (HasEnergyManager())
11702 {
11703 #ifdef DEVELOPER
11704 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11705 {
11706 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11707 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11708 }
11709 #endif
11710 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11711 }
11712 else
11713 {
11714 #ifdef DEVELOPER
11715 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11716 {
11717 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11718 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11719 }
11720 #endif
11721 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11722 }
11723 }
11724
11727 {
11728 int item_count = 0;
11730
11731 if (GetInventory().GetCargo() != NULL)
11732 {
11733 item_count = GetInventory().GetCargo().GetItemCount();
11734 }
11735
11736 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11737 {
11738 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11739 if (item)
11740 item_count += item.GetNumberOfItems();
11741 }
11742 return item_count;
11743 }
11744
11747 {
11748 float weight = 0;
11749 float wetness = 1;
11750 if (include_wetness)
11753 {
11754 weight = wetness * m_ConfigWeight;
11755 }
11757 {
11758 weight = 1;
11759 }
11760 return weight;
11761 }
11762
11763
11764
11766 {
11767 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11768 {
11769 GameInventory inv = GetInventory();
11770 array<EntityAI> items = new array<EntityAI>;
11772 for (int i = 0; i < items.Count(); i++)
11773 {
11775 if (item)
11776 {
11778 }
11779 }
11780 }
11781 }
11782
11783
11784
11785
11787 {
11788 float energy = 0;
11789 if (HasEnergyManager())
11790 {
11791 energy = GetCompEM().GetEnergy();
11792 }
11793 return energy;
11794 }
11795
11796
11798 {
11799 super.OnEnergyConsumed();
11800
11802 }
11803
11805 {
11806 super.OnEnergyAdded();
11807
11809 }
11810
11811
11813 {
11814 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11815 {
11817 {
11818 float energy_0to1 = GetCompEM().GetEnergy0To1();
11820 }
11821 }
11822 }
11823
11824
11826 {
11827 return ConfigGetFloat("heatIsolation");
11828 }
11829
11831 {
11833 }
11834
11836 {
11837 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11838 if (
GetGame().ConfigIsExisting(paramPath))
11840
11841 return 0.0;
11842 }
11843
11845 {
11846 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11847 if (
GetGame().ConfigIsExisting(paramPath))
11849
11850 return 0.0;
11851 }
11852
11853 override void SetWet(
float value,
bool allow_client =
false)
11854 {
11855 if (!IsServerCheck(allow_client))
11856 return;
11857
11860
11862
11863 m_VarWet = Math.Clamp(value, min, max);
11864
11866 {
11869 }
11870 }
11871
11872 override void AddWet(
float value)
11873 {
11875 }
11876
11878 {
11880 }
11881
11883 {
11885 }
11886
11888 {
11890 }
11891
11893 {
11895 }
11896
11898 {
11900 }
11901
11902 override void OnWetChanged(
float newVal,
float oldVal)
11903 {
11906 if (newLevel != oldLevel)
11907 {
11909 }
11910 }
11911
11913 {
11914 SetWeightDirty();
11915 }
11916
11918 {
11919 return GetWetLevelInternal(
m_VarWet);
11920 }
11921
11922
11923
11925 {
11927 }
11928
11930 {
11932 }
11933
11935 {
11937 }
11938
11940 {
11942 }
11943
11944
11945
11947 {
11948 if (ConfigIsExisting("itemModelLength"))
11949 {
11950 return ConfigGetFloat("itemModelLength");
11951 }
11952 return 0;
11953 }
11954
11956 {
11957 if (ConfigIsExisting("itemAttachOffset"))
11958 {
11959 return ConfigGetFloat("itemAttachOffset");
11960 }
11961 return 0;
11962 }
11963
11964 override void SetCleanness(
int value,
bool allow_client =
false)
11965 {
11966 if (!IsServerCheck(allow_client))
11967 return;
11968
11970
11972
11975 }
11976
11978 {
11980 }
11981
11983 {
11984 return true;
11985 }
11986
11987
11988
11989
11991 {
11993 }
11994
11996 {
11998 }
11999
12000
12001
12002
12003 override void SetColor(
int r,
int g,
int b,
int a)
12004 {
12010 }
12012 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12013 {
12018 }
12019
12021 {
12023 }
12024
12027 {
12028 int r,g,b,a;
12030 r = r/255;
12031 g = g/255;
12032 b = b/255;
12033 a = a/255;
12034 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12035 }
12036
12037
12038
12039 override void SetLiquidType(
int value,
bool allow_client =
false)
12040 {
12041 if (!IsServerCheck(allow_client))
12042 return;
12043
12048 }
12049
12051 {
12052 return ConfigGetInt("varLiquidTypeInit");
12053 }
12054
12056 {
12058 }
12059
12061 {
12063 SetFrozen(false);
12064 }
12065
12068 {
12069 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12070 }
12071
12072
12075 {
12076 PlayerBase nplayer;
12077 if (PlayerBase.CastTo(nplayer, player))
12078 {
12080
12081 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12082 }
12083 }
12084
12085
12088 {
12089 PlayerBase nplayer;
12090 if (PlayerBase.CastTo(nplayer,player))
12091 {
12092
12093 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12094
12095 }
12096
12097
12098 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12099
12100
12101 if (HasEnergyManager())
12102 {
12103 GetCompEM().UpdatePlugState();
12104 }
12105 }
12106
12107
12109 {
12110 super.OnPlacementStarted(player);
12111
12113 }
12114
12115 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12116 {
12118 {
12119 m_AdminLog.OnPlacementComplete(player,
this);
12120 }
12121
12122 super.OnPlacementComplete(player, position, orientation);
12123 }
12124
12125
12126
12127
12128
12130 {
12132 {
12133 return true;
12134 }
12135 else
12136 {
12137 return false;
12138 }
12139 }
12140
12141
12143 {
12145 {
12147 }
12148 }
12149
12150
12152 {
12154 }
12155
12157 {
12159 }
12160
12161 override void InsertAgent(
int agent,
float count = 1)
12162 {
12163 if (count < 1)
12164 return;
12165
12167 }
12168
12171 {
12173 }
12174
12175
12177 {
12179 }
12180
12181
12182
12183
12184
12185
12186
12187
12188
12189
12190
12191
12192
12193
12194
12195
12196
12197
12198
12199
12200
12201
12202
12203
12204
12205
12206
12207
12208
12209
12210
12211
12212
12213
12214
12215
12216
12217
12218
12219
12220
12221
12223 {
12225 return false;
12226 return true;
12227 }
12228
12230 {
12231
12233 }
12234
12235
12238 {
12239 super.CheckForRoofLimited(timeTresholdMS);
12240
12242 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12243 {
12244 m_PreviousRoofTestTime = time;
12245 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12246 }
12247 }
12248
12249
12251 {
12253 {
12254 return 0;
12255 }
12256
12257 if (GetInventory().GetAttachmentSlotsCount() != 0)
12258 {
12259 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12260 if (filter)
12261 return filter.GetProtectionLevel(type, false, system);
12262 else
12263 return 0;
12264 }
12265
12266 string subclassPath, entryName;
12267
12268 switch (type)
12269 {
12271 entryName = "biological";
12272 break;
12274 entryName = "chemical";
12275 break;
12276 default:
12277 entryName = "biological";
12278 break;
12279 }
12280
12281 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12282
12284 }
12285
12286
12287
12290 {
12291 if (!IsMagazine())
12293
12295 }
12296
12297
12298
12299
12300
12305 {
12306 return true;
12307 }
12308
12310 {
12312 }
12313
12314
12315
12316
12317
12319 {
12320 if (parent)
12321 {
12322 if (parent.IsInherited(DayZInfected))
12323 return true;
12324
12325 if (!parent.IsRuined())
12326 return true;
12327 }
12328
12329 return true;
12330 }
12331
12333 {
12334 if (!super.CanPutAsAttachment(parent))
12335 {
12336 return false;
12337 }
12338
12339 if (!IsRuined() && !parent.IsRuined())
12340 {
12341 return true;
12342 }
12343
12344 return false;
12345 }
12346
12348 {
12349
12350
12351
12352
12353 return super.CanReceiveItemIntoCargo(item);
12354 }
12355
12357 {
12358
12359
12360
12361
12362 GameInventory attachmentInv = attachment.GetInventory();
12364 {
12365 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12366 return false;
12367 }
12368
12369 InventoryLocation loc = new InventoryLocation();
12370 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12371 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12372 return false;
12373
12374 return super.CanReceiveAttachment(attachment, slotId);
12375 }
12376
12378 {
12379 if (!super.CanReleaseAttachment(attachment))
12380 return false;
12381
12382 return GetInventory().AreChildrenAccessible();
12383 }
12384
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12406 {
12407 int id = muzzle_owner.GetMuzzleID();
12408 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12409
12410 if (WPOF_array)
12411 {
12412 for (int i = 0; i < WPOF_array.Count(); i++)
12413 {
12414 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12415
12416 if (WPOF)
12417 {
12418 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12419 }
12420 }
12421 }
12422 }
12423
12424
12426 {
12427 int id = muzzle_owner.GetMuzzleID();
12429
12430 if (WPOBE_array)
12431 {
12432 for (int i = 0; i < WPOBE_array.Count(); i++)
12433 {
12434 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12435
12436 if (WPOBE)
12437 {
12438 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12439 }
12440 }
12441 }
12442 }
12443
12444
12446 {
12447 int id = muzzle_owner.GetMuzzleID();
12448 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12449
12450 if (WPOOH_array)
12451 {
12452 for (int i = 0; i < WPOOH_array.Count(); i++)
12453 {
12454 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12455
12456 if (WPOOH)
12457 {
12458 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12459 }
12460 }
12461 }
12462 }
12463
12464
12466 {
12467 int id = muzzle_owner.GetMuzzleID();
12468 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12469
12470 if (WPOOH_array)
12471 {
12472 for (int i = 0; i < WPOOH_array.Count(); i++)
12473 {
12474 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12475
12476 if (WPOOH)
12477 {
12478 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12479 }
12480 }
12481 }
12482 }
12483
12484
12486 {
12487 int id = muzzle_owner.GetMuzzleID();
12488 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12489
12490 if (WPOOH_array)
12491 {
12492 for (int i = 0; i < WPOOH_array.Count(); i++)
12493 {
12494 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12495
12496 if (WPOOH)
12497 {
12498 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12499 }
12500 }
12501 }
12502 }
12503
12504
12505
12507 {
12509 {
12510 return true;
12511 }
12512
12513 return false;
12514 }
12515
12517 {
12519 {
12520 return true;
12521 }
12522
12523 return false;
12524 }
12525
12527 {
12529 {
12530 return true;
12531 }
12532
12533 return false;
12534 }
12535
12537 {
12538 return false;
12539 }
12540
12543 {
12544 return UATimeSpent.DEFAULT_DEPLOY;
12545 }
12546
12547
12548
12549
12551 {
12553 SetSynchDirty();
12554 }
12555
12557 {
12559 }
12560
12561
12563 {
12564 return false;
12565 }
12566
12569 {
12570 string att_type = "None";
12571
12572 if (ConfigIsExisting("soundAttType"))
12573 {
12574 att_type = ConfigGetString("soundAttType");
12575 }
12576
12578 }
12579
12581 {
12583 }
12584
12585
12586
12587
12588
12594
12596 {
12599
12601 }
12602
12603
12605 {
12607 return;
12608
12610
12613
12616
12617 SoundParameters params = new SoundParameters();
12621 }
12622
12623
12625 {
12627 return;
12628
12630 SetSynchDirty();
12631
12634 }
12635
12636
12638 {
12640 return;
12641
12643 SetSynchDirty();
12644
12647 }
12648
12650 {
12652 }
12653
12655 {
12657 }
12658
12661 {
12662 if (!
GetGame().IsDedicatedServer())
12663 {
12664 if (ConfigIsExisting("attachSoundSet"))
12665 {
12666 string cfg_path = "";
12667 string soundset = "";
12668 string type_name =
GetType();
12669
12672 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12673 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12674
12675 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12676 {
12677 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12678 {
12679 if (cfg_slot_array[i] == slot_type)
12680 {
12681 soundset = cfg_soundset_array[i];
12682 break;
12683 }
12684 }
12685 }
12686
12687 if (soundset != "")
12688 {
12689 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12691 }
12692 }
12693 }
12694 }
12695
12697 {
12698
12699 }
12700
12701 void OnApply(PlayerBase player);
12702
12704 {
12705 return 1.0;
12706 };
12707
12709 {
12711 }
12712
12714 {
12716 }
12717
12719
12721 {
12722 SetDynamicPhysicsLifeTime(0.01);
12724 }
12725
12727 {
12728 array<string> zone_names = new array<string>;
12729 GetDamageZones(zone_names);
12730 for (int i = 0; i < zone_names.Count(); i++)
12731 {
12732 SetHealthMax(zone_names.Get(i),"Health");
12733 }
12734 SetHealthMax("","Health");
12735 }
12736
12739 {
12740 float global_health = GetHealth01("","Health");
12741 array<string> zones = new array<string>;
12742 GetDamageZones(zones);
12743
12744 for (int i = 0; i < zones.Count(); i++)
12745 {
12746 SetHealth01(zones.Get(i),"Health",global_health);
12747 }
12748 }
12749
12752 {
12753 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12754 }
12755
12757 {
12758 if (!hasRootAsPlayer)
12759 {
12760 if (refParentIB)
12761 {
12762
12763 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12764 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12765
12766 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12767 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12768
12771 }
12772 else
12773 {
12774
12777 }
12778 }
12779 }
12780
12782 {
12784 {
12785 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12786 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12787 {
12788 float heatPermCoef = 1.0;
12790 while (ent)
12791 {
12792 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12793 ent = ent.GetHierarchyParent();
12794 }
12795
12796 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12797 }
12798 }
12799 }
12800
12802 {
12803
12804 EntityAI parent = GetHierarchyParent();
12805 if (!parent)
12806 {
12807 hasParent = false;
12808 hasRootAsPlayer = false;
12809 }
12810 else
12811 {
12812 hasParent = true;
12813 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12814 refParentIB =
ItemBase.Cast(parent);
12815 }
12816 }
12817
12818 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12819 {
12820
12821 }
12822
12824 {
12825
12826 return false;
12827 }
12828
12830 {
12831
12832
12833 return false;
12834 }
12835
12837 {
12838
12839 return false;
12840 }
12841
12844 {
12845 return !GetIsFrozen() &&
IsOpen();
12846 }
12847
12849 {
12850 bool hasParent = false, hasRootAsPlayer = false;
12852
12853 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12854 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12855
12856 if (wwtu || foodDecay)
12857 {
12861
12862 if (processWetness || processTemperature || processDecay)
12863 {
12865
12866 if (processWetness)
12867 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12868
12869 if (processTemperature)
12871
12872 if (processDecay)
12873 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12874 }
12875 }
12876 }
12877
12880 {
12882 }
12883
12885 {
12888
12889 return super.GetTemperatureFreezeThreshold();
12890 }
12891
12893 {
12896
12897 return super.GetTemperatureThawThreshold();
12898 }
12899
12901 {
12904
12905 return super.GetItemOverheatThreshold();
12906 }
12907
12909 {
12911 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12912
12913 return super.GetTemperatureFreezeTime();
12914 }
12915
12917 {
12919 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12920
12921 return super.GetTemperatureThawTime();
12922 }
12923
12928
12930 {
12931 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12932 }
12933
12935 {
12936 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12937 }
12938
12941 {
12943 }
12944
12946 {
12948 }
12949
12951 {
12953 }
12954
12957 {
12958 return null;
12959 }
12960
12963 {
12964 return false;
12965 }
12966
12968 {
12970 {
12973 if (!trg)
12974 {
12976 explosive = this;
12977 }
12978
12979 explosive.PairRemote(trg);
12981
12982 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12983 trg.SetPersistentPairID(persistentID);
12984 explosive.SetPersistentPairID(persistentID);
12985
12986 return true;
12987 }
12988 return false;
12989 }
12990
12993 {
12994 float ret = 1.0;
12997 ret *= GetHealth01();
12998
12999 return ret;
13000 }
13001
13002 #ifdef DEVELOPER
13003 override void SetDebugItem()
13004 {
13005 super.SetDebugItem();
13006 _itemBase = this;
13007 }
13008
13010 {
13011 string text = super.GetDebugText();
13012
13014 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13015
13016 return text;
13017 }
13018 #endif
13019
13021 {
13022 return true;
13023 }
13024
13026
13028
13030 {
13033 }
13034
13035
13043
13059}
13060
13062{
13064 if (entity)
13065 {
13066 bool is_item = entity.IsInherited(
ItemBase);
13067 if (is_item && full_quantity)
13068 {
13071 }
13072 }
13073 else
13074 {
13076 return NULL;
13077 }
13078 return entity;
13079}
13080
13082{
13083 if (item)
13084 {
13085 if (health > 0)
13086 item.SetHealth("", "", health);
13087
13088 if (item.CanHaveTemperature())
13089 {
13091 if (item.CanFreeze())
13092 item.SetFrozen(false);
13093 }
13094
13095 if (item.HasEnergyManager())
13096 {
13097 if (quantity >= 0)
13098 {
13099 item.GetCompEM().SetEnergy0To1(quantity);
13100 }
13101 else
13102 {
13104 }
13105 }
13106 else if (item.IsMagazine())
13107 {
13108 Magazine mag = Magazine.Cast(item);
13109 if (quantity >= 0)
13110 {
13111 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13112 }
13113 else
13114 {
13116 }
13117
13118 }
13119 else
13120 {
13121 if (quantity >= 0)
13122 {
13123 item.SetQuantityNormalized(quantity, false);
13124 }
13125 else
13126 {
13128 }
13129
13130 }
13131 }
13132}
13133
13134#ifdef DEVELOPER
13136#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
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()
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)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native void GizmoSelectObject(Object object)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto native void GizmoSelectPhysics(Physics physics)
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
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 void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.