8142{
8144 {
8145 return true;
8146 }
8147};
8148
8149
8150
8152{
8156
8158
8161
8162
8163
8164
8165
8174
8180
8185
8190
8211 protected bool m_IsResultOfSplit
8212
8214
8219
8220
8221
8223
8227
8228
8229
8231
8234
8235
8236
8242
8243
8251
8254
8255
8257
8258
8260
8261
8266
8267
8272
8273
8275
8276
8278 {
8283
8284 if (!
GetGame().IsDedicatedServer())
8285 {
8287 {
8289
8291 {
8293 }
8294 }
8295
8298 }
8299
8300 m_OldLocation = null;
8301
8303 {
8305 }
8306
8307 if (ConfigIsExisting("headSelectionsToHide"))
8308 {
8311 }
8312
8314 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8315 {
8317 }
8318
8320
8321 m_IsResultOfSplit = false;
8322
8324 }
8325
8327 {
8328 super.InitItemVariables();
8329
8335 m_Count = ConfigGetInt(
"count");
8336
8339
8344
8347
8352
8364
8368
8369
8372 if (ConfigIsExisting("canBeSplit"))
8373 {
8376 }
8377
8379 if (ConfigIsExisting("itemBehaviour"))
8381
8382
8385 RegisterNetSyncVariableInt("m_VarLiquidType");
8386 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8387
8388 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8389 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8390 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8391
8392 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8393 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8394 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8395 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8396
8397 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8398 RegisterNetSyncVariableBool("m_IsTakeable");
8399 RegisterNetSyncVariableBool("m_IsHologram");
8400
8403 {
8406 }
8407
8409
8411 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8413
8414 }
8415
8417 {
8419 }
8420
8422 {
8425 {
8430 }
8431 }
8432
8433 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8434 {
8436 {
8439 }
8440
8442 }
8443
8445 {
8451 }
8452
8454
8456 {
8458
8459 if (!action)
8460 {
8461 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8462 return;
8463 }
8464
8466 if (!ai)
8467 {
8469 return;
8470 }
8471
8473 if (!action_array)
8474 {
8475 action_array = new array<ActionBase_Basic>;
8477 }
8478 if (LogManager.IsActionLogEnable())
8479 {
8480 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8481 }
8482
8483 if (action_array.Find(action) != -1)
8484 {
8485 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8486 }
8487 else
8488 {
8489 action_array.Insert(action);
8490 }
8491 }
8492
8494 {
8496 ActionBase action = player.GetActionManager().GetAction(actionName);
8499
8500 if (action_array)
8501 {
8502 action_array.RemoveItem(action);
8503 }
8504 }
8505
8506
8507
8509 {
8510 ActionOverrideData overrideData = new ActionOverrideData();
8514
8516 if (!actionMap)
8517 {
8520 }
8521
8522 actionMap.Insert(this.
Type(), overrideData);
8523
8524 }
8525
8527
8529
8530
8532 {
8535
8538
8539 string config_to_search = "CfgVehicles";
8540 string muzzle_owner_config;
8541
8543 {
8544 if (IsInherited(Weapon))
8545 config_to_search = "CfgWeapons";
8546
8547 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8548
8549 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8550
8552
8553 if (config_OnFire_subclass_count > 0)
8554 {
8555 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8556
8557 for (int i = 0; i < config_OnFire_subclass_count; i++)
8558 {
8559 string particle_class = "";
8561 string config_OnFire_entry = config_OnFire_class + particle_class;
8562 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8563 WPOF_array.Insert(WPOF);
8564 }
8565
8566
8568 }
8569 }
8570
8572 {
8573 config_to_search = "CfgWeapons";
8574 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8575
8576 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8577
8579
8580 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8581 {
8582 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8583
8584 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8585 {
8586 string particle_class2 = "";
8588 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8589 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8590 WPOBE_array.Insert(WPOBE);
8591 }
8592
8593
8595 }
8596 }
8597 }
8598
8599
8601 {
8604
8606 {
8607 string config_to_search = "CfgVehicles";
8608
8609 if (IsInherited(Weapon))
8610 config_to_search = "CfgWeapons";
8611
8612 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8613 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8614
8615 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8616 {
8617
8619
8621 {
8623 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8625 return;
8626 }
8627
8630
8631
8632
8634 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8635
8636 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8637 {
8638 string particle_class = "";
8640 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8642
8643 if (entry_type == CT_CLASS)
8644 {
8645 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8646 WPOOH_array.Insert(WPOF);
8647 }
8648 }
8649
8650
8652 }
8653 }
8654 }
8655
8657 {
8659 }
8660
8662 {
8664 {
8666
8669
8672
8673 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8674 }
8675 }
8676
8678 {
8680 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8681
8683 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8684
8686 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8687
8689 {
8691 }
8692 }
8693
8695 {
8697 }
8698
8700 {
8703 else
8705
8707 {
8710 }
8711 else
8712 {
8715
8718 }
8719
8721 }
8722
8724 {
8726 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8727 }
8728
8730 {
8732 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8734 }
8735
8737 {
8739 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8740 }
8741
8743 {
8746
8747 OverheatingParticle OP = new OverheatingParticle();
8752
8754 }
8755
8757 {
8760
8761 return -1;
8762 }
8763
8765 {
8767 {
8770
8771 for (int i = count; i > 0; --i)
8772 {
8773 int id = i - 1;
8776
8779
8780 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8781 {
8782 if (p)
8783 {
8786 }
8787 }
8788 }
8789 }
8790 }
8791
8793 {
8795 {
8797 {
8798 int id = i - 1;
8800
8801 if (OP)
8802 {
8804
8805 if (p)
8806 {
8808 }
8809
8810 delete OP;
8811 }
8812 }
8813
8816 }
8817 }
8818
8821 {
8822 return 0.0;
8823 }
8824
8825
8827 {
8828 return 250;
8829 }
8830
8832 {
8833 return 0;
8834 }
8835
8838 {
8840 return true;
8841
8842 return false;
8843 }
8844
8847 {
8850
8852 {
8854 }
8855 else
8856 {
8857
8859 }
8860
8862 }
8863
8870 {
8871 return -1;
8872 }
8873
8874
8875
8876
8878 {
8880 {
8882 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8883
8884 if (r_index >= 0)
8885 {
8886 InventoryLocation r_il = new InventoryLocation;
8887 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8888
8889 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8892 {
8893 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8894 }
8896 {
8897 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8898 }
8899
8900 }
8901
8902 player.GetHumanInventory().ClearUserReservedLocation(this);
8903 }
8904
8907 }
8908
8909
8910
8911
8913 {
8914 return ItemBase.m_DebugActionsMask;
8915 }
8916
8918 {
8919 return ItemBase.m_DebugActionsMask & mask;
8920 }
8921
8923 {
8924 ItemBase.m_DebugActionsMask = mask;
8925 }
8926
8928 {
8929 ItemBase.m_DebugActionsMask |= mask;
8930 }
8931
8933 {
8934 ItemBase.m_DebugActionsMask &= ~mask;
8935 }
8936
8938 {
8940 {
8942 }
8943 else
8944 {
8946 }
8947 }
8948
8949
8951 {
8952 if (GetEconomyProfile())
8953 {
8954 float q_max = GetEconomyProfile().GetQuantityMax();
8955 if (q_max > 0)
8956 {
8957 float q_min = GetEconomyProfile().GetQuantityMin();
8958 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8959
8961 {
8962 ComponentEnergyManager comp = GetCompEM();
8964 {
8966 }
8967 }
8969 {
8971
8972 }
8973
8974 }
8975 }
8976 }
8977
8980 {
8981 EntityAI parent = GetHierarchyParent();
8982
8983 if (parent)
8984 {
8985 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8986 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8987 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8988 }
8989 }
8990
8993 {
8994 EntityAI parent = GetHierarchyParent();
8995
8996 if (parent)
8997 {
8998 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8999 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9000 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9001 }
9002 }
9003
9005 {
9006
9007
9008
9009
9011
9013 {
9014 if (ScriptInputUserData.CanStoreInputUserData())
9015 {
9016 ScriptInputUserData ctx = new ScriptInputUserData;
9022 ctx.
Write(use_stack_max);
9025
9027 {
9028 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9029 }
9030 }
9031 }
9032 else if (!
GetGame().IsMultiplayer())
9033 {
9035 }
9036 }
9037
9039 {
9041 }
9042
9044 {
9046 }
9047
9049 {
9051 }
9052
9054 {
9055
9056 return false;
9057 }
9058
9060 {
9061 return false;
9062 }
9063
9067 {
9068 return false;
9069 }
9070
9072 {
9073 return "";
9074 }
9075
9077
9079 {
9080 return false;
9081 }
9082
9084 {
9085 return true;
9086 }
9087
9088
9089
9091 {
9092 return true;
9093 }
9094
9096 {
9097 return true;
9098 }
9099
9101 {
9102 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9104 }
9105
9107 {
9109 }
9110
9112 {
9114 if (!is_being_placed)
9116 SetSynchDirty();
9117 }
9118
9119
9121
9123 {
9125 }
9126
9128 {
9130 }
9131
9133 {
9134 return 1;
9135 }
9136
9138 {
9139 return false;
9140 }
9141
9143 {
9145 SetSynchDirty();
9146 }
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
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
9183 {
9184 super.OnMovedInsideCargo(container);
9185
9186 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9187 }
9188
9189 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9190 {
9191 super.EEItemLocationChanged(oldLoc,newLoc);
9192
9193 PlayerBase new_player = null;
9194 PlayerBase old_player = null;
9195
9196 if (newLoc.GetParent())
9197 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9198
9199 if (oldLoc.GetParent())
9200 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9201
9203 {
9204 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9205
9206 if (r_index >= 0)
9207 {
9208 InventoryLocation r_il = new InventoryLocation;
9209 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9210
9211 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9214 {
9215 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9216 }
9218 {
9219 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9220 }
9221
9222 }
9223 }
9224
9226 {
9227 if (new_player)
9228 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9229
9230 if (new_player == old_player)
9231 {
9232
9233 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9234 {
9236 {
9237 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9238 {
9239 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9240 }
9241 }
9242 else
9243 {
9244 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9245 }
9246 }
9247
9248 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9249 {
9250 int type = oldLoc.GetType();
9252 {
9253 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9254 }
9256 {
9257 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9258 }
9259 }
9260 if (!m_OldLocation)
9261 {
9262 m_OldLocation = new InventoryLocation;
9263 }
9264 m_OldLocation.Copy(oldLoc);
9265 }
9266 else
9267 {
9268 if (m_OldLocation)
9269 {
9270 m_OldLocation.Reset();
9271 }
9272 }
9273
9275 }
9276 else
9277 {
9278 if (new_player)
9279 {
9280 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9281 if (res_index >= 0)
9282 {
9283 InventoryLocation il = new InventoryLocation;
9284 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9286 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9289 {
9290 il.
GetParent().GetOnReleaseLock().Invoke(it);
9291 }
9293 {
9295 }
9296
9297 }
9298 }
9300 {
9301
9303 }
9304
9305 if (m_OldLocation)
9306 {
9307 m_OldLocation.Reset();
9308 }
9309 }
9310 }
9311
9312 override void EOnContact(IEntity other, Contact extra)
9313 {
9315 {
9316 int liquidType = -1;
9318 if (impactSpeed > 0.0)
9319 {
9321 #ifndef SERVER
9323 #else
9325 SetSynchDirty();
9326 #endif
9328 }
9329 }
9330
9331 #ifdef SERVER
9332 if (GetCompEM() && GetCompEM().IsPlugged())
9333 {
9334 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9335 GetCompEM().UnplugThis();
9336 }
9337 #endif
9338 }
9339
9341
9343 {
9345 }
9346
9348 {
9349
9350 }
9351
9353 {
9354 super.OnItemLocationChanged(old_owner, new_owner);
9355
9356 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9357 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9358
9359 if (!relatedPlayer && playerNew)
9360 relatedPlayer = playerNew;
9361
9362 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9363 {
9365 if (actionMgr)
9366 {
9367 ActionBase currentAction = actionMgr.GetRunningAction();
9368 if (currentAction)
9370 }
9371 }
9372
9373 Man ownerPlayerOld = null;
9374 Man ownerPlayerNew = null;
9375
9376 if (old_owner)
9377 {
9378 if (old_owner.
IsMan())
9379 {
9380 ownerPlayerOld = Man.Cast(old_owner);
9381 }
9382 else
9383 {
9384 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9385 }
9386 }
9387 else
9388 {
9390 {
9392
9393 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9394 {
9395 GetCompEM().UnplugThis();
9396 }
9397 }
9398 }
9399
9400 if (new_owner)
9401 {
9402 if (new_owner.
IsMan())
9403 {
9404 ownerPlayerNew = Man.Cast(new_owner);
9405 }
9406 else
9407 {
9408 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9409 }
9410 }
9411
9412 if (ownerPlayerOld != ownerPlayerNew)
9413 {
9414 if (ownerPlayerOld)
9415 {
9416 array<EntityAI> subItemsExit = new array<EntityAI>;
9418 for (int i = 0; i < subItemsExit.Count(); i++)
9419 {
9422 }
9423 }
9424
9425 if (ownerPlayerNew)
9426 {
9427 array<EntityAI> subItemsEnter = new array<EntityAI>;
9429 for (int j = 0; j < subItemsEnter.Count(); j++)
9430 {
9433 }
9434 }
9435 }
9436 else if (ownerPlayerNew != null)
9437 {
9438 PlayerBase nplayer;
9439 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9440 {
9441 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9443 for (int k = 0; k < subItemsUpdate.Count(); k++)
9444 {
9446 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9447 }
9448 }
9449 }
9450
9451 if (old_owner)
9452 old_owner.OnChildItemRemoved(this);
9453 if (new_owner)
9454 new_owner.OnChildItemReceived(this);
9455 }
9456
9457
9459 {
9460 super.EEDelete(parent);
9461 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9462 if (player)
9463 {
9465
9466 if (player.IsAlive())
9467 {
9468 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9469 if (r_index >= 0)
9470 {
9471 InventoryLocation r_il = new InventoryLocation;
9472 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9473
9474 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9477 {
9478 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9479 }
9481 {
9482 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9483 }
9484
9485 }
9486
9487 player.RemoveQuickBarEntityShortcut(this);
9488 }
9489 }
9490 }
9491
9493 {
9494 super.EEKilled(killer);
9495
9498 {
9499 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9500 {
9501 if (IsMagazine())
9502 {
9503 if (Magazine.Cast(this).GetAmmoCount() > 0)
9504 {
9506 }
9507 }
9508 else
9509 {
9511 }
9512 }
9513 }
9514 }
9515
9517 {
9518 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9519
9520 super.OnWasAttached(parent, slot_id);
9521
9524
9526 }
9527
9529 {
9530 super.OnWasDetached(parent, slot_id);
9531
9534 }
9535
9537 {
9538 int idx;
9541
9542 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9543 if (inventory_slots.Count() < 1)
9544 {
9545 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9546 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9547 }
9548 else
9549 {
9550 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9551 }
9552
9553 idx = inventory_slots.Find(slot);
9554 if (idx < 0)
9555 return "";
9556
9557 return attach_types.Get(idx);
9558 }
9559
9561 {
9562 int idx = -1;
9563 string slot;
9564
9567
9568 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9569 if (inventory_slots.Count() < 1)
9570 {
9571 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9572 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9573 }
9574 else
9575 {
9576 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9577 if (detach_types.Count() < 1)
9578 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9579 }
9580
9581 for (int i = 0; i < inventory_slots.Count(); i++)
9582 {
9583 slot = inventory_slots.Get(i);
9584 }
9585
9586 if (slot != "")
9587 {
9588 if (detach_types.Count() == 1)
9589 idx = 0;
9590 else
9591 idx = inventory_slots.Find(slot);
9592 }
9593 if (idx < 0)
9594 return "";
9595
9596 return detach_types.Get(idx);
9597 }
9598
9600 {
9601
9603
9604
9605 float min_time = 1;
9606 float max_time = 3;
9607 float delay = Math.RandomFloat(min_time, max_time);
9608
9609 explode_timer.Run(delay, this, "DoAmmoExplosion");
9610 }
9611
9613 {
9614 Magazine magazine = Magazine.Cast(this);
9615 int pop_sounds_count = 6;
9616 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9617
9618
9619 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9620 string sound_name = pop_sounds[ sound_idx ];
9622
9623
9624 magazine.ServerAddAmmoCount(-1);
9625
9626
9627 float min_temp_to_explode = 100;
9628
9629 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9630 {
9632 }
9633 }
9634
9635
9636 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9637 {
9638 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9639
9640 const int CHANCE_DAMAGE_CARGO = 4;
9641 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9642 const int CHANCE_DAMAGE_NOTHING = 2;
9643
9645 {
9646 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9647 int chances;
9648 int rnd;
9649
9650 if (GetInventory().GetCargo())
9651 {
9652 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9653 rnd = Math.RandomInt(0,chances);
9654
9655 if (rnd < CHANCE_DAMAGE_CARGO)
9656 {
9658 }
9659 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9660 {
9662 }
9663 }
9664 else
9665 {
9666 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9667 rnd = Math.RandomInt(0,chances);
9668
9669 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9670 {
9672 }
9673 }
9674 }
9675 }
9676
9678 {
9679 if (GetInventory().GetCargo())
9680 {
9681 int item_count = GetInventory().GetCargo().GetItemCount();
9682 if (item_count > 0)
9683 {
9684 int random_pick = Math.RandomInt(0, item_count);
9686 if (!item.IsExplosive())
9687 {
9688 item.AddHealth("","",damage);
9689 return true;
9690 }
9691 }
9692 }
9693 return false;
9694 }
9695
9697 {
9698 int attachment_count = GetInventory().AttachmentCount();
9699 if (attachment_count > 0)
9700 {
9701 int random_pick = Math.RandomInt(0, attachment_count);
9702 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9703 if (!attachment.IsExplosive())
9704 {
9705 attachment.AddHealth("","",damage);
9706 return true;
9707 }
9708 }
9709 return false;
9710 }
9711
9713 {
9715 }
9716
9718 {
9720 return GetInventory().CanRemoveEntity();
9721
9722 return false;
9723 }
9724
9726 {
9728 return;
9729
9731 {
9732 if (ScriptInputUserData.CanStoreInputUserData())
9733 {
9734 ScriptInputUserData ctx = new ScriptInputUserData;
9739 ctx.
Write(destination_entity);
9743 }
9744 }
9745 else if (!
GetGame().IsMultiplayer())
9746 {
9748 }
9749 }
9750
9752 {
9754 return;
9755
9756 float split_quantity_new;
9760 InventoryLocation loc = new InventoryLocation;
9761
9762 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9763 {
9765 split_quantity_new = stack_max;
9766 else
9768
9769 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9770 if (new_item)
9771 {
9772 new_item.SetResultOfSplit(true);
9773 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9775 new_item.SetQuantity(split_quantity_new);
9776 }
9777 }
9778 else if (destination_entity && slot_id == -1)
9779 {
9780 if (quantity > stack_max)
9781 split_quantity_new = stack_max;
9782 else
9783 split_quantity_new = quantity;
9784
9786 {
9789 }
9790
9791 if (new_item)
9792 {
9793 new_item.SetResultOfSplit(true);
9794 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9796 new_item.SetQuantity(split_quantity_new);
9797 }
9798 }
9799 else
9800 {
9801 if (stack_max != 0)
9802 {
9804 {
9806 }
9807
9808 if (split_quantity_new == 0)
9809 {
9810 if (!
GetGame().IsMultiplayer())
9811 player.PhysicalPredictiveDropItem(this);
9812 else
9813 player.ServerDropEntity(this);
9814 return;
9815 }
9816
9818
9819 if (new_item)
9820 {
9821 new_item.SetResultOfSplit(true);
9822 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9824 new_item.SetQuantity(stack_max);
9825 new_item.PlaceOnSurface();
9826 }
9827 }
9828 }
9829 }
9830
9832 {
9834 return;
9835
9836 float split_quantity_new;
9840 InventoryLocation loc = new InventoryLocation;
9841
9842 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9843 {
9845 split_quantity_new = stack_max;
9846 else
9848
9849 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9850 if (new_item)
9851 {
9852 new_item.SetResultOfSplit(true);
9853 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9855 new_item.SetQuantity(split_quantity_new);
9856 }
9857 }
9858 else if (destination_entity && slot_id == -1)
9859 {
9860 if (quantity > stack_max)
9861 split_quantity_new = stack_max;
9862 else
9863 split_quantity_new = quantity;
9864
9866 {
9869 }
9870
9871 if (new_item)
9872 {
9873 new_item.SetResultOfSplit(true);
9874 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9876 new_item.SetQuantity(split_quantity_new);
9877 }
9878 }
9879 else
9880 {
9881 if (stack_max != 0)
9882 {
9884 {
9886 }
9887
9889
9890 if (new_item)
9891 {
9892 new_item.SetResultOfSplit(true);
9893 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9895 new_item.SetQuantity(stack_max);
9896 new_item.PlaceOnSurface();
9897 }
9898 }
9899 }
9900 }
9901
9903 {
9905 return;
9906
9908 {
9909 if (ScriptInputUserData.CanStoreInputUserData())
9910 {
9911 ScriptInputUserData ctx = new ScriptInputUserData;
9916 dst.WriteToContext(ctx);
9918 }
9919 }
9920 else if (!
GetGame().IsMultiplayer())
9921 {
9923 }
9924 }
9925
9927 {
9929 return;
9930
9932 {
9933 if (ScriptInputUserData.CanStoreInputUserData())
9934 {
9935 ScriptInputUserData ctx = new ScriptInputUserData;
9940 ctx.
Write(destination_entity);
9946 }
9947 }
9948 else if (!
GetGame().IsMultiplayer())
9949 {
9951 }
9952 }
9953
9955 {
9957 }
9958
9960 {
9962 return this;
9963
9965 float split_quantity_new;
9967 if (dst.IsValid())
9968 {
9969 int slot_id = dst.GetSlot();
9971
9972 if (quantity > stack_max)
9973 split_quantity_new = stack_max;
9974 else
9975 split_quantity_new = quantity;
9976
9978
9979 if (new_item)
9980 {
9981 new_item.SetResultOfSplit(true);
9982 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9985 }
9986
9987 return new_item;
9988 }
9989
9990 return null;
9991 }
9992
9994 {
9996 return;
9997
9999 float split_quantity_new;
10001 if (destination_entity)
10002 {
10004 if (quantity > stackable)
10005 split_quantity_new = stackable;
10006 else
10007 split_quantity_new = quantity;
10008
10009 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10010 if (new_item)
10011 {
10012 new_item.SetResultOfSplit(true);
10013 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10015 new_item.SetQuantity(split_quantity_new);
10016 }
10017 }
10018 }
10019
10021 {
10023 return;
10024
10026 {
10027 if (ScriptInputUserData.CanStoreInputUserData())
10028 {
10029 ScriptInputUserData ctx = new ScriptInputUserData;
10034 ItemBase destination_entity =
this;
10035 ctx.
Write(destination_entity);
10039 }
10040 }
10041 else if (!
GetGame().IsMultiplayer())
10042 {
10044 }
10045 }
10046
10048 {
10050 return;
10051
10053 float split_quantity_new;
10055 if (player)
10056 {
10058 if (quantity > stackable)
10059 split_quantity_new = stackable;
10060 else
10061 split_quantity_new = quantity;
10062
10063 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10064 new_item =
ItemBase.Cast(in_hands);
10065 if (new_item)
10066 {
10067 new_item.SetResultOfSplit(true);
10068 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10070 new_item.SetQuantity(split_quantity_new);
10071 }
10072 }
10073 }
10074
10076 {
10078 return;
10079
10081 float split_quantity_new = Math.Floor(quantity * 0.5);
10082
10084
10085 if (new_item)
10086 {
10087 if (new_item.GetQuantityMax() < split_quantity_new)
10088 {
10089 split_quantity_new = new_item.GetQuantityMax();
10090 }
10091
10092 new_item.SetResultOfSplit(true);
10093 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10094
10096 {
10099 }
10100 else
10101 {
10104 }
10105 }
10106 }
10107
10109 {
10111 return;
10112
10114 float split_quantity_new = Math.Floor(quantity / 2);
10115
10116 InventoryLocation invloc = new InventoryLocation;
10118
10120 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10121
10122 if (new_item)
10123 {
10124 if (new_item.GetQuantityMax() < split_quantity_new)
10125 {
10126 split_quantity_new = new_item.GetQuantityMax();
10127 }
10129 {
10132 }
10133 else
10134 {
10137 }
10138 }
10139 }
10140
10143 {
10144 SetWeightDirty();
10146
10147 if (parent)
10148 parent.OnAttachmentQuantityChangedEx(this, delta);
10149
10151 {
10153 {
10155 }
10157 {
10158 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10160 }
10161 }
10162
10163 }
10164
10167 {
10168
10169 }
10170
10173 {
10175 }
10176
10178 {
10179 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10180
10182 {
10183 if (newLevel == GameConstants.STATE_RUINED)
10184 {
10186 EntityAI parent = GetHierarchyParent();
10187 if (parent && parent.IsFireplace())
10188 {
10189 CargoBase cargo = GetInventory().GetCargo();
10190 if (cargo)
10191 {
10193 {
10195 }
10196 }
10197 }
10198 }
10199
10201 {
10202
10204 return;
10205 }
10206
10207 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10208 {
10210 }
10211 }
10212 }
10213
10214
10216 {
10217 super.OnRightClick();
10218
10220 {
10222 {
10223 if (ScriptInputUserData.CanStoreInputUserData())
10224 {
10225 vector m4[4];
10227
10228 EntityAI root = GetHierarchyRoot();
10229
10230 InventoryLocation dst = new InventoryLocation;
10232 {
10233 if (root)
10234 {
10235 root.GetTransform(m4);
10237 }
10238 else
10239 GetInventory().GetCurrentInventoryLocation(dst);
10240 }
10241 else
10242 {
10244
10245
10246 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10247 {
10248 if (root)
10249 {
10250 root.GetTransform(m4);
10252 }
10253 else
10254 GetInventory().GetCurrentInventoryLocation(dst);
10255 }
10256 else
10257 {
10258 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10259 }
10260 }
10261
10262 ScriptInputUserData ctx = new ScriptInputUserData;
10270 }
10271 }
10272 else if (!
GetGame().IsMultiplayer())
10273 {
10275 }
10276 }
10277 }
10278
10279 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10280 {
10281
10282 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10283 return false;
10284
10285 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10286 return false;
10287
10288
10290 return false;
10291
10292
10293 Magazine mag = Magazine.Cast(this);
10294 if (mag)
10295 {
10296 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10297 return false;
10298
10299 if (stack_max_limit)
10300 {
10301 Magazine other_mag = Magazine.Cast(other_item);
10302 if (other_item)
10303 {
10304 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10305 return false;
10306 }
10307
10308 }
10309 }
10310 else
10311 {
10312
10314 return false;
10315
10317 return false;
10318 }
10319
10320 PlayerBase player = null;
10321 if (CastTo(player, GetHierarchyRootPlayer()))
10322 {
10323 if (player.GetInventory().HasAttachment(this))
10324 return false;
10325
10326 if (player.IsItemsToDelete())
10327 return false;
10328 }
10329
10330 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10331 return false;
10332
10333 int slotID;
10335 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10336 return false;
10337
10338 return true;
10339 }
10340
10342 {
10344 }
10345
10347 {
10348 return m_IsResultOfSplit;
10349 }
10350
10352 {
10353 m_IsResultOfSplit = value;
10354 }
10355
10357 {
10359 }
10360
10362 {
10363 float other_item_quantity = other_item.GetQuantity();
10364 float this_free_space;
10365
10367
10369
10370 if (other_item_quantity > this_free_space)
10371 {
10372 return this_free_space;
10373 }
10374 else
10375 {
10376 return other_item_quantity;
10377 }
10378 }
10379
10381 {
10383 }
10384
10386 {
10388 return;
10389
10390 if (!IsMagazine() && other_item)
10391 {
10393 if (quantity_used != 0)
10394 {
10395 float hp1 = GetHealth01("","");
10396 float hp2 = other_item.GetHealth01("","");
10397 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10398 hpResult = hpResult / (
GetQuantity() + quantity_used);
10399
10400 hpResult *= GetMaxHealth();
10401 Math.Round(hpResult);
10402 SetHealth("", "Health", hpResult);
10403
10405 other_item.AddQuantity(-quantity_used);
10406 }
10407 }
10409 }
10410
10412 {
10413 #ifdef SERVER
10414 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10415 GetHierarchyParent().IncreaseLifetimeUp();
10416 #endif
10417 };
10418
10420 {
10421 PlayerBase p = PlayerBase.Cast(player);
10422
10423 array<int> recipesIds = p.m_Recipes;
10424 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10425 if (moduleRecipesManager)
10426 {
10427 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10428 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10429 }
10430
10431 for (int i = 0;i < recipesIds.Count(); i++)
10432 {
10433 int key = recipesIds.Get(i);
10434 string recipeName = moduleRecipesManager.GetRecipeName(key);
10436 }
10437 }
10438
10439
10440 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10441 {
10442 super.GetDebugActions(outputList);
10443
10444
10449
10450
10454
10458
10459
10462
10463
10465 {
10468 }
10469
10471
10474
10478 }
10479
10480
10481
10482
10484 {
10485 super.OnAction(action_id, player, ctx);
10486 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10487 {
10488 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10489 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10490 PlayerBase p = PlayerBase.Cast(player);
10491 if (
EActions.RECIPES_RANGE_START < 1000)
10492 {
10493 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10494 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10495 }
10496 }
10497 #ifndef SERVER
10498 else if (action_id ==
EActions.WATCH_PLAYER)
10499 {
10500 PluginDeveloper.SetDeveloperItemClientEx(player);
10501 }
10502 #endif
10504 {
10505 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10506 {
10507 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10508 OnDebugButtonPressServer(id + 1);
10509 }
10510
10511 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10512 {
10513 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10515 }
10516
10517 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10518 {
10519 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10521 }
10522
10523 else if (action_id ==
EActions.ADD_QUANTITY)
10524 {
10525 if (IsMagazine())
10526 {
10527 Magazine mag = Magazine.Cast(this);
10528 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10529 }
10530 else
10531 {
10533 }
10534
10535 if (m_EM)
10536 {
10537 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10538 }
10539
10540 }
10541
10542 else if (action_id ==
EActions.REMOVE_QUANTITY)
10543 {
10544 if (IsMagazine())
10545 {
10546 Magazine mag2 = Magazine.Cast(this);
10547 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10548 }
10549 else
10550 {
10552 }
10553 if (m_EM)
10554 {
10555 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10556 }
10557
10558 }
10559
10560 else if (action_id ==
EActions.SET_QUANTITY_0)
10561 {
10563
10564 if (m_EM)
10565 {
10566 m_EM.SetEnergy(0);
10567 }
10568 }
10569
10570 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10571 {
10573
10574 if (m_EM)
10575 {
10576 m_EM.SetEnergy(m_EM.GetEnergyMax());
10577 }
10578 }
10579
10580 else if (action_id ==
EActions.ADD_HEALTH)
10581 {
10582 AddHealth("","",GetMaxHealth("","Health")/5);
10583 }
10584 else if (action_id ==
EActions.REMOVE_HEALTH)
10585 {
10586 AddHealth("","",-GetMaxHealth("","Health")/5);
10587 }
10588 else if (action_id ==
EActions.DESTROY_HEALTH)
10589 {
10590 SetHealth01("","",0);
10591 }
10592 else if (action_id ==
EActions.WATCH_ITEM)
10593 {
10595 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10596 #ifdef DEVELOPER
10597 SetDebugDeveloper_item(this);
10598 #endif
10599 }
10600
10601 else if (action_id ==
EActions.ADD_TEMPERATURE)
10602 {
10603 AddTemperature(20);
10604
10605 }
10606
10607 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10608 {
10609 AddTemperature(-20);
10610
10611 }
10612
10613 else if (action_id ==
EActions.FLIP_FROZEN)
10614 {
10615 SetFrozen(!GetIsFrozen());
10616
10617 }
10618
10619 else if (action_id ==
EActions.ADD_WETNESS)
10620 {
10622
10623 }
10624
10625 else if (action_id ==
EActions.REMOVE_WETNESS)
10626 {
10628
10629 }
10630
10631 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10632 {
10635
10636
10637 }
10638
10639 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10640 {
10643 }
10644
10645 else if (action_id ==
EActions.MAKE_SPECIAL)
10646 {
10647 auto debugParams = DebugSpawnParams.WithPlayer(player);
10648 OnDebugSpawnEx(debugParams);
10649 }
10650
10651 else if (action_id ==
EActions.DELETE)
10652 {
10653 Delete();
10654 }
10655
10656 }
10657
10658
10659 return false;
10660 }
10661
10662
10663
10664
10668
10671
10672
10673
10675 {
10676 return false;
10677 }
10678
10679
10681 {
10682 return true;
10683 }
10684
10685
10687 {
10688 return true;
10689 }
10690
10691
10692
10694 {
10695 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10697 }
10698
10701 {
10702 return null;
10703 }
10704
10706 {
10707 return false;
10708 }
10709
10711 {
10712 return false;
10713 }
10714
10718
10719
10721 {
10722 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10723 return module_repairing.CanRepair(this, item_repair_kit);
10724 }
10725
10726
10727 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10728 {
10729 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10730 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10731 }
10732
10733
10735 {
10736
10737
10738
10739
10740
10741
10742
10743
10744 return 1;
10745 }
10746
10747
10748
10750 {
10752 }
10753
10754
10755
10757 {
10759 }
10760
10761
10770 {
10771 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10772
10773 if (player)
10774 {
10775 player.MessageStatus(text);
10776 }
10777 }
10778
10779
10788 {
10789 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10790
10791 if (player)
10792 {
10793 player.MessageAction(text);
10794 }
10795 }
10796
10797
10806 {
10807 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10808
10809 if (player)
10810 {
10811 player.MessageFriendly(text);
10812 }
10813 }
10814
10815
10824 {
10825 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10826
10827 if (player)
10828 {
10829 player.MessageImportant(text);
10830 }
10831 }
10832
10834 {
10835 return true;
10836 }
10837
10838
10839 override bool KindOf(
string tag)
10840 {
10841 bool found = false;
10842 string item_name = this.
GetType();
10845
10846 int array_size = item_tag_array.Count();
10847 for (int i = 0; i < array_size; i++)
10848 {
10849 if (item_tag_array.Get(i) == tag)
10850 {
10851 found = true;
10852 break;
10853 }
10854 }
10855 return found;
10856 }
10857
10858
10860 {
10861
10862 super.OnRPC(sender, rpc_type,ctx);
10863
10864
10865 switch (rpc_type)
10866 {
10867 #ifndef SERVER
10868 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10869 Param2<bool, string> p = new Param2<bool, string>(false, "");
10870
10872 return;
10873
10874 bool play = p.param1;
10875 string soundSet = p.param2;
10876
10877 if (play)
10878 {
10880 {
10882 {
10884 }
10885 }
10886 else
10887 {
10889 }
10890 }
10891 else
10892 {
10894 }
10895
10896 break;
10897 #endif
10898
10899 }
10900
10902 {
10904 }
10905 }
10906
10907
10908
10909
10911 {
10912 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10913 return plugin.GetID(
name);
10914 }
10915
10917 {
10918 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10919 return plugin.GetName(id);
10920 }
10921
10924 {
10925
10926
10927 int varFlags;
10928 if (!ctx.
Read(varFlags))
10929 return;
10930
10931 if (varFlags & ItemVariableFlags.FLOAT)
10932 {
10934 }
10935 }
10936
10938 {
10939
10940 super.SerializeNumericalVars(floats_out);
10941
10942
10943
10945 {
10947 }
10948
10950 {
10952 }
10953
10955 {
10957 }
10958
10960 {
10965 }
10966
10968 {
10970 }
10971 }
10972
10974 {
10975
10976 super.DeSerializeNumericalVars(floats);
10977
10978
10979 int index = 0;
10980 int mask = Math.Round(floats.Get(index));
10981
10982 index++;
10983
10985 {
10987 {
10989 }
10990 else
10991 {
10992 float quantity = floats.Get(index);
10993 SetQuantity(quantity,
true,
false,
false,
false);
10994 }
10995 index++;
10996 }
10997
10999 {
11000 float wet = floats.Get(index);
11002 index++;
11003 }
11004
11006 {
11007 int liquidtype = Math.Round(floats.Get(index));
11009 index++;
11010 }
11011
11013 {
11015 index++;
11017 index++;
11019 index++;
11021 index++;
11022 }
11023
11025 {
11026 int cleanness = Math.Round(floats.Get(index));
11028 index++;
11029 }
11030 }
11031
11033 {
11034 super.WriteVarsToCTX(ctx);
11035
11036
11038 {
11040 }
11041
11043 {
11045 }
11046
11048 {
11050 }
11051
11053 {
11054 int r,g,b,a;
11060 }
11061
11063 {
11065 }
11066 }
11067
11069 {
11070 if (!super.ReadVarsFromCTX(ctx,version))
11071 return false;
11072
11073 int intValue;
11074 float value;
11075
11076 if (version < 140)
11077 {
11078 if (!ctx.
Read(intValue))
11079 return false;
11080
11081 m_VariablesMask = intValue;
11082 }
11083
11085 {
11086 if (!ctx.
Read(value))
11087 return false;
11088
11090 {
11092 }
11093 else
11094 {
11096 }
11097 }
11098
11099 if (version < 140)
11100 {
11102 {
11103 if (!ctx.
Read(value))
11104 return false;
11105 SetTemperatureDirect(value);
11106 }
11107 }
11108
11110 {
11111 if (!ctx.
Read(value))
11112 return false;
11114 }
11115
11117 {
11118 if (!ctx.
Read(intValue))
11119 return false;
11121 }
11122
11124 {
11125 int r,g,b,a;
11127 return false;
11129 return false;
11131 return false;
11133 return false;
11134
11136 }
11137
11139 {
11140 if (!ctx.
Read(intValue))
11141 return false;
11143 }
11144
11145 if (version >= 138 && version < 140)
11146 {
11148 {
11149 if (!ctx.
Read(intValue))
11150 return false;
11151 SetFrozen(intValue);
11152 }
11153 }
11154
11155 return true;
11156 }
11157
11158
11160 {
11163 {
11165 }
11166
11167 if (!super.OnStoreLoad(ctx, version))
11168 {
11170 return false;
11171 }
11172
11173 if (version >= 114)
11174 {
11175 bool hasQuickBarIndexSaved;
11176
11177 if (!ctx.
Read(hasQuickBarIndexSaved))
11178 {
11180 return false;
11181 }
11182
11183 if (hasQuickBarIndexSaved)
11184 {
11185 int itmQBIndex;
11186
11187
11188 if (!ctx.
Read(itmQBIndex))
11189 {
11191 return false;
11192 }
11193
11194 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11195 if (itmQBIndex != -1 && parentPlayer)
11196 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11197 }
11198 }
11199 else
11200 {
11201
11202 PlayerBase player;
11203 int itemQBIndex;
11204 if (version ==
int.
MAX)
11205 {
11206 if (!ctx.
Read(itemQBIndex))
11207 {
11209 return false;
11210 }
11211 }
11212 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11213 {
11214
11215 if (!ctx.
Read(itemQBIndex))
11216 {
11218 return false;
11219 }
11220 if (itemQBIndex != -1 && player)
11221 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11222 }
11223 }
11224
11225 if (version < 140)
11226 {
11227
11228 if (!LoadVariables(ctx, version))
11229 {
11231 return false;
11232 }
11233 }
11234
11235
11237 {
11239 return false;
11240 }
11241 if (version >= 132)
11242 {
11244 if (raib)
11245 {
11247 {
11249 return false;
11250 }
11251 }
11252 }
11253
11255 return true;
11256 }
11257
11258
11259
11261 {
11262 super.OnStoreSave(ctx);
11263
11264 PlayerBase player;
11265 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11266 {
11268
11269 int itemQBIndex = -1;
11270 itemQBIndex = player.FindQuickBarEntityIndex(this);
11271 ctx.
Write(itemQBIndex);
11272 }
11273 else
11274 {
11276 }
11277
11279
11281 if (raib)
11282 {
11284 }
11285 }
11286
11287
11289 {
11290 super.AfterStoreLoad();
11291
11293 {
11295 }
11296
11298 {
11301 }
11302 }
11303
11305 {
11306 super.EEOnAfterLoad();
11307
11309 {
11311 }
11312
11315 }
11316
11318 {
11319 return false;
11320 }
11321
11322
11323
11325 {
11327 {
11328 #ifdef PLATFORM_CONSOLE
11329
11331 {
11333 if (menu)
11334 {
11336 }
11337 }
11338 #endif
11339 }
11340
11342 {
11345 }
11346
11348 {
11349 SetWeightDirty();
11351 }
11353 {
11356 }
11357
11359 {
11362 }
11364 {
11367 }
11368
11369 super.OnVariablesSynchronized();
11370 }
11371
11372
11373
11375 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11376 {
11377 if (!IsServerCheck(allow_client))
11378 return false;
11379
11381 return false;
11382
11385
11386 if (value <= (min + 0.001))
11387 value = min;
11388
11389 if (value == min)
11390 {
11391 if (destroy_config)
11392 {
11393 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11394 if (dstr)
11395 {
11397 this.Delete();
11398 return true;
11399 }
11400 }
11401 else if (destroy_forced)
11402 {
11404 this.Delete();
11405 return true;
11406 }
11407
11409 }
11410
11413
11415 {
11417
11418 if (delta)
11420 }
11421
11423
11424 return false;
11425 }
11426
11427
11429 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11430 {
11432 }
11433
11435 {
11438 }
11439
11441 {
11444 }
11445
11448 {
11449 float value_clamped = Math.Clamp(value, 0, 1);
11451 SetQuantity(result, destroy_config, destroy_forced);
11452 }
11453
11454
11457 {
11459 }
11460
11462 {
11464 }
11465
11466
11467
11468
11469
11470
11471
11472
11473
11474
11476 {
11477 int slot = -1;
11478 if (GetInventory())
11479 {
11480 InventoryLocation il = new InventoryLocation;
11481 GetInventory().GetCurrentInventoryLocation(il);
11483 }
11484
11486 }
11487
11489 {
11490 float quantity_max = 0;
11491
11493 {
11494 if (attSlotID != -1)
11495 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11496
11497 if (quantity_max <= 0)
11499 }
11500
11501 if (quantity_max <= 0)
11503
11504 return quantity_max;
11505 }
11506
11508 {
11510 }
11511
11513 {
11515 }
11516
11517
11519 {
11521 }
11522
11524 {
11526 }
11527
11529 {
11531 }
11532
11533
11535 {
11536
11537 float weightEx = GetWeightEx();
11538 float special = GetInventoryAndCargoWeight();
11539 return weightEx - special;
11540 }
11541
11542
11544 {
11546 }
11547
11549 {
11551 {
11552 #ifdef DEVELOPER
11553 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11554 {
11555 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11557 }
11558 #endif
11559
11560 return GetQuantity() * GetConfigWeightModified();
11561 }
11562 else if (HasEnergyManager())
11563 {
11564 #ifdef DEVELOPER
11565 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11566 {
11567 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11568 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11569 }
11570 #endif
11571 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11572 }
11573 else
11574 {
11575 #ifdef DEVELOPER
11576 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11577 {
11578 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11579 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11580 }
11581 #endif
11582 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11583 }
11584 }
11585
11588 {
11589 int item_count = 0;
11591
11592 if (GetInventory().GetCargo() != NULL)
11593 {
11594 item_count = GetInventory().GetCargo().GetItemCount();
11595 }
11596
11597 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11598 {
11599 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11600 if (item)
11601 item_count += item.GetNumberOfItems();
11602 }
11603 return item_count;
11604 }
11605
11608 {
11609 float weight = 0;
11610 float wetness = 1;
11611 if (include_wetness)
11614 {
11615 weight = wetness * m_ConfigWeight;
11616 }
11618 {
11619 weight = 1;
11620 }
11621 return weight;
11622 }
11623
11624
11625
11627 {
11628 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11629 {
11630 GameInventory inv = GetInventory();
11631 array<EntityAI> items = new array<EntityAI>;
11633 for (int i = 0; i < items.Count(); i++)
11634 {
11636 if (item)
11637 {
11639 }
11640 }
11641 }
11642 }
11643
11644
11645
11646
11648 {
11649 float energy = 0;
11650 if (HasEnergyManager())
11651 {
11652 energy = GetCompEM().GetEnergy();
11653 }
11654 return energy;
11655 }
11656
11657
11659 {
11660 super.OnEnergyConsumed();
11661
11663 }
11664
11666 {
11667 super.OnEnergyAdded();
11668
11670 }
11671
11672
11674 {
11675 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11676 {
11678 {
11679 float energy_0to1 = GetCompEM().GetEnergy0To1();
11681 }
11682 }
11683 }
11684
11685
11687 {
11688 return ConfigGetFloat("heatIsolation");
11689 }
11690
11692 {
11694 }
11695
11697 {
11698 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11699 if (
GetGame().ConfigIsExisting(paramPath))
11701
11702 return 0.0;
11703 }
11704
11706 {
11707 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11708 if (
GetGame().ConfigIsExisting(paramPath))
11710
11711 return 0.0;
11712 }
11713
11714 override void SetWet(
float value,
bool allow_client =
false)
11715 {
11716 if (!IsServerCheck(allow_client))
11717 return;
11718
11721
11723
11724 m_VarWet = Math.Clamp(value, min, max);
11725
11727 {
11730 }
11731 }
11732
11733 override void AddWet(
float value)
11734 {
11736 }
11737
11739 {
11741 }
11742
11744 {
11746 }
11747
11749 {
11751 }
11752
11754 {
11756 }
11757
11759 {
11761 }
11762
11763 override void OnWetChanged(
float newVal,
float oldVal)
11764 {
11767 if (newLevel != oldLevel)
11768 {
11770 }
11771 }
11772
11774 {
11775 SetWeightDirty();
11776 }
11777
11779 {
11780 return GetWetLevelInternal(
m_VarWet);
11781 }
11782
11783
11784
11786 {
11788 }
11789
11791 {
11793 }
11794
11796 {
11798 }
11799
11801 {
11803 }
11804
11805
11806
11808 {
11809 if (ConfigIsExisting("itemModelLength"))
11810 {
11811 return ConfigGetFloat("itemModelLength");
11812 }
11813 return 0;
11814 }
11815
11817 {
11818 if (ConfigIsExisting("itemAttachOffset"))
11819 {
11820 return ConfigGetFloat("itemAttachOffset");
11821 }
11822 return 0;
11823 }
11824
11825 override void SetCleanness(
int value,
bool allow_client =
false)
11826 {
11827 if (!IsServerCheck(allow_client))
11828 return;
11829
11831
11833
11836 }
11837
11839 {
11841 }
11842
11844 {
11845 return true;
11846 }
11847
11848
11849
11850
11852 {
11854 }
11855
11857 {
11859 }
11860
11861
11862
11863
11864 override void SetColor(
int r,
int g,
int b,
int a)
11865 {
11871 }
11873 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11874 {
11879 }
11880
11882 {
11884 }
11885
11888 {
11889 int r,g,b,a;
11891 r = r/255;
11892 g = g/255;
11893 b = b/255;
11894 a = a/255;
11895 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11896 }
11897
11898
11899
11900 override void SetLiquidType(
int value,
bool allow_client =
false)
11901 {
11902 if (!IsServerCheck(allow_client))
11903 return;
11904
11909 }
11910
11912 {
11913 return ConfigGetInt("varLiquidTypeInit");
11914 }
11915
11917 {
11919 }
11920
11922 {
11924 SetFrozen(false);
11925 }
11926
11929 {
11930 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11931 }
11932
11933
11936 {
11937 PlayerBase nplayer;
11938 if (PlayerBase.CastTo(nplayer, player))
11939 {
11941
11942 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11943 }
11944 }
11945
11946
11949 {
11950 PlayerBase nplayer;
11951 if (PlayerBase.CastTo(nplayer,player))
11952 {
11953
11954 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11955
11956 }
11957
11958
11959 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11960
11961
11962 if (HasEnergyManager())
11963 {
11964 GetCompEM().UpdatePlugState();
11965 }
11966 }
11967
11968
11970 {
11971 super.OnPlacementStarted(player);
11972
11974 }
11975
11976 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
11977 {
11979 {
11980 m_AdminLog.OnPlacementComplete(player,
this);
11981 }
11982
11983 super.OnPlacementComplete(player, position, orientation);
11984 }
11985
11986
11987
11988
11989
11991 {
11993 {
11994 return true;
11995 }
11996 else
11997 {
11998 return false;
11999 }
12000 }
12001
12002
12004 {
12006 {
12008 }
12009 }
12010
12011
12013 {
12015 }
12016
12018 {
12020 }
12021
12022 override void InsertAgent(
int agent,
float count = 1)
12023 {
12024 if (count < 1)
12025 return;
12026
12028 }
12029
12032 {
12034 }
12035
12036
12038 {
12040 }
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
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
12084 {
12086 return false;
12087 return true;
12088 }
12089
12091 {
12092
12094 }
12095
12096
12099 {
12100 super.CheckForRoofLimited(timeTresholdMS);
12101
12103 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12104 {
12105 m_PreviousRoofTestTime = time;
12106 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12107 }
12108 }
12109
12110
12112 {
12114 {
12115 return 0;
12116 }
12117
12118 if (GetInventory().GetAttachmentSlotsCount() != 0)
12119 {
12120 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12121 if (filter)
12122 return filter.GetProtectionLevel(type, false, system);
12123 else
12124 return 0;
12125 }
12126
12127 string subclassPath, entryName;
12128
12129 switch (type)
12130 {
12132 entryName = "biological";
12133 break;
12135 entryName = "chemical";
12136 break;
12137 default:
12138 entryName = "biological";
12139 break;
12140 }
12141
12142 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12143
12145 }
12146
12147
12148
12151 {
12152 if (!IsMagazine())
12154
12156 }
12157
12158
12159
12160
12161
12166 {
12167 return true;
12168 }
12169
12171 {
12173 }
12174
12175
12176
12177
12178
12180 {
12181 if (parent)
12182 {
12183 if (parent.IsInherited(DayZInfected))
12184 return true;
12185
12186 if (!parent.IsRuined())
12187 return true;
12188 }
12189
12190 return true;
12191 }
12192
12194 {
12195 if (!super.CanPutAsAttachment(parent))
12196 {
12197 return false;
12198 }
12199
12200 if (!IsRuined() && !parent.IsRuined())
12201 {
12202 return true;
12203 }
12204
12205 return false;
12206 }
12207
12209 {
12210
12211
12212
12213
12214 return super.CanReceiveItemIntoCargo(item);
12215 }
12216
12218 {
12219
12220
12221
12222
12223 GameInventory attachmentInv = attachment.GetInventory();
12225 {
12226 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12227 return false;
12228 }
12229
12230 InventoryLocation loc = new InventoryLocation();
12231 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12232 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12233 return false;
12234
12235 return super.CanReceiveAttachment(attachment, slotId);
12236 }
12237
12239 {
12240 if (!super.CanReleaseAttachment(attachment))
12241 return false;
12242
12243 return GetInventory().AreChildrenAccessible();
12244 }
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255
12256
12257
12258
12259
12260
12261
12262
12263
12264
12265
12267 {
12268 int id = muzzle_owner.GetMuzzleID();
12269 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12270
12271 if (WPOF_array)
12272 {
12273 for (int i = 0; i < WPOF_array.Count(); i++)
12274 {
12275 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12276
12277 if (WPOF)
12278 {
12279 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12280 }
12281 }
12282 }
12283 }
12284
12285
12287 {
12288 int id = muzzle_owner.GetMuzzleID();
12290
12291 if (WPOBE_array)
12292 {
12293 for (int i = 0; i < WPOBE_array.Count(); i++)
12294 {
12295 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12296
12297 if (WPOBE)
12298 {
12299 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12300 }
12301 }
12302 }
12303 }
12304
12305
12307 {
12308 int id = muzzle_owner.GetMuzzleID();
12309 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12310
12311 if (WPOOH_array)
12312 {
12313 for (int i = 0; i < WPOOH_array.Count(); i++)
12314 {
12315 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12316
12317 if (WPOOH)
12318 {
12319 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12320 }
12321 }
12322 }
12323 }
12324
12325
12327 {
12328 int id = muzzle_owner.GetMuzzleID();
12329 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12330
12331 if (WPOOH_array)
12332 {
12333 for (int i = 0; i < WPOOH_array.Count(); i++)
12334 {
12335 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12336
12337 if (WPOOH)
12338 {
12339 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12340 }
12341 }
12342 }
12343 }
12344
12345
12347 {
12348 int id = muzzle_owner.GetMuzzleID();
12349 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12350
12351 if (WPOOH_array)
12352 {
12353 for (int i = 0; i < WPOOH_array.Count(); i++)
12354 {
12355 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12356
12357 if (WPOOH)
12358 {
12359 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12360 }
12361 }
12362 }
12363 }
12364
12365
12366
12368 {
12370 {
12371 return true;
12372 }
12373
12374 return false;
12375 }
12376
12378 {
12380 {
12381 return true;
12382 }
12383
12384 return false;
12385 }
12386
12388 {
12390 {
12391 return true;
12392 }
12393
12394 return false;
12395 }
12396
12398 {
12399 return false;
12400 }
12401
12404 {
12405 return UATimeSpent.DEFAULT_DEPLOY;
12406 }
12407
12408
12409
12410
12412 {
12414 SetSynchDirty();
12415 }
12416
12418 {
12420 }
12421
12422
12424 {
12425 return false;
12426 }
12427
12430 {
12431 string att_type = "None";
12432
12433 if (ConfigIsExisting("soundAttType"))
12434 {
12435 att_type = ConfigGetString("soundAttType");
12436 }
12437
12439 }
12440
12442 {
12444 }
12445
12446
12447
12448
12449
12453
12455 {
12458
12460 }
12461
12462
12464 {
12466 return;
12467
12469
12472
12475
12476 SoundParameters params = new SoundParameters();
12480 }
12481
12482
12484 {
12486 return;
12487
12489 SetSynchDirty();
12490
12493 }
12494
12495
12497 {
12499 return;
12500
12502 SetSynchDirty();
12503
12506 }
12507
12509 {
12511 }
12512
12514 {
12516 }
12517
12520 {
12521 if (!
GetGame().IsDedicatedServer())
12522 {
12523 if (ConfigIsExisting("attachSoundSet"))
12524 {
12525 string cfg_path = "";
12526 string soundset = "";
12527 string type_name =
GetType();
12528
12531 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12532 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12533
12534 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12535 {
12536 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12537 {
12538 if (cfg_slot_array[i] == slot_type)
12539 {
12540 soundset = cfg_soundset_array[i];
12541 break;
12542 }
12543 }
12544 }
12545
12546 if (soundset != "")
12547 {
12548 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12550 }
12551 }
12552 }
12553 }
12554
12556 {
12557
12558 }
12559
12560 void OnApply(PlayerBase player);
12561
12563 {
12564 return 1.0;
12565 };
12566
12568 {
12570 }
12571
12573 {
12575 }
12576
12578
12580 {
12581 SetDynamicPhysicsLifeTime(0.01);
12583 }
12584
12586 {
12587 array<string> zone_names = new array<string>;
12588 GetDamageZones(zone_names);
12589 for (int i = 0; i < zone_names.Count(); i++)
12590 {
12591 SetHealthMax(zone_names.Get(i),"Health");
12592 }
12593 SetHealthMax("","Health");
12594 }
12595
12598 {
12599 float global_health = GetHealth01("","Health");
12600 array<string> zones = new array<string>;
12601 GetDamageZones(zones);
12602
12603 for (int i = 0; i < zones.Count(); i++)
12604 {
12605 SetHealth01(zones.Get(i),"Health",global_health);
12606 }
12607 }
12608
12611 {
12612 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12613 }
12614
12616 {
12617 if (!hasRootAsPlayer)
12618 {
12619 if (refParentIB)
12620 {
12621
12622 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12623 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12624
12625 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12626 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12627
12630 }
12631 else
12632 {
12633
12636 }
12637 }
12638 }
12639
12641 {
12643 {
12644 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12645 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12646 {
12647 float heatPermCoef = 1.0;
12649 while (ent)
12650 {
12651 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12652 ent = ent.GetHierarchyParent();
12653 }
12654
12655 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12656 }
12657 }
12658 }
12659
12661 {
12662
12663 EntityAI parent = GetHierarchyParent();
12664 if (!parent)
12665 {
12666 hasParent = false;
12667 hasRootAsPlayer = false;
12668 }
12669 else
12670 {
12671 hasParent = true;
12672 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12673 refParentIB =
ItemBase.Cast(parent);
12674 }
12675 }
12676
12677 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12678 {
12679
12680 }
12681
12683 {
12684
12685 return false;
12686 }
12687
12689 {
12690
12691
12692 return false;
12693 }
12694
12696 {
12697
12698 return false;
12699 }
12700
12703 {
12704 return !GetIsFrozen() &&
IsOpen();
12705 }
12706
12708 {
12709 bool hasParent = false, hasRootAsPlayer = false;
12711
12712 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12713 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12714
12715 if (wwtu || foodDecay)
12716 {
12720
12721 if (processWetness || processTemperature || processDecay)
12722 {
12724
12725 if (processWetness)
12726 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12727
12728 if (processTemperature)
12730
12731 if (processDecay)
12732 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12733 }
12734 }
12735 }
12736
12739 {
12741 }
12742
12744 {
12747
12748 return super.GetTemperatureFreezeThreshold();
12749 }
12750
12752 {
12755
12756 return super.GetTemperatureThawThreshold();
12757 }
12758
12760 {
12763
12764 return super.GetItemOverheatThreshold();
12765 }
12766
12768 {
12770 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12771
12772 return super.GetTemperatureFreezeTime();
12773 }
12774
12776 {
12778 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12779
12780 return super.GetTemperatureThawTime();
12781 }
12782
12787
12789 {
12790 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12791 }
12792
12794 {
12795 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12796 }
12797
12800 {
12802 }
12803
12805 {
12807 }
12808
12810 {
12812 }
12813
12816 {
12817 return null;
12818 }
12819
12822 {
12823 return false;
12824 }
12825
12827 {
12829 {
12832 if (!trg)
12833 {
12835 explosive = this;
12836 }
12837
12838 explosive.PairRemote(trg);
12840
12841 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12842 trg.SetPersistentPairID(persistentID);
12843 explosive.SetPersistentPairID(persistentID);
12844
12845 return true;
12846 }
12847 return false;
12848 }
12849
12852 {
12853 float ret = 1.0;
12856 ret *= GetHealth01();
12857
12858 return ret;
12859 }
12860
12861 #ifdef DEVELOPER
12862 override void SetDebugItem()
12863 {
12864 super.SetDebugItem();
12865 _itemBase = this;
12866 }
12867
12869 {
12870 string text = super.GetDebugText();
12871
12873 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12874
12875 return text;
12876 }
12877 #endif
12878
12880 {
12881 return true;
12882 }
12883
12885
12887
12889 {
12892 }
12893
12894
12902
12918}
12919
12921{
12923 if (entity)
12924 {
12925 bool is_item = entity.IsInherited(
ItemBase);
12926 if (is_item && full_quantity)
12927 {
12930 }
12931 }
12932 else
12933 {
12935 return NULL;
12936 }
12937 return entity;
12938}
12939
12941{
12942 if (item)
12943 {
12944 if (health > 0)
12945 item.SetHealth("", "", health);
12946
12947 if (item.CanHaveTemperature())
12948 {
12950 if (item.CanFreeze())
12951 item.SetFrozen(false);
12952 }
12953
12954 if (item.HasEnergyManager())
12955 {
12956 if (quantity >= 0)
12957 {
12958 item.GetCompEM().SetEnergy0To1(quantity);
12959 }
12960 else
12961 {
12963 }
12964 }
12965 else if (item.IsMagazine())
12966 {
12967 Magazine mag = Magazine.Cast(item);
12968 if (quantity >= 0)
12969 {
12970 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12971 }
12972 else
12973 {
12975 }
12976
12977 }
12978 else
12979 {
12980 if (quantity >= 0)
12981 {
12982 item.SetQuantityNormalized(quantity, false);
12983 }
12984 else
12985 {
12987 }
12988
12989 }
12990 }
12991}
12992
12993#ifdef DEVELOPER
12995#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.