8282{
8284 {
8285 return true;
8286 }
8287};
8288
8289
8290
8292{
8296
8298
8301
8302
8303
8304
8305
8314
8320
8325
8330
8351 protected bool m_IsResultOfSplit
8352
8354
8359
8360
8361
8363
8367
8368
8369
8371
8374
8375
8376
8382
8383
8391
8394
8395
8397
8398
8400
8401
8406
8407
8412
8413
8415
8416
8418 {
8423
8424 if (!
GetGame().IsDedicatedServer())
8425 {
8427 {
8429
8431 {
8433 }
8434 }
8435
8438 }
8439
8440 m_OldLocation = null;
8441
8443 {
8445 }
8446
8447 if (ConfigIsExisting("headSelectionsToHide"))
8448 {
8451 }
8452
8454 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8455 {
8457 }
8458
8460
8461 m_IsResultOfSplit = false;
8462
8464 }
8465
8467 {
8468 super.InitItemVariables();
8469
8475 m_Count = ConfigGetInt(
"count");
8476
8479
8484
8487
8492
8504
8508
8509
8512 if (ConfigIsExisting("canBeSplit"))
8513 {
8516 }
8517
8519 if (ConfigIsExisting("itemBehaviour"))
8521
8522
8525 RegisterNetSyncVariableInt("m_VarLiquidType");
8526 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8527
8528 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8529 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8530 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8531
8532 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8533 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8534 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8535 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8536
8537 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8538 RegisterNetSyncVariableBool("m_IsTakeable");
8539 RegisterNetSyncVariableBool("m_IsHologram");
8540
8543 {
8546 }
8547
8549
8551 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8553
8554 }
8555
8557 {
8559 }
8560
8562 {
8565 {
8570 }
8571 }
8572
8573 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8574 {
8576 {
8579 }
8580
8582 }
8583
8585 {
8591 }
8592
8594
8596 {
8598
8599 if (!action)
8600 {
8601 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8602 return;
8603 }
8604
8606 if (!ai)
8607 {
8609 return;
8610 }
8611
8613 if (!action_array)
8614 {
8615 action_array = new array<ActionBase_Basic>;
8617 }
8618 if (LogManager.IsActionLogEnable())
8619 {
8620 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8621 }
8622
8623 if (action_array.Find(action) != -1)
8624 {
8625 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8626 }
8627 else
8628 {
8629 action_array.Insert(action);
8630 }
8631 }
8632
8634 {
8636 ActionBase action = player.GetActionManager().GetAction(actionName);
8639
8640 if (action_array)
8641 {
8642 action_array.RemoveItem(action);
8643 }
8644 }
8645
8646
8647
8649 {
8650 ActionOverrideData overrideData = new ActionOverrideData();
8654
8656 if (!actionMap)
8657 {
8660 }
8661
8662 actionMap.Insert(this.
Type(), overrideData);
8663
8664 }
8665
8667
8669
8670
8672 {
8675
8678
8679 string config_to_search = "CfgVehicles";
8680 string muzzle_owner_config;
8681
8683 {
8684 if (IsInherited(Weapon))
8685 config_to_search = "CfgWeapons";
8686
8687 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8688
8689 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8690
8692
8693 if (config_OnFire_subclass_count > 0)
8694 {
8695 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8696
8697 for (int i = 0; i < config_OnFire_subclass_count; i++)
8698 {
8699 string particle_class = "";
8701 string config_OnFire_entry = config_OnFire_class + particle_class;
8702 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8703 WPOF_array.Insert(WPOF);
8704 }
8705
8706
8708 }
8709 }
8710
8712 {
8713 config_to_search = "CfgWeapons";
8714 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8715
8716 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8717
8719
8720 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8721 {
8722 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8723
8724 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8725 {
8726 string particle_class2 = "";
8728 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8729 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8730 WPOBE_array.Insert(WPOBE);
8731 }
8732
8733
8735 }
8736 }
8737 }
8738
8739
8741 {
8744
8746 {
8747 string config_to_search = "CfgVehicles";
8748
8749 if (IsInherited(Weapon))
8750 config_to_search = "CfgWeapons";
8751
8752 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8753 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8754
8755 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8756 {
8757
8759
8761 {
8763 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8765 return;
8766 }
8767
8770
8771
8772
8774 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8775
8776 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8777 {
8778 string particle_class = "";
8780 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8782
8783 if (entry_type == CT_CLASS)
8784 {
8785 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8786 WPOOH_array.Insert(WPOF);
8787 }
8788 }
8789
8790
8792 }
8793 }
8794 }
8795
8797 {
8799 }
8800
8802 {
8804 {
8806
8809
8812
8813 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8814 }
8815 }
8816
8818 {
8820 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8821
8823 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8824
8826 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8827
8829 {
8831 }
8832 }
8833
8835 {
8837 }
8838
8840 {
8843 else
8845
8847 {
8850 }
8851 else
8852 {
8855
8858 }
8859
8861 }
8862
8864 {
8866 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8867 }
8868
8870 {
8872 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8874 }
8875
8877 {
8879 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8880 }
8881
8883 {
8886
8887 OverheatingParticle OP = new OverheatingParticle();
8892
8894 }
8895
8897 {
8900
8901 return -1;
8902 }
8903
8905 {
8907 {
8910
8911 for (int i = count; i > 0; --i)
8912 {
8913 int id = i - 1;
8916
8919
8920 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8921 {
8922 if (p)
8923 {
8926 }
8927 }
8928 }
8929 }
8930 }
8931
8933 {
8935 {
8937 {
8938 int id = i - 1;
8940
8941 if (OP)
8942 {
8944
8945 if (p)
8946 {
8948 }
8949
8950 delete OP;
8951 }
8952 }
8953
8956 }
8957 }
8958
8961 {
8962 return 0.0;
8963 }
8964
8965
8967 {
8968 return 250;
8969 }
8970
8972 {
8973 return 0;
8974 }
8975
8978 {
8980 return true;
8981
8982 return false;
8983 }
8984
8987 {
8990
8992 {
8994 }
8995 else
8996 {
8997
8999 }
9000
9002 }
9003
9010 {
9011 return -1;
9012 }
9013
9014
9015
9016
9018 {
9020 {
9022 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9023
9024 if (r_index >= 0)
9025 {
9026 InventoryLocation r_il = new InventoryLocation;
9027 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9028
9029 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9032 {
9033 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9034 }
9036 {
9037 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9038 }
9039
9040 }
9041
9042 player.GetHumanInventory().ClearUserReservedLocation(this);
9043 }
9044
9047 }
9048
9049
9050
9051
9053 {
9054 return ItemBase.m_DebugActionsMask;
9055 }
9056
9058 {
9059 return ItemBase.m_DebugActionsMask & mask;
9060 }
9061
9063 {
9064 ItemBase.m_DebugActionsMask = mask;
9065 }
9066
9068 {
9069 ItemBase.m_DebugActionsMask |= mask;
9070 }
9071
9073 {
9074 ItemBase.m_DebugActionsMask &= ~mask;
9075 }
9076
9078 {
9080 {
9082 }
9083 else
9084 {
9086 }
9087 }
9088
9089
9091 {
9092 if (GetEconomyProfile())
9093 {
9094 float q_max = GetEconomyProfile().GetQuantityMax();
9095 if (q_max > 0)
9096 {
9097 float q_min = GetEconomyProfile().GetQuantityMin();
9098 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9099
9101 {
9102 ComponentEnergyManager comp = GetCompEM();
9104 {
9106 }
9107 }
9109 {
9111
9112 }
9113
9114 }
9115 }
9116 }
9117
9120 {
9121 EntityAI parent = GetHierarchyParent();
9122
9123 if (parent)
9124 {
9125 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9126 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9127 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9128 }
9129 }
9130
9133 {
9134 EntityAI parent = GetHierarchyParent();
9135
9136 if (parent)
9137 {
9138 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9139 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9140 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9141 }
9142 }
9143
9145 {
9146
9147
9148
9149
9151
9153 {
9154 if (ScriptInputUserData.CanStoreInputUserData())
9155 {
9156 ScriptInputUserData ctx = new ScriptInputUserData;
9162 ctx.
Write(use_stack_max);
9165
9167 {
9168 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9169 }
9170 }
9171 }
9172 else if (!
GetGame().IsMultiplayer())
9173 {
9175 }
9176 }
9177
9179 {
9181 }
9182
9184 {
9186 }
9187
9189 {
9191 }
9192
9194 {
9195
9196 return false;
9197 }
9198
9200 {
9201 return false;
9202 }
9203
9207 {
9208 return false;
9209 }
9210
9212 {
9213 return "";
9214 }
9215
9217
9219 {
9220 return false;
9221 }
9222
9224 {
9225 return true;
9226 }
9227
9228
9229
9231 {
9232 return true;
9233 }
9234
9236 {
9237 return true;
9238 }
9239
9241 {
9242 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9244 }
9245
9247 {
9249 }
9250
9252 {
9254 if (!is_being_placed)
9256 SetSynchDirty();
9257 }
9258
9259
9261
9263 {
9265 }
9266
9268 {
9270 }
9271
9273 {
9274 return 1;
9275 }
9276
9278 {
9279 return false;
9280 }
9281
9283 {
9285 SetSynchDirty();
9286 }
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9323 {
9324 super.OnMovedInsideCargo(container);
9325
9326 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9327 }
9328
9329 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9330 {
9331 super.EEItemLocationChanged(oldLoc,newLoc);
9332
9333 PlayerBase new_player = null;
9334 PlayerBase old_player = null;
9335
9336 if (newLoc.GetParent())
9337 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9338
9339 if (oldLoc.GetParent())
9340 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9341
9343 {
9344 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9345
9346 if (r_index >= 0)
9347 {
9348 InventoryLocation r_il = new InventoryLocation;
9349 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9350
9351 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9354 {
9355 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9356 }
9358 {
9359 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9360 }
9361
9362 }
9363 }
9364
9366 {
9367 if (new_player)
9368 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9369
9370 if (new_player == old_player)
9371 {
9372
9373 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9374 {
9376 {
9377 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9378 {
9379 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9380 }
9381 }
9382 else
9383 {
9384 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9385 }
9386 }
9387
9388 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9389 {
9390 int type = oldLoc.GetType();
9392 {
9393 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9394 }
9396 {
9397 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9398 }
9399 }
9400 if (!m_OldLocation)
9401 {
9402 m_OldLocation = new InventoryLocation;
9403 }
9404 m_OldLocation.Copy(oldLoc);
9405 }
9406 else
9407 {
9408 if (m_OldLocation)
9409 {
9410 m_OldLocation.Reset();
9411 }
9412 }
9413
9415 }
9416 else
9417 {
9418 if (new_player)
9419 {
9420 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9421 if (res_index >= 0)
9422 {
9423 InventoryLocation il = new InventoryLocation;
9424 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9426 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9429 {
9430 il.
GetParent().GetOnReleaseLock().Invoke(it);
9431 }
9433 {
9435 }
9436
9437 }
9438 }
9440 {
9441
9443 }
9444
9445 if (m_OldLocation)
9446 {
9447 m_OldLocation.Reset();
9448 }
9449 }
9450 }
9451
9452 override void EOnContact(IEntity other, Contact extra)
9453 {
9455 {
9456 int liquidType = -1;
9458 if (impactSpeed > 0.0)
9459 {
9461 #ifndef SERVER
9463 #else
9465 SetSynchDirty();
9466 #endif
9468 }
9469 }
9470
9471 #ifdef SERVER
9472 if (GetCompEM() && GetCompEM().IsPlugged())
9473 {
9474 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9475 GetCompEM().UnplugThis();
9476 }
9477 #endif
9478 }
9479
9481
9483 {
9485 }
9486
9488 {
9489
9490 }
9491
9493 {
9494 super.OnItemLocationChanged(old_owner, new_owner);
9495
9496 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9497 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9498
9499 if (!relatedPlayer && playerNew)
9500 relatedPlayer = playerNew;
9501
9502 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9503 {
9505 if (actionMgr)
9506 {
9507 ActionBase currentAction = actionMgr.GetRunningAction();
9508 if (currentAction)
9510 }
9511 }
9512
9513 Man ownerPlayerOld = null;
9514 Man ownerPlayerNew = null;
9515
9516 if (old_owner)
9517 {
9518 if (old_owner.
IsMan())
9519 {
9520 ownerPlayerOld = Man.Cast(old_owner);
9521 }
9522 else
9523 {
9524 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9525 }
9526 }
9527 else
9528 {
9530 {
9532
9533 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9534 {
9535 GetCompEM().UnplugThis();
9536 }
9537 }
9538 }
9539
9540 if (new_owner)
9541 {
9542 if (new_owner.
IsMan())
9543 {
9544 ownerPlayerNew = Man.Cast(new_owner);
9545 }
9546 else
9547 {
9548 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9549 }
9550 }
9551
9552 if (ownerPlayerOld != ownerPlayerNew)
9553 {
9554 if (ownerPlayerOld)
9555 {
9556 array<EntityAI> subItemsExit = new array<EntityAI>;
9558 for (int i = 0; i < subItemsExit.Count(); i++)
9559 {
9562 }
9563 }
9564
9565 if (ownerPlayerNew)
9566 {
9567 array<EntityAI> subItemsEnter = new array<EntityAI>;
9569 for (int j = 0; j < subItemsEnter.Count(); j++)
9570 {
9573 }
9574 }
9575 }
9576 else if (ownerPlayerNew != null)
9577 {
9578 PlayerBase nplayer;
9579 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9580 {
9581 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9583 for (int k = 0; k < subItemsUpdate.Count(); k++)
9584 {
9586 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9587 }
9588 }
9589 }
9590
9591 if (old_owner)
9592 old_owner.OnChildItemRemoved(this);
9593 if (new_owner)
9594 new_owner.OnChildItemReceived(this);
9595 }
9596
9597
9599 {
9600 super.EEDelete(parent);
9601 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9602 if (player)
9603 {
9605
9606 if (player.IsAlive())
9607 {
9608 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9609 if (r_index >= 0)
9610 {
9611 InventoryLocation r_il = new InventoryLocation;
9612 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9613
9614 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9617 {
9618 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9619 }
9621 {
9622 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9623 }
9624
9625 }
9626
9627 player.RemoveQuickBarEntityShortcut(this);
9628 }
9629 }
9630 }
9631
9633 {
9634 super.EEKilled(killer);
9635
9638 {
9639 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9640 {
9641 if (IsMagazine())
9642 {
9643 if (Magazine.Cast(this).GetAmmoCount() > 0)
9644 {
9646 }
9647 }
9648 else
9649 {
9651 }
9652 }
9653 }
9654 }
9655
9657 {
9658 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9659
9660 super.OnWasAttached(parent, slot_id);
9661
9664
9666 }
9667
9669 {
9670 super.OnWasDetached(parent, slot_id);
9671
9674 }
9675
9677 {
9678 int idx;
9681
9682 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9683 if (inventory_slots.Count() < 1)
9684 {
9685 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9686 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9687 }
9688 else
9689 {
9690 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9691 }
9692
9693 idx = inventory_slots.Find(slot);
9694 if (idx < 0)
9695 return "";
9696
9697 return attach_types.Get(idx);
9698 }
9699
9701 {
9702 int idx = -1;
9703 string slot;
9704
9707
9708 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9709 if (inventory_slots.Count() < 1)
9710 {
9711 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9712 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9713 }
9714 else
9715 {
9716 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9717 if (detach_types.Count() < 1)
9718 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9719 }
9720
9721 for (int i = 0; i < inventory_slots.Count(); i++)
9722 {
9723 slot = inventory_slots.Get(i);
9724 }
9725
9726 if (slot != "")
9727 {
9728 if (detach_types.Count() == 1)
9729 idx = 0;
9730 else
9731 idx = inventory_slots.Find(slot);
9732 }
9733 if (idx < 0)
9734 return "";
9735
9736 return detach_types.Get(idx);
9737 }
9738
9740 {
9741
9743
9744
9745 float min_time = 1;
9746 float max_time = 3;
9747 float delay = Math.RandomFloat(min_time, max_time);
9748
9749 explode_timer.Run(delay, this, "DoAmmoExplosion");
9750 }
9751
9753 {
9754 Magazine magazine = Magazine.Cast(this);
9755 int pop_sounds_count = 6;
9756 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9757
9758
9759 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9760 string sound_name = pop_sounds[ sound_idx ];
9762
9763
9764 magazine.ServerAddAmmoCount(-1);
9765
9766
9767 float min_temp_to_explode = 100;
9768
9769 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9770 {
9772 }
9773 }
9774
9775
9776 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9777 {
9778 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9779
9780 const int CHANCE_DAMAGE_CARGO = 4;
9781 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9782 const int CHANCE_DAMAGE_NOTHING = 2;
9783
9785 {
9786 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9787 int chances;
9788 int rnd;
9789
9790 if (GetInventory().GetCargo())
9791 {
9792 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9793 rnd = Math.RandomInt(0,chances);
9794
9795 if (rnd < CHANCE_DAMAGE_CARGO)
9796 {
9798 }
9799 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9800 {
9802 }
9803 }
9804 else
9805 {
9806 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9807 rnd = Math.RandomInt(0,chances);
9808
9809 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9810 {
9812 }
9813 }
9814 }
9815 }
9816
9818 {
9819 if (GetInventory().GetCargo())
9820 {
9821 int item_count = GetInventory().GetCargo().GetItemCount();
9822 if (item_count > 0)
9823 {
9824 int random_pick = Math.RandomInt(0, item_count);
9826 if (!item.IsExplosive())
9827 {
9828 item.AddHealth("","",damage);
9829 return true;
9830 }
9831 }
9832 }
9833 return false;
9834 }
9835
9837 {
9838 int attachment_count = GetInventory().AttachmentCount();
9839 if (attachment_count > 0)
9840 {
9841 int random_pick = Math.RandomInt(0, attachment_count);
9842 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9843 if (!attachment.IsExplosive())
9844 {
9845 attachment.AddHealth("","",damage);
9846 return true;
9847 }
9848 }
9849 return false;
9850 }
9851
9853 {
9855 }
9856
9858 {
9860 return GetInventory().CanRemoveEntity();
9861
9862 return false;
9863 }
9864
9866 {
9868 return;
9869
9871 {
9872 if (ScriptInputUserData.CanStoreInputUserData())
9873 {
9874 ScriptInputUserData ctx = new ScriptInputUserData;
9879 ctx.
Write(destination_entity);
9883 }
9884 }
9885 else if (!
GetGame().IsMultiplayer())
9886 {
9888 }
9889 }
9890
9892 {
9894 return;
9895
9896 float split_quantity_new;
9900 InventoryLocation loc = new InventoryLocation;
9901
9902 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9903 {
9905 split_quantity_new = stack_max;
9906 else
9908
9909 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9910 if (new_item)
9911 {
9912 new_item.SetResultOfSplit(true);
9913 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9915 new_item.SetQuantity(split_quantity_new);
9916 }
9917 }
9918 else if (destination_entity && slot_id == -1)
9919 {
9920 if (quantity > stack_max)
9921 split_quantity_new = stack_max;
9922 else
9923 split_quantity_new = quantity;
9924
9926 {
9929 }
9930
9931 if (new_item)
9932 {
9933 new_item.SetResultOfSplit(true);
9934 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9936 new_item.SetQuantity(split_quantity_new);
9937 }
9938 }
9939 else
9940 {
9941 if (stack_max != 0)
9942 {
9944 {
9946 }
9947
9948 if (split_quantity_new == 0)
9949 {
9950 if (!
GetGame().IsMultiplayer())
9951 player.PhysicalPredictiveDropItem(this);
9952 else
9953 player.ServerDropEntity(this);
9954 return;
9955 }
9956
9958
9959 if (new_item)
9960 {
9961 new_item.SetResultOfSplit(true);
9962 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9964 new_item.SetQuantity(stack_max);
9965 new_item.PlaceOnSurface();
9966 }
9967 }
9968 }
9969 }
9970
9972 {
9974 return;
9975
9976 float split_quantity_new;
9980 InventoryLocation loc = new InventoryLocation;
9981
9982 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9983 {
9985 split_quantity_new = stack_max;
9986 else
9988
9989 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9990 if (new_item)
9991 {
9992 new_item.SetResultOfSplit(true);
9993 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9995 new_item.SetQuantity(split_quantity_new);
9996 }
9997 }
9998 else if (destination_entity && slot_id == -1)
9999 {
10000 if (quantity > stack_max)
10001 split_quantity_new = stack_max;
10002 else
10003 split_quantity_new = quantity;
10004
10006 {
10009 }
10010
10011 if (new_item)
10012 {
10013 new_item.SetResultOfSplit(true);
10014 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10016 new_item.SetQuantity(split_quantity_new);
10017 }
10018 }
10019 else
10020 {
10021 if (stack_max != 0)
10022 {
10024 {
10026 }
10027
10029
10030 if (new_item)
10031 {
10032 new_item.SetResultOfSplit(true);
10033 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10035 new_item.SetQuantity(stack_max);
10036 new_item.PlaceOnSurface();
10037 }
10038 }
10039 }
10040 }
10041
10043 {
10045 return;
10046
10048 {
10049 if (ScriptInputUserData.CanStoreInputUserData())
10050 {
10051 ScriptInputUserData ctx = new ScriptInputUserData;
10056 dst.WriteToContext(ctx);
10058 }
10059 }
10060 else if (!
GetGame().IsMultiplayer())
10061 {
10063 }
10064 }
10065
10067 {
10069 return;
10070
10072 {
10073 if (ScriptInputUserData.CanStoreInputUserData())
10074 {
10075 ScriptInputUserData ctx = new ScriptInputUserData;
10080 ctx.
Write(destination_entity);
10086 }
10087 }
10088 else if (!
GetGame().IsMultiplayer())
10089 {
10091 }
10092 }
10093
10095 {
10097 }
10098
10100 {
10102 return this;
10103
10105 float split_quantity_new;
10107 if (dst.IsValid())
10108 {
10109 int slot_id = dst.GetSlot();
10111
10112 if (quantity > stack_max)
10113 split_quantity_new = stack_max;
10114 else
10115 split_quantity_new = quantity;
10116
10118
10119 if (new_item)
10120 {
10121 new_item.SetResultOfSplit(true);
10122 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10125 }
10126
10127 return new_item;
10128 }
10129
10130 return null;
10131 }
10132
10134 {
10136 return;
10137
10139 float split_quantity_new;
10141 if (destination_entity)
10142 {
10144 if (quantity > stackable)
10145 split_quantity_new = stackable;
10146 else
10147 split_quantity_new = quantity;
10148
10149 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10150 if (new_item)
10151 {
10152 new_item.SetResultOfSplit(true);
10153 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10155 new_item.SetQuantity(split_quantity_new);
10156 }
10157 }
10158 }
10159
10161 {
10163 return;
10164
10166 {
10167 if (ScriptInputUserData.CanStoreInputUserData())
10168 {
10169 ScriptInputUserData ctx = new ScriptInputUserData;
10174 ItemBase destination_entity =
this;
10175 ctx.
Write(destination_entity);
10179 }
10180 }
10181 else if (!
GetGame().IsMultiplayer())
10182 {
10184 }
10185 }
10186
10188 {
10190 return;
10191
10193 float split_quantity_new;
10195 if (player)
10196 {
10198 if (quantity > stackable)
10199 split_quantity_new = stackable;
10200 else
10201 split_quantity_new = quantity;
10202
10203 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10204 new_item =
ItemBase.Cast(in_hands);
10205 if (new_item)
10206 {
10207 new_item.SetResultOfSplit(true);
10208 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10210 new_item.SetQuantity(split_quantity_new);
10211 }
10212 }
10213 }
10214
10216 {
10218 return;
10219
10221 float split_quantity_new = Math.Floor(quantity * 0.5);
10222
10224
10225 if (new_item)
10226 {
10227 if (new_item.GetQuantityMax() < split_quantity_new)
10228 {
10229 split_quantity_new = new_item.GetQuantityMax();
10230 }
10231
10232 new_item.SetResultOfSplit(true);
10233 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10234
10236 {
10239 }
10240 else
10241 {
10244 }
10245 }
10246 }
10247
10249 {
10251 return;
10252
10254 float split_quantity_new = Math.Floor(quantity / 2);
10255
10256 InventoryLocation invloc = new InventoryLocation;
10258
10260 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10261
10262 if (new_item)
10263 {
10264 if (new_item.GetQuantityMax() < split_quantity_new)
10265 {
10266 split_quantity_new = new_item.GetQuantityMax();
10267 }
10269 {
10272 }
10273 else
10274 {
10277 }
10278 }
10279 }
10280
10283 {
10284 SetWeightDirty();
10286
10287 if (parent)
10288 parent.OnAttachmentQuantityChangedEx(this, delta);
10289
10291 {
10293 {
10295 }
10297 {
10298 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10300 }
10301 }
10302
10303 }
10304
10307 {
10308
10309 }
10310
10313 {
10315 }
10316
10318 {
10319 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10320
10322 {
10323 if (newLevel == GameConstants.STATE_RUINED)
10324 {
10326 EntityAI parent = GetHierarchyParent();
10327 if (parent && parent.IsFireplace())
10328 {
10329 CargoBase cargo = GetInventory().GetCargo();
10330 if (cargo)
10331 {
10333 {
10335 }
10336 }
10337 }
10338 }
10339
10341 {
10342
10344 return;
10345 }
10346
10347 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10348 {
10350 }
10351 }
10352 }
10353
10354
10356 {
10357 super.OnRightClick();
10358
10360 {
10362 {
10363 if (ScriptInputUserData.CanStoreInputUserData())
10364 {
10365 vector m4[4];
10367
10368 EntityAI root = GetHierarchyRoot();
10369
10370 InventoryLocation dst = new InventoryLocation;
10372 {
10373 if (root)
10374 {
10375 root.GetTransform(m4);
10377 }
10378 else
10379 GetInventory().GetCurrentInventoryLocation(dst);
10380 }
10381 else
10382 {
10384
10385
10386 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10387 {
10388 if (root)
10389 {
10390 root.GetTransform(m4);
10392 }
10393 else
10394 GetInventory().GetCurrentInventoryLocation(dst);
10395 }
10396 else
10397 {
10398 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10399 }
10400 }
10401
10402 ScriptInputUserData ctx = new ScriptInputUserData;
10410 }
10411 }
10412 else if (!
GetGame().IsMultiplayer())
10413 {
10415 }
10416 }
10417 }
10418
10419 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10420 {
10421
10422 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10423 return false;
10424
10425 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10426 return false;
10427
10428
10430 return false;
10431
10432
10433 Magazine mag = Magazine.Cast(this);
10434 if (mag)
10435 {
10436 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10437 return false;
10438
10439 if (stack_max_limit)
10440 {
10441 Magazine other_mag = Magazine.Cast(other_item);
10442 if (other_item)
10443 {
10444 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10445 return false;
10446 }
10447
10448 }
10449 }
10450 else
10451 {
10452
10454 return false;
10455
10457 return false;
10458 }
10459
10460 PlayerBase player = null;
10461 if (CastTo(player, GetHierarchyRootPlayer()))
10462 {
10463 if (player.GetInventory().HasAttachment(this))
10464 return false;
10465
10466 if (player.IsItemsToDelete())
10467 return false;
10468 }
10469
10470 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10471 return false;
10472
10473 int slotID;
10475 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10476 return false;
10477
10478 return true;
10479 }
10480
10482 {
10484 }
10485
10487 {
10488 return m_IsResultOfSplit;
10489 }
10490
10492 {
10493 m_IsResultOfSplit = value;
10494 }
10495
10497 {
10499 }
10500
10502 {
10503 float other_item_quantity = other_item.GetQuantity();
10504 float this_free_space;
10505
10507
10509
10510 if (other_item_quantity > this_free_space)
10511 {
10512 return this_free_space;
10513 }
10514 else
10515 {
10516 return other_item_quantity;
10517 }
10518 }
10519
10521 {
10523 }
10524
10526 {
10528 return;
10529
10530 if (!IsMagazine() && other_item)
10531 {
10533 if (quantity_used != 0)
10534 {
10535 float hp1 = GetHealth01("","");
10536 float hp2 = other_item.GetHealth01("","");
10537 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10538 hpResult = hpResult / (
GetQuantity() + quantity_used);
10539
10540 hpResult *= GetMaxHealth();
10541 Math.Round(hpResult);
10542 SetHealth("", "Health", hpResult);
10543
10545 other_item.AddQuantity(-quantity_used);
10546 }
10547 }
10549 }
10550
10552 {
10553 #ifdef SERVER
10554 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10555 GetHierarchyParent().IncreaseLifetimeUp();
10556 #endif
10557 };
10558
10560 {
10561 PlayerBase p = PlayerBase.Cast(player);
10562
10563 array<int> recipesIds = p.m_Recipes;
10564 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10565 if (moduleRecipesManager)
10566 {
10567 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10568 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10569 }
10570
10571 for (int i = 0;i < recipesIds.Count(); i++)
10572 {
10573 int key = recipesIds.Get(i);
10574 string recipeName = moduleRecipesManager.GetRecipeName(key);
10576 }
10577 }
10578
10579
10580 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10581 {
10582 super.GetDebugActions(outputList);
10583
10584
10589
10590
10594
10598
10599
10602
10603
10605 {
10608 }
10609
10611
10614
10618 }
10619
10620
10621
10622
10624 {
10625 super.OnAction(action_id, player, ctx);
10626 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10627 {
10628 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10629 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10630 PlayerBase p = PlayerBase.Cast(player);
10631 if (
EActions.RECIPES_RANGE_START < 1000)
10632 {
10633 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10634 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10635 }
10636 }
10637 #ifndef SERVER
10638 else if (action_id ==
EActions.WATCH_PLAYER)
10639 {
10640 PluginDeveloper.SetDeveloperItemClientEx(player);
10641 }
10642 #endif
10644 {
10645 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10646 {
10647 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10648 OnDebugButtonPressServer(id + 1);
10649 }
10650
10651 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10652 {
10653 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10655 }
10656
10657 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10658 {
10659 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10661 }
10662
10663 else if (action_id ==
EActions.ADD_QUANTITY)
10664 {
10665 if (IsMagazine())
10666 {
10667 Magazine mag = Magazine.Cast(this);
10668 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10669 }
10670 else
10671 {
10673 }
10674
10675 if (m_EM)
10676 {
10677 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10678 }
10679
10680 }
10681
10682 else if (action_id ==
EActions.REMOVE_QUANTITY)
10683 {
10684 if (IsMagazine())
10685 {
10686 Magazine mag2 = Magazine.Cast(this);
10687 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10688 }
10689 else
10690 {
10692 }
10693 if (m_EM)
10694 {
10695 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10696 }
10697
10698 }
10699
10700 else if (action_id ==
EActions.SET_QUANTITY_0)
10701 {
10703
10704 if (m_EM)
10705 {
10706 m_EM.SetEnergy(0);
10707 }
10708 }
10709
10710 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10711 {
10713
10714 if (m_EM)
10715 {
10716 m_EM.SetEnergy(m_EM.GetEnergyMax());
10717 }
10718 }
10719
10720 else if (action_id ==
EActions.ADD_HEALTH)
10721 {
10722 AddHealth("","",GetMaxHealth("","Health")/5);
10723 }
10724 else if (action_id ==
EActions.REMOVE_HEALTH)
10725 {
10726 AddHealth("","",-GetMaxHealth("","Health")/5);
10727 }
10728 else if (action_id ==
EActions.DESTROY_HEALTH)
10729 {
10730 SetHealth01("","",0);
10731 }
10732 else if (action_id ==
EActions.WATCH_ITEM)
10733 {
10735 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10736 #ifdef DEVELOPER
10737 SetDebugDeveloper_item(this);
10738 #endif
10739 }
10740
10741 else if (action_id ==
EActions.ADD_TEMPERATURE)
10742 {
10743 AddTemperature(20);
10744
10745 }
10746
10747 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10748 {
10749 AddTemperature(-20);
10750
10751 }
10752
10753 else if (action_id ==
EActions.FLIP_FROZEN)
10754 {
10755 SetFrozen(!GetIsFrozen());
10756
10757 }
10758
10759 else if (action_id ==
EActions.ADD_WETNESS)
10760 {
10762
10763 }
10764
10765 else if (action_id ==
EActions.REMOVE_WETNESS)
10766 {
10768
10769 }
10770
10771 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10772 {
10775
10776
10777 }
10778
10779 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10780 {
10783 }
10784
10785 else if (action_id ==
EActions.MAKE_SPECIAL)
10786 {
10787 auto debugParams = DebugSpawnParams.WithPlayer(player);
10788 OnDebugSpawnEx(debugParams);
10789 }
10790
10791 else if (action_id ==
EActions.DELETE)
10792 {
10793 Delete();
10794 }
10795
10796 }
10797
10798
10799 return false;
10800 }
10801
10802
10803
10804
10808
10811
10812
10813
10815 {
10816 return false;
10817 }
10818
10819
10821 {
10822 return true;
10823 }
10824
10825
10827 {
10828 return true;
10829 }
10830
10831
10832
10834 {
10835 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10837 }
10838
10841 {
10842 return null;
10843 }
10844
10846 {
10847 return false;
10848 }
10849
10851 {
10852 return false;
10853 }
10854
10858
10859
10861 {
10862 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10863 return module_repairing.CanRepair(this, item_repair_kit);
10864 }
10865
10866
10867 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10868 {
10869 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10870 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10871 }
10872
10873
10875 {
10876
10877
10878
10879
10880
10881
10882
10883
10884 return 1;
10885 }
10886
10887
10888
10890 {
10892 }
10893
10894
10895
10897 {
10899 }
10900
10901
10910 {
10911 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10912
10913 if (player)
10914 {
10915 player.MessageStatus(text);
10916 }
10917 }
10918
10919
10928 {
10929 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10930
10931 if (player)
10932 {
10933 player.MessageAction(text);
10934 }
10935 }
10936
10937
10946 {
10947 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10948
10949 if (player)
10950 {
10951 player.MessageFriendly(text);
10952 }
10953 }
10954
10955
10964 {
10965 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10966
10967 if (player)
10968 {
10969 player.MessageImportant(text);
10970 }
10971 }
10972
10974 {
10975 return true;
10976 }
10977
10978
10979 override bool KindOf(
string tag)
10980 {
10981 bool found = false;
10982 string item_name = this.
GetType();
10985
10986 int array_size = item_tag_array.Count();
10987 for (int i = 0; i < array_size; i++)
10988 {
10989 if (item_tag_array.Get(i) == tag)
10990 {
10991 found = true;
10992 break;
10993 }
10994 }
10995 return found;
10996 }
10997
10998
11000 {
11001
11002 super.OnRPC(sender, rpc_type,ctx);
11003
11004
11005 switch (rpc_type)
11006 {
11007 #ifndef SERVER
11008 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11009 Param2<bool, string> p = new Param2<bool, string>(false, "");
11010
11012 return;
11013
11014 bool play = p.param1;
11015 string soundSet = p.param2;
11016
11017 if (play)
11018 {
11020 {
11022 {
11024 }
11025 }
11026 else
11027 {
11029 }
11030 }
11031 else
11032 {
11034 }
11035
11036 break;
11037 #endif
11038
11039 }
11040
11042 {
11044 }
11045 }
11046
11047
11048
11049
11051 {
11052 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11053 return plugin.GetID(
name);
11054 }
11055
11057 {
11058 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11059 return plugin.GetName(id);
11060 }
11061
11064 {
11065
11066
11067 int varFlags;
11068 if (!ctx.
Read(varFlags))
11069 return;
11070
11071 if (varFlags & ItemVariableFlags.FLOAT)
11072 {
11074 }
11075 }
11076
11078 {
11079
11080 super.SerializeNumericalVars(floats_out);
11081
11082
11083
11085 {
11087 }
11088
11090 {
11092 }
11093
11095 {
11097 }
11098
11100 {
11105 }
11106
11108 {
11110 }
11111 }
11112
11114 {
11115
11116 super.DeSerializeNumericalVars(floats);
11117
11118
11119 int index = 0;
11120 int mask = Math.Round(floats.Get(index));
11121
11122 index++;
11123
11125 {
11127 {
11129 }
11130 else
11131 {
11132 float quantity = floats.Get(index);
11133 SetQuantity(quantity,
true,
false,
false,
false);
11134 }
11135 index++;
11136 }
11137
11139 {
11140 float wet = floats.Get(index);
11142 index++;
11143 }
11144
11146 {
11147 int liquidtype = Math.Round(floats.Get(index));
11149 index++;
11150 }
11151
11153 {
11155 index++;
11157 index++;
11159 index++;
11161 index++;
11162 }
11163
11165 {
11166 int cleanness = Math.Round(floats.Get(index));
11168 index++;
11169 }
11170 }
11171
11173 {
11174 super.WriteVarsToCTX(ctx);
11175
11176
11178 {
11180 }
11181
11183 {
11185 }
11186
11188 {
11190 }
11191
11193 {
11194 int r,g,b,a;
11200 }
11201
11203 {
11205 }
11206 }
11207
11209 {
11210 if (!super.ReadVarsFromCTX(ctx,version))
11211 return false;
11212
11213 int intValue;
11214 float value;
11215
11216 if (version < 140)
11217 {
11218 if (!ctx.
Read(intValue))
11219 return false;
11220
11221 m_VariablesMask = intValue;
11222 }
11223
11225 {
11226 if (!ctx.
Read(value))
11227 return false;
11228
11230 {
11232 }
11233 else
11234 {
11236 }
11237 }
11238
11239 if (version < 140)
11240 {
11242 {
11243 if (!ctx.
Read(value))
11244 return false;
11245 SetTemperatureDirect(value);
11246 }
11247 }
11248
11250 {
11251 if (!ctx.
Read(value))
11252 return false;
11254 }
11255
11257 {
11258 if (!ctx.
Read(intValue))
11259 return false;
11261 }
11262
11264 {
11265 int r,g,b,a;
11267 return false;
11269 return false;
11271 return false;
11273 return false;
11274
11276 }
11277
11279 {
11280 if (!ctx.
Read(intValue))
11281 return false;
11283 }
11284
11285 if (version >= 138 && version < 140)
11286 {
11288 {
11289 if (!ctx.
Read(intValue))
11290 return false;
11291 SetFrozen(intValue);
11292 }
11293 }
11294
11295 return true;
11296 }
11297
11298
11300 {
11303 {
11305 }
11306
11307 if (!super.OnStoreLoad(ctx, version))
11308 {
11310 return false;
11311 }
11312
11313 if (version >= 114)
11314 {
11315 bool hasQuickBarIndexSaved;
11316
11317 if (!ctx.
Read(hasQuickBarIndexSaved))
11318 {
11320 return false;
11321 }
11322
11323 if (hasQuickBarIndexSaved)
11324 {
11325 int itmQBIndex;
11326
11327
11328 if (!ctx.
Read(itmQBIndex))
11329 {
11331 return false;
11332 }
11333
11334 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11335 if (itmQBIndex != -1 && parentPlayer)
11336 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11337 }
11338 }
11339 else
11340 {
11341
11342 PlayerBase player;
11343 int itemQBIndex;
11344 if (version ==
int.
MAX)
11345 {
11346 if (!ctx.
Read(itemQBIndex))
11347 {
11349 return false;
11350 }
11351 }
11352 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11353 {
11354
11355 if (!ctx.
Read(itemQBIndex))
11356 {
11358 return false;
11359 }
11360 if (itemQBIndex != -1 && player)
11361 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11362 }
11363 }
11364
11365 if (version < 140)
11366 {
11367
11368 if (!LoadVariables(ctx, version))
11369 {
11371 return false;
11372 }
11373 }
11374
11375
11377 {
11379 return false;
11380 }
11381 if (version >= 132)
11382 {
11384 if (raib)
11385 {
11387 {
11389 return false;
11390 }
11391 }
11392 }
11393
11395 return true;
11396 }
11397
11398
11399
11401 {
11402 super.OnStoreSave(ctx);
11403
11404 PlayerBase player;
11405 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11406 {
11408
11409 int itemQBIndex = -1;
11410 itemQBIndex = player.FindQuickBarEntityIndex(this);
11411 ctx.
Write(itemQBIndex);
11412 }
11413 else
11414 {
11416 }
11417
11419
11421 if (raib)
11422 {
11424 }
11425 }
11426
11427
11429 {
11430 super.AfterStoreLoad();
11431
11433 {
11435 }
11436
11438 {
11441 }
11442 }
11443
11445 {
11446 super.EEOnAfterLoad();
11447
11449 {
11451 }
11452
11455 }
11456
11458 {
11459 return false;
11460 }
11461
11462
11463
11465 {
11467 {
11468 #ifdef PLATFORM_CONSOLE
11469
11471 {
11473 if (menu)
11474 {
11476 }
11477 }
11478 #endif
11479 }
11480
11482 {
11485 }
11486
11488 {
11489 SetWeightDirty();
11491 }
11493 {
11496 }
11497
11499 {
11502 }
11504 {
11507 }
11508
11509 super.OnVariablesSynchronized();
11510 }
11511
11512
11513
11515 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11516 {
11517 if (!IsServerCheck(allow_client))
11518 return false;
11519
11521 return false;
11522
11525
11526 if (value <= (min + 0.001))
11527 value = min;
11528
11529 if (value == min)
11530 {
11531 if (destroy_config)
11532 {
11533 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11534 if (dstr)
11535 {
11537 this.Delete();
11538 return true;
11539 }
11540 }
11541 else if (destroy_forced)
11542 {
11544 this.Delete();
11545 return true;
11546 }
11547
11549 }
11550
11553
11555 {
11557
11558 if (delta)
11560 }
11561
11563
11564 return false;
11565 }
11566
11567
11569 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11570 {
11572 }
11573
11575 {
11578 }
11579
11581 {
11584 }
11585
11588 {
11589 float value_clamped = Math.Clamp(value, 0, 1);
11591 SetQuantity(result, destroy_config, destroy_forced);
11592 }
11593
11594
11597 {
11599 }
11600
11602 {
11604 }
11605
11606
11607
11608
11609
11610
11611
11612
11613
11614
11616 {
11617 int slot = -1;
11618 if (GetInventory())
11619 {
11620 InventoryLocation il = new InventoryLocation;
11621 GetInventory().GetCurrentInventoryLocation(il);
11623 }
11624
11626 }
11627
11629 {
11630 float quantity_max = 0;
11631
11633 {
11634 if (attSlotID != -1)
11635 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11636
11637 if (quantity_max <= 0)
11639 }
11640
11641 if (quantity_max <= 0)
11643
11644 return quantity_max;
11645 }
11646
11648 {
11650 }
11651
11653 {
11655 }
11656
11657
11659 {
11661 }
11662
11664 {
11666 }
11667
11669 {
11671 }
11672
11673
11675 {
11676
11677 float weightEx = GetWeightEx();
11678 float special = GetInventoryAndCargoWeight();
11679 return weightEx - special;
11680 }
11681
11682
11684 {
11686 }
11687
11689 {
11691 {
11692 #ifdef DEVELOPER
11693 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11694 {
11695 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11697 }
11698 #endif
11699
11700 return GetQuantity() * GetConfigWeightModified();
11701 }
11702 else if (HasEnergyManager())
11703 {
11704 #ifdef DEVELOPER
11705 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11706 {
11707 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11708 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11709 }
11710 #endif
11711 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11712 }
11713 else
11714 {
11715 #ifdef DEVELOPER
11716 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11717 {
11718 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11719 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11720 }
11721 #endif
11722 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11723 }
11724 }
11725
11728 {
11729 int item_count = 0;
11731
11732 if (GetInventory().GetCargo() != NULL)
11733 {
11734 item_count = GetInventory().GetCargo().GetItemCount();
11735 }
11736
11737 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11738 {
11739 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11740 if (item)
11741 item_count += item.GetNumberOfItems();
11742 }
11743 return item_count;
11744 }
11745
11748 {
11749 float weight = 0;
11750 float wetness = 1;
11751 if (include_wetness)
11754 {
11755 weight = wetness * m_ConfigWeight;
11756 }
11758 {
11759 weight = 1;
11760 }
11761 return weight;
11762 }
11763
11764
11765
11767 {
11768 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11769 {
11770 GameInventory inv = GetInventory();
11771 array<EntityAI> items = new array<EntityAI>;
11773 for (int i = 0; i < items.Count(); i++)
11774 {
11776 if (item)
11777 {
11779 }
11780 }
11781 }
11782 }
11783
11784
11785
11786
11788 {
11789 float energy = 0;
11790 if (HasEnergyManager())
11791 {
11792 energy = GetCompEM().GetEnergy();
11793 }
11794 return energy;
11795 }
11796
11797
11799 {
11800 super.OnEnergyConsumed();
11801
11803 }
11804
11806 {
11807 super.OnEnergyAdded();
11808
11810 }
11811
11812
11814 {
11815 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11816 {
11818 {
11819 float energy_0to1 = GetCompEM().GetEnergy0To1();
11821 }
11822 }
11823 }
11824
11825
11827 {
11828 return ConfigGetFloat("heatIsolation");
11829 }
11830
11832 {
11834 }
11835
11837 {
11838 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11839 if (
GetGame().ConfigIsExisting(paramPath))
11841
11842 return 0.0;
11843 }
11844
11846 {
11847 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11848 if (
GetGame().ConfigIsExisting(paramPath))
11850
11851 return 0.0;
11852 }
11853
11854 override void SetWet(
float value,
bool allow_client =
false)
11855 {
11856 if (!IsServerCheck(allow_client))
11857 return;
11858
11861
11863
11864 m_VarWet = Math.Clamp(value, min, max);
11865
11867 {
11870 }
11871 }
11872
11873 override void AddWet(
float value)
11874 {
11876 }
11877
11879 {
11881 }
11882
11884 {
11886 }
11887
11889 {
11891 }
11892
11894 {
11896 }
11897
11899 {
11901 }
11902
11903 override void OnWetChanged(
float newVal,
float oldVal)
11904 {
11907 if (newLevel != oldLevel)
11908 {
11910 }
11911 }
11912
11914 {
11915 SetWeightDirty();
11916 }
11917
11919 {
11920 return GetWetLevelInternal(
m_VarWet);
11921 }
11922
11923
11924
11926 {
11928 }
11929
11931 {
11933 }
11934
11936 {
11938 }
11939
11941 {
11943 }
11944
11945
11946
11948 {
11949 if (ConfigIsExisting("itemModelLength"))
11950 {
11951 return ConfigGetFloat("itemModelLength");
11952 }
11953 return 0;
11954 }
11955
11957 {
11958 if (ConfigIsExisting("itemAttachOffset"))
11959 {
11960 return ConfigGetFloat("itemAttachOffset");
11961 }
11962 return 0;
11963 }
11964
11965 override void SetCleanness(
int value,
bool allow_client =
false)
11966 {
11967 if (!IsServerCheck(allow_client))
11968 return;
11969
11971
11973
11976 }
11977
11979 {
11981 }
11982
11984 {
11985 return true;
11986 }
11987
11988
11989
11990
11992 {
11994 }
11995
11997 {
11999 }
12000
12001
12002
12003
12004 override void SetColor(
int r,
int g,
int b,
int a)
12005 {
12011 }
12013 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12014 {
12019 }
12020
12022 {
12024 }
12025
12028 {
12029 int r,g,b,a;
12031 r = r/255;
12032 g = g/255;
12033 b = b/255;
12034 a = a/255;
12035 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12036 }
12037
12038
12039
12040 override void SetLiquidType(
int value,
bool allow_client =
false)
12041 {
12042 if (!IsServerCheck(allow_client))
12043 return;
12044
12049 }
12050
12052 {
12053 return ConfigGetInt("varLiquidTypeInit");
12054 }
12055
12057 {
12059 }
12060
12062 {
12064 SetFrozen(false);
12065 }
12066
12069 {
12070 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12071 }
12072
12073
12076 {
12077 PlayerBase nplayer;
12078 if (PlayerBase.CastTo(nplayer, player))
12079 {
12081
12082 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12083 }
12084 }
12085
12086
12089 {
12090 PlayerBase nplayer;
12091 if (PlayerBase.CastTo(nplayer,player))
12092 {
12093
12094 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12095
12096 }
12097
12098
12099 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12100
12101
12102 if (HasEnergyManager())
12103 {
12104 GetCompEM().UpdatePlugState();
12105 }
12106 }
12107
12108
12110 {
12111 super.OnPlacementStarted(player);
12112
12114 }
12115
12116 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12117 {
12119 {
12120 m_AdminLog.OnPlacementComplete(player,
this);
12121 }
12122
12123 super.OnPlacementComplete(player, position, orientation);
12124 }
12125
12126
12127
12128
12129
12131 {
12133 {
12134 return true;
12135 }
12136 else
12137 {
12138 return false;
12139 }
12140 }
12141
12142
12144 {
12146 {
12148 }
12149 }
12150
12151
12153 {
12155 }
12156
12158 {
12160 }
12161
12162 override void InsertAgent(
int agent,
float count = 1)
12163 {
12164 if (count < 1)
12165 return;
12166
12168 }
12169
12172 {
12174 }
12175
12176
12178 {
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
12222
12224 {
12226 return false;
12227 return true;
12228 }
12229
12231 {
12232
12234 }
12235
12236
12239 {
12240 super.CheckForRoofLimited(timeTresholdMS);
12241
12243 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12244 {
12245 m_PreviousRoofTestTime = time;
12246 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12247 }
12248 }
12249
12250
12252 {
12254 {
12255 return 0;
12256 }
12257
12258 if (GetInventory().GetAttachmentSlotsCount() != 0)
12259 {
12260 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12261 if (filter)
12262 return filter.GetProtectionLevel(type, false, system);
12263 else
12264 return 0;
12265 }
12266
12267 string subclassPath, entryName;
12268
12269 switch (type)
12270 {
12272 entryName = "biological";
12273 break;
12275 entryName = "chemical";
12276 break;
12277 default:
12278 entryName = "biological";
12279 break;
12280 }
12281
12282 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12283
12285 }
12286
12287
12288
12291 {
12292 if (!IsMagazine())
12294
12296 }
12297
12298
12299
12300
12301
12306 {
12307 return true;
12308 }
12309
12311 {
12313 }
12314
12315
12316
12317
12318
12320 {
12321 if (parent)
12322 {
12323 if (parent.IsInherited(DayZInfected))
12324 return true;
12325
12326 if (!parent.IsRuined())
12327 return true;
12328 }
12329
12330 return true;
12331 }
12332
12334 {
12335 if (!super.CanPutAsAttachment(parent))
12336 {
12337 return false;
12338 }
12339
12340 if (!IsRuined() && !parent.IsRuined())
12341 {
12342 return true;
12343 }
12344
12345 return false;
12346 }
12347
12349 {
12350
12351
12352
12353
12354 return super.CanReceiveItemIntoCargo(item);
12355 }
12356
12358 {
12359
12360
12361
12362
12363 GameInventory attachmentInv = attachment.GetInventory();
12365 {
12366 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12367 return false;
12368 }
12369
12370 InventoryLocation loc = new InventoryLocation();
12371 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12372 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12373 return false;
12374
12375 return super.CanReceiveAttachment(attachment, slotId);
12376 }
12377
12379 {
12380 if (!super.CanReleaseAttachment(attachment))
12381 return false;
12382
12383 return GetInventory().AreChildrenAccessible();
12384 }
12385
12386
12387
12388
12389
12390
12391
12392
12393
12394
12395
12396
12397
12398
12399
12400
12401
12402
12403
12404
12405
12407 {
12408 int id = muzzle_owner.GetMuzzleID();
12409 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12410
12411 if (WPOF_array)
12412 {
12413 for (int i = 0; i < WPOF_array.Count(); i++)
12414 {
12415 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12416
12417 if (WPOF)
12418 {
12419 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12420 }
12421 }
12422 }
12423 }
12424
12425
12427 {
12428 int id = muzzle_owner.GetMuzzleID();
12430
12431 if (WPOBE_array)
12432 {
12433 for (int i = 0; i < WPOBE_array.Count(); i++)
12434 {
12435 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12436
12437 if (WPOBE)
12438 {
12439 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12440 }
12441 }
12442 }
12443 }
12444
12445
12447 {
12448 int id = muzzle_owner.GetMuzzleID();
12449 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12450
12451 if (WPOOH_array)
12452 {
12453 for (int i = 0; i < WPOOH_array.Count(); i++)
12454 {
12455 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12456
12457 if (WPOOH)
12458 {
12459 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12460 }
12461 }
12462 }
12463 }
12464
12465
12467 {
12468 int id = muzzle_owner.GetMuzzleID();
12469 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12470
12471 if (WPOOH_array)
12472 {
12473 for (int i = 0; i < WPOOH_array.Count(); i++)
12474 {
12475 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12476
12477 if (WPOOH)
12478 {
12479 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12480 }
12481 }
12482 }
12483 }
12484
12485
12487 {
12488 int id = muzzle_owner.GetMuzzleID();
12489 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12490
12491 if (WPOOH_array)
12492 {
12493 for (int i = 0; i < WPOOH_array.Count(); i++)
12494 {
12495 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12496
12497 if (WPOOH)
12498 {
12499 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12500 }
12501 }
12502 }
12503 }
12504
12505
12506
12508 {
12510 {
12511 return true;
12512 }
12513
12514 return false;
12515 }
12516
12518 {
12520 {
12521 return true;
12522 }
12523
12524 return false;
12525 }
12526
12528 {
12530 {
12531 return true;
12532 }
12533
12534 return false;
12535 }
12536
12538 {
12539 return false;
12540 }
12541
12544 {
12545 return UATimeSpent.DEFAULT_DEPLOY;
12546 }
12547
12548
12549
12550
12552 {
12554 SetSynchDirty();
12555 }
12556
12558 {
12560 }
12561
12562
12564 {
12565 return false;
12566 }
12567
12570 {
12571 string att_type = "None";
12572
12573 if (ConfigIsExisting("soundAttType"))
12574 {
12575 att_type = ConfigGetString("soundAttType");
12576 }
12577
12579 }
12580
12582 {
12584 }
12585
12586
12587
12588
12589
12593
12595 {
12598
12600 }
12601
12602
12604 {
12606 return;
12607
12609
12612
12615
12616 SoundParameters params = new SoundParameters();
12620 }
12621
12622
12624 {
12626 return;
12627
12629 SetSynchDirty();
12630
12633 }
12634
12635
12637 {
12639 return;
12640
12642 SetSynchDirty();
12643
12646 }
12647
12649 {
12651 }
12652
12654 {
12656 }
12657
12660 {
12661 if (!
GetGame().IsDedicatedServer())
12662 {
12663 if (ConfigIsExisting("attachSoundSet"))
12664 {
12665 string cfg_path = "";
12666 string soundset = "";
12667 string type_name =
GetType();
12668
12671 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12672 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12673
12674 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12675 {
12676 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12677 {
12678 if (cfg_slot_array[i] == slot_type)
12679 {
12680 soundset = cfg_soundset_array[i];
12681 break;
12682 }
12683 }
12684 }
12685
12686 if (soundset != "")
12687 {
12688 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12690 }
12691 }
12692 }
12693 }
12694
12696 {
12697
12698 }
12699
12700 void OnApply(PlayerBase player);
12701
12703 {
12704 return 1.0;
12705 };
12706
12708 {
12710 }
12711
12713 {
12715 }
12716
12718
12720 {
12721 SetDynamicPhysicsLifeTime(0.01);
12723 }
12724
12726 {
12727 array<string> zone_names = new array<string>;
12728 GetDamageZones(zone_names);
12729 for (int i = 0; i < zone_names.Count(); i++)
12730 {
12731 SetHealthMax(zone_names.Get(i),"Health");
12732 }
12733 SetHealthMax("","Health");
12734 }
12735
12738 {
12739 float global_health = GetHealth01("","Health");
12740 array<string> zones = new array<string>;
12741 GetDamageZones(zones);
12742
12743 for (int i = 0; i < zones.Count(); i++)
12744 {
12745 SetHealth01(zones.Get(i),"Health",global_health);
12746 }
12747 }
12748
12751 {
12752 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12753 }
12754
12756 {
12757 if (!hasRootAsPlayer)
12758 {
12759 if (refParentIB)
12760 {
12761
12762 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12763 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12764
12765 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12766 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12767
12770 }
12771 else
12772 {
12773
12776 }
12777 }
12778 }
12779
12781 {
12783 {
12784 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12785 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12786 {
12787 float heatPermCoef = 1.0;
12789 while (ent)
12790 {
12791 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12792 ent = ent.GetHierarchyParent();
12793 }
12794
12795 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12796 }
12797 }
12798 }
12799
12801 {
12802
12803 EntityAI parent = GetHierarchyParent();
12804 if (!parent)
12805 {
12806 hasParent = false;
12807 hasRootAsPlayer = false;
12808 }
12809 else
12810 {
12811 hasParent = true;
12812 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12813 refParentIB =
ItemBase.Cast(parent);
12814 }
12815 }
12816
12817 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12818 {
12819
12820 }
12821
12823 {
12824
12825 return false;
12826 }
12827
12829 {
12830
12831
12832 return false;
12833 }
12834
12836 {
12837
12838 return false;
12839 }
12840
12843 {
12844 return !GetIsFrozen() &&
IsOpen();
12845 }
12846
12848 {
12849 bool hasParent = false, hasRootAsPlayer = false;
12851
12852 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12853 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12854
12855 if (wwtu || foodDecay)
12856 {
12860
12861 if (processWetness || processTemperature || processDecay)
12862 {
12864
12865 if (processWetness)
12866 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12867
12868 if (processTemperature)
12870
12871 if (processDecay)
12872 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12873 }
12874 }
12875 }
12876
12879 {
12881 }
12882
12884 {
12887
12888 return super.GetTemperatureFreezeThreshold();
12889 }
12890
12892 {
12895
12896 return super.GetTemperatureThawThreshold();
12897 }
12898
12900 {
12903
12904 return super.GetItemOverheatThreshold();
12905 }
12906
12908 {
12910 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12911
12912 return super.GetTemperatureFreezeTime();
12913 }
12914
12916 {
12918 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12919
12920 return super.GetTemperatureThawTime();
12921 }
12922
12927
12929 {
12930 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12931 }
12932
12934 {
12935 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12936 }
12937
12940 {
12942 }
12943
12945 {
12947 }
12948
12950 {
12952 }
12953
12956 {
12957 return null;
12958 }
12959
12962 {
12963 return false;
12964 }
12965
12967 {
12969 {
12972 if (!trg)
12973 {
12975 explosive = this;
12976 }
12977
12978 explosive.PairRemote(trg);
12980
12981 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12982 trg.SetPersistentPairID(persistentID);
12983 explosive.SetPersistentPairID(persistentID);
12984
12985 return true;
12986 }
12987 return false;
12988 }
12989
12992 {
12993 float ret = 1.0;
12996 ret *= GetHealth01();
12997
12998 return ret;
12999 }
13000
13001 #ifdef DEVELOPER
13002 override void SetDebugItem()
13003 {
13004 super.SetDebugItem();
13005 _itemBase = this;
13006 }
13007
13009 {
13010 string text = super.GetDebugText();
13011
13013 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13014
13015 return text;
13016 }
13017 #endif
13018
13020 {
13021 return true;
13022 }
13023
13025
13027
13029 {
13032 }
13033
13034
13042
13058}
13059
13061{
13063 if (entity)
13064 {
13065 bool is_item = entity.IsInherited(
ItemBase);
13066 if (is_item && full_quantity)
13067 {
13070 }
13071 }
13072 else
13073 {
13075 return NULL;
13076 }
13077 return entity;
13078}
13079
13081{
13082 if (item)
13083 {
13084 if (health > 0)
13085 item.SetHealth("", "", health);
13086
13087 if (item.CanHaveTemperature())
13088 {
13090 if (item.CanFreeze())
13091 item.SetFrozen(false);
13092 }
13093
13094 if (item.HasEnergyManager())
13095 {
13096 if (quantity >= 0)
13097 {
13098 item.GetCompEM().SetEnergy0To1(quantity);
13099 }
13100 else
13101 {
13103 }
13104 }
13105 else if (item.IsMagazine())
13106 {
13107 Magazine mag = Magazine.Cast(item);
13108 if (quantity >= 0)
13109 {
13110 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13111 }
13112 else
13113 {
13115 }
13116
13117 }
13118 else
13119 {
13120 if (quantity >= 0)
13121 {
13122 item.SetQuantityNormalized(quantity, false);
13123 }
13124 else
13125 {
13127 }
13128
13129 }
13130 }
13131}
13132
13133#ifdef DEVELOPER
13135#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionManagerBase(PlayerBase player)
map< typename, ref array< ActionBase_Basic > > TInputActionMap
void AddAction(typename actionName)
void RemoveAction(typename actionName)
TInputActionMap m_InputActionMap
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
const int ECE_PLACE_ON_SURFACE
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
DamageType
exposed from C++ (do not change)
PluginAdminLog m_AdminLog
override bool IsExplosive()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
FindInventoryLocationType
flags for searching locations in inventory
InventoryLocationType
types of Inventory Location
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
static bool HasDebugActionsMask(int mask)
bool HidesSelectionBySlot()
void SplitItem(PlayerBase player)
void CopyScriptPropertiesFrom(EntityAI oldItem)
override void InsertAgent(int agent, float count=1)
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
static void SetDebugActionsMask(int mask)
void SetIsDeploySound(bool is_deploy_sound)
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
override bool IsHeavyBehaviour()
override void SetWetMax()
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
void ClearStartItemSoundServer()
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
override void RemoveAllAgentsExcept(int agent_to_keep)
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
bool CanBeMovedOverride()
override void SetWet(float value, bool allow_client=false)
ref TIntArray m_SingleUseActions
override void ProcessVariables()
ref TStringArray m_HeadHidingSelections
float GetWeightSpecialized(bool forceRecalc=false)
bool LoadAgents(ParamsReadContext ctx, int version)
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
ref array< ref OverheatingParticle > m_OverheatingParticles
override float GetTemperatureFreezeThreshold()
bool m_IsSoundSynchRemote
void StopItemSoundServer(int id)
static void ToggleDebugActionsMask(int mask)
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetTemperatureFreezeTime()
ref array< int > m_CompatibleLocks
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
float m_TemperaturePerQuantityWeight
bool m_RecipesInitialized
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
override float GetTemperatureThawThreshold()
override void OnEnergyConsumed()
void SetQuantityNormalized(float value, bool destroy_config=true, bool destroy_forced=false)
Sets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
override EWetnessLevel GetWetLevel()
float GetSingleInventoryItemWeight()
ref TIntArray m_InteractActions
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
bool CanPlayDeployLoopSound()
override float GetWetMax()
bool CanBeUsedForSuicide()
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
void StartItemSoundServer(int id)
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
bool m_CanBeMovedOverride
override string ChangeIntoOnAttach(string slot)
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
ScriptedLightBase GetLight()
string GetPlaceSoundset()
bool AddQuantity(float value, bool destroy_config=true, bool destroy_forced=false)
add item quantity[related to varQuantity... config entry], destroy_config = true > if the quantity re...
override float GetQuantity()
int m_ShotsToStartOverheating
override void OnWetChanged(float newVal, float oldVal)
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void OnOverheatingDecay()
float GetDryingIncrement(string pIncrementName)
void SoundSynchRemoteReset()
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
override bool CanReleaseAttachment(EntityAI attachment)
override void OnMovedInsideCargo(EntityAI container)
void SetCEBasedQuantity()
bool m_CanPlayImpactSound
override string GetAttachmentSoundType()
float GetOverheatingCoef()
array< string > GetHeadHidingSelection()
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
override bool IsStoreLoad()
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
void SetResultOfSplit(bool value)
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
void UpdateAllOverheatingParticles()
float GetSoakingIncrement(string pIncrementName)
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override float GetStoreLoadedQuantity()
const int ITEM_SOUNDS_MAX
float GetItemModelLength()
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
void CombineItems(ItemBase other_item, bool use_stack_max=true)
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
void TransferAgents(int agents)
transfer agents from another item
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
float GetHeatIsolationInit()
void SetCanBeMovedOverride(bool setting)
override bool HasQuantity()
bool IsCargoException4x3(EntityAI item)
ref TIntArray m_ContinuousActions
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
void LoadParticleConfigOnFire(int id)
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
override float GetWetInit()
int m_ImpactSoundSurfaceHash
int m_MaxOverheatingValue
void SetupSpawnedItem(ItemBase item, float health, float quantity)
static ref map< string, int > m_WeaponTypeToID
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
array< int > GetValidFinishers()
returns an array of possible finishers
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
ItemSoundHandler GetItemSoundHandler()
override int GetQuantityMin()
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
override int GetQuickBarBonus()
override void SetTakeable(bool pState)
float m_OverheatingDecayInterval
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
void RemoveAudioVisualsOnClient()
static void AddDebugActionsMask(int mask)
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
bool CanRepair(ItemBase item_repair_kit)
bool can_this_be_combined
EffectSound m_SoundDeploy
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
float GetDeployTime()
how long it takes to deploy this item in seconds
override bool IsSplitable()
bool DamageItemAttachments(float damage)
override void WriteVarsToCTX(ParamsWriteContext ctx)
void ConvertEnergyToQuantity()
override void RemoveAllAgents()
override void SetQuantityToMinimum()
bool m_WantPlayImpactSound
override float GetTemperatureThawTime()
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
float m_StoreLoadedQuantity
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
float GetFilterDamageRatio()
override void SetLiquidType(int value, bool allow_client=false)
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
void OnApply(PlayerBase player)
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
ref Timer m_CheckOverheating
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override bool IsOneHandedBehaviour()
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
override float GetSingleInventoryItemWeightEx()
void SaveAgents(ParamsWriteContext ctx)
override int GetTargetQuantityMax(int attSlotID=-1)
float GetDisinfectQuantity(int system=0, Param param1=null)
override bool IsHologram()
float GetItemAttachOffset()
static int GetDebugActionsMask()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
void Open()
Implementations only.
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
static int m_DebugActionsMask
void KillAllOverheatingParticles()
bool CanBeCookedOnStick()
override int GetQuantityMax()
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
void OnActivatedByTripWire()
override void RemoveAgent(int agent_id)
bool m_ItemBeingDroppedPhys
override bool CanPutAsAttachment(EntityAI parent)
void PlayDetachSound(string slot_type)
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override bool IsBeingPlaced()
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
bool m_FixDamageSystemInit
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
void LoadParticleConfigOnOverheating(int id)
bool IsSoundSynchRemote()
override void EEOnCECreate()
Called when entity is being created as new by CE/ Debug.
override void OnRightClick()
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
bool IsActionTargetVisible()
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
int NameToID(string name)
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
void ClearStopItemSoundServer()
override string ChangeIntoOnDetach()
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
EffectSound m_SoundDeployFinish
float GetQuantityNormalizedScripted()
override void SetCleanness(int value, bool allow_client=false)
override float GetWetMin()
ref ItemSoundHandler m_ItemSoundHandler
override bool KindOf(string tag)
void ItemSoundHandler(ItemBase parent)
EffectSound m_LockingSound
void PluginItemDiagnostic()
PluginBase GetPlugin(typename plugin_type)
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
void RemoteDetonatorTrigger()
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
override void Explode(int damageType, string ammoType="")
void OnItemLocationChanged(ItemBase item)
void OnItemAttachedAtPlayer(EntityAI item, string slot_name)
proto native UIManager GetUIManager()
proto bool ConfigGetChildName(string path, int index, out string name)
Get name of subclass in config class on path.
proto native float ConfigGetFloat(string path)
Get float value from config on path.
override ScriptCallQueue GetCallQueue(int call_category)
proto native bool ConfigIsExisting(string path)
proto native void ConfigGetTextArray(string path, out TStringArray values)
Get array of strings from config on path.
proto native DayZPlayer GetPlayer()
proto int GetTime()
returns mission time in milliseconds
proto native int ConfigGetType(string path)
Returns type of config value.
AnalyticsManagerClient GetAnalyticsClient()
proto native int ConfigGetChildrenCount(string path)
Get count of subclasses in config class on path.
proto native SoundOnVehicle CreateSoundOnObject(Object source, string sound_name, float distance, bool looped, bool create_local=false)
proto native void ObjectDelete(Object obj)
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
proto native bool IsValid()
verify current set inventory location
proto native EntityAI GetParent()
returns parent of current inventory location
proto native int GetSlot()
returns slot id if current type is Attachment
proto native int GetCol()
returns column of cargo if current type is Cargo / ProxyCargo
proto native int GetRow()
returns row of cargo if current type is Cargo / ProxyCargo
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
bool WriteToContext(ParamsWriteContext ctx)
proto native int GetType()
returns type of InventoryLocation
proto native int GetIdx()
returns index of cargo if current type is Cargo / ProxyCargo
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
proto native bool GetFlip()
returns flip status of cargo
proto native EntityAI GetItem()
returns item of current inventory location
override bool CanDisplayCargo()
override void OnInventoryEnter(Man player)
override bool CanPutAsAttachment(EntityAI parent)
override bool CanReceiveItemIntoCargo(EntityAI item)
override bool OnStoreLoad(ParamsReadContext ctx, int version)
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
override void EEDelete(EntityAI parent)
override bool CanBeRepairedByCrafting()
override void OnPlacementStarted(Man player)
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
override bool IsElectricAppliance()
override bool IsItemTent()
override void SetActions()
override bool CanMakeGardenplot()
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
override WrittenNoteData GetWrittenNoteData()
override int GetDamageSystemVersionChange()
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
override void InitItemVariables()
override void SetActionAnimOverrides()
override void OnCreatePhysics()
override string GetDeploySoundset()
override float GetBandagingEffectivity()
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
override void OnStoreSave(ParamsWriteContext ctx)
override void AfterStoreLoad()
override int GetOnDigWormsAmount()
override bool IsSelfAdjustingTemperature()
override bool IsPlayerInside(PlayerBase player, string selection)
override void OnVariablesSynchronized()
override void RefreshPhysics()
override bool CanObstruct()
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
override bool CanPutInCargo(EntityAI parent)
override string GetLoopDeploySoundset()
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
override void OnInventoryExit(Man player)
override bool IsTakeable()
override bool IsIgnoredByConstruction()
override void InitItemSounds()
override void EEKilled(Object killer)
override void OnCombine(ItemBase other_item)
override bool CanExplodeInFire()
override bool IsFacingPlayer(PlayerBase player, string selection)
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
override bool IsBloodContainer()
override bool IsClothing()
override bool CanBeSplit()
override bool IsDeployable()
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
override bool CanBeDisinfected()
override float GetInfectionChance(int system=0, Param param=null)
override void OnEndPlacement()
float GetOverheatingLimitMax()
void SetOverheatingLimitMax(float max)
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
float GetOverheatingLimitMin()
void SetOverheatingLimitMin(float min)
void RegisterParticle(Particle p)
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
void SetControlledDevice(EntityAI pDevice)
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto void Remove(func fn)
remove specific call from queue
proto void CallLater(func fn, int delay=0, bool repeat=false, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
void SetCalcDetails(string details)
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Serializer ParamsReadContext
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
proto native CGame GetGame()
Serializer ParamsWriteContext
const int COMP_TYPE_ENERGY_MANAGER
void Error(string err)
Messagebox with error message.
proto native void SetColor(int color)
array< string > TStringArray
EntityEvent
Entity events for event-mask, or throwing event from code.
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
const int VARIABLE_LIQUIDTYPE
const int VARIABLE_CLEANNESS
const int VARIABLE_TEMPERATURE
const int VARIABLE_QUANTITY
static proto float AbsFloat(float f)
Returns absolute value.
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_DEBUG_ACTION
class JsonUndergroundAreaTriggerData GetPosition
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.