8326{
8328 {
8329 return true;
8330 }
8331};
8332
8333
8334
8336{
8340
8342
8345
8346
8347
8348
8349
8358
8364
8369
8374
8395 protected bool m_IsResultOfSplit
8396
8398
8403
8404
8405
8407
8411
8412
8413
8415
8418
8419
8420
8426
8427
8435
8438
8439
8441
8442
8444
8445
8450
8451
8456
8457
8459
8460
8462 {
8467
8468 if (!
GetGame().IsDedicatedServer())
8469 {
8471 {
8473
8475 {
8477 }
8478 }
8479
8482 }
8483
8484 m_OldLocation = null;
8485
8487 {
8489 }
8490
8491 if (ConfigIsExisting("headSelectionsToHide"))
8492 {
8495 }
8496
8498 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8499 {
8501 }
8502
8504
8505 m_IsResultOfSplit = false;
8506
8508 }
8509
8511 {
8512 super.InitItemVariables();
8513
8519 m_Count = ConfigGetInt(
"count");
8520
8523
8528
8531
8536
8548
8552
8553
8556 if (ConfigIsExisting("canBeSplit"))
8557 {
8560 }
8561
8563 if (ConfigIsExisting("itemBehaviour"))
8565
8566
8569 RegisterNetSyncVariableInt("m_VarLiquidType");
8570 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8571
8572 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8573 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8574 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8575
8576 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8577 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8578 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8579 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8580
8581 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8582 RegisterNetSyncVariableBool("m_IsTakeable");
8583 RegisterNetSyncVariableBool("m_IsHologram");
8584
8587 {
8590 }
8591
8593
8595 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8597
8598 }
8599
8601 {
8603 }
8604
8606 {
8609 {
8614 }
8615 }
8616
8617 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8618 {
8620 {
8623 }
8624
8626 }
8627
8629 {
8635 }
8636
8638
8640 {
8642
8643 if (!action)
8644 {
8645 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8646 return;
8647 }
8648
8650 if (!ai)
8651 {
8653 return;
8654 }
8655
8657 if (!action_array)
8658 {
8659 action_array = new array<ActionBase_Basic>;
8661 }
8662 if (LogManager.IsActionLogEnable())
8663 {
8664 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8665 }
8666
8667 if (action_array.Find(action) != -1)
8668 {
8669 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8670 }
8671 else
8672 {
8673 action_array.Insert(action);
8674 }
8675 }
8676
8678 {
8680 ActionBase action = player.GetActionManager().GetAction(actionName);
8683
8684 if (action_array)
8685 {
8686 action_array.RemoveItem(action);
8687 }
8688 }
8689
8690
8691
8693 {
8694 ActionOverrideData overrideData = new ActionOverrideData();
8698
8700 if (!actionMap)
8701 {
8704 }
8705
8706 actionMap.Insert(this.
Type(), overrideData);
8707
8708 }
8709
8711
8713
8714
8716 {
8719
8722
8723 string config_to_search = "CfgVehicles";
8724 string muzzle_owner_config;
8725
8727 {
8728 if (IsInherited(Weapon))
8729 config_to_search = "CfgWeapons";
8730
8731 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8732
8733 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8734
8736
8737 if (config_OnFire_subclass_count > 0)
8738 {
8739 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8740
8741 for (int i = 0; i < config_OnFire_subclass_count; i++)
8742 {
8743 string particle_class = "";
8745 string config_OnFire_entry = config_OnFire_class + particle_class;
8746 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8747 WPOF_array.Insert(WPOF);
8748 }
8749
8750
8752 }
8753 }
8754
8756 {
8757 config_to_search = "CfgWeapons";
8758 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8759
8760 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8761
8763
8764 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8765 {
8766 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8767
8768 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8769 {
8770 string particle_class2 = "";
8772 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8773 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8774 WPOBE_array.Insert(WPOBE);
8775 }
8776
8777
8779 }
8780 }
8781 }
8782
8783
8785 {
8788
8790 {
8791 string config_to_search = "CfgVehicles";
8792
8793 if (IsInherited(Weapon))
8794 config_to_search = "CfgWeapons";
8795
8796 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8797 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8798
8799 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8800 {
8801
8803
8805 {
8807 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8809 return;
8810 }
8811
8814
8815
8816
8818 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8819
8820 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8821 {
8822 string particle_class = "";
8824 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8826
8827 if (entry_type == CT_CLASS)
8828 {
8829 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8830 WPOOH_array.Insert(WPOF);
8831 }
8832 }
8833
8834
8836 }
8837 }
8838 }
8839
8841 {
8843 }
8844
8846 {
8848 {
8850
8853
8856
8857 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8858 }
8859 }
8860
8862 {
8864 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8865
8867 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8868
8870 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8871
8873 {
8875 }
8876 }
8877
8879 {
8881 }
8882
8884 {
8887 else
8889
8891 {
8894 }
8895 else
8896 {
8899
8902 }
8903
8905 }
8906
8908 {
8910 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8911 }
8912
8914 {
8916 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8918 }
8919
8921 {
8923 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8924 }
8925
8927 {
8930
8931 OverheatingParticle OP = new OverheatingParticle();
8936
8938 }
8939
8941 {
8944
8945 return -1;
8946 }
8947
8949 {
8951 {
8954
8955 for (int i = count; i > 0; --i)
8956 {
8957 int id = i - 1;
8960
8963
8964 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8965 {
8966 if (p)
8967 {
8970 }
8971 }
8972 }
8973 }
8974 }
8975
8977 {
8979 {
8981 {
8982 int id = i - 1;
8984
8985 if (OP)
8986 {
8988
8989 if (p)
8990 {
8992 }
8993
8994 delete OP;
8995 }
8996 }
8997
9000 }
9001 }
9002
9005 {
9006 return 0.0;
9007 }
9008
9009
9011 {
9012 return 250;
9013 }
9014
9016 {
9017 return 0;
9018 }
9019
9022 {
9024 return true;
9025
9026 return false;
9027 }
9028
9031 {
9034
9036 {
9038 }
9039 else
9040 {
9041
9043 }
9044
9046 }
9047
9054 {
9055 return -1;
9056 }
9057
9058
9059
9060
9062 {
9064 {
9066 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9067
9068 if (r_index >= 0)
9069 {
9070 InventoryLocation r_il = new InventoryLocation;
9071 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9072
9073 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9076 {
9077 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9078 }
9080 {
9081 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9082 }
9083
9084 }
9085
9086 player.GetHumanInventory().ClearUserReservedLocation(this);
9087 }
9088
9091 }
9092
9093
9094
9095
9097 {
9098 return ItemBase.m_DebugActionsMask;
9099 }
9100
9102 {
9103 return ItemBase.m_DebugActionsMask & mask;
9104 }
9105
9107 {
9108 ItemBase.m_DebugActionsMask = mask;
9109 }
9110
9112 {
9113 ItemBase.m_DebugActionsMask |= mask;
9114 }
9115
9117 {
9118 ItemBase.m_DebugActionsMask &= ~mask;
9119 }
9120
9122 {
9124 {
9126 }
9127 else
9128 {
9130 }
9131 }
9132
9133
9135 {
9136 if (GetEconomyProfile())
9137 {
9138 float q_max = GetEconomyProfile().GetQuantityMax();
9139 if (q_max > 0)
9140 {
9141 float q_min = GetEconomyProfile().GetQuantityMin();
9142 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9143
9145 {
9146 ComponentEnergyManager comp = GetCompEM();
9148 {
9150 }
9151 }
9153 {
9155
9156 }
9157
9158 }
9159 }
9160 }
9161
9164 {
9165 EntityAI parent = GetHierarchyParent();
9166
9167 if (parent)
9168 {
9169 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9170 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9171 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9172 }
9173 }
9174
9177 {
9178 EntityAI parent = GetHierarchyParent();
9179
9180 if (parent)
9181 {
9182 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9183 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9184 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9185 }
9186 }
9187
9189 {
9190
9191
9192
9193
9195
9197 {
9198 if (ScriptInputUserData.CanStoreInputUserData())
9199 {
9200 ScriptInputUserData ctx = new ScriptInputUserData;
9206 ctx.
Write(use_stack_max);
9209
9211 {
9212 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9213 }
9214 }
9215 }
9216 else if (!
GetGame().IsMultiplayer())
9217 {
9219 }
9220 }
9221
9223 {
9225 }
9226
9228 {
9230 }
9231
9233 {
9235 }
9236
9238 {
9239
9240 return false;
9241 }
9242
9244 {
9245 return false;
9246 }
9247
9251 {
9252 return false;
9253 }
9254
9256 {
9257 return "";
9258 }
9259
9261
9263 {
9264 return false;
9265 }
9266
9268 {
9269 return true;
9270 }
9271
9272
9273
9275 {
9276 return true;
9277 }
9278
9280 {
9281 return true;
9282 }
9283
9285 {
9286 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9288 }
9289
9291 {
9293 }
9294
9296 {
9298 if (!is_being_placed)
9300 SetSynchDirty();
9301 }
9302
9303
9305
9307 {
9309 }
9310
9312 {
9314 }
9315
9317 {
9318 return 1;
9319 }
9320
9322 {
9323 return false;
9324 }
9325
9327 {
9329 SetSynchDirty();
9330 }
9331
9332
9333
9334
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
9367 {
9368 super.OnMovedInsideCargo(container);
9369
9370 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9371 }
9372
9373 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9374 {
9375 super.EEItemLocationChanged(oldLoc,newLoc);
9376
9377 PlayerBase new_player = null;
9378 PlayerBase old_player = null;
9379
9380 if (newLoc.GetParent())
9381 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9382
9383 if (oldLoc.GetParent())
9384 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9385
9387 {
9388 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9389
9390 if (r_index >= 0)
9391 {
9392 InventoryLocation r_il = new InventoryLocation;
9393 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9394
9395 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9398 {
9399 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9400 }
9402 {
9403 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9404 }
9405
9406 }
9407 }
9408
9410 {
9411 if (new_player)
9412 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9413
9414 if (new_player == old_player)
9415 {
9416
9417 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9418 {
9420 {
9421 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9422 {
9423 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9424 }
9425 }
9426 else
9427 {
9428 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9429 }
9430 }
9431
9432 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9433 {
9434 int type = oldLoc.GetType();
9436 {
9437 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9438 }
9440 {
9441 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9442 }
9443 }
9444 if (!m_OldLocation)
9445 {
9446 m_OldLocation = new InventoryLocation;
9447 }
9448 m_OldLocation.Copy(oldLoc);
9449 }
9450 else
9451 {
9452 if (m_OldLocation)
9453 {
9454 m_OldLocation.Reset();
9455 }
9456 }
9457
9459 }
9460 else
9461 {
9462 if (new_player)
9463 {
9464 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9465 if (res_index >= 0)
9466 {
9467 InventoryLocation il = new InventoryLocation;
9468 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9470 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9473 {
9474 il.
GetParent().GetOnReleaseLock().Invoke(it);
9475 }
9477 {
9479 }
9480
9481 }
9482 }
9484 {
9485
9487 }
9488
9489 if (m_OldLocation)
9490 {
9491 m_OldLocation.Reset();
9492 }
9493 }
9494 }
9495
9496 override void EOnContact(IEntity other, Contact extra)
9497 {
9499 {
9500 int liquidType = -1;
9502 if (impactSpeed > 0.0)
9503 {
9505 #ifndef SERVER
9507 #else
9509 SetSynchDirty();
9510 #endif
9512 }
9513 }
9514
9515 #ifdef SERVER
9516 if (GetCompEM() && GetCompEM().IsPlugged())
9517 {
9518 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9519 GetCompEM().UnplugThis();
9520 }
9521 #endif
9522 }
9523
9525
9527 {
9529 }
9530
9532 {
9533
9534 }
9535
9537 {
9538 super.OnItemLocationChanged(old_owner, new_owner);
9539
9540 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9541 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9542
9543 if (!relatedPlayer && playerNew)
9544 relatedPlayer = playerNew;
9545
9546 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9547 {
9549 if (actionMgr)
9550 {
9551 ActionBase currentAction = actionMgr.GetRunningAction();
9552 if (currentAction)
9554 }
9555 }
9556
9557 Man ownerPlayerOld = null;
9558 Man ownerPlayerNew = null;
9559
9560 if (old_owner)
9561 {
9562 if (old_owner.
IsMan())
9563 {
9564 ownerPlayerOld = Man.Cast(old_owner);
9565 }
9566 else
9567 {
9568 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9569 }
9570 }
9571 else
9572 {
9574 {
9576
9577 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9578 {
9579 GetCompEM().UnplugThis();
9580 }
9581 }
9582 }
9583
9584 if (new_owner)
9585 {
9586 if (new_owner.
IsMan())
9587 {
9588 ownerPlayerNew = Man.Cast(new_owner);
9589 }
9590 else
9591 {
9592 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9593 }
9594 }
9595
9596 if (ownerPlayerOld != ownerPlayerNew)
9597 {
9598 if (ownerPlayerOld)
9599 {
9600 array<EntityAI> subItemsExit = new array<EntityAI>;
9602 for (int i = 0; i < subItemsExit.Count(); i++)
9603 {
9606 }
9607 }
9608
9609 if (ownerPlayerNew)
9610 {
9611 array<EntityAI> subItemsEnter = new array<EntityAI>;
9613 for (int j = 0; j < subItemsEnter.Count(); j++)
9614 {
9617 }
9618 }
9619 }
9620 else if (ownerPlayerNew != null)
9621 {
9622 PlayerBase nplayer;
9623 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9624 {
9625 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9627 for (int k = 0; k < subItemsUpdate.Count(); k++)
9628 {
9630 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9631 }
9632 }
9633 }
9634
9635 if (old_owner)
9636 old_owner.OnChildItemRemoved(this);
9637 if (new_owner)
9638 new_owner.OnChildItemReceived(this);
9639 }
9640
9641
9643 {
9644 super.EEDelete(parent);
9645 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9646 if (player)
9647 {
9649
9650 if (player.IsAlive())
9651 {
9652 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9653 if (r_index >= 0)
9654 {
9655 InventoryLocation r_il = new InventoryLocation;
9656 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9657
9658 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9661 {
9662 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9663 }
9665 {
9666 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9667 }
9668
9669 }
9670
9671 player.RemoveQuickBarEntityShortcut(this);
9672 }
9673 }
9674 }
9675
9677 {
9678 super.EEKilled(killer);
9679
9682 {
9683 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9684 {
9685 if (IsMagazine())
9686 {
9687 if (Magazine.Cast(this).GetAmmoCount() > 0)
9688 {
9690 }
9691 }
9692 else
9693 {
9695 }
9696 }
9697 }
9698 }
9699
9701 {
9702 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9703
9704 super.OnWasAttached(parent, slot_id);
9705
9708
9710 }
9711
9713 {
9714 super.OnWasDetached(parent, slot_id);
9715
9718 }
9719
9721 {
9722 int idx;
9725
9726 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9727 if (inventory_slots.Count() < 1)
9728 {
9729 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9730 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9731 }
9732 else
9733 {
9734 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9735 }
9736
9737 idx = inventory_slots.Find(slot);
9738 if (idx < 0)
9739 return "";
9740
9741 return attach_types.Get(idx);
9742 }
9743
9745 {
9746 int idx = -1;
9747 string slot;
9748
9751
9752 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9753 if (inventory_slots.Count() < 1)
9754 {
9755 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9756 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9757 }
9758 else
9759 {
9760 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9761 if (detach_types.Count() < 1)
9762 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9763 }
9764
9765 for (int i = 0; i < inventory_slots.Count(); i++)
9766 {
9767 slot = inventory_slots.Get(i);
9768 }
9769
9770 if (slot != "")
9771 {
9772 if (detach_types.Count() == 1)
9773 idx = 0;
9774 else
9775 idx = inventory_slots.Find(slot);
9776 }
9777 if (idx < 0)
9778 return "";
9779
9780 return detach_types.Get(idx);
9781 }
9782
9784 {
9785
9787
9788
9789 float min_time = 1;
9790 float max_time = 3;
9791 float delay = Math.RandomFloat(min_time, max_time);
9792
9793 explode_timer.Run(delay, this, "DoAmmoExplosion");
9794 }
9795
9797 {
9798 Magazine magazine = Magazine.Cast(this);
9799 int pop_sounds_count = 6;
9800 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9801
9802
9803 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9804 string sound_name = pop_sounds[ sound_idx ];
9806
9807
9808 magazine.ServerAddAmmoCount(-1);
9809
9810
9811 float min_temp_to_explode = 100;
9812
9813 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9814 {
9816 }
9817 }
9818
9819
9820 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9821 {
9822 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9823
9824 const int CHANCE_DAMAGE_CARGO = 4;
9825 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9826 const int CHANCE_DAMAGE_NOTHING = 2;
9827
9829 {
9830 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9831 int chances;
9832 int rnd;
9833
9834 if (GetInventory().GetCargo())
9835 {
9836 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9837 rnd = Math.RandomInt(0,chances);
9838
9839 if (rnd < CHANCE_DAMAGE_CARGO)
9840 {
9842 }
9843 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9844 {
9846 }
9847 }
9848 else
9849 {
9850 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9851 rnd = Math.RandomInt(0,chances);
9852
9853 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9854 {
9856 }
9857 }
9858 }
9859 }
9860
9862 {
9863 if (GetInventory().GetCargo())
9864 {
9865 int item_count = GetInventory().GetCargo().GetItemCount();
9866 if (item_count > 0)
9867 {
9868 int random_pick = Math.RandomInt(0, item_count);
9870 if (!item.IsExplosive())
9871 {
9872 item.AddHealth("","",damage);
9873 return true;
9874 }
9875 }
9876 }
9877 return false;
9878 }
9879
9881 {
9882 int attachment_count = GetInventory().AttachmentCount();
9883 if (attachment_count > 0)
9884 {
9885 int random_pick = Math.RandomInt(0, attachment_count);
9886 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9887 if (!attachment.IsExplosive())
9888 {
9889 attachment.AddHealth("","",damage);
9890 return true;
9891 }
9892 }
9893 return false;
9894 }
9895
9897 {
9899 }
9900
9902 {
9904 return GetInventory().CanRemoveEntity();
9905
9906 return false;
9907 }
9908
9910 {
9912 return;
9913
9915 {
9916 if (ScriptInputUserData.CanStoreInputUserData())
9917 {
9918 ScriptInputUserData ctx = new ScriptInputUserData;
9923 ctx.
Write(destination_entity);
9927 }
9928 }
9929 else if (!
GetGame().IsMultiplayer())
9930 {
9932 }
9933 }
9934
9936 {
9938 return;
9939
9940 float split_quantity_new;
9944 InventoryLocation loc = new InventoryLocation;
9945
9946 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9947 {
9949 split_quantity_new = stack_max;
9950 else
9952
9953 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9954 if (new_item)
9955 {
9956 new_item.SetResultOfSplit(true);
9957 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9959 new_item.SetQuantity(split_quantity_new);
9960 }
9961 }
9962 else if (destination_entity && slot_id == -1)
9963 {
9964 if (quantity > stack_max)
9965 split_quantity_new = stack_max;
9966 else
9967 split_quantity_new = quantity;
9968
9970 {
9973 }
9974
9975 if (new_item)
9976 {
9977 new_item.SetResultOfSplit(true);
9978 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9980 new_item.SetQuantity(split_quantity_new);
9981 }
9982 }
9983 else
9984 {
9985 if (stack_max != 0)
9986 {
9988 {
9990 }
9991
9992 if (split_quantity_new == 0)
9993 {
9994 if (!
GetGame().IsMultiplayer())
9995 player.PhysicalPredictiveDropItem(this);
9996 else
9997 player.ServerDropEntity(this);
9998 return;
9999 }
10000
10002
10003 if (new_item)
10004 {
10005 new_item.SetResultOfSplit(true);
10006 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10008 new_item.SetQuantity(stack_max);
10009 new_item.PlaceOnSurface();
10010 }
10011 }
10012 }
10013 }
10014
10016 {
10018 return;
10019
10020 float split_quantity_new;
10024 InventoryLocation loc = new InventoryLocation;
10025
10026 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10027 {
10029 split_quantity_new = stack_max;
10030 else
10032
10033 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10034 if (new_item)
10035 {
10036 new_item.SetResultOfSplit(true);
10037 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10039 new_item.SetQuantity(split_quantity_new);
10040 }
10041 }
10042 else if (destination_entity && slot_id == -1)
10043 {
10044 if (quantity > stack_max)
10045 split_quantity_new = stack_max;
10046 else
10047 split_quantity_new = quantity;
10048
10050 {
10053 }
10054
10055 if (new_item)
10056 {
10057 new_item.SetResultOfSplit(true);
10058 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10060 new_item.SetQuantity(split_quantity_new);
10061 }
10062 }
10063 else
10064 {
10065 if (stack_max != 0)
10066 {
10068 {
10070 }
10071
10073
10074 if (new_item)
10075 {
10076 new_item.SetResultOfSplit(true);
10077 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10079 new_item.SetQuantity(stack_max);
10080 new_item.PlaceOnSurface();
10081 }
10082 }
10083 }
10084 }
10085
10087 {
10089 return;
10090
10092 {
10093 if (ScriptInputUserData.CanStoreInputUserData())
10094 {
10095 ScriptInputUserData ctx = new ScriptInputUserData;
10100 dst.WriteToContext(ctx);
10102 }
10103 }
10104 else if (!
GetGame().IsMultiplayer())
10105 {
10107 }
10108 }
10109
10111 {
10113 return;
10114
10116 {
10117 if (ScriptInputUserData.CanStoreInputUserData())
10118 {
10119 ScriptInputUserData ctx = new ScriptInputUserData;
10124 ctx.
Write(destination_entity);
10130 }
10131 }
10132 else if (!
GetGame().IsMultiplayer())
10133 {
10135 }
10136 }
10137
10139 {
10141 }
10142
10144 {
10146 return this;
10147
10149 float split_quantity_new;
10151 if (dst.IsValid())
10152 {
10153 int slot_id = dst.GetSlot();
10155
10156 if (quantity > stack_max)
10157 split_quantity_new = stack_max;
10158 else
10159 split_quantity_new = quantity;
10160
10162
10163 if (new_item)
10164 {
10165 new_item.SetResultOfSplit(true);
10166 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10169 }
10170
10171 return new_item;
10172 }
10173
10174 return null;
10175 }
10176
10178 {
10180 return;
10181
10183 float split_quantity_new;
10185 if (destination_entity)
10186 {
10188 if (quantity > stackable)
10189 split_quantity_new = stackable;
10190 else
10191 split_quantity_new = quantity;
10192
10193 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10194 if (new_item)
10195 {
10196 new_item.SetResultOfSplit(true);
10197 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10199 new_item.SetQuantity(split_quantity_new);
10200 }
10201 }
10202 }
10203
10205 {
10207 return;
10208
10210 {
10211 if (ScriptInputUserData.CanStoreInputUserData())
10212 {
10213 ScriptInputUserData ctx = new ScriptInputUserData;
10218 ItemBase destination_entity =
this;
10219 ctx.
Write(destination_entity);
10223 }
10224 }
10225 else if (!
GetGame().IsMultiplayer())
10226 {
10228 }
10229 }
10230
10232 {
10234 return;
10235
10237 float split_quantity_new;
10239 if (player)
10240 {
10242 if (quantity > stackable)
10243 split_quantity_new = stackable;
10244 else
10245 split_quantity_new = quantity;
10246
10247 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10248 new_item =
ItemBase.Cast(in_hands);
10249 if (new_item)
10250 {
10251 new_item.SetResultOfSplit(true);
10252 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10254 new_item.SetQuantity(split_quantity_new);
10255 }
10256 }
10257 }
10258
10260 {
10262 return;
10263
10265 float split_quantity_new = Math.Floor(quantity * 0.5);
10266
10268
10269 if (new_item)
10270 {
10271 if (new_item.GetQuantityMax() < split_quantity_new)
10272 {
10273 split_quantity_new = new_item.GetQuantityMax();
10274 }
10275
10276 new_item.SetResultOfSplit(true);
10277 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10278
10280 {
10283 }
10284 else
10285 {
10288 }
10289 }
10290 }
10291
10293 {
10295 return;
10296
10298 float split_quantity_new = Math.Floor(quantity / 2);
10299
10300 InventoryLocation invloc = new InventoryLocation;
10302
10304 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10305
10306 if (new_item)
10307 {
10308 if (new_item.GetQuantityMax() < split_quantity_new)
10309 {
10310 split_quantity_new = new_item.GetQuantityMax();
10311 }
10313 {
10316 }
10317 else
10318 {
10321 }
10322 }
10323 }
10324
10327 {
10328 SetWeightDirty();
10330
10331 if (parent)
10332 parent.OnAttachmentQuantityChangedEx(this, delta);
10333
10335 {
10337 {
10339 }
10341 {
10342 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10344 }
10345 }
10346
10347 }
10348
10351 {
10352
10353 }
10354
10357 {
10359 }
10360
10362 {
10363 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10364
10366 {
10367 if (newLevel == GameConstants.STATE_RUINED)
10368 {
10370 EntityAI parent = GetHierarchyParent();
10371 if (parent && parent.IsFireplace())
10372 {
10373 CargoBase cargo = GetInventory().GetCargo();
10374 if (cargo)
10375 {
10377 {
10379 }
10380 }
10381 }
10382 }
10383
10385 {
10386
10388 return;
10389 }
10390
10391 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10392 {
10394 }
10395 }
10396 }
10397
10398
10400 {
10401 super.OnRightClick();
10402
10404 {
10406 {
10407 if (ScriptInputUserData.CanStoreInputUserData())
10408 {
10409 vector m4[4];
10411
10412 EntityAI root = GetHierarchyRoot();
10413
10414 InventoryLocation dst = new InventoryLocation;
10416 {
10417 if (root)
10418 {
10419 root.GetTransform(m4);
10421 }
10422 else
10423 GetInventory().GetCurrentInventoryLocation(dst);
10424 }
10425 else
10426 {
10428
10429
10430 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10431 {
10432 if (root)
10433 {
10434 root.GetTransform(m4);
10436 }
10437 else
10438 GetInventory().GetCurrentInventoryLocation(dst);
10439 }
10440 else
10441 {
10442 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10443 }
10444 }
10445
10446 ScriptInputUserData ctx = new ScriptInputUserData;
10454 }
10455 }
10456 else if (!
GetGame().IsMultiplayer())
10457 {
10459 }
10460 }
10461 }
10462
10463 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10464 {
10465
10466 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10467 return false;
10468
10469 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10470 return false;
10471
10472
10474 return false;
10475
10476
10477 Magazine mag = Magazine.Cast(this);
10478 if (mag)
10479 {
10480 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10481 return false;
10482
10483 if (stack_max_limit)
10484 {
10485 Magazine other_mag = Magazine.Cast(other_item);
10486 if (other_item)
10487 {
10488 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10489 return false;
10490 }
10491
10492 }
10493 }
10494 else
10495 {
10496
10498 return false;
10499
10501 return false;
10502 }
10503
10504 PlayerBase player = null;
10505 if (CastTo(player, GetHierarchyRootPlayer()))
10506 {
10507 if (player.GetInventory().HasAttachment(this))
10508 return false;
10509
10510 if (player.IsItemsToDelete())
10511 return false;
10512 }
10513
10514 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10515 return false;
10516
10517 int slotID;
10519 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10520 return false;
10521
10522 return true;
10523 }
10524
10526 {
10528 }
10529
10531 {
10532 return m_IsResultOfSplit;
10533 }
10534
10536 {
10537 m_IsResultOfSplit = value;
10538 }
10539
10541 {
10543 }
10544
10546 {
10547 float other_item_quantity = other_item.GetQuantity();
10548 float this_free_space;
10549
10551
10553
10554 if (other_item_quantity > this_free_space)
10555 {
10556 return this_free_space;
10557 }
10558 else
10559 {
10560 return other_item_quantity;
10561 }
10562 }
10563
10565 {
10567 }
10568
10570 {
10572 return;
10573
10574 if (!IsMagazine() && other_item)
10575 {
10577 if (quantity_used != 0)
10578 {
10579 float hp1 = GetHealth01("","");
10580 float hp2 = other_item.GetHealth01("","");
10581 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10582 hpResult = hpResult / (
GetQuantity() + quantity_used);
10583
10584 hpResult *= GetMaxHealth();
10585 Math.Round(hpResult);
10586 SetHealth("", "Health", hpResult);
10587
10589 other_item.AddQuantity(-quantity_used);
10590 }
10591 }
10593 }
10594
10596 {
10597 #ifdef SERVER
10598 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10599 GetHierarchyParent().IncreaseLifetimeUp();
10600 #endif
10601 };
10602
10604 {
10605 PlayerBase p = PlayerBase.Cast(player);
10606
10607 array<int> recipesIds = p.m_Recipes;
10608 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10609 if (moduleRecipesManager)
10610 {
10611 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10612 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10613 }
10614
10615 for (int i = 0;i < recipesIds.Count(); i++)
10616 {
10617 int key = recipesIds.Get(i);
10618 string recipeName = moduleRecipesManager.GetRecipeName(key);
10620 }
10621 }
10622
10623
10624 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10625 {
10626 super.GetDebugActions(outputList);
10627
10628
10633
10634
10638
10642
10643
10646
10647
10649 {
10652 }
10653
10655
10658
10662 }
10663
10664
10665
10666
10668 {
10669 super.OnAction(action_id, player, ctx);
10670 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10671 {
10672 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10673 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10674 PlayerBase p = PlayerBase.Cast(player);
10675 if (
EActions.RECIPES_RANGE_START < 1000)
10676 {
10677 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10678 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10679 }
10680 }
10681 #ifndef SERVER
10682 else if (action_id ==
EActions.WATCH_PLAYER)
10683 {
10684 PluginDeveloper.SetDeveloperItemClientEx(player);
10685 }
10686 #endif
10688 {
10689 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10690 {
10691 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10692 OnDebugButtonPressServer(id + 1);
10693 }
10694
10695 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10696 {
10697 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10699 }
10700
10701 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10702 {
10703 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10705 }
10706
10707 else if (action_id ==
EActions.ADD_QUANTITY)
10708 {
10709 if (IsMagazine())
10710 {
10711 Magazine mag = Magazine.Cast(this);
10712 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10713 }
10714 else
10715 {
10717 }
10718
10719 if (m_EM)
10720 {
10721 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10722 }
10723
10724 }
10725
10726 else if (action_id ==
EActions.REMOVE_QUANTITY)
10727 {
10728 if (IsMagazine())
10729 {
10730 Magazine mag2 = Magazine.Cast(this);
10731 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10732 }
10733 else
10734 {
10736 }
10737 if (m_EM)
10738 {
10739 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10740 }
10741
10742 }
10743
10744 else if (action_id ==
EActions.SET_QUANTITY_0)
10745 {
10747
10748 if (m_EM)
10749 {
10750 m_EM.SetEnergy(0);
10751 }
10752 }
10753
10754 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10755 {
10757
10758 if (m_EM)
10759 {
10760 m_EM.SetEnergy(m_EM.GetEnergyMax());
10761 }
10762 }
10763
10764 else if (action_id ==
EActions.ADD_HEALTH)
10765 {
10766 AddHealth("","",GetMaxHealth("","Health")/5);
10767 }
10768 else if (action_id ==
EActions.REMOVE_HEALTH)
10769 {
10770 AddHealth("","",-GetMaxHealth("","Health")/5);
10771 }
10772 else if (action_id ==
EActions.DESTROY_HEALTH)
10773 {
10774 SetHealth01("","",0);
10775 }
10776 else if (action_id ==
EActions.WATCH_ITEM)
10777 {
10779 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10780 #ifdef DEVELOPER
10781 SetDebugDeveloper_item(this);
10782 #endif
10783 }
10784
10785 else if (action_id ==
EActions.ADD_TEMPERATURE)
10786 {
10787 AddTemperature(20);
10788
10789 }
10790
10791 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10792 {
10793 AddTemperature(-20);
10794
10795 }
10796
10797 else if (action_id ==
EActions.FLIP_FROZEN)
10798 {
10799 SetFrozen(!GetIsFrozen());
10800
10801 }
10802
10803 else if (action_id ==
EActions.ADD_WETNESS)
10804 {
10806
10807 }
10808
10809 else if (action_id ==
EActions.REMOVE_WETNESS)
10810 {
10812
10813 }
10814
10815 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10816 {
10819
10820
10821 }
10822
10823 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10824 {
10827 }
10828
10829 else if (action_id ==
EActions.MAKE_SPECIAL)
10830 {
10831 auto debugParams = DebugSpawnParams.WithPlayer(player);
10832 OnDebugSpawnEx(debugParams);
10833 }
10834
10835 else if (action_id ==
EActions.DELETE)
10836 {
10837 Delete();
10838 }
10839
10840 }
10841
10842
10843 return false;
10844 }
10845
10846
10847
10848
10852
10855
10856
10857
10859 {
10860 return false;
10861 }
10862
10863
10865 {
10866 return true;
10867 }
10868
10869
10871 {
10872 return true;
10873 }
10874
10875
10876
10878 {
10879 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10881 }
10882
10885 {
10886 return null;
10887 }
10888
10890 {
10891 return false;
10892 }
10893
10895 {
10896 return false;
10897 }
10898
10902
10903
10905 {
10906 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10907 return module_repairing.CanRepair(this, item_repair_kit);
10908 }
10909
10910
10911 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10912 {
10913 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10914 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10915 }
10916
10917
10919 {
10920
10921
10922
10923
10924
10925
10926
10927
10928 return 1;
10929 }
10930
10931
10932
10934 {
10936 }
10937
10938
10939
10941 {
10943 }
10944
10945
10954 {
10955 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10956
10957 if (player)
10958 {
10959 player.MessageStatus(text);
10960 }
10961 }
10962
10963
10972 {
10973 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10974
10975 if (player)
10976 {
10977 player.MessageAction(text);
10978 }
10979 }
10980
10981
10990 {
10991 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10992
10993 if (player)
10994 {
10995 player.MessageFriendly(text);
10996 }
10997 }
10998
10999
11008 {
11009 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11010
11011 if (player)
11012 {
11013 player.MessageImportant(text);
11014 }
11015 }
11016
11018 {
11019 return true;
11020 }
11021
11022
11023 override bool KindOf(
string tag)
11024 {
11025 bool found = false;
11026 string item_name = this.
GetType();
11029
11030 int array_size = item_tag_array.Count();
11031 for (int i = 0; i < array_size; i++)
11032 {
11033 if (item_tag_array.Get(i) == tag)
11034 {
11035 found = true;
11036 break;
11037 }
11038 }
11039 return found;
11040 }
11041
11042
11044 {
11045
11046 super.OnRPC(sender, rpc_type,ctx);
11047
11048
11049 switch (rpc_type)
11050 {
11051 #ifndef SERVER
11052 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11053 Param2<bool, string> p = new Param2<bool, string>(false, "");
11054
11056 return;
11057
11058 bool play = p.param1;
11059 string soundSet = p.param2;
11060
11061 if (play)
11062 {
11064 {
11066 {
11068 }
11069 }
11070 else
11071 {
11073 }
11074 }
11075 else
11076 {
11078 }
11079
11080 break;
11081 #endif
11082
11083 }
11084
11086 {
11088 }
11089 }
11090
11091
11092
11093
11095 {
11096 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11097 return plugin.GetID(
name);
11098 }
11099
11101 {
11102 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11103 return plugin.GetName(id);
11104 }
11105
11108 {
11109
11110
11111 int varFlags;
11112 if (!ctx.
Read(varFlags))
11113 return;
11114
11115 if (varFlags & ItemVariableFlags.FLOAT)
11116 {
11118 }
11119 }
11120
11122 {
11123
11124 super.SerializeNumericalVars(floats_out);
11125
11126
11127
11129 {
11131 }
11132
11134 {
11136 }
11137
11139 {
11141 }
11142
11144 {
11149 }
11150
11152 {
11154 }
11155 }
11156
11158 {
11159
11160 super.DeSerializeNumericalVars(floats);
11161
11162
11163 int index = 0;
11164 int mask = Math.Round(floats.Get(index));
11165
11166 index++;
11167
11169 {
11171 {
11173 }
11174 else
11175 {
11176 float quantity = floats.Get(index);
11177 SetQuantity(quantity,
true,
false,
false,
false);
11178 }
11179 index++;
11180 }
11181
11183 {
11184 float wet = floats.Get(index);
11186 index++;
11187 }
11188
11190 {
11191 int liquidtype = Math.Round(floats.Get(index));
11193 index++;
11194 }
11195
11197 {
11199 index++;
11201 index++;
11203 index++;
11205 index++;
11206 }
11207
11209 {
11210 int cleanness = Math.Round(floats.Get(index));
11212 index++;
11213 }
11214 }
11215
11217 {
11218 super.WriteVarsToCTX(ctx);
11219
11220
11222 {
11224 }
11225
11227 {
11229 }
11230
11232 {
11234 }
11235
11237 {
11238 int r,g,b,a;
11244 }
11245
11247 {
11249 }
11250 }
11251
11253 {
11254 if (!super.ReadVarsFromCTX(ctx,version))
11255 return false;
11256
11257 int intValue;
11258 float value;
11259
11260 if (version < 140)
11261 {
11262 if (!ctx.
Read(intValue))
11263 return false;
11264
11265 m_VariablesMask = intValue;
11266 }
11267
11269 {
11270 if (!ctx.
Read(value))
11271 return false;
11272
11274 {
11276 }
11277 else
11278 {
11280 }
11281 }
11282
11283 if (version < 140)
11284 {
11286 {
11287 if (!ctx.
Read(value))
11288 return false;
11289 SetTemperatureDirect(value);
11290 }
11291 }
11292
11294 {
11295 if (!ctx.
Read(value))
11296 return false;
11298 }
11299
11301 {
11302 if (!ctx.
Read(intValue))
11303 return false;
11305 }
11306
11308 {
11309 int r,g,b,a;
11311 return false;
11313 return false;
11315 return false;
11317 return false;
11318
11320 }
11321
11323 {
11324 if (!ctx.
Read(intValue))
11325 return false;
11327 }
11328
11329 if (version >= 138 && version < 140)
11330 {
11332 {
11333 if (!ctx.
Read(intValue))
11334 return false;
11335 SetFrozen(intValue);
11336 }
11337 }
11338
11339 return true;
11340 }
11341
11342
11344 {
11347 {
11349 }
11350
11351 if (!super.OnStoreLoad(ctx, version))
11352 {
11354 return false;
11355 }
11356
11357 if (version >= 114)
11358 {
11359 bool hasQuickBarIndexSaved;
11360
11361 if (!ctx.
Read(hasQuickBarIndexSaved))
11362 {
11364 return false;
11365 }
11366
11367 if (hasQuickBarIndexSaved)
11368 {
11369 int itmQBIndex;
11370
11371
11372 if (!ctx.
Read(itmQBIndex))
11373 {
11375 return false;
11376 }
11377
11378 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11379 if (itmQBIndex != -1 && parentPlayer)
11380 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11381 }
11382 }
11383 else
11384 {
11385
11386 PlayerBase player;
11387 int itemQBIndex;
11388 if (version ==
int.
MAX)
11389 {
11390 if (!ctx.
Read(itemQBIndex))
11391 {
11393 return false;
11394 }
11395 }
11396 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11397 {
11398
11399 if (!ctx.
Read(itemQBIndex))
11400 {
11402 return false;
11403 }
11404 if (itemQBIndex != -1 && player)
11405 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11406 }
11407 }
11408
11409 if (version < 140)
11410 {
11411
11412 if (!LoadVariables(ctx, version))
11413 {
11415 return false;
11416 }
11417 }
11418
11419
11421 {
11423 return false;
11424 }
11425 if (version >= 132)
11426 {
11428 if (raib)
11429 {
11431 {
11433 return false;
11434 }
11435 }
11436 }
11437
11439 return true;
11440 }
11441
11442
11443
11445 {
11446 super.OnStoreSave(ctx);
11447
11448 PlayerBase player;
11449 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11450 {
11452
11453 int itemQBIndex = -1;
11454 itemQBIndex = player.FindQuickBarEntityIndex(this);
11455 ctx.
Write(itemQBIndex);
11456 }
11457 else
11458 {
11460 }
11461
11463
11465 if (raib)
11466 {
11468 }
11469 }
11470
11471
11473 {
11474 super.AfterStoreLoad();
11475
11477 {
11479 }
11480
11482 {
11485 }
11486 }
11487
11489 {
11490 super.EEOnAfterLoad();
11491
11493 {
11495 }
11496
11499 }
11500
11502 {
11503 return false;
11504 }
11505
11506
11507
11509 {
11511 {
11512 #ifdef PLATFORM_CONSOLE
11513
11515 {
11517 if (menu)
11518 {
11520 }
11521 }
11522 #endif
11523 }
11524
11526 {
11529 }
11530
11532 {
11533 SetWeightDirty();
11535 }
11537 {
11540 }
11541
11543 {
11546 }
11548 {
11551 }
11552
11553 super.OnVariablesSynchronized();
11554 }
11555
11556
11557
11559 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11560 {
11561 if (!IsServerCheck(allow_client))
11562 return false;
11563
11565 return false;
11566
11569
11570 if (value <= (min + 0.001))
11571 value = min;
11572
11573 if (value == min)
11574 {
11575 if (destroy_config)
11576 {
11577 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11578 if (dstr)
11579 {
11581 this.Delete();
11582 return true;
11583 }
11584 }
11585 else if (destroy_forced)
11586 {
11588 this.Delete();
11589 return true;
11590 }
11591
11593 }
11594
11597
11599 {
11601
11602 if (delta)
11604 }
11605
11607
11608 return false;
11609 }
11610
11611
11613 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11614 {
11616 }
11617
11619 {
11622 }
11623
11625 {
11628 }
11629
11632 {
11633 float value_clamped = Math.Clamp(value, 0, 1);
11635 SetQuantity(result, destroy_config, destroy_forced);
11636 }
11637
11638
11641 {
11643 }
11644
11646 {
11648 }
11649
11650
11651
11652
11653
11654
11655
11656
11657
11658
11660 {
11661 int slot = -1;
11662 if (GetInventory())
11663 {
11664 InventoryLocation il = new InventoryLocation;
11665 GetInventory().GetCurrentInventoryLocation(il);
11667 }
11668
11670 }
11671
11673 {
11674 float quantity_max = 0;
11675
11677 {
11678 if (attSlotID != -1)
11679 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11680
11681 if (quantity_max <= 0)
11683 }
11684
11685 if (quantity_max <= 0)
11687
11688 return quantity_max;
11689 }
11690
11692 {
11694 }
11695
11697 {
11699 }
11700
11701
11703 {
11705 }
11706
11708 {
11710 }
11711
11713 {
11715 }
11716
11717
11719 {
11720
11721 float weightEx = GetWeightEx();
11722 float special = GetInventoryAndCargoWeight();
11723 return weightEx - special;
11724 }
11725
11726
11728 {
11730 }
11731
11733 {
11735 {
11736 #ifdef DEVELOPER
11737 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11738 {
11739 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11741 }
11742 #endif
11743
11744 return GetQuantity() * GetConfigWeightModified();
11745 }
11746 else if (HasEnergyManager())
11747 {
11748 #ifdef DEVELOPER
11749 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11750 {
11751 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11752 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11753 }
11754 #endif
11755 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11756 }
11757 else
11758 {
11759 #ifdef DEVELOPER
11760 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11761 {
11762 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11763 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11764 }
11765 #endif
11766 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11767 }
11768 }
11769
11772 {
11773 int item_count = 0;
11775
11776 if (GetInventory().GetCargo() != NULL)
11777 {
11778 item_count = GetInventory().GetCargo().GetItemCount();
11779 }
11780
11781 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11782 {
11783 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11784 if (item)
11785 item_count += item.GetNumberOfItems();
11786 }
11787 return item_count;
11788 }
11789
11792 {
11793 float weight = 0;
11794 float wetness = 1;
11795 if (include_wetness)
11798 {
11799 weight = wetness * m_ConfigWeight;
11800 }
11802 {
11803 weight = 1;
11804 }
11805 return weight;
11806 }
11807
11808
11809
11811 {
11812 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11813 {
11814 GameInventory inv = GetInventory();
11815 array<EntityAI> items = new array<EntityAI>;
11817 for (int i = 0; i < items.Count(); i++)
11818 {
11820 if (item)
11821 {
11823 }
11824 }
11825 }
11826 }
11827
11828
11829
11830
11832 {
11833 float energy = 0;
11834 if (HasEnergyManager())
11835 {
11836 energy = GetCompEM().GetEnergy();
11837 }
11838 return energy;
11839 }
11840
11841
11843 {
11844 super.OnEnergyConsumed();
11845
11847 }
11848
11850 {
11851 super.OnEnergyAdded();
11852
11854 }
11855
11856
11858 {
11859 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11860 {
11862 {
11863 float energy_0to1 = GetCompEM().GetEnergy0To1();
11865 }
11866 }
11867 }
11868
11869
11871 {
11872 return ConfigGetFloat("heatIsolation");
11873 }
11874
11876 {
11878 }
11879
11881 {
11882 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11883 if (
GetGame().ConfigIsExisting(paramPath))
11885
11886 return 0.0;
11887 }
11888
11890 {
11891 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11892 if (
GetGame().ConfigIsExisting(paramPath))
11894
11895 return 0.0;
11896 }
11897
11898 override void SetWet(
float value,
bool allow_client =
false)
11899 {
11900 if (!IsServerCheck(allow_client))
11901 return;
11902
11905
11907
11908 m_VarWet = Math.Clamp(value, min, max);
11909
11911 {
11914 }
11915 }
11916
11917 override void AddWet(
float value)
11918 {
11920 }
11921
11923 {
11925 }
11926
11928 {
11930 }
11931
11933 {
11935 }
11936
11938 {
11940 }
11941
11943 {
11945 }
11946
11947 override void OnWetChanged(
float newVal,
float oldVal)
11948 {
11951 if (newLevel != oldLevel)
11952 {
11954 }
11955 }
11956
11958 {
11959 SetWeightDirty();
11960 }
11961
11963 {
11964 return GetWetLevelInternal(
m_VarWet);
11965 }
11966
11967
11968
11970 {
11972 }
11973
11975 {
11977 }
11978
11980 {
11982 }
11983
11985 {
11987 }
11988
11989
11990
11992 {
11993 if (ConfigIsExisting("itemModelLength"))
11994 {
11995 return ConfigGetFloat("itemModelLength");
11996 }
11997 return 0;
11998 }
11999
12001 {
12002 if (ConfigIsExisting("itemAttachOffset"))
12003 {
12004 return ConfigGetFloat("itemAttachOffset");
12005 }
12006 return 0;
12007 }
12008
12009 override void SetCleanness(
int value,
bool allow_client =
false)
12010 {
12011 if (!IsServerCheck(allow_client))
12012 return;
12013
12015
12017
12020 }
12021
12023 {
12025 }
12026
12028 {
12029 return true;
12030 }
12031
12032
12033
12034
12036 {
12038 }
12039
12041 {
12043 }
12044
12045
12046
12047
12048 override void SetColor(
int r,
int g,
int b,
int a)
12049 {
12055 }
12057 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12058 {
12063 }
12064
12066 {
12068 }
12069
12072 {
12073 int r,g,b,a;
12075 r = r/255;
12076 g = g/255;
12077 b = b/255;
12078 a = a/255;
12079 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12080 }
12081
12082
12083
12084 override void SetLiquidType(
int value,
bool allow_client =
false)
12085 {
12086 if (!IsServerCheck(allow_client))
12087 return;
12088
12093 }
12094
12096 {
12097 return ConfigGetInt("varLiquidTypeInit");
12098 }
12099
12101 {
12103 }
12104
12106 {
12108 SetFrozen(false);
12109 }
12110
12113 {
12114 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12115 }
12116
12117
12120 {
12121 PlayerBase nplayer;
12122 if (PlayerBase.CastTo(nplayer, player))
12123 {
12125
12126 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12127 }
12128 }
12129
12130
12133 {
12134 PlayerBase nplayer;
12135 if (PlayerBase.CastTo(nplayer,player))
12136 {
12137
12138 nplayer.SetEnableQuickBarEntityShortcut(this,false);
12139
12140 }
12141
12142
12143 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12144
12145
12146 if (HasEnergyManager())
12147 {
12148 GetCompEM().UpdatePlugState();
12149 }
12150 }
12151
12152
12154 {
12155 super.OnPlacementStarted(player);
12156
12158 }
12159
12160 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12161 {
12163 {
12164 m_AdminLog.OnPlacementComplete(player,
this);
12165 }
12166
12167 super.OnPlacementComplete(player, position, orientation);
12168 }
12169
12170
12171
12172
12173
12175 {
12177 {
12178 return true;
12179 }
12180 else
12181 {
12182 return false;
12183 }
12184 }
12185
12186
12188 {
12190 {
12192 }
12193 }
12194
12195
12197 {
12199 }
12200
12202 {
12204 }
12205
12206 override void InsertAgent(
int agent,
float count = 1)
12207 {
12208 if (count < 1)
12209 return;
12210
12212 }
12213
12216 {
12218 }
12219
12220
12222 {
12224 }
12225
12226
12227
12228
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
12268 {
12270 return false;
12271 return true;
12272 }
12273
12275 {
12276
12278 }
12279
12280
12283 {
12284 super.CheckForRoofLimited(timeTresholdMS);
12285
12287 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12288 {
12289 m_PreviousRoofTestTime = time;
12290 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12291 }
12292 }
12293
12294
12296 {
12298 {
12299 return 0;
12300 }
12301
12302 if (GetInventory().GetAttachmentSlotsCount() != 0)
12303 {
12304 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12305 if (filter)
12306 return filter.GetProtectionLevel(type, false, system);
12307 else
12308 return 0;
12309 }
12310
12311 string subclassPath, entryName;
12312
12313 switch (type)
12314 {
12316 entryName = "biological";
12317 break;
12319 entryName = "chemical";
12320 break;
12321 default:
12322 entryName = "biological";
12323 break;
12324 }
12325
12326 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12327
12329 }
12330
12331
12332
12335 {
12336 if (!IsMagazine())
12338
12340 }
12341
12342
12343
12344
12345
12350 {
12351 return true;
12352 }
12353
12355 {
12357 }
12358
12359
12360
12361
12362
12364 {
12365 if (parent)
12366 {
12367 if (parent.IsInherited(DayZInfected))
12368 return true;
12369
12370 if (!parent.IsRuined())
12371 return true;
12372 }
12373
12374 return true;
12375 }
12376
12378 {
12379 if (!super.CanPutAsAttachment(parent))
12380 {
12381 return false;
12382 }
12383
12384 if (!IsRuined() && !parent.IsRuined())
12385 {
12386 return true;
12387 }
12388
12389 return false;
12390 }
12391
12393 {
12394
12395
12396
12397
12398 return super.CanReceiveItemIntoCargo(item);
12399 }
12400
12402 {
12403
12404
12405
12406
12407 GameInventory attachmentInv = attachment.GetInventory();
12409 {
12410 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12411 return false;
12412 }
12413
12414 InventoryLocation loc = new InventoryLocation();
12415 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12416 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12417 return false;
12418
12419 return super.CanReceiveAttachment(attachment, slotId);
12420 }
12421
12423 {
12424 if (!super.CanReleaseAttachment(attachment))
12425 return false;
12426
12427 return GetInventory().AreChildrenAccessible();
12428 }
12429
12430
12431
12432
12433
12434
12435
12436
12437
12438
12439
12440
12441
12442
12443
12444
12445
12446
12447
12448
12449
12451 {
12452 int id = muzzle_owner.GetMuzzleID();
12453 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12454
12455 if (WPOF_array)
12456 {
12457 for (int i = 0; i < WPOF_array.Count(); i++)
12458 {
12459 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12460
12461 if (WPOF)
12462 {
12463 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12464 }
12465 }
12466 }
12467 }
12468
12469
12471 {
12472 int id = muzzle_owner.GetMuzzleID();
12474
12475 if (WPOBE_array)
12476 {
12477 for (int i = 0; i < WPOBE_array.Count(); i++)
12478 {
12479 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12480
12481 if (WPOBE)
12482 {
12483 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12484 }
12485 }
12486 }
12487 }
12488
12489
12491 {
12492 int id = muzzle_owner.GetMuzzleID();
12493 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12494
12495 if (WPOOH_array)
12496 {
12497 for (int i = 0; i < WPOOH_array.Count(); i++)
12498 {
12499 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12500
12501 if (WPOOH)
12502 {
12503 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12504 }
12505 }
12506 }
12507 }
12508
12509
12511 {
12512 int id = muzzle_owner.GetMuzzleID();
12513 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12514
12515 if (WPOOH_array)
12516 {
12517 for (int i = 0; i < WPOOH_array.Count(); i++)
12518 {
12519 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12520
12521 if (WPOOH)
12522 {
12523 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12524 }
12525 }
12526 }
12527 }
12528
12529
12531 {
12532 int id = muzzle_owner.GetMuzzleID();
12533 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12534
12535 if (WPOOH_array)
12536 {
12537 for (int i = 0; i < WPOOH_array.Count(); i++)
12538 {
12539 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12540
12541 if (WPOOH)
12542 {
12543 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12544 }
12545 }
12546 }
12547 }
12548
12549
12550
12552 {
12554 {
12555 return true;
12556 }
12557
12558 return false;
12559 }
12560
12562 {
12564 {
12565 return true;
12566 }
12567
12568 return false;
12569 }
12570
12572 {
12574 {
12575 return true;
12576 }
12577
12578 return false;
12579 }
12580
12582 {
12583 return false;
12584 }
12585
12588 {
12589 return UATimeSpent.DEFAULT_DEPLOY;
12590 }
12591
12592
12593
12594
12596 {
12598 SetSynchDirty();
12599 }
12600
12602 {
12604 }
12605
12606
12608 {
12609 return false;
12610 }
12611
12614 {
12615 string att_type = "None";
12616
12617 if (ConfigIsExisting("soundAttType"))
12618 {
12619 att_type = ConfigGetString("soundAttType");
12620 }
12621
12623 }
12624
12626 {
12628 }
12629
12630
12631
12632
12633
12637
12639 {
12642
12644 }
12645
12646
12648 {
12650 return;
12651
12653
12656
12659
12660 SoundParameters params = new SoundParameters();
12664 }
12665
12666
12668 {
12670 return;
12671
12673 SetSynchDirty();
12674
12677 }
12678
12679
12681 {
12683 return;
12684
12686 SetSynchDirty();
12687
12690 }
12691
12693 {
12695 }
12696
12698 {
12700 }
12701
12704 {
12705 if (!
GetGame().IsDedicatedServer())
12706 {
12707 if (ConfigIsExisting("attachSoundSet"))
12708 {
12709 string cfg_path = "";
12710 string soundset = "";
12711 string type_name =
GetType();
12712
12715 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12716 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12717
12718 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12719 {
12720 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12721 {
12722 if (cfg_slot_array[i] == slot_type)
12723 {
12724 soundset = cfg_soundset_array[i];
12725 break;
12726 }
12727 }
12728 }
12729
12730 if (soundset != "")
12731 {
12732 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12734 }
12735 }
12736 }
12737 }
12738
12740 {
12741
12742 }
12743
12744 void OnApply(PlayerBase player);
12745
12747 {
12748 return 1.0;
12749 };
12750
12752 {
12754 }
12755
12757 {
12759 }
12760
12762
12764 {
12765 SetDynamicPhysicsLifeTime(0.01);
12767 }
12768
12770 {
12771 array<string> zone_names = new array<string>;
12772 GetDamageZones(zone_names);
12773 for (int i = 0; i < zone_names.Count(); i++)
12774 {
12775 SetHealthMax(zone_names.Get(i),"Health");
12776 }
12777 SetHealthMax("","Health");
12778 }
12779
12782 {
12783 float global_health = GetHealth01("","Health");
12784 array<string> zones = new array<string>;
12785 GetDamageZones(zones);
12786
12787 for (int i = 0; i < zones.Count(); i++)
12788 {
12789 SetHealth01(zones.Get(i),"Health",global_health);
12790 }
12791 }
12792
12795 {
12796 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12797 }
12798
12800 {
12801 if (!hasRootAsPlayer)
12802 {
12803 if (refParentIB)
12804 {
12805
12806 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12807 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12808
12809 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12810 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12811
12814 }
12815 else
12816 {
12817
12820 }
12821 }
12822 }
12823
12825 {
12827 {
12828 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12829 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12830 {
12831 float heatPermCoef = 1.0;
12833 while (ent)
12834 {
12835 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12836 ent = ent.GetHierarchyParent();
12837 }
12838
12839 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12840 }
12841 }
12842 }
12843
12845 {
12846
12847 EntityAI parent = GetHierarchyParent();
12848 if (!parent)
12849 {
12850 hasParent = false;
12851 hasRootAsPlayer = false;
12852 }
12853 else
12854 {
12855 hasParent = true;
12856 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12857 refParentIB =
ItemBase.Cast(parent);
12858 }
12859 }
12860
12861 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12862 {
12863
12864 }
12865
12867 {
12868
12869 return false;
12870 }
12871
12873 {
12874
12875
12876 return false;
12877 }
12878
12880 {
12881
12882 return false;
12883 }
12884
12887 {
12888 return !GetIsFrozen() &&
IsOpen();
12889 }
12890
12892 {
12893 bool hasParent = false, hasRootAsPlayer = false;
12895
12896 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12897 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12898
12899 if (wwtu || foodDecay)
12900 {
12904
12905 if (processWetness || processTemperature || processDecay)
12906 {
12908
12909 if (processWetness)
12910 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12911
12912 if (processTemperature)
12914
12915 if (processDecay)
12916 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12917 }
12918 }
12919 }
12920
12923 {
12925 }
12926
12928 {
12931
12932 return super.GetTemperatureFreezeThreshold();
12933 }
12934
12936 {
12939
12940 return super.GetTemperatureThawThreshold();
12941 }
12942
12944 {
12947
12948 return super.GetItemOverheatThreshold();
12949 }
12950
12952 {
12954 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12955
12956 return super.GetTemperatureFreezeTime();
12957 }
12958
12960 {
12962 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12963
12964 return super.GetTemperatureThawTime();
12965 }
12966
12971
12973 {
12974 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12975 }
12976
12978 {
12979 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12980 }
12981
12984 {
12986 }
12987
12989 {
12991 }
12992
12994 {
12996 }
12997
13000 {
13001 return null;
13002 }
13003
13006 {
13007 return false;
13008 }
13009
13011 {
13013 {
13016 if (!trg)
13017 {
13019 explosive = this;
13020 }
13021
13022 explosive.PairRemote(trg);
13024
13025 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13026 trg.SetPersistentPairID(persistentID);
13027 explosive.SetPersistentPairID(persistentID);
13028
13029 return true;
13030 }
13031 return false;
13032 }
13033
13036 {
13037 float ret = 1.0;
13040 ret *= GetHealth01();
13041
13042 return ret;
13043 }
13044
13045 #ifdef DEVELOPER
13046 override void SetDebugItem()
13047 {
13048 super.SetDebugItem();
13049 _itemBase = this;
13050 }
13051
13053 {
13054 string text = super.GetDebugText();
13055
13057 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13058
13059 return text;
13060 }
13061 #endif
13062
13064 {
13065 return true;
13066 }
13067
13069
13071
13073 {
13076 }
13077
13078
13086
13102}
13103
13105{
13107 if (entity)
13108 {
13109 bool is_item = entity.IsInherited(
ItemBase);
13110 if (is_item && full_quantity)
13111 {
13114 }
13115 }
13116 else
13117 {
13119 return NULL;
13120 }
13121 return entity;
13122}
13123
13125{
13126 if (item)
13127 {
13128 if (health > 0)
13129 item.SetHealth("", "", health);
13130
13131 if (item.CanHaveTemperature())
13132 {
13134 if (item.CanFreeze())
13135 item.SetFrozen(false);
13136 }
13137
13138 if (item.HasEnergyManager())
13139 {
13140 if (quantity >= 0)
13141 {
13142 item.GetCompEM().SetEnergy0To1(quantity);
13143 }
13144 else
13145 {
13147 }
13148 }
13149 else if (item.IsMagazine())
13150 {
13151 Magazine mag = Magazine.Cast(item);
13152 if (quantity >= 0)
13153 {
13154 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13155 }
13156 else
13157 {
13159 }
13160
13161 }
13162 else
13163 {
13164 if (quantity >= 0)
13165 {
13166 item.SetQuantityNormalized(quantity, false);
13167 }
13168 else
13169 {
13171 }
13172
13173 }
13174 }
13175}
13176
13177#ifdef DEVELOPER
13179#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.