8101{
8103 {
8104 return true;
8105 }
8106};
8107
8108
8109
8111{
8115
8117
8120
8121
8122
8123
8124
8133
8139
8144
8149
8170 protected bool m_IsResultOfSplit
8171
8173
8178
8179
8180
8182
8186
8187
8188
8190
8193
8194
8195
8201
8202
8210
8213
8214
8216
8217
8219
8220
8225
8226
8231
8232
8234
8235
8237 {
8242
8243 if (!
GetGame().IsDedicatedServer())
8244 {
8246 {
8248
8250 {
8252 }
8253 }
8254
8257 }
8258
8259 m_OldLocation = null;
8260
8262 {
8264 }
8265
8266 if (ConfigIsExisting("headSelectionsToHide"))
8267 {
8270 }
8271
8273 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8274 {
8276 }
8277
8279
8280 m_IsResultOfSplit = false;
8281
8283 }
8284
8286 {
8287 super.InitItemVariables();
8288
8294 m_Count = ConfigGetInt(
"count");
8295
8298
8303
8306
8311
8323
8327
8328
8331 if (ConfigIsExisting("canBeSplit"))
8332 {
8335 }
8336
8338 if (ConfigIsExisting("itemBehaviour"))
8340
8341
8344 RegisterNetSyncVariableInt("m_VarLiquidType");
8345 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8346
8347 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8348 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8349 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8350
8351 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8352 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8353 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8354 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8355
8356 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8357 RegisterNetSyncVariableBool("m_IsTakeable");
8358 RegisterNetSyncVariableBool("m_IsHologram");
8359
8362 {
8365 }
8366
8368
8370 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8372
8373 }
8374
8376 {
8378 }
8379
8381 {
8384 {
8389 }
8390 }
8391
8392 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8393 {
8395 {
8398 }
8399
8401 }
8402
8404 {
8410 }
8411
8413
8415 {
8417
8418 if (!action)
8419 {
8420 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8421 return;
8422 }
8423
8425 if (!ai)
8426 {
8428 return;
8429 }
8430
8432 if (!action_array)
8433 {
8434 action_array = new array<ActionBase_Basic>;
8436 }
8437 if (LogManager.IsActionLogEnable())
8438 {
8439 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8440 }
8441
8442 if (action_array.Find(action) != -1)
8443 {
8444 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8445 }
8446 else
8447 {
8448 action_array.Insert(action);
8449 }
8450 }
8451
8453 {
8455 ActionBase action = player.GetActionManager().GetAction(actionName);
8458
8459 if (action_array)
8460 {
8461 action_array.RemoveItem(action);
8462 }
8463 }
8464
8465
8466
8468 {
8469 ActionOverrideData overrideData = new ActionOverrideData();
8473
8475 if (!actionMap)
8476 {
8479 }
8480
8481 actionMap.Insert(this.
Type(), overrideData);
8482
8483 }
8484
8486
8488
8489
8491 {
8494
8497
8498 string config_to_search = "CfgVehicles";
8499 string muzzle_owner_config;
8500
8502 {
8503 if (IsInherited(Weapon))
8504 config_to_search = "CfgWeapons";
8505
8506 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8507
8508 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8509
8511
8512 if (config_OnFire_subclass_count > 0)
8513 {
8514 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8515
8516 for (int i = 0; i < config_OnFire_subclass_count; i++)
8517 {
8518 string particle_class = "";
8520 string config_OnFire_entry = config_OnFire_class + particle_class;
8521 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8522 WPOF_array.Insert(WPOF);
8523 }
8524
8525
8527 }
8528 }
8529
8531 {
8532 config_to_search = "CfgWeapons";
8533 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8534
8535 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8536
8538
8539 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8540 {
8541 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8542
8543 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8544 {
8545 string particle_class2 = "";
8547 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8548 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8549 WPOBE_array.Insert(WPOBE);
8550 }
8551
8552
8554 }
8555 }
8556 }
8557
8558
8560 {
8563
8565 {
8566 string config_to_search = "CfgVehicles";
8567
8568 if (IsInherited(Weapon))
8569 config_to_search = "CfgWeapons";
8570
8571 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8572 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8573
8574 if (
GetGame().ConfigIsExisting(config_OnOverheating_class))
8575 {
8576
8578
8580 {
8582 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8584 return;
8585 }
8586
8589
8590
8591
8593 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8594
8595 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8596 {
8597 string particle_class = "";
8599 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8601
8602 if (entry_type == CT_CLASS)
8603 {
8604 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8605 WPOOH_array.Insert(WPOF);
8606 }
8607 }
8608
8609
8611 }
8612 }
8613 }
8614
8616 {
8618 }
8619
8621 {
8623 {
8625
8628
8631
8632 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8633 }
8634 }
8635
8637 {
8639 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8640
8642 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8643
8645 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8646
8648 {
8650 }
8651 }
8652
8654 {
8656 }
8657
8659 {
8662 else
8664
8666 {
8669 }
8670 else
8671 {
8674
8677 }
8678
8680 }
8681
8683 {
8685 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8686 }
8687
8689 {
8691 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8693 }
8694
8696 {
8698 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8699 }
8700
8702 {
8705
8706 OverheatingParticle OP = new OverheatingParticle();
8711
8713 }
8714
8716 {
8719
8720 return -1;
8721 }
8722
8724 {
8726 {
8729
8730 for (int i = count; i > 0; --i)
8731 {
8732 int id = i - 1;
8735
8738
8739 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8740 {
8741 if (p)
8742 {
8745 }
8746 }
8747 }
8748 }
8749 }
8750
8752 {
8754 {
8756 {
8757 int id = i - 1;
8759
8760 if (OP)
8761 {
8763
8764 if (p)
8765 {
8767 }
8768
8769 delete OP;
8770 }
8771 }
8772
8775 }
8776 }
8777
8780 {
8781 return 0.0;
8782 }
8783
8784
8786 {
8787 return 250;
8788 }
8789
8791 {
8792 return 0;
8793 }
8794
8797 {
8799 return true;
8800
8801 return false;
8802 }
8803
8806 {
8809
8811 {
8813 }
8814 else
8815 {
8816
8818 }
8819
8821 }
8822
8829 {
8830 return -1;
8831 }
8832
8833
8834
8835
8837 {
8839 {
8841 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
8842
8843 if (r_index >= 0)
8844 {
8845 InventoryLocation r_il = new InventoryLocation;
8846 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
8847
8848 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
8851 {
8852 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
8853 }
8855 {
8856 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
8857 }
8858
8859 }
8860
8861 player.GetHumanInventory().ClearUserReservedLocation(this);
8862 }
8863
8866 }
8867
8868
8869
8870
8872 {
8873 return ItemBase.m_DebugActionsMask;
8874 }
8875
8877 {
8878 return ItemBase.m_DebugActionsMask & mask;
8879 }
8880
8882 {
8883 ItemBase.m_DebugActionsMask = mask;
8884 }
8885
8887 {
8888 ItemBase.m_DebugActionsMask |= mask;
8889 }
8890
8892 {
8893 ItemBase.m_DebugActionsMask &= ~mask;
8894 }
8895
8897 {
8899 {
8901 }
8902 else
8903 {
8905 }
8906 }
8907
8908
8910 {
8911 if (GetEconomyProfile())
8912 {
8913 float q_max = GetEconomyProfile().GetQuantityMax();
8914 if (q_max > 0)
8915 {
8916 float q_min = GetEconomyProfile().GetQuantityMin();
8917 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
8918
8920 {
8921 ComponentEnergyManager comp = GetCompEM();
8923 {
8925 }
8926 }
8928 {
8930
8931 }
8932
8933 }
8934 }
8935 }
8936
8939 {
8940 EntityAI parent = GetHierarchyParent();
8941
8942 if (parent)
8943 {
8944 InventoryLocation inventory_location_to_lock = new InventoryLocation;
8945 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
8946 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
8947 }
8948 }
8949
8952 {
8953 EntityAI parent = GetHierarchyParent();
8954
8955 if (parent)
8956 {
8957 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
8958 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
8959 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
8960 }
8961 }
8962
8964 {
8965
8966
8967
8968
8970
8972 {
8973 if (ScriptInputUserData.CanStoreInputUserData())
8974 {
8975 ScriptInputUserData ctx = new ScriptInputUserData;
8981 ctx.
Write(use_stack_max);
8984
8986 {
8987 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
8988 }
8989 }
8990 }
8991 else if (!
GetGame().IsMultiplayer())
8992 {
8994 }
8995 }
8996
8998 {
9000 }
9001
9003 {
9005 }
9006
9008 {
9010 }
9011
9013 {
9014
9015 return false;
9016 }
9017
9019 {
9020 return false;
9021 }
9022
9026 {
9027 return false;
9028 }
9029
9031 {
9032 return "";
9033 }
9034
9036
9038 {
9039 return false;
9040 }
9041
9043 {
9044 return true;
9045 }
9046
9047
9048
9050 {
9051 return true;
9052 }
9053
9055 {
9056 return true;
9057 }
9058
9060 {
9061 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9063 }
9064
9066 {
9068 }
9069
9071 {
9073 if (!is_being_placed)
9075 SetSynchDirty();
9076 }
9077
9078
9080
9082 {
9084 }
9085
9087 {
9089 }
9090
9092 {
9093 return 1;
9094 }
9095
9097 {
9098 return false;
9099 }
9100
9102 {
9104 SetSynchDirty();
9105 }
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9142 {
9143 super.OnMovedInsideCargo(container);
9144
9145 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9146 }
9147
9148 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9149 {
9150 super.EEItemLocationChanged(oldLoc,newLoc);
9151
9152 PlayerBase new_player = null;
9153 PlayerBase old_player = null;
9154
9155 if (newLoc.GetParent())
9156 new_player = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9157
9158 if (oldLoc.GetParent())
9159 old_player = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9160
9162 {
9163 int r_index = old_player.GetHumanInventory().FindUserReservedLocationIndex(this);
9164
9165 if (r_index >= 0)
9166 {
9167 InventoryLocation r_il = new InventoryLocation;
9168 old_player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9169
9170 old_player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9173 {
9174 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9175 }
9177 {
9178 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9179 }
9180
9181 }
9182 }
9183
9185 {
9186 if (new_player)
9187 new_player.ForceStandUpForHeavyItems(newLoc.GetItem());
9188
9189 if (new_player == old_player)
9190 {
9191
9192 if (oldLoc.GetParent() && new_player.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9193 {
9195 {
9196 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9197 {
9198 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9199 }
9200 }
9201 else
9202 {
9203 new_player.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9204 }
9205 }
9206
9207 if (new_player.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9208 {
9209 int type = oldLoc.GetType();
9211 {
9212 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9213 }
9215 {
9216 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9217 }
9218 }
9219 if (!m_OldLocation)
9220 {
9221 m_OldLocation = new InventoryLocation;
9222 }
9223 m_OldLocation.Copy(oldLoc);
9224 }
9225 else
9226 {
9227 if (m_OldLocation)
9228 {
9229 m_OldLocation.Reset();
9230 }
9231 }
9232
9234 }
9235 else
9236 {
9237 if (new_player)
9238 {
9239 int res_index = new_player.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9240 if (res_index >= 0)
9241 {
9242 InventoryLocation il = new InventoryLocation;
9243 new_player.GetHumanInventory().GetUserReservedLocation(res_index,il);
9245 new_player.GetHumanInventory().ClearUserReservedLocationAtIndex(res_index);
9248 {
9249 il.
GetParent().GetOnReleaseLock().Invoke(it);
9250 }
9252 {
9254 }
9255
9256 }
9257 }
9259 {
9260
9262 }
9263
9264 if (m_OldLocation)
9265 {
9266 m_OldLocation.Reset();
9267 }
9268 }
9269 }
9270
9271 override void EOnContact(IEntity other, Contact extra)
9272 {
9274 {
9275 int liquidType = -1;
9277 if (impactSpeed > 0.0)
9278 {
9280 #ifndef SERVER
9282 #else
9284 SetSynchDirty();
9285 #endif
9287 }
9288 }
9289
9290 #ifdef SERVER
9291 if (GetCompEM() && GetCompEM().IsPlugged())
9292 {
9293 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9294 GetCompEM().UnplugThis();
9295 }
9296 #endif
9297 }
9298
9300
9302 {
9304 }
9305
9307 {
9308
9309 }
9310
9312 {
9313 super.OnItemLocationChanged(old_owner, new_owner);
9314
9315 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9316 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9317
9318 if (!relatedPlayer && playerNew)
9319 relatedPlayer = playerNew;
9320
9321 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9322 {
9324 if (actionMgr)
9325 {
9326 ActionBase currentAction = actionMgr.GetRunningAction();
9327 if (currentAction)
9329 }
9330 }
9331
9332 Man ownerPlayerOld = null;
9333 Man ownerPlayerNew = null;
9334
9335 if (old_owner)
9336 {
9337 if (old_owner.
IsMan())
9338 {
9339 ownerPlayerOld = Man.Cast(old_owner);
9340 }
9341 else
9342 {
9343 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9344 }
9345 }
9346 else
9347 {
9349 {
9351
9352 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9353 {
9354 GetCompEM().UnplugThis();
9355 }
9356 }
9357 }
9358
9359 if (new_owner)
9360 {
9361 if (new_owner.
IsMan())
9362 {
9363 ownerPlayerNew = Man.Cast(new_owner);
9364 }
9365 else
9366 {
9367 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9368 }
9369 }
9370
9371 if (ownerPlayerOld != ownerPlayerNew)
9372 {
9373 if (ownerPlayerOld)
9374 {
9375 array<EntityAI> subItemsExit = new array<EntityAI>;
9377 for (int i = 0; i < subItemsExit.Count(); i++)
9378 {
9381 }
9382 }
9383
9384 if (ownerPlayerNew)
9385 {
9386 array<EntityAI> subItemsEnter = new array<EntityAI>;
9388 for (int j = 0; j < subItemsEnter.Count(); j++)
9389 {
9392 }
9393 }
9394 }
9395 else if (ownerPlayerNew != null)
9396 {
9397 PlayerBase nplayer;
9398 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9399 {
9400 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9402 for (int k = 0; k < subItemsUpdate.Count(); k++)
9403 {
9405 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9406 }
9407 }
9408 }
9409
9410 if (old_owner)
9411 old_owner.OnChildItemRemoved(this);
9412 if (new_owner)
9413 new_owner.OnChildItemReceived(this);
9414 }
9415
9416
9418 {
9419 super.EEDelete(parent);
9420 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9421 if (player)
9422 {
9424
9425 if (player.IsAlive())
9426 {
9427 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9428 if (r_index >= 0)
9429 {
9430 InventoryLocation r_il = new InventoryLocation;
9431 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9432
9433 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9436 {
9437 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9438 }
9440 {
9441 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9442 }
9443
9444 }
9445
9446 player.RemoveQuickBarEntityShortcut(this);
9447 }
9448 }
9449 }
9450
9452 {
9453 super.EEKilled(killer);
9454
9457 {
9458 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9459 {
9460 if (IsMagazine())
9461 {
9462 if (Magazine.Cast(this).GetAmmoCount() > 0)
9463 {
9465 }
9466 }
9467 else
9468 {
9470 }
9471 }
9472 }
9473 }
9474
9476 {
9477 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9478
9479 super.OnWasAttached(parent, slot_id);
9480
9483
9485 }
9486
9488 {
9489 super.OnWasDetached(parent, slot_id);
9490
9493 }
9494
9496 {
9497 int idx;
9500
9501 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9502 if (inventory_slots.Count() < 1)
9503 {
9504 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9505 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9506 }
9507 else
9508 {
9509 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9510 }
9511
9512 idx = inventory_slots.Find(slot);
9513 if (idx < 0)
9514 return "";
9515
9516 return attach_types.Get(idx);
9517 }
9518
9520 {
9521 int idx = -1;
9522 string slot;
9523
9526
9527 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9528 if (inventory_slots.Count() < 1)
9529 {
9530 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9531 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9532 }
9533 else
9534 {
9535 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9536 if (detach_types.Count() < 1)
9537 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9538 }
9539
9540 for (int i = 0; i < inventory_slots.Count(); i++)
9541 {
9542 slot = inventory_slots.Get(i);
9543 }
9544
9545 if (slot != "")
9546 {
9547 if (detach_types.Count() == 1)
9548 idx = 0;
9549 else
9550 idx = inventory_slots.Find(slot);
9551 }
9552 if (idx < 0)
9553 return "";
9554
9555 return detach_types.Get(idx);
9556 }
9557
9559 {
9560
9562
9563
9564 float min_time = 1;
9565 float max_time = 3;
9566 float delay = Math.RandomFloat(min_time, max_time);
9567
9568 explode_timer.Run(delay, this, "DoAmmoExplosion");
9569 }
9570
9572 {
9573 Magazine magazine = Magazine.Cast(this);
9574 int pop_sounds_count = 6;
9575 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9576
9577
9578 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9579 string sound_name = pop_sounds[ sound_idx ];
9581
9582
9583 magazine.ServerAddAmmoCount(-1);
9584
9585
9586 float min_temp_to_explode = 100;
9587
9588 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9589 {
9591 }
9592 }
9593
9594
9595 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9596 {
9597 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9598
9599 const int CHANCE_DAMAGE_CARGO = 4;
9600 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9601 const int CHANCE_DAMAGE_NOTHING = 2;
9602
9604 {
9605 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9606 int chances;
9607 int rnd;
9608
9609 if (GetInventory().GetCargo())
9610 {
9611 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9612 rnd = Math.RandomInt(0,chances);
9613
9614 if (rnd < CHANCE_DAMAGE_CARGO)
9615 {
9617 }
9618 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9619 {
9621 }
9622 }
9623 else
9624 {
9625 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9626 rnd = Math.RandomInt(0,chances);
9627
9628 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9629 {
9631 }
9632 }
9633 }
9634 }
9635
9637 {
9638 if (GetInventory().GetCargo())
9639 {
9640 int item_count = GetInventory().GetCargo().GetItemCount();
9641 if (item_count > 0)
9642 {
9643 int random_pick = Math.RandomInt(0, item_count);
9645 if (!item.IsExplosive())
9646 {
9647 item.AddHealth("","",damage);
9648 return true;
9649 }
9650 }
9651 }
9652 return false;
9653 }
9654
9656 {
9657 int attachment_count = GetInventory().AttachmentCount();
9658 if (attachment_count > 0)
9659 {
9660 int random_pick = Math.RandomInt(0, attachment_count);
9661 ItemBase attachment =
ItemBase.Cast(GetInventory().GetAttachmentFromIndex(random_pick));
9662 if (!attachment.IsExplosive())
9663 {
9664 attachment.AddHealth("","",damage);
9665 return true;
9666 }
9667 }
9668 return false;
9669 }
9670
9672 {
9674 }
9675
9677 {
9679 return GetInventory().CanRemoveEntity();
9680
9681 return false;
9682 }
9683
9685 {
9686
9688 return false;
9689
9690
9692 return false;
9693
9694
9695
9697 if (delta == 0)
9698 return false;
9699
9700
9701 return true;
9702 }
9703
9705 {
9707 {
9708 if (ScriptInputUserData.CanStoreInputUserData())
9709 {
9710 ScriptInputUserData ctx = new ScriptInputUserData;
9715 ctx.
Write(destination_entity);
9719 }
9720 }
9721 else if (!
GetGame().IsMultiplayer())
9722 {
9724 }
9725 }
9726
9728 {
9729 float split_quantity_new;
9733 InventoryLocation loc = new InventoryLocation;
9734
9735 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9736 {
9738 split_quantity_new = stack_max;
9739 else
9741
9743 {
9744 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9745 if (new_item)
9746 {
9747 new_item.SetResultOfSplit(true);
9748 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9750 new_item.
SetQuantity(split_quantity_new,
false,
true);
9751 }
9752 }
9753 }
9754 else if (destination_entity && slot_id == -1)
9755 {
9756 if (quantity > stack_max)
9757 split_quantity_new = stack_max;
9758 else
9759 split_quantity_new = quantity;
9760
9762 {
9764 {
9767 }
9768
9769 if (new_item)
9770 {
9771 new_item.SetResultOfSplit(true);
9772 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9774 new_item.
SetQuantity(split_quantity_new,
false,
true);
9775 }
9776 }
9777 }
9778 else
9779 {
9780 if (stack_max != 0)
9781 {
9783 {
9785 }
9786
9787 if (split_quantity_new == 0)
9788 {
9789 if (!
GetGame().IsMultiplayer())
9790 player.PhysicalPredictiveDropItem(this);
9791 else
9792 player.ServerDropEntity(this);
9793 return;
9794 }
9795
9797 {
9799
9800 if (new_item)
9801 {
9802 new_item.SetResultOfSplit(true);
9803 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9806 new_item.PlaceOnSurface();
9807 }
9808 }
9809 }
9810 }
9811 }
9812
9814 {
9815 float split_quantity_new;
9819 InventoryLocation loc = new InventoryLocation;
9820
9821 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9822 {
9824 split_quantity_new = stack_max;
9825 else
9827
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,
false,
true);
9837 }
9838 }
9839 }
9840 else if (destination_entity && slot_id == -1)
9841 {
9842 if (quantity > stack_max)
9843 split_quantity_new = stack_max;
9844 else
9845 split_quantity_new = quantity;
9846
9848 {
9850 {
9853 }
9854
9855 if (new_item)
9856 {
9857 new_item.SetResultOfSplit(true);
9858 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9860 new_item.
SetQuantity(split_quantity_new,
false,
true);
9861 }
9862 }
9863 }
9864 else
9865 {
9866 if (stack_max != 0)
9867 {
9869 {
9871 }
9872
9874 {
9876
9877 if (new_item)
9878 {
9879 new_item.SetResultOfSplit(true);
9880 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9883 new_item.PlaceOnSurface();
9884 }
9885 }
9886 }
9887 }
9888 }
9889
9891 {
9893 {
9894 if (ScriptInputUserData.CanStoreInputUserData())
9895 {
9896 ScriptInputUserData ctx = new ScriptInputUserData;
9901 dst.WriteToContext(ctx);
9903 }
9904 }
9905 else if (!
GetGame().IsMultiplayer())
9906 {
9908 }
9909 }
9910
9912 {
9914 {
9915 if (ScriptInputUserData.CanStoreInputUserData())
9916 {
9917 ScriptInputUserData ctx = new ScriptInputUserData;
9922 ctx.
Write(destination_entity);
9928 }
9929 }
9930 else if (!
GetGame().IsMultiplayer())
9931 {
9933 }
9934 }
9935
9937 {
9939 }
9940
9942 {
9944 float split_quantity_new;
9946 if (dst.IsValid())
9947 {
9948 int slot_id = dst.GetSlot();
9950
9951 if (quantity > stack_max)
9952 split_quantity_new = stack_max;
9953 else
9954 split_quantity_new = quantity;
9955
9957 {
9959
9960 if (new_item)
9961 {
9962 new_item.SetResultOfSplit(true);
9963 MiscGameplayFunctions.TransferItemProperties(this,new_item);
9965 new_item.
SetQuantity(split_quantity_new,
false,
true);
9966 }
9967
9968 return new_item;
9969 }
9970 }
9971
9972 return null;
9973 }
9974
9976 {
9978 float split_quantity_new;
9980 if (destination_entity)
9981 {
9983 if (quantity > stackable)
9984 split_quantity_new = stackable;
9985 else
9986 split_quantity_new = quantity;
9987
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,
false,
true);
9997 }
9998 }
9999 }
10000 }
10001
10003 {
10005 {
10006 if (ScriptInputUserData.CanStoreInputUserData())
10007 {
10008 ScriptInputUserData ctx = new ScriptInputUserData;
10013 ItemBase destination_entity =
this;
10014 ctx.
Write(destination_entity);
10018 }
10019 }
10020 else if (!
GetGame().IsMultiplayer())
10021 {
10023 }
10024 }
10025
10027 {
10029 float split_quantity_new;
10031 if (player)
10032 {
10034 if (quantity > stackable)
10035 split_quantity_new = stackable;
10036 else
10037 split_quantity_new = quantity;
10038
10040 {
10041 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10042 new_item =
ItemBase.Cast(in_hands);
10043 if (new_item)
10044 {
10045 new_item.SetResultOfSplit(true);
10046 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10048 new_item.SetQuantity(split_quantity_new, false, true);
10049 }
10050 }
10051 }
10052 }
10053
10055 {
10057 float split_quantity_new = Math.Floor(quantity * 0.5);
10058
10060 return;
10061
10063
10064 if (new_item)
10065 {
10066 if (new_item.GetQuantityMax() < split_quantity_new)
10067 {
10068 split_quantity_new = new_item.GetQuantityMax();
10069 }
10070
10071 new_item.SetResultOfSplit(true);
10072 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10073
10075 {
10078 }
10079 else
10080 {
10082 new_item.
SetQuantity(split_quantity_new,
false,
true);
10083 }
10084 }
10085 }
10086
10088 {
10090 float split_quantity_new = Math.Floor(quantity / 2);
10091
10093 return;
10094
10095 InventoryLocation invloc = new InventoryLocation;
10097
10099 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10100
10101 if (new_item)
10102 {
10103 if (new_item.GetQuantityMax() < split_quantity_new)
10104 {
10105 split_quantity_new = new_item.GetQuantityMax();
10106 }
10108 {
10111 }
10112 else if (split_quantity_new > 1)
10113 {
10115 new_item.
SetQuantity(split_quantity_new,
false,
true);
10116 }
10117 }
10118 }
10119
10122 {
10123 SetWeightDirty();
10125
10126 if (parent)
10127 parent.OnAttachmentQuantityChangedEx(this, delta);
10128
10130 {
10132 {
10134 }
10136 {
10137 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10139 }
10140 }
10141
10142 }
10143
10146 {
10147
10148 }
10149
10152 {
10154 }
10155
10157 {
10158 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10159
10161 {
10162 if (newLevel == GameConstants.STATE_RUINED)
10163 {
10165 EntityAI parent = GetHierarchyParent();
10166 if (parent && parent.IsFireplace())
10167 {
10168 CargoBase cargo = GetInventory().GetCargo();
10169 if (cargo)
10170 {
10172 {
10174 }
10175 }
10176 }
10177 }
10178
10180 {
10181
10183 return;
10184 }
10185
10186 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10187 {
10189 }
10190 }
10191 }
10192
10193
10195 {
10196 super.OnRightClick();
10197
10199 {
10201 {
10202 if (ScriptInputUserData.CanStoreInputUserData())
10203 {
10204 EntityAI root = GetHierarchyRoot();
10205 Man playerOwner = GetHierarchyRootPlayer();
10206 InventoryLocation dst = new InventoryLocation;
10207
10208
10209 if (!playerOwner && root && root == this)
10210 {
10212 }
10213 else
10214 {
10215
10216 GetInventory().GetCurrentInventoryLocation(dst);
10218 {
10221 {
10223 }
10224 else
10225 {
10227
10228
10229 if (
GetGame().
GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10230 {
10232 }
10233 else
10234 {
10235 GetGame().
GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10236 }
10237 }
10238 }
10239 }
10240
10241 ScriptInputUserData ctx = new ScriptInputUserData;
10249 }
10250 }
10251 else if (!
GetGame().IsMultiplayer())
10252 {
10254 }
10255 }
10256 }
10257
10259 {
10260 if (root)
10261 {
10262 vector m4[4];
10263 root.GetTransform(m4);
10264 dst.SetGround(this, m4);
10265 }
10266 else
10267 {
10268 GetInventory().GetCurrentInventoryLocation(dst);
10269 }
10270 }
10271
10272 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10273 {
10274
10275 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10276 return false;
10277
10278 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10279 return false;
10280
10281
10283 return false;
10284
10285
10286 Magazine mag = Magazine.Cast(this);
10287 if (mag)
10288 {
10289 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10290 return false;
10291
10292 if (stack_max_limit)
10293 {
10294 Magazine other_mag = Magazine.Cast(other_item);
10295 if (other_item)
10296 {
10297 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10298 return false;
10299 }
10300
10301 }
10302 }
10303 else
10304 {
10305
10307 return false;
10308
10310 return false;
10311 }
10312
10313 PlayerBase player = null;
10314 if (CastTo(player, GetHierarchyRootPlayer()))
10315 {
10316 if (player.GetInventory().HasAttachment(this))
10317 return false;
10318
10319 if (player.IsItemsToDelete())
10320 return false;
10321 }
10322
10323 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10324 return false;
10325
10326 int slotID;
10328 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10329 return false;
10330
10331 return true;
10332 }
10333
10335 {
10337 }
10338
10340 {
10341 return m_IsResultOfSplit;
10342 }
10343
10345 {
10346 m_IsResultOfSplit = value;
10347 }
10348
10350 {
10352 }
10353
10355 {
10356 float other_item_quantity = other_item.GetQuantity();
10357 float this_free_space;
10358
10360
10362
10363 if (other_item_quantity > this_free_space)
10364 {
10365 return this_free_space;
10366 }
10367 else
10368 {
10369 return other_item_quantity;
10370 }
10371 }
10372
10374 {
10376 }
10377
10379 {
10381 return;
10382
10383 if (!IsMagazine() && other_item)
10384 {
10386 if (quantity_used != 0)
10387 {
10388 float hp1 = GetHealth01("","");
10389 float hp2 = other_item.GetHealth01("","");
10390 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10391 hpResult = hpResult / (
GetQuantity() + quantity_used);
10392
10393 hpResult *= GetMaxHealth();
10394 Math.Round(hpResult);
10395 SetHealth("", "Health", hpResult);
10396
10398 other_item.AddQuantity(-quantity_used);
10399 }
10400 }
10402 }
10403
10405 {
10406 #ifdef SERVER
10407 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10408 GetHierarchyParent().IncreaseLifetimeUp();
10409 #endif
10410 };
10411
10413 {
10414 PlayerBase p = PlayerBase.Cast(player);
10415
10416 array<int> recipesIds = p.m_Recipes;
10417 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10418 if (moduleRecipesManager)
10419 {
10420 EntityAI itemInHands = player.GetHumanInventory().GetEntityInHands();
10421 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10422 }
10423
10424 for (int i = 0;i < recipesIds.Count(); i++)
10425 {
10426 int key = recipesIds.Get(i);
10427 string recipeName = moduleRecipesManager.GetRecipeName(key);
10429 }
10430 }
10431
10432
10433 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10434 {
10435 super.GetDebugActions(outputList);
10436
10437
10443
10444
10449
10454
10455
10459
10460
10462 {
10466 }
10467
10470
10471
10475
10477
10478 InventoryLocation loc = new InventoryLocation();
10479 GetInventory().GetCurrentInventoryLocation(loc);
10481 {
10482 if (Gizmo_IsSupported())
10485 }
10486
10488 }
10489
10490
10491
10492
10494 {
10495 super.OnAction(action_id, player, ctx);
10496
10498 {
10499 switch (action_id)
10500 {
10503 return true;
10506 return true;
10507 }
10508 }
10509
10511 {
10512 switch (action_id)
10513 {
10515 Delete();
10516 return true;
10517 }
10518 }
10519
10520 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10521 {
10522 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10523 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10524 PlayerBase p = PlayerBase.Cast(player);
10525 if (
EActions.RECIPES_RANGE_START < 1000)
10526 {
10527 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10528 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10529 }
10530 }
10531 #ifndef SERVER
10532 else if (action_id ==
EActions.WATCH_PLAYER)
10533 {
10534 PluginDeveloper.SetDeveloperItemClientEx(player);
10535 }
10536 #endif
10538 {
10539 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10540 {
10541 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10542 OnDebugButtonPressServer(id + 1);
10543 }
10544
10545 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10546 {
10547 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10549 }
10550
10551 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10552 {
10553 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10555 }
10556
10557 else if (action_id ==
EActions.ADD_QUANTITY)
10558 {
10559 if (IsMagazine())
10560 {
10561 Magazine mag = Magazine.Cast(this);
10562 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10563 }
10564 else
10565 {
10567 }
10568
10569 if (m_EM)
10570 {
10571 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10572 }
10573
10574 }
10575
10576 else if (action_id ==
EActions.REMOVE_QUANTITY)
10577 {
10578 if (IsMagazine())
10579 {
10580 Magazine mag2 = Magazine.Cast(this);
10581 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10582 }
10583 else
10584 {
10586 }
10587 if (m_EM)
10588 {
10589 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10590 }
10591
10592 }
10593
10594 else if (action_id ==
EActions.SET_QUANTITY_0)
10595 {
10597
10598 if (m_EM)
10599 {
10600 m_EM.SetEnergy(0);
10601 }
10602 }
10603
10604 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10605 {
10607
10608 if (m_EM)
10609 {
10610 m_EM.SetEnergy(m_EM.GetEnergyMax());
10611 }
10612 }
10613
10614 else if (action_id ==
EActions.ADD_HEALTH)
10615 {
10616 AddHealth("","",GetMaxHealth("","Health")/5);
10617 }
10618 else if (action_id ==
EActions.REMOVE_HEALTH)
10619 {
10620 AddHealth("","",-GetMaxHealth("","Health")/5);
10621 }
10622 else if (action_id ==
EActions.DESTROY_HEALTH)
10623 {
10624 SetHealth01("","",0);
10625 }
10626 else if (action_id ==
EActions.WATCH_ITEM)
10627 {
10629 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10630 #ifdef DEVELOPER
10631 SetDebugDeveloper_item(this);
10632 #endif
10633 }
10634
10635 else if (action_id ==
EActions.ADD_TEMPERATURE)
10636 {
10637 AddTemperature(20);
10638
10639 }
10640
10641 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10642 {
10643 AddTemperature(-20);
10644
10645 }
10646
10647 else if (action_id ==
EActions.FLIP_FROZEN)
10648 {
10649 SetFrozen(!GetIsFrozen());
10650
10651 }
10652
10653 else if (action_id ==
EActions.ADD_WETNESS)
10654 {
10656
10657 }
10658
10659 else if (action_id ==
EActions.REMOVE_WETNESS)
10660 {
10662
10663 }
10664
10665 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10666 {
10669
10670
10671 }
10672
10673 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10674 {
10677 }
10678
10679 else if (action_id ==
EActions.MAKE_SPECIAL)
10680 {
10681 auto debugParams = DebugSpawnParams.WithPlayer(player);
10682 OnDebugSpawnEx(debugParams);
10683 }
10684
10685 }
10686
10687
10688 return false;
10689 }
10690
10691
10692
10693
10697
10700
10701
10702
10704 {
10705 return false;
10706 }
10707
10708
10710 {
10711 return true;
10712 }
10713
10714
10716 {
10717 return true;
10718 }
10719
10720
10721
10723 {
10724 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10726 }
10727
10730 {
10731 return null;
10732 }
10733
10735 {
10736 return false;
10737 }
10738
10740 {
10741 return false;
10742 }
10743
10747
10748
10750 {
10751 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10752 return module_repairing.CanRepair(this, item_repair_kit);
10753 }
10754
10755
10756 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10757 {
10758 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10759 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10760 }
10761
10762
10764 {
10765
10766
10767
10768
10769
10770
10771
10772
10773 return 1;
10774 }
10775
10776
10777
10779 {
10781 }
10782
10783
10784
10786 {
10788 }
10789
10790
10799 {
10800 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10801
10802 if (player)
10803 {
10804 player.MessageStatus(text);
10805 }
10806 }
10807
10808
10817 {
10818 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10819
10820 if (player)
10821 {
10822 player.MessageAction(text);
10823 }
10824 }
10825
10826
10835 {
10836 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10837
10838 if (player)
10839 {
10840 player.MessageFriendly(text);
10841 }
10842 }
10843
10844
10853 {
10854 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
10855
10856 if (player)
10857 {
10858 player.MessageImportant(text);
10859 }
10860 }
10861
10863 {
10864 return true;
10865 }
10866
10867
10868 override bool KindOf(
string tag)
10869 {
10870 bool found = false;
10871 string item_name = this.
GetType();
10874
10875 int array_size = item_tag_array.Count();
10876 for (int i = 0; i < array_size; i++)
10877 {
10878 if (item_tag_array.Get(i) == tag)
10879 {
10880 found = true;
10881 break;
10882 }
10883 }
10884 return found;
10885 }
10886
10887
10889 {
10890
10891 super.OnRPC(sender, rpc_type,ctx);
10892
10893
10894 switch (rpc_type)
10895 {
10896 #ifndef SERVER
10897 case ERPCs.RPC_SOUND_LOCK_ATTACH:
10898 Param2<bool, string> p = new Param2<bool, string>(false, "");
10899
10901 return;
10902
10903 bool play = p.param1;
10904 string soundSet = p.param2;
10905
10906 if (play)
10907 {
10909 {
10911 {
10913 }
10914 }
10915 else
10916 {
10918 }
10919 }
10920 else
10921 {
10923 }
10924
10925 break;
10926 #endif
10927
10928 }
10929
10931 {
10933 }
10934 }
10935
10936
10937
10938
10940 {
10941 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10942 return plugin.GetID(
name);
10943 }
10944
10946 {
10947 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
10948 return plugin.GetName(id);
10949 }
10950
10953 {
10954
10955
10956 int varFlags;
10957 if (!ctx.
Read(varFlags))
10958 return;
10959
10960 if (varFlags & ItemVariableFlags.FLOAT)
10961 {
10963 }
10964 }
10965
10967 {
10968
10969 super.SerializeNumericalVars(floats_out);
10970
10971
10972
10974 {
10976 }
10977
10979 {
10981 }
10982
10984 {
10986 }
10987
10989 {
10994 }
10995
10997 {
10999 }
11000 }
11001
11003 {
11004
11005 super.DeSerializeNumericalVars(floats);
11006
11007
11008 int index = 0;
11009 int mask = Math.Round(floats.Get(index));
11010
11011 index++;
11012
11014 {
11016 {
11018 }
11019 else
11020 {
11021 float quantity = floats.Get(index);
11022 SetQuantity(quantity,
true,
false,
false,
false);
11023 }
11024 index++;
11025 }
11026
11028 {
11029 float wet = floats.Get(index);
11031 index++;
11032 }
11033
11035 {
11036 int liquidtype = Math.Round(floats.Get(index));
11038 index++;
11039 }
11040
11042 {
11044 index++;
11046 index++;
11048 index++;
11050 index++;
11051 }
11052
11054 {
11055 int cleanness = Math.Round(floats.Get(index));
11057 index++;
11058 }
11059 }
11060
11062 {
11063 super.WriteVarsToCTX(ctx);
11064
11065
11067 {
11069 }
11070
11072 {
11074 }
11075
11077 {
11079 }
11080
11082 {
11083 int r,g,b,a;
11089 }
11090
11092 {
11094 }
11095 }
11096
11098 {
11099 if (!super.ReadVarsFromCTX(ctx,version))
11100 return false;
11101
11102 int intValue;
11103 float value;
11104
11105 if (version < 140)
11106 {
11107 if (!ctx.
Read(intValue))
11108 return false;
11109
11110 m_VariablesMask = intValue;
11111 }
11112
11114 {
11115 if (!ctx.
Read(value))
11116 return false;
11117
11119 {
11121 }
11122 else
11123 {
11125 }
11126 }
11127
11128 if (version < 140)
11129 {
11131 {
11132 if (!ctx.
Read(value))
11133 return false;
11134 SetTemperatureDirect(value);
11135 }
11136 }
11137
11139 {
11140 if (!ctx.
Read(value))
11141 return false;
11143 }
11144
11146 {
11147 if (!ctx.
Read(intValue))
11148 return false;
11150 }
11151
11153 {
11154 int r,g,b,a;
11156 return false;
11158 return false;
11160 return false;
11162 return false;
11163
11165 }
11166
11168 {
11169 if (!ctx.
Read(intValue))
11170 return false;
11172 }
11173
11174 if (version >= 138 && version < 140)
11175 {
11177 {
11178 if (!ctx.
Read(intValue))
11179 return false;
11180 SetFrozen(intValue);
11181 }
11182 }
11183
11184 return true;
11185 }
11186
11187
11189 {
11192 {
11194 }
11195
11196 if (!super.OnStoreLoad(ctx, version))
11197 {
11199 return false;
11200 }
11201
11202 if (version >= 114)
11203 {
11204 bool hasQuickBarIndexSaved;
11205
11206 if (!ctx.
Read(hasQuickBarIndexSaved))
11207 {
11209 return false;
11210 }
11211
11212 if (hasQuickBarIndexSaved)
11213 {
11214 int itmQBIndex;
11215
11216
11217 if (!ctx.
Read(itmQBIndex))
11218 {
11220 return false;
11221 }
11222
11223 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11224 if (itmQBIndex != -1 && parentPlayer)
11225 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11226 }
11227 }
11228 else
11229 {
11230
11231 PlayerBase player;
11232 int itemQBIndex;
11233 if (version ==
int.
MAX)
11234 {
11235 if (!ctx.
Read(itemQBIndex))
11236 {
11238 return false;
11239 }
11240 }
11241 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11242 {
11243
11244 if (!ctx.
Read(itemQBIndex))
11245 {
11247 return false;
11248 }
11249 if (itemQBIndex != -1 && player)
11250 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11251 }
11252 }
11253
11254 if (version < 140)
11255 {
11256
11257 if (!LoadVariables(ctx, version))
11258 {
11260 return false;
11261 }
11262 }
11263
11264
11266 {
11268 return false;
11269 }
11270 if (version >= 132)
11271 {
11273 if (raib)
11274 {
11276 {
11278 return false;
11279 }
11280 }
11281 }
11282
11284 return true;
11285 }
11286
11287
11288
11290 {
11291 super.OnStoreSave(ctx);
11292
11293 PlayerBase player;
11294 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11295 {
11297
11298 int itemQBIndex = -1;
11299 itemQBIndex = player.FindQuickBarEntityIndex(this);
11300 ctx.
Write(itemQBIndex);
11301 }
11302 else
11303 {
11305 }
11306
11308
11310 if (raib)
11311 {
11313 }
11314 }
11315
11316
11318 {
11319 super.AfterStoreLoad();
11320
11322 {
11324 }
11325
11327 {
11330 }
11331 }
11332
11334 {
11335 super.EEOnAfterLoad();
11336
11338 {
11340 }
11341
11344 }
11345
11347 {
11348 return false;
11349 }
11350
11351
11352
11354 {
11356 {
11357 #ifdef PLATFORM_CONSOLE
11358
11360 {
11362 if (menu)
11363 {
11365 }
11366 }
11367 #endif
11368 }
11369
11371 {
11374 }
11375
11377 {
11378 SetWeightDirty();
11380 }
11382 {
11385 }
11386
11388 {
11391 }
11393 {
11396 }
11397
11398 super.OnVariablesSynchronized();
11399 }
11400
11401
11402
11404 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11405 {
11406 if (!IsServerCheck(allow_client))
11407 return false;
11408
11410 return false;
11411
11414
11415 if (value <= (min + 0.001))
11416 value = min;
11417
11418 if (value == min)
11419 {
11420 if (destroy_config)
11421 {
11422 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11423 if (dstr)
11424 {
11426 this.Delete();
11427 return true;
11428 }
11429 }
11430 else if (destroy_forced)
11431 {
11433 this.Delete();
11434 return true;
11435 }
11436
11438 }
11439
11442
11444 {
11446
11447 if (delta)
11449 }
11450
11452
11453 return false;
11454 }
11455
11456
11458 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11459 {
11461 }
11462
11464 {
11467 }
11468
11470 {
11473 }
11474
11476 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11477 {
11478 float value_clamped = Math.Clamp(value, 0, 1);
11480 SetQuantity(result, destroy_config, destroy_forced);
11481 }
11482
11483
11486 {
11488 }
11489
11491 {
11493 }
11494
11495
11496
11497
11498
11499
11500
11501
11502
11503
11505 {
11506 int slot = -1;
11507 if (GetInventory())
11508 {
11509 InventoryLocation il = new InventoryLocation;
11510 GetInventory().GetCurrentInventoryLocation(il);
11512 }
11513
11515 }
11516
11518 {
11519 float quantity_max = 0;
11520
11522 {
11523 if (attSlotID != -1)
11524 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11525
11526 if (quantity_max <= 0)
11528 }
11529
11530 if (quantity_max <= 0)
11532
11533 return quantity_max;
11534 }
11535
11537 {
11539 }
11540
11542 {
11544 }
11545
11546
11548 {
11550 }
11551
11553 {
11555 }
11556
11558 {
11560 }
11561
11562
11564 {
11565
11566 float weightEx = GetWeightEx();
11567 float special = GetInventoryAndCargoWeight();
11568 return weightEx - special;
11569 }
11570
11571
11573 {
11575 }
11576
11578 {
11580 {
11581 #ifdef DEVELOPER
11582 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11583 {
11584 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11586 }
11587 #endif
11588
11589 return GetQuantity() * GetConfigWeightModified();
11590 }
11591 else if (HasEnergyManager())
11592 {
11593 #ifdef DEVELOPER
11594 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11595 {
11596 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11597 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11598 }
11599 #endif
11600 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11601 }
11602 else
11603 {
11604 #ifdef DEVELOPER
11605 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11606 {
11607 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11608 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11609 }
11610 #endif
11611 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11612 }
11613 }
11614
11617 {
11618 int item_count = 0;
11620
11621 if (GetInventory().GetCargo() != NULL)
11622 {
11623 item_count = GetInventory().GetCargo().GetItemCount();
11624 }
11625
11626 for (int i = 0; i < GetInventory().AttachmentCount(); i++)
11627 {
11628 Class.CastTo(item,GetInventory().GetAttachmentFromIndex(i));
11629 if (item)
11630 item_count += item.GetNumberOfItems();
11631 }
11632 return item_count;
11633 }
11634
11637 {
11638 float weight = 0;
11639 float wetness = 1;
11640 if (include_wetness)
11643 {
11644 weight = wetness * m_ConfigWeight;
11645 }
11647 {
11648 weight = 1;
11649 }
11650 return weight;
11651 }
11652
11653
11654
11656 {
11657 if ((
GetGame().IsServer() || !
GetGame().IsMultiplayer()) && GetInventory())
11658 {
11659 GameInventory inv = GetInventory();
11660 array<EntityAI> items = new array<EntityAI>;
11662 for (int i = 0; i < items.Count(); i++)
11663 {
11665 if (item)
11666 {
11668 }
11669 }
11670 }
11671 }
11672
11673
11674
11675
11677 {
11678 float energy = 0;
11679 if (HasEnergyManager())
11680 {
11681 energy = GetCompEM().GetEnergy();
11682 }
11683 return energy;
11684 }
11685
11686
11688 {
11689 super.OnEnergyConsumed();
11690
11692 }
11693
11695 {
11696 super.OnEnergyAdded();
11697
11699 }
11700
11701
11703 {
11704 if (
GetGame().IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11705 {
11707 {
11708 float energy_0to1 = GetCompEM().GetEnergy0To1();
11710 }
11711 }
11712 }
11713
11714
11716 {
11717 return ConfigGetFloat("heatIsolation");
11718 }
11719
11721 {
11723 }
11724
11726 {
11727 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11728 if (
GetGame().ConfigIsExisting(paramPath))
11730
11731 return 0.0;
11732 }
11733
11735 {
11736 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
11737 if (
GetGame().ConfigIsExisting(paramPath))
11739
11740 return 0.0;
11741 }
11742
11743 override void SetWet(
float value,
bool allow_client =
false)
11744 {
11745 if (!IsServerCheck(allow_client))
11746 return;
11747
11750
11752
11753 m_VarWet = Math.Clamp(value, min, max);
11754
11756 {
11759 }
11760 }
11761
11762 override void AddWet(
float value)
11763 {
11765 }
11766
11768 {
11770 }
11771
11773 {
11775 }
11776
11778 {
11780 }
11781
11783 {
11785 }
11786
11788 {
11790 }
11791
11792 override void OnWetChanged(
float newVal,
float oldVal)
11793 {
11796 if (newLevel != oldLevel)
11797 {
11799 }
11800 }
11801
11803 {
11804 SetWeightDirty();
11805 }
11806
11808 {
11809 return GetWetLevelInternal(
m_VarWet);
11810 }
11811
11812
11813
11815 {
11817 }
11818
11820 {
11822 }
11823
11825 {
11827 }
11828
11830 {
11832 }
11833
11834
11835
11837 {
11838 if (ConfigIsExisting("itemModelLength"))
11839 {
11840 return ConfigGetFloat("itemModelLength");
11841 }
11842 return 0;
11843 }
11844
11846 {
11847 if (ConfigIsExisting("itemAttachOffset"))
11848 {
11849 return ConfigGetFloat("itemAttachOffset");
11850 }
11851 return 0;
11852 }
11853
11854 override void SetCleanness(
int value,
bool allow_client =
false)
11855 {
11856 if (!IsServerCheck(allow_client))
11857 return;
11858
11860
11862
11865 }
11866
11868 {
11870 }
11871
11873 {
11874 return true;
11875 }
11876
11877
11878
11879
11881 {
11883 }
11884
11886 {
11888 }
11889
11890
11891
11892
11893 override void SetColor(
int r,
int g,
int b,
int a)
11894 {
11900 }
11902 override void GetColor(out
int r,out
int g,out
int b,out
int a)
11903 {
11908 }
11909
11911 {
11913 }
11914
11917 {
11918 int r,g,b,a;
11920 r = r/255;
11921 g = g/255;
11922 b = b/255;
11923 a = a/255;
11924 return MiscGameplayFunctions.GetColorString(r, g, b, a);
11925 }
11926
11927
11928
11929 override void SetLiquidType(
int value,
bool allow_client =
false)
11930 {
11931 if (!IsServerCheck(allow_client))
11932 return;
11933
11938 }
11939
11941 {
11942 return ConfigGetInt("varLiquidTypeInit");
11943 }
11944
11946 {
11948 }
11949
11951 {
11953 SetFrozen(false);
11954 }
11955
11958 {
11959 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11960 }
11961
11962
11965 {
11966 PlayerBase nplayer;
11967 if (PlayerBase.CastTo(nplayer, player))
11968 {
11970
11971 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
11972 }
11973 }
11974
11975
11978 {
11979 PlayerBase nplayer;
11980 if (PlayerBase.CastTo(nplayer,player))
11981 {
11982
11983 nplayer.SetEnableQuickBarEntityShortcut(this,false);
11984
11985 }
11986
11987
11988 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
11989
11990
11991 if (HasEnergyManager())
11992 {
11993 GetCompEM().UpdatePlugState();
11994 }
11995 }
11996
11997
11999 {
12000 super.OnPlacementStarted(player);
12001
12003 }
12004
12005 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12006 {
12008 {
12009 m_AdminLog.OnPlacementComplete(player,
this);
12010 }
12011
12012 super.OnPlacementComplete(player, position, orientation);
12013 }
12014
12015
12016
12017
12018
12020 {
12022 {
12023 return true;
12024 }
12025 else
12026 {
12027 return false;
12028 }
12029 }
12030
12031
12033 {
12035 {
12037 }
12038 }
12039
12040
12042 {
12044 }
12045
12047 {
12049 }
12050
12051 override void InsertAgent(
int agent,
float count = 1)
12052 {
12053 if (count < 1)
12054 return;
12055
12057 }
12058
12061 {
12063 }
12064
12065
12067 {
12069 }
12070
12071
12072
12073
12074
12075
12076
12077
12078
12079
12080
12081
12082
12083
12084
12085
12086
12087
12088
12089
12090
12091
12092
12093
12094
12095
12096
12097
12098
12099
12100
12101
12102
12103
12104
12105
12106
12107
12108
12109
12110
12111
12113 {
12115 return false;
12116 return true;
12117 }
12118
12120 {
12121
12123 }
12124
12125
12128 {
12129 super.CheckForRoofLimited(timeTresholdMS);
12130
12132 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12133 {
12134 m_PreviousRoofTestTime = time;
12135 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12136 }
12137 }
12138
12139
12141 {
12143 {
12144 return 0;
12145 }
12146
12147 if (GetInventory().GetAttachmentSlotsCount() != 0)
12148 {
12149 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12150 if (filter)
12151 return filter.GetProtectionLevel(type, false, system);
12152 else
12153 return 0;
12154 }
12155
12156 string subclassPath, entryName;
12157
12158 switch (type)
12159 {
12161 entryName = "biological";
12162 break;
12164 entryName = "chemical";
12165 break;
12166 default:
12167 entryName = "biological";
12168 break;
12169 }
12170
12171 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12172
12174 }
12175
12176
12177
12180 {
12181 if (!IsMagazine())
12183
12185 }
12186
12187
12188
12189
12190
12195 {
12196 return true;
12197 }
12198
12200 {
12202 }
12203
12204
12205
12206
12207
12209 {
12210 if (parent)
12211 {
12212 if (parent.IsInherited(DayZInfected))
12213 return true;
12214
12215 if (!parent.IsRuined())
12216 return true;
12217 }
12218
12219 return true;
12220 }
12221
12223 {
12224 if (!super.CanPutAsAttachment(parent))
12225 {
12226 return false;
12227 }
12228
12229 if (!IsRuined() && !parent.IsRuined())
12230 {
12231 return true;
12232 }
12233
12234 return false;
12235 }
12236
12238 {
12239
12240
12241
12242
12243 return super.CanReceiveItemIntoCargo(item);
12244 }
12245
12247 {
12248
12249
12250
12251
12252 GameInventory attachmentInv = attachment.GetInventory();
12254 {
12255 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12256 return false;
12257 }
12258
12259 InventoryLocation loc = new InventoryLocation();
12260 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12261 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12262 return false;
12263
12264 return super.CanReceiveAttachment(attachment, slotId);
12265 }
12266
12268 {
12269 if (!super.CanReleaseAttachment(attachment))
12270 return false;
12271
12272 return GetInventory().AreChildrenAccessible();
12273 }
12274
12275
12276
12277
12278
12279
12280
12281
12282
12283
12284
12285
12286
12287
12288
12289
12290
12291
12292
12293
12294
12296 {
12297 int id = muzzle_owner.GetMuzzleID();
12298 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12299
12300 if (WPOF_array)
12301 {
12302 for (int i = 0; i < WPOF_array.Count(); i++)
12303 {
12304 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12305
12306 if (WPOF)
12307 {
12308 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12309 }
12310 }
12311 }
12312 }
12313
12314
12316 {
12317 int id = muzzle_owner.GetMuzzleID();
12319
12320 if (WPOBE_array)
12321 {
12322 for (int i = 0; i < WPOBE_array.Count(); i++)
12323 {
12324 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12325
12326 if (WPOBE)
12327 {
12328 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12329 }
12330 }
12331 }
12332 }
12333
12334
12336 {
12337 int id = muzzle_owner.GetMuzzleID();
12338 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12339
12340 if (WPOOH_array)
12341 {
12342 for (int i = 0; i < WPOOH_array.Count(); i++)
12343 {
12344 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12345
12346 if (WPOOH)
12347 {
12348 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12349 }
12350 }
12351 }
12352 }
12353
12354
12356 {
12357 int id = muzzle_owner.GetMuzzleID();
12358 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12359
12360 if (WPOOH_array)
12361 {
12362 for (int i = 0; i < WPOOH_array.Count(); i++)
12363 {
12364 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12365
12366 if (WPOOH)
12367 {
12368 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12369 }
12370 }
12371 }
12372 }
12373
12374
12376 {
12377 int id = muzzle_owner.GetMuzzleID();
12378 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12379
12380 if (WPOOH_array)
12381 {
12382 for (int i = 0; i < WPOOH_array.Count(); i++)
12383 {
12384 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12385
12386 if (WPOOH)
12387 {
12388 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12389 }
12390 }
12391 }
12392 }
12393
12394
12395
12397 {
12399 {
12400 return true;
12401 }
12402
12403 return false;
12404 }
12405
12407 {
12409 {
12410 return true;
12411 }
12412
12413 return false;
12414 }
12415
12417 {
12419 {
12420 return true;
12421 }
12422
12423 return false;
12424 }
12425
12427 {
12428 return false;
12429 }
12430
12433 {
12434 return UATimeSpent.DEFAULT_DEPLOY;
12435 }
12436
12437
12438
12439
12441 {
12443 SetSynchDirty();
12444 }
12445
12447 {
12449 }
12450
12451
12453 {
12454 return false;
12455 }
12456
12459 {
12460 string att_type = "None";
12461
12462 if (ConfigIsExisting("soundAttType"))
12463 {
12464 att_type = ConfigGetString("soundAttType");
12465 }
12466
12468 }
12469
12471 {
12473 }
12474
12475
12476
12477
12478
12484
12486 {
12489
12491 }
12492
12493
12495 {
12497 return;
12498
12500
12503
12506
12507 SoundParameters params = new SoundParameters();
12511 }
12512
12513
12515 {
12517 return;
12518
12520 SetSynchDirty();
12521
12524 }
12525
12526
12528 {
12530 return;
12531
12533 SetSynchDirty();
12534
12537 }
12538
12540 {
12542 }
12543
12545 {
12547 }
12548
12551 {
12552 if (!
GetGame().IsDedicatedServer())
12553 {
12554 if (ConfigIsExisting("attachSoundSet"))
12555 {
12556 string cfg_path = "";
12557 string soundset = "";
12558 string type_name =
GetType();
12559
12562 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
12563 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
12564
12565 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
12566 {
12567 for (int i = 0; i < cfg_soundset_array.Count(); i++)
12568 {
12569 if (cfg_slot_array[i] == slot_type)
12570 {
12571 soundset = cfg_soundset_array[i];
12572 break;
12573 }
12574 }
12575 }
12576
12577 if (soundset != "")
12578 {
12579 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
12581 }
12582 }
12583 }
12584 }
12585
12587 {
12588
12589 }
12590
12591 void OnApply(PlayerBase player);
12592
12594 {
12595 return 1.0;
12596 };
12597
12599 {
12601 }
12602
12604 {
12606 }
12607
12609
12611 {
12612 SetDynamicPhysicsLifeTime(0.01);
12614 }
12615
12617 {
12618 array<string> zone_names = new array<string>;
12619 GetDamageZones(zone_names);
12620 for (int i = 0; i < zone_names.Count(); i++)
12621 {
12622 SetHealthMax(zone_names.Get(i),"Health");
12623 }
12624 SetHealthMax("","Health");
12625 }
12626
12629 {
12630 float global_health = GetHealth01("","Health");
12631 array<string> zones = new array<string>;
12632 GetDamageZones(zones);
12633
12634 for (int i = 0; i < zones.Count(); i++)
12635 {
12636 SetHealth01(zones.Get(i),"Health",global_health);
12637 }
12638 }
12639
12642 {
12643 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12644 }
12645
12647 {
12648 if (!hasRootAsPlayer)
12649 {
12650 if (refParentIB)
12651 {
12652
12653 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12654 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12655
12656 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12657 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12658
12661 }
12662 else
12663 {
12664
12667 }
12668 }
12669 }
12670
12672 {
12674 {
12675 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12676 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12677 {
12678 float heatPermCoef = 1.0;
12680 while (ent)
12681 {
12682 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12683 ent = ent.GetHierarchyParent();
12684 }
12685
12686 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12687 }
12688 }
12689 }
12690
12692 {
12693
12694 EntityAI parent = GetHierarchyParent();
12695 if (!parent)
12696 {
12697 hasParent = false;
12698 hasRootAsPlayer = false;
12699 }
12700 else
12701 {
12702 hasParent = true;
12703 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12704 refParentIB =
ItemBase.Cast(parent);
12705 }
12706 }
12707
12708 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12709 {
12710
12711 }
12712
12714 {
12715
12716 return false;
12717 }
12718
12720 {
12721
12722
12723 return false;
12724 }
12725
12727 {
12728
12729 return false;
12730 }
12731
12734 {
12735 return !GetIsFrozen() &&
IsOpen();
12736 }
12737
12739 {
12740 bool hasParent = false, hasRootAsPlayer = false;
12742
12743 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12744 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12745
12746 if (wwtu || foodDecay)
12747 {
12751
12752 if (processWetness || processTemperature || processDecay)
12753 {
12755
12756 if (processWetness)
12757 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12758
12759 if (processTemperature)
12761
12762 if (processDecay)
12763 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12764 }
12765 }
12766 }
12767
12770 {
12772 }
12773
12775 {
12778
12779 return super.GetTemperatureFreezeThreshold();
12780 }
12781
12783 {
12786
12787 return super.GetTemperatureThawThreshold();
12788 }
12789
12791 {
12794
12795 return super.GetItemOverheatThreshold();
12796 }
12797
12799 {
12801 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
12802
12803 return super.GetTemperatureFreezeTime();
12804 }
12805
12807 {
12809 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
12810
12811 return super.GetTemperatureThawTime();
12812 }
12813
12818
12820 {
12821 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
12822 }
12823
12825 {
12826 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
12827 }
12828
12831 {
12833 }
12834
12836 {
12838 }
12839
12841 {
12843 }
12844
12847 {
12848 return null;
12849 }
12850
12853 {
12854 return false;
12855 }
12856
12858 {
12860 {
12863 if (!trg)
12864 {
12866 explosive = this;
12867 }
12868
12869 explosive.PairRemote(trg);
12871
12872 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
12873 trg.SetPersistentPairID(persistentID);
12874 explosive.SetPersistentPairID(persistentID);
12875
12876 return true;
12877 }
12878 return false;
12879 }
12880
12883 {
12884 float ret = 1.0;
12887 ret *= GetHealth01();
12888
12889 return ret;
12890 }
12891
12892 #ifdef DEVELOPER
12893 override void SetDebugItem()
12894 {
12895 super.SetDebugItem();
12896 _itemBase = this;
12897 }
12898
12900 {
12901 string text = super.GetDebugText();
12902
12904 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
12905
12906 return text;
12907 }
12908 #endif
12909
12911 {
12912 return true;
12913 }
12914
12916
12918
12920 {
12923 }
12924
12925
12933
12949}
12950
12952{
12954 if (entity)
12955 {
12956 bool is_item = entity.IsInherited(
ItemBase);
12957 if (is_item && full_quantity)
12958 {
12961 }
12962 }
12963 else
12964 {
12966 return NULL;
12967 }
12968 return entity;
12969}
12970
12972{
12973 if (item)
12974 {
12975 if (health > 0)
12976 item.SetHealth("", "", health);
12977
12978 if (item.CanHaveTemperature())
12979 {
12981 if (item.CanFreeze())
12982 item.SetFrozen(false);
12983 }
12984
12985 if (item.HasEnergyManager())
12986 {
12987 if (quantity >= 0)
12988 {
12989 item.GetCompEM().SetEnergy0To1(quantity);
12990 }
12991 else
12992 {
12994 }
12995 }
12996 else if (item.IsMagazine())
12997 {
12998 Magazine mag = Magazine.Cast(item);
12999 if (quantity >= 0)
13000 {
13001 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13002 }
13003 else
13004 {
13006 }
13007
13008 }
13009 else
13010 {
13011 if (quantity >= 0)
13012 {
13013 item.SetQuantityNormalized(quantity, false);
13014 }
13015 else
13016 {
13018 }
13019
13020 }
13021 }
13022}
13023
13024#ifdef DEVELOPER
13026#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
Open
Implementations only.
override void EEOnCECreate()
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 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)
bool ShouldSplitQuantity(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)
override 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...
bool m_HideSelectionsBySlot
bool IsOverheatingEffectActive()
void SetIsBeingPlaced(bool is_being_placed)
int GetLiquidContainerMask()
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
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()
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)
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 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 void GizmoSelectObject(Object object)
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 native void GizmoSelectPhysics(Physics physics)
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
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 string GetFoldSoundset()
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 string GetLoopFoldSoundset()
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.