8123{
8125 {
8126 return true;
8127 }
8128};
8129
8130
8131
8133{
8137
8139
8142
8143
8144
8145
8146
8155
8161
8166
8171
8192 protected bool m_IsResultOfSplit
8193
8195
8200
8201
8202
8204
8208
8209
8210
8212
8215
8216
8217
8223
8224
8232
8235
8236
8238
8239
8241
8242
8247
8248
8253
8254
8256
8257
8259 {
8264
8265 if (!
GetGame().IsDedicatedServer())
8266 {
8268 {
8270
8272 {
8274 }
8275 }
8276
8279 }
8280
8281 m_OldLocation = null;
8282
8284 {
8286 }
8287
8288 if (ConfigIsExisting("headSelectionsToHide"))
8289 {
8292 }
8293
8295 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8296 {
8298 }
8299
8301
8302 m_IsResultOfSplit = false;
8303
8305 }
8306
8308 {
8309 super.InitItemVariables();
8310
8316 m_Count = ConfigGetInt(
"count");
8317
8320
8325
8328
8333
8345
8349
8350
8353 if (ConfigIsExisting("canBeSplit"))
8354 {
8357 }
8358
8360 if (ConfigIsExisting("itemBehaviour"))
8362
8363
8366 RegisterNetSyncVariableInt("m_VarLiquidType");
8367 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8368
8369 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8370 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8371 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8372
8373 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8374 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8375 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8376 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8377
8378 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8379 RegisterNetSyncVariableBool("m_IsTakeable");
8380 RegisterNetSyncVariableBool("m_IsHologram");
8381
8384 {
8387 }
8388
8390
8392 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8394
8395 }
8396
8398 {
8400 }
8401
8403 {
8406 {
8411 }
8412 }
8413
8414 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8415 {
8417 {
8420 }
8421
8423 }
8424
8426 {
8432 }
8433
8435
8437 {
8439
8440 if (!action)
8441 {
8442 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8443 return;
8444 }
8445
8447 if (!ai)
8448 {
8450 return;
8451 }
8452
8454 if (!action_array)
8455 {
8456 action_array = new array<ActionBase_Basic>;
8458 }
8459 if (LogManager.IsActionLogEnable())
8460 {
8461 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8462 }
8463
8464 if (action_array.Find(action) != -1)
8465 {
8466 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8467 }
8468 else
8469 {
8470 action_array.Insert(action);
8471 }
8472 }
8473
8475 {
8477 ActionBase action = player.GetActionManager().GetAction(actionName);
8480
8481 if (action_array)
8482 {
8483 action_array.RemoveItem(action);
8484 }
8485 }
8486
8487
8488
8490 {
8491 ActionOverrideData overrideData = new ActionOverrideData();
8495
8497 if (!actionMap)
8498 {
8501 }
8502
8503 actionMap.Insert(this.
Type(), overrideData);
8504
8505 }
8506
8508
8510
8511
8513 {
8516
8519
8520 string config_to_search = "CfgVehicles";
8521 string muzzle_owner_config;
8522
8524 {
8525 if (IsInherited(Weapon))
8526 config_to_search = "CfgWeapons";
8527
8528 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8529
8530 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8531
8533
8534 if (config_OnFire_subclass_count > 0)
8535 {
8536 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8537
8538 for (int i = 0; i < config_OnFire_subclass_count; i++)
8539 {
8540 string particle_class = "";
8542 string config_OnFire_entry = config_OnFire_class + particle_class;
8543 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8544 WPOF_array.Insert(WPOF);
8545 }
8546
8547
8549 }
8550 }
8551
8553 {
8554 config_to_search = "CfgWeapons";
8555 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8556
8557 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8558
8560
8561 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8562 {
8563 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8564
8565 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8566 {
8567 string particle_class2 = "";
8569 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8570 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8571 WPOBE_array.Insert(WPOBE);
8572 }
8573
8574
8576 }
8577 }
8578 }
8579
8580
8582 {
8585
8587 {
8588 string config_to_search = "CfgVehicles";
8589
8590 if (IsInherited(Weapon))
8591 config_to_search = "CfgWeapons";
8592
8593 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8594 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8595
8596 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8597 {
8598
8600
8602 {
8604 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8606 return;
8607 }
8608
8611
8612
8613
8615 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8616
8617 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8618 {
8619 string particle_class = "";
8621 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8623
8624 if (entry_type == CT_CLASS)
8625 {
8626 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8627 WPOOH_array.Insert(WPOF);
8628 }
8629 }
8630
8631
8633 }
8634 }
8635 }
8636
8638 {
8640 }
8641
8643 {
8645 {
8647
8650
8653
8654 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8655 }
8656 }
8657
8659 {
8661 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8662
8664 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8665
8667 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8668
8670 {
8672 }
8673 }
8674
8676 {
8678 }
8679
8681 {
8684 else
8686
8688 {
8691 }
8692 else
8693 {
8696
8699 }
8700
8702 }
8703
8705 {
8707 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8708 }
8709
8711 {
8713 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8715 }
8716
8718 {
8720 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8721 }
8722
8724 {
8727
8728 OverheatingParticle OP = new OverheatingParticle();
8733
8735 }
8736
8738 {
8741
8742 return -1;
8743 }
8744
8746 {
8748 {
8751
8752 for (int i = count; i > 0; --i)
8753 {
8754 int id = i - 1;
8757
8760
8761 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8762 {
8763 if (p)
8764 {
8767 }
8768 }
8769 }
8770 }
8771 }
8772
8774 {
8776 {
8778 {
8779 int id = i - 1;
8781
8782 if (OP)
8783 {
8785
8786 if (p)
8787 {
8789 }
8790
8791 delete OP;
8792 }
8793 }
8794
8797 }
8798 }
8799
8802 {
8803 return 0.0;
8804 }
8805
8806
8808 {
8809 return 250;
8810 }
8811
8813 {
8814 return 0;
8815 }
8816
8819 {
8821 return true;
8822
8823 return false;
8824 }
8825
8828 {
8831
8833 {
8835 }
8836 else
8837 {
8838
8840 }
8841
8843 }
8844
8851 {
8852 return -1;
8853 }
8854
8855
8856
8857
8859 {
8861 {
8863 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8864
8865 if (r_index >= 0)
8866 {
8867 InventoryLocation r_il = new InventoryLocation;
8868 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8869
8870 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8873 {
8874 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8875 }
8877 {
8878 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8879 }
8880
8881 }
8882
8883 player.GetHumanInventory().ClearUserReservedLocation(this);
8884 }
8885
8888 }
8889
8890
8891
8892
8894 {
8895 return ItemBase.m_DebugActionsMask;
8896 }
8897
8899 {
8900 return ItemBase.m_DebugActionsMask & mask;
8901 }
8902
8904 {
8905 ItemBase.m_DebugActionsMask = mask;
8906 }
8907
8909 {
8910 ItemBase.m_DebugActionsMask |= mask;
8911 }
8912
8914 {
8915 ItemBase.m_DebugActionsMask &= ~mask;
8916 }
8917
8919 {
8921 {
8923 }
8924 else
8925 {
8927 }
8928 }
8929
8930
8932 {
8933 if (GetEconomyProfile())
8934 {
8935 float q_max = GetEconomyProfile().GetQuantityMax();
8936 if (q_max > 0)
8937 {
8938 float q_min = GetEconomyProfile().GetQuantityMin();
8939 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8940
8942 {
8943 ComponentEnergyManager comp = GetCompEM();
8945 {
8947 }
8948 }
8950 {
8952
8953 }
8954
8955 }
8956 }
8957 }
8958
8961 {
8962 EntityAI parent = GetHierarchyParent();
8963
8964 if (parent)
8965 {
8966 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8967 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8968 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8969 }
8970 }
8971
8974 {
8975 EntityAI parent = GetHierarchyParent();
8976
8977 if (parent)
8978 {
8979 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8980 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8981 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
8982 }
8983 }
8984
8986 {
8987
8988
8989
8990
8992
8994 {
8995 if (ScriptInputUserData.CanStoreInputUserData())
8996 {
8997 ScriptInputUserData ctx = new ScriptInputUserData;
9003 ctx.
Write(use_stack_max);
9006
9008 {
9009 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9010 }
9011 }
9012 }
9013 else if (!
GetGame().IsMultiplayer())
9014 {
9016 }
9017 }
9018
9020 {
9022 }
9023
9025 {
9027 }
9028
9030 {
9032 }
9033
9035 {
9036
9037 return false;
9038 }
9039
9041 {
9042 return false;
9043 }
9044
9048 {
9049 return false;
9050 }
9051
9053 {
9054 return "";
9055 }
9056
9058
9060 {
9061 return false;
9062 }
9063
9065 {
9066 return true;
9067 }
9068
9069
9070
9072 {
9073 return true;
9074 }
9075
9077 {
9078 return true;
9079 }
9080
9082 {
9083 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9085 }
9086
9088 {
9090 }
9091
9093 {
9095 if (!is_being_placed)
9097 SetSynchDirty();
9098 }
9099
9100
9102
9104 {
9106 }
9107
9109 {
9111 }
9112
9114 {
9115 return 1;
9116 }
9117
9119 {
9120 return false;
9121 }
9122
9124 {
9126 SetSynchDirty();
9127 }
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9164 {
9165 super.OnMovedInsideCargo(container);
9166
9167 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9168 }
9169
9170 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9171 {
9172 super.EEItemLocationChanged(oldLoc,newLoc);
9173
9174 PlayerBase new_player = null;
9175 PlayerBase old_player = null;
9176
9177 if (newLoc.GetParent())
9178 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9179
9180 if (oldLoc.GetParent())
9181 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9182
9184 {
9185 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9186
9187 if (r_index >= 0)
9188 {
9189 InventoryLocation r_il = new InventoryLocation;
9190 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9191
9192 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9195 {
9196 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9197 }
9199 {
9200 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9201 }
9202
9203 }
9204 }
9205
9207 {
9208 if (new_player)
9209 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9210
9211 if (new_player == old_player)
9212 {
9213
9214 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9215 {
9217 {
9218 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9219 {
9220 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9221 }
9222 }
9223 else
9224 {
9225 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9226 }
9227 }
9228
9229 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9230 {
9231 int type = oldLoc.GetType();
9233 {
9234 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9235 }
9237 {
9238 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9239 }
9240 }
9241 if (!m_OldLocation)
9242 {
9243 m_OldLocation = new InventoryLocation;
9244 }
9245 m_OldLocation.Copy(oldLoc);
9246 }
9247 else
9248 {
9249 if (m_OldLocation)
9250 {
9251 m_OldLocation.Reset();
9252 }
9253 }
9254
9256 }
9257 else
9258 {
9259 if (new_player)
9260 {
9261 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9262 if (res_index >= 0)
9263 {
9264 InventoryLocation il = new InventoryLocation;
9265 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9267 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9270 {
9271 il.
GetParent().GetOnReleaseLock().Invoke(it);
9272 }
9274 {
9276 }
9277
9278 }
9279 }
9281 {
9282
9284 }
9285
9286 if (m_OldLocation)
9287 {
9288 m_OldLocation.Reset();
9289 }
9290 }
9291 }
9292
9293 override void EOnContact(IEntity other, Contact extra)
9294 {
9296 {
9297 int liquidType = -1;
9299 if (impactSpeed > 0.0)
9300 {
9302 #ifndef SERVER
9304 #else
9306 SetSynchDirty();
9307 #endif
9309 }
9310 }
9311
9312 #ifdef SERVER
9313 if (GetCompEM() && GetCompEM().IsPlugged())
9314 {
9315 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9316 GetCompEM().UnplugThis();
9317 }
9318 #endif
9319 }
9320
9322
9324 {
9326 }
9327
9329 {
9330
9331 }
9332
9334 {
9335 super.OnItemLocationChanged(old_owner, new_owner);
9336
9337 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9338 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9339
9340 if (!relatedPlayer && playerNew)
9341 relatedPlayer = playerNew;
9342
9343 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9344 {
9346 if (actionMgr)
9347 {
9348 ActionBase currentAction = actionMgr.GetRunningAction();
9349 if (currentAction)
9351 }
9352 }
9353
9354 Man ownerPlayerOld = null;
9355 Man ownerPlayerNew = null;
9356
9357 if (old_owner)
9358 {
9359 if (old_owner.
IsMan())
9360 {
9361 ownerPlayerOld = Man.Cast(old_owner);
9362 }
9363 else
9364 {
9365 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9366 }
9367 }
9368 else
9369 {
9371 {
9373
9374 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9375 {
9376 GetCompEM().UnplugThis();
9377 }
9378 }
9379 }
9380
9381 if (new_owner)
9382 {
9383 if (new_owner.
IsMan())
9384 {
9385 ownerPlayerNew = Man.Cast(new_owner);
9386 }
9387 else
9388 {
9389 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9390 }
9391 }
9392
9393 if (ownerPlayerOld != ownerPlayerNew)
9394 {
9395 if (ownerPlayerOld)
9396 {
9397 array<EntityAI> subItemsExit = new array<EntityAI>;
9399 for (int i = 0; i < subItemsExit.Count(); i++)
9400 {
9403 }
9404 }
9405
9406 if (ownerPlayerNew)
9407 {
9408 array<EntityAI> subItemsEnter = new array<EntityAI>;
9410 for (int j = 0; j < subItemsEnter.Count(); j++)
9411 {
9414 }
9415 }
9416 }
9417 else if (ownerPlayerNew != null)
9418 {
9419 PlayerBase nplayer;
9420 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9421 {
9422 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9424 for (int k = 0; k < subItemsUpdate.Count(); k++)
9425 {
9427 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9428 }
9429 }
9430 }
9431
9432 if (old_owner)
9433 old_owner.OnChildItemRemoved(this);
9434 if (new_owner)
9435 new_owner.OnChildItemReceived(this);
9436 }
9437
9438
9440 {
9441 super.EEDelete(parent);
9442 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9443 if (player)
9444 {
9446
9447 if (player.IsAlive())
9448 {
9449 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9450 if (r_index >= 0)
9451 {
9452 InventoryLocation r_il = new InventoryLocation;
9453 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9454
9455 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9458 {
9459 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9460 }
9462 {
9463 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9464 }
9465
9466 }
9467
9468 player.RemoveQuickBarEntityShortcut(this);
9469 }
9470 }
9471 }
9472
9474 {
9475 super.EEKilled(killer);
9476
9479 {
9480 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9481 {
9482 if (IsMagazine())
9483 {
9484 if (Magazine.Cast(this).GetAmmoCount() > 0)
9485 {
9487 }
9488 }
9489 else
9490 {
9492 }
9493 }
9494 }
9495 }
9496
9498 {
9499 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9500
9501 super.OnWasAttached(parent, slot_id);
9502
9505
9507 }
9508
9510 {
9511 super.OnWasDetached(parent, slot_id);
9512
9515 }
9516
9518 {
9519 int idx;
9522
9523 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9524 if (inventory_slots.Count() < 1)
9525 {
9526 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9527 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9528 }
9529 else
9530 {
9531 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9532 }
9533
9534 idx = inventory_slots.Find(slot);
9535 if (idx < 0)
9536 return "";
9537
9538 return attach_types.Get(idx);
9539 }
9540
9542 {
9543 int idx = -1;
9544 string slot;
9545
9548
9549 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9550 if (inventory_slots.Count() < 1)
9551 {
9552 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9553 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9554 }
9555 else
9556 {
9557 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9558 if (detach_types.Count() < 1)
9559 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9560 }
9561
9562 for (int i = 0; i < inventory_slots.Count(); i++)
9563 {
9564 slot = inventory_slots.Get(i);
9565 }
9566
9567 if (slot != "")
9568 {
9569 if (detach_types.Count() == 1)
9570 idx = 0;
9571 else
9572 idx = inventory_slots.Find(slot);
9573 }
9574 if (idx < 0)
9575 return "";
9576
9577 return detach_types.Get(idx);
9578 }
9579
9581 {
9582
9584
9585
9586 float min_time = 1;
9587 float max_time = 3;
9588 float delay = Math.RandomFloat(min_time, max_time);
9589
9590 explode_timer.Run(delay, this, "DoAmmoExplosion");
9591 }
9592
9594 {
9595 Magazine magazine = Magazine.Cast(this);
9596 int pop_sounds_count = 6;
9597 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9598
9599
9600 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9601 string sound_name = pop_sounds[ sound_idx ];
9603
9604
9605 magazine.ServerAddAmmoCount(-1);
9606
9607
9608 float min_temp_to_explode = 100;
9609
9610 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode)
9611 {
9613 }
9614 }
9615
9616
9617 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9618 {
9619 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9620
9621 const int CHANCE_DAMAGE_CARGO = 4;
9622 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9623 const int CHANCE_DAMAGE_NOTHING = 2;
9624
9626 {
9627 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9628 int chances;
9629 int rnd;
9630
9631 if (GetInventory().GetCargo())
9632 {
9633 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9634 rnd = Math.RandomInt(0,chances);
9635
9636 if (rnd < CHANCE_DAMAGE_CARGO)
9637 {
9639 }
9640 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9641 {
9643 }
9644 }
9645 else
9646 {
9647 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9648 rnd = Math.RandomInt(0,chances);
9649
9650 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9651 {
9653 }
9654 }
9655 }
9656 }
9657
9659 {
9660 if (GetInventory().GetCargo())
9661 {
9662 int item_count = GetInventory().GetCargo().GetItemCount();
9663 if (item_count > 0)
9664 {
9665 int random_pick = Math.RandomInt(0, item_count);
9667 if (!item.IsExplosive())
9668 {
9669 item.AddHealth("","",damage);
9670 return true;
9671 }
9672 }
9673 }
9674 return false;
9675 }
9676
9678 {
9679 int attachment_count = GetInventory().AttachmentCount();
9680 if (attachment_count > 0)
9681 {
9682 int random_pick = Math.RandomInt(0, attachment_count);
9683 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9684 if (!attachment.IsExplosive())
9685 {
9686 attachment.AddHealth("","",damage);
9687 return true;
9688 }
9689 }
9690 return false;
9691 }
9692
9694 {
9696 }
9697
9699 {
9701 return GetInventory().CanRemoveEntity();
9702
9703 return false;
9704 }
9705
9707 {
9709 return;
9710
9712 {
9713 if (ScriptInputUserData.CanStoreInputUserData())
9714 {
9715 ScriptInputUserData ctx = new ScriptInputUserData;
9720 ctx.
Write(destination_entity);
9724 }
9725 }
9726 else if (!
GetGame().IsMultiplayer())
9727 {
9729 }
9730 }
9731
9733 {
9735 return;
9736
9737 float split_quantity_new;
9741 InventoryLocation loc = new InventoryLocation;
9742
9743 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9744 {
9746 split_quantity_new = stack_max;
9747 else
9749
9750 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9751 if (new_item)
9752 {
9753 new_item.SetResultOfSplit(true);
9754 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9756 new_item.SetQuantity(split_quantity_new);
9757 }
9758 }
9759 else if (destination_entity && slot_id == -1)
9760 {
9761 if (quantity > stack_max)
9762 split_quantity_new = stack_max;
9763 else
9764 split_quantity_new = quantity;
9765
9767 {
9770 }
9771
9772 if (new_item)
9773 {
9774 new_item.SetResultOfSplit(true);
9775 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9777 new_item.SetQuantity(split_quantity_new);
9778 }
9779 }
9780 else
9781 {
9782 if (stack_max != 0)
9783 {
9785 {
9787 }
9788
9789 if (split_quantity_new == 0)
9790 {
9791 if (!
GetGame().IsMultiplayer())
9792 player.PhysicalPredictiveDropItem(this);
9793 else
9794 player.ServerDropEntity(this);
9795 return;
9796 }
9797
9799
9800 if (new_item)
9801 {
9802 new_item.SetResultOfSplit(true);
9803 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9805 new_item.SetQuantity(stack_max);
9806 new_item.PlaceOnSurface();
9807 }
9808 }
9809 }
9810 }
9811
9813 {
9815 return;
9816
9817 float split_quantity_new;
9821 InventoryLocation loc = new InventoryLocation;
9822
9823 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9824 {
9826 split_quantity_new = stack_max;
9827 else
9829
9830 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9831 if (new_item)
9832 {
9833 new_item.SetResultOfSplit(true);
9834 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9836 new_item.SetQuantity(split_quantity_new);
9837 }
9838 }
9839 else if (destination_entity && slot_id == -1)
9840 {
9841 if (quantity > stack_max)
9842 split_quantity_new = stack_max;
9843 else
9844 split_quantity_new = quantity;
9845
9847 {
9850 }
9851
9852 if (new_item)
9853 {
9854 new_item.SetResultOfSplit(true);
9855 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9857 new_item.SetQuantity(split_quantity_new);
9858 }
9859 }
9860 else
9861 {
9862 if (stack_max != 0)
9863 {
9865 {
9867 }
9868
9870
9871 if (new_item)
9872 {
9873 new_item.SetResultOfSplit(true);
9874 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9876 new_item.SetQuantity(stack_max);
9877 new_item.PlaceOnSurface();
9878 }
9879 }
9880 }
9881 }
9882
9884 {
9886 return;
9887
9889 {
9890 if (ScriptInputUserData.CanStoreInputUserData())
9891 {
9892 ScriptInputUserData ctx = new ScriptInputUserData;
9897 dst.WriteToContext(ctx);
9899 }
9900 }
9901 else if (!
GetGame().IsMultiplayer())
9902 {
9904 }
9905 }
9906
9908 {
9910 return;
9911
9913 {
9914 if (ScriptInputUserData.CanStoreInputUserData())
9915 {
9916 ScriptInputUserData ctx = new ScriptInputUserData;
9921 ctx.
Write(destination_entity);
9927 }
9928 }
9929 else if (!
GetGame().IsMultiplayer())
9930 {
9932 }
9933 }
9934
9936 {
9938 }
9939
9941 {
9943 return this;
9944
9946 float split_quantity_new;
9948 if (dst.IsValid())
9949 {
9950 int slot_id = dst.GetSlot();
9952
9953 if (quantity > stack_max)
9954 split_quantity_new = stack_max;
9955 else
9956 split_quantity_new = quantity;
9957
9959
9960 if (new_item)
9961 {
9962 new_item.SetResultOfSplit(true);
9963 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9966 }
9967
9968 return new_item;
9969 }
9970
9971 return null;
9972 }
9973
9975 {
9977 return;
9978
9980 float split_quantity_new;
9982 if (destination_entity)
9983 {
9985 if (quantity > stackable)
9986 split_quantity_new = stackable;
9987 else
9988 split_quantity_new = quantity;
9989
9990 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
9991 if (new_item)
9992 {
9993 new_item.SetResultOfSplit(true);
9994 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9996 new_item.SetQuantity(split_quantity_new);
9997 }
9998 }
9999 }
10000
10002 {
10004 return;
10005
10007 {
10008 if (ScriptInputUserData.CanStoreInputUserData())
10009 {
10010 ScriptInputUserData ctx = new ScriptInputUserData;
10015 ItemBase destination_entity =
this;
10016 ctx.
Write(destination_entity);
10020 }
10021 }
10022 else if (!
GetGame().IsMultiplayer())
10023 {
10025 }
10026 }
10027
10029 {
10031 return;
10032
10034 float split_quantity_new;
10036 if (player)
10037 {
10039 if (quantity > stackable)
10040 split_quantity_new = stackable;
10041 else
10042 split_quantity_new = quantity;
10043
10044 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10045 new_item =
ItemBase.Cast(in_hands);
10046 if (new_item)
10047 {
10048 new_item.SetResultOfSplit(true);
10049 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10051 new_item.SetQuantity(split_quantity_new);
10052 }
10053 }
10054 }
10055
10057 {
10059 return;
10060
10062 float split_quantity_new = Math.Floor(quantity * 0.5);
10063
10065
10066 if (new_item)
10067 {
10068 if (new_item.GetQuantityMax() < split_quantity_new)
10069 {
10070 split_quantity_new = new_item.GetQuantityMax();
10071 }
10072
10073 new_item.SetResultOfSplit(true);
10074 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10075
10077 {
10080 }
10081 else
10082 {
10085 }
10086 }
10087 }
10088
10090 {
10092 return;
10093
10095 float split_quantity_new = Math.Floor(quantity / 2);
10096
10097 InventoryLocation invloc = new InventoryLocation;
10099
10101 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10102
10103 if (new_item)
10104 {
10105 if (new_item.GetQuantityMax() < split_quantity_new)
10106 {
10107 split_quantity_new = new_item.GetQuantityMax();
10108 }
10110 {
10113 }
10114 else
10115 {
10118 }
10119 }
10120 }
10121
10124 {
10125 SetWeightDirty();
10127
10128 if (parent)
10129 parent.OnAttachmentQuantityChangedEx(this, delta);
10130
10132 {
10134 {
10136 }
10138 {
10139 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10141 }
10142 }
10143
10144 }
10145
10148 {
10149
10150 }
10151
10154 {
10156 }
10157
10159 {
10160 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10161
10163 {
10164 if (newLevel == GameConstants.STATE_RUINED)
10165 {
10167 EntityAI parent = GetHierarchyParent();
10168 if (parent && parent.IsFireplace())
10169 {
10170 CargoBase cargo = GetInventory().GetCargo();
10171 if (cargo)
10172 {
10174 {
10176 }
10177 }
10178 }
10179 }
10180
10182 {
10183
10185 return;
10186 }
10187
10188 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10189 {
10191 }
10192 }
10193 }
10194
10195
10197 {
10198 super.OnRightClick();
10199
10201 {
10203 {
10204 if (ScriptInputUserData.CanStoreInputUserData())
10205 {
10206 vector m4[4];
10208
10209 EntityAI root = GetHierarchyRoot();
10210
10211 InventoryLocation dst = new InventoryLocation;
10213 {
10214 if (root)
10215 {
10216 root.GetTransform(m4);
10218 }
10219 else
10220 GetInventory().GetCurrentInventoryLocation(dst);
10221 }
10222 else
10223 {
10225
10226
10227 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10228 {
10229 if (root)
10230 {
10231 root.GetTransform(m4);
10233 }
10234 else
10235 GetInventory().GetCurrentInventoryLocation(dst);
10236 }
10237 else
10238 {
10239 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10240 }
10241 }
10242
10243 ScriptInputUserData ctx = new ScriptInputUserData;
10251 }
10252 }
10253 else if (!
GetGame().IsMultiplayer())
10254 {
10256 }
10257 }
10258 }
10259
10260 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10261 {
10262
10263 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10264 return false;
10265
10266 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10267 return false;
10268
10269
10271 return false;
10272
10273
10274 Magazine mag = Magazine.Cast(this);
10275 if (mag)
10276 {
10277 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10278 return false;
10279
10280 if (stack_max_limit)
10281 {
10282 Magazine other_mag = Magazine.Cast(other_item);
10283 if (other_item)
10284 {
10285 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10286 return false;
10287 }
10288
10289 }
10290 }
10291 else
10292 {
10293
10295 return false;
10296
10298 return false;
10299 }
10300
10301 PlayerBase player = null;
10302 if (CastTo(player, GetHierarchyRootPlayer()))
10303 {
10304 if (player.GetInventory().HasAttachment(this))
10305 return false;
10306
10307 if (player.IsItemsToDelete())
10308 return false;
10309 }
10310
10311 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10312 return false;
10313
10314 int slotID;
10316 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10317 return false;
10318
10319 return true;
10320 }
10321
10323 {
10325 }
10326
10328 {
10329 return m_IsResultOfSplit;
10330 }
10331
10333 {
10334 m_IsResultOfSplit = value;
10335 }
10336
10338 {
10340 }
10341
10343 {
10344 float other_item_quantity = other_item.GetQuantity();
10345 float this_free_space;
10346
10348
10350
10351 if (other_item_quantity > this_free_space)
10352 {
10353 return this_free_space;
10354 }
10355 else
10356 {
10357 return other_item_quantity;
10358 }
10359 }
10360
10362 {
10364 }
10365
10367 {
10369 return;
10370
10371 if (!IsMagazine() && other_item)
10372 {
10374 if (quantity_used != 0)
10375 {
10376 float hp1 = GetHealth01("","");
10377 float hp2 = other_item.GetHealth01("","");
10378 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10379 hpResult = hpResult / (
GetQuantity() + quantity_used);
10380
10381 hpResult *= GetMaxHealth();
10382 Math.Round(hpResult);
10383 SetHealth("", "Health", hpResult);
10384
10386 other_item.AddQuantity(-quantity_used);
10387 }
10388 }
10390 }
10391
10393 {
10394 #ifdef SERVER
10395 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10396 GetHierarchyParent().IncreaseLifetimeUp();
10397 #endif
10398 };
10399
10401 {
10402 PlayerBase p = PlayerBase.Cast(player);
10403
10404 array<int> recipesIds = p.m_Recipes;
10405 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10406 if (moduleRecipesManager)
10407 {
10408 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10409 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10410 }
10411
10412 for (int i = 0;i < recipesIds.Count(); i++)
10413 {
10414 int key = recipesIds.Get(i);
10415 string recipeName = moduleRecipesManager.GetRecipeName(key);
10417 }
10418 }
10419
10420
10421 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10422 {
10423 super.GetDebugActions(outputList);
10424
10425
10430
10431
10435
10439
10440
10443
10444
10446 {
10449 }
10450
10452
10455
10459 }
10460
10461
10462
10463
10465 {
10466 super.OnAction(action_id, player, ctx);
10467 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10468 {
10469 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10470 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10471 PlayerBase p = PlayerBase.Cast(player);
10472 if (
EActions.RECIPES_RANGE_START < 1000)
10473 {
10474 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10475 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10476 }
10477 }
10478 #ifndef SERVER
10479 else if (action_id ==
EActions.WATCH_PLAYER)
10480 {
10481 PluginDeveloper.SetDeveloperItemClientEx(player);
10482 }
10483 #endif
10485 {
10486 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10487 {
10488 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10489 OnDebugButtonPressServer(id + 1);
10490 }
10491
10492 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10493 {
10494 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10496 }
10497
10498 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10499 {
10500 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10502 }
10503
10504 else if (action_id ==
EActions.ADD_QUANTITY)
10505 {
10506 if (IsMagazine())
10507 {
10508 Magazine mag = Magazine.Cast(this);
10509 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10510 }
10511 else
10512 {
10514 }
10515
10516 if (m_EM)
10517 {
10518 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10519 }
10520
10521 }
10522
10523 else if (action_id ==
EActions.REMOVE_QUANTITY)
10524 {
10525 if (IsMagazine())
10526 {
10527 Magazine mag2 = Magazine.Cast(this);
10528 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10529 }
10530 else
10531 {
10533 }
10534 if (m_EM)
10535 {
10536 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10537 }
10538
10539 }
10540
10541 else if (action_id ==
EActions.SET_QUANTITY_0)
10542 {
10544
10545 if (m_EM)
10546 {
10547 m_EM.SetEnergy(0);
10548 }
10549 }
10550
10551 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10552 {
10554
10555 if (m_EM)
10556 {
10557 m_EM.SetEnergy(m_EM.GetEnergyMax());
10558 }
10559 }
10560
10561 else if (action_id ==
EActions.ADD_HEALTH)
10562 {
10563 AddHealth("","",GetMaxHealth("","Health")/5);
10564 }
10565 else if (action_id ==
EActions.REMOVE_HEALTH)
10566 {
10567 AddHealth("","",-GetMaxHealth("","Health")/5);
10568 }
10569 else if (action_id ==
EActions.DESTROY_HEALTH)
10570 {
10571 SetHealth01("","",0);
10572 }
10573 else if (action_id ==
EActions.WATCH_ITEM)
10574 {
10576 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10577 #ifdef DEVELOPER
10578 SetDebugDeveloper_item(this);
10579 #endif
10580 }
10581
10582 else if (action_id ==
EActions.ADD_TEMPERATURE)
10583 {
10584 AddTemperature(20);
10585
10586 }
10587
10588 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10589 {
10590 AddTemperature(-20);
10591
10592 }
10593
10594 else if (action_id ==
EActions.FLIP_FROZEN)
10595 {
10596 SetFrozen(!GetIsFrozen());
10597
10598 }
10599
10600 else if (action_id ==
EActions.ADD_WETNESS)
10601 {
10603
10604 }
10605
10606 else if (action_id ==
EActions.REMOVE_WETNESS)
10607 {
10609
10610 }
10611
10612 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10613 {
10616
10617
10618 }
10619
10620 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10621 {
10624 }
10625
10626 else if (action_id ==
EActions.MAKE_SPECIAL)
10627 {
10628 auto debugParams = DebugSpawnParams.WithPlayer(player);
10629 OnDebugSpawnEx(debugParams);
10630 }
10631
10632 else if (action_id ==
EActions.DELETE)
10633 {
10634 Delete();
10635 }
10636
10637 }
10638
10639
10640 return false;
10641 }
10642
10643
10644
10645
10649
10652
10653
10654
10656 {
10657 return false;
10658 }
10659
10660
10662 {
10663 return true;
10664 }
10665
10666
10668 {
10669 return true;
10670 }
10671
10672
10673
10675 {
10676 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10678 }
10679
10682 {
10683 return null;
10684 }
10685
10687 {
10688 return false;
10689 }
10690
10692 {
10693 return false;
10694 }
10695
10699
10700
10702 {
10703 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10704 return module_repairing.CanRepair(this, item_repair_kit);
10705 }
10706
10707
10708 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10709 {
10710 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10711 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10712 }
10713
10714
10716 {
10717
10718
10719
10720
10721
10722
10723
10724
10725 return 1;
10726 }
10727
10728
10729
10731 {
10733 }
10734
10735
10736
10738 {
10740 }
10741
10742
10751 {
10752 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10753
10754 if (player)
10755 {
10756 player.MessageStatus(text);
10757 }
10758 }
10759
10760
10769 {
10770 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10771
10772 if (player)
10773 {
10774 player.MessageAction(text);
10775 }
10776 }
10777
10778
10787 {
10788 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10789
10790 if (player)
10791 {
10792 player.MessageFriendly(text);
10793 }
10794 }
10795
10796
10805 {
10806 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10807
10808 if (player)
10809 {
10810 player.MessageImportant(text);
10811 }
10812 }
10813
10815 {
10816 return true;
10817 }
10818
10819
10820 override bool KindOf(
string tag)
10821 {
10822 bool found = false;
10823 string item_name = this.
GetType();
10826
10827 int array_size = item_tag_array.Count();
10828 for (int i = 0; i < array_size; i++)
10829 {
10830 if (item_tag_array.Get(i) == tag)
10831 {
10832 found = true;
10833 break;
10834 }
10835 }
10836 return found;
10837 }
10838
10839
10841 {
10842
10843 super.OnRPC(sender, rpc_type,ctx);
10844
10845
10846 switch (rpc_type)
10847 {
10848 #ifndef SERVER
10849 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10850 Param2<bool, string> p = new Param2<bool, string>(false, "");
10851
10853 return;
10854
10855 bool play = p.param1;
10856 string soundSet = p.param2;
10857
10858 if (play)
10859 {
10861 {
10863 {
10865 }
10866 }
10867 else
10868 {
10870 }
10871 }
10872 else
10873 {
10875 }
10876
10877 break;
10878 #endif
10879
10880 }
10881
10883 {
10885 }
10886 }
10887
10888
10889
10890
10892 {
10893 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10894 return plugin.GetID(
name);
10895 }
10896
10898 {
10899 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10900 return plugin.GetName(id);
10901 }
10902
10905 {
10906
10907
10908 int varFlags;
10909 if (!ctx.
Read(varFlags))
10910 return;
10911
10912 if (varFlags & ItemVariableFlags.FLOAT)
10913 {
10915 }
10916 }
10917
10919 {
10920
10921 super.SerializeNumericalVars(floats_out);
10922
10923
10924
10926 {
10928 }
10929
10931 {
10933 }
10934
10936 {
10938 }
10939
10941 {
10946 }
10947
10949 {
10951 }
10952 }
10953
10955 {
10956
10957 super.DeSerializeNumericalVars(floats);
10958
10959
10960 int index = 0;
10961 int mask = Math.Round(floats.Get(index));
10962
10963 index++;
10964
10966 {
10968 {
10970 }
10971 else
10972 {
10973 float quantity = floats.Get(index);
10974 SetQuantity(quantity,
true,
false,
false,
false);
10975 }
10976 index++;
10977 }
10978
10980 {
10981 float wet = floats.Get(index);
10983 index++;
10984 }
10985
10987 {
10988 int liquidtype = Math.Round(floats.Get(index));
10990 index++;
10991 }
10992
10994 {
10996 index++;
10998 index++;
11000 index++;
11002 index++;
11003 }
11004
11006 {
11007 int cleanness = Math.Round(floats.Get(index));
11009 index++;
11010 }
11011 }
11012
11014 {
11015 super.WriteVarsToCTX(ctx);
11016
11017
11019 {
11021 }
11022
11024 {
11026 }
11027
11029 {
11031 }
11032
11034 {
11035 int r,g,b,a;
11041 }
11042
11044 {
11046 }
11047 }
11048
11050 {
11051 if (!super.ReadVarsFromCTX(ctx,version))
11052 return false;
11053
11054 int intValue;
11055 float value;
11056
11057 if (version < 140)
11058 {
11059 if (!ctx.
Read(intValue))
11060 return false;
11061
11062 m_VariablesMask = intValue;
11063 }
11064
11066 {
11067 if (!ctx.
Read(value))
11068 return false;
11069
11071 {
11073 }
11074 else
11075 {
11077 }
11078 }
11079
11080 if (version < 140)
11081 {
11083 {
11084 if (!ctx.
Read(value))
11085 return false;
11086 SetTemperatureDirect(value);
11087 }
11088 }
11089
11091 {
11092 if (!ctx.
Read(value))
11093 return false;
11095 }
11096
11098 {
11099 if (!ctx.
Read(intValue))
11100 return false;
11102 }
11103
11105 {
11106 int r,g,b,a;
11108 return false;
11110 return false;
11112 return false;
11114 return false;
11115
11117 }
11118
11120 {
11121 if (!ctx.
Read(intValue))
11122 return false;
11124 }
11125
11126 if (version >= 138 && version < 140)
11127 {
11129 {
11130 if (!ctx.
Read(intValue))
11131 return false;
11132 SetFrozen(intValue);
11133 }
11134 }
11135
11136 return true;
11137 }
11138
11139
11141 {
11144 {
11146 }
11147
11148 if (!super.OnStoreLoad(ctx, version))
11149 {
11151 return false;
11152 }
11153
11154 if (version >= 114)
11155 {
11156 bool hasQuickBarIndexSaved;
11157
11158 if (!ctx.
Read(hasQuickBarIndexSaved))
11159 {
11161 return false;
11162 }
11163
11164 if (hasQuickBarIndexSaved)
11165 {
11166 int itmQBIndex;
11167
11168
11169 if (!ctx.
Read(itmQBIndex))
11170 {
11172 return false;
11173 }
11174
11175 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11176 if (itmQBIndex != -1 && parentPlayer)
11177 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11178 }
11179 }
11180 else
11181 {
11182
11183 PlayerBase player;
11184 int itemQBIndex;
11185 if (version ==
int.
MAX)
11186 {
11187 if (!ctx.
Read(itemQBIndex))
11188 {
11190 return false;
11191 }
11192 }
11193 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11194 {
11195
11196 if (!ctx.
Read(itemQBIndex))
11197 {
11199 return false;
11200 }
11201 if (itemQBIndex != -1 && player)
11202 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11203 }
11204 }
11205
11206 if (version < 140)
11207 {
11208
11209 if (!LoadVariables(ctx, version))
11210 {
11212 return false;
11213 }
11214 }
11215
11216
11218 {
11220 return false;
11221 }
11222 if (version >= 132)
11223 {
11225 if (raib)
11226 {
11228 {
11230 return false;
11231 }
11232 }
11233 }
11234
11236 return true;
11237 }
11238
11239
11240
11242 {
11243 super.OnStoreSave(ctx);
11244
11245 PlayerBase player;
11246 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11247 {
11249
11250 int itemQBIndex = -1;
11251 itemQBIndex = player.FindQuickBarEntityIndex(this);
11252 ctx.
Write(itemQBIndex);
11253 }
11254 else
11255 {
11257 }
11258
11260
11262 if (raib)
11263 {
11265 }
11266 }
11267
11268
11270 {
11271 super.AfterStoreLoad();
11272
11274 {
11276 }
11277
11279 {
11282 }
11283 }
11284
11286 {
11287 super.EEOnAfterLoad();
11288
11290 {
11292 }
11293
11296 }
11297
11299 {
11300 return false;
11301 }
11302
11303
11304
11306 {
11308 {
11309 #ifdef PLATFORM_CONSOLE
11310
11312 {
11314 if (menu)
11315 {
11317 }
11318 }
11319 #endif
11320 }
11321
11323 {
11326 }
11327
11329 {
11330 SetWeightDirty();
11332 }
11334 {
11337 }
11338
11340 {
11343 }
11345 {
11348 }
11349
11350 super.OnVariablesSynchronized();
11351 }
11352
11353
11354
11356 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11357 {
11358 if (!IsServerCheck(allow_client))
11359 return false;
11360
11362 return false;
11363
11366
11367 if (value <= (min + 0.001))
11368 value = min;
11369
11370 if (value == min)
11371 {
11372 if (destroy_config)
11373 {
11374 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11375 if (dstr)
11376 {
11378 this.Delete();
11379 return true;
11380 }
11381 }
11382 else if (destroy_forced)
11383 {
11385 this.Delete();
11386 return true;
11387 }
11388
11390 }
11391
11394
11396 {
11398
11399 if (delta)
11401 }
11402
11404
11405 return false;
11406 }
11407
11408
11410 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11411 {
11413 }
11414
11416 {
11419 }
11420
11422 {
11425 }
11426
11429 {
11430 float value_clamped = Math.Clamp(value, 0, 1);
11432 SetQuantity(result, destroy_config, destroy_forced);
11433 }
11434
11435
11438 {
11440 }
11441
11443 {
11445 }
11446
11447
11448
11449
11450
11451
11452
11453
11454
11455
11457 {
11458 int slot = -1;
11459 if (GetInventory())
11460 {
11461 InventoryLocation il = new InventoryLocation;
11462 GetInventory().GetCurrentInventoryLocation(il);
11464 }
11465
11467 }
11468
11470 {
11471 float quantity_max = 0;
11472
11474 {
11475 if (attSlotID != -1)
11476 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11477
11478 if (quantity_max <= 0)
11480 }
11481
11482 if (quantity_max <= 0)
11484
11485 return quantity_max;
11486 }
11487
11489 {
11491 }
11492
11494 {
11496 }
11497
11498
11500 {
11502 }
11503
11505 {
11507 }
11508
11510 {
11512 }
11513
11514
11516 {
11517
11518 float weightEx = GetWeightEx();
11519 float special = GetInventoryAndCargoWeight();
11520 return weightEx - special;
11521 }
11522
11523
11525 {
11527 }
11528
11530 {
11532 {
11533 #ifdef DEVELOPER
11534 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11535 {
11536 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11538 }
11539 #endif
11540
11541 return GetQuantity() * GetConfigWeightModified();
11542 }
11543 else if (HasEnergyManager())
11544 {
11545 #ifdef DEVELOPER
11546 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11547 {
11548 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11549 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11550 }
11551 #endif
11552 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified());
11553 }
11554 else
11555 {
11556 #ifdef DEVELOPER
11557 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11558 {
11559 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11560 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11561 }
11562 #endif
11563 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified());
11564 }
11565 }
11566
11569 {
11570 int item_count = 0;
11572
11573 if (GetInventory().GetCargo() != NULL)
11574 {
11575 item_count = GetInventory().GetCargo().GetItemCount();
11576 }
11577
11578 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11579 {
11580 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11581 if (item)
11582 item_count += item.GetNumberOfItems();
11583 }
11584 return item_count;
11585 }
11586
11589 {
11590 float weight = 0;
11591 float wetness = 1;
11592 if (include_wetness)
11595 {
11596 weight = wetness * m_ConfigWeight;
11597 }
11599 {
11600 weight = 1;
11601 }
11602 return weight;
11603 }
11604
11605
11606
11608 {
11609 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11610 {
11611 GameInventory inv = GetInventory();
11612 array<EntityAI> items = new array<EntityAI>;
11614 for (int i = 0; i < items.Count(); i++)
11615 {
11617 if (item)
11618 {
11620 }
11621 }
11622 }
11623 }
11624
11625
11626
11627
11629 {
11630 float energy = 0;
11631 if (HasEnergyManager())
11632 {
11633 energy = GetCompEM().GetEnergy();
11634 }
11635 return energy;
11636 }
11637
11638
11640 {
11641 super.OnEnergyConsumed();
11642
11644 }
11645
11647 {
11648 super.OnEnergyAdded();
11649
11651 }
11652
11653
11655 {
11656 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11657 {
11659 {
11660 float energy_0to1 = GetCompEM().GetEnergy0To1();
11662 }
11663 }
11664 }
11665
11666
11668 {
11669 return ConfigGetFloat("heatIsolation");
11670 }
11671
11673 {
11675 }
11676
11678 {
11679 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11680 if (
GetGame().ConfigIsExisting(paramPath))
11682
11683 return 0.0;
11684 }
11685
11687 {
11688 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11689 if (
GetGame().ConfigIsExisting(paramPath))
11691
11692 return 0.0;
11693 }
11694
11695 override void SetWet(
float value,
bool allow_client =
false)
11696 {
11697 if (!IsServerCheck(allow_client))
11698 return;
11699
11702
11704
11705 m_VarWet = Math.Clamp(value, min, max);
11706
11708 {
11711 }
11712 }
11713
11714 override void AddWet(
float value)
11715 {
11717 }
11718
11720 {
11722 }
11723
11725 {
11727 }
11728
11730 {
11732 }
11733
11735 {
11737 }
11738
11740 {
11742 }
11743
11744 override void OnWetChanged(
float newVal,
float oldVal)
11745 {
11748 if (newLevel != oldLevel)
11749 {
11751 }
11752 }
11753
11755 {
11756 SetWeightDirty();
11757 }
11758
11760 {
11761 return GetWetLevelInternal(
m_VarWet);
11762 }
11763
11764
11765
11767 {
11769 }
11770
11772 {
11774 }
11775
11777 {
11779 }
11780
11782 {
11784 }
11785
11786
11787
11789 {
11790 if (ConfigIsExisting("itemModelLength"))
11791 {
11792 return ConfigGetFloat("itemModelLength");
11793 }
11794 return 0;
11795 }
11796
11798 {
11799 if (ConfigIsExisting("itemAttachOffset"))
11800 {
11801 return ConfigGetFloat("itemAttachOffset");
11802 }
11803 return 0;
11804 }
11805
11806 override void SetCleanness(
int value,
bool allow_client =
false)
11807 {
11808 if (!IsServerCheck(allow_client))
11809 return;
11810
11812
11814
11817 }
11818
11820 {
11822 }
11823
11825 {
11826 return true;
11827 }
11828
11829
11830
11831
11833 {
11835 }
11836
11838 {
11840 }
11841
11842
11843
11844
11845 override void SetColor(
int r,
int g,
int b,
int a)
11846 {
11852 }
11854 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11855 {
11860 }
11861
11863 {
11865 }
11866
11869 {
11870 int r,g,b,a;
11872 r = r/255;
11873 g = g/255;
11874 b = b/255;
11875 a = a/255;
11876 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11877 }
11878
11879
11880
11881 override void SetLiquidType(
int value,
bool allow_client =
false)
11882 {
11883 if (!IsServerCheck(allow_client))
11884 return;
11885
11890 }
11891
11893 {
11894 return ConfigGetInt("varLiquidTypeInit");
11895 }
11896
11898 {
11900 }
11901
11903 {
11905 SetFrozen(false);
11906 }
11907
11910 {
11911 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11912 }
11913
11914
11917 {
11918 PlayerBase nplayer;
11919 if (PlayerBase.CastTo(nplayer, player))
11920 {
11922
11923 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11924 }
11925 }
11926
11927
11930 {
11931 PlayerBase nplayer;
11932 if (PlayerBase.CastTo(nplayer,player))
11933 {
11934
11935 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11936
11937 }
11938
11939
11940 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11941
11942
11943 if (HasEnergyManager())
11944 {
11945 GetCompEM().UpdatePlugState();
11946 }
11947 }
11948
11949
11951 {
11952 super.OnPlacementStarted(player);
11953
11955 }
11956
11957 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
11958 {
11960 {
11961 m_AdminLog.OnPlacementComplete(player,
this);
11962 }
11963
11964 super.OnPlacementComplete(player, position, orientation);
11965 }
11966
11967
11968
11969
11970
11972 {
11974 {
11975 return true;
11976 }
11977 else
11978 {
11979 return false;
11980 }
11981 }
11982
11983
11985 {
11987 {
11989 }
11990 }
11991
11992
11994 {
11996 }
11997
11999 {
12001 }
12002
12003 override void InsertAgent(
int agent,
float count = 1)
12004 {
12005 if (count < 1)
12006 return;
12007
12009 }
12010
12013 {
12015 }
12016
12017
12019 {
12021 }
12022
12023
12024
12025
12026
12027
12028
12029
12030
12031
12032
12033
12034
12035
12036
12037
12038
12039
12040
12041
12042
12043
12044
12045
12046
12047
12048
12049
12050
12051
12052
12053
12054
12055
12056
12057
12058
12059
12060
12061
12062
12063
12065 {
12067 return false;
12068 return true;
12069 }
12070
12072 {
12073
12075 }
12076
12077
12080 {
12081 super.CheckForRoofLimited(timeTresholdMS);
12082
12084 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12085 {
12086 m_PreviousRoofTestTime = time;
12087 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12088 }
12089 }
12090
12091
12093 {
12095 {
12096 return 0;
12097 }
12098
12099 if (GetInventory().GetAttachmentSlotsCount() != 0)
12100 {
12101 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12102 if (filter)
12103 return filter.GetProtectionLevel(type, false, system);
12104 else
12105 return 0;
12106 }
12107
12108 string subclassPath, entryName;
12109
12110 switch (type)
12111 {
12113 entryName = "biological";
12114 break;
12116 entryName = "chemical";
12117 break;
12118 default:
12119 entryName = "biological";
12120 break;
12121 }
12122
12123 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12124
12126 }
12127
12128
12129
12132 {
12133 if (!IsMagazine())
12135
12137 }
12138
12139
12140
12141
12142
12147 {
12148 return true;
12149 }
12150
12152 {
12154 }
12155
12156
12157
12158
12159
12161 {
12162 if (parent)
12163 {
12164 if (parent.IsInherited(DayZInfected))
12165 return true;
12166
12167 if (!parent.IsRuined())
12168 return true;
12169 }
12170
12171 return true;
12172 }
12173
12175 {
12176 if (!super.CanPutAsAttachment(parent))
12177 {
12178 return false;
12179 }
12180
12181 if (!IsRuined() && !parent.IsRuined())
12182 {
12183 return true;
12184 }
12185
12186 return false;
12187 }
12188
12190 {
12191
12192
12193
12194
12195 return super.CanReceiveItemIntoCargo(item);
12196 }
12197
12199 {
12200
12201
12202
12203
12204 GameInventory attachmentInv = attachment.GetInventory();
12206 {
12207 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12208 return false;
12209 }
12210
12211 InventoryLocation loc = new InventoryLocation();
12212 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12213 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12214 return false;
12215
12216 return super.CanReceiveAttachment(attachment, slotId);
12217 }
12218
12220 {
12221 if (!super.CanReleaseAttachment(attachment))
12222 return false;
12223
12224 return GetInventory().AreChildrenAccessible();
12225 }
12226
12227
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12248 {
12249 int id = muzzle_owner.GetMuzzleID();
12250 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12251
12252 if (WPOF_array)
12253 {
12254 for (int i = 0; i < WPOF_array.Count(); i++)
12255 {
12256 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12257
12258 if (WPOF)
12259 {
12260 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12261 }
12262 }
12263 }
12264 }
12265
12266
12268 {
12269 int id = muzzle_owner.GetMuzzleID();
12271
12272 if (WPOBE_array)
12273 {
12274 for (int i = 0; i < WPOBE_array.Count(); i++)
12275 {
12276 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12277
12278 if (WPOBE)
12279 {
12280 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12281 }
12282 }
12283 }
12284 }
12285
12286
12288 {
12289 int id = muzzle_owner.GetMuzzleID();
12290 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12291
12292 if (WPOOH_array)
12293 {
12294 for (int i = 0; i < WPOOH_array.Count(); i++)
12295 {
12296 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12297
12298 if (WPOOH)
12299 {
12300 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12301 }
12302 }
12303 }
12304 }
12305
12306
12308 {
12309 int id = muzzle_owner.GetMuzzleID();
12310 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12311
12312 if (WPOOH_array)
12313 {
12314 for (int i = 0; i < WPOOH_array.Count(); i++)
12315 {
12316 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12317
12318 if (WPOOH)
12319 {
12320 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12321 }
12322 }
12323 }
12324 }
12325
12326
12328 {
12329 int id = muzzle_owner.GetMuzzleID();
12330 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12331
12332 if (WPOOH_array)
12333 {
12334 for (int i = 0; i < WPOOH_array.Count(); i++)
12335 {
12336 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12337
12338 if (WPOOH)
12339 {
12340 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12341 }
12342 }
12343 }
12344 }
12345
12346
12347
12349 {
12351 {
12352 return true;
12353 }
12354
12355 return false;
12356 }
12357
12359 {
12361 {
12362 return true;
12363 }
12364
12365 return false;
12366 }
12367
12369 {
12371 {
12372 return true;
12373 }
12374
12375 return false;
12376 }
12377
12379 {
12380 return false;
12381 }
12382
12385 {
12386 return UATimeSpent.DEFAULT_DEPLOY;
12387 }
12388
12389
12390
12391
12393 {
12395 SetSynchDirty();
12396 }
12397
12399 {
12401 }
12402
12403
12405 {
12406 return false;
12407 }
12408
12411 {
12412 string att_type = "None";
12413
12414 if (ConfigIsExisting("soundAttType"))
12415 {
12416 att_type = ConfigGetString("soundAttType");
12417 }
12418
12420 }
12421
12423 {
12425 }
12426
12427
12428
12429
12430
12434
12436 {
12439
12441 }
12442
12443
12445 {
12447 return;
12448
12450
12453
12456
12457 SoundParameters params = new SoundParameters();
12461 }
12462
12463
12465 {
12467 return;
12468
12470 SetSynchDirty();
12471
12474 }
12475
12476
12478 {
12480 return;
12481
12483 SetSynchDirty();
12484
12487 }
12488
12490 {
12492 }
12493
12495 {
12497 }
12498
12501 {
12502 if (!
GetGame().IsDedicatedServer())
12503 {
12504 if (ConfigIsExisting("attachSoundSet"))
12505 {
12506 string cfg_path = "";
12507 string soundset = "";
12508 string type_name =
GetType();
12509
12512 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12513 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12514
12515 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12516 {
12517 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12518 {
12519 if (cfg_slot_array[i] == slot_type)
12520 {
12521 soundset = cfg_soundset_array[i];
12522 break;
12523 }
12524 }
12525 }
12526
12527 if (soundset != "")
12528 {
12529 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12531 }
12532 }
12533 }
12534 }
12535
12537 {
12538
12539 }
12540
12541 void OnApply(PlayerBase player);
12542
12544 {
12545 return 1.0;
12546 };
12547
12549 {
12551 }
12552
12554 {
12556 }
12557
12559
12561 {
12562 SetDynamicPhysicsLifeTime(0.01);
12564 }
12565
12567 {
12568 array<string> zone_names = new array<string>;
12569 GetDamageZones(zone_names);
12570 for (int i = 0; i < zone_names.Count(); i++)
12571 {
12572 SetHealthMax(zone_names.Get(i),"Health");
12573 }
12574 SetHealthMax("","Health");
12575 }
12576
12579 {
12580 float global_health = GetHealth01("","Health");
12581 array<string> zones = new array<string>;
12582 GetDamageZones(zones);
12583
12584 for (int i = 0; i < zones.Count(); i++)
12585 {
12586 SetHealth01(zones.Get(i),"Health",global_health);
12587 }
12588 }
12589
12592 {
12593 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12594 }
12595
12597 {
12598 if (!hasRootAsPlayer)
12599 {
12600 if (refParentIB)
12601 {
12602
12603 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12604 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12605
12606 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12607 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12608
12611 }
12612 else
12613 {
12614
12617 }
12618 }
12619 }
12620
12622 {
12624 {
12625 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12626 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
12627 {
12628 float heatPermCoef = 1.0;
12630 while (ent)
12631 {
12632 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12633 ent = ent.GetHierarchyParent();
12634 }
12635
12636 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12637 }
12638 }
12639 }
12640
12642 {
12643
12644 EntityAI parent = GetHierarchyParent();
12645 if (!parent)
12646 {
12647 hasParent = false;
12648 hasRootAsPlayer = false;
12649 }
12650 else
12651 {
12652 hasParent = true;
12653 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12654 refParentIB =
ItemBase.Cast(parent);
12655 }
12656 }
12657
12658 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12659 {
12660
12661 }
12662
12664 {
12665
12666 return false;
12667 }
12668
12670 {
12671
12672
12673 return false;
12674 }
12675
12677 {
12678
12679 return false;
12680 }
12681
12684 {
12685 return !GetIsFrozen() &&
IsOpen();
12686 }
12687
12689 {
12690 bool hasParent = false, hasRootAsPlayer = false;
12692
12693 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12694 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12695
12696 if (wwtu || foodDecay)
12697 {
12701
12702 if (processWetness || processTemperature || processDecay)
12703 {
12705
12706 if (processWetness)
12707 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12708
12709 if (processTemperature)
12711
12712 if (processDecay)
12713 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12714 }
12715 }
12716 }
12717
12720 {
12722 }
12723
12725 {
12728
12729 return super.GetTemperatureFreezeThreshold();
12730 }
12731
12733 {
12736
12737 return super.GetTemperatureThawThreshold();
12738 }
12739
12741 {
12744
12745 return super.GetItemOverheatThreshold();
12746 }
12747
12749 {
12751 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12752
12753 return super.GetTemperatureFreezeTime();
12754 }
12755
12757 {
12759 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12760
12761 return super.GetTemperatureThawTime();
12762 }
12763
12768
12770 {
12771 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12772 }
12773
12775 {
12776 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12777 }
12778
12781 {
12783 }
12784
12786 {
12788 }
12789
12791 {
12793 }
12794
12797 {
12798 return null;
12799 }
12800
12803 {
12804 return false;
12805 }
12806
12808 {
12810 {
12813 if (!trg)
12814 {
12816 explosive = this;
12817 }
12818
12819 explosive.PairRemote(trg);
12821
12822 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12823 trg.SetPersistentPairID(persistentID);
12824 explosive.SetPersistentPairID(persistentID);
12825
12826 return true;
12827 }
12828 return false;
12829 }
12830
12833 {
12834 float ret = 1.0;
12837 ret *= GetHealth01();
12838
12839 return ret;
12840 }
12841
12842 #ifdef DEVELOPER
12843 override void SetDebugItem()
12844 {
12845 super.SetDebugItem();
12846 _itemBase = this;
12847 }
12848
12850 {
12851 string text = super.GetDebugText();
12852
12854 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12855
12856 return text;
12857 }
12858 #endif
12859
12861 {
12862 return true;
12863 }
12864
12866
12868
12870 {
12873 }
12874
12875
12883
12899}
12900
12902{
12904 if (entity)
12905 {
12906 bool is_item = entity.IsInherited(
ItemBase);
12907 if (is_item && full_quantity)
12908 {
12911 }
12912 }
12913 else
12914 {
12916 return NULL;
12917 }
12918 return entity;
12919}
12920
12922{
12923 if (item)
12924 {
12925 if (health > 0)
12926 item.SetHealth("", "", health);
12927
12928 if (item.CanHaveTemperature())
12929 {
12931 if (item.CanFreeze())
12932 item.SetFrozen(false);
12933 }
12934
12935 if (item.HasEnergyManager())
12936 {
12937 if (quantity >= 0)
12938 {
12939 item.GetCompEM().SetEnergy0To1(quantity);
12940 }
12941 else
12942 {
12944 }
12945 }
12946 else if (item.IsMagazine())
12947 {
12948 Magazine mag = Magazine.Cast(item);
12949 if (quantity >= 0)
12950 {
12951 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
12952 }
12953 else
12954 {
12956 }
12957
12958 }
12959 else
12960 {
12961 if (quantity >= 0)
12962 {
12963 item.SetQuantityNormalized(quantity, false);
12964 }
12965 else
12966 {
12968 }
12969
12970 }
12971 }
12972}
12973
12974#ifdef DEVELOPER
12976#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.