8331{
8333 {
8334 return true;
8335 }
8336};
8337
8338
8339
8341{
8345
8347
8350
8351
8352
8353
8354
8363
8369
8374
8379
8400 protected bool m_IsResultOfSplit
8401
8403
8408
8409
8410
8412
8416
8417
8418
8420
8423
8424
8425
8431
8432
8440
8443
8444
8446
8447
8449
8450
8455
8456
8461
8462
8464
8465
8467 {
8472
8473 if (!
GetGame().IsDedicatedServer())
8474 {
8476 {
8478
8480 {
8482 }
8483 }
8484
8487 }
8488
8489 m_OldLocation = null;
8490
8492 {
8494 }
8495
8496 if (ConfigIsExisting("headSelectionsToHide"))
8497 {
8500 }
8501
8503 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8504 {
8506 }
8507
8509
8510 m_IsResultOfSplit = false;
8511
8513 }
8514
8516 {
8517 super.InitItemVariables();
8518
8524 m_Count = ConfigGetInt(
"count");
8525
8528
8533
8536
8541
8553
8557
8558
8561 if (ConfigIsExisting("canBeSplit"))
8562 {
8565 }
8566
8568 if (ConfigIsExisting("itemBehaviour"))
8570
8571
8574 RegisterNetSyncVariableInt("m_VarLiquidType");
8575 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8576
8577 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8578 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8579 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8580
8581 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8582 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8583 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8584 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8585
8586 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8587 RegisterNetSyncVariableBool("m_IsTakeable");
8588 RegisterNetSyncVariableBool("m_IsHologram");
8589
8592 {
8595 }
8596
8598
8600 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8602
8603 }
8604
8606 {
8608 }
8609
8611 {
8614 {
8619 }
8620 }
8621
8622 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8623 {
8625 {
8628 }
8629
8631 }
8632
8634 {
8640 }
8641
8643
8645 {
8647
8648 if (!action)
8649 {
8650 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8651 return;
8652 }
8653
8655 if (!ai)
8656 {
8658 return;
8659 }
8660
8662 if (!action_array)
8663 {
8664 action_array = new array<ActionBase_Basic>;
8666 }
8667 if (LogManager.IsActionLogEnable())
8668 {
8669 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8670 }
8671
8672 if (action_array.Find(action) != -1)
8673 {
8674 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8675 }
8676 else
8677 {
8678 action_array.Insert(action);
8679 }
8680 }
8681
8683 {
8685 ActionBase action = player.GetActionManager().GetAction(actionName);
8688
8689 if (action_array)
8690 {
8691 action_array.RemoveItem(action);
8692 }
8693 }
8694
8695
8696
8698 {
8699 ActionOverrideData overrideData = new ActionOverrideData();
8703
8705 if (!actionMap)
8706 {
8709 }
8710
8711 actionMap.Insert(this.
Type(), overrideData);
8712
8713 }
8714
8716
8718
8719
8721 {
8724
8727
8728 string config_to_search = "CfgVehicles";
8729 string muzzle_owner_config;
8730
8732 {
8733 if (IsInherited(Weapon))
8734 config_to_search = "CfgWeapons";
8735
8736 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8737
8738 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8739
8741
8742 if (config_OnFire_subclass_count > 0)
8743 {
8744 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8745
8746 for (int i = 0; i < config_OnFire_subclass_count; i++)
8747 {
8748 string particle_class = "";
8750 string config_OnFire_entry = config_OnFire_class + particle_class;
8751 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8752 WPOF_array.Insert(WPOF);
8753 }
8754
8755
8757 }
8758 }
8759
8761 {
8762 config_to_search = "CfgWeapons";
8763 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8764
8765 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8766
8768
8769 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8770 {
8771 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8772
8773 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8774 {
8775 string particle_class2 = "";
8777 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8778 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8779 WPOBE_array.Insert(WPOBE);
8780 }
8781
8782
8784 }
8785 }
8786 }
8787
8788
8790 {
8793
8795 {
8796 string config_to_search = "CfgVehicles";
8797
8798 if (IsInherited(Weapon))
8799 config_to_search = "CfgWeapons";
8800
8801 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8802 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8803
8804 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8805 {
8806
8808
8810 {
8812 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8814 return;
8815 }
8816
8819
8820
8821
8823 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8824
8825 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8826 {
8827 string particle_class = "";
8829 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8831
8832 if (entry_type == CT_CLASS)
8833 {
8834 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8835 WPOOH_array.Insert(WPOF);
8836 }
8837 }
8838
8839
8841 }
8842 }
8843 }
8844
8846 {
8848 }
8849
8851 {
8853 {
8855
8858
8861
8862 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8863 }
8864 }
8865
8867 {
8869 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8870
8872 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8873
8875 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8876
8878 {
8880 }
8881 }
8882
8884 {
8886 }
8887
8889 {
8892 else
8894
8896 {
8899 }
8900 else
8901 {
8904
8907 }
8908
8910 }
8911
8913 {
8915 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8916 }
8917
8919 {
8921 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8923 }
8924
8926 {
8928 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8929 }
8930
8932 {
8935
8936 OverheatingParticle OP = new OverheatingParticle();
8941
8943 }
8944
8946 {
8949
8950 return -1;
8951 }
8952
8954 {
8956 {
8959
8960 for (int i = count; i > 0; --i)
8961 {
8962 int id = i - 1;
8965
8968
8969 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8970 {
8971 if (p)
8972 {
8975 }
8976 }
8977 }
8978 }
8979 }
8980
8982 {
8984 {
8986 {
8987 int id = i - 1;
8989
8990 if (OP)
8991 {
8993
8994 if (p)
8995 {
8997 }
8998
8999 delete OP;
9000 }
9001 }
9002
9005 }
9006 }
9007
9010 {
9011 return 0.0;
9012 }
9013
9014
9016 {
9017 return 250;
9018 }
9019
9021 {
9022 return 0;
9023 }
9024
9027 {
9029 return true;
9030
9031 return false;
9032 }
9033
9036 {
9039
9041 {
9043 }
9044 else
9045 {
9046
9048 }
9049
9051 }
9052
9059 {
9060 return -1;
9061 }
9062
9063
9064
9065
9067 {
9069 {
9071 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9072
9073 if (r_index >= 0)
9074 {
9075 InventoryLocation r_il = new InventoryLocation;
9076 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9077
9078 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9081 {
9082 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9083 }
9085 {
9086 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9087 }
9088
9089 }
9090
9091 player.GetHumanInventory().ClearUserReservedLocation(this);
9092 }
9093
9096 }
9097
9098
9099
9100
9102 {
9103 return ItemBase.m_DebugActionsMask;
9104 }
9105
9107 {
9108 return ItemBase.m_DebugActionsMask & mask;
9109 }
9110
9112 {
9113 ItemBase.m_DebugActionsMask = mask;
9114 }
9115
9117 {
9118 ItemBase.m_DebugActionsMask |= mask;
9119 }
9120
9122 {
9123 ItemBase.m_DebugActionsMask &= ~mask;
9124 }
9125
9127 {
9129 {
9131 }
9132 else
9133 {
9135 }
9136 }
9137
9138
9140 {
9141 if (GetEconomyProfile())
9142 {
9143 float q_max = GetEconomyProfile().GetQuantityMax();
9144 if (q_max > 0)
9145 {
9146 float q_min = GetEconomyProfile().GetQuantityMin();
9147 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9148
9150 {
9151 ComponentEnergyManager comp = GetCompEM();
9153 {
9155 }
9156 }
9158 {
9160
9161 }
9162
9163 }
9164 }
9165 }
9166
9169 {
9170 EntityAI parent = GetHierarchyParent();
9171
9172 if (parent)
9173 {
9174 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9175 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9176 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9177 }
9178 }
9179
9182 {
9183 EntityAI parent = GetHierarchyParent();
9184
9185 if (parent)
9186 {
9187 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9188 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9189 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9190 }
9191 }
9192
9194 {
9195
9196
9197
9198
9200
9202 {
9203 if (ScriptInputUserData.CanStoreInputUserData())
9204 {
9205 ScriptInputUserData ctx = new ScriptInputUserData;
9211 ctx.
Write(use_stack_max);
9214
9216 {
9217 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9218 }
9219 }
9220 }
9221 else if (!
GetGame().IsMultiplayer())
9222 {
9224 }
9225 }
9226
9228 {
9230 }
9231
9233 {
9235 }
9236
9238 {
9240 }
9241
9243 {
9244
9245 return false;
9246 }
9247
9249 {
9250 return false;
9251 }
9252
9256 {
9257 return false;
9258 }
9259
9261 {
9262 return "";
9263 }
9264
9266
9268 {
9269 return false;
9270 }
9271
9273 {
9274 return true;
9275 }
9276
9277
9278
9280 {
9281 return true;
9282 }
9283
9285 {
9286 return true;
9287 }
9288
9290 {
9291 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9293 }
9294
9296 {
9298 }
9299
9301 {
9303 if (!is_being_placed)
9305 SetSynchDirty();
9306 }
9307
9308
9310
9312 {
9314 }
9315
9317 {
9319 }
9320
9322 {
9323 return 1;
9324 }
9325
9327 {
9328 return false;
9329 }
9330
9332 {
9334 SetSynchDirty();
9335 }
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9362
9363
9364
9365
9366
9367
9368
9369
9370
9372 {
9373 super.OnMovedInsideCargo(container);
9374
9375 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9376 }
9377
9378 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9379 {
9380 super.EEItemLocationChanged(oldLoc,newLoc);
9381
9382 PlayerBase new_player = null;
9383 PlayerBase old_player = null;
9384
9385 if (newLoc.GetParent())
9386 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9387
9388 if (oldLoc.GetParent())
9389 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9390
9392 {
9393 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9394
9395 if (r_index >= 0)
9396 {
9397 InventoryLocation r_il = new InventoryLocation;
9398 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9399
9400 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9403 {
9404 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9405 }
9407 {
9408 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9409 }
9410
9411 }
9412 }
9413
9415 {
9416 if (new_player)
9417 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9418
9419 if (new_player == old_player)
9420 {
9421
9422 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9423 {
9425 {
9426 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9427 {
9428 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9429 }
9430 }
9431 else
9432 {
9433 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9434 }
9435 }
9436
9437 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9438 {
9439 int type = oldLoc.GetType();
9441 {
9442 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9443 }
9445 {
9446 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9447 }
9448 }
9449 if (!m_OldLocation)
9450 {
9451 m_OldLocation = new InventoryLocation;
9452 }
9453 m_OldLocation.Copy(oldLoc);
9454 }
9455 else
9456 {
9457 if (m_OldLocation)
9458 {
9459 m_OldLocation.Reset();
9460 }
9461 }
9462
9464 }
9465 else
9466 {
9467 if (new_player)
9468 {
9469 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9470 if (res_index >= 0)
9471 {
9472 InventoryLocation il = new InventoryLocation;
9473 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9475 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9478 {
9479 il.
GetParent().GetOnReleaseLock().Invoke(it);
9480 }
9482 {
9484 }
9485
9486 }
9487 }
9489 {
9490
9492 }
9493
9494 if (m_OldLocation)
9495 {
9496 m_OldLocation.Reset();
9497 }
9498 }
9499 }
9500
9501 override void EOnContact(IEntity other, Contact extra)
9502 {
9504 {
9505 int liquidType = -1;
9507 if (impactSpeed > 0.0)
9508 {
9510 #ifndef SERVER
9512 #else
9514 SetSynchDirty();
9515 #endif
9517 }
9518 }
9519
9520 #ifdef SERVER
9521 if (GetCompEM() && GetCompEM().IsPlugged())
9522 {
9523 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9524 GetCompEM().UnplugThis();
9525 }
9526 #endif
9527 }
9528
9530
9532 {
9534 }
9535
9537 {
9538
9539 }
9540
9542 {
9543 super.OnItemLocationChanged(old_owner, new_owner);
9544
9545 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9546 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9547
9548 if (!relatedPlayer && playerNew)
9549 relatedPlayer = playerNew;
9550
9551 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9552 {
9554 if (actionMgr)
9555 {
9556 ActionBase currentAction = actionMgr.GetRunningAction();
9557 if (currentAction)
9559 }
9560 }
9561
9562 Man ownerPlayerOld = null;
9563 Man ownerPlayerNew = null;
9564
9565 if (old_owner)
9566 {
9567 if (old_owner.
IsMan())
9568 {
9569 ownerPlayerOld = Man.Cast(old_owner);
9570 }
9571 else
9572 {
9573 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9574 }
9575 }
9576 else
9577 {
9579 {
9581
9582 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9583 {
9584 GetCompEM().UnplugThis();
9585 }
9586 }
9587 }
9588
9589 if (new_owner)
9590 {
9591 if (new_owner.
IsMan())
9592 {
9593 ownerPlayerNew = Man.Cast(new_owner);
9594 }
9595 else
9596 {
9597 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9598 }
9599 }
9600
9601 if (ownerPlayerOld != ownerPlayerNew)
9602 {
9603 if (ownerPlayerOld)
9604 {
9605 array<EntityAI> subItemsExit = new array<EntityAI>;
9607 for (int i = 0; i < subItemsExit.Count(); i++)
9608 {
9611 }
9612 }
9613
9614 if (ownerPlayerNew)
9615 {
9616 array<EntityAI> subItemsEnter = new array<EntityAI>;
9618 for (int j = 0; j < subItemsEnter.Count(); j++)
9619 {
9622 }
9623 }
9624 }
9625 else if (ownerPlayerNew != null)
9626 {
9627 PlayerBase nplayer;
9628 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9629 {
9630 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9632 for (int k = 0; k < subItemsUpdate.Count(); k++)
9633 {
9635 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9636 }
9637 }
9638 }
9639
9640 if (old_owner)
9641 old_owner.OnChildItemRemoved(this);
9642 if (new_owner)
9643 new_owner.OnChildItemReceived(this);
9644 }
9645
9646
9648 {
9649 super.EEDelete(parent);
9650 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9651 if (player)
9652 {
9654
9655 if (player.IsAlive())
9656 {
9657 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9658 if (r_index >= 0)
9659 {
9660 InventoryLocation r_il = new InventoryLocation;
9661 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9662
9663 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9666 {
9667 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9668 }
9670 {
9671 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9672 }
9673
9674 }
9675
9676 player.RemoveQuickBarEntityShortcut(this);
9677 }
9678 }
9679 }
9680
9682 {
9683 super.EEKilled(killer);
9684
9687 {
9688 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9689 {
9690 if (IsMagazine())
9691 {
9692 if (Magazine.Cast(this).GetAmmoCount() > 0)
9693 {
9695 }
9696 }
9697 else
9698 {
9700 }
9701 }
9702 }
9703 }
9704
9706 {
9707 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9708
9709 super.OnWasAttached(parent, slot_id);
9710
9713
9715 }
9716
9718 {
9719 super.OnWasDetached(parent, slot_id);
9720
9723 }
9724
9726 {
9727 int idx;
9730
9731 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9732 if (inventory_slots.Count() < 1)
9733 {
9734 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9735 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9736 }
9737 else
9738 {
9739 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9740 }
9741
9742 idx = inventory_slots.Find(slot);
9743 if (idx < 0)
9744 return "";
9745
9746 return attach_types.Get(idx);
9747 }
9748
9750 {
9751 int idx = -1;
9752 string slot;
9753
9756
9757 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9758 if (inventory_slots.Count() < 1)
9759 {
9760 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9761 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9762 }
9763 else
9764 {
9765 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9766 if (detach_types.Count() < 1)
9767 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9768 }
9769
9770 for (int i = 0; i < inventory_slots.Count(); i++)
9771 {
9772 slot = inventory_slots.Get(i);
9773 }
9774
9775 if (slot != "")
9776 {
9777 if (detach_types.Count() == 1)
9778 idx = 0;
9779 else
9780 idx = inventory_slots.Find(slot);
9781 }
9782 if (idx < 0)
9783 return "";
9784
9785 return detach_types.Get(idx);
9786 }
9787
9789 {
9790
9792
9793
9794 float min_time = 1;
9795 float max_time = 3;
9796 float delay = Math.RandomFloat(min_time, max_time);
9797
9798 explode_timer.Run(delay, this, "DoAmmoExplosion");
9799 }
9800
9802 {
9803 Magazine magazine = Magazine.Cast(this);
9804 int pop_sounds_count = 6;
9805 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9806
9807
9808 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9809 string sound_name = pop_sounds[ sound_idx ];
9811
9812
9813 magazine.ServerAddAmmoCount(-1);
9814
9815
9816 float min_temp_to_explode = 100;
9817
9818 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9819 {
9821 }
9822 }
9823
9824
9825 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9826 {
9827 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9828
9829 const int CHANCE_DAMAGE_CARGO = 4;
9830 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9831 const int CHANCE_DAMAGE_NOTHING = 2;
9832
9834 {
9835 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9836 int chances;
9837 int rnd;
9838
9839 if (GetInventory().GetCargo())
9840 {
9841 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9842 rnd = Math.RandomInt(0,chances);
9843
9844 if (rnd < CHANCE_DAMAGE_CARGO)
9845 {
9847 }
9848 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9849 {
9851 }
9852 }
9853 else
9854 {
9855 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9856 rnd = Math.RandomInt(0,chances);
9857
9858 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9859 {
9861 }
9862 }
9863 }
9864 }
9865
9867 {
9868 if (GetInventory().GetCargo())
9869 {
9870 int item_count = GetInventory().GetCargo().GetItemCount();
9871 if (item_count > 0)
9872 {
9873 int random_pick = Math.RandomInt(0, item_count);
9875 if (!item.IsExplosive())
9876 {
9877 item.AddHealth("","",damage);
9878 return true;
9879 }
9880 }
9881 }
9882 return false;
9883 }
9884
9886 {
9887 int attachment_count = GetInventory().AttachmentCount();
9888 if (attachment_count > 0)
9889 {
9890 int random_pick = Math.RandomInt(0, attachment_count);
9891 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9892 if (!attachment.IsExplosive())
9893 {
9894 attachment.AddHealth("","",damage);
9895 return true;
9896 }
9897 }
9898 return false;
9899 }
9900
9902 {
9904 }
9905
9907 {
9909 return GetInventory().CanRemoveEntity();
9910
9911 return false;
9912 }
9913
9915 {
9917 return;
9918
9920 {
9921 if (ScriptInputUserData.CanStoreInputUserData())
9922 {
9923 ScriptInputUserData ctx = new ScriptInputUserData;
9928 ctx.
Write(destination_entity);
9932 }
9933 }
9934 else if (!
GetGame().IsMultiplayer())
9935 {
9937 }
9938 }
9939
9941 {
9943 return;
9944
9945 float split_quantity_new;
9949 InventoryLocation loc = new InventoryLocation;
9950
9951 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9952 {
9954 split_quantity_new = stack_max;
9955 else
9957
9958 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9959 if (new_item)
9960 {
9961 new_item.SetResultOfSplit(true);
9962 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9964 new_item.SetQuantity(split_quantity_new);
9965 }
9966 }
9967 else if (destination_entity && slot_id == -1)
9968 {
9969 if (quantity > stack_max)
9970 split_quantity_new = stack_max;
9971 else
9972 split_quantity_new = quantity;
9973
9975 {
9978 }
9979
9980 if (new_item)
9981 {
9982 new_item.SetResultOfSplit(true);
9983 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9985 new_item.SetQuantity(split_quantity_new);
9986 }
9987 }
9988 else
9989 {
9990 if (stack_max != 0)
9991 {
9993 {
9995 }
9996
9997 if (split_quantity_new == 0)
9998 {
9999 if (!
GetGame().IsMultiplayer())
10000 player.PhysicalPredictiveDropItem(this);
10001 else
10002 player.ServerDropEntity(this);
10003 return;
10004 }
10005
10007
10008 if (new_item)
10009 {
10010 new_item.SetResultOfSplit(true);
10011 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10013 new_item.SetQuantity(stack_max);
10014 new_item.PlaceOnSurface();
10015 }
10016 }
10017 }
10018 }
10019
10021 {
10023 return;
10024
10025 float split_quantity_new;
10029 InventoryLocation loc = new InventoryLocation;
10030
10031 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10032 {
10034 split_quantity_new = stack_max;
10035 else
10037
10038 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10039 if (new_item)
10040 {
10041 new_item.SetResultOfSplit(true);
10042 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10044 new_item.SetQuantity(split_quantity_new);
10045 }
10046 }
10047 else if (destination_entity && slot_id == -1)
10048 {
10049 if (quantity > stack_max)
10050 split_quantity_new = stack_max;
10051 else
10052 split_quantity_new = quantity;
10053
10055 {
10058 }
10059
10060 if (new_item)
10061 {
10062 new_item.SetResultOfSplit(true);
10063 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10065 new_item.SetQuantity(split_quantity_new);
10066 }
10067 }
10068 else
10069 {
10070 if (stack_max != 0)
10071 {
10073 {
10075 }
10076
10078
10079 if (new_item)
10080 {
10081 new_item.SetResultOfSplit(true);
10082 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10084 new_item.SetQuantity(stack_max);
10085 new_item.PlaceOnSurface();
10086 }
10087 }
10088 }
10089 }
10090
10092 {
10094 return;
10095
10097 {
10098 if (ScriptInputUserData.CanStoreInputUserData())
10099 {
10100 ScriptInputUserData ctx = new ScriptInputUserData;
10105 dst.WriteToContext(ctx);
10107 }
10108 }
10109 else if (!
GetGame().IsMultiplayer())
10110 {
10112 }
10113 }
10114
10116 {
10118 return;
10119
10121 {
10122 if (ScriptInputUserData.CanStoreInputUserData())
10123 {
10124 ScriptInputUserData ctx = new ScriptInputUserData;
10129 ctx.
Write(destination_entity);
10135 }
10136 }
10137 else if (!
GetGame().IsMultiplayer())
10138 {
10140 }
10141 }
10142
10144 {
10146 }
10147
10149 {
10151 return this;
10152
10154 float split_quantity_new;
10156 if (dst.IsValid())
10157 {
10158 int slot_id = dst.GetSlot();
10160
10161 if (quantity > stack_max)
10162 split_quantity_new = stack_max;
10163 else
10164 split_quantity_new = quantity;
10165
10167
10168 if (new_item)
10169 {
10170 new_item.SetResultOfSplit(true);
10171 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10174 }
10175
10176 return new_item;
10177 }
10178
10179 return null;
10180 }
10181
10183 {
10185 return;
10186
10188 float split_quantity_new;
10190 if (destination_entity)
10191 {
10193 if (quantity > stackable)
10194 split_quantity_new = stackable;
10195 else
10196 split_quantity_new = quantity;
10197
10198 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10199 if (new_item)
10200 {
10201 new_item.SetResultOfSplit(true);
10202 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10204 new_item.SetQuantity(split_quantity_new);
10205 }
10206 }
10207 }
10208
10210 {
10212 return;
10213
10215 {
10216 if (ScriptInputUserData.CanStoreInputUserData())
10217 {
10218 ScriptInputUserData ctx = new ScriptInputUserData;
10223 ItemBase destination_entity =
this;
10224 ctx.
Write(destination_entity);
10228 }
10229 }
10230 else if (!
GetGame().IsMultiplayer())
10231 {
10233 }
10234 }
10235
10237 {
10239 return;
10240
10242 float split_quantity_new;
10244 if (player)
10245 {
10247 if (quantity > stackable)
10248 split_quantity_new = stackable;
10249 else
10250 split_quantity_new = quantity;
10251
10252 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10253 new_item =
ItemBase.Cast(in_hands);
10254 if (new_item)
10255 {
10256 new_item.SetResultOfSplit(true);
10257 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10259 new_item.SetQuantity(split_quantity_new);
10260 }
10261 }
10262 }
10263
10265 {
10267 return;
10268
10270 float split_quantity_new = Math.Floor(quantity * 0.5);
10271
10273
10274 if (new_item)
10275 {
10276 if (new_item.GetQuantityMax() < split_quantity_new)
10277 {
10278 split_quantity_new = new_item.GetQuantityMax();
10279 }
10280
10281 new_item.SetResultOfSplit(true);
10282 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10283
10285 {
10288 }
10289 else
10290 {
10293 }
10294 }
10295 }
10296
10298 {
10300 return;
10301
10303 float split_quantity_new = Math.Floor(quantity / 2);
10304
10305 InventoryLocation invloc = new InventoryLocation;
10307
10309 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10310
10311 if (new_item)
10312 {
10313 if (new_item.GetQuantityMax() < split_quantity_new)
10314 {
10315 split_quantity_new = new_item.GetQuantityMax();
10316 }
10318 {
10321 }
10322 else
10323 {
10326 }
10327 }
10328 }
10329
10332 {
10333 SetWeightDirty();
10335
10336 if (parent)
10337 parent.OnAttachmentQuantityChangedEx(this, delta);
10338
10340 {
10342 {
10344 }
10346 {
10347 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10349 }
10350 }
10351
10352 }
10353
10356 {
10357
10358 }
10359
10362 {
10364 }
10365
10367 {
10368 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10369
10371 {
10372 if (newLevel == GameConstants.STATE_RUINED)
10373 {
10375 EntityAI parent = GetHierarchyParent();
10376 if (parent && parent.IsFireplace())
10377 {
10378 CargoBase cargo = GetInventory().GetCargo();
10379 if (cargo)
10380 {
10382 {
10384 }
10385 }
10386 }
10387 }
10388
10390 {
10391
10393 return;
10394 }
10395
10396 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10397 {
10399 }
10400 }
10401 }
10402
10403
10405 {
10406 super.OnRightClick();
10407
10409 {
10411 {
10412 if (ScriptInputUserData.CanStoreInputUserData())
10413 {
10414 vector m4[4];
10416
10417 EntityAI root = GetHierarchyRoot();
10418
10419 InventoryLocation dst = new InventoryLocation;
10421 {
10422 if (root)
10423 {
10424 root.GetTransform(m4);
10426 }
10427 else
10428 GetInventory().GetCurrentInventoryLocation(dst);
10429 }
10430 else
10431 {
10433
10434
10435 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10436 {
10437 if (root)
10438 {
10439 root.GetTransform(m4);
10441 }
10442 else
10443 GetInventory().GetCurrentInventoryLocation(dst);
10444 }
10445 else
10446 {
10447 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10448 }
10449 }
10450
10451 ScriptInputUserData ctx = new ScriptInputUserData;
10459 }
10460 }
10461 else if (!
GetGame().IsMultiplayer())
10462 {
10464 }
10465 }
10466 }
10467
10468 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10469 {
10470
10471 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10472 return false;
10473
10474 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10475 return false;
10476
10477
10479 return false;
10480
10481
10482 Magazine mag = Magazine.Cast(this);
10483 if (mag)
10484 {
10485 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10486 return false;
10487
10488 if (stack_max_limit)
10489 {
10490 Magazine other_mag = Magazine.Cast(other_item);
10491 if (other_item)
10492 {
10493 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10494 return false;
10495 }
10496
10497 }
10498 }
10499 else
10500 {
10501
10503 return false;
10504
10506 return false;
10507 }
10508
10509 PlayerBase player = null;
10510 if (CastTo(player, GetHierarchyRootPlayer()))
10511 {
10512 if (player.GetInventory().HasAttachment(this))
10513 return false;
10514
10515 if (player.IsItemsToDelete())
10516 return false;
10517 }
10518
10519 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10520 return false;
10521
10522 int slotID;
10524 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10525 return false;
10526
10527 return true;
10528 }
10529
10531 {
10533 }
10534
10536 {
10537 return m_IsResultOfSplit;
10538 }
10539
10541 {
10542 m_IsResultOfSplit = value;
10543 }
10544
10546 {
10548 }
10549
10551 {
10552 float other_item_quantity = other_item.GetQuantity();
10553 float this_free_space;
10554
10556
10558
10559 if (other_item_quantity > this_free_space)
10560 {
10561 return this_free_space;
10562 }
10563 else
10564 {
10565 return other_item_quantity;
10566 }
10567 }
10568
10570 {
10572 }
10573
10575 {
10577 return;
10578
10579 if (!IsMagazine() && other_item)
10580 {
10582 if (quantity_used != 0)
10583 {
10584 float hp1 = GetHealth01("","");
10585 float hp2 = other_item.GetHealth01("","");
10586 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10587 hpResult = hpResult / (
GetQuantity() + quantity_used);
10588
10589 hpResult *= GetMaxHealth();
10590 Math.Round(hpResult);
10591 SetHealth("", "Health", hpResult);
10592
10594 other_item.AddQuantity(-quantity_used);
10595 }
10596 }
10598 }
10599
10601 {
10602 #ifdef SERVER
10603 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10604 GetHierarchyParent().IncreaseLifetimeUp();
10605 #endif
10606 };
10607
10609 {
10610 PlayerBase p = PlayerBase.Cast(player);
10611
10612 array<int> recipesIds = p.m_Recipes;
10613 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10614 if (moduleRecipesManager)
10615 {
10616 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10617 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10618 }
10619
10620 for (int i = 0;i < recipesIds.Count(); i++)
10621 {
10622 int key = recipesIds.Get(i);
10623 string recipeName = moduleRecipesManager.GetRecipeName(key);
10625 }
10626 }
10627
10628
10629 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10630 {
10631 super.GetDebugActions(outputList);
10632
10633
10638
10639
10643
10647
10648
10651
10652
10654 {
10657 }
10658
10660
10663
10667 }
10668
10669
10670
10671
10673 {
10674 super.OnAction(action_id, player, ctx);
10675 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10676 {
10677 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10678 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10679 PlayerBase p = PlayerBase.Cast(player);
10680 if (
EActions.RECIPES_RANGE_START < 1000)
10681 {
10682 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10683 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10684 }
10685 }
10686 #ifndef SERVER
10687 else if (action_id ==
EActions.WATCH_PLAYER)
10688 {
10689 PluginDeveloper.SetDeveloperItemClientEx(player);
10690 }
10691 #endif
10693 {
10694 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10695 {
10696 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10697 OnDebugButtonPressServer(id + 1);
10698 }
10699
10700 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10701 {
10702 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10704 }
10705
10706 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10707 {
10708 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10710 }
10711
10712 else if (action_id ==
EActions.ADD_QUANTITY)
10713 {
10714 if (IsMagazine())
10715 {
10716 Magazine mag = Magazine.Cast(this);
10717 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10718 }
10719 else
10720 {
10722 }
10723
10724 if (m_EM)
10725 {
10726 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10727 }
10728
10729 }
10730
10731 else if (action_id ==
EActions.REMOVE_QUANTITY)
10732 {
10733 if (IsMagazine())
10734 {
10735 Magazine mag2 = Magazine.Cast(this);
10736 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10737 }
10738 else
10739 {
10741 }
10742 if (m_EM)
10743 {
10744 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10745 }
10746
10747 }
10748
10749 else if (action_id ==
EActions.SET_QUANTITY_0)
10750 {
10752
10753 if (m_EM)
10754 {
10755 m_EM.SetEnergy(0);
10756 }
10757 }
10758
10759 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10760 {
10762
10763 if (m_EM)
10764 {
10765 m_EM.SetEnergy(m_EM.GetEnergyMax());
10766 }
10767 }
10768
10769 else if (action_id ==
EActions.ADD_HEALTH)
10770 {
10771 AddHealth("","",GetMaxHealth("","Health")/5);
10772 }
10773 else if (action_id ==
EActions.REMOVE_HEALTH)
10774 {
10775 AddHealth("","",-GetMaxHealth("","Health")/5);
10776 }
10777 else if (action_id ==
EActions.DESTROY_HEALTH)
10778 {
10779 SetHealth01("","",0);
10780 }
10781 else if (action_id ==
EActions.WATCH_ITEM)
10782 {
10784 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10785 #ifdef DEVELOPER
10786 SetDebugDeveloper_item(this);
10787 #endif
10788 }
10789
10790 else if (action_id ==
EActions.ADD_TEMPERATURE)
10791 {
10792 AddTemperature(20);
10793
10794 }
10795
10796 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10797 {
10798 AddTemperature(-20);
10799
10800 }
10801
10802 else if (action_id ==
EActions.FLIP_FROZEN)
10803 {
10804 SetFrozen(!GetIsFrozen());
10805
10806 }
10807
10808 else if (action_id ==
EActions.ADD_WETNESS)
10809 {
10811
10812 }
10813
10814 else if (action_id ==
EActions.REMOVE_WETNESS)
10815 {
10817
10818 }
10819
10820 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10821 {
10824
10825
10826 }
10827
10828 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10829 {
10832 }
10833
10834 else if (action_id ==
EActions.MAKE_SPECIAL)
10835 {
10836 auto debugParams = DebugSpawnParams.WithPlayer(player);
10837 OnDebugSpawnEx(debugParams);
10838 }
10839
10840 else if (action_id ==
EActions.DELETE)
10841 {
10842 Delete();
10843 }
10844
10845 }
10846
10847
10848 return false;
10849 }
10850
10851
10852
10853
10857
10860
10861
10862
10864 {
10865 return false;
10866 }
10867
10868
10870 {
10871 return true;
10872 }
10873
10874
10876 {
10877 return true;
10878 }
10879
10880
10881
10883 {
10884 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10886 }
10887
10890 {
10891 return null;
10892 }
10893
10895 {
10896 return false;
10897 }
10898
10900 {
10901 return false;
10902 }
10903
10907
10908
10910 {
10911 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10912 return module_repairing.CanRepair(this, item_repair_kit);
10913 }
10914
10915
10916 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10917 {
10918 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10919 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10920 }
10921
10922
10924 {
10925
10926
10927
10928
10929
10930
10931
10932
10933 return 1;
10934 }
10935
10936
10937
10939 {
10941 }
10942
10943
10944
10946 {
10948 }
10949
10950
10959 {
10960 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10961
10962 if (player)
10963 {
10964 player.MessageStatus(text);
10965 }
10966 }
10967
10968
10977 {
10978 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10979
10980 if (player)
10981 {
10982 player.MessageAction(text);
10983 }
10984 }
10985
10986
10995 {
10996 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10997
10998 if (player)
10999 {
11000 player.MessageFriendly(text);
11001 }
11002 }
11003
11004
11013 {
11014 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11015
11016 if (player)
11017 {
11018 player.MessageImportant(text);
11019 }
11020 }
11021
11023 {
11024 return true;
11025 }
11026
11027
11028 override bool KindOf(
string tag)
11029 {
11030 bool found = false;
11031 string item_name = this.
GetType();
11034
11035 int array_size = item_tag_array.Count();
11036 for (int i = 0; i < array_size; i++)
11037 {
11038 if (item_tag_array.Get(i) == tag)
11039 {
11040 found = true;
11041 break;
11042 }
11043 }
11044 return found;
11045 }
11046
11047
11049 {
11050
11051 super.OnRPC(sender, rpc_type,ctx);
11052
11053
11054 switch (rpc_type)
11055 {
11056 #ifndef SERVER
11057 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11058 Param2<bool, string> p = new Param2<bool, string>(false, "");
11059
11061 return;
11062
11063 bool play = p.param1;
11064 string soundSet = p.param2;
11065
11066 if (play)
11067 {
11069 {
11071 {
11073 }
11074 }
11075 else
11076 {
11078 }
11079 }
11080 else
11081 {
11083 }
11084
11085 break;
11086 #endif
11087
11088 }
11089
11091 {
11093 }
11094 }
11095
11096
11097
11098
11100 {
11101 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11102 return plugin.GetID(
name);
11103 }
11104
11106 {
11107 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11108 return plugin.GetName(id);
11109 }
11110
11113 {
11114
11115
11116 int varFlags;
11117 if (!ctx.
Read(varFlags))
11118 return;
11119
11120 if (varFlags & ItemVariableFlags.FLOAT)
11121 {
11123 }
11124 }
11125
11127 {
11128
11129 super.SerializeNumericalVars(floats_out);
11130
11131
11132
11134 {
11136 }
11137
11139 {
11141 }
11142
11144 {
11146 }
11147
11149 {
11154 }
11155
11157 {
11159 }
11160 }
11161
11163 {
11164
11165 super.DeSerializeNumericalVars(floats);
11166
11167
11168 int index = 0;
11169 int mask = Math.Round(floats.Get(index));
11170
11171 index++;
11172
11174 {
11176 {
11178 }
11179 else
11180 {
11181 float quantity = floats.Get(index);
11182 SetQuantity(quantity,
true,
false,
false,
false);
11183 }
11184 index++;
11185 }
11186
11188 {
11189 float wet = floats.Get(index);
11191 index++;
11192 }
11193
11195 {
11196 int liquidtype = Math.Round(floats.Get(index));
11198 index++;
11199 }
11200
11202 {
11204 index++;
11206 index++;
11208 index++;
11210 index++;
11211 }
11212
11214 {
11215 int cleanness = Math.Round(floats.Get(index));
11217 index++;
11218 }
11219 }
11220
11222 {
11223 super.WriteVarsToCTX(ctx);
11224
11225
11227 {
11229 }
11230
11232 {
11234 }
11235
11237 {
11239 }
11240
11242 {
11243 int r,g,b,a;
11249 }
11250
11252 {
11254 }
11255 }
11256
11258 {
11259 if (!super.ReadVarsFromCTX(ctx,version))
11260 return false;
11261
11262 int intValue;
11263 float value;
11264
11265 if (version < 140)
11266 {
11267 if (!ctx.
Read(intValue))
11268 return false;
11269
11270 m_VariablesMask = intValue;
11271 }
11272
11274 {
11275 if (!ctx.
Read(value))
11276 return false;
11277
11279 {
11281 }
11282 else
11283 {
11285 }
11286 }
11287
11288 if (version < 140)
11289 {
11291 {
11292 if (!ctx.
Read(value))
11293 return false;
11294 SetTemperatureDirect(value);
11295 }
11296 }
11297
11299 {
11300 if (!ctx.
Read(value))
11301 return false;
11303 }
11304
11306 {
11307 if (!ctx.
Read(intValue))
11308 return false;
11310 }
11311
11313 {
11314 int r,g,b,a;
11316 return false;
11318 return false;
11320 return false;
11322 return false;
11323
11325 }
11326
11328 {
11329 if (!ctx.
Read(intValue))
11330 return false;
11332 }
11333
11334 if (version >= 138 && version < 140)
11335 {
11337 {
11338 if (!ctx.
Read(intValue))
11339 return false;
11340 SetFrozen(intValue);
11341 }
11342 }
11343
11344 return true;
11345 }
11346
11347
11349 {
11352 {
11354 }
11355
11356 if (!super.OnStoreLoad(ctx, version))
11357 {
11359 return false;
11360 }
11361
11362 if (version >= 114)
11363 {
11364 bool hasQuickBarIndexSaved;
11365
11366 if (!ctx.
Read(hasQuickBarIndexSaved))
11367 {
11369 return false;
11370 }
11371
11372 if (hasQuickBarIndexSaved)
11373 {
11374 int itmQBIndex;
11375
11376
11377 if (!ctx.
Read(itmQBIndex))
11378 {
11380 return false;
11381 }
11382
11383 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11384 if (itmQBIndex != -1 && parentPlayer)
11385 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11386 }
11387 }
11388 else
11389 {
11390
11391 PlayerBase player;
11392 int itemQBIndex;
11393 if (version ==
int.
MAX)
11394 {
11395 if (!ctx.
Read(itemQBIndex))
11396 {
11398 return false;
11399 }
11400 }
11401 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11402 {
11403
11404 if (!ctx.
Read(itemQBIndex))
11405 {
11407 return false;
11408 }
11409 if (itemQBIndex != -1 && player)
11410 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11411 }
11412 }
11413
11414 if (version < 140)
11415 {
11416
11417 if (!LoadVariables(ctx, version))
11418 {
11420 return false;
11421 }
11422 }
11423
11424
11426 {
11428 return false;
11429 }
11430 if (version >= 132)
11431 {
11433 if (raib)
11434 {
11436 {
11438 return false;
11439 }
11440 }
11441 }
11442
11444 return true;
11445 }
11446
11447
11448
11450 {
11451 super.OnStoreSave(ctx);
11452
11453 PlayerBase player;
11454 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11455 {
11457
11458 int itemQBIndex = -1;
11459 itemQBIndex = player.FindQuickBarEntityIndex(this);
11460 ctx.
Write(itemQBIndex);
11461 }
11462 else
11463 {
11465 }
11466
11468
11470 if (raib)
11471 {
11473 }
11474 }
11475
11476
11478 {
11479 super.AfterStoreLoad();
11480
11482 {
11484 }
11485
11487 {
11490 }
11491 }
11492
11494 {
11495 super.EEOnAfterLoad();
11496
11498 {
11500 }
11501
11504 }
11505
11507 {
11508 return false;
11509 }
11510
11511
11512
11514 {
11516 {
11517 #ifdef PLATFORM_CONSOLE
11518
11520 {
11522 if (menu)
11523 {
11525 }
11526 }
11527 #endif
11528 }
11529
11531 {
11534 }
11535
11537 {
11538 SetWeightDirty();
11540 }
11542 {
11545 }
11546
11548 {
11551 }
11553 {
11556 }
11557
11558 super.OnVariablesSynchronized();
11559 }
11560
11561
11562
11564 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11565 {
11566 if (!IsServerCheck(allow_client))
11567 return false;
11568
11570 return false;
11571
11574
11575 if (value <= (min + 0.001))
11576 value = min;
11577
11578 if (value == min)
11579 {
11580 if (destroy_config)
11581 {
11582 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11583 if (dstr)
11584 {
11586 this.Delete();
11587 return true;
11588 }
11589 }
11590 else if (destroy_forced)
11591 {
11593 this.Delete();
11594 return true;
11595 }
11596
11598 }
11599
11602
11604 {
11606
11607 if (delta)
11609 }
11610
11612
11613 return false;
11614 }
11615
11616
11618 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11619 {
11621 }
11622
11624 {
11627 }
11628
11630 {
11633 }
11634
11637 {
11638 float value_clamped = Math.Clamp(value, 0, 1);
11640 SetQuantity(result, destroy_config, destroy_forced);
11641 }
11642
11643
11646 {
11648 }
11649
11651 {
11653 }
11654
11655
11656
11657
11658
11659
11660
11661
11662
11663
11665 {
11666 int slot = -1;
11667 if (GetInventory())
11668 {
11669 InventoryLocation il = new InventoryLocation;
11670 GetInventory().GetCurrentInventoryLocation(il);
11672 }
11673
11675 }
11676
11678 {
11679 float quantity_max = 0;
11680
11682 {
11683 if (attSlotID != -1)
11684 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11685
11686 if (quantity_max <= 0)
11688 }
11689
11690 if (quantity_max <= 0)
11692
11693 return quantity_max;
11694 }
11695
11697 {
11699 }
11700
11702 {
11704 }
11705
11706
11708 {
11710 }
11711
11713 {
11715 }
11716
11718 {
11720 }
11721
11722
11724 {
11725
11726 float weightEx = GetWeightEx();
11727 float special = GetInventoryAndCargoWeight();
11728 return weightEx - special;
11729 }
11730
11731
11733 {
11735 }
11736
11738 {
11740 {
11741 #ifdef DEVELOPER
11742 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11743 {
11744 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11746 }
11747 #endif
11748
11749 return GetQuantity() * GetConfigWeightModified();
11750 }
11751 else if (HasEnergyManager())
11752 {
11753 #ifdef DEVELOPER
11754 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11755 {
11756 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11757 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11758 }
11759 #endif
11760 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11761 }
11762 else
11763 {
11764 #ifdef DEVELOPER
11765 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11766 {
11767 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11768 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11769 }
11770 #endif
11771 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11772 }
11773 }
11774
11777 {
11778 int item_count = 0;
11780
11781 if (GetInventory().GetCargo() != NULL)
11782 {
11783 item_count = GetInventory().GetCargo().GetItemCount();
11784 }
11785
11786 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11787 {
11788 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11789 if (item)
11790 item_count += item.GetNumberOfItems();
11791 }
11792 return item_count;
11793 }
11794
11797 {
11798 float weight = 0;
11799 float wetness = 1;
11800 if (include_wetness)
11803 {
11804 weight = wetness * m_ConfigWeight;
11805 }
11807 {
11808 weight = 1;
11809 }
11810 return weight;
11811 }
11812
11813
11814
11816 {
11817 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11818 {
11819 GameInventory inv = GetInventory();
11820 array<EntityAI> items = new array<EntityAI>;
11822 for (int i = 0; i < items.Count(); i++)
11823 {
11825 if (item)
11826 {
11828 }
11829 }
11830 }
11831 }
11832
11833
11834
11835
11837 {
11838 float energy = 0;
11839 if (HasEnergyManager())
11840 {
11841 energy = GetCompEM().GetEnergy();
11842 }
11843 return energy;
11844 }
11845
11846
11848 {
11849 super.OnEnergyConsumed();
11850
11852 }
11853
11855 {
11856 super.OnEnergyAdded();
11857
11859 }
11860
11861
11863 {
11864 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11865 {
11867 {
11868 float energy_0to1 = GetCompEM().GetEnergy0To1();
11870 }
11871 }
11872 }
11873
11874
11876 {
11877 return ConfigGetFloat("heatIsolation");
11878 }
11879
11881 {
11883 }
11884
11886 {
11887 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11888 if (
GetGame().ConfigIsExisting(paramPath))
11890
11891 return 0.0;
11892 }
11893
11895 {
11896 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11897 if (
GetGame().ConfigIsExisting(paramPath))
11899
11900 return 0.0;
11901 }
11902
11903 override void SetWet(
float value,
bool allow_client =
false)
11904 {
11905 if (!IsServerCheck(allow_client))
11906 return;
11907
11910
11912
11913 m_VarWet = Math.Clamp(value, min, max);
11914
11916 {
11919 }
11920 }
11921
11922 override void AddWet(
float value)
11923 {
11925 }
11926
11928 {
11930 }
11931
11933 {
11935 }
11936
11938 {
11940 }
11941
11943 {
11945 }
11946
11948 {
11950 }
11951
11952 override void OnWetChanged(
float newVal,
float oldVal)
11953 {
11956 if (newLevel != oldLevel)
11957 {
11959 }
11960 }
11961
11963 {
11964 SetWeightDirty();
11965 }
11966
11968 {
11969 return GetWetLevelInternal(
m_VarWet);
11970 }
11971
11972
11973
11975 {
11977 }
11978
11980 {
11982 }
11983
11985 {
11987 }
11988
11990 {
11992 }
11993
11994
11995
11997 {
11998 if (ConfigIsExisting("itemModelLength"))
11999 {
12000 return ConfigGetFloat("itemModelLength");
12001 }
12002 return 0;
12003 }
12004
12006 {
12007 if (ConfigIsExisting("itemAttachOffset"))
12008 {
12009 return ConfigGetFloat("itemAttachOffset");
12010 }
12011 return 0;
12012 }
12013
12014 override void SetCleanness(
int value,
bool allow_client =
false)
12015 {
12016 if (!IsServerCheck(allow_client))
12017 return;
12018
12020
12022
12025 }
12026
12028 {
12030 }
12031
12033 {
12034 return true;
12035 }
12036
12037
12038
12039
12041 {
12043 }
12044
12046 {
12048 }
12049
12050
12051
12052
12053 override void SetColor(
int r,
int g,
int b,
int a)
12054 {
12060 }
12062 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12063 {
12068 }
12069
12071 {
12073 }
12074
12077 {
12078 int r,g,b,a;
12080 r = r/255;
12081 g = g/255;
12082 b = b/255;
12083 a = a/255;
12084 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12085 }
12086
12087
12088
12089 override void SetLiquidType(
int value,
bool allow_client =
false)
12090 {
12091 if (!IsServerCheck(allow_client))
12092 return;
12093
12098 }
12099
12101 {
12102 return ConfigGetInt("varLiquidTypeInit");
12103 }
12104
12106 {
12108 }
12109
12111 {
12113 SetFrozen(false);
12114 }
12115
12118 {
12119 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12120 }
12121
12122
12125 {
12126 PlayerBase nplayer;
12127 if (PlayerBase.CastTo(nplayer, player))
12128 {
12130
12131 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12132 }
12133 }
12134
12135
12138 {
12139 PlayerBase nplayer;
12140 if (PlayerBase.CastTo(nplayer,player))
12141 {
12142
12143 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12144
12145 }
12146
12147
12148 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12149
12150
12151 if (HasEnergyManager())
12152 {
12153 GetCompEM().UpdatePlugState();
12154 }
12155 }
12156
12157
12159 {
12160 super.OnPlacementStarted(player);
12161
12163 }
12164
12165 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12166 {
12168 {
12169 m_AdminLog.OnPlacementComplete(player,
this);
12170 }
12171
12172 super.OnPlacementComplete(player, position, orientation);
12173 }
12174
12175
12176
12177
12178
12180 {
12182 {
12183 return true;
12184 }
12185 else
12186 {
12187 return false;
12188 }
12189 }
12190
12191
12193 {
12195 {
12197 }
12198 }
12199
12200
12202 {
12204 }
12205
12207 {
12209 }
12210
12211 override void InsertAgent(
int agent,
float count = 1)
12212 {
12213 if (count < 1)
12214 return;
12215
12217 }
12218
12221 {
12223 }
12224
12225
12227 {
12229 }
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12262
12263
12264
12265
12266
12267
12268
12269
12270
12271
12273 {
12275 return false;
12276 return true;
12277 }
12278
12280 {
12281
12283 }
12284
12285
12288 {
12289 super.CheckForRoofLimited(timeTresholdMS);
12290
12292 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12293 {
12294 m_PreviousRoofTestTime = time;
12295 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12296 }
12297 }
12298
12299
12301 {
12303 {
12304 return 0;
12305 }
12306
12307 if (GetInventory().GetAttachmentSlotsCount() != 0)
12308 {
12309 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12310 if (filter)
12311 return filter.GetProtectionLevel(type, false, system);
12312 else
12313 return 0;
12314 }
12315
12316 string subclassPath, entryName;
12317
12318 switch (type)
12319 {
12321 entryName = "biological";
12322 break;
12324 entryName = "chemical";
12325 break;
12326 default:
12327 entryName = "biological";
12328 break;
12329 }
12330
12331 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12332
12334 }
12335
12336
12337
12340 {
12341 if (!IsMagazine())
12343
12345 }
12346
12347
12348
12349
12350
12355 {
12356 return true;
12357 }
12358
12360 {
12362 }
12363
12364
12365
12366
12367
12369 {
12370 if (parent)
12371 {
12372 if (parent.IsInherited(DayZInfected))
12373 return true;
12374
12375 if (!parent.IsRuined())
12376 return true;
12377 }
12378
12379 return true;
12380 }
12381
12383 {
12384 if (!super.CanPutAsAttachment(parent))
12385 {
12386 return false;
12387 }
12388
12389 if (!IsRuined() && !parent.IsRuined())
12390 {
12391 return true;
12392 }
12393
12394 return false;
12395 }
12396
12398 {
12399
12400
12401
12402
12403 return super.CanReceiveItemIntoCargo(item);
12404 }
12405
12407 {
12408
12409
12410
12411
12412 GameInventory attachmentInv = attachment.GetInventory();
12414 {
12415 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12416 return false;
12417 }
12418
12419 InventoryLocation loc = new InventoryLocation();
12420 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12421 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12422 return false;
12423
12424 return super.CanReceiveAttachment(attachment, slotId);
12425 }
12426
12428 {
12429 if (!super.CanReleaseAttachment(attachment))
12430 return false;
12431
12432 return GetInventory().AreChildrenAccessible();
12433 }
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12450
12451
12452
12453
12454
12456 {
12457 int id = muzzle_owner.GetMuzzleID();
12458 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12459
12460 if (WPOF_array)
12461 {
12462 for (int i = 0; i < WPOF_array.Count(); i++)
12463 {
12464 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12465
12466 if (WPOF)
12467 {
12468 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12469 }
12470 }
12471 }
12472 }
12473
12474
12476 {
12477 int id = muzzle_owner.GetMuzzleID();
12479
12480 if (WPOBE_array)
12481 {
12482 for (int i = 0; i < WPOBE_array.Count(); i++)
12483 {
12484 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12485
12486 if (WPOBE)
12487 {
12488 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12489 }
12490 }
12491 }
12492 }
12493
12494
12496 {
12497 int id = muzzle_owner.GetMuzzleID();
12498 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12499
12500 if (WPOOH_array)
12501 {
12502 for (int i = 0; i < WPOOH_array.Count(); i++)
12503 {
12504 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12505
12506 if (WPOOH)
12507 {
12508 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12509 }
12510 }
12511 }
12512 }
12513
12514
12516 {
12517 int id = muzzle_owner.GetMuzzleID();
12518 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12519
12520 if (WPOOH_array)
12521 {
12522 for (int i = 0; i < WPOOH_array.Count(); i++)
12523 {
12524 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12525
12526 if (WPOOH)
12527 {
12528 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12529 }
12530 }
12531 }
12532 }
12533
12534
12536 {
12537 int id = muzzle_owner.GetMuzzleID();
12538 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12539
12540 if (WPOOH_array)
12541 {
12542 for (int i = 0; i < WPOOH_array.Count(); i++)
12543 {
12544 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12545
12546 if (WPOOH)
12547 {
12548 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12549 }
12550 }
12551 }
12552 }
12553
12554
12555
12557 {
12559 {
12560 return true;
12561 }
12562
12563 return false;
12564 }
12565
12567 {
12569 {
12570 return true;
12571 }
12572
12573 return false;
12574 }
12575
12577 {
12579 {
12580 return true;
12581 }
12582
12583 return false;
12584 }
12585
12587 {
12588 return false;
12589 }
12590
12593 {
12594 return UATimeSpent.DEFAULT_DEPLOY;
12595 }
12596
12597
12598
12599
12601 {
12603 SetSynchDirty();
12604 }
12605
12607 {
12609 }
12610
12611
12613 {
12614 return false;
12615 }
12616
12619 {
12620 string att_type = "None";
12621
12622 if (ConfigIsExisting("soundAttType"))
12623 {
12624 att_type = ConfigGetString("soundAttType");
12625 }
12626
12628 }
12629
12631 {
12633 }
12634
12635
12636
12637
12638
12642
12644 {
12647
12649 }
12650
12651
12653 {
12655 return;
12656
12658
12661
12664
12665 SoundParameters params = new SoundParameters();
12669 }
12670
12671
12673 {
12675 return;
12676
12678 SetSynchDirty();
12679
12682 }
12683
12684
12686 {
12688 return;
12689
12691 SetSynchDirty();
12692
12695 }
12696
12698 {
12700 }
12701
12703 {
12705 }
12706
12709 {
12710 if (!
GetGame().IsDedicatedServer())
12711 {
12712 if (ConfigIsExisting("attachSoundSet"))
12713 {
12714 string cfg_path = "";
12715 string soundset = "";
12716 string type_name =
GetType();
12717
12720 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12721 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12722
12723 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12724 {
12725 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12726 {
12727 if (cfg_slot_array[i] == slot_type)
12728 {
12729 soundset = cfg_soundset_array[i];
12730 break;
12731 }
12732 }
12733 }
12734
12735 if (soundset != "")
12736 {
12737 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12739 }
12740 }
12741 }
12742 }
12743
12745 {
12746
12747 }
12748
12749 void OnApply(PlayerBase player);
12750
12752 {
12753 return 1.0;
12754 };
12755
12757 {
12759 }
12760
12762 {
12764 }
12765
12767
12769 {
12770 SetDynamicPhysicsLifeTime(0.01);
12772 }
12773
12775 {
12776 array<string> zone_names = new array<string>;
12777 GetDamageZones(zone_names);
12778 for (int i = 0; i < zone_names.Count(); i++)
12779 {
12780 SetHealthMax(zone_names.Get(i),"Health");
12781 }
12782 SetHealthMax("","Health");
12783 }
12784
12787 {
12788 float global_health = GetHealth01("","Health");
12789 array<string> zones = new array<string>;
12790 GetDamageZones(zones);
12791
12792 for (int i = 0; i < zones.Count(); i++)
12793 {
12794 SetHealth01(zones.Get(i),"Health",global_health);
12795 }
12796 }
12797
12800 {
12801 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12802 }
12803
12805 {
12806 if (!hasRootAsPlayer)
12807 {
12808 if (refParentIB)
12809 {
12810
12811 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12812 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12813
12814 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12815 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12816
12819 }
12820 else
12821 {
12822
12825 }
12826 }
12827 }
12828
12830 {
12832 {
12833 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12834 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12835 {
12836 float heatPermCoef = 1.0;
12838 while (ent)
12839 {
12840 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12841 ent = ent.GetHierarchyParent();
12842 }
12843
12844 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12845 }
12846 }
12847 }
12848
12850 {
12851
12852 EntityAI parent = GetHierarchyParent();
12853 if (!parent)
12854 {
12855 hasParent = false;
12856 hasRootAsPlayer = false;
12857 }
12858 else
12859 {
12860 hasParent = true;
12861 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12862 refParentIB =
ItemBase.Cast(parent);
12863 }
12864 }
12865
12866 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12867 {
12868
12869 }
12870
12872 {
12873
12874 return false;
12875 }
12876
12878 {
12879
12880
12881 return false;
12882 }
12883
12885 {
12886
12887 return false;
12888 }
12889
12892 {
12893 return !GetIsFrozen() &&
IsOpen();
12894 }
12895
12897 {
12898 bool hasParent = false, hasRootAsPlayer = false;
12900
12901 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12902 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12903
12904 if (wwtu || foodDecay)
12905 {
12909
12910 if (processWetness || processTemperature || processDecay)
12911 {
12913
12914 if (processWetness)
12915 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12916
12917 if (processTemperature)
12919
12920 if (processDecay)
12921 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12922 }
12923 }
12924 }
12925
12928 {
12930 }
12931
12933 {
12936
12937 return super.GetTemperatureFreezeThreshold();
12938 }
12939
12941 {
12944
12945 return super.GetTemperatureThawThreshold();
12946 }
12947
12949 {
12952
12953 return super.GetItemOverheatThreshold();
12954 }
12955
12957 {
12959 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12960
12961 return super.GetTemperatureFreezeTime();
12962 }
12963
12965 {
12967 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12968
12969 return super.GetTemperatureThawTime();
12970 }
12971
12976
12978 {
12979 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12980 }
12981
12983 {
12984 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12985 }
12986
12989 {
12991 }
12992
12994 {
12996 }
12997
12999 {
13001 }
13002
13005 {
13006 return null;
13007 }
13008
13011 {
13012 return false;
13013 }
13014
13016 {
13018 {
13021 if (!trg)
13022 {
13024 explosive = this;
13025 }
13026
13027 explosive.PairRemote(trg);
13029
13030 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13031 trg.SetPersistentPairID(persistentID);
13032 explosive.SetPersistentPairID(persistentID);
13033
13034 return true;
13035 }
13036 return false;
13037 }
13038
13041 {
13042 float ret = 1.0;
13045 ret *= GetHealth01();
13046
13047 return ret;
13048 }
13049
13050 #ifdef DEVELOPER
13051 override void SetDebugItem()
13052 {
13053 super.SetDebugItem();
13054 _itemBase = this;
13055 }
13056
13058 {
13059 string text = super.GetDebugText();
13060
13062 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13063
13064 return text;
13065 }
13066 #endif
13067
13069 {
13070 return true;
13071 }
13072
13074
13076
13078 {
13081 }
13082
13083
13091
13107}
13108
13110{
13112 if (entity)
13113 {
13114 bool is_item = entity.IsInherited(
ItemBase);
13115 if (is_item && full_quantity)
13116 {
13119 }
13120 }
13121 else
13122 {
13124 return NULL;
13125 }
13126 return entity;
13127}
13128
13130{
13131 if (item)
13132 {
13133 if (health > 0)
13134 item.SetHealth("", "", health);
13135
13136 if (item.CanHaveTemperature())
13137 {
13139 if (item.CanFreeze())
13140 item.SetFrozen(false);
13141 }
13142
13143 if (item.HasEnergyManager())
13144 {
13145 if (quantity >= 0)
13146 {
13147 item.GetCompEM().SetEnergy0To1(quantity);
13148 }
13149 else
13150 {
13152 }
13153 }
13154 else if (item.IsMagazine())
13155 {
13156 Magazine mag = Magazine.Cast(item);
13157 if (quantity >= 0)
13158 {
13159 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13160 }
13161 else
13162 {
13164 }
13165
13166 }
13167 else
13168 {
13169 if (quantity >= 0)
13170 {
13171 item.SetQuantityNormalized(quantity, false);
13172 }
13173 else
13174 {
13176 }
13177
13178 }
13179 }
13180}
13181
13182#ifdef DEVELOPER
13184#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.