8313{
8315 {
8316 return true;
8317 }
8318};
8319
8321{
8322
8323};
8324
8325
8326
8328{
8332
8334
8337
8338
8339
8340
8341
8350
8356
8361
8366
8387 protected bool m_IsResultOfSplit
8388
8390
8395
8396
8397
8399
8403
8404
8405
8407
8410
8411
8412
8418
8419
8427
8430
8431
8433
8434
8436
8437
8442
8443
8448
8450
8451
8453
8454
8456 {
8461
8462 if (!
g_Game.IsDedicatedServer())
8463 {
8465 {
8467
8469 {
8471 }
8472 }
8473
8476 }
8477
8478 m_OldLocation = null;
8479
8481 {
8483 }
8484
8485 if (ConfigIsExisting("headSelectionsToHide"))
8486 {
8489 }
8490
8492 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
8493 {
8495 }
8496
8498
8499 m_IsResultOfSplit = false;
8500
8502 }
8503
8505 {
8506 super.InitItemVariables();
8507
8513 m_Count = ConfigGetInt(
"count");
8514
8517
8522
8525
8530
8542
8546
8547
8550 if (ConfigIsExisting("canBeSplit"))
8551 {
8554 }
8555
8557 if (ConfigIsExisting("itemBehaviour"))
8559
8560
8563 RegisterNetSyncVariableInt("m_VarLiquidType");
8564 RegisterNetSyncVariableInt("m_Cleanness",0,1);
8565
8566 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
8567 RegisterNetSyncVariableFloat("m_ImpactSpeed");
8568 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
8569
8570 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
8571 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
8572 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
8573 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
8574
8575 RegisterNetSyncVariableBool("m_IsBeingPlaced");
8576 RegisterNetSyncVariableBool("m_IsTakeable");
8577 RegisterNetSyncVariableBool("m_IsHologram");
8578
8581 {
8584 RegisterNetSyncVariableInt(
"m_SoundSyncSlotID",
int.
MIN,
int.
MAX);
8585 }
8586
8588
8590 if (ConfigIsExisting("temperaturePerQuantityWeight"))
8592
8594 }
8595
8597 {
8599 }
8600
8602 {
8605 {
8610 }
8611 }
8612
8613 override void GetActions(
typename action_input_type, out array<ActionBase_Basic> actions)
8614 {
8616 {
8619 }
8620
8622 }
8623
8625 {
8631 }
8632
8634
8636 {
8638
8639 if (!action)
8640 {
8641 Debug.LogError(
"Action " + actionName +
" dosn't exist!");
8642 return;
8643 }
8644
8646 if (!ai)
8647 {
8649 return;
8650 }
8651
8653 if (!action_array)
8654 {
8655 action_array = new array<ActionBase_Basic>;
8657 }
8658 if (LogManager.IsActionLogEnable())
8659 {
8660 Debug.ActionLog(action.ToString() +
" -> " + ai,
this.ToString() ,
"n/a",
"Add action");
8661 }
8662
8663 if (action_array.Find(action) != -1)
8664 {
8665 Debug.Log(
"Action " + action.Type() +
" already added to " +
this +
", skipping!");
8666 }
8667 else
8668 {
8669 action_array.Insert(action);
8670 }
8671 }
8672
8674 {
8675 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
8676 ActionBase action = player.GetActionManager().GetAction(actionName);
8679
8680 if (action_array)
8681 {
8682 action_array.RemoveItem(action);
8683 }
8684 }
8685
8686
8687
8689 {
8690 ActionOverrideData overrideData = new ActionOverrideData();
8694
8696 if (!actionMap)
8697 {
8700 }
8701
8702 actionMap.Insert(this.
Type(), overrideData);
8703
8704 }
8705
8707
8709
8710
8712 {
8715
8718
8719 string config_to_search = "CfgVehicles";
8720 string muzzle_owner_config;
8721
8723 {
8724 if (IsInherited(Weapon))
8725 config_to_search = "CfgWeapons";
8726
8727 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8728
8729 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
8730
8731 int config_OnFire_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnFire_class);
8732
8733 if (config_OnFire_subclass_count > 0)
8734 {
8735 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
8736
8737 for (int i = 0; i < config_OnFire_subclass_count; i++)
8738 {
8739 string particle_class = "";
8740 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
8741 string config_OnFire_entry = config_OnFire_class + particle_class;
8742 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
8743 WPOF_array.Insert(WPOF);
8744 }
8745
8746
8748 }
8749 }
8750
8752 {
8753 config_to_search = "CfgWeapons";
8754 muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8755
8756 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
8757
8758 int config_OnBulletCasingEject_count =
g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
8759
8760 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
8761 {
8762 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
8763
8764 for (i = 0; i < config_OnBulletCasingEject_count; i++)
8765 {
8766 string particle_class2 = "";
8767 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
8768 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
8769 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
8770 WPOBE_array.Insert(WPOBE);
8771 }
8772
8773
8775 }
8776 }
8777 }
8778
8779
8781 {
8784
8786 {
8787 string config_to_search = "CfgVehicles";
8788
8789 if (IsInherited(Weapon))
8790 config_to_search = "CfgWeapons";
8791
8792 string muzzle_owner_config = config_to_search +
" " +
GetType() +
" ";
8793 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
8794
8795 if (
g_Game.ConfigIsExisting(config_OnOverheating_class))
8796 {
8797
8799
8801 {
8803 string error =
"Error reading config " +
GetType() +
">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
8805 return;
8806 }
8807
8810
8811
8812
8813 int config_OnOverheating_subclass_count =
g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
8814 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
8815
8816 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
8817 {
8818 string particle_class = "";
8819 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
8820 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
8821 int entry_type =
g_Game.ConfigGetType(config_OnOverheating_entry);
8822
8823 if (entry_type == CT_CLASS)
8824 {
8825 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
8826 WPOOH_array.Insert(WPOF);
8827 }
8828 }
8829
8830
8832 }
8833 }
8834 }
8835
8837 {
8839 }
8840
8842 {
8844 {
8846
8849
8852
8853 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8854 }
8855 }
8856
8858 {
8860 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8861
8863 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8864
8866 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8867
8869 {
8871 }
8872 }
8873
8875 {
8877 }
8878
8880 {
8883 else
8885
8887 {
8890 }
8891 else
8892 {
8895
8898 }
8899
8901 }
8902
8904 {
8906 ItemBase.PlayOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8907 }
8908
8910 {
8912 ItemBase.UpdateOverheatingParticles(
this, ammoType,
this, suppressor,
"CfgWeapons");
8914 }
8915
8917 {
8919 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
8920 }
8921
8923 {
8926
8927 OverheatingParticle OP = new OverheatingParticle();
8932
8934 }
8935
8937 {
8940
8941 return -1;
8942 }
8943
8945 {
8947 {
8950
8951 for (int i = count; i > 0; --i)
8952 {
8953 int id = i - 1;
8956
8959
8960 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
8961 {
8962 if (p)
8963 {
8966 }
8967 }
8968 }
8969 }
8970 }
8971
8973 {
8975 {
8977 {
8978 int id = i - 1;
8980
8981 if (OP)
8982 {
8984
8985 if (p)
8986 {
8988 }
8989
8990 delete OP;
8991 }
8992 }
8993
8996 }
8997 }
8998
9001 {
9002 return 0.0;
9003 }
9004
9005
9007 {
9008 return 250;
9009 }
9010
9012 {
9013 return 0;
9014 }
9015
9018 {
9020 return true;
9021
9022 return false;
9023 }
9024
9027 {
9030
9032 {
9034 }
9035 else
9036 {
9037
9039 }
9040
9042 }
9043
9050 {
9051 return -1;
9052 }
9053
9054
9055
9056
9058 {
9060 {
9061 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9062 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9063
9064 if (r_index >= 0)
9065 {
9066 InventoryLocation r_il = new InventoryLocation;
9067 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9068
9069 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9072 {
9073 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9074 }
9076 {
9077 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9078 }
9079
9080 }
9081
9082 player.GetHumanInventory().ClearUserReservedLocation(this);
9083 }
9084
9087 }
9088
9089
9090
9091
9093 {
9094 return ItemBase.m_DebugActionsMask;
9095 }
9096
9098 {
9099 return ItemBase.m_DebugActionsMask & mask;
9100 }
9101
9103 {
9104 ItemBase.m_DebugActionsMask = mask;
9105 }
9106
9108 {
9109 ItemBase.m_DebugActionsMask |= mask;
9110 }
9111
9113 {
9114 ItemBase.m_DebugActionsMask &= ~mask;
9115 }
9116
9118 {
9120 {
9122 }
9123 else
9124 {
9126 }
9127 }
9128
9129
9131 {
9132 if (GetEconomyProfile())
9133 {
9134 float q_max = GetEconomyProfile().GetQuantityMax();
9135 if (q_max > 0)
9136 {
9137 float q_min = GetEconomyProfile().GetQuantityMin();
9138 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9139
9141 {
9142 ComponentEnergyManager comp = GetCompEM();
9144 {
9146 }
9147 }
9149 {
9151
9152 }
9153
9154 }
9155 }
9156 }
9157
9160 {
9161 EntityAI parent = GetHierarchyParent();
9162
9163 if (parent)
9164 {
9165 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9166 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9167 parent.GetInventory().SetSlotLock(inventory_location_to_lock.
GetSlot(),
true);
9168 }
9169 }
9170
9173 {
9174 EntityAI parent = GetHierarchyParent();
9175
9176 if (parent)
9177 {
9178 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9179 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9180 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.
GetSlot(),
false);
9181 }
9182 }
9183
9185 {
9186
9187
9188
9189
9191
9193 {
9194 if (ScriptInputUserData.CanStoreInputUserData())
9195 {
9196 ScriptInputUserData ctx = new ScriptInputUserData;
9202 ctx.
Write(use_stack_max);
9205
9207 {
9208 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9209 }
9210 }
9211 }
9212 else if (!
g_Game.IsMultiplayer())
9213 {
9215 }
9216 }
9217
9219 {
9221 }
9222
9224 {
9226 }
9227
9229 {
9231 }
9232
9234 {
9235
9236 return false;
9237 }
9238
9240 {
9241 return false;
9242 }
9243
9247 {
9248 return false;
9249 }
9250
9252 {
9253 return "";
9254 }
9255
9257
9259 {
9260 return false;
9261 }
9262
9264 {
9265 return true;
9266 }
9267
9268
9269
9271 {
9272 return true;
9273 }
9274
9276 {
9277 return true;
9278 }
9279
9281 {
9282 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
9284 }
9285
9287 {
9289 }
9290
9292 {
9294 if (!is_being_placed)
9296 SetSynchDirty();
9297 }
9298
9299
9301
9303 {
9305 }
9306
9308 {
9310 }
9311
9313 {
9314 return 1;
9315 }
9316
9318 {
9319 return false;
9320 }
9321
9323 {
9325 SetSynchDirty();
9326 }
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347
9348
9349
9350
9351
9352
9353
9354
9355
9356
9357
9358
9359
9360
9361
9363 {
9364 super.OnMovedInsideCargo(container);
9365
9366 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9367 }
9368
9369 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
9370 {
9371 super.EEItemLocationChanged(oldLoc, newLoc);
9372
9373 PlayerBase newPlayer = null;
9374 PlayerBase oldPlayer = null;
9375
9376 if (newLoc.GetParent())
9377 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
9378
9379 if (oldLoc.GetParent())
9380 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
9381
9383 {
9384 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
9385
9386 if (rIndex >= 0)
9387 {
9388 InventoryLocation rIl = new InventoryLocation;
9389 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
9390
9391 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
9394 {
9395 rIl.
GetParent().GetOnReleaseLock().Invoke(
this);
9396 }
9398 {
9400 }
9401
9402 }
9403 }
9404
9406 {
9407 if (newPlayer)
9408 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
9409
9410 if (newPlayer == oldPlayer)
9411 {
9412 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
9413 {
9415 {
9416 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
9417 {
9418 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9419 }
9420 }
9421 else
9422 {
9423 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
9424 }
9425 }
9426
9427 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
9428 {
9429 int type = oldLoc.GetType();
9431 {
9432 oldLoc.GetParent().GetOnSetLock().Invoke(this);
9433 }
9435 {
9436 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
9437 }
9438 }
9439 if (!m_OldLocation)
9440 {
9441 m_OldLocation = new InventoryLocation;
9442 }
9443 m_OldLocation.Copy(oldLoc);
9444 }
9445 else
9446 {
9447 if (m_OldLocation)
9448 {
9449 m_OldLocation.Reset();
9450 }
9451 }
9452
9453 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(
this,
"Hands");
9454 }
9455 else
9456 {
9457 if (newPlayer)
9458 {
9459 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
9460 if (resIndex >= 0)
9461 {
9462 InventoryLocation il = new InventoryLocation;
9463 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
9465 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
9468 {
9469 il.
GetParent().GetOnReleaseLock().Invoke(it);
9470 }
9472 {
9474 }
9475
9476 }
9477 }
9479 {
9480
9482 }
9483
9484 if (m_OldLocation)
9485 {
9486 m_OldLocation.Reset();
9487 }
9488 }
9489
9491 {
9492 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
9493 }
9494
9496 {
9497 PluginInventoryRepair.Cast(
GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
9498 }
9499 }
9500
9501 override void EOnContact(IEntity other, Contact extra)
9502 {
9504 {
9505 int liquidType = -1;
9507 if (impactSpeed > 0.0)
9508 {
9510 #ifndef SERVER
9512 #else
9514 SetSynchDirty();
9515 #endif
9517 }
9518 }
9519
9520 #ifdef SERVER
9521 if (GetCompEM() && GetCompEM().IsPlugged())
9522 {
9523 if (GetCompEM().GetCordLength() < vector.Distance(
GetPosition(), GetCompEM().GetEnergySource().
GetPosition()))
9524 GetCompEM().UnplugThis();
9525 }
9526 #endif
9527 }
9528
9530
9532 {
9534 }
9535
9537 {
9538
9539 }
9540
9542 {
9543 super.OnItemLocationChanged(old_owner, new_owner);
9544
9545 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
9546 PlayerBase playerNew = PlayerBase.Cast(new_owner);
9547
9548 if (!relatedPlayer && playerNew)
9549 relatedPlayer = playerNew;
9550
9551 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
9552 {
9554 if (actionMgr)
9555 {
9556 ActionBase currentAction = actionMgr.GetRunningAction();
9557 if (currentAction)
9559 }
9560 }
9561
9562 Man ownerPlayerOld = null;
9563 Man ownerPlayerNew = null;
9564
9565 if (old_owner)
9566 {
9567 if (old_owner.
IsMan())
9568 {
9569 ownerPlayerOld = Man.Cast(old_owner);
9570 }
9571 else
9572 {
9573 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
9574 }
9575 }
9576 else
9577 {
9579 {
9581
9582 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.
GetID())
9583 {
9584 GetCompEM().UnplugThis();
9585 }
9586 }
9587 }
9588
9589 if (new_owner)
9590 {
9591 if (new_owner.
IsMan())
9592 {
9593 ownerPlayerNew = Man.Cast(new_owner);
9594 }
9595 else
9596 {
9597 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
9598 }
9599 }
9600
9601 if (ownerPlayerOld != ownerPlayerNew)
9602 {
9603 if (ownerPlayerOld)
9604 {
9605 array<EntityAI> subItemsExit = new array<EntityAI>;
9607 for (int i = 0; i < subItemsExit.Count(); i++)
9608 {
9611 }
9612 }
9613
9614 if (ownerPlayerNew)
9615 {
9616 array<EntityAI> subItemsEnter = new array<EntityAI>;
9618 for (int j = 0; j < subItemsEnter.Count(); j++)
9619 {
9622 }
9623 }
9624 }
9625 else if (ownerPlayerNew != null)
9626 {
9627 PlayerBase nplayer;
9628 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
9629 {
9630 array<EntityAI> subItemsUpdate = new array<EntityAI>;
9632 for (int k = 0; k < subItemsUpdate.Count(); k++)
9633 {
9635 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
9636 }
9637 }
9638 }
9639
9640 if (old_owner)
9641 old_owner.OnChildItemRemoved(this);
9642 if (new_owner)
9643 new_owner.OnChildItemReceived(this);
9644 }
9645
9646
9648 {
9649 super.EEDelete(parent);
9650 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
9651 if (player)
9652 {
9654
9655 if (player.IsAlive())
9656 {
9657 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9658 if (r_index >= 0)
9659 {
9660 InventoryLocation r_il = new InventoryLocation;
9661 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9662
9663 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9666 {
9667 r_il.
GetParent().GetOnReleaseLock().Invoke(
this);
9668 }
9670 {
9671 r_il.
GetParent().GetOnAttachmentReleaseLock().Invoke(
this, r_il.
GetSlot());
9672 }
9673
9674 }
9675
9676 player.RemoveQuickBarEntityShortcut(this);
9677 }
9678 }
9679 }
9680
9682 {
9683 super.EEKilled(killer);
9684
9687 {
9688 if (
GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
9689 {
9690 if (IsMagazine())
9691 {
9692 if (Magazine.Cast(this).GetAmmoCount() > 0)
9693 {
9695 }
9696 }
9697 else
9698 {
9700 }
9701 }
9702 }
9703 }
9704
9706 {
9707 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
9708
9709 super.OnWasAttached(parent, slot_id);
9710
9713
9716 }
9717
9719 {
9720 super.OnWasDetached(parent, slot_id);
9721
9724
9727 }
9728
9730 {
9731 int idx;
9734
9735 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9736 if (inventory_slots.Count() < 1)
9737 {
9738 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
9739 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
9740 }
9741 else
9742 {
9743 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
9744 }
9745
9746 idx = inventory_slots.Find(slot);
9747 if (idx < 0)
9748 return "";
9749
9750 return attach_types.Get(idx);
9751 }
9752
9754 {
9755 int idx = -1;
9756 string slot;
9757
9760
9761 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
9762 if (inventory_slots.Count() < 1)
9763 {
9764 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
9765 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9766 }
9767 else
9768 {
9769 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
9770 if (detach_types.Count() < 1)
9771 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
9772 }
9773
9774 for (int i = 0; i < inventory_slots.Count(); i++)
9775 {
9776 slot = inventory_slots.Get(i);
9777 }
9778
9779 if (slot != "")
9780 {
9781 if (detach_types.Count() == 1)
9782 idx = 0;
9783 else
9784 idx = inventory_slots.Find(slot);
9785 }
9786 if (idx < 0)
9787 return "";
9788
9789 return detach_types.Get(idx);
9790 }
9791
9793 {
9794
9796
9797
9798 float min_time = 1;
9799 float max_time = 3;
9800 float delay = Math.RandomFloat(min_time, max_time);
9801
9802 explode_timer.Run(delay, this, "DoAmmoExplosion");
9803 }
9804
9806 {
9807 Magazine magazine = Magazine.Cast(this);
9808 int pop_sounds_count = 6;
9809 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
9810
9811
9812 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
9813 string sound_name = pop_sounds[ sound_idx ];
9814 g_Game.CreateSoundOnObject(
this, sound_name, 20,
false);
9815
9816
9817 magazine.ServerAddAmmoCount(-1);
9818
9819
9820 float min_temp_to_explode = 100;
9821
9822 if (magazine.GetAmmoCount() > 0 &&
GetTemperature() >= min_temp_to_explode)
9823 {
9825 }
9826 }
9827
9828
9829 override void EEHitBy(TotalDamageResult damageResult,
int damageType,
EntityAI source,
int component,
string dmgZone,
string ammo, vector modelPos,
float speedCoef)
9830 {
9831 super.EEHitBy(damageResult, damageType, source,
component, dmgZone, ammo, modelPos, speedCoef);
9832
9833 const int CHANCE_DAMAGE_CARGO = 4;
9834 const int CHANCE_DAMAGE_ATTACHMENT = 1;
9835 const int CHANCE_DAMAGE_NOTHING = 2;
9836
9838 {
9839 float dmg = damageResult.
GetDamage(
"",
"Health") * -0.5;
9840 int chances;
9841 int rnd;
9842
9843 if (GetInventory().GetCargo())
9844 {
9845 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9846 rnd = Math.RandomInt(0,chances);
9847
9848 if (rnd < CHANCE_DAMAGE_CARGO)
9849 {
9851 }
9852 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
9853 {
9855 }
9856 }
9857 else
9858 {
9859 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
9860 rnd = Math.RandomInt(0,chances);
9861
9862 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
9863 {
9865 }
9866 }
9867 }
9868 }
9869
9871 {
9872 CargoBase cargo = GetInventory().GetCargo();
9873 if (cargo)
9874 {
9876 if (item_count > 0)
9877 {
9878 int random_pick = Math.RandomInt(0, item_count);
9880 if (!item.IsExplosive())
9881 {
9882 item.AddHealth("","",damage);
9883 return true;
9884 }
9885 }
9886 }
9887 return false;
9888 }
9889
9891 {
9892 GameInventory inventory = GetInventory();
9894 if (attachment_count > 0)
9895 {
9896 int random_pick = Math.RandomInt(0, attachment_count);
9898 if (!attachment.IsExplosive())
9899 {
9900 attachment.AddHealth("","",damage);
9901 return true;
9902 }
9903 }
9904 return false;
9905 }
9906
9908 {
9910 }
9911
9913 {
9915 return GetInventory().CanRemoveEntity();
9916
9917 return false;
9918 }
9919
9921 {
9922
9924 return false;
9925
9926
9928 return false;
9929
9930
9931
9933 if (delta == 0)
9934 return false;
9935
9936
9937 return true;
9938 }
9939
9941 {
9943 {
9944 if (ScriptInputUserData.CanStoreInputUserData())
9945 {
9946 ScriptInputUserData ctx = new ScriptInputUserData;
9951 ctx.
Write(destination_entity);
9955 }
9956 }
9957 else if (!
g_Game.IsMultiplayer())
9958 {
9960 }
9961 }
9962
9964 {
9965 float split_quantity_new;
9969 InventoryLocation loc = new InventoryLocation;
9970
9971 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
9972 {
9974 split_quantity_new = stack_max;
9975 else
9977
9979 {
9980 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
9981 if (new_item)
9982 {
9983 new_item.SetResultOfSplit(true);
9984 MiscGameplayFunctions.TransferItemProperties(this, new_item);
9986 new_item.
SetQuantity(split_quantity_new,
false,
true);
9987 }
9988 }
9989 }
9990 else if (destination_entity && slot_id == -1)
9991 {
9992 if (quantity > stack_max)
9993 split_quantity_new = stack_max;
9994 else
9995 split_quantity_new = quantity;
9996
9998 {
9999 GameInventory destinationInventory = destination_entity.GetInventory();
10001 {
10004 }
10005
10006 if (new_item)
10007 {
10008 new_item.SetResultOfSplit(true);
10009 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10011 new_item.
SetQuantity(split_quantity_new,
false,
true);
10012 }
10013 }
10014 }
10015 else
10016 {
10017 if (stack_max != 0)
10018 {
10020 {
10022 }
10023
10024 if (split_quantity_new == 0)
10025 {
10026 if (!
g_Game.IsMultiplayer())
10027 player.PhysicalPredictiveDropItem(this);
10028 else
10029 player.ServerDropEntity(this);
10030 return;
10031 }
10032
10034 {
10036
10037 if (new_item)
10038 {
10039 new_item.SetResultOfSplit(true);
10040 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10043 new_item.PlaceOnSurface();
10044 }
10045 }
10046 }
10047 }
10048 }
10049
10051 {
10052 float split_quantity_new;
10056 InventoryLocation loc = new InventoryLocation;
10057
10058 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10059 {
10061 split_quantity_new = stack_max;
10062 else
10064
10066 {
10067 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(
this.GetType(), slot_id));
10068 if (new_item)
10069 {
10070 new_item.SetResultOfSplit(true);
10071 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10073 new_item.
SetQuantity(split_quantity_new,
false,
true);
10074 }
10075 }
10076 }
10077 else if (destination_entity && slot_id == -1)
10078 {
10079 if (quantity > stack_max)
10080 split_quantity_new = stack_max;
10081 else
10082 split_quantity_new = quantity;
10083
10085 {
10086 GameInventory destinationInventory = destination_entity.GetInventory();
10088 {
10091 }
10092
10093 if (new_item)
10094 {
10095 new_item.SetResultOfSplit(true);
10096 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10098 new_item.
SetQuantity(split_quantity_new,
false,
true);
10099 }
10100 }
10101 }
10102 else
10103 {
10104 if (stack_max != 0)
10105 {
10107 {
10109 }
10110
10112 {
10114
10115 if (new_item)
10116 {
10117 new_item.SetResultOfSplit(true);
10118 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10121 new_item.PlaceOnSurface();
10122 }
10123 }
10124 }
10125 }
10126 }
10127
10129 {
10131 {
10132 if (ScriptInputUserData.CanStoreInputUserData())
10133 {
10134 ScriptInputUserData ctx = new ScriptInputUserData;
10139 dst.WriteToContext(ctx);
10141 }
10142 }
10143 else if (!
g_Game.IsMultiplayer())
10144 {
10146 }
10147 }
10148
10150 {
10152 {
10153 if (ScriptInputUserData.CanStoreInputUserData())
10154 {
10155 ScriptInputUserData ctx = new ScriptInputUserData;
10160 ctx.
Write(destination_entity);
10166 }
10167 }
10168 else if (!
g_Game.IsMultiplayer())
10169 {
10171 }
10172 }
10173
10175 {
10177 }
10178
10180 {
10182 float split_quantity_new;
10184 if (dst.IsValid())
10185 {
10186 int slot_id = dst.GetSlot();
10188
10189 if (quantity > stack_max)
10190 split_quantity_new = stack_max;
10191 else
10192 split_quantity_new = quantity;
10193
10195 {
10197
10198 if (new_item)
10199 {
10200 new_item.SetResultOfSplit(true);
10201 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10203 new_item.
SetQuantity(split_quantity_new,
false,
true);
10204 }
10205
10206 return new_item;
10207 }
10208 }
10209
10210 return null;
10211 }
10212
10214 {
10216 float split_quantity_new;
10218 if (destination_entity)
10219 {
10221 if (quantity > stackable)
10222 split_quantity_new = stackable;
10223 else
10224 split_quantity_new = quantity;
10225
10227 {
10228 new_item =
ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(
this.GetType(), idx, row, col,
false));
10229 if (new_item)
10230 {
10231 new_item.SetResultOfSplit(true);
10232 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10234 new_item.
SetQuantity(split_quantity_new,
false,
true);
10235 }
10236 }
10237 }
10238 }
10239
10241 {
10243 {
10244 if (ScriptInputUserData.CanStoreInputUserData())
10245 {
10246 ScriptInputUserData ctx = new ScriptInputUserData;
10251 ItemBase destination_entity =
this;
10252 ctx.
Write(destination_entity);
10256 }
10257 }
10258 else if (!
g_Game.IsMultiplayer())
10259 {
10261 }
10262 }
10263
10265 {
10267 float split_quantity_new;
10269 if (player)
10270 {
10272 if (quantity > stackable)
10273 split_quantity_new = stackable;
10274 else
10275 split_quantity_new = quantity;
10276
10278 {
10279 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.
GetType());
10280 new_item =
ItemBase.Cast(in_hands);
10281 if (new_item)
10282 {
10283 new_item.SetResultOfSplit(true);
10284 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10286 new_item.SetQuantity(split_quantity_new, false, true);
10287 }
10288 }
10289 }
10290 }
10291
10293 {
10295 float split_quantity_new = Math.Floor(quantity * 0.5);
10296
10298 return;
10299
10301
10302 if (new_item)
10303 {
10304 if (new_item.GetQuantityMax() < split_quantity_new)
10305 {
10306 split_quantity_new = new_item.GetQuantityMax();
10307 }
10308
10309 new_item.SetResultOfSplit(true);
10310 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10311
10313 {
10316 }
10317 else
10318 {
10320 new_item.
SetQuantity(split_quantity_new,
false,
true);
10321 }
10322 }
10323 }
10324
10326 {
10328 float split_quantity_new = Math.Floor(quantity / 2);
10329
10331 return;
10332
10333 InventoryLocation invloc = new InventoryLocation;
10335
10337 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
10338
10339 if (new_item)
10340 {
10341 if (new_item.GetQuantityMax() < split_quantity_new)
10342 {
10343 split_quantity_new = new_item.GetQuantityMax();
10344 }
10346 {
10349 }
10350 else if (split_quantity_new > 1)
10351 {
10353 new_item.
SetQuantity(split_quantity_new,
false,
true);
10354 }
10355 }
10356 }
10357
10360 {
10361 SetWeightDirty();
10363
10364 if (parent)
10365 parent.OnAttachmentQuantityChangedEx(this, delta);
10366
10368 {
10370 {
10372 }
10374 {
10375 ErrorEx(
"Undefined liquid type quantity changed, please define liquid type first! Using init value.",
ErrorExSeverity.INFO);
10377 }
10378 }
10379 }
10380
10383 {
10384
10385 }
10386
10389 {
10391 }
10392
10394 {
10395 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
10396
10398 {
10399 if (newLevel == GameConstants.STATE_RUINED)
10400 {
10402 EntityAI parent = GetHierarchyParent();
10403 if (parent && parent.IsFireplace())
10404 {
10405 CargoBase cargo = GetInventory().GetCargo();
10406 if (cargo)
10407 {
10409 {
10411 }
10412 }
10413 }
10414 }
10415
10417 {
10418
10420 return;
10421 }
10422
10423 if (
m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
10424 {
10426 }
10427 }
10428 }
10429
10430
10432 {
10433 super.OnRightClick();
10434
10436 {
10438 {
10439 if (ScriptInputUserData.CanStoreInputUserData())
10440 {
10441 EntityAI root = GetHierarchyRoot();
10442 Man playerOwner = GetHierarchyRootPlayer();
10443 InventoryLocation dst = new InventoryLocation;
10444
10445
10446 if (!playerOwner && root && root == this)
10447 {
10449 }
10450 else
10451 {
10452
10453 GetInventory().GetCurrentInventoryLocation(dst);
10455 {
10456 PlayerBase player = PlayerBase.Cast(
g_Game.GetPlayer());
10458 {
10460 }
10461 else
10462 {
10464
10465
10466 if (
g_Game.GetPlayer().GetInventory().HasInventoryReservation(
this, dst))
10467 {
10469 }
10470 else
10471 {
10472 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
10473 }
10474 }
10475 }
10476 }
10477
10478 ScriptInputUserData ctx = new ScriptInputUserData;
10486 }
10487 }
10488 else if (!
g_Game.IsMultiplayer())
10489 {
10491 }
10492 }
10493 }
10494
10496 {
10497 if (root)
10498 {
10499 vector m4[4];
10500 root.GetTransform(m4);
10501 dst.SetGround(this, m4);
10502 }
10503 else
10504 {
10505 GetInventory().GetCurrentInventoryLocation(dst);
10506 }
10507 }
10508
10509 override bool CanBeCombined(
EntityAI other_item,
bool reservation_check =
true,
bool stack_max_limit =
false)
10510 {
10511
10512 if (!other_item ||
GetType() != other_item.GetType() || (
IsFullQuantity() && other_item.GetQuantity() > 0) || other_item ==
this)
10513 return false;
10514
10515 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
10516 return false;
10517
10518
10520 return false;
10521
10522
10523 Magazine mag = Magazine.Cast(this);
10524 if (mag)
10525 {
10526 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
10527 return false;
10528
10529 if (stack_max_limit)
10530 {
10531 Magazine other_mag = Magazine.Cast(other_item);
10532 if (other_item)
10533 {
10534 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
10535 return false;
10536 }
10537
10538 }
10539 }
10540 else
10541 {
10542
10544 return false;
10545
10547 return false;
10548 }
10549
10550 PlayerBase player = null;
10551 if (CastTo(player, GetHierarchyRootPlayer()))
10552 {
10553 if (player.GetInventory().HasAttachment(this))
10554 return false;
10555
10556 if (player.IsItemsToDelete())
10557 return false;
10558 }
10559
10560 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
10561 return false;
10562
10563 int slotID;
10565 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,
slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
10566 return false;
10567
10568 return true;
10569 }
10570
10572 {
10574 }
10575
10577 {
10578 return m_IsResultOfSplit;
10579 }
10580
10582 {
10583 m_IsResultOfSplit = value;
10584 }
10585
10587 {
10589 }
10590
10592 {
10593 float other_item_quantity = other_item.GetQuantity();
10594 float this_free_space;
10595
10597
10599
10600 if (other_item_quantity > this_free_space)
10601 {
10602 return this_free_space;
10603 }
10604 else
10605 {
10606 return other_item_quantity;
10607 }
10608 }
10609
10611 {
10613 }
10614
10616 {
10618 return;
10619
10620 if (!IsMagazine() && other_item)
10621 {
10623 if (quantity_used != 0)
10624 {
10625 float hp1 = GetHealth01("","");
10626 float hp2 = other_item.GetHealth01("","");
10627 float hpResult = ((hp1*
GetQuantity()) + (hp2*quantity_used));
10628 hpResult = hpResult / (
GetQuantity() + quantity_used);
10629
10630 hpResult *= GetMaxHealth();
10631 Math.Round(hpResult);
10632 SetHealth("", "Health", hpResult);
10633
10635 other_item.AddQuantity(-quantity_used);
10636 }
10637 }
10639 }
10640
10642 {
10643 #ifdef SERVER
10644 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
10645 GetHierarchyParent().IncreaseLifetimeUp();
10646 #endif
10647 };
10648
10650 {
10651 PlayerBase p = PlayerBase.Cast(player);
10652
10653 array<int> recipesIds = p.m_Recipes;
10654 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10655 if (moduleRecipesManager)
10656 {
10657 EntityAI itemInHands = player.GetEntityInHands();
10658 moduleRecipesManager.GetValidRecipes(
ItemBase.Cast(
this),
ItemBase.Cast(itemInHands), recipesIds, p);
10659 }
10660
10661 for (int i = 0;i < recipesIds.Count(); i++)
10662 {
10663 int key = recipesIds.Get(i);
10664 string recipeName = moduleRecipesManager.GetRecipeName(key);
10666 }
10667 }
10668
10669
10670 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
10671 {
10672 super.GetDebugActions(outputList);
10673
10674
10680
10681
10686
10691
10692
10696
10697
10699 {
10703 }
10704
10707
10708
10712
10714
10715 InventoryLocation loc = new InventoryLocation();
10716 GetInventory().GetCurrentInventoryLocation(loc);
10718 {
10719 if (Gizmo_IsSupported())
10722 }
10723
10725 }
10726
10727
10728
10729
10731 {
10732 super.OnAction(action_id, player, ctx);
10733
10735 {
10736 switch (action_id)
10737 {
10741 return true;
10745 return true;
10746 }
10747 }
10748
10750 {
10751 switch (action_id)
10752 {
10754 Delete();
10755 return true;
10756 }
10757 }
10758
10759 if (action_id >=
EActions.RECIPES_RANGE_START && action_id <
EActions.RECIPES_RANGE_END)
10760 {
10761 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(
GetPlugin(PluginRecipesManager));
10762 int idWithoutOffset = action_id -
EActions.RECIPES_RANGE_START;
10763 PlayerBase p = PlayerBase.Cast(player);
10764 if (
EActions.RECIPES_RANGE_START < 1000)
10765 {
10766 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
10767 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
10768 }
10769 }
10770 #ifndef SERVER
10771 else if (action_id ==
EActions.WATCH_PLAYER)
10772 {
10773 PluginDeveloper.SetDeveloperItemClientEx(player);
10774 }
10775 #endif
10777 {
10778 if (action_id >=
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id <
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
10779 {
10780 int id = action_id -
EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
10781 OnDebugButtonPressServer(id + 1);
10782 }
10783
10784 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id <
EActions.DEBUG_AGENTS_RANGE_INJECT_END)
10785 {
10786 int agent_id = action_id -
EActions.DEBUG_AGENTS_RANGE_INJECT_START;
10788 }
10789
10790 else if (action_id >=
EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id <
EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
10791 {
10792 int agent_id2 = action_id -
EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
10794 }
10795
10796 else if (action_id ==
EActions.ADD_QUANTITY)
10797 {
10798 if (IsMagazine())
10799 {
10800 Magazine mag = Magazine.Cast(this);
10801 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
10802 }
10803 else
10804 {
10806 }
10807
10808 if (m_EM)
10809 {
10810 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
10811 }
10812
10813 }
10814
10815 else if (action_id ==
EActions.REMOVE_QUANTITY)
10816 {
10817 if (IsMagazine())
10818 {
10819 Magazine mag2 = Magazine.Cast(this);
10820 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
10821 }
10822 else
10823 {
10825 }
10826 if (m_EM)
10827 {
10828 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
10829 }
10830
10831 }
10832
10833 else if (action_id ==
EActions.SET_QUANTITY_0)
10834 {
10836
10837 if (m_EM)
10838 {
10839 m_EM.SetEnergy(0);
10840 }
10841 }
10842
10843 else if (action_id ==
EActions.SET_MAX_QUANTITY)
10844 {
10846
10847 if (m_EM)
10848 {
10849 m_EM.SetEnergy(m_EM.GetEnergyMax());
10850 }
10851 }
10852
10853 else if (action_id ==
EActions.ADD_HEALTH)
10854 {
10855 AddHealth("","",GetMaxHealth("","Health")/5);
10856 }
10857 else if (action_id ==
EActions.REMOVE_HEALTH)
10858 {
10859 AddHealth("","",-GetMaxHealth("","Health")/5);
10860 }
10861 else if (action_id ==
EActions.DESTROY_HEALTH)
10862 {
10863 SetHealth01("","",0);
10864 }
10865 else if (action_id ==
EActions.WATCH_ITEM)
10866 {
10868 mid.RegisterDebugItem(
ItemBase.Cast(
this), PlayerBase.Cast(player));
10869 #ifdef DEVELOPER
10870 SetDebugDeveloper_item(this);
10871 #endif
10872 }
10873
10874 else if (action_id ==
EActions.ADD_TEMPERATURE)
10875 {
10876 AddTemperature(20);
10877
10878 }
10879
10880 else if (action_id ==
EActions.REMOVE_TEMPERATURE)
10881 {
10882 AddTemperature(-20);
10883
10884 }
10885
10886 else if (action_id ==
EActions.FLIP_FROZEN)
10887 {
10888 SetFrozen(!GetIsFrozen());
10889
10890 }
10891
10892 else if (action_id ==
EActions.ADD_WETNESS)
10893 {
10895
10896 }
10897
10898 else if (action_id ==
EActions.REMOVE_WETNESS)
10899 {
10901
10902 }
10903
10904 else if (action_id ==
EActions.LIQUIDTYPE_UP)
10905 {
10908
10909
10910 }
10911
10912 else if (action_id ==
EActions.LIQUIDTYPE_DOWN)
10913 {
10916 }
10917
10918 else if (action_id ==
EActions.MAKE_SPECIAL)
10919 {
10920 auto debugParams = DebugSpawnParams.WithPlayer(player);
10921 OnDebugSpawnEx(debugParams);
10922 }
10923
10924 }
10925
10926
10927 return false;
10928 }
10929
10930
10931
10932
10936
10939
10940
10941
10943 {
10944 return false;
10945 }
10946
10947
10949 {
10950 return true;
10951 }
10952
10953
10955 {
10956 return true;
10957 }
10958
10959
10960
10962 {
10963 string config_path =
string.Format(
"CfgVehicles %1 Food FoodStages",
GetType());
10964 return g_Game.ConfigIsExisting(config_path);
10965 }
10966
10969 {
10970 return null;
10971 }
10972
10974 {
10975 return false;
10976 }
10977
10979 {
10980 return false;
10981 }
10982
10986
10987
10989 {
10990 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10991 return module_repairing.CanRepair(this, item_repair_kit);
10992 }
10993
10994
10995 bool Repair(PlayerBase player,
ItemBase item_repair_kit,
float specialty_weight)
10996 {
10997 PluginRepairing module_repairing = PluginRepairing.Cast(
GetPlugin(PluginRepairing));
10998 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
10999 }
11000
11001
11003 {
11004
11005
11006
11007
11008
11009
11010
11011
11012 return 1;
11013 }
11014
11015
11016
11018 {
11020 }
11021
11022
11023
11025 {
11027 }
11028
11029
11038 {
11039 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11040
11041 if (player)
11042 {
11043 player.MessageStatus(text);
11044 }
11045 }
11046
11047
11056 {
11057 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11058
11059 if (player)
11060 {
11061 player.MessageAction(text);
11062 }
11063 }
11064
11065
11074 {
11075 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11076
11077 if (player)
11078 {
11079 player.MessageFriendly(text);
11080 }
11081 }
11082
11083
11092 {
11093 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11094
11095 if (player)
11096 {
11097 player.MessageImportant(text);
11098 }
11099 }
11100
11102 {
11103 return true;
11104 }
11105
11106
11107 override bool KindOf(
string tag)
11108 {
11109 bool found = false;
11110 string item_name = this.
GetType();
11112 g_Game.ConfigGetTextArray(
"cfgVehicles " + item_name +
" itemInfo", item_tag_array);
11113
11114 int array_size = item_tag_array.Count();
11115 for (int i = 0; i < array_size; i++)
11116 {
11117 if (item_tag_array.Get(i) == tag)
11118 {
11119 found = true;
11120 break;
11121 }
11122 }
11123 return found;
11124 }
11125
11126
11128 {
11129
11130 super.OnRPC(sender, rpc_type,ctx);
11131
11132
11133 switch (rpc_type)
11134 {
11135 #ifndef SERVER
11136 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11137 Param2<bool, string> p = new Param2<bool, string>(false, "");
11138
11140 return;
11141
11142 bool play = p.param1;
11143 string soundSet = p.param2;
11144
11145 if (play)
11146 {
11148 {
11150 {
11152 }
11153 }
11154 else
11155 {
11157 }
11158 }
11159 else
11160 {
11162 }
11163
11164 break;
11165 #endif
11166
11167 }
11168
11170 {
11172 }
11173 }
11174
11175
11176
11177
11179 {
11180 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11181 return plugin.GetID(
name);
11182 }
11183
11185 {
11186 PluginVariables plugin = PluginVariables.Cast(
GetPlugin(PluginVariables));
11187 return plugin.GetName(id);
11188 }
11189
11192 {
11193
11194
11195 int varFlags;
11196 if (!ctx.
Read(varFlags))
11197 return;
11198
11199 if (varFlags & ItemVariableFlags.FLOAT)
11200 {
11202 }
11203 }
11204
11206 {
11207
11208 super.SerializeNumericalVars(floats_out);
11209
11210
11211
11213 {
11215 }
11216
11218 {
11220 }
11221
11223 {
11225 }
11226
11228 {
11233 }
11234
11236 {
11238 }
11239 }
11240
11242 {
11243
11244 super.DeSerializeNumericalVars(floats);
11245
11246
11247 int index = 0;
11248 int mask = Math.Round(floats.Get(index));
11249
11250 index++;
11251
11253 {
11255 {
11257 }
11258 else
11259 {
11260 float quantity = floats.Get(index);
11261 SetQuantity(quantity,
true,
false,
false,
false);
11262 }
11263 index++;
11264 }
11265
11267 {
11268 float wet = floats.Get(index);
11270 index++;
11271 }
11272
11274 {
11275 int liquidtype = Math.Round(floats.Get(index));
11277 index++;
11278 }
11279
11281 {
11283 index++;
11285 index++;
11287 index++;
11289 index++;
11290 }
11291
11293 {
11294 int cleanness = Math.Round(floats.Get(index));
11296 index++;
11297 }
11298 }
11299
11301 {
11302 super.WriteVarsToCTX(ctx);
11303
11304
11306 {
11308 }
11309
11311 {
11313 }
11314
11316 {
11318 }
11319
11321 {
11322 int r,g,b,a;
11328 }
11329
11331 {
11333 }
11334 }
11335
11337 {
11338 if (!super.ReadVarsFromCTX(ctx,version))
11339 return false;
11340
11341 int intValue;
11342 float value;
11343
11344 if (version < 140)
11345 {
11346 if (!ctx.
Read(intValue))
11347 return false;
11348
11349 m_VariablesMask = intValue;
11350 }
11351
11353 {
11354 if (!ctx.
Read(value))
11355 return false;
11356
11358 {
11360 }
11361 else
11362 {
11364 }
11365 }
11366
11367 if (version < 140)
11368 {
11370 {
11371 if (!ctx.
Read(value))
11372 return false;
11373 SetTemperatureDirect(value);
11374 }
11375 }
11376
11378 {
11379 if (!ctx.
Read(value))
11380 return false;
11382 }
11383
11385 {
11386 if (!ctx.
Read(intValue))
11387 return false;
11389 }
11390
11392 {
11393 int r,g,b,a;
11395 return false;
11397 return false;
11399 return false;
11401 return false;
11402
11404 }
11405
11407 {
11408 if (!ctx.
Read(intValue))
11409 return false;
11411 }
11412
11413 if (version >= 138 && version < 140)
11414 {
11416 {
11417 if (!ctx.
Read(intValue))
11418 return false;
11419 SetFrozen(intValue);
11420 }
11421 }
11422
11423 return true;
11424 }
11425
11426
11428 {
11431 {
11433 }
11434
11435 if (!super.OnStoreLoad(ctx, version))
11436 {
11438 return false;
11439 }
11440
11441 if (version >= 114)
11442 {
11443 bool hasQuickBarIndexSaved;
11444
11445 if (!ctx.
Read(hasQuickBarIndexSaved))
11446 {
11448 return false;
11449 }
11450
11451 if (hasQuickBarIndexSaved)
11452 {
11453 int itmQBIndex;
11454
11455
11456 if (!ctx.
Read(itmQBIndex))
11457 {
11459 return false;
11460 }
11461
11462 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
11463 if (itmQBIndex != -1 && parentPlayer)
11464 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
11465 }
11466 }
11467 else
11468 {
11469
11470 PlayerBase player;
11471 int itemQBIndex;
11472 if (version ==
int.
MAX)
11473 {
11474 if (!ctx.
Read(itemQBIndex))
11475 {
11477 return false;
11478 }
11479 }
11480 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
11481 {
11482
11483 if (!ctx.
Read(itemQBIndex))
11484 {
11486 return false;
11487 }
11488 if (itemQBIndex != -1 && player)
11489 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
11490 }
11491 }
11492
11493 if (version < 140)
11494 {
11495
11496 if (!LoadVariables(ctx, version))
11497 {
11499 return false;
11500 }
11501 }
11502
11503
11505 {
11507 return false;
11508 }
11509 if (version >= 132)
11510 {
11512 if (raib)
11513 {
11515 {
11517 return false;
11518 }
11519 }
11520 }
11521
11523 return true;
11524 }
11525
11526
11527
11529 {
11530 super.OnStoreSave(ctx);
11531
11532 PlayerBase player;
11533 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
11534 {
11536
11537 int itemQBIndex = -1;
11538 itemQBIndex = player.FindQuickBarEntityIndex(this);
11539 ctx.
Write(itemQBIndex);
11540 }
11541 else
11542 {
11544 }
11545
11547
11549 if (raib)
11550 {
11552 }
11553 }
11554
11555
11557 {
11558 super.AfterStoreLoad();
11559
11561 {
11563 }
11564
11566 {
11569 }
11570 }
11571
11573 {
11574 super.EEOnAfterLoad();
11575
11577 {
11579 }
11580
11583 }
11584
11586 {
11587 return false;
11588 }
11589
11590
11591
11593 {
11595 {
11596 #ifdef PLATFORM_CONSOLE
11597
11599 {
11601 if (menu)
11602 {
11604 }
11605 }
11606 #endif
11607 }
11608
11610 {
11613 }
11614
11616 {
11617 SetWeightDirty();
11619 }
11621 {
11624 }
11625
11627 {
11630
11633 }
11635 {
11639 }
11640
11641 super.OnVariablesSynchronized();
11642 }
11643
11644
11645
11647 override bool SetQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false,
bool allow_client =
false,
bool clamp_to_stack_max =
true)
11648 {
11649 if (!IsServerCheck(allow_client))
11650 return false;
11651
11653 return false;
11654
11657
11658 if (value <= (min + 0.001))
11659 value = min;
11660
11661 if (value == min)
11662 {
11663 if (destroy_config)
11664 {
11665 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
11666 if (dstr)
11667 {
11669 this.Delete();
11670 return true;
11671 }
11672 }
11673 else if (destroy_forced)
11674 {
11676 this.Delete();
11677 return true;
11678 }
11679
11681 }
11682
11685
11687 {
11688 EntityAI parent = GetHierarchyRoot();
11689 InventoryLocation iLoc = new InventoryLocation();
11690 GetInventory().GetCurrentInventoryLocation(iLoc);
11692 {
11693 int iLocSlot = iLoc.
GetSlot();
11695 {
11697 }
11699 {
11701 }
11702 }
11703 }
11704
11706 {
11708
11709 if (delta)
11711 }
11712
11714
11715 return false;
11716 }
11717
11718
11720 bool AddQuantity(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11721 {
11723 }
11724
11726 {
11729 }
11730
11732 {
11735 }
11736
11738 override void SetQuantityNormalized(
float value,
bool destroy_config =
true,
bool destroy_forced =
false)
11739 {
11740 float value_clamped = Math.Clamp(value, 0, 1);
11742 SetQuantity(result, destroy_config, destroy_forced);
11743 }
11744
11745
11748 {
11750 }
11751
11753 {
11755 }
11756
11757
11758
11759
11760
11761
11762
11763
11764
11765
11767 {
11768 int slot = -1;
11769 GameInventory inventory = GetInventory();
11770 if (inventory)
11771 {
11772 InventoryLocation il = new InventoryLocation;
11775 }
11776
11778 }
11779
11781 {
11782 float quantity_max = 0;
11783
11785 {
11786 if (attSlotID != -1)
11787 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
11788
11789 if (quantity_max <= 0)
11791 }
11792
11793 if (quantity_max <= 0)
11795
11796 return quantity_max;
11797 }
11798
11800 {
11802 }
11803
11805 {
11807 }
11808
11809
11811 {
11813 }
11814
11816 {
11818 }
11819
11821 {
11823 }
11824
11825
11827 {
11828
11829 float weightEx = GetWeightEx();
11830 float special = GetInventoryAndCargoWeight();
11831 return weightEx - special;
11832 }
11833
11834
11836 {
11838 }
11839
11841 {
11843 {
11844 #ifdef DEVELOPER
11845 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11846 {
11847 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
11849 }
11850 #endif
11851
11852 return GetQuantity() * GetConfigWeightModified();
11853 }
11854 else if (HasEnergyManager())
11855 {
11856 #ifdef DEVELOPER
11857 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11858 {
11859 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
11860 data2.
SetCalcDetails(
"TIB2: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " + GetCompEM().
GetEnergy()+
"(energy) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit)");
11861 }
11862 #endif
11863 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
11864 }
11865 else
11866 {
11867 #ifdef DEVELOPER
11868 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
11869 {
11870 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
11871 data3.
SetCalcDetails(
"TIB3: "+super.GetWeightSpecialized(forceRecalc)+
"(contents weight) + " + GetConfigWeightModifiedDebugText() +
" + " +
GetQuantity()+
"(quantity) * " + ConfigGetFloat(
"weightPerQuantityUnit") +
"(weightPerQuantityUnit))");
11872 }
11873 #endif
11874 return super.GetWeightSpecialized(forceRecalc) + (
GetQuantity() * ConfigGetFloat(
"weightPerQuantityUnit")) + GetConfigWeightModified();
11875 }
11876 }
11877
11880 {
11881 int item_count = 0;
11883
11884 GameInventory inventory = GetInventory();
11885 CargoBase cargo = inventory.
GetCargo();
11886 if (cargo != NULL)
11887 {
11889 }
11890
11892 for (int i = 0; i < nAttachments; ++i)
11893 {
11895 if (item)
11896 item_count += item.GetNumberOfItems();
11897 }
11898 return item_count;
11899 }
11900
11903 {
11904 float weight = 0;
11905 float wetness = 1;
11906 if (include_wetness)
11909 {
11910 weight = wetness * m_ConfigWeight;
11911 }
11913 {
11914 weight = 1;
11915 }
11916 return weight;
11917 }
11918
11919
11920
11922 {
11923 GameInventory inventory = GetInventory();
11924 if ((
g_Game.IsServer() || !
g_Game.IsMultiplayer()) && inventory)
11925 {
11926 array<EntityAI> items = new array<EntityAI>;
11928 for (int i = 0; i < items.Count(); ++i)
11929 {
11931 if (item)
11932 {
11933 g_Game.ObjectDelete(item);
11934 }
11935 }
11936 }
11937 }
11938
11939
11940
11941
11943 {
11944 float energy = 0;
11945 if (HasEnergyManager())
11946 {
11947 energy = GetCompEM().GetEnergy();
11948 }
11949 return energy;
11950 }
11951
11952
11954 {
11955 super.OnEnergyConsumed();
11956
11958 }
11959
11961 {
11962 super.OnEnergyAdded();
11963
11965 }
11966
11967
11969 {
11970 if (
g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
11971 {
11973 {
11974 float energy_0to1 = GetCompEM().GetEnergy0To1();
11976 }
11977 }
11978 }
11979
11980
11982 {
11983 return ConfigGetFloat("heatIsolation");
11984 }
11985
11987 {
11989 }
11990
11992 {
11993 string paramPath =
string.Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Drying %2",
GetType(), pIncrementName);
11994 if (
g_Game.ConfigIsExisting(paramPath))
11995 return g_Game.ConfigGetFloat(paramPath);
11996
11997 return 0.0;
11998 }
11999
12001 {
12002 string paramPath =
string.
Format(
"CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2",
GetType(), pIncrementName);
12003 if (
g_Game.ConfigIsExisting(paramPath))
12004 return g_Game.ConfigGetFloat(paramPath);
12005
12006 return 0.0;
12007 }
12008
12009 override void SetWet(
float value,
bool allow_client =
false)
12010 {
12011 if (!IsServerCheck(allow_client))
12012 return;
12013
12016
12018
12019 m_VarWet = Math.Clamp(value, min, max);
12020
12022 {
12025 }
12026 }
12027
12028 override void AddWet(
float value)
12029 {
12031 }
12032
12034 {
12036 }
12037
12039 {
12041 }
12042
12044 {
12046 }
12047
12049 {
12051 }
12052
12054 {
12056 }
12057
12058 override void OnWetChanged(
float newVal,
float oldVal)
12059 {
12062 if (newLevel != oldLevel)
12063 {
12065 }
12066 }
12067
12069 {
12070 SetWeightDirty();
12071 }
12072
12074 {
12075 return GetWetLevelInternal(
m_VarWet);
12076 }
12077
12078
12079
12081 {
12083 }
12084
12086 {
12088 }
12089
12091 {
12093 }
12094
12096 {
12098 }
12099
12100
12101
12103 {
12104 if (ConfigIsExisting("itemModelLength"))
12105 {
12106 return ConfigGetFloat("itemModelLength");
12107 }
12108 return 0;
12109 }
12110
12112 {
12113 if (ConfigIsExisting("itemAttachOffset"))
12114 {
12115 return ConfigGetFloat("itemAttachOffset");
12116 }
12117 return 0;
12118 }
12119
12120 override void SetCleanness(
int value,
bool allow_client =
false)
12121 {
12122 if (!IsServerCheck(allow_client))
12123 return;
12124
12126
12128
12131 }
12132
12134 {
12136 }
12137
12139 {
12140 return true;
12141 }
12142
12143
12144
12145
12147 {
12149 }
12150
12152 {
12154 }
12155
12156
12157
12158
12159 override void SetColor(
int r,
int g,
int b,
int a)
12160 {
12166 }
12168 override void GetColor(out
int r,out
int g,out
int b,out
int a)
12169 {
12174 }
12175
12177 {
12179 }
12180
12183 {
12184 int r,g,b,a;
12186 r = r/255;
12187 g = g/255;
12188 b = b/255;
12189 a = a/255;
12190 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12191 }
12192
12193
12194
12195 override void SetLiquidType(
int value,
bool allow_client =
false)
12196 {
12197 if (!IsServerCheck(allow_client))
12198 return;
12199
12204 }
12205
12207 {
12208 return ConfigGetInt("varLiquidTypeInit");
12209 }
12210
12212 {
12214 }
12215
12217 {
12219 SetFrozen(false);
12220 }
12221
12224 {
12225 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12226 }
12227
12228
12231 {
12232 PlayerBase nplayer;
12233 if (PlayerBase.CastTo(nplayer, player))
12234 {
12236 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12237 }
12238 }
12239
12240
12243 {
12244 PlayerBase nplayer;
12245 if (PlayerBase.CastTo(nplayer,player))
12246 {
12247 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12248 }
12249
12250 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12251
12252 if (HasEnergyManager())
12253 {
12254 GetCompEM().UpdatePlugState();
12255 }
12256 }
12257
12258
12260 {
12261 super.OnPlacementStarted(player);
12262
12264 }
12265
12266 override void OnPlacementComplete(Man player, vector position =
"0 0 0", vector orientation =
"0 0 0")
12267 {
12269 {
12270 m_AdminLog.OnPlacementComplete(player,
this);
12271 }
12272
12273 super.OnPlacementComplete(player, position, orientation);
12274 }
12275
12276
12277
12278
12279
12281 {
12283 {
12284 return true;
12285 }
12286 else
12287 {
12288 return false;
12289 }
12290 }
12291
12292
12294 {
12296 {
12298 }
12299 }
12300
12301
12303 {
12305 }
12306
12308 {
12310 }
12311
12312 override void InsertAgent(
int agent,
float count = 1)
12313 {
12314 if (count < 1)
12315 return;
12316
12318 }
12319
12322 {
12324 }
12325
12326
12328 {
12330 }
12331
12332
12333
12334
12335
12336
12337
12338
12339
12340
12341
12342
12343
12344
12345
12346
12347
12348
12349
12350
12351
12352
12353
12354
12355
12356
12357
12358
12359
12360
12361
12362
12363
12364
12365
12366
12367
12368
12369
12370
12371
12372
12374 {
12376 return false;
12377 return true;
12378 }
12379
12381 {
12382
12384 }
12385
12386
12389 {
12390 super.CheckForRoofLimited(timeTresholdMS);
12391
12392 float time =
g_Game.GetTime();
12393 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
12394 {
12395 m_PreviousRoofTestTime = time;
12396 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
12397 }
12398 }
12399
12400
12402 {
12404 {
12405 return 0;
12406 }
12407
12408 if (GetInventory().GetAttachmentSlotsCount() != 0)
12409 {
12410 ItemBase filter =
ItemBase.Cast(FindAttachmentBySlotName(
"GasMaskFilter"));
12411 if (filter)
12412 return filter.GetProtectionLevel(type, false, system);
12413 else
12414 return 0;
12415 }
12416
12417 string subclassPath, entryName;
12418
12419 switch (type)
12420 {
12422 entryName = "biological";
12423 break;
12425 entryName = "chemical";
12426 break;
12427 default:
12428 entryName = "biological";
12429 break;
12430 }
12431
12432 subclassPath =
"CfgVehicles " + this.
GetType() +
" Protection ";
12433
12434 return g_Game.ConfigGetFloat(subclassPath + entryName);
12435 }
12436
12437
12438
12441 {
12442 if (!IsMagazine())
12444
12446 }
12447
12448
12449
12450
12451
12456 {
12457 return true;
12458 }
12459
12461 {
12463 }
12464
12465
12466
12467
12468
12470 {
12471 if (parent)
12472 {
12473 if (parent.IsInherited(DayZInfected))
12474 return true;
12475
12476 if (!parent.IsRuined())
12477 return true;
12478 }
12479
12480 return true;
12481 }
12482
12484 {
12485 if (!super.CanPutAsAttachment(parent))
12486 {
12487 return false;
12488 }
12489
12490 if (!IsRuined() && !parent.IsRuined())
12491 {
12492 return true;
12493 }
12494
12495 return false;
12496 }
12497
12499 {
12500
12501
12502
12503
12504 return super.CanReceiveItemIntoCargo(item);
12505 }
12506
12508 {
12509
12510
12511
12512
12513 GameInventory attachmentInv = attachment.GetInventory();
12515 {
12516 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
12517 return false;
12518 }
12519
12520 InventoryLocation loc = new InventoryLocation();
12521 attachment.GetInventory().GetCurrentInventoryLocation(loc);
12522 if (loc && loc.
IsValid() && !GetInventory().AreChildrenAccessible())
12523 return false;
12524
12525 return super.CanReceiveAttachment(attachment, slotId);
12526 }
12527
12529 {
12530 if (!super.CanReleaseAttachment(attachment))
12531 return false;
12532
12533 return GetInventory().AreChildrenAccessible();
12534 }
12535
12536
12537
12538
12539
12540
12541
12542
12543
12544
12545
12546
12547
12548
12549
12550
12551
12552
12553
12554
12555
12557 {
12558 int id = muzzle_owner.GetMuzzleID();
12559 array<ref WeaponParticlesOnFire> WPOF_array =
m_OnFireEffect.Get(
id);
12560
12561 if (WPOF_array)
12562 {
12563 for (int i = 0; i < WPOF_array.Count(); i++)
12564 {
12565 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
12566
12567 if (WPOF)
12568 {
12569 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
12570 }
12571 }
12572 }
12573 }
12574
12575
12577 {
12578 int id = muzzle_owner.GetMuzzleID();
12580
12581 if (WPOBE_array)
12582 {
12583 for (int i = 0; i < WPOBE_array.Count(); i++)
12584 {
12585 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
12586
12587 if (WPOBE)
12588 {
12589 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12590 }
12591 }
12592 }
12593 }
12594
12595
12597 {
12598 int id = muzzle_owner.GetMuzzleID();
12599 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12600
12601 if (WPOOH_array)
12602 {
12603 for (int i = 0; i < WPOOH_array.Count(); i++)
12604 {
12605 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12606
12607 if (WPOOH)
12608 {
12609 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
12610 }
12611 }
12612 }
12613 }
12614
12615
12617 {
12618 int id = muzzle_owner.GetMuzzleID();
12619 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12620
12621 if (WPOOH_array)
12622 {
12623 for (int i = 0; i < WPOOH_array.Count(); i++)
12624 {
12625 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12626
12627 if (WPOOH)
12628 {
12629 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12630 }
12631 }
12632 }
12633 }
12634
12635
12637 {
12638 int id = muzzle_owner.GetMuzzleID();
12639 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
12640
12641 if (WPOOH_array)
12642 {
12643 for (int i = 0; i < WPOOH_array.Count(); i++)
12644 {
12645 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
12646
12647 if (WPOOH)
12648 {
12649 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
12650 }
12651 }
12652 }
12653 }
12654
12655
12656
12658 {
12660 {
12661 return true;
12662 }
12663
12664 return false;
12665 }
12666
12668 {
12670 {
12671 return true;
12672 }
12673
12674 return false;
12675 }
12676
12678 {
12680 {
12681 return true;
12682 }
12683
12684 return false;
12685 }
12686
12688 {
12689 return false;
12690 }
12691
12694 {
12695 return UATimeSpent.DEFAULT_DEPLOY;
12696 }
12697
12698
12699
12700
12702 {
12704 SetSynchDirty();
12705 }
12706
12708 {
12710 }
12711
12712
12714 {
12715 return false;
12716 }
12717
12720 {
12721 string att_type = "None";
12722
12723 if (ConfigIsExisting("soundAttType"))
12724 {
12725 att_type = ConfigGetString("soundAttType");
12726 }
12727
12729 }
12730
12732 {
12734 }
12735
12736
12737
12738
12739
12745
12747 {
12750
12752 }
12753
12754
12756 {
12758 return;
12759
12761
12764
12767
12768 SoundParameters params = new SoundParameters();
12772 }
12773
12774
12776 {
12778 {
12781
12782 SetSynchDirty();
12783
12786 }
12787 }
12788
12790 {
12792 }
12793
12794
12796 {
12798 return;
12799
12801 SetSynchDirty();
12802
12805 }
12806
12808 {
12811 }
12812
12814 {
12816 }
12817
12818 void OnApply(PlayerBase player);
12819
12821 {
12822 return 1.0;
12823 };
12824
12826 {
12828 }
12829
12831 {
12833 }
12834
12836
12838 {
12839 SetDynamicPhysicsLifeTime(0.01);
12841 }
12842
12844 {
12845 array<string> zone_names = new array<string>;
12846 GetDamageZones(zone_names);
12847 for (int i = 0; i < zone_names.Count(); i++)
12848 {
12849 SetHealthMax(zone_names.Get(i),"Health");
12850 }
12851 SetHealthMax("","Health");
12852 }
12853
12856 {
12857 float global_health = GetHealth01("","Health");
12858 array<string> zones = new array<string>;
12859 GetDamageZones(zones);
12860
12861 for (int i = 0; i < zones.Count(); i++)
12862 {
12863 SetHealth01(zones.Get(i),"Health",global_health);
12864 }
12865 }
12866
12869 {
12870 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
12871 }
12872
12874 {
12875 if (!hasRootAsPlayer)
12876 {
12877 if (refParentIB)
12878 {
12879
12880 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (
m_VarWet <
m_VarWetMax))
12881 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
12882
12883 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (
m_VarWet <
m_VarWetMax))
12884 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
12885
12888 }
12889 else
12890 {
12891
12894 }
12895 }
12896 }
12897
12899 {
12901 {
12902 float target =
g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(
this);
12903 if (
GetTemperature() != target || !IsFreezeThawProgressFinished())
12904 {
12905 float heatPermCoef = 1.0;
12907 while (ent)
12908 {
12909 heatPermCoef *= ent.GetHeatPermeabilityCoef();
12910 ent = ent.GetHierarchyParent();
12911 }
12912
12913 SetTemperatureEx(
new TemperatureDataInterpolated(target,
ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
12914 }
12915 }
12916 }
12917
12919 {
12920
12921 EntityAI parent = GetHierarchyParent();
12922 if (!parent)
12923 {
12924 hasParent = false;
12925 hasRootAsPlayer = false;
12926 }
12927 else
12928 {
12929 hasParent = true;
12930 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
12931 refParentIB =
ItemBase.Cast(parent);
12932 }
12933 }
12934
12935 protected void ProcessDecay(
float delta,
bool hasRootAsPlayer)
12936 {
12937
12938 }
12939
12941 {
12942
12943 return false;
12944 }
12945
12947 {
12948
12949
12950 return false;
12951 }
12952
12954 {
12955
12956 return false;
12957 }
12958
12961 {
12962 return !GetIsFrozen() &&
IsOpen();
12963 }
12964
12966 {
12967 bool hasParent = false, hasRootAsPlayer = false;
12969
12970 bool wwtu =
g_Game.IsWorldWetTempUpdateEnabled();
12971 bool foodDecay =
g_Game.IsFoodDecayEnabled();
12972
12973 if (wwtu || foodDecay)
12974 {
12978
12979 if (processWetness || processTemperature || processDecay)
12980 {
12982
12983 if (processWetness)
12984 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
12985
12986 if (processTemperature)
12988
12989 if (processDecay)
12990 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
12991 }
12992 }
12993 }
12994
12997 {
12999 }
13000
13002 {
13005
13006 return super.GetTemperatureFreezeThreshold();
13007 }
13008
13010 {
13013
13014 return super.GetTemperatureThawThreshold();
13015 }
13016
13018 {
13021
13022 return super.GetItemOverheatThreshold();
13023 }
13024
13026 {
13028 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),
GetQuantityNormalized());
13029
13030 return super.GetTemperatureFreezeTime();
13031 }
13032
13034 {
13036 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),
GetQuantityNormalized());
13037
13038 return super.GetTemperatureThawTime();
13039 }
13040
13045
13047 {
13048 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13049 }
13050
13052 {
13053 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13054 }
13055
13058 {
13060 }
13061
13063 {
13065 }
13066
13068 {
13070 }
13071
13074 {
13075 return null;
13076 }
13077
13080 {
13081 return false;
13082 }
13083
13085 {
13087 {
13090 if (!trg)
13091 {
13093 explosive = this;
13094 }
13095
13096 explosive.PairRemote(trg);
13098
13099 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13100 trg.SetPersistentPairID(persistentID);
13101 explosive.SetPersistentPairID(persistentID);
13102
13103 return true;
13104 }
13105 return false;
13106 }
13107
13110 {
13111 float ret = 1.0;
13114 ret *= GetHealth01();
13115
13116 return ret;
13117 }
13118
13119 #ifdef DEVELOPER
13120 override void SetDebugItem()
13121 {
13122 super.SetDebugItem();
13123 _itemBase = this;
13124 }
13125
13127 {
13128 string text = super.GetDebugText();
13129
13131 text +=
string.
Format(
"Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(
this));
13132
13133 return text;
13134 }
13135 #endif
13136
13138 {
13139 return true;
13140 }
13141
13143
13145
13147 {
13150 }
13151
13152
13160
13176
13177 [
Obsolete(
"Use ItemSoundHandler instead")]
13180 {
13181 if (!
g_Game.IsDedicatedServer())
13182 {
13183 if (ConfigIsExisting("attachSoundSet"))
13184 {
13185 string cfg_path = "";
13186 string soundset = "";
13187 string type_name =
GetType();
13188
13191 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13192 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13193
13194 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13195 {
13196 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13197 {
13198 if (cfg_slot_array[i] == slot_type)
13199 {
13200 soundset = cfg_soundset_array[i];
13201 break;
13202 }
13203 }
13204 }
13205
13206 if (soundset != "")
13207 {
13208 EffectSound sound = SEffectManager.PlaySound(soundset,
GetPosition());
13210 }
13211 }
13212 }
13213 }
13214
13216}
13217
13219{
13221 if (entity)
13222 {
13223 bool is_item = entity.IsInherited(
ItemBase);
13224 if (is_item && full_quantity)
13225 {
13228 }
13229 }
13230 else
13231 {
13233 return NULL;
13234 }
13235 return entity;
13236}
13237
13239{
13240 if (item)
13241 {
13242 if (health > 0)
13243 item.SetHealth("", "", health);
13244
13245 if (item.CanHaveTemperature())
13246 {
13248 if (item.CanFreeze())
13249 item.SetFrozen(false);
13250 }
13251
13252 if (item.HasEnergyManager())
13253 {
13254 if (quantity >= 0)
13255 {
13256 item.GetCompEM().SetEnergy0To1(quantity);
13257 }
13258 else
13259 {
13261 }
13262 }
13263 else if (item.IsMagazine())
13264 {
13265 Magazine mag = Magazine.Cast(item);
13266 if (quantity >= 0)
13267 {
13268 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13269 }
13270 else
13271 {
13273 }
13274
13275 }
13276 else
13277 {
13278 if (quantity >= 0)
13279 {
13280 item.SetQuantityNormalized(quantity, false);
13281 }
13282 else
13283 {
13285 }
13286
13287 }
13288 }
13289}
13290
13291#ifdef DEVELOPER
13293#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
bool SetAttachSoundEvent()
bool SetDetachSoundEvent()
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 IsPrepareToDelete()
override bool CanHaveTemperature()
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
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
void StartItemSoundServer(int id, int slotId)
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)
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()
override int GetLiquidType()
void ProcessDecay(float delta, bool hasRootAsPlayer)
override bool IsItemBase()
override bool IsTwoHandedBehaviour()
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
override void OnEnergyAdded()
void AffectLiquidContainerOnFill(int liquid_type, float amount)
from enviro source
void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature)
from other liquid container source
string GetExplosiveTriggerSlotName()
EffectSound m_DeployLoopSoundEx
override void DeSerializeNumericalVars(array< float > floats)
void StopItemDynamicPhysics()
override void SetStoreLoad(bool value)
float GetOverheatingValue()
bool ContainsAgent(int agent_id)
override void AddWet(float value)
override void EOnContact(IEntity other, Contact extra)
void SplitIntoStackMaxHands(PlayerBase player)
void SplitIntoStackMaxHandsClient(PlayerBase player)
ref Timer m_PhysDropTimer
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
override void SetStoreLoadedQuantity(float value)
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
void OnLiquidTypeChanged(int oldType, int newType)
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
void PlayDeployFinishSound()
bool AllowFoodConsumption()
bool m_IsOverheatingEffectActive
int m_LiquidContainerMask
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
override int GetCleanness()
bool PairWithDevice(notnull ItemBase otherDevice)
static void RemoveDebugActionsMask(int mask)
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
void PerformDamageSystemReinit()
override void ClearInventory()
static int m_LastRegisteredWeaponID
ItemBase GetLightSourceItem()
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
override float GetItemOverheatThreshold()
void StopDeployLoopSoundEx()
override void SerializeNumericalVars(array< float > floats_out)
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)
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 EntityAI GetAttachmentFromIndex(int index)
proto native bool GetCurrentInventoryLocation(out notnull InventoryLocation loc)
returns information about current item location
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native CargoBase GetCargo()
cargo
static proto native EntityAI LocationCreateEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new item directly at location
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
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 bool Write(void value_out)
proto bool Read(void value_in)
proto native float GetDamage(string zoneName, string healthType)
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
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
void Obsolete(string msg="")
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
vector GetPosition()
Get the world position of the Effect.
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.