8153{
8155 {
8156 return true;
8157 }
8158};
8159
8160
8161
8163{
8167
8169
8172
8173
8174
8175
8176
8185
8191
8196
8201
8222 protected bool m_IsResultOfSplit
8223
8225
8230
8231
8232
8234
8238
8239
8240
8242
8245
8246
8247
8253
8254
8262
8265
8266
8268
8269
8271
8272
8277
8278
8283
8284
8286
8287
8289 {
8294
8295 if (!
GetGame().IsDedicatedServer())
8296 {
8298 {
8300
8302 {
8304 }
8305 }
8306
8309 }
8310
8311 m_OldLocation = null;
8312
8314 {
8316 }
8317
8318 if (ConfigIsExisting("headSelectionsToHide"))
8319 {
8322 }
8323
8325 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8326 {
8328 }
8329
8331
8332 m_IsResultOfSplit = false;
8333
8335 }
8336
8338 {
8339 super.InitItemVariables();
8340
8346 m_Count = ConfigGetInt(
"count");
8347
8350
8355
8358
8363
8375
8379
8380
8383 if (ConfigIsExisting("canBeSplit"))
8384 {
8387 }
8388
8390 if (ConfigIsExisting("itemBehaviour"))
8392
8393
8396 RegisterNetSyncVariableInt("m_VarLiquidType");
8397 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8398
8399 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8400 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8401 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8402
8403 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8404 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8405 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8406 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8407
8408 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8409 RegisterNetSyncVariableBool("m_IsTakeable");
8410 RegisterNetSyncVariableBool("m_IsHologram");
8411
8414 {
8417 }
8418
8420
8422 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8424
8425 }
8426
8428 {
8430 }
8431
8433 {
8436 {
8441 }
8442 }
8443
8444 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8445 {
8447 {
8450 }
8451
8453 }
8454
8456 {
8462 }
8463
8465
8467 {
8469
8470 if (!action)
8471 {
8472 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8473 return;
8474 }
8475
8477 if (!ai)
8478 {
8480 return;
8481 }
8482
8484 if (!action_array)
8485 {
8486 action_array = new array<ActionBase_Basic>;
8488 }
8489 if (LogManager.IsActionLogEnable())
8490 {
8491 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8492 }
8493
8494 if (action_array.Find(action) != -1)
8495 {
8496 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8497 }
8498 else
8499 {
8500 action_array.Insert(action);
8501 }
8502 }
8503
8505 {
8507 ActionBase action = player.GetActionManager().GetAction(actionName);
8510
8511 if (action_array)
8512 {
8513 action_array.RemoveItem(action);
8514 }
8515 }
8516
8517
8518
8520 {
8521 ActionOverrideData overrideData = new ActionOverrideData();
8525
8527 if (!actionMap)
8528 {
8531 }
8532
8533 actionMap.Insert(this.
Type(), overrideData);
8534
8535 }
8536
8538
8540
8541
8543 {
8546
8549
8550 string config_to_search = "CfgVehicles";
8551 string muzzle_owner_config;
8552
8554 {
8555 if (IsInherited(Weapon))
8556 config_to_search = "CfgWeapons";
8557
8558 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8559
8560 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8561
8563
8564 if (config_OnFire_subclass_count > 0)
8565 {
8566 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8567
8568 for (int i = 0; i < config_OnFire_subclass_count; i++)
8569 {
8570 string particle_class = "";
8572 string config_OnFire_entry = config_OnFire_class + particle_class;
8573 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8574 WPOF_array.Insert(WPOF);
8575 }
8576
8577
8579 }
8580 }
8581
8583 {
8584 config_to_search = "CfgWeapons";
8585 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8586
8587 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8588
8590
8591 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8592 {
8593 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8594
8595 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8596 {
8597 string particle_class2 = "";
8599 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8600 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8601 WPOBE_array.Insert(WPOBE);
8602 }
8603
8604
8606 }
8607 }
8608 }
8609
8610
8612 {
8615
8617 {
8618 string config_to_search = "CfgVehicles";
8619
8620 if (IsInherited(Weapon))
8621 config_to_search = "CfgWeapons";
8622
8623 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8624 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8625
8626 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8627 {
8628
8630
8632 {
8634 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8636 return;
8637 }
8638
8641
8642
8643
8645 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8646
8647 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8648 {
8649 string particle_class = "";
8651 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8653
8654 if (entry_type == CT_CLASS)
8655 {
8656 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8657 WPOOH_array.Insert(WPOF);
8658 }
8659 }
8660
8661
8663 }
8664 }
8665 }
8666
8668 {
8670 }
8671
8673 {
8675 {
8677
8680
8683
8684 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8685 }
8686 }
8687
8689 {
8691 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8692
8694 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8695
8697 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8698
8700 {
8702 }
8703 }
8704
8706 {
8708 }
8709
8711 {
8714 else
8716
8718 {
8721 }
8722 else
8723 {
8726
8729 }
8730
8732 }
8733
8735 {
8737 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8738 }
8739
8741 {
8743 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8745 }
8746
8748 {
8750 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8751 }
8752
8754 {
8757
8758 OverheatingParticle OP = new OverheatingParticle();
8763
8765 }
8766
8768 {
8771
8772 return -1;
8773 }
8774
8776 {
8778 {
8781
8782 for (int i = count; i > 0; --i)
8783 {
8784 int id = i - 1;
8787
8790
8791 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8792 {
8793 if (p)
8794 {
8797 }
8798 }
8799 }
8800 }
8801 }
8802
8804 {
8806 {
8808 {
8809 int id = i - 1;
8811
8812 if (OP)
8813 {
8815
8816 if (p)
8817 {
8819 }
8820
8821 delete OP;
8822 }
8823 }
8824
8827 }
8828 }
8829
8832 {
8833 return 0.0;
8834 }
8835
8836
8838 {
8839 return 250;
8840 }
8841
8843 {
8844 return 0;
8845 }
8846
8849 {
8851 return true;
8852
8853 return false;
8854 }
8855
8858 {
8861
8863 {
8865 }
8866 else
8867 {
8868
8870 }
8871
8873 }
8874
8881 {
8882 return -1;
8883 }
8884
8885
8886
8887
8889 {
8891 {
8893 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8894
8895 if (r_index >= 0)
8896 {
8897 InventoryLocation r_il = new InventoryLocation;
8898 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8899
8900 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8903 {
8904 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8905 }
8907 {
8908 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8909 }
8910
8911 }
8912
8913 player.GetHumanInventory().ClearUserReservedLocation(this);
8914 }
8915
8918 }
8919
8920
8921
8922
8924 {
8925 return ItemBase.m_DebugActionsMask;
8926 }
8927
8929 {
8930 return ItemBase.m_DebugActionsMask & mask;
8931 }
8932
8934 {
8935 ItemBase.m_DebugActionsMask = mask;
8936 }
8937
8939 {
8940 ItemBase.m_DebugActionsMask |= mask;
8941 }
8942
8944 {
8945 ItemBase.m_DebugActionsMask &= ~mask;
8946 }
8947
8949 {
8951 {
8953 }
8954 else
8955 {
8957 }
8958 }
8959
8960
8962 {
8963 if (GetEconomyProfile())
8964 {
8965 float q_max = GetEconomyProfile().GetQuantityMax();
8966 if (q_max > 0)
8967 {
8968 float q_min = GetEconomyProfile().GetQuantityMin();
8969 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8970
8972 {
8973 ComponentEnergyManager comp = GetCompEM();
8975 {
8977 }
8978 }
8980 {
8982
8983 }
8984
8985 }
8986 }
8987 }
8988
8991 {
8992 EntityAI parent = GetHierarchyParent();
8993
8994 if (parent)
8995 {
8996 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8997 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8998 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8999 }
9000 }
9001
9004 {
9005 EntityAI parent = GetHierarchyParent();
9006
9007 if (parent)
9008 {
9009 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9010 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9011 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9012 }
9013 }
9014
9016 {
9017
9018
9019
9020
9022
9024 {
9025 if (ScriptInputUserData.CanStoreInputUserData())
9026 {
9027 ScriptInputUserData ctx = new ScriptInputUserData;
9033 ctx.
Write(use_stack_max);
9036
9038 {
9039 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9040 }
9041 }
9042 }
9043 else if (!
GetGame().IsMultiplayer())
9044 {
9046 }
9047 }
9048
9050 {
9052 }
9053
9055 {
9057 }
9058
9060 {
9062 }
9063
9065 {
9066
9067 return false;
9068 }
9069
9071 {
9072 return false;
9073 }
9074
9078 {
9079 return false;
9080 }
9081
9083 {
9084 return "";
9085 }
9086
9088
9090 {
9091 return false;
9092 }
9093
9095 {
9096 return true;
9097 }
9098
9099
9100
9102 {
9103 return true;
9104 }
9105
9107 {
9108 return true;
9109 }
9110
9112 {
9113 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9115 }
9116
9118 {
9120 }
9121
9123 {
9125 if (!is_being_placed)
9127 SetSynchDirty();
9128 }
9129
9130
9132
9134 {
9136 }
9137
9139 {
9141 }
9142
9144 {
9145 return 1;
9146 }
9147
9149 {
9150 return false;
9151 }
9152
9154 {
9156 SetSynchDirty();
9157 }
9158
9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185
9186
9187
9188
9189
9190
9191
9192
9194 {
9195 super.OnMovedInsideCargo(container);
9196
9197 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9198 }
9199
9200 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9201 {
9202 super.EEItemLocationChanged(oldLoc,newLoc);
9203
9204 PlayerBase new_player = null;
9205 PlayerBase old_player = null;
9206
9207 if (newLoc.GetParent())
9208 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9209
9210 if (oldLoc.GetParent())
9211 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9212
9214 {
9215 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9216
9217 if (r_index >= 0)
9218 {
9219 InventoryLocation r_il = new InventoryLocation;
9220 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9221
9222 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9225 {
9226 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9227 }
9229 {
9230 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9231 }
9232
9233 }
9234 }
9235
9237 {
9238 if (new_player)
9239 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9240
9241 if (new_player == old_player)
9242 {
9243
9244 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9245 {
9247 {
9248 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9249 {
9250 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9251 }
9252 }
9253 else
9254 {
9255 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9256 }
9257 }
9258
9259 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9260 {
9261 int type = oldLoc.GetType();
9263 {
9264 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9265 }
9267 {
9268 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9269 }
9270 }
9271 if (!m_OldLocation)
9272 {
9273 m_OldLocation = new InventoryLocation;
9274 }
9275 m_OldLocation.Copy(oldLoc);
9276 }
9277 else
9278 {
9279 if (m_OldLocation)
9280 {
9281 m_OldLocation.Reset();
9282 }
9283 }
9284
9286 }
9287 else
9288 {
9289 if (new_player)
9290 {
9291 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9292 if (res_index >= 0)
9293 {
9294 InventoryLocation il = new InventoryLocation;
9295 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9297 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9300 {
9301 il.
GetParent().GetOnReleaseLock().Invoke(it);
9302 }
9304 {
9306 }
9307
9308 }
9309 }
9311 {
9312
9314 }
9315
9316 if (m_OldLocation)
9317 {
9318 m_OldLocation.Reset();
9319 }
9320 }
9321 }
9322
9323 override void EOnContact(IEntity other, Contact extra)
9324 {
9326 {
9327 int liquidType = -1;
9329 if (impactSpeed > 0.0)
9330 {
9332 #ifndef SERVER
9334 #else
9336 SetSynchDirty();
9337 #endif
9339 }
9340 }
9341
9342 #ifdef SERVER
9343 if (GetCompEM() && GetCompEM().IsPlugged())
9344 {
9345 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9346 GetCompEM().UnplugThis();
9347 }
9348 #endif
9349 }
9350
9352
9354 {
9356 }
9357
9359 {
9360
9361 }
9362
9364 {
9365 super.OnItemLocationChanged(old_owner, new_owner);
9366
9367 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9368 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9369
9370 if (!relatedPlayer && playerNew)
9371 relatedPlayer = playerNew;
9372
9373 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9374 {
9376 if (actionMgr)
9377 {
9378 ActionBase currentAction = actionMgr.GetRunningAction();
9379 if (currentAction)
9381 }
9382 }
9383
9384 Man ownerPlayerOld = null;
9385 Man ownerPlayerNew = null;
9386
9387 if (old_owner)
9388 {
9389 if (old_owner.
IsMan())
9390 {
9391 ownerPlayerOld = Man.Cast(old_owner);
9392 }
9393 else
9394 {
9395 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9396 }
9397 }
9398 else
9399 {
9401 {
9403
9404 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9405 {
9406 GetCompEM().UnplugThis();
9407 }
9408 }
9409 }
9410
9411 if (new_owner)
9412 {
9413 if (new_owner.
IsMan())
9414 {
9415 ownerPlayerNew = Man.Cast(new_owner);
9416 }
9417 else
9418 {
9419 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9420 }
9421 }
9422
9423 if (ownerPlayerOld != ownerPlayerNew)
9424 {
9425 if (ownerPlayerOld)
9426 {
9427 array<EntityAI> subItemsExit = new array<EntityAI>;
9429 for (int i = 0; i < subItemsExit.Count(); i++)
9430 {
9433 }
9434 }
9435
9436 if (ownerPlayerNew)
9437 {
9438 array<EntityAI> subItemsEnter = new array<EntityAI>;
9440 for (int j = 0; j < subItemsEnter.Count(); j++)
9441 {
9444 }
9445 }
9446 }
9447 else if (ownerPlayerNew != null)
9448 {
9449 PlayerBase nplayer;
9450 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9451 {
9452 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9454 for (int k = 0; k < subItemsUpdate.Count(); k++)
9455 {
9457 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9458 }
9459 }
9460 }
9461
9462 if (old_owner)
9463 old_owner.OnChildItemRemoved(this);
9464 if (new_owner)
9465 new_owner.OnChildItemReceived(this);
9466 }
9467
9468
9470 {
9471 super.EEDelete(parent);
9472 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9473 if (player)
9474 {
9476
9477 if (player.IsAlive())
9478 {
9479 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9480 if (r_index >= 0)
9481 {
9482 InventoryLocation r_il = new InventoryLocation;
9483 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9484
9485 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9488 {
9489 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9490 }
9492 {
9493 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9494 }
9495
9496 }
9497
9498 player.RemoveQuickBarEntityShortcut(this);
9499 }
9500 }
9501 }
9502
9504 {
9505 super.EEKilled(killer);
9506
9509 {
9510 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9511 {
9512 if (IsMagazine())
9513 {
9514 if (Magazine.Cast(this).GetAmmoCount() > 0)
9515 {
9517 }
9518 }
9519 else
9520 {
9522 }
9523 }
9524 }
9525 }
9526
9528 {
9529 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9530
9531 super.OnWasAttached(parent, slot_id);
9532
9535
9537 }
9538
9540 {
9541 super.OnWasDetached(parent, slot_id);
9542
9545 }
9546
9548 {
9549 int idx;
9552
9553 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9554 if (inventory_slots.Count() < 1)
9555 {
9556 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9557 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9558 }
9559 else
9560 {
9561 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9562 }
9563
9564 idx = inventory_slots.Find(slot);
9565 if (idx < 0)
9566 return "";
9567
9568 return attach_types.Get(idx);
9569 }
9570
9572 {
9573 int idx = -1;
9574 string slot;
9575
9578
9579 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9580 if (inventory_slots.Count() < 1)
9581 {
9582 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9583 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9584 }
9585 else
9586 {
9587 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9588 if (detach_types.Count() < 1)
9589 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9590 }
9591
9592 for (int i = 0; i < inventory_slots.Count(); i++)
9593 {
9594 slot = inventory_slots.Get(i);
9595 }
9596
9597 if (slot != "")
9598 {
9599 if (detach_types.Count() == 1)
9600 idx = 0;
9601 else
9602 idx = inventory_slots.Find(slot);
9603 }
9604 if (idx < 0)
9605 return "";
9606
9607 return detach_types.Get(idx);
9608 }
9609
9611 {
9612
9614
9615
9616 float min_time = 1;
9617 float max_time = 3;
9618 float delay = Math.RandomFloat(min_time, max_time);
9619
9620 explode_timer.Run(delay, this, "DoAmmoExplosion");
9621 }
9622
9624 {
9625 Magazine magazine = Magazine.Cast(this);
9626 int pop_sounds_count = 6;
9627 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9628
9629
9630 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9631 string sound_name = pop_sounds[ sound_idx ];
9633
9634
9635 magazine.ServerAddAmmoCount(-1);
9636
9637
9638 float min_temp_to_explode = 100;
9639
9640 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9641 {
9643 }
9644 }
9645
9646
9647 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9648 {
9649 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9650
9651 const int CHANCE_DAMAGE_CARGO = 4;
9652 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9653 const int CHANCE_DAMAGE_NOTHING = 2;
9654
9656 {
9657 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9658 int chances;
9659 int rnd;
9660
9661 if (GetInventory().GetCargo())
9662 {
9663 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9664 rnd = Math.RandomInt(0,chances);
9665
9666 if (rnd < CHANCE_DAMAGE_CARGO)
9667 {
9669 }
9670 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9671 {
9673 }
9674 }
9675 else
9676 {
9677 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9678 rnd = Math.RandomInt(0,chances);
9679
9680 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9681 {
9683 }
9684 }
9685 }
9686 }
9687
9689 {
9690 if (GetInventory().GetCargo())
9691 {
9692 int item_count = GetInventory().GetCargo().GetItemCount();
9693 if (item_count > 0)
9694 {
9695 int random_pick = Math.RandomInt(0, item_count);
9697 if (!item.IsExplosive())
9698 {
9699 item.AddHealth("","",damage);
9700 return true;
9701 }
9702 }
9703 }
9704 return false;
9705 }
9706
9708 {
9709 int attachment_count = GetInventory().AttachmentCount();
9710 if (attachment_count > 0)
9711 {
9712 int random_pick = Math.RandomInt(0, attachment_count);
9713 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9714 if (!attachment.IsExplosive())
9715 {
9716 attachment.AddHealth("","",damage);
9717 return true;
9718 }
9719 }
9720 return false;
9721 }
9722
9724 {
9726 }
9727
9729 {
9731 return GetInventory().CanRemoveEntity();
9732
9733 return false;
9734 }
9735
9737 {
9739 return;
9740
9742 {
9743 if (ScriptInputUserData.CanStoreInputUserData())
9744 {
9745 ScriptInputUserData ctx = new ScriptInputUserData;
9750 ctx.
Write(destination_entity);
9754 }
9755 }
9756 else if (!
GetGame().IsMultiplayer())
9757 {
9759 }
9760 }
9761
9763 {
9765 return;
9766
9767 float split_quantity_new;
9771 InventoryLocation loc = new InventoryLocation;
9772
9773 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9774 {
9776 split_quantity_new = stack_max;
9777 else
9779
9780 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9781 if (new_item)
9782 {
9783 new_item.SetResultOfSplit(true);
9784 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9786 new_item.SetQuantity(split_quantity_new);
9787 }
9788 }
9789 else if (destination_entity && slot_id == -1)
9790 {
9791 if (quantity > stack_max)
9792 split_quantity_new = stack_max;
9793 else
9794 split_quantity_new = quantity;
9795
9797 {
9800 }
9801
9802 if (new_item)
9803 {
9804 new_item.SetResultOfSplit(true);
9805 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9807 new_item.SetQuantity(split_quantity_new);
9808 }
9809 }
9810 else
9811 {
9812 if (stack_max != 0)
9813 {
9815 {
9817 }
9818
9819 if (split_quantity_new == 0)
9820 {
9821 if (!
GetGame().IsMultiplayer())
9822 player.PhysicalPredictiveDropItem(this);
9823 else
9824 player.ServerDropEntity(this);
9825 return;
9826 }
9827
9829
9830 if (new_item)
9831 {
9832 new_item.SetResultOfSplit(true);
9833 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9835 new_item.SetQuantity(stack_max);
9836 new_item.PlaceOnSurface();
9837 }
9838 }
9839 }
9840 }
9841
9843 {
9845 return;
9846
9847 float split_quantity_new;
9851 InventoryLocation loc = new InventoryLocation;
9852
9853 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9854 {
9856 split_quantity_new = stack_max;
9857 else
9859
9860 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9861 if (new_item)
9862 {
9863 new_item.SetResultOfSplit(true);
9864 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9866 new_item.SetQuantity(split_quantity_new);
9867 }
9868 }
9869 else if (destination_entity && slot_id == -1)
9870 {
9871 if (quantity > stack_max)
9872 split_quantity_new = stack_max;
9873 else
9874 split_quantity_new = quantity;
9875
9877 {
9880 }
9881
9882 if (new_item)
9883 {
9884 new_item.SetResultOfSplit(true);
9885 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9887 new_item.SetQuantity(split_quantity_new);
9888 }
9889 }
9890 else
9891 {
9892 if (stack_max != 0)
9893 {
9895 {
9897 }
9898
9900
9901 if (new_item)
9902 {
9903 new_item.SetResultOfSplit(true);
9904 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9906 new_item.SetQuantity(stack_max);
9907 new_item.PlaceOnSurface();
9908 }
9909 }
9910 }
9911 }
9912
9914 {
9916 return;
9917
9919 {
9920 if (ScriptInputUserData.CanStoreInputUserData())
9921 {
9922 ScriptInputUserData ctx = new ScriptInputUserData;
9927 dst.WriteToContext(ctx);
9929 }
9930 }
9931 else if (!
GetGame().IsMultiplayer())
9932 {
9934 }
9935 }
9936
9938 {
9940 return;
9941
9943 {
9944 if (ScriptInputUserData.CanStoreInputUserData())
9945 {
9946 ScriptInputUserData ctx = new ScriptInputUserData;
9951 ctx.
Write(destination_entity);
9957 }
9958 }
9959 else if (!
GetGame().IsMultiplayer())
9960 {
9962 }
9963 }
9964
9966 {
9968 }
9969
9971 {
9973 return this;
9974
9976 float split_quantity_new;
9978 if (dst.IsValid())
9979 {
9980 int slot_id = dst.GetSlot();
9982
9983 if (quantity > stack_max)
9984 split_quantity_new = stack_max;
9985 else
9986 split_quantity_new = quantity;
9987
9989
9990 if (new_item)
9991 {
9992 new_item.SetResultOfSplit(true);
9993 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9996 }
9997
9998 return new_item;
9999 }
10000
10001 return null;
10002 }
10003
10005 {
10007 return;
10008
10010 float split_quantity_new;
10012 if (destination_entity)
10013 {
10015 if (quantity > stackable)
10016 split_quantity_new = stackable;
10017 else
10018 split_quantity_new = quantity;
10019
10020 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10021 if (new_item)
10022 {
10023 new_item.SetResultOfSplit(true);
10024 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10026 new_item.SetQuantity(split_quantity_new);
10027 }
10028 }
10029 }
10030
10032 {
10034 return;
10035
10037 {
10038 if (ScriptInputUserData.CanStoreInputUserData())
10039 {
10040 ScriptInputUserData ctx = new ScriptInputUserData;
10045 ItemBase destination_entity =
this;
10046 ctx.
Write(destination_entity);
10050 }
10051 }
10052 else if (!
GetGame().IsMultiplayer())
10053 {
10055 }
10056 }
10057
10059 {
10061 return;
10062
10064 float split_quantity_new;
10066 if (player)
10067 {
10069 if (quantity > stackable)
10070 split_quantity_new = stackable;
10071 else
10072 split_quantity_new = quantity;
10073
10074 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10075 new_item =
ItemBase.Cast(in_hands);
10076 if (new_item)
10077 {
10078 new_item.SetResultOfSplit(true);
10079 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10081 new_item.SetQuantity(split_quantity_new);
10082 }
10083 }
10084 }
10085
10087 {
10089 return;
10090
10092 float split_quantity_new = Math.Floor(quantity * 0.5);
10093
10095
10096 if (new_item)
10097 {
10098 if (new_item.GetQuantityMax() < split_quantity_new)
10099 {
10100 split_quantity_new = new_item.GetQuantityMax();
10101 }
10102
10103 new_item.SetResultOfSplit(true);
10104 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10105
10107 {
10110 }
10111 else
10112 {
10115 }
10116 }
10117 }
10118
10120 {
10122 return;
10123
10125 float split_quantity_new = Math.Floor(quantity / 2);
10126
10127 InventoryLocation invloc = new InventoryLocation;
10129
10131 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10132
10133 if (new_item)
10134 {
10135 if (new_item.GetQuantityMax() < split_quantity_new)
10136 {
10137 split_quantity_new = new_item.GetQuantityMax();
10138 }
10140 {
10143 }
10144 else
10145 {
10148 }
10149 }
10150 }
10151
10154 {
10155 SetWeightDirty();
10157
10158 if (parent)
10159 parent.OnAttachmentQuantityChangedEx(this, delta);
10160
10162 {
10164 {
10166 }
10168 {
10169 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10171 }
10172 }
10173
10174 }
10175
10178 {
10179
10180 }
10181
10184 {
10186 }
10187
10189 {
10190 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10191
10193 {
10194 if (newLevel == GameConstants.STATE_RUINED)
10195 {
10197 EntityAI parent = GetHierarchyParent();
10198 if (parent && parent.IsFireplace())
10199 {
10200 CargoBase cargo = GetInventory().GetCargo();
10201 if (cargo)
10202 {
10204 {
10206 }
10207 }
10208 }
10209 }
10210
10212 {
10213
10215 return;
10216 }
10217
10218 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10219 {
10221 }
10222 }
10223 }
10224
10225
10227 {
10228 super.OnRightClick();
10229
10231 {
10233 {
10234 if (ScriptInputUserData.CanStoreInputUserData())
10235 {
10236 vector m4[4];
10238
10239 EntityAI root = GetHierarchyRoot();
10240
10241 InventoryLocation dst = new InventoryLocation;
10243 {
10244 if (root)
10245 {
10246 root.GetTransform(m4);
10248 }
10249 else
10250 GetInventory().GetCurrentInventoryLocation(dst);
10251 }
10252 else
10253 {
10255
10256
10257 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10258 {
10259 if (root)
10260 {
10261 root.GetTransform(m4);
10263 }
10264 else
10265 GetInventory().GetCurrentInventoryLocation(dst);
10266 }
10267 else
10268 {
10269 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10270 }
10271 }
10272
10273 ScriptInputUserData ctx = new ScriptInputUserData;
10281 }
10282 }
10283 else if (!
GetGame().IsMultiplayer())
10284 {
10286 }
10287 }
10288 }
10289
10290 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10291 {
10292
10293 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10294 return false;
10295
10296 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10297 return false;
10298
10299
10301 return false;
10302
10303
10304 Magazine mag = Magazine.Cast(this);
10305 if (mag)
10306 {
10307 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10308 return false;
10309
10310 if (stack_max_limit)
10311 {
10312 Magazine other_mag = Magazine.Cast(other_item);
10313 if (other_item)
10314 {
10315 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10316 return false;
10317 }
10318
10319 }
10320 }
10321 else
10322 {
10323
10325 return false;
10326
10328 return false;
10329 }
10330
10331 PlayerBase player = null;
10332 if (CastTo(player, GetHierarchyRootPlayer()))
10333 {
10334 if (player.GetInventory().HasAttachment(this))
10335 return false;
10336
10337 if (player.IsItemsToDelete())
10338 return false;
10339 }
10340
10341 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10342 return false;
10343
10344 int slotID;
10346 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10347 return false;
10348
10349 return true;
10350 }
10351
10353 {
10355 }
10356
10358 {
10359 return m_IsResultOfSplit;
10360 }
10361
10363 {
10364 m_IsResultOfSplit = value;
10365 }
10366
10368 {
10370 }
10371
10373 {
10374 float other_item_quantity = other_item.GetQuantity();
10375 float this_free_space;
10376
10378
10380
10381 if (other_item_quantity > this_free_space)
10382 {
10383 return this_free_space;
10384 }
10385 else
10386 {
10387 return other_item_quantity;
10388 }
10389 }
10390
10392 {
10394 }
10395
10397 {
10399 return;
10400
10401 if (!IsMagazine() && other_item)
10402 {
10404 if (quantity_used != 0)
10405 {
10406 float hp1 = GetHealth01("","");
10407 float hp2 = other_item.GetHealth01("","");
10408 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10409 hpResult = hpResult / (
GetQuantity() + quantity_used);
10410
10411 hpResult *= GetMaxHealth();
10412 Math.Round(hpResult);
10413 SetHealth("", "Health", hpResult);
10414
10416 other_item.AddQuantity(-quantity_used);
10417 }
10418 }
10420 }
10421
10423 {
10424 #ifdef SERVER
10425 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10426 GetHierarchyParent().IncreaseLifetimeUp();
10427 #endif
10428 };
10429
10431 {
10432 PlayerBase p = PlayerBase.Cast(player);
10433
10434 array<int> recipesIds = p.m_Recipes;
10435 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10436 if (moduleRecipesManager)
10437 {
10438 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10439 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10440 }
10441
10442 for (int i = 0;i < recipesIds.Count(); i++)
10443 {
10444 int key = recipesIds.Get(i);
10445 string recipeName = moduleRecipesManager.GetRecipeName(key);
10447 }
10448 }
10449
10450
10451 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10452 {
10453 super.GetDebugActions(outputList);
10454
10455
10460
10461
10465
10469
10470
10473
10474
10476 {
10479 }
10480
10482
10485
10489 }
10490
10491
10492
10493
10495 {
10496 super.OnAction(action_id, player, ctx);
10497 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10498 {
10499 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10500 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10501 PlayerBase p = PlayerBase.Cast(player);
10502 if (
EActions.RECIPES_RANGE_START < 1000)
10503 {
10504 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10505 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10506 }
10507 }
10508 #ifndef SERVER
10509 else if (action_id ==
EActions.WATCH_PLAYER)
10510 {
10511 PluginDeveloper.SetDeveloperItemClientEx(player);
10512 }
10513 #endif
10515 {
10516 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10517 {
10518 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10519 OnDebugButtonPressServer(id + 1);
10520 }
10521
10522 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10523 {
10524 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10526 }
10527
10528 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10529 {
10530 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10532 }
10533
10534 else if (action_id ==
EActions.ADD_QUANTITY)
10535 {
10536 if (IsMagazine())
10537 {
10538 Magazine mag = Magazine.Cast(this);
10539 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10540 }
10541 else
10542 {
10544 }
10545
10546 if (m_EM)
10547 {
10548 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10549 }
10550
10551 }
10552
10553 else if (action_id ==
EActions.REMOVE_QUANTITY)
10554 {
10555 if (IsMagazine())
10556 {
10557 Magazine mag2 = Magazine.Cast(this);
10558 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10559 }
10560 else
10561 {
10563 }
10564 if (m_EM)
10565 {
10566 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10567 }
10568
10569 }
10570
10571 else if (action_id ==
EActions.SET_QUANTITY_0)
10572 {
10574
10575 if (m_EM)
10576 {
10577 m_EM.SetEnergy(0);
10578 }
10579 }
10580
10581 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10582 {
10584
10585 if (m_EM)
10586 {
10587 m_EM.SetEnergy(m_EM.GetEnergyMax());
10588 }
10589 }
10590
10591 else if (action_id ==
EActions.ADD_HEALTH)
10592 {
10593 AddHealth("","",GetMaxHealth("","Health")/5);
10594 }
10595 else if (action_id ==
EActions.REMOVE_HEALTH)
10596 {
10597 AddHealth("","",-GetMaxHealth("","Health")/5);
10598 }
10599 else if (action_id ==
EActions.DESTROY_HEALTH)
10600 {
10601 SetHealth01("","",0);
10602 }
10603 else if (action_id ==
EActions.WATCH_ITEM)
10604 {
10606 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10607 #ifdef DEVELOPER
10608 SetDebugDeveloper_item(this);
10609 #endif
10610 }
10611
10612 else if (action_id ==
EActions.ADD_TEMPERATURE)
10613 {
10614 AddTemperature(20);
10615
10616 }
10617
10618 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10619 {
10620 AddTemperature(-20);
10621
10622 }
10623
10624 else if (action_id ==
EActions.FLIP_FROZEN)
10625 {
10626 SetFrozen(!GetIsFrozen());
10627
10628 }
10629
10630 else if (action_id ==
EActions.ADD_WETNESS)
10631 {
10633
10634 }
10635
10636 else if (action_id ==
EActions.REMOVE_WETNESS)
10637 {
10639
10640 }
10641
10642 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10643 {
10646
10647
10648 }
10649
10650 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10651 {
10654 }
10655
10656 else if (action_id ==
EActions.MAKE_SPECIAL)
10657 {
10658 auto debugParams = DebugSpawnParams.WithPlayer(player);
10659 OnDebugSpawnEx(debugParams);
10660 }
10661
10662 else if (action_id ==
EActions.DELETE)
10663 {
10664 Delete();
10665 }
10666
10667 }
10668
10669
10670 return false;
10671 }
10672
10673
10674
10675
10679
10682
10683
10684
10686 {
10687 return false;
10688 }
10689
10690
10692 {
10693 return true;
10694 }
10695
10696
10698 {
10699 return true;
10700 }
10701
10702
10703
10705 {
10706 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10708 }
10709
10712 {
10713 return null;
10714 }
10715
10717 {
10718 return false;
10719 }
10720
10722 {
10723 return false;
10724 }
10725
10729
10730
10732 {
10733 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10734 return module_repairing.CanRepair(this, item_repair_kit);
10735 }
10736
10737
10738 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10739 {
10740 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10741 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10742 }
10743
10744
10746 {
10747
10748
10749
10750
10751
10752
10753
10754
10755 return 1;
10756 }
10757
10758
10759
10761 {
10763 }
10764
10765
10766
10768 {
10770 }
10771
10772
10781 {
10782 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10783
10784 if (player)
10785 {
10786 player.MessageStatus(text);
10787 }
10788 }
10789
10790
10799 {
10800 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10801
10802 if (player)
10803 {
10804 player.MessageAction(text);
10805 }
10806 }
10807
10808
10817 {
10818 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10819
10820 if (player)
10821 {
10822 player.MessageFriendly(text);
10823 }
10824 }
10825
10826
10835 {
10836 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10837
10838 if (player)
10839 {
10840 player.MessageImportant(text);
10841 }
10842 }
10843
10845 {
10846 return true;
10847 }
10848
10849
10850 override bool KindOf(
string tag)
10851 {
10852 bool found = false;
10853 string item_name = this.
GetType();
10856
10857 int array_size = item_tag_array.Count();
10858 for (int i = 0; i < array_size; i++)
10859 {
10860 if (item_tag_array.Get(i) == tag)
10861 {
10862 found = true;
10863 break;
10864 }
10865 }
10866 return found;
10867 }
10868
10869
10871 {
10872
10873 super.OnRPC(sender, rpc_type,ctx);
10874
10875
10876 switch (rpc_type)
10877 {
10878 #ifndef SERVER
10879 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10880 Param2<bool, string> p = new Param2<bool, string>(false, "");
10881
10883 return;
10884
10885 bool play = p.param1;
10886 string soundSet = p.param2;
10887
10888 if (play)
10889 {
10891 {
10893 {
10895 }
10896 }
10897 else
10898 {
10900 }
10901 }
10902 else
10903 {
10905 }
10906
10907 break;
10908 #endif
10909
10910 }
10911
10913 {
10915 }
10916 }
10917
10918
10919
10920
10922 {
10923 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10924 return plugin.GetID(
name);
10925 }
10926
10928 {
10929 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10930 return plugin.GetName(id);
10931 }
10932
10935 {
10936
10937
10938 int varFlags;
10939 if (!ctx.
Read(varFlags))
10940 return;
10941
10942 if (varFlags & ItemVariableFlags.FLOAT)
10943 {
10945 }
10946 }
10947
10949 {
10950
10951 super.SerializeNumericalVars(floats_out);
10952
10953
10954
10956 {
10958 }
10959
10961 {
10963 }
10964
10966 {
10968 }
10969
10971 {
10976 }
10977
10979 {
10981 }
10982 }
10983
10985 {
10986
10987 super.DeSerializeNumericalVars(floats);
10988
10989
10990 int index = 0;
10991 int mask = Math.Round(floats.Get(index));
10992
10993 index++;
10994
10996 {
10998 {
11000 }
11001 else
11002 {
11003 float quantity = floats.Get(index);
11004 SetQuantity(quantity,
true,
false,
false,
false);
11005 }
11006 index++;
11007 }
11008
11010 {
11011 float wet = floats.Get(index);
11013 index++;
11014 }
11015
11017 {
11018 int liquidtype = Math.Round(floats.Get(index));
11020 index++;
11021 }
11022
11024 {
11026 index++;
11028 index++;
11030 index++;
11032 index++;
11033 }
11034
11036 {
11037 int cleanness = Math.Round(floats.Get(index));
11039 index++;
11040 }
11041 }
11042
11044 {
11045 super.WriteVarsToCTX(ctx);
11046
11047
11049 {
11051 }
11052
11054 {
11056 }
11057
11059 {
11061 }
11062
11064 {
11065 int r,g,b,a;
11071 }
11072
11074 {
11076 }
11077 }
11078
11080 {
11081 if (!super.ReadVarsFromCTX(ctx,version))
11082 return false;
11083
11084 int intValue;
11085 float value;
11086
11087 if (version < 140)
11088 {
11089 if (!ctx.
Read(intValue))
11090 return false;
11091
11092 m_VariablesMask = intValue;
11093 }
11094
11096 {
11097 if (!ctx.
Read(value))
11098 return false;
11099
11101 {
11103 }
11104 else
11105 {
11107 }
11108 }
11109
11110 if (version < 140)
11111 {
11113 {
11114 if (!ctx.
Read(value))
11115 return false;
11116 SetTemperatureDirect(value);
11117 }
11118 }
11119
11121 {
11122 if (!ctx.
Read(value))
11123 return false;
11125 }
11126
11128 {
11129 if (!ctx.
Read(intValue))
11130 return false;
11132 }
11133
11135 {
11136 int r,g,b,a;
11138 return false;
11140 return false;
11142 return false;
11144 return false;
11145
11147 }
11148
11150 {
11151 if (!ctx.
Read(intValue))
11152 return false;
11154 }
11155
11156 if (version >= 138 && version < 140)
11157 {
11159 {
11160 if (!ctx.
Read(intValue))
11161 return false;
11162 SetFrozen(intValue);
11163 }
11164 }
11165
11166 return true;
11167 }
11168
11169
11171 {
11174 {
11176 }
11177
11178 if (!super.OnStoreLoad(ctx, version))
11179 {
11181 return false;
11182 }
11183
11184 if (version >= 114)
11185 {
11186 bool hasQuickBarIndexSaved;
11187
11188 if (!ctx.
Read(hasQuickBarIndexSaved))
11189 {
11191 return false;
11192 }
11193
11194 if (hasQuickBarIndexSaved)
11195 {
11196 int itmQBIndex;
11197
11198
11199 if (!ctx.
Read(itmQBIndex))
11200 {
11202 return false;
11203 }
11204
11205 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11206 if (itmQBIndex != -1 && parentPlayer)
11207 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11208 }
11209 }
11210 else
11211 {
11212
11213 PlayerBase player;
11214 int itemQBIndex;
11215 if (version ==
int.
MAX)
11216 {
11217 if (!ctx.
Read(itemQBIndex))
11218 {
11220 return false;
11221 }
11222 }
11223 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11224 {
11225
11226 if (!ctx.
Read(itemQBIndex))
11227 {
11229 return false;
11230 }
11231 if (itemQBIndex != -1 && player)
11232 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11233 }
11234 }
11235
11236 if (version < 140)
11237 {
11238
11239 if (!LoadVariables(ctx, version))
11240 {
11242 return false;
11243 }
11244 }
11245
11246
11248 {
11250 return false;
11251 }
11252 if (version >= 132)
11253 {
11255 if (raib)
11256 {
11258 {
11260 return false;
11261 }
11262 }
11263 }
11264
11266 return true;
11267 }
11268
11269
11270
11272 {
11273 super.OnStoreSave(ctx);
11274
11275 PlayerBase player;
11276 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11277 {
11279
11280 int itemQBIndex = -1;
11281 itemQBIndex = player.FindQuickBarEntityIndex(this);
11282 ctx.
Write(itemQBIndex);
11283 }
11284 else
11285 {
11287 }
11288
11290
11292 if (raib)
11293 {
11295 }
11296 }
11297
11298
11300 {
11301 super.AfterStoreLoad();
11302
11304 {
11306 }
11307
11309 {
11312 }
11313 }
11314
11316 {
11317 super.EEOnAfterLoad();
11318
11320 {
11322 }
11323
11326 }
11327
11329 {
11330 return false;
11331 }
11332
11333
11334
11336 {
11338 {
11339 #ifdef PLATFORM_CONSOLE
11340
11342 {
11344 if (menu)
11345 {
11347 }
11348 }
11349 #endif
11350 }
11351
11353 {
11356 }
11357
11359 {
11360 SetWeightDirty();
11362 }
11364 {
11367 }
11368
11370 {
11373 }
11375 {
11378 }
11379
11380 super.OnVariablesSynchronized();
11381 }
11382
11383
11384
11386 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11387 {
11388 if (!IsServerCheck(allow_client))
11389 return false;
11390
11392 return false;
11393
11396
11397 if (value <= (min + 0.001))
11398 value = min;
11399
11400 if (value == min)
11401 {
11402 if (destroy_config)
11403 {
11404 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11405 if (dstr)
11406 {
11408 this.Delete();
11409 return true;
11410 }
11411 }
11412 else if (destroy_forced)
11413 {
11415 this.Delete();
11416 return true;
11417 }
11418
11420 }
11421
11424
11426 {
11428
11429 if (delta)
11431 }
11432
11434
11435 return false;
11436 }
11437
11438
11440 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11441 {
11443 }
11444
11446 {
11449 }
11450
11452 {
11455 }
11456
11459 {
11460 float value_clamped = Math.Clamp(value, 0, 1);
11462 SetQuantity(result, destroy_config, destroy_forced);
11463 }
11464
11465
11468 {
11470 }
11471
11473 {
11475 }
11476
11477
11478
11479
11480
11481
11482
11483
11484
11485
11487 {
11488 int slot = -1;
11489 if (GetInventory())
11490 {
11491 InventoryLocation il = new InventoryLocation;
11492 GetInventory().GetCurrentInventoryLocation(il);
11494 }
11495
11497 }
11498
11500 {
11501 float quantity_max = 0;
11502
11504 {
11505 if (attSlotID != -1)
11506 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11507
11508 if (quantity_max <= 0)
11510 }
11511
11512 if (quantity_max <= 0)
11514
11515 return quantity_max;
11516 }
11517
11519 {
11521 }
11522
11524 {
11526 }
11527
11528
11530 {
11532 }
11533
11535 {
11537 }
11538
11540 {
11542 }
11543
11544
11546 {
11547
11548 float weightEx = GetWeightEx();
11549 float special = GetInventoryAndCargoWeight();
11550 return weightEx - special;
11551 }
11552
11553
11555 {
11557 }
11558
11560 {
11562 {
11563 #ifdef DEVELOPER
11564 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11565 {
11566 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11568 }
11569 #endif
11570
11571 return GetQuantity() * GetConfigWeightModified();
11572 }
11573 else if (HasEnergyManager())
11574 {
11575 #ifdef DEVELOPER
11576 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11577 {
11578 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11579 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11580 }
11581 #endif
11582 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11583 }
11584 else
11585 {
11586 #ifdef DEVELOPER
11587 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11588 {
11589 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11590 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11591 }
11592 #endif
11593 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11594 }
11595 }
11596
11599 {
11600 int item_count = 0;
11602
11603 if (GetInventory().GetCargo() != NULL)
11604 {
11605 item_count = GetInventory().GetCargo().GetItemCount();
11606 }
11607
11608 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11609 {
11610 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11611 if (item)
11612 item_count += item.GetNumberOfItems();
11613 }
11614 return item_count;
11615 }
11616
11619 {
11620 float weight = 0;
11621 float wetness = 1;
11622 if (include_wetness)
11625 {
11626 weight = wetness * m_ConfigWeight;
11627 }
11629 {
11630 weight = 1;
11631 }
11632 return weight;
11633 }
11634
11635
11636
11638 {
11639 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11640 {
11641 GameInventory inv = GetInventory();
11642 array<EntityAI> items = new array<EntityAI>;
11644 for (int i = 0; i < items.Count(); i++)
11645 {
11647 if (item)
11648 {
11650 }
11651 }
11652 }
11653 }
11654
11655
11656
11657
11659 {
11660 float energy = 0;
11661 if (HasEnergyManager())
11662 {
11663 energy = GetCompEM().GetEnergy();
11664 }
11665 return energy;
11666 }
11667
11668
11670 {
11671 super.OnEnergyConsumed();
11672
11674 }
11675
11677 {
11678 super.OnEnergyAdded();
11679
11681 }
11682
11683
11685 {
11686 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11687 {
11689 {
11690 float energy_0to1 = GetCompEM().GetEnergy0To1();
11692 }
11693 }
11694 }
11695
11696
11698 {
11699 return ConfigGetFloat("heatIsolation");
11700 }
11701
11703 {
11705 }
11706
11708 {
11709 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11710 if (
GetGame().ConfigIsExisting(paramPath))
11712
11713 return 0.0;
11714 }
11715
11717 {
11718 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11719 if (
GetGame().ConfigIsExisting(paramPath))
11721
11722 return 0.0;
11723 }
11724
11725 override void SetWet(
float value,
bool allow_client =
false)
11726 {
11727 if (!IsServerCheck(allow_client))
11728 return;
11729
11732
11734
11735 m_VarWet = Math.Clamp(value, min, max);
11736
11738 {
11741 }
11742 }
11743
11744 override void AddWet(
float value)
11745 {
11747 }
11748
11750 {
11752 }
11753
11755 {
11757 }
11758
11760 {
11762 }
11763
11765 {
11767 }
11768
11770 {
11772 }
11773
11774 override void OnWetChanged(
float newVal,
float oldVal)
11775 {
11778 if (newLevel != oldLevel)
11779 {
11781 }
11782 }
11783
11785 {
11786 SetWeightDirty();
11787 }
11788
11790 {
11791 return GetWetLevelInternal(
m_VarWet);
11792 }
11793
11794
11795
11797 {
11799 }
11800
11802 {
11804 }
11805
11807 {
11809 }
11810
11812 {
11814 }
11815
11816
11817
11819 {
11820 if (ConfigIsExisting("itemModelLength"))
11821 {
11822 return ConfigGetFloat("itemModelLength");
11823 }
11824 return 0;
11825 }
11826
11828 {
11829 if (ConfigIsExisting("itemAttachOffset"))
11830 {
11831 return ConfigGetFloat("itemAttachOffset");
11832 }
11833 return 0;
11834 }
11835
11836 override void SetCleanness(
int value,
bool allow_client =
false)
11837 {
11838 if (!IsServerCheck(allow_client))
11839 return;
11840
11842
11844
11847 }
11848
11850 {
11852 }
11853
11855 {
11856 return true;
11857 }
11858
11859
11860
11861
11863 {
11865 }
11866
11868 {
11870 }
11871
11872
11873
11874
11875 override void SetColor(
int r,
int g,
int b,
int a)
11876 {
11882 }
11884 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11885 {
11890 }
11891
11893 {
11895 }
11896
11899 {
11900 int r,g,b,a;
11902 r = r/255;
11903 g = g/255;
11904 b = b/255;
11905 a = a/255;
11906 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11907 }
11908
11909
11910
11911 override void SetLiquidType(
int value,
bool allow_client =
false)
11912 {
11913 if (!IsServerCheck(allow_client))
11914 return;
11915
11920 }
11921
11923 {
11924 return ConfigGetInt("varLiquidTypeInit");
11925 }
11926
11928 {
11930 }
11931
11933 {
11935 SetFrozen(false);
11936 }
11937
11940 {
11941 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11942 }
11943
11944
11947 {
11948 PlayerBase nplayer;
11949 if (PlayerBase.CastTo(nplayer, player))
11950 {
11952
11953 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11954 }
11955 }
11956
11957
11960 {
11961 PlayerBase nplayer;
11962 if (PlayerBase.CastTo(nplayer,player))
11963 {
11964
11965 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11966
11967 }
11968
11969
11970 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11971
11972
11973 if (HasEnergyManager())
11974 {
11975 GetCompEM().UpdatePlugState();
11976 }
11977 }
11978
11979
11981 {
11982 super.OnPlacementStarted(player);
11983
11985 }
11986
11987 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
11988 {
11990 {
11991 m_AdminLog.OnPlacementComplete(player,
this);
11992 }
11993
11994 super.OnPlacementComplete(player, position, orientation);
11995 }
11996
11997
11998
11999
12000
12002 {
12004 {
12005 return true;
12006 }
12007 else
12008 {
12009 return false;
12010 }
12011 }
12012
12013
12015 {
12017 {
12019 }
12020 }
12021
12022
12024 {
12026 }
12027
12029 {
12031 }
12032
12033 override void InsertAgent(
int agent,
float count = 1)
12034 {
12035 if (count < 1)
12036 return;
12037
12039 }
12040
12043 {
12045 }
12046
12047
12049 {
12051 }
12052
12053
12054
12055
12056
12057
12058
12059
12060
12061
12062
12063
12064
12065
12066
12067
12068
12069
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081
12082
12083
12084
12085
12086
12087
12088
12089
12090
12091
12092
12093
12095 {
12097 return false;
12098 return true;
12099 }
12100
12102 {
12103
12105 }
12106
12107
12110 {
12111 super.CheckForRoofLimited(timeTresholdMS);
12112
12114 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12115 {
12116 m_PreviousRoofTestTime = time;
12117 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12118 }
12119 }
12120
12121
12123 {
12125 {
12126 return 0;
12127 }
12128
12129 if (GetInventory().GetAttachmentSlotsCount() != 0)
12130 {
12131 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12132 if (filter)
12133 return filter.GetProtectionLevel(type, false, system);
12134 else
12135 return 0;
12136 }
12137
12138 string subclassPath, entryName;
12139
12140 switch (type)
12141 {
12143 entryName = "biological";
12144 break;
12146 entryName = "chemical";
12147 break;
12148 default:
12149 entryName = "biological";
12150 break;
12151 }
12152
12153 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12154
12156 }
12157
12158
12159
12162 {
12163 if (!IsMagazine())
12165
12167 }
12168
12169
12170
12171
12172
12177 {
12178 return true;
12179 }
12180
12182 {
12184 }
12185
12186
12187
12188
12189
12191 {
12192 if (parent)
12193 {
12194 if (parent.IsInherited(DayZInfected))
12195 return true;
12196
12197 if (!parent.IsRuined())
12198 return true;
12199 }
12200
12201 return true;
12202 }
12203
12205 {
12206 if (!super.CanPutAsAttachment(parent))
12207 {
12208 return false;
12209 }
12210
12211 if (!IsRuined() && !parent.IsRuined())
12212 {
12213 return true;
12214 }
12215
12216 return false;
12217 }
12218
12220 {
12221
12222
12223
12224
12225 return super.CanReceiveItemIntoCargo(item);
12226 }
12227
12229 {
12230
12231
12232
12233
12234 GameInventory attachmentInv = attachment.GetInventory();
12236 {
12237 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12238 return false;
12239 }
12240
12241 InventoryLocation loc = new InventoryLocation();
12242 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12243 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12244 return false;
12245
12246 return super.CanReceiveAttachment(attachment, slotId);
12247 }
12248
12250 {
12251 if (!super.CanReleaseAttachment(attachment))
12252 return false;
12253
12254 return GetInventory().AreChildrenAccessible();
12255 }
12256
12257
12258
12259
12260
12261
12262
12263
12264
12265
12266
12267
12268
12269
12270
12271
12272
12273
12274
12275
12276
12278 {
12279 int id = muzzle_owner.GetMuzzleID();
12280 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12281
12282 if (WPOF_array)
12283 {
12284 for (int i = 0; i < WPOF_array.Count(); i++)
12285 {
12286 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12287
12288 if (WPOF)
12289 {
12290 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12291 }
12292 }
12293 }
12294 }
12295
12296
12298 {
12299 int id = muzzle_owner.GetMuzzleID();
12301
12302 if (WPOBE_array)
12303 {
12304 for (int i = 0; i < WPOBE_array.Count(); i++)
12305 {
12306 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12307
12308 if (WPOBE)
12309 {
12310 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12311 }
12312 }
12313 }
12314 }
12315
12316
12318 {
12319 int id = muzzle_owner.GetMuzzleID();
12320 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12321
12322 if (WPOOH_array)
12323 {
12324 for (int i = 0; i < WPOOH_array.Count(); i++)
12325 {
12326 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12327
12328 if (WPOOH)
12329 {
12330 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12331 }
12332 }
12333 }
12334 }
12335
12336
12338 {
12339 int id = muzzle_owner.GetMuzzleID();
12340 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12341
12342 if (WPOOH_array)
12343 {
12344 for (int i = 0; i < WPOOH_array.Count(); i++)
12345 {
12346 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12347
12348 if (WPOOH)
12349 {
12350 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12351 }
12352 }
12353 }
12354 }
12355
12356
12358 {
12359 int id = muzzle_owner.GetMuzzleID();
12360 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12361
12362 if (WPOOH_array)
12363 {
12364 for (int i = 0; i < WPOOH_array.Count(); i++)
12365 {
12366 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12367
12368 if (WPOOH)
12369 {
12370 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12371 }
12372 }
12373 }
12374 }
12375
12376
12377
12379 {
12381 {
12382 return true;
12383 }
12384
12385 return false;
12386 }
12387
12389 {
12391 {
12392 return true;
12393 }
12394
12395 return false;
12396 }
12397
12399 {
12401 {
12402 return true;
12403 }
12404
12405 return false;
12406 }
12407
12409 {
12410 return false;
12411 }
12412
12415 {
12416 return UATimeSpent.DEFAULT_DEPLOY;
12417 }
12418
12419
12420
12421
12423 {
12425 SetSynchDirty();
12426 }
12427
12429 {
12431 }
12432
12433
12435 {
12436 return false;
12437 }
12438
12441 {
12442 string att_type = "None";
12443
12444 if (ConfigIsExisting("soundAttType"))
12445 {
12446 att_type = ConfigGetString("soundAttType");
12447 }
12448
12450 }
12451
12453 {
12455 }
12456
12457
12458
12459
12460
12464
12466 {
12469
12471 }
12472
12473
12475 {
12477 return;
12478
12480
12483
12486
12487 SoundParameters params = new SoundParameters();
12491 }
12492
12493
12495 {
12497 return;
12498
12500 SetSynchDirty();
12501
12504 }
12505
12506
12508 {
12510 return;
12511
12513 SetSynchDirty();
12514
12517 }
12518
12520 {
12522 }
12523
12525 {
12527 }
12528
12531 {
12532 if (!
GetGame().IsDedicatedServer())
12533 {
12534 if (ConfigIsExisting("attachSoundSet"))
12535 {
12536 string cfg_path = "";
12537 string soundset = "";
12538 string type_name =
GetType();
12539
12542 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12543 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12544
12545 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12546 {
12547 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12548 {
12549 if (cfg_slot_array[i] == slot_type)
12550 {
12551 soundset = cfg_soundset_array[i];
12552 break;
12553 }
12554 }
12555 }
12556
12557 if (soundset != "")
12558 {
12559 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12561 }
12562 }
12563 }
12564 }
12565
12567 {
12568
12569 }
12570
12571 void OnApply(PlayerBase player);
12572
12574 {
12575 return 1.0;
12576 };
12577
12579 {
12581 }
12582
12584 {
12586 }
12587
12589
12591 {
12592 SetDynamicPhysicsLifeTime(0.01);
12594 }
12595
12597 {
12598 array<string> zone_names = new array<string>;
12599 GetDamageZones(zone_names);
12600 for (int i = 0; i < zone_names.Count(); i++)
12601 {
12602 SetHealthMax(zone_names.Get(i),"Health");
12603 }
12604 SetHealthMax("","Health");
12605 }
12606
12609 {
12610 float global_health = GetHealth01("","Health");
12611 array<string> zones = new array<string>;
12612 GetDamageZones(zones);
12613
12614 for (int i = 0; i < zones.Count(); i++)
12615 {
12616 SetHealth01(zones.Get(i),"Health",global_health);
12617 }
12618 }
12619
12622 {
12623 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12624 }
12625
12627 {
12628 if (!hasRootAsPlayer)
12629 {
12630 if (refParentIB)
12631 {
12632
12633 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12634 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12635
12636 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12637 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12638
12641 }
12642 else
12643 {
12644
12647 }
12648 }
12649 }
12650
12652 {
12654 {
12655 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12656 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12657 {
12658 float heatPermCoef = 1.0;
12660 while (ent)
12661 {
12662 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12663 ent = ent.GetHierarchyParent();
12664 }
12665
12666 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12667 }
12668 }
12669 }
12670
12672 {
12673
12674 EntityAI parent = GetHierarchyParent();
12675 if (!parent)
12676 {
12677 hasParent = false;
12678 hasRootAsPlayer = false;
12679 }
12680 else
12681 {
12682 hasParent = true;
12683 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12684 refParentIB =
ItemBase.Cast(parent);
12685 }
12686 }
12687
12688 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12689 {
12690
12691 }
12692
12694 {
12695
12696 return false;
12697 }
12698
12700 {
12701
12702
12703 return false;
12704 }
12705
12707 {
12708
12709 return false;
12710 }
12711
12714 {
12715 return !GetIsFrozen() &&
IsOpen();
12716 }
12717
12719 {
12720 bool hasParent = false, hasRootAsPlayer = false;
12722
12723 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12724 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12725
12726 if (wwtu || foodDecay)
12727 {
12731
12732 if (processWetness || processTemperature || processDecay)
12733 {
12735
12736 if (processWetness)
12737 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12738
12739 if (processTemperature)
12741
12742 if (processDecay)
12743 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12744 }
12745 }
12746 }
12747
12750 {
12752 }
12753
12755 {
12758
12759 return super.GetTemperatureFreezeThreshold();
12760 }
12761
12763 {
12766
12767 return super.GetTemperatureThawThreshold();
12768 }
12769
12771 {
12774
12775 return super.GetItemOverheatThreshold();
12776 }
12777
12779 {
12781 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12782
12783 return super.GetTemperatureFreezeTime();
12784 }
12785
12787 {
12789 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12790
12791 return super.GetTemperatureThawTime();
12792 }
12793
12798
12800 {
12801 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12802 }
12803
12805 {
12806 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12807 }
12808
12811 {
12813 }
12814
12816 {
12818 }
12819
12821 {
12823 }
12824
12827 {
12828 return null;
12829 }
12830
12833 {
12834 return false;
12835 }
12836
12838 {
12840 {
12843 if (!trg)
12844 {
12846 explosive = this;
12847 }
12848
12849 explosive.PairRemote(trg);
12851
12852 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12853 trg.SetPersistentPairID(persistentID);
12854 explosive.SetPersistentPairID(persistentID);
12855
12856 return true;
12857 }
12858 return false;
12859 }
12860
12863 {
12864 float ret = 1.0;
12867 ret *= GetHealth01();
12868
12869 return ret;
12870 }
12871
12872 #ifdef DEVELOPER
12873 override void SetDebugItem()
12874 {
12875 super.SetDebugItem();
12876 _itemBase = this;
12877 }
12878
12880 {
12881 string text = super.GetDebugText();
12882
12884 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12885
12886 return text;
12887 }
12888 #endif
12889
12891 {
12892 return true;
12893 }
12894
12896
12898
12900 {
12903 }
12904
12905
12913
12929}
12930
12932{
12934 if (entity)
12935 {
12936 bool is_item = entity.IsInherited(
ItemBase);
12937 if (is_item && full_quantity)
12938 {
12941 }
12942 }
12943 else
12944 {
12946 return NULL;
12947 }
12948 return entity;
12949}
12950
12952{
12953 if (item)
12954 {
12955 if (health > 0)
12956 item.SetHealth("", "", health);
12957
12958 if (item.CanHaveTemperature())
12959 {
12961 if (item.CanFreeze())
12962 item.SetFrozen(false);
12963 }
12964
12965 if (item.HasEnergyManager())
12966 {
12967 if (quantity >= 0)
12968 {
12969 item.GetCompEM().SetEnergy0To1(quantity);
12970 }
12971 else
12972 {
12974 }
12975 }
12976 else if (item.IsMagazine())
12977 {
12978 Magazine mag = Magazine.Cast(item);
12979 if (quantity >= 0)
12980 {
12981 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12982 }
12983 else
12984 {
12986 }
12987
12988 }
12989 else
12990 {
12991 if (quantity >= 0)
12992 {
12993 item.SetQuantityNormalized(quantity, false);
12994 }
12995 else
12996 {
12998 }
12999
13000 }
13001 }
13002}
13003
13004#ifdef DEVELOPER
13006#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.