DayZ 1.29
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено

◆ GetProtectionLevel()

float SpawnItemOnLocation::GetProtectionLevel ( int type,
bool consider_filter = false,
int system = 0 )
protected

См. определение в файле ItemBase.c строка 8984

8989{
8990 override bool CanPutAsAttachment(EntityAI parent)
8991 {
8992 return true;
8993 }
8994};
8995
8997{
8998
8999};
9000
9001//const bool QUANTITY_DEBUG_REMOVE_ME = false;
9002
9003class ItemBase extends InventoryItem
9004{
9008
9010
9011 static int m_DebugActionsMask;
9013 // ============================================
9014 // Variable Manipulation System
9015 // ============================================
9016 // Quantity
9017
9018 float m_VarQuantity;
9019 float m_VarQuantityPrev;//for client to know quantity changed during synchronization
9021 int m_VarQuantityMin;
9022 int m_VarQuantityMax;
9023 int m_Count;
9024 float m_VarStackMax;
9025 float m_StoreLoadedQuantity = float.LOWEST;
9026 // Wet
9027 float m_VarWet;
9028 float m_VarWetPrev;//for client to know wetness changed during synchronization
9029 float m_VarWetInit;
9030 float m_VarWetMin;
9031 float m_VarWetMax;
9032 // Cleanness
9033 int m_Cleanness;
9034 int m_CleannessInit;
9035 int m_CleannessMin;
9036 int m_CleannessMax;
9037 // impact sounds
9039 bool m_CanPlayImpactSound = true;
9040 float m_ImpactSpeed;
9042 //
9043 float m_HeatIsolation;
9044 float m_ItemModelLength;
9045 float m_ItemAttachOffset; // Offset length for when the item is attached e.g. to weapon
9047 int m_VarLiquidType;
9048 int m_ItemBehaviour; // -1 = not specified; 0 = heavy item; 1= onehanded item; 2 = twohanded item
9049 int m_QuickBarBonus;
9050 bool m_IsBeingPlaced;
9051 bool m_IsHologram;
9052 bool m_IsTakeable;
9053 bool m_ThrowItemOnDrop;
9056 bool m_FixDamageSystemInit = false; //can be changed on storage version check
9057 bool can_this_be_combined; //Check if item can be combined
9058 bool m_CanThisBeSplit; //Check if item can be split
9059 bool m_IsStoreLoad = false;
9060 bool m_CanShowQuantity;
9061 bool m_HasQuantityBar;
9062 protected bool m_CanBeDigged;
9063 protected bool m_IsResultOfSplit
9064
9065 string m_SoundAttType;
9066 // items color variables
9071 //-------------------------------------------------------
9072
9073 // light source managing
9075
9079
9080 //==============================================
9081 // agent system
9082 private int m_AttachedAgents;
9083
9085 void TransferModifiers(PlayerBase reciever);
9086
9087
9088 // Weapons & suppressors particle effects
9092 ref static map<string, int> m_WeaponTypeToID;
9093 static int m_LastRegisteredWeaponID = 0;
9094
9095 // Overheating effects
9097 float m_OverheatingShots;
9098 ref Timer m_CheckOverheating;
9099 int m_ShotsToStartOverheating = 0; // After these many shots, the overheating effect begins
9100 int m_MaxOverheatingValue = 0; // Limits the number of shots that will be tracked
9101 float m_OverheatingDecayInterval = 1; // Timer's interval for decrementing overheat effect's lifespan
9102 ref array <ref OverheatingParticle> m_OverheatingParticles;
9103
9105 protected bool m_HideSelectionsBySlot;
9106
9107 // Admin Log
9108 PluginAdminLog m_AdminLog;
9109
9110 // misc
9111 ref Timer m_PhysDropTimer;
9112
9113 // Attachment Locking variables
9114 ref array<int> m_CompatibleLocks;
9115 protected int m_LockType;
9116 protected ref EffectSound m_LockingSound;
9117 protected string m_LockSoundSet;
9118
9119 // ItemSoundHandler variables
9120 protected const int ITEM_SOUNDS_MAX = 63; // optimize network synch
9121 protected int m_SoundSyncPlay; // id for sound to play
9122 protected int m_SoundSyncStop; // id for sound to stop
9123 protected int m_SoundSyncSlotID = InventorySlots.INVALID; // slot id for attach/detach sound based on slot
9124
9126
9127 //temperature
9128 private float m_TemperaturePerQuantityWeight;
9129
9130 // -------------------------------------------------------------------------
9131 void ItemBase()
9132 {
9133 SetEventMask(EntityEvent.INIT); // Enable EOnInit event
9137
9138 if (!g_Game.IsDedicatedServer())
9139 {
9140 if (HasMuzzle())
9141 {
9143
9145 {
9147 }
9148 }
9149
9151 m_ActionsInitialize = false;
9152 }
9153
9154 m_OldLocation = null;
9155
9156 if (g_Game.IsServer())
9157 {
9158 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
9159 }
9160
9161 if (ConfigIsExisting("headSelectionsToHide"))
9162 {
9164 ConfigGetTextArray("headSelectionsToHide",m_HeadHidingSelections);
9165 }
9166
9167 m_HideSelectionsBySlot = false;
9168 if (ConfigIsExisting("hideSelectionsByinventorySlot"))
9169 {
9170 m_HideSelectionsBySlot = ConfigGetBool("hideSelectionsByinventorySlot");
9171 }
9172
9173 m_QuickBarBonus = Math.Max(0, ConfigGetInt("quickBarBonus"));
9174
9175 m_IsResultOfSplit = false;
9176
9178 }
9179
9180 override void InitItemVariables()
9181 {
9182 super.InitItemVariables();
9183
9184 m_VarQuantityInit = ConfigGetInt("varQuantityInit");
9185 m_VarQuantity = m_VarQuantityInit;//should be by the CE, this is just a precaution
9186 m_VarQuantityMin = ConfigGetInt("varQuantityMin");
9187 m_VarQuantityMax = ConfigGetInt("varQuantityMax");
9188 m_VarStackMax = ConfigGetFloat("varStackMax");
9189 m_Count = ConfigGetInt("count");
9190
9191 m_CanShowQuantity = ConfigGetBool("quantityShow");
9192 m_HasQuantityBar = ConfigGetBool("quantityBar");
9193
9194 m_CleannessInit = ConfigGetInt("varCleannessInit");
9196 m_CleannessMin = ConfigGetInt("varCleannessMin");
9197 m_CleannessMax = ConfigGetInt("varCleannessMax");
9198
9199 m_WantPlayImpactSound = false;
9200 m_ImpactSpeed = 0.0;
9201
9202 m_VarWetInit = ConfigGetFloat("varWetInit");
9204 m_VarWetMin = ConfigGetFloat("varWetMin");
9205 m_VarWetMax = ConfigGetFloat("varWetMax");
9206
9207 m_LiquidContainerMask = ConfigGetInt("liquidContainerType");
9208 if (IsLiquidContainer() && GetQuantity() != 0)
9210 m_IsBeingPlaced = false;
9211 m_IsHologram = false;
9212 m_IsTakeable = true;
9213 m_CanBeMovedOverride = false;
9217 m_CanBeDigged = ConfigGetBool("canBeDigged");
9218
9219 m_CompatibleLocks = new array<int>();
9220 ConfigGetIntArray("compatibleLocks", m_CompatibleLocks);
9221 m_LockType = ConfigGetInt("lockType");
9222
9223 //Define if item can be split and set ability to be combined accordingly
9224 m_CanThisBeSplit = false;
9225 can_this_be_combined = false;
9226 if (ConfigIsExisting("canBeSplit"))
9227 {
9228 can_this_be_combined = ConfigGetBool("canBeSplit");
9230 }
9231
9232 m_ItemBehaviour = -1;
9233 if (ConfigIsExisting("itemBehaviour"))
9234 m_ItemBehaviour = ConfigGetInt("itemBehaviour");
9235
9236 //RegisterNetSyncVariableInt("m_VariablesMask");
9237 if (HasQuantity()) RegisterNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
9238 RegisterNetSyncVariableFloat("m_VarWet", GetWetMin(), GetWetMax(), 2);
9239 RegisterNetSyncVariableInt("m_VarLiquidType");
9240 RegisterNetSyncVariableInt("m_Cleanness",0,1);
9241
9242 RegisterNetSyncVariableBoolSignal("m_WantPlayImpactSound");
9243 RegisterNetSyncVariableFloat("m_ImpactSpeed");
9244 RegisterNetSyncVariableInt("m_ImpactSoundSurfaceHash");
9245
9246 RegisterNetSyncVariableInt("m_ColorComponentR", 0, 255);
9247 RegisterNetSyncVariableInt("m_ColorComponentG", 0, 255);
9248 RegisterNetSyncVariableInt("m_ColorComponentB", 0, 255);
9249 RegisterNetSyncVariableInt("m_ColorComponentA", 0, 255);
9250
9251 RegisterNetSyncVariableBool("m_IsBeingPlaced");
9252 RegisterNetSyncVariableBool("m_IsTakeable");
9253 RegisterNetSyncVariableBool("m_IsHologram");
9254
9257 {
9258 RegisterNetSyncVariableInt("m_SoundSyncPlay", 0, ITEM_SOUNDS_MAX);
9259 RegisterNetSyncVariableInt("m_SoundSyncStop", 0, ITEM_SOUNDS_MAX);
9260 RegisterNetSyncVariableInt("m_SoundSyncSlotID", int.MIN, int.MAX);
9261 }
9262
9263 m_LockSoundSet = ConfigGetString("lockSoundSet");
9264
9266 if (ConfigIsExisting("temperaturePerQuantityWeight"))
9267 m_TemperaturePerQuantityWeight = ConfigGetFloat("temperaturePerQuantityWeight");
9268
9269 m_SoundSyncSlotID = -1;
9270 }
9271
9272 override int GetQuickBarBonus()
9273 {
9274 return m_QuickBarBonus;
9275 }
9276
9277 void InitializeActions()
9278 {
9280 if (!m_InputActionMap)
9281 {
9283 m_InputActionMap = iam;
9284 SetActions();
9286 }
9287 }
9288
9289 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
9290 {
9292 {
9293 m_ActionsInitialize = true;
9295 }
9296
9297 actions = m_InputActionMap.Get(action_input_type);
9298 }
9299
9300 void SetActions()
9301 {
9302 AddAction(ActionTakeItem);
9303 AddAction(ActionTakeItemToHands);
9304 AddAction(ActionWorldCraft);
9306 AddAction(ActionAttachWithSwitch);
9307 }
9308
9309 void SetActionAnimOverrides(); // Override action animation for specific item
9310
9311 void AddAction(typename actionName)
9312 {
9313 ActionBase action = ActionManagerBase.GetAction(actionName);
9314
9315 if (!action)
9316 {
9317 Debug.LogError("Action " + actionName + " dosn't exist!");
9318 return;
9319 }
9320
9321 typename ai = action.GetInputType();
9322 if (!ai)
9323 {
9324 m_ActionsInitialize = false;
9325 return;
9326 }
9327
9328 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9329 if (!action_array)
9330 {
9331 action_array = new array<ActionBase_Basic>;
9332 m_InputActionMap.Insert(ai, action_array);
9333 }
9334 if (LogManager.IsActionLogEnable())
9335 {
9336 Debug.ActionLog(action.ToString() + " -> " + ai, this.ToString() , "n/a", "Add action");
9337 }
9338
9339 if (action_array.Find(action) != -1)
9340 {
9341 Debug.Log("Action " + action.Type() + " already added to " + this + ", skipping!");
9342 }
9343 else
9344 {
9345 action_array.Insert(action);
9346 }
9347 }
9348
9349 void RemoveAction(typename actionName)
9350 {
9351 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9352 ActionBase action = player.GetActionManager().GetAction(actionName);
9353 typename ai = action.GetInputType();
9354 array<ActionBase_Basic> action_array = m_InputActionMap.Get(ai);
9355
9356 if (action_array)
9357 {
9358 action_array.RemoveItem(action);
9359 }
9360 }
9361
9362 // Allows override of default action command per item, defined in the SetActionAnimOverrides() of the item's class
9363 // Set -1 for params which should stay in default state
9364 void OverrideActionAnimation(typename action, int commandUID, int stanceMask = -1, int commandUIDProne = -1)
9365 {
9366 ActionOverrideData overrideData = new ActionOverrideData();
9367 overrideData.m_CommandUID = commandUID;
9368 overrideData.m_CommandUIDProne = commandUIDProne;
9369 overrideData.m_StanceMask = stanceMask;
9370
9371 TActionAnimOverrideMap actionMap = m_ItemActionOverrides.Get(action);
9372 if (!actionMap) // create new map of action > overidables map
9373 {
9374 actionMap = new TActionAnimOverrideMap();
9375 m_ItemActionOverrides.Insert(action, actionMap);
9376 }
9377
9378 actionMap.Insert(this.Type(), overrideData); // insert item -> overrides
9379
9380 }
9381
9382 void OnItemInHandsPlayerSwimStart(PlayerBase player);
9383
9384 ScriptedLightBase GetLight();
9385
9386 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9387 void LoadParticleConfigOnFire(int id)
9388 {
9389 if (!m_OnFireEffect)
9391
9394
9395 string config_to_search = "CfgVehicles";
9396 string muzzle_owner_config;
9397
9398 if (!m_OnFireEffect.Contains(id))
9399 {
9400 if (IsInherited(Weapon))
9401 config_to_search = "CfgWeapons";
9402
9403 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9404
9405 string config_OnFire_class = muzzle_owner_config + "Particles " + "OnFire ";
9406
9407 int config_OnFire_subclass_count = g_Game.ConfigGetChildrenCount(config_OnFire_class);
9408
9409 if (config_OnFire_subclass_count > 0)
9410 {
9411 array<ref WeaponParticlesOnFire> WPOF_array = new array<ref WeaponParticlesOnFire>;
9412
9413 for (int i = 0; i < config_OnFire_subclass_count; i++)
9414 {
9415 string particle_class = "";
9416 g_Game.ConfigGetChildName(config_OnFire_class, i, particle_class);
9417 string config_OnFire_entry = config_OnFire_class + particle_class;
9418 WeaponParticlesOnFire WPOF = new WeaponParticlesOnFire(this, config_OnFire_entry);
9419 WPOF_array.Insert(WPOF);
9420 }
9421
9422
9423 m_OnFireEffect.Insert(id, WPOF_array);
9424 }
9425 }
9426
9427 if (!m_OnBulletCasingEjectEffect.Contains(id))
9428 {
9429 config_to_search = "CfgWeapons"; // Bullet Eject efect is supported on weapons only.
9430 muzzle_owner_config = config_to_search + " " + GetType() + " ";
9431
9432 string config_OnBulletCasingEject_class = muzzle_owner_config + "Particles " + "OnBulletCasingEject ";
9433
9434 int config_OnBulletCasingEject_count = g_Game.ConfigGetChildrenCount(config_OnBulletCasingEject_class);
9435
9436 if (config_OnBulletCasingEject_count > 0 && IsInherited(Weapon))
9437 {
9438 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = new array<ref WeaponParticlesOnBulletCasingEject>;
9439
9440 for (i = 0; i < config_OnBulletCasingEject_count; i++)
9441 {
9442 string particle_class2 = "";
9443 g_Game.ConfigGetChildName(config_OnBulletCasingEject_class, i, particle_class2);
9444 string config_OnBulletCasingEject_entry = config_OnBulletCasingEject_class + particle_class2;
9445 WeaponParticlesOnBulletCasingEject WPOBE = new WeaponParticlesOnBulletCasingEject(this, config_OnBulletCasingEject_entry);
9446 WPOBE_array.Insert(WPOBE);
9447 }
9448
9449
9450 m_OnBulletCasingEjectEffect.Insert(id, WPOBE_array);
9451 }
9452 }
9453 }
9454
9455 // Loads muzzle flash particle configuration from config and saves it to a map for faster access
9457 {
9460
9461 if (!m_OnOverheatingEffect.Contains(id))
9462 {
9463 string config_to_search = "CfgVehicles";
9464
9465 if (IsInherited(Weapon))
9466 config_to_search = "CfgWeapons";
9467
9468 string muzzle_owner_config = config_to_search + " " + GetType() + " ";
9469 string config_OnOverheating_class = muzzle_owner_config + "Particles " + "OnOverheating ";
9470
9471 if (g_Game.ConfigIsExisting(config_OnOverheating_class))
9472 {
9473
9474 m_ShotsToStartOverheating = g_Game.ConfigGetFloat(config_OnOverheating_class + "shotsToStartOverheating");
9475
9477 {
9478 m_ShotsToStartOverheating = -1; // This prevents futher readings from config for future creations of this item
9479 string error = "Error reading config " + GetType() + ">Particles>OnOverheating - Parameter shotsToStartOverheating is configured wrong or is missing! Its value must be 1 or higher!";
9480 Error(error);
9481 return;
9482 }
9483
9484 m_OverheatingDecayInterval = g_Game.ConfigGetFloat(config_OnOverheating_class + "overheatingDecayInterval");
9485 m_MaxOverheatingValue = g_Game.ConfigGetFloat(config_OnOverheating_class + "maxOverheatingValue");
9486
9487
9488
9489 int config_OnOverheating_subclass_count = g_Game.ConfigGetChildrenCount(config_OnOverheating_class);
9490 array<ref WeaponParticlesOnOverheating> WPOOH_array = new array<ref WeaponParticlesOnOverheating>;
9491
9492 for (int i = 0; i < config_OnOverheating_subclass_count; i++)
9493 {
9494 string particle_class = "";
9495 g_Game.ConfigGetChildName(config_OnOverheating_class, i, particle_class);
9496 string config_OnOverheating_entry = config_OnOverheating_class + particle_class;
9497 int entry_type = g_Game.ConfigGetType(config_OnOverheating_entry);
9498
9499 if (entry_type == CT_CLASS)
9500 {
9501 WeaponParticlesOnOverheating WPOF = new WeaponParticlesOnOverheating(this, config_OnOverheating_entry);
9502 WPOOH_array.Insert(WPOF);
9503 }
9504 }
9505
9506
9507 m_OnOverheatingEffect.Insert(id, WPOOH_array);
9508 }
9509 }
9510 }
9511
9512 float GetOverheatingValue()
9513 {
9514 return m_OverheatingShots;
9515 }
9516
9517 void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
9518 {
9519 if (m_MaxOverheatingValue > 0)
9520 {
9522
9523 if (!m_CheckOverheating)
9525
9527 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9528
9529 CheckOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9530 }
9531 }
9532
9533 void CheckOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9534 {
9536 UpdateOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9537
9539 StartOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9540
9542 StopOverheating(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9543
9545 {
9547 }
9548 }
9549
9551 {
9553 }
9554
9555 void OnOverheatingDecay()
9556 {
9557 if (m_MaxOverheatingValue > 0)
9558 m_OverheatingShots -= 1 + m_OverheatingShots / m_MaxOverheatingValue; // The hotter a barrel is, the faster it needs to cool down.
9559 else
9561
9562 if (m_OverheatingShots <= 0)
9563 {
9566 }
9567 else
9568 {
9569 if (!m_CheckOverheating)
9571
9573 m_CheckOverheating.Run(m_OverheatingDecayInterval, this, "OnOverheatingDecay");
9574 }
9575
9576 CheckOverheating(this, "", this);
9577 }
9578
9579 void StartOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9580 {
9582 ItemBase.PlayOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9583 }
9584
9585 void UpdateOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9586 {
9588 ItemBase.UpdateOverheatingParticles(this, ammoType, this, suppressor, "CfgWeapons");
9590 }
9591
9592 void StopOverheating(ItemBase weapon = null, string ammoType = "", ItemBase muzzle_owner = null, ItemBase suppressor = null, string config_to_search = "")
9593 {
9595 ItemBase.StopOverheatingParticles(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
9596 }
9597
9598 void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
9599 {
9601 m_OverheatingParticles = new array<ref OverheatingParticle>;
9602
9603 OverheatingParticle OP = new OverheatingParticle();
9604 OP.RegisterParticle(p);
9605 OP.SetOverheatingLimitMin(min_heat_coef);
9606 OP.SetOverheatingLimitMax(max_heat_coef);
9607 OP.SetParticleParams(particle_id, parent, local_pos, local_ori);
9608
9609 m_OverheatingParticles.Insert(OP);
9610 }
9611
9612 float GetOverheatingCoef()
9613 {
9614 if (m_MaxOverheatingValue > 0)
9616
9617 return -1;
9618 }
9619
9621 {
9623 {
9624 float overheat_coef = GetOverheatingCoef();
9625 int count = m_OverheatingParticles.Count();
9626
9627 for (int i = count; i > 0; --i)
9628 {
9629 int id = i - 1;
9630 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9631 Particle p = OP.GetParticle();
9632
9633 float overheat_min = OP.GetOverheatingLimitMin();
9634 float overheat_max = OP.GetOverheatingLimitMax();
9635
9636 if (overheat_coef < overheat_min && overheat_coef >= overheat_max)
9637 {
9638 if (p)
9639 {
9640 p.Stop();
9641 OP.RegisterParticle(null);
9642 }
9643 }
9644 }
9645 }
9646 }
9647
9649 {
9651 {
9652 for (int i = m_OverheatingParticles.Count(); i > 0; i--)
9653 {
9654 int id = i - 1;
9655 OverheatingParticle OP = m_OverheatingParticles.Get(id);
9656
9657 if (OP)
9658 {
9659 Particle p = OP.GetParticle();
9660
9661 if (p)
9662 {
9663 p.Stop();
9664 }
9665
9666 delete OP;
9667 }
9668 }
9669
9670 m_OverheatingParticles.Clear();
9672 }
9673 }
9674
9676 float GetInfectionChance(int system = 0, Param param = null)
9677 {
9678 return 0.0;
9679 }
9680
9681
9682 float GetDisinfectQuantity(int system = 0, Param param1 = null)
9683 {
9684 return 250;//default value
9685 }
9686
9687 float GetFilterDamageRatio()
9688 {
9689 return 0;
9690 }
9691
9693 bool HasMuzzle()
9694 {
9695 if (IsInherited(Weapon) || IsInherited(SuppressorBase))
9696 return true;
9697
9698 return false;
9699 }
9700
9702 int GetMuzzleID()
9703 {
9704 if (!m_WeaponTypeToID)
9705 m_WeaponTypeToID = new map<string, int>;
9706
9707 if (m_WeaponTypeToID.Contains(GetType()))
9708 {
9709 return m_WeaponTypeToID.Get(GetType());
9710 }
9711 else
9712 {
9713 // Register new weapon ID
9715 }
9716
9718 }
9719
9726 {
9727 return -1;
9728 }
9729
9730
9731
9732 // -------------------------------------------------------------------------
9733 void ~ItemBase()
9734 {
9735 if (g_Game && g_Game.GetPlayer() && (!g_Game.IsDedicatedServer()))
9736 {
9737 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9738 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
9739
9740 if (r_index >= 0)
9741 {
9742 InventoryLocation r_il = new InventoryLocation;
9743 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
9744
9745 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
9746 int r_type = r_il.GetType();
9747 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
9748 {
9749 r_il.GetParent().GetOnReleaseLock().Invoke(this);
9750 }
9751 else if (r_type == InventoryLocationType.ATTACHMENT)
9752 {
9753 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
9754 }
9755
9756 }
9757
9758 player.GetHumanInventory().ClearUserReservedLocation(this);
9759 }
9760
9761 if (m_LockingSound)
9762 SEffectManager.DestroyEffect(m_LockingSound);
9763 }
9764
9765
9766
9767 // -------------------------------------------------------------------------
9768 static int GetDebugActionsMask()
9769 {
9770 return ItemBase.m_DebugActionsMask;
9771 }
9772
9773 static bool HasDebugActionsMask(int mask)
9774 {
9775 return ItemBase.m_DebugActionsMask & mask;
9776 }
9777
9778 static void SetDebugActionsMask(int mask)
9779 {
9780 ItemBase.m_DebugActionsMask = mask;
9781 }
9782
9783 static void AddDebugActionsMask(int mask)
9784 {
9785 ItemBase.m_DebugActionsMask |= mask;
9786 }
9787
9788 static void RemoveDebugActionsMask(int mask)
9789 {
9790 ItemBase.m_DebugActionsMask &= ~mask;
9791 }
9792
9793 static void ToggleDebugActionsMask(int mask)
9794 {
9795 if (HasDebugActionsMask(mask))
9796 {
9798 }
9799 else
9800 {
9801 AddDebugActionsMask(mask);
9802 }
9803 }
9804
9805 // -------------------------------------------------------------------------
9806 void SetCEBasedQuantity()
9807 {
9808 if (GetEconomyProfile())
9809 {
9810 float q_max = GetEconomyProfile().GetQuantityMax();
9811 if (q_max > 0)
9812 {
9813 float q_min = GetEconomyProfile().GetQuantityMin();
9814 float quantity_randomized = Math.RandomFloatInclusive(q_min, q_max);
9815
9816 if (HasComponent(COMP_TYPE_ENERGY_MANAGER))//more direct access for speed
9817 {
9818 ComponentEnergyManager comp = GetCompEM();
9819 if (comp && (comp.GetEnergyMaxPristine() || comp.GetEnergyAtSpawn()))//checking for a potential for energy, we need to check both values, as both are optional, only when both are set to 0, we know the item can't have energy
9820 {
9821 comp.SetEnergy0To1(quantity_randomized);
9822 }
9823 }
9824 else if (HasQuantity())
9825 {
9826 SetQuantityNormalized(quantity_randomized, false);
9827 //PrintString("<==> Normalized quantity for item: "+ GetType()+", qmin:"+q_min.ToString()+"; qmax:"+q_max.ToString()+";quantity:" +quantity_randomized.ToString());
9828 }
9829
9830 }
9831 }
9832 }
9833
9835 void LockToParent()
9836 {
9837 EntityAI parent = GetHierarchyParent();
9838
9839 if (parent)
9840 {
9841 InventoryLocation inventory_location_to_lock = new InventoryLocation;
9842 GetInventory().GetCurrentInventoryLocation(inventory_location_to_lock);
9843 parent.GetInventory().SetSlotLock(inventory_location_to_lock.GetSlot(), true);
9844 }
9845 }
9846
9848 void UnlockFromParent()
9849 {
9850 EntityAI parent = GetHierarchyParent();
9851
9852 if (parent)
9853 {
9854 InventoryLocation inventory_location_to_unlock = new InventoryLocation;
9855 GetInventory().GetCurrentInventoryLocation(inventory_location_to_unlock);
9856 parent.GetInventory().SetSlotLock(inventory_location_to_unlock.GetSlot(), false);
9857 }
9858 }
9859
9860 override void CombineItemsClient(EntityAI entity2, bool use_stack_max = true)
9861 {
9862 /*
9863 ref Param1<EntityAI> item = new Param1<EntityAI>(entity2);
9864 RPCSingleParam(ERPCs.RPC_ITEM_COMBINE, item, g_Game.GetPlayer());
9865 */
9866 ItemBase item2 = ItemBase.Cast(entity2);
9867
9868 if (g_Game.IsClient())
9869 {
9870 if (ScriptInputUserData.CanStoreInputUserData())
9871 {
9872 ScriptInputUserData ctx = new ScriptInputUserData;
9874 ctx.Write(-1);
9875 ItemBase i1 = this; // @NOTE: workaround for correct serialization
9876 ctx.Write(i1);
9877 ctx.Write(item2);
9878 ctx.Write(use_stack_max);
9879 ctx.Write(-1);
9880 ctx.Send();
9881
9882 if (IsCombineAll(item2, use_stack_max))
9883 {
9884 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(item2,null,GameInventory.c_InventoryReservationTimeoutShortMS);
9885 }
9886 }
9887 }
9888 else if (!g_Game.IsMultiplayer())
9889 {
9890 CombineItems(item2, use_stack_max);
9891 }
9892 }
9893
9894 bool IsLiquidPresent()
9895 {
9896 return (GetLiquidType() != 0 && HasQuantity());
9897 }
9898
9899 bool IsLiquidContainer()
9900 {
9901 return m_LiquidContainerMask != 0;
9902 }
9903
9905 {
9906 return m_LiquidContainerMask;
9907 }
9908
9909 bool IsBloodContainer()
9910 {
9911 //m_LiquidContainerMask & GROUP_LIQUID_BLOOD ???
9912 return false;
9913 }
9914
9915 bool IsNVG()
9916 {
9917 return false;
9918 }
9919
9922 bool IsExplosive()
9923 {
9924 return false;
9925 }
9926
9928 {
9929 return "";
9930 }
9931
9933
9934 bool IsLightSource()
9935 {
9936 return false;
9937 }
9938
9940 {
9941 return true;
9942 }
9943
9944 //--- ACTION CONDITIONS
9945 //direction
9946 bool IsFacingPlayer(PlayerBase player, string selection)
9947 {
9948 return true;
9949 }
9950
9951 bool IsPlayerInside(PlayerBase player, string selection)
9952 {
9953 return true;
9954 }
9955
9956 override bool CanObstruct()
9957 {
9958 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
9959 return !player || !IsPlayerInside(player, "");
9960 }
9961
9962 override bool IsBeingPlaced()
9963 {
9964 return m_IsBeingPlaced;
9965 }
9966
9967 void SetIsBeingPlaced(bool is_being_placed)
9968 {
9969 m_IsBeingPlaced = is_being_placed;
9970 if (!is_being_placed)
9972 SetSynchDirty();
9973 }
9974
9975 //server-side
9976 void OnEndPlacement() {}
9977
9978 override bool IsHologram()
9979 {
9980 return m_IsHologram;
9981 }
9982
9983 bool CanBeDigged()
9984 {
9985 return m_CanBeDigged;
9986 }
9987
9989 {
9990 return 1;
9991 }
9992
9993 bool CanMakeGardenplot()
9994 {
9995 return false;
9996 }
9997
9998 void SetIsHologram(bool is_hologram)
9999 {
10000 m_IsHologram = is_hologram;
10001 SetSynchDirty();
10002 }
10003 /*
10004 protected float GetNutritionalEnergy()
10005 {
10006 Edible_Base edible = Edible_Base.Cast(this);
10007 return edible.GetFoodEnergy();
10008 }
10009
10010 protected float GetNutritionalWaterContent()
10011 {
10012 Edible_Base edible = Edible_Base.Cast(this);
10013 return edible.GetFoodWater();
10014 }
10015
10016 protected float GetNutritionalIndex()
10017 {
10018 Edible_Base edible = Edible_Base.Cast(this);
10019 return edible.GetFoodNutritionalIndex();
10020 }
10021
10022 protected float GetNutritionalFullnessIndex()
10023 {
10024 Edible_Base edible = Edible_Base.Cast(this);
10025 return edible.GetFoodTotalVolume();
10026 }
10027
10028 protected float GetNutritionalToxicity()
10029 {
10030 Edible_Base edible = Edible_Base.Cast(this);
10031 return edible.GetFoodToxicity();
10032
10033 }
10034 */
10035
10036
10037 // -------------------------------------------------------------------------
10038 override void OnMovedInsideCargo(EntityAI container)
10039 {
10040 super.OnMovedInsideCargo(container);
10041
10042 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10043 }
10044
10045 override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10046 {
10047 super.EEItemLocationChanged(oldLoc, newLoc);
10048
10049 PlayerBase newPlayer = null;
10050 PlayerBase oldPlayer = null;
10051
10052 if (newLoc.GetParent())
10053 newPlayer = PlayerBase.Cast(newLoc.GetParent().GetHierarchyRootPlayer());
10054
10055 if (oldLoc.GetParent())
10056 oldPlayer = PlayerBase.Cast(oldLoc.GetParent().GetHierarchyRootPlayer());
10057
10058 if (oldPlayer && oldLoc.GetType() == InventoryLocationType.HANDS)
10059 {
10060 int rIndex = oldPlayer.GetHumanInventory().FindUserReservedLocationIndex(this);
10061
10062 if (rIndex >= 0)
10063 {
10064 InventoryLocation rIl = new InventoryLocation;
10065 oldPlayer.GetHumanInventory().GetUserReservedLocation(rIndex, rIl);
10066
10067 oldPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(rIndex);
10068 int rType = rIl.GetType();
10069 if (rType == InventoryLocationType.CARGO || rType == InventoryLocationType.PROXYCARGO)
10070 {
10071 rIl.GetParent().GetOnReleaseLock().Invoke(this);
10072 }
10073 else if (rType == InventoryLocationType.ATTACHMENT)
10074 {
10075 rIl.GetParent().GetOnAttachmentReleaseLock().Invoke(this, rIl.GetSlot());
10076 }
10077
10078 }
10079 }
10080
10081 if (newLoc.GetType() == InventoryLocationType.HANDS && oldLoc.GetType() != InventoryLocationType.TEMP)
10082 {
10083 if (newPlayer)
10084 newPlayer.ForceStandUpForHeavyItems(newLoc.GetItem());
10085
10086 if (newPlayer == oldPlayer)
10087 {
10088 if (oldLoc.GetParent() && newPlayer.GetHumanInventory().LocationGetEntity(oldLoc) == NULL)
10089 {
10090 if (oldLoc.GetType() == InventoryLocationType.CARGO)
10091 {
10092 if (oldLoc.GetParent().GetInventory().TestAddEntityInCargoExLoc(oldLoc, false, false, false, true, false, false))
10093 {
10094 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10095 }
10096 }
10097 else
10098 {
10099 newPlayer.GetHumanInventory().SetUserReservedLocation(this,oldLoc);
10100 }
10101 }
10102
10103 if (newPlayer.GetHumanInventory().FindUserReservedLocationIndex(this) >= 0)
10104 {
10105 int type = oldLoc.GetType();
10106 if (type == InventoryLocationType.CARGO || type == InventoryLocationType.PROXYCARGO)
10107 {
10108 oldLoc.GetParent().GetOnSetLock().Invoke(this);
10109 }
10110 else if (type == InventoryLocationType.ATTACHMENT)
10111 {
10112 oldLoc.GetParent().GetOnAttachmentSetLock().Invoke(this, oldLoc.GetSlot());
10113 }
10114 }
10115 if (!m_OldLocation)
10116 {
10117 m_OldLocation = new InventoryLocation;
10118 }
10119 m_OldLocation.Copy(oldLoc);
10120 }
10121 else
10122 {
10123 if (m_OldLocation)
10124 {
10125 m_OldLocation.Reset();
10126 }
10127 }
10128
10129 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(this,"Hands");
10130 }
10131 else
10132 {
10133 if (newPlayer)
10134 {
10135 int resIndex = newPlayer.GetHumanInventory().FindCollidingUserReservedLocationIndex(this, newLoc);
10136 if (resIndex >= 0)
10137 {
10138 InventoryLocation il = new InventoryLocation;
10139 newPlayer.GetHumanInventory().GetUserReservedLocation(resIndex, il);
10140 ItemBase it = ItemBase.Cast(il.GetItem());
10141 newPlayer.GetHumanInventory().ClearUserReservedLocationAtIndex(resIndex);
10142 int rel_type = il.GetType();
10143 if (rel_type == InventoryLocationType.CARGO || rel_type == InventoryLocationType.PROXYCARGO)
10144 {
10145 il.GetParent().GetOnReleaseLock().Invoke(it);
10146 }
10147 else if (rel_type == InventoryLocationType.ATTACHMENT)
10148 {
10149 il.GetParent().GetOnAttachmentReleaseLock().Invoke(it, il.GetSlot());
10150 }
10151 //it.GetOnReleaseLock().Invoke(it);
10152 }
10153 }
10154 else if (oldPlayer && newLoc.GetType() == InventoryLocationType.GROUND && m_ThrowItemOnDrop)
10155 {
10156 //ThrowPhysically(oldPlayer, vector.Zero);
10157 m_ThrowItemOnDrop = false;
10158 }
10159
10160 if (m_OldLocation)
10161 {
10162 m_OldLocation.Reset();
10163 }
10164 }
10165
10166 if (oldLoc.GetType() == InventoryLocationType.TEMP)
10167 {
10168 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Remove(oldLoc.GetItem());
10169 }
10170
10171 if (newLoc.GetType() == InventoryLocationType.TEMP)
10172 {
10173 PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair)).Add(oldLoc.GetItem());
10174 }
10175 }
10176
10177 override void EOnContact(IEntity other, Contact extra)
10178 {
10180 {
10181 int liquidType = -1;
10182 float impactSpeed = ProcessImpactSoundEx(other, extra, m_ConfigWeight, m_ImpactSoundSurfaceHash, liquidType);
10183 if (impactSpeed > 0.0)
10184 {
10185 m_ImpactSpeed = impactSpeed;
10186 #ifndef SERVER
10187 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
10188 #else
10189 m_WantPlayImpactSound = true;
10190 SetSynchDirty();
10191 #endif
10192 m_CanPlayImpactSound = (liquidType == -1);// prevents further playing of the sound when the surface is a liquid type
10193 }
10194 }
10195
10196 #ifdef SERVER
10197 if (GetCompEM() && GetCompEM().IsPlugged())
10198 {
10199 if (GetCompEM().GetCordLength() < vector.Distance(GetPosition(), GetCompEM().GetEnergySource().GetPosition()))
10200 GetCompEM().UnplugThis();
10201 }
10202 #endif
10203 }
10204
10205 void RefreshPhysics();
10206
10207 override void OnCreatePhysics()
10208 {
10210 }
10211
10212 override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
10213 {
10214
10215 }
10216 // -------------------------------------------------------------------------
10217 override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
10218 {
10219 super.OnItemLocationChanged(old_owner, new_owner);
10220
10221 PlayerBase relatedPlayer = PlayerBase.Cast(old_owner);
10222 PlayerBase playerNew = PlayerBase.Cast(new_owner);
10223
10224 if (!relatedPlayer && playerNew)
10225 relatedPlayer = playerNew;
10226
10227 if (relatedPlayer && relatedPlayer.GetPerformedActionID() != -1)
10228 {
10229 ActionManagerBase actionMgr = relatedPlayer.GetActionManager();
10230 if (actionMgr)
10231 {
10232 ActionBase currentAction = actionMgr.GetRunningAction();
10233 if (currentAction)
10234 currentAction.OnItemLocationChanged(this);
10235 }
10236 }
10237
10238 Man ownerPlayerOld = null;
10239 Man ownerPlayerNew = null;
10240
10241 if (old_owner)
10242 {
10243 if (old_owner.IsMan())
10244 {
10245 ownerPlayerOld = Man.Cast(old_owner);
10246 }
10247 else
10248 {
10249 ownerPlayerOld = Man.Cast(old_owner.GetHierarchyRootPlayer());
10250 }
10251 }
10252 else
10253 {
10254 if (new_owner && IsElectricAppliance() && GetCompEM() && GetCompEM().IsPlugged())
10255 {
10256 ActionBase action = ActionManagerBase.GetAction(ActionRepositionPluggedItem);
10257
10258 if (!action || !playerNew || playerNew.GetPerformedActionID() != action.GetID())
10259 {
10260 GetCompEM().UnplugThis();
10261 }
10262 }
10263 }
10264
10265 if (new_owner)
10266 {
10267 if (new_owner.IsMan())
10268 {
10269 ownerPlayerNew = Man.Cast(new_owner);
10270 }
10271 else
10272 {
10273 ownerPlayerNew = Man.Cast(new_owner.GetHierarchyRootPlayer());
10274 }
10275 }
10276
10277 if (ownerPlayerOld != ownerPlayerNew)
10278 {
10279 if (ownerPlayerOld)
10280 {
10281 array<EntityAI> subItemsExit = new array<EntityAI>;
10282 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsExit);
10283 for (int i = 0; i < subItemsExit.Count(); i++)
10284 {
10285 ItemBase itemExit = ItemBase.Cast(subItemsExit.Get(i));
10286 itemExit.OnInventoryExit(ownerPlayerOld);
10287 }
10288 }
10289
10290 if (ownerPlayerNew)
10291 {
10292 array<EntityAI> subItemsEnter = new array<EntityAI>;
10293 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsEnter);
10294 for (int j = 0; j < subItemsEnter.Count(); j++)
10295 {
10296 ItemBase itemEnter = ItemBase.Cast(subItemsEnter.Get(j));
10297 itemEnter.OnInventoryEnter(ownerPlayerNew);
10298 }
10299 }
10300 }
10301 else if (ownerPlayerNew != null)
10302 {
10303 PlayerBase nplayer;
10304 if (PlayerBase.CastTo(nplayer, ownerPlayerNew))
10305 {
10306 array<EntityAI> subItemsUpdate = new array<EntityAI>;
10307 GetInventory().EnumerateInventory(InventoryTraversalType.PREORDER,subItemsUpdate);
10308 for (int k = 0; k < subItemsUpdate.Count(); k++)
10309 {
10310 ItemBase itemUpdate = ItemBase.Cast(subItemsUpdate.Get(k));
10311 itemUpdate.UpdateQuickbarShortcutVisibility(nplayer);
10312 }
10313 }
10314 }
10315
10316 if (old_owner)
10317 old_owner.OnChildItemRemoved(this);
10318 if (new_owner)
10319 new_owner.OnChildItemReceived(this);
10320 }
10321
10322 // -------------------------------------------------------------------------------
10323 override void EEDelete(EntityAI parent)
10324 {
10325 super.EEDelete(parent);
10326 PlayerBase player = PlayerBase.Cast(GetHierarchyRootPlayer());
10327 if (player)
10328 {
10329 OnInventoryExit(player);
10330
10331 if (player.IsAlive())
10332 {
10333 int r_index = player.GetHumanInventory().FindUserReservedLocationIndex(this);
10334 if (r_index >= 0)
10335 {
10336 InventoryLocation r_il = new InventoryLocation;
10337 player.GetHumanInventory().GetUserReservedLocation(r_index,r_il);
10338
10339 player.GetHumanInventory().ClearUserReservedLocationAtIndex(r_index);
10340 int r_type = r_il.GetType();
10341 if (r_type == InventoryLocationType.CARGO || r_type == InventoryLocationType.PROXYCARGO)
10342 {
10343 r_il.GetParent().GetOnReleaseLock().Invoke(this);
10344 }
10345 else if (r_type == InventoryLocationType.ATTACHMENT)
10346 {
10347 r_il.GetParent().GetOnAttachmentReleaseLock().Invoke(this, r_il.GetSlot());
10348 }
10349
10350 }
10351
10352 player.RemoveQuickBarEntityShortcut(this);
10353 }
10354 }
10355 }
10356 // -------------------------------------------------------------------------------
10357 override void EEKilled(Object killer)
10358 {
10359 super.EEKilled(killer);
10360
10362 if (killer && killer.IsFireplace() && CanExplodeInFire())
10363 {
10364 if (GetTemperature() >= GameConstants.ITEM_TEMPERATURE_TO_EXPLODE_MIN)
10365 {
10366 if (IsMagazine())
10367 {
10368 if (Magazine.Cast(this).GetAmmoCount() > 0)
10369 {
10370 ExplodeAmmo();
10371 }
10372 }
10373 else
10374 {
10375 Explode(DamageType.EXPLOSION);
10376 }
10377 }
10378 }
10379 }
10380
10381 override void OnWasAttached(EntityAI parent, int slot_id)
10382 {
10383 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(this, {Bolt_Base});
10384
10385 super.OnWasAttached(parent, slot_id);
10386
10387 if (HasQuantity())
10388 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10389
10390 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
10391 StartItemSoundServer(SoundConstants.ITEM_ATTACH, slot_id);
10392 }
10393
10394 override void OnWasDetached(EntityAI parent, int slot_id)
10395 {
10396 super.OnWasDetached(parent, slot_id);
10397
10398 if (HasQuantity())
10399 UpdateNetSyncVariableFloat("m_VarQuantity", GetQuantityMin(), m_VarQuantityMax);
10400
10401 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
10402 StartItemSoundServer(SoundConstants.ITEM_DETACH, slot_id);
10403 }
10404
10405 override string ChangeIntoOnAttach(string slot)
10406 {
10407 int idx;
10408 TStringArray inventory_slots = new TStringArray;
10409 TStringArray attach_types = new TStringArray;
10410
10411 ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10412 if (inventory_slots.Count() < 1) //is string
10413 {
10414 inventory_slots.Insert(ConfigGetString("ChangeInventorySlot"));
10415 attach_types.Insert(ConfigGetString("ChangeIntoOnAttach"));
10416 }
10417 else //is array
10418 {
10419 ConfigGetTextArray("ChangeIntoOnAttach",attach_types);
10420 }
10421
10422 idx = inventory_slots.Find(slot);
10423 if (idx < 0)
10424 return "";
10425
10426 return attach_types.Get(idx);
10427 }
10428
10429 override string ChangeIntoOnDetach()
10430 {
10431 int idx = -1;
10432 string slot;
10433
10434 TStringArray inventory_slots = new TStringArray;
10435 TStringArray detach_types = new TStringArray;
10436
10437 this.ConfigGetTextArray("ChangeInventorySlot",inventory_slots);
10438 if (inventory_slots.Count() < 1) //is string
10439 {
10440 inventory_slots.Insert(this.ConfigGetString("ChangeInventorySlot"));
10441 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10442 }
10443 else //is array
10444 {
10445 this.ConfigGetTextArray("ChangeIntoOnDetach",detach_types);
10446 if (detach_types.Count() < 1)
10447 detach_types.Insert(this.ConfigGetString("ChangeIntoOnDetach"));
10448 }
10449
10450 for (int i = 0; i < inventory_slots.Count(); i++)
10451 {
10452 slot = inventory_slots.Get(i);
10453 }
10454
10455 if (slot != "")
10456 {
10457 if (detach_types.Count() == 1)
10458 idx = 0;
10459 else
10460 idx = inventory_slots.Find(slot);
10461 }
10462 if (idx < 0)
10463 return "";
10464
10465 return detach_types.Get(idx);
10466 }
10467
10468 void ExplodeAmmo()
10469 {
10470 //timer
10471 ref Timer explode_timer = new Timer(CALL_CATEGORY_SYSTEM);
10472
10473 //min/max time
10474 float min_time = 1;
10475 float max_time = 3;
10476 float delay = Math.RandomFloat(min_time, max_time);
10477
10478 explode_timer.Run(delay, this, "DoAmmoExplosion");
10479 }
10480
10481 void DoAmmoExplosion()
10482 {
10483 Magazine magazine = Magazine.Cast(this);
10484 int pop_sounds_count = 6;
10485 string pop_sounds[ 6 ] = { "ammopops_1","ammopops_2","ammopops_3","ammopops_4","ammopops_5","ammopops_6" };
10486
10487 //play sound
10488 int sound_idx = Math.RandomInt(0, pop_sounds_count - 1);
10489 string sound_name = pop_sounds[ sound_idx ];
10490 g_Game.CreateSoundOnObject(this, sound_name, 20, false);
10491
10492 //remove ammo count
10493 magazine.ServerAddAmmoCount(-1);
10494
10495 //if condition then repeat -> ExplodeAmmo
10496 float min_temp_to_explode = 100; //min temperature for item to explode
10497
10498 if (magazine.GetAmmoCount() > 0 && GetTemperature() >= min_temp_to_explode) //TODO ? add check for parent -> fireplace
10499 {
10500 ExplodeAmmo();
10501 }
10502 }
10503
10504 // -------------------------------------------------------------------------------
10505 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
10506 {
10507 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
10508
10509 const int CHANCE_DAMAGE_CARGO = 4;
10510 const int CHANCE_DAMAGE_ATTACHMENT = 1;
10511 const int CHANCE_DAMAGE_NOTHING = 2;
10512
10513 if (IsClothing() || IsContainer() || IsItemTent())
10514 {
10515 float dmg = damageResult.GetDamage("","Health") * -0.5;
10516 int chances;
10517 int rnd;
10518
10519 if (GetInventory().GetCargo())
10520 {
10521 chances = CHANCE_DAMAGE_CARGO + CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10522 rnd = Math.RandomInt(0,chances);
10523
10524 if (rnd < CHANCE_DAMAGE_CARGO)
10525 {
10526 DamageItemInCargo(dmg);
10527 }
10528 else if (rnd < (chances - CHANCE_DAMAGE_NOTHING))
10529 {
10531 }
10532 }
10533 else
10534 {
10535 chances = CHANCE_DAMAGE_ATTACHMENT + CHANCE_DAMAGE_NOTHING;
10536 rnd = Math.RandomInt(0,chances);
10537
10538 if (rnd < CHANCE_DAMAGE_ATTACHMENT)
10539 {
10541 }
10542 }
10543 }
10544 }
10545
10546 bool DamageItemInCargo(float damage)
10547 {
10548 CargoBase cargo = GetInventory().GetCargo();
10549 if (cargo)
10550 {
10551 int item_count = cargo.GetItemCount();
10552 if (item_count > 0)
10553 {
10554 int random_pick = Math.RandomInt(0, item_count);
10555 ItemBase item = ItemBase.Cast(cargo.GetItem(random_pick));
10556 if (!item.IsExplosive())
10557 {
10558 item.AddHealth("","",damage);
10559 return true;
10560 }
10561 }
10562 }
10563 return false;
10564 }
10565
10566 bool DamageItemAttachments(float damage)
10567 {
10568 GameInventory inventory = GetInventory();
10569 int attachment_count = inventory.AttachmentCount();
10570 if (attachment_count > 0)
10571 {
10572 int random_pick = Math.RandomInt(0, attachment_count);
10573 ItemBase attachment = ItemBase.Cast(inventory.GetAttachmentFromIndex(random_pick));
10574 if (!attachment.IsExplosive())
10575 {
10576 attachment.AddHealth("","",damage);
10577 return true;
10578 }
10579 }
10580 return false;
10581 }
10582
10583 override bool IsSplitable()
10584 {
10585 return m_CanThisBeSplit;
10586 }
10587 //----------------
10588 override bool CanBeSplit()
10589 {
10590 if (IsSplitable() && (GetQuantity() > 1))
10591 return GetInventory().CanRemoveEntity();
10592
10593 return false;
10594 }
10595
10596 protected bool ShouldSplitQuantity(float quantity)
10597 {
10598 // don't call 'CanBeSplit' here, too strict and will introduce a freeze-crash when dismantling fence with a fireplace nearby
10599 if (!IsSplitable())
10600 return false;
10601
10602 // nothing to split?
10603 if (GetQuantity() <= 1)
10604 return false;
10605
10606 // check if we should re-use the item instead of creating a new copy?
10607 // implicit cast to int, if 'IsSplitable' returns true, these values are assumed ints
10608 int delta = GetQuantity() - quantity;
10609 if (delta == 0)
10610 return false;
10611
10612 // valid to split
10613 return true;
10614 }
10615
10616 override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id )
10617 {
10618 if (g_Game.IsClient())
10619 {
10620 if (ScriptInputUserData.CanStoreInputUserData())
10621 {
10622 ScriptInputUserData ctx = new ScriptInputUserData;
10624 ctx.Write(1);
10625 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10626 ctx.Write(i1);
10627 ctx.Write(destination_entity);
10628 ctx.Write(true);
10629 ctx.Write(slot_id);
10630 ctx.Send();
10631 }
10632 }
10633 else if (!g_Game.IsMultiplayer())
10634 {
10635 SplitIntoStackMax(destination_entity, slot_id, PlayerBase.Cast(g_Game.GetPlayer()));
10636 }
10637 }
10638
10639 void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
10640 {
10641 float split_quantity_new;
10642 ItemBase new_item;
10643 float quantity = GetQuantity();
10644 float stack_max = GetTargetQuantityMax(slot_id);
10645 InventoryLocation loc = new InventoryLocation;
10646
10647 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10648 {
10649 if (stack_max <= GetQuantity())
10650 split_quantity_new = stack_max;
10651 else
10652 split_quantity_new = GetQuantity();
10653
10654 if (ShouldSplitQuantity(split_quantity_new))
10655 {
10656 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10657 if (new_item)
10658 {
10659 new_item.SetResultOfSplit(true);
10660 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10661 AddQuantity(-split_quantity_new, false, true);
10662 new_item.SetQuantity(split_quantity_new, false, true);
10663 }
10664 }
10665 }
10666 else if (destination_entity && slot_id == -1)
10667 {
10668 if (quantity > stack_max)
10669 split_quantity_new = stack_max;
10670 else
10671 split_quantity_new = quantity;
10672
10673 if (ShouldSplitQuantity(split_quantity_new))
10674 {
10675 GameInventory destinationInventory = destination_entity.GetInventory();
10676 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10677 {
10678 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10679 new_item = ItemBase.Cast(o);
10680 }
10681
10682 if (new_item)
10683 {
10684 new_item.SetResultOfSplit(true);
10685 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10686 AddQuantity(-split_quantity_new, false, true);
10687 new_item.SetQuantity(split_quantity_new, false, true);
10688 }
10689 }
10690 }
10691 else
10692 {
10693 if (stack_max != 0)
10694 {
10695 if (stack_max < GetQuantity())
10696 {
10697 split_quantity_new = GetQuantity() - stack_max;
10698 }
10699
10700 if (split_quantity_new == 0)
10701 {
10702 if (!g_Game.IsMultiplayer())
10703 player.PhysicalPredictiveDropItem(this);
10704 else
10705 player.ServerDropEntity(this);
10706 return;
10707 }
10708
10709 if (ShouldSplitQuantity(split_quantity_new))
10710 {
10711 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(), player.GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10712
10713 if (new_item)
10714 {
10715 new_item.SetResultOfSplit(true);
10716 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10717 SetQuantity(split_quantity_new, false, true);
10718 new_item.SetQuantity(stack_max, false, true);
10719 new_item.PlaceOnSurface();
10720 }
10721 }
10722 }
10723 }
10724 }
10725
10726 override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
10727 {
10728 float split_quantity_new;
10729 ItemBase new_item;
10730 float quantity = GetQuantity();
10731 float stack_max = GetTargetQuantityMax(slot_id);
10732 InventoryLocation loc = new InventoryLocation;
10733
10734 if (destination_entity && slot_id != -1 && InventorySlots.IsSlotIdValid(slot_id))
10735 {
10736 if (stack_max <= GetQuantity())
10737 split_quantity_new = stack_max;
10738 else
10739 split_quantity_new = GetQuantity();
10740
10741 if (ShouldSplitQuantity(split_quantity_new))
10742 {
10743 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateAttachmentEx(this.GetType(), slot_id));
10744 if (new_item)
10745 {
10746 new_item.SetResultOfSplit(true);
10747 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10748 AddQuantity(-split_quantity_new, false, true);
10749 new_item.SetQuantity(split_quantity_new, false, true);
10750 }
10751 }
10752 }
10753 else if (destination_entity && slot_id == -1)
10754 {
10755 if (quantity > stack_max)
10756 split_quantity_new = stack_max;
10757 else
10758 split_quantity_new = quantity;
10759
10760 if (ShouldSplitQuantity(split_quantity_new))
10761 {
10762 GameInventory destinationInventory = destination_entity.GetInventory();
10763 if (destinationInventory.FindFreeLocationFor(this, FindInventoryLocationType.ANY, loc))
10764 {
10765 Object o = destinationInventory.LocationCreateEntity(loc, GetType(), ECE_IN_INVENTORY, RF_DEFAULT);
10766 new_item = ItemBase.Cast(o);
10767 }
10768
10769 if (new_item)
10770 {
10771 new_item.SetResultOfSplit(true);
10772 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10773 AddQuantity(-split_quantity_new, false, true);
10774 new_item.SetQuantity(split_quantity_new, false, true);
10775 }
10776 }
10777 }
10778 else
10779 {
10780 if (stack_max != 0)
10781 {
10782 if (stack_max < GetQuantity())
10783 {
10784 split_quantity_new = GetQuantity() - stack_max;
10785 }
10786
10787 if (ShouldSplitQuantity(split_quantity_new))
10788 {
10789 new_item = ItemBase.Cast(g_Game.CreateObjectEx(GetType(),GetWorldPosition(), ECE_PLACE_ON_SURFACE));
10790
10791 if (new_item)
10792 {
10793 new_item.SetResultOfSplit(true);
10794 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10795 SetQuantity(split_quantity_new, false, true);
10796 new_item.SetQuantity(stack_max, false, true);
10797 new_item.PlaceOnSurface();
10798 }
10799 }
10800 }
10801 }
10802 }
10803
10804 void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
10805 {
10806 if (g_Game.IsClient())
10807 {
10808 if (ScriptInputUserData.CanStoreInputUserData())
10809 {
10810 ScriptInputUserData ctx = new ScriptInputUserData;
10812 ctx.Write(4);
10813 ItemBase thiz = this; // @NOTE: workaround for correct serialization
10814 ctx.Write(thiz);
10815 dst.WriteToContext(ctx);
10816 ctx.Send();
10817 }
10818 }
10819 else if (!g_Game.IsMultiplayer())
10820 {
10822 }
10823 }
10824
10825 void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
10826 {
10827 if (g_Game.IsClient())
10828 {
10829 if (ScriptInputUserData.CanStoreInputUserData())
10830 {
10831 ScriptInputUserData ctx = new ScriptInputUserData;
10833 ctx.Write(2);
10834 ItemBase dummy = this; // @NOTE: workaround for correct serialization
10835 ctx.Write(dummy);
10836 ctx.Write(destination_entity);
10837 ctx.Write(true);
10838 ctx.Write(idx);
10839 ctx.Write(row);
10840 ctx.Write(col);
10841 ctx.Send();
10842 }
10843 }
10844 else if (!g_Game.IsMultiplayer())
10845 {
10846 SplitIntoStackMaxCargo(destination_entity, idx, row, col);
10847 }
10848 }
10849
10850 void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
10851 {
10853 }
10854
10855 ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
10856 {
10857 float quantity = GetQuantity();
10858 float split_quantity_new;
10859 ItemBase new_item;
10860 if (dst.IsValid())
10861 {
10862 int slot_id = dst.GetSlot();
10863 float stack_max = GetTargetQuantityMax(slot_id);
10864
10865 if (quantity > stack_max)
10866 split_quantity_new = stack_max;
10867 else
10868 split_quantity_new = quantity;
10869
10870 if (ShouldSplitQuantity(split_quantity_new))
10871 {
10872 new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, this.GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10873
10874 if (new_item)
10875 {
10876 new_item.SetResultOfSplit(true);
10877 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10878 AddQuantity(-split_quantity_new, false, true);
10879 new_item.SetQuantity(split_quantity_new, false, true);
10880 }
10881
10882 return new_item;
10883 }
10884 }
10885
10886 return null;
10887 }
10888
10889 void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
10890 {
10891 float quantity = GetQuantity();
10892 float split_quantity_new;
10893 ItemBase new_item;
10894 if (destination_entity)
10895 {
10896 float stackable = GetTargetQuantityMax();
10897 if (quantity > stackable)
10898 split_quantity_new = stackable;
10899 else
10900 split_quantity_new = quantity;
10901
10902 if (ShouldSplitQuantity(split_quantity_new))
10903 {
10904 new_item = ItemBase.Cast(destination_entity.GetInventory().CreateEntityInCargoEx(this.GetType(), idx, row, col, false));
10905 if (new_item)
10906 {
10907 new_item.SetResultOfSplit(true);
10908 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10909 AddQuantity(-split_quantity_new, false, true);
10910 new_item.SetQuantity(split_quantity_new, false, true);
10911 }
10912 }
10913 }
10914 }
10915
10916 void SplitIntoStackMaxHandsClient(PlayerBase player)
10917 {
10918 if (g_Game.IsClient())
10919 {
10920 if (ScriptInputUserData.CanStoreInputUserData())
10921 {
10922 ScriptInputUserData ctx = new ScriptInputUserData;
10924 ctx.Write(3);
10925 ItemBase i1 = this; // @NOTE: workaround for correct serialization
10926 ctx.Write(i1);
10927 ItemBase destination_entity = this;
10928 ctx.Write(destination_entity);
10929 ctx.Write(true);
10930 ctx.Write(0);
10931 ctx.Send();
10932 }
10933 }
10934 else if (!g_Game.IsMultiplayer())
10935 {
10936 SplitIntoStackMaxHands(player);
10937 }
10938 }
10939
10940 void SplitIntoStackMaxHands(PlayerBase player)
10941 {
10942 float quantity = GetQuantity();
10943 float split_quantity_new;
10944 ref ItemBase new_item;
10945 if (player)
10946 {
10947 float stackable = GetTargetQuantityMax();
10948 if (quantity > stackable)
10949 split_quantity_new = stackable;
10950 else
10951 split_quantity_new = quantity;
10952
10953 if (ShouldSplitQuantity(split_quantity_new))
10954 {
10955 EntityAI in_hands = player.GetHumanInventory().CreateInHands(this.GetType());
10956 new_item = ItemBase.Cast(in_hands);
10957 if (new_item)
10958 {
10959 new_item.SetResultOfSplit(true);
10960 MiscGameplayFunctions.TransferItemProperties(this,new_item);
10961 AddQuantity(-split_quantity_new, false, true);
10962 new_item.SetQuantity(split_quantity_new, false, true);
10963 }
10964 }
10965 }
10966 }
10967
10968 void SplitItemToInventoryLocation(notnull InventoryLocation dst)
10969 {
10970 float quantity = GetQuantity();
10971 float split_quantity_new = Math.Floor(quantity * 0.5);
10972
10973 if (!ShouldSplitQuantity(split_quantity_new))
10974 return;
10975
10976 ItemBase new_item = ItemBase.Cast(GameInventory.LocationCreateEntity(dst, GetType(), ECE_IN_INVENTORY, RF_DEFAULT));
10977
10978 if (new_item)
10979 {
10980 if (new_item.GetQuantityMax() < split_quantity_new)
10981 {
10982 split_quantity_new = new_item.GetQuantityMax();
10983 }
10984
10985 new_item.SetResultOfSplit(true);
10986 MiscGameplayFunctions.TransferItemProperties(this, new_item);
10987
10988 if (dst.IsValid() && dst.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
10989 {
10990 AddQuantity(-1, false, true);
10991 new_item.SetQuantity(1, false, true);
10992 }
10993 else
10994 {
10995 AddQuantity(-split_quantity_new, false, true);
10996 new_item.SetQuantity(split_quantity_new, false, true);
10997 }
10998 }
10999 }
11000
11001 void SplitItem(PlayerBase player)
11002 {
11003 float quantity = GetQuantity();
11004 float split_quantity_new = Math.Floor(quantity / 2);
11005
11006 if (!ShouldSplitQuantity(split_quantity_new))
11007 return;
11008
11009 InventoryLocation invloc = new InventoryLocation;
11010 bool found = player.GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, invloc);
11011
11012 ItemBase new_item;
11013 new_item = player.CreateCopyOfItemInInventoryOrGroundEx(this, true);
11014
11015 if (new_item)
11016 {
11017 if (new_item.GetQuantityMax() < split_quantity_new)
11018 {
11019 split_quantity_new = new_item.GetQuantityMax();
11020 }
11021 if (found && invloc.IsValid() && invloc.GetType() == InventoryLocationType.ATTACHMENT && split_quantity_new > 1)
11022 {
11023 AddQuantity(-1, false, true);
11024 new_item.SetQuantity(1, false, true);
11025 }
11026 else if (split_quantity_new > 1)
11027 {
11028 AddQuantity(-split_quantity_new, false, true);
11029 new_item.SetQuantity(split_quantity_new, false, true);
11030 }
11031 }
11032 }
11033
11035 void OnQuantityChanged(float delta)
11036 {
11037 SetWeightDirty();
11038 ItemBase parent = ItemBase.Cast(GetHierarchyParent());
11039
11040 if (parent)
11041 parent.OnAttachmentQuantityChangedEx(this, delta);
11042
11043 if (IsLiquidContainer())
11044 {
11045 if (GetQuantityNormalized() <= 0.0)
11046 {
11048 }
11049 else if (GetLiquidType() == LIQUID_NONE)
11050 {
11051 ErrorEx("Undefined liquid type quantity changed, please define liquid type first! Using init value.",ErrorExSeverity.INFO);
11053 }
11054 }
11055 }
11056
11059 {
11060 // insert code here
11061 }
11062
11064 void OnAttachmentQuantityChangedEx(ItemBase item , float delta)
11065 {
11067 }
11068
11069 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
11070 {
11071 super.EEHealthLevelChanged(oldLevel,newLevel,zone);
11072
11073 if (g_Game.IsServer())
11074 {
11075 if (newLevel == GameConstants.STATE_RUINED)
11076 {
11078 EntityAI parent = GetHierarchyParent();
11079 if (parent && parent.IsFireplace())
11080 {
11081 CargoBase cargo = GetInventory().GetCargo();
11082 if (cargo)
11083 {
11084 for (int i = 0; i < cargo.GetItemCount(); ++i)
11085 {
11086 parent.GetInventory().TakeEntityToInventory(InventoryMode.SERVER, FindInventoryLocationType.CARGO, cargo.GetItem(i));
11087 }
11088 }
11089 }
11090 }
11091
11092 if (IsResultOfSplit())
11093 {
11094 // reset the splitting result flag, return to normal item behavior
11095 SetResultOfSplit(false);
11096 return;
11097 }
11098
11099 if (m_Cleanness != 0 && oldLevel < newLevel && newLevel != 0)
11100 {
11101 SetCleanness(0);//unclean the item upon damage dealt
11102 }
11103 }
11104 }
11105
11106 // just the split? TODO: verify
11107 override void OnRightClick()
11108 {
11109 super.OnRightClick();
11110
11111 if (CanBeSplit() && !GetDayZGame().IsLeftCtrlDown() && !g_Game.GetPlayer().GetInventory().HasInventoryReservation(this,null))
11112 {
11113 if (g_Game.IsClient())
11114 {
11115 if (ScriptInputUserData.CanStoreInputUserData())
11116 {
11117 EntityAI root = GetHierarchyRoot();
11118 Man playerOwner = GetHierarchyRootPlayer();
11119 InventoryLocation dst = new InventoryLocation;
11120
11121 // If we have no hierarchy root player and the root is the same as this item the source item is in the vicinity so we want to create the new split item there also
11122 if (!playerOwner && root && root == this)
11123 {
11125 }
11126 else
11127 {
11128 // Check if we can place the new split item in the same parent where the source item is placed in or otherwise drop it in vicinity
11129 GetInventory().GetCurrentInventoryLocation(dst);
11130 if (!dst.GetParent() || dst.GetParent() && !dst.GetParent().GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst))
11131 {
11132 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
11133 if (!player.GetInventory().FindFreeLocationFor(this, FindInventoryLocationType.CARGO, dst) || !playerOwner)
11134 {
11136 }
11137 else
11138 {
11139 dst.SetCargo(dst.GetParent(), this, dst.GetIdx(), dst.GetRow(), dst.GetCol(), dst.GetFlip());
11140 /* hacky solution to check reservation of "this" item instead of null since the gamecode is checking null against null and returning reservation=true incorrectly
11141 this shouldnt cause issues within this scope*/
11142 if (g_Game.GetPlayer().GetInventory().HasInventoryReservation(this, dst))
11143 {
11145 }
11146 else
11147 {
11148 g_Game.GetPlayer().GetInventory().AddInventoryReservationEx(null, dst, GameInventory.c_InventoryReservationTimeoutShortMS);
11149 }
11150 }
11151 }
11152 }
11153
11154 ScriptInputUserData ctx = new ScriptInputUserData;
11156 ctx.Write(4);
11157 ItemBase thiz = this; // @NOTE: workaround for correct serialization
11158 ctx.Write(thiz);
11159 dst.WriteToContext(ctx);
11160 ctx.Write(true); // dummy
11161 ctx.Send();
11162 }
11163 }
11164 else if (!g_Game.IsMultiplayer())
11165 {
11166 SplitItem(PlayerBase.Cast(g_Game.GetPlayer()));
11167 }
11168 }
11169 }
11170
11171 protected void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
11172 {
11173 if (root)
11174 {
11175 vector m4[4];
11176 root.GetTransform(m4);
11177 dst.SetGround(this, m4);
11178 }
11179 else
11180 {
11181 GetInventory().GetCurrentInventoryLocation(dst);
11182 }
11183 }
11184
11185 override bool CanBeCombined(EntityAI other_item, bool reservation_check = true, bool stack_max_limit = false)
11186 {
11187 //TODO: delete check zero quantity check after fix double posts hands fsm events
11188 if (!other_item || GetType() != other_item.GetType() || (IsFullQuantity() && other_item.GetQuantity() > 0) || other_item == this)
11189 return false;
11190
11191 if (GetHealthLevel() == GameConstants.STATE_RUINED || other_item.GetHealthLevel() == GameConstants.STATE_RUINED)
11192 return false;
11193
11194 //can_this_be_combined = ConfigGetBool("canBeSplit");
11196 return false;
11197
11198
11199 Magazine mag = Magazine.Cast(this);
11200 if (mag)
11201 {
11202 if (mag.GetAmmoCount() >= mag.GetAmmoMax())
11203 return false;
11204
11205 if (stack_max_limit)
11206 {
11207 Magazine other_mag = Magazine.Cast(other_item);
11208 if (other_item)
11209 {
11210 if (mag.GetAmmoCount() + other_mag.GetAmmoCount() > mag.GetAmmoMax())
11211 return false;
11212 }
11213
11214 }
11215 }
11216 else
11217 {
11218 //TODO: delete check zero quantity check after fix double posts hands fsm events
11219 if (GetQuantity() >= GetQuantityMax() && other_item.GetQuantity() > 0 )
11220 return false;
11221
11222 if (stack_max_limit && (GetQuantity() + other_item.GetQuantity() > GetQuantityMax()))
11223 return false;
11224 }
11225
11226 PlayerBase player = null;
11227 if (CastTo(player, GetHierarchyRootPlayer())) //false when attached to player's attachment slot
11228 {
11229 if (player.GetInventory().HasAttachment(this))
11230 return false;
11231
11232 if (player.IsItemsToDelete())
11233 return false;
11234 }
11235
11236 if (reservation_check && (GetInventory().HasInventoryReservation(this, null) || other_item.GetInventory().HasInventoryReservation(other_item, null)))
11237 return false;
11238
11239 int slotID;
11240 string slotName;
11241 if (GetInventory().GetCurrentAttachmentSlotInfo(slotID,slotName) && GetHierarchyParent().GetInventory().GetSlotLock(slotID))
11242 return false;
11243
11244 return true;
11245 }
11246
11247 bool IsCombineAll(ItemBase other_item, bool use_stack_max = false)
11248 {
11249 return ComputeQuantityUsed(other_item, use_stack_max) == other_item.GetQuantity();
11250 }
11251
11252 bool IsResultOfSplit()
11253 {
11254 return m_IsResultOfSplit;
11255 }
11256
11257 void SetResultOfSplit(bool value)
11258 {
11259 m_IsResultOfSplit = value;
11260 }
11261
11262 int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max = true)
11263 {
11264 return ComputeQuantityUsedEx(other_item, use_stack_max);
11265 }
11266
11267 float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max = true)
11268 {
11269 float other_item_quantity = other_item.GetQuantity();
11270 float this_free_space;
11271
11272 float stack_max = GetQuantityMax();
11273
11274 this_free_space = stack_max - GetQuantity();
11275
11276 if (other_item_quantity > this_free_space)
11277 {
11278 return this_free_space;
11279 }
11280 else
11281 {
11282 return other_item_quantity;
11283 }
11284 }
11285
11286 override void CombineItemsEx(EntityAI entity2, bool use_stack_max = true)
11287 {
11288 CombineItems(ItemBase.Cast(entity2),use_stack_max);
11289 }
11290
11291 void CombineItems(ItemBase other_item, bool use_stack_max = true)
11292 {
11293 if (!CanBeCombined(other_item, false))
11294 return;
11295
11296 if (!IsMagazine() && other_item)
11297 {
11298 float quantity_used = ComputeQuantityUsedEx(other_item,use_stack_max);
11299 if (quantity_used != 0)
11300 {
11301 float hp1 = GetHealth01("","");
11302 float hp2 = other_item.GetHealth01("","");
11303 float hpResult = ((hp1*GetQuantity()) + (hp2*quantity_used));
11304 hpResult = hpResult / (GetQuantity() + quantity_used);
11305
11306 hpResult *= GetMaxHealth();
11307 Math.Round(hpResult);
11308 SetHealth("", "Health", hpResult);
11309
11310 AddQuantity(quantity_used);
11311 other_item.AddQuantity(-quantity_used);
11312 }
11313 }
11314 OnCombine(other_item);
11315 }
11316
11317 void OnCombine(ItemBase other_item)
11318 {
11319 #ifdef SERVER
11320 if (!GetHierarchyRootPlayer() && GetHierarchyParent())
11321 GetHierarchyParent().IncreaseLifetimeUp();
11322 #endif
11323 };
11324
11325 void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
11326 {
11327 PlayerBase p = PlayerBase.Cast(player);
11328
11329 array<int> recipesIds = p.m_Recipes;
11330 PluginRecipesManager moduleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11331 if (moduleRecipesManager)
11332 {
11333 EntityAI itemInHands = player.GetEntityInHands();
11334 moduleRecipesManager.GetValidRecipes(ItemBase.Cast(this), ItemBase.Cast(itemInHands), recipesIds, p);
11335 }
11336
11337 for (int i = 0;i < recipesIds.Count(); i++)
11338 {
11339 int key = recipesIds.Get(i);
11340 string recipeName = moduleRecipesManager.GetRecipeName(key);
11341 outputList.Insert(new TSelectableActionInfo(SAT_CRAFTING, key, recipeName));
11342 }
11343 }
11344
11345 // -------------------------------------------------------------------------
11346 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
11347 {
11348 super.GetDebugActions(outputList);
11349
11350 //quantity
11351 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_QUANTITY, "Quantity +20%", FadeColors.LIGHT_GREY));
11352 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_QUANTITY, "Quantity -20%", FadeColors.LIGHT_GREY));
11353 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_QUANTITY_0, "Set Quantity 0", FadeColors.LIGHT_GREY));
11354 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SET_MAX_QUANTITY, "Set Quantity Max", FadeColors.LIGHT_GREY));
11355 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11356
11357 //health
11358 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_HEALTH, "Health +20%", FadeColors.LIGHT_GREY));
11359 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_HEALTH, "Health -20%", FadeColors.LIGHT_GREY));
11360 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DESTROY_HEALTH, "Health 0", FadeColors.LIGHT_GREY));
11361 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11362 //temperature
11363 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_TEMPERATURE, "Temperature +20", FadeColors.LIGHT_GREY));
11364 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_TEMPERATURE, "Temperature -20", FadeColors.LIGHT_GREY));
11365 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.FLIP_FROZEN, "Toggle Frozen", FadeColors.LIGHT_GREY));
11366 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11367
11368 //wet
11369 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.ADD_WETNESS, "Wetness +20", FadeColors.LIGHT_GREY));
11370 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.REMOVE_WETNESS, "Wetness -20", FadeColors.LIGHT_GREY));
11371 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11372
11373 //liquidtype
11374 if (IsLiquidContainer())
11375 {
11376 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_UP, "LiquidType Next", FadeColors.LIGHT_GREY));
11377 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.LIQUIDTYPE_DOWN, "LiquidType Previous", FadeColors.LIGHT_GREY));
11378 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11379 }
11380
11381 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.MAKE_SPECIAL, "Make Special", FadeColors.LIGHT_GREY));
11382 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11383
11384 // watch
11385 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_ITEM, "Watch (CTRL-Z)", FadeColors.LIGHT_GREY));
11386 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.WATCH_PLAYER, "Watch Player", FadeColors.LIGHT_GREY));
11387 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11388
11389 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
11390
11391 InventoryLocation loc = new InventoryLocation();
11392 GetInventory().GetCurrentInventoryLocation(loc);
11393 if (!loc || loc.GetType() == InventoryLocationType.GROUND)
11394 {
11395 if (Gizmo_IsSupported())
11396 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
11397 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
11398 }
11399
11400 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
11401 }
11402
11403 // -------------------------------------------------------------------------
11404 // -------------------------------------------------------------------------
11405 // -------------------------------------------------------------------------
11406 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
11407 {
11408 super.OnAction(action_id, player, ctx);
11409
11410 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
11411 {
11412 switch (action_id)
11413 {
11414 case EActions.GIZMO_OBJECT:
11415 if (GetGizmoApi())
11416 GetGizmoApi().SelectObject(this);
11417 return true;
11418 case EActions.GIZMO_PHYSICS:
11419 if (GetGizmoApi())
11420 GetGizmoApi().SelectPhysics(GetPhysics());
11421 return true;
11422 }
11423 }
11424
11425 if (g_Game.IsServer())
11426 {
11427 switch (action_id)
11428 {
11429 case EActions.DELETE:
11430 Delete();
11431 return true;
11432 }
11433 }
11434
11435 if (action_id >= EActions.RECIPES_RANGE_START && action_id < EActions.RECIPES_RANGE_END)
11436 {
11437 PluginRecipesManager plugin_recipes_manager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
11438 int idWithoutOffset = action_id - EActions.RECIPES_RANGE_START;
11439 PlayerBase p = PlayerBase.Cast(player);
11440 if (EActions.RECIPES_RANGE_START < 1000)
11441 {
11442 float anim_length = plugin_recipes_manager.GetRecipeLengthInSecs(idWithoutOffset);
11443 float specialty_weight = plugin_recipes_manager.GetRecipeSpecialty(idWithoutOffset);
11444 }
11445 }
11446 #ifndef SERVER
11447 else if (action_id == EActions.WATCH_PLAYER)
11448 {
11449 PluginDeveloper.SetDeveloperItemClientEx(player);
11450 }
11451 #endif
11452 if (g_Game.IsServer())
11453 {
11454 if (action_id >= EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START && action_id < EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_END)
11455 {
11456 int id = action_id - EActions.DEBUG_ITEM_WATCH_BUTTON_RANGE_START;
11457 OnDebugButtonPressServer(id + 1);
11458 }
11459
11460 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_INJECT_START && action_id < EActions.DEBUG_AGENTS_RANGE_INJECT_END)
11461 {
11462 int agent_id = action_id - EActions.DEBUG_AGENTS_RANGE_INJECT_START;
11463 InsertAgent(agent_id,100);
11464 }
11465
11466 else if (action_id >= EActions.DEBUG_AGENTS_RANGE_REMOVE_START && action_id < EActions.DEBUG_AGENTS_RANGE_REMOVE_END)
11467 {
11468 int agent_id2 = action_id - EActions.DEBUG_AGENTS_RANGE_REMOVE_START;
11469 RemoveAgent(agent_id2);
11470 }
11471
11472 else if (action_id == EActions.ADD_QUANTITY)
11473 {
11474 if (IsMagazine())
11475 {
11476 Magazine mag = Magazine.Cast(this);
11477 mag.ServerSetAmmoCount(mag.GetAmmoCount() + mag.GetAmmoMax() * 0.2);
11478 }
11479 else
11480 {
11481 AddQuantity(GetQuantityMax() * 0.2);
11482 }
11483
11484 if (m_EM)
11485 {
11486 m_EM.AddEnergy(m_EM.GetEnergyMax() * 0.2);
11487 }
11488 //PrintVariables();
11489 }
11490
11491 else if (action_id == EActions.REMOVE_QUANTITY) //Quantity -20%
11492 {
11493 if (IsMagazine())
11494 {
11495 Magazine mag2 = Magazine.Cast(this);
11496 mag2.ServerSetAmmoCount(mag2.GetAmmoCount() - mag2.GetAmmoMax() * 0.2);
11497 }
11498 else
11499 {
11500 AddQuantity(- GetQuantityMax() * 0.2);
11501 }
11502 if (m_EM)
11503 {
11504 m_EM.AddEnergy(- m_EM.GetEnergyMax() * 0.2);
11505 }
11506 //PrintVariables();
11507 }
11508
11509 else if (action_id == EActions.SET_QUANTITY_0) //SetMaxQuantity
11510 {
11511 SetQuantity(0);
11512
11513 if (m_EM)
11514 {
11515 m_EM.SetEnergy(0);
11516 }
11517 }
11518
11519 else if (action_id == EActions.SET_MAX_QUANTITY) //SetMaxQuantity
11520 {
11522
11523 if (m_EM)
11524 {
11525 m_EM.SetEnergy(m_EM.GetEnergyMax());
11526 }
11527 }
11528
11529 else if (action_id == EActions.ADD_HEALTH)
11530 {
11531 AddHealth("","",GetMaxHealth("","Health")/5);
11532 }
11533 else if (action_id == EActions.REMOVE_HEALTH)
11534 {
11535 AddHealth("","",-GetMaxHealth("","Health")/5);
11536 }
11537 else if (action_id == EActions.DESTROY_HEALTH)
11538 {
11539 SetHealth01("","",0);
11540 }
11541 else if (action_id == EActions.WATCH_ITEM)
11542 {
11544 mid.RegisterDebugItem(ItemBase.Cast(this), PlayerBase.Cast(player));
11545 #ifdef DEVELOPER
11546 SetDebugDeveloper_item(this);
11547 #endif
11548 }
11549
11550 else if (action_id == EActions.ADD_TEMPERATURE)
11551 {
11552 AddTemperature(20);
11553 //PrintVariables();
11554 }
11555
11556 else if (action_id == EActions.REMOVE_TEMPERATURE)
11557 {
11558 AddTemperature(-20);
11559 //PrintVariables();
11560 }
11561
11562 else if (action_id == EActions.FLIP_FROZEN)
11563 {
11564 SetFrozen(!GetIsFrozen());
11565 //PrintVariables();
11566 }
11567
11568 else if (action_id == EActions.ADD_WETNESS)
11569 {
11570 AddWet(GetWetMax()/5);
11571 //PrintVariables();
11572 }
11573
11574 else if (action_id == EActions.REMOVE_WETNESS)
11575 {
11576 AddWet(-GetWetMax()/5);
11577 //PrintVariables();
11578 }
11579
11580 else if (action_id == EActions.LIQUIDTYPE_UP)
11581 {
11582 int curr_type = GetLiquidType();
11583 SetLiquidType(curr_type * 2);
11584 //AddWet(1);
11585 //PrintVariables();
11586 }
11587
11588 else if (action_id == EActions.LIQUIDTYPE_DOWN)
11589 {
11590 int curr_type2 = GetLiquidType();
11591 SetLiquidType(curr_type2 / 2);
11592 }
11593
11594 else if (action_id == EActions.MAKE_SPECIAL)
11595 {
11596 auto debugParams = DebugSpawnParams.WithPlayer(player);
11597 OnDebugSpawnEx(debugParams);
11598 }
11599
11600 }
11601
11602
11603 return false;
11604 }
11605
11606 // -------------------------------------------------------------------------
11607
11608
11611 void OnActivatedByTripWire();
11612
11614 void OnActivatedByItem(notnull ItemBase item);
11615
11616 //----------------------------------------------------------------
11617 //returns true if item is able to explode when put in fire
11618 bool CanExplodeInFire()
11619 {
11620 return false;
11621 }
11622
11623 //----------------------------------------------------------------
11624 bool CanEat()
11625 {
11626 return true;
11627 }
11628
11629 //----------------------------------------------------------------
11630 override bool IsIgnoredByConstruction()
11631 {
11632 return true;
11633 }
11634
11635 //----------------------------------------------------------------
11636 //has FoodStages in config?
11637 bool HasFoodStage()
11638 {
11639 string config_path = string.Format("CfgVehicles %1 Food FoodStages", GetType());
11640 return g_Game.ConfigIsExisting(config_path);
11641 }
11642
11644 FoodStage GetFoodStage()
11645 {
11646 return null;
11647 }
11648
11649 bool CanBeCooked()
11650 {
11651 return false;
11652 }
11653
11654 bool CanBeCookedOnStick()
11655 {
11656 return false;
11657 }
11658
11660 void RefreshAudioVisualsOnClient( CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned );
11662
11663 //----------------------------------------------------------------
11664 bool CanRepair(ItemBase item_repair_kit)
11665 {
11666 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11667 return module_repairing.CanRepair(this, item_repair_kit);
11668 }
11669
11670 //----------------------------------------------------------------
11671 bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
11672 {
11673 PluginRepairing module_repairing = PluginRepairing.Cast(GetPlugin(PluginRepairing));
11674 return module_repairing.Repair(player, this, item_repair_kit, specialty_weight);
11675 }
11676
11677 //----------------------------------------------------------------
11678 int GetItemSize()
11679 {
11680 /*
11681 vector v_size = this.ConfigGetVector("itemSize");
11682 int v_size_x = v_size[0];
11683 int v_size_y = v_size[1];
11684 int size = v_size_x * v_size_y;
11685 return size;
11686 */
11687
11688 return 1;
11689 }
11690
11691 //----------------------------------------------------------------
11692 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11693 bool CanBeMovedOverride()
11694 {
11695 return m_CanBeMovedOverride;
11696 }
11697
11698 //----------------------------------------------------------------
11699 //Override for allowing seemingly unallowed moves when two clients send a conflicting message simultaneously
11700 void SetCanBeMovedOverride(bool setting)
11701 {
11702 m_CanBeMovedOverride = setting;
11703 }
11704
11705 //----------------------------------------------------------------
11713 void MessageToOwnerStatus(string text)
11714 {
11715 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11716
11717 if (player)
11718 {
11719 player.MessageStatus(text);
11720 }
11721 }
11722
11723 //----------------------------------------------------------------
11731 void MessageToOwnerAction(string text)
11732 {
11733 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11734
11735 if (player)
11736 {
11737 player.MessageAction(text);
11738 }
11739 }
11740
11741 //----------------------------------------------------------------
11749 void MessageToOwnerFriendly(string text)
11750 {
11751 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11752
11753 if (player)
11754 {
11755 player.MessageFriendly(text);
11756 }
11757 }
11758
11759 //----------------------------------------------------------------
11767 void MessageToOwnerImportant(string text)
11768 {
11769 PlayerBase player = PlayerBase.Cast(this.GetHierarchyRootPlayer());
11770
11771 if (player)
11772 {
11773 player.MessageImportant(text);
11774 }
11775 }
11776
11777 override bool IsItemBase()
11778 {
11779 return true;
11780 }
11781
11782 // Checks if item is of questioned kind
11783 override bool KindOf(string tag)
11784 {
11785 bool found = false;
11786 string item_name = this.GetType();
11787 ref TStringArray item_tag_array = new TStringArray;
11788 g_Game.ConfigGetTextArray("cfgVehicles " + item_name + " itemInfo", item_tag_array);
11789
11790 int array_size = item_tag_array.Count();
11791 for (int i = 0; i < array_size; i++)
11792 {
11793 if (item_tag_array.Get(i) == tag)
11794 {
11795 found = true;
11796 break;
11797 }
11798 }
11799 return found;
11800 }
11801
11802
11803 override void OnRPC(PlayerIdentity sender, int rpc_type,ParamsReadContext ctx)
11804 {
11805 //Debug.Log("OnRPC called");
11806 super.OnRPC(sender, rpc_type,ctx);
11807
11808 //Play soundset for attachment locking (ActionLockAttachment.c)
11809 switch (rpc_type)
11810 {
11811 #ifndef SERVER
11812 case ERPCs.RPC_SOUND_LOCK_ATTACH:
11813 Param2<bool, string> p = new Param2<bool, string>(false, "");
11814
11815 if (!ctx.Read(p))
11816 return;
11817
11818 bool play = p.param1;
11819 string soundSet = p.param2;
11820
11821 if (play)
11822 {
11823 if (m_LockingSound)
11824 {
11826 {
11827 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11828 }
11829 }
11830 else
11831 {
11832 m_LockingSound = SEffectManager.PlaySound(soundSet, GetPosition(), 0, 0, true);
11833 }
11834 }
11835 else
11836 {
11837 SEffectManager.DestroyEffect(m_LockingSound);
11838 }
11839
11840 break;
11841 #endif
11842
11843 }
11844
11845 if (GetWrittenNoteData())
11846 {
11847 GetWrittenNoteData().OnRPC(sender, rpc_type,ctx);
11848 }
11849 }
11850
11851 //-----------------------------
11852 // VARIABLE MANIPULATION SYSTEM
11853 //-----------------------------
11854 int NameToID(string name)
11855 {
11856 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11857 return plugin.GetID(name);
11858 }
11859
11860 string IDToName(int id)
11861 {
11862 PluginVariables plugin = PluginVariables.Cast(GetPlugin(PluginVariables));
11863 return plugin.GetName(id);
11864 }
11865
11867 void OnSyncVariables(ParamsReadContext ctx)//with ID optimization
11868 {
11869 //Debug.Log("OnSyncVariables called for item: "+ ToString(this.GetType()),"varSync");
11870 //read the flags
11871 int varFlags;
11872 if (!ctx.Read(varFlags))
11873 return;
11874
11875 if (varFlags & ItemVariableFlags.FLOAT)
11876 {
11877 ReadVarsFromCTX(ctx);
11878 }
11879 }
11880
11881 override void SerializeNumericalVars(array<float> floats_out)
11882 {
11883 //some variables handled on EntityAI level already!
11884 super.SerializeNumericalVars(floats_out);
11885
11886 // the order of serialization must be the same as the order of de-serialization
11887 //--------------------------------------------
11888 if (IsVariableSet(VARIABLE_QUANTITY))
11889 {
11890 floats_out.Insert(m_VarQuantity);
11891 }
11892 //--------------------------------------------
11893 if (IsVariableSet(VARIABLE_WET))
11894 {
11895 floats_out.Insert(m_VarWet);
11896 }
11897 //--------------------------------------------
11898 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11899 {
11900 floats_out.Insert(m_VarLiquidType);
11901 }
11902 //--------------------------------------------
11903 if (IsVariableSet(VARIABLE_COLOR))
11904 {
11905 floats_out.Insert(m_ColorComponentR);
11906 floats_out.Insert(m_ColorComponentG);
11907 floats_out.Insert(m_ColorComponentB);
11908 floats_out.Insert(m_ColorComponentA);
11909 }
11910 //--------------------------------------------
11911 if (IsVariableSet(VARIABLE_CLEANNESS))
11912 {
11913 floats_out.Insert(m_Cleanness);
11914 }
11915 }
11916
11917 override void DeSerializeNumericalVars(array<float> floats)
11918 {
11919 //some variables handled on EntityAI level already!
11920 super.DeSerializeNumericalVars(floats);
11921
11922 // the order of serialization must be the same as the order of de-serialization
11923 int index = 0;
11924 int mask = Math.Round(floats.Get(index));
11925
11926 index++;
11927 //--------------------------------------------
11928 if (mask & VARIABLE_QUANTITY)
11929 {
11930 if (m_IsStoreLoad)
11931 {
11932 SetStoreLoadedQuantity(floats.Get(index));
11933 }
11934 else
11935 {
11936 float quantity = floats.Get(index);
11937 SetQuantity(quantity, true, false, false, false);
11938 }
11939 index++;
11940 }
11941 //--------------------------------------------
11942 if (mask & VARIABLE_WET)
11943 {
11944 float wet = floats.Get(index);
11945 SetWet(wet);
11946 index++;
11947 }
11948 //--------------------------------------------
11949 if (mask & VARIABLE_LIQUIDTYPE)
11950 {
11951 int liquidtype = Math.Round(floats.Get(index));
11952 SetLiquidType(liquidtype);
11953 index++;
11954 }
11955 //--------------------------------------------
11956 if (mask & VARIABLE_COLOR)
11957 {
11958 m_ColorComponentR = Math.Round(floats.Get(index));
11959 index++;
11960 m_ColorComponentG = Math.Round(floats.Get(index));
11961 index++;
11962 m_ColorComponentB = Math.Round(floats.Get(index));
11963 index++;
11964 m_ColorComponentA = Math.Round(floats.Get(index));
11965 index++;
11966 }
11967 //--------------------------------------------
11968 if (mask & VARIABLE_CLEANNESS)
11969 {
11970 int cleanness = Math.Round(floats.Get(index));
11971 SetCleanness(cleanness);
11972 index++;
11973 }
11974 }
11975
11976 override void WriteVarsToCTX(ParamsWriteContext ctx)
11977 {
11978 super.WriteVarsToCTX(ctx);
11979
11980 //--------------------------------------------
11981 if (IsVariableSet(VARIABLE_QUANTITY))
11982 {
11983 ctx.Write(GetQuantity());
11984 }
11985 //--------------------------------------------
11986 if (IsVariableSet(VARIABLE_WET))
11987 {
11988 ctx.Write(GetWet());
11989 }
11990 //--------------------------------------------
11991 if (IsVariableSet(VARIABLE_LIQUIDTYPE))
11992 {
11993 ctx.Write(GetLiquidType());
11994 }
11995 //--------------------------------------------
11996 if (IsVariableSet(VARIABLE_COLOR))
11997 {
11998 int r,g,b,a;
11999 GetColor(r,g,b,a);
12000 ctx.Write(r);
12001 ctx.Write(g);
12002 ctx.Write(b);
12003 ctx.Write(a);
12004 }
12005 //--------------------------------------------
12006 if (IsVariableSet(VARIABLE_CLEANNESS))
12007 {
12008 ctx.Write(GetCleanness());
12009 }
12010 }
12011
12012 override bool ReadVarsFromCTX(ParamsReadContext ctx, int version = -1)//with ID optimization
12013 {
12014 if (!super.ReadVarsFromCTX(ctx,version))
12015 return false;
12016
12017 int intValue;
12018 float value;
12019
12020 if (version < 140)
12021 {
12022 if (!ctx.Read(intValue))
12023 return false;
12024
12025 m_VariablesMask = intValue;
12026 }
12027
12028 if (m_VariablesMask & VARIABLE_QUANTITY)
12029 {
12030 if (!ctx.Read(value))
12031 return false;
12032
12033 if (IsStoreLoad())
12034 {
12036 }
12037 else
12038 {
12039 SetQuantity(value, true, false, false, false);
12040 }
12041 }
12042 //--------------------------------------------
12043 if (version < 140)
12044 {
12045 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12046 {
12047 if (!ctx.Read(value))
12048 return false;
12049 SetTemperatureDirect(value);
12050 }
12051 }
12052 //--------------------------------------------
12053 if (m_VariablesMask & VARIABLE_WET)
12054 {
12055 if (!ctx.Read(value))
12056 return false;
12057 SetWet(value);
12058 }
12059 //--------------------------------------------
12060 if (m_VariablesMask & VARIABLE_LIQUIDTYPE)
12061 {
12062 if (!ctx.Read(intValue))
12063 return false;
12064 SetLiquidType(intValue);
12065 }
12066 //--------------------------------------------
12067 if (m_VariablesMask & VARIABLE_COLOR)
12068 {
12069 int r,g,b,a;
12070 if (!ctx.Read(r))
12071 return false;
12072 if (!ctx.Read(g))
12073 return false;
12074 if (!ctx.Read(b))
12075 return false;
12076 if (!ctx.Read(a))
12077 return false;
12078
12079 SetColor(r,g,b,a);
12080 }
12081 //--------------------------------------------
12082 if (m_VariablesMask & VARIABLE_CLEANNESS)
12083 {
12084 if (!ctx.Read(intValue))
12085 return false;
12086 SetCleanness(intValue);
12087 }
12088 //--------------------------------------------
12089 if (version >= 138 && version < 140)
12090 {
12091 if (m_VariablesMask & VARIABLE_TEMPERATURE)
12092 {
12093 if (!ctx.Read(intValue))
12094 return false;
12095 SetFrozen(intValue);
12096 }
12097 }
12098
12099 return true;
12100 }
12101
12102 //----------------------------------------------------------------
12103 override bool OnStoreLoad(ParamsReadContext ctx, int version)
12104 {
12105 m_IsStoreLoad = true;
12107 {
12108 m_FixDamageSystemInit = true;
12109 }
12110
12111 if (!super.OnStoreLoad(ctx, version))
12112 {
12113 m_IsStoreLoad = false;
12114 return false;
12115 }
12116
12117 if (version >= 114)
12118 {
12119 bool hasQuickBarIndexSaved;
12120
12121 if (!ctx.Read(hasQuickBarIndexSaved))
12122 {
12123 m_IsStoreLoad = false;
12124 return false;
12125 }
12126
12127 if (hasQuickBarIndexSaved)
12128 {
12129 int itmQBIndex;
12130
12131 //Load quickbar item bind
12132 if (!ctx.Read(itmQBIndex))
12133 {
12134 m_IsStoreLoad = false;
12135 return false;
12136 }
12137
12138 PlayerBase parentPlayer = PlayerBase.Cast(GetHierarchyRootPlayer());
12139 if (itmQBIndex != -1 && parentPlayer)
12140 parentPlayer.SetLoadedQuickBarItemBind(this, itmQBIndex);
12141 }
12142 }
12143 else
12144 {
12145 // Backup of how it used to be
12146 PlayerBase player;
12147 int itemQBIndex;
12148 if (version == int.MAX)
12149 {
12150 if (!ctx.Read(itemQBIndex))
12151 {
12152 m_IsStoreLoad = false;
12153 return false;
12154 }
12155 }
12156 else if (Class.CastTo(player, GetHierarchyRootPlayer()))
12157 {
12158 //Load quickbar item bind
12159 if (!ctx.Read(itemQBIndex))
12160 {
12161 m_IsStoreLoad = false;
12162 return false;
12163 }
12164 if (itemQBIndex != -1 && player)
12165 player.SetLoadedQuickBarItemBind(this,itemQBIndex);
12166 }
12167 }
12168
12169 if (version < 140)
12170 {
12171 // variable management system
12172 if (!LoadVariables(ctx, version))
12173 {
12174 m_IsStoreLoad = false;
12175 return false;
12176 }
12177 }
12178
12179 //agent trasmission system
12180 if (!LoadAgents(ctx, version))
12181 {
12182 m_IsStoreLoad = false;
12183 return false;
12184 }
12185 if (version >= 132)
12186 {
12187 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12188 if (raib)
12189 {
12190 if (!raib.OnStoreLoad(ctx,version))
12191 {
12192 m_IsStoreLoad = false;
12193 return false;
12194 }
12195 }
12196 }
12197
12198 m_IsStoreLoad = false;
12199 return true;
12200 }
12201
12202 //----------------------------------------------------------------
12203
12204 override void OnStoreSave(ParamsWriteContext ctx)
12205 {
12206 super.OnStoreSave(ctx);
12207
12208 PlayerBase player;
12209 if (PlayerBase.CastTo(player,GetHierarchyRootPlayer()))
12210 {
12211 ctx.Write(true); // Keep track of if we should actually read this in or not
12212 //Save quickbar item bind
12213 int itemQBIndex = -1;
12214 itemQBIndex = player.FindQuickBarEntityIndex(this);
12215 ctx.Write(itemQBIndex);
12216 }
12217 else
12218 {
12219 ctx.Write(false); // Keep track of if we should actually read this in or not
12220 }
12221
12222 SaveAgents(ctx);//agent trasmission system
12223
12224 RemotelyActivatedItemBehaviour raib = GetRemotelyActivatedItemBehaviour();
12225 if (raib)
12226 {
12227 raib.OnStoreSave(ctx);
12228 }
12229 }
12230 //----------------------------------------------------------------
12231
12232 override void AfterStoreLoad()
12233 {
12234 super.AfterStoreLoad();
12235
12237 {
12239 }
12240
12241 if (GetStoreLoadedQuantity() != float.LOWEST)
12242 {
12244 SetStoreLoadedQuantity(float.LOWEST);//IMPORTANT to do this !! we use 'm_StoreLoadedQuantity' inside SetQuantity to distinguish between initial quantity setting and the consequent(normal gameplay) calls
12245 }
12246 }
12247
12248 override void EEOnAfterLoad()
12249 {
12250 super.EEOnAfterLoad();
12251
12253 {
12254 m_FixDamageSystemInit = false;
12255 }
12256
12259 }
12260
12261 bool CanBeDisinfected()
12262 {
12263 return false;
12264 }
12265
12266
12267 //----------------------------------------------------------------
12268 override void OnVariablesSynchronized()
12269 {
12270 if (m_Initialized)
12271 {
12272 #ifdef PLATFORM_CONSOLE
12273 //bruteforce it is
12274 if (IsSplitable())
12275 {
12276 UIScriptedMenu menu = g_Game.GetUIManager().FindMenu(MENU_INVENTORY);
12277 if (menu)
12278 {
12279 menu.Refresh();
12280 }
12281 }
12282 #endif
12283 }
12284
12286 {
12287 PlayImpactSound(m_ConfigWeight, m_ImpactSpeed, m_ImpactSoundSurfaceHash);
12288 m_WantPlayImpactSound = false;
12289 }
12290
12292 {
12293 SetWeightDirty();
12295 }
12296 if (m_VarWet != m_VarWetPrev)
12297 {
12300 }
12301
12302 if (m_SoundSyncPlay != 0)
12303 {
12306
12307 m_SoundSyncPlay = 0;
12308 m_SoundSyncSlotID = -1;
12309 }
12310 if (m_SoundSyncStop != 0)
12311 {
12313 m_ItemSoundHandler.StopItemSoundClient(m_SoundSyncStop);
12314 m_SoundSyncStop = 0;
12315 }
12316
12317 super.OnVariablesSynchronized();
12318 }
12319
12320 //------------------------- Quantity
12321 //----------------------------------------------------------------
12323 override bool SetQuantity(float value, bool destroy_config = true, bool destroy_forced = false, bool allow_client = false, bool clamp_to_stack_max = true)
12324 {
12325 if (!IsServerCheck(allow_client))
12326 return false;
12327
12328 if (!HasQuantity())
12329 return false;
12330
12331 float min = GetQuantityMin();
12332 float max = GetQuantityMax();
12333
12334 if (value <= (min + 0.001))
12335 value = min;
12336
12337 if (value == min)
12338 {
12339 if (destroy_config)
12340 {
12341 bool dstr = ConfigGetBool("varQuantityDestroyOnMin");
12342 if (dstr)
12343 {
12344 m_VarQuantity = Math.Clamp(value, min, max);
12345 this.Delete();
12346 return true;
12347 }
12348 }
12349 else if (destroy_forced)
12350 {
12351 m_VarQuantity = Math.Clamp(value, min, max);
12352 this.Delete();
12353 return true;
12354 }
12355 // we get here if destroy_config IS true AND dstr(config destroy param) IS false;
12356 RemoveAllAgents();//we remove all agents when we got to the min value, but the item is not getting deleted
12357 }
12358
12359 float delta = m_VarQuantity;
12360 m_VarQuantity = Math.Clamp(value, min, max);
12361
12362 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
12363 {
12364 EntityAI parent = GetHierarchyRoot();
12365 InventoryLocation iLoc = new InventoryLocation();
12366 GetInventory().GetCurrentInventoryLocation(iLoc);
12367 if (iLoc && iLoc.IsValid() && delta != m_VarQuantity)
12368 {
12369 int iLocSlot = iLoc.GetSlot();
12370 if (delta < m_VarQuantity && iLoc.GetType() != InventoryLocationType.GROUND)
12371 {
12372 StartItemSoundServer(SoundConstants.ITEM_ATTACH, iLocSlot);
12373 }
12374 if (delta > m_VarQuantity && m_VarQuantity != 0 && !IsPrepareToDelete() && iLoc.GetType() == InventoryLocationType.ATTACHMENT)
12375 {
12376 StartItemSoundServer(SoundConstants.ITEM_DETACH, iLocSlot);
12377 }
12378 }
12379 }
12380
12381 if (GetStoreLoadedQuantity() == float.LOWEST)//any other value means we are setting quantity from storage
12382 {
12383 delta = m_VarQuantity - delta;
12384
12385 if (delta)
12386 OnQuantityChanged(delta);
12387 }
12388
12389 SetVariableMask(VARIABLE_QUANTITY);
12390
12391 return false;
12392 }
12393
12394 //----------------------------------------------------------------
12396 bool AddQuantity(float value, bool destroy_config = true, bool destroy_forced = false)
12397 {
12398 return SetQuantity(GetQuantity() + value, destroy_config, destroy_forced);
12399 }
12400 //----------------------------------------------------------------
12401 void SetQuantityMax()
12402 {
12403 float max = GetQuantityMax();
12404 SetQuantity(max);
12405 }
12406
12407 override void SetQuantityToMinimum()
12408 {
12409 float min = GetQuantityMin();
12410 SetQuantity(min);
12411 }
12412 //----------------------------------------------------------------
12414 override void SetQuantityNormalized(float value, bool destroy_config = true, bool destroy_forced = false)
12415 {
12416 float value_clamped = Math.Clamp(value, 0, 1);//just to make sure
12417 int result = Math.Round(Math.Lerp(GetQuantityMin(), GetQuantityMax(), value_clamped));
12418 SetQuantity(result, destroy_config, destroy_forced);
12419 }
12420
12421 //----------------------------------------------------------------
12423 override float GetQuantityNormalized()
12424 {
12425 return Math.InverseLerp(GetQuantityMin(), GetQuantityMax(),m_VarQuantity);
12426 }
12427
12429 {
12430 return GetQuantityNormalized();
12431 }
12432
12433 /*void SetAmmoNormalized(float value)
12434 {
12435 float value_clamped = Math.Clamp(value, 0, 1);
12436 Magazine this_mag = Magazine.Cast(this);
12437 int max_rounds = this_mag.GetAmmoMax();
12438 int result = value * max_rounds;//can the rounded if higher precision is required
12439 this_mag.SetAmmoCount(result);
12440 }*/
12441 //----------------------------------------------------------------
12442 override int GetQuantityMax()
12443 {
12444 int slot = -1;
12445 GameInventory inventory = GetInventory();
12446 if (inventory)
12447 {
12448 InventoryLocation il = new InventoryLocation;
12449 inventory.GetCurrentInventoryLocation(il);
12450 slot = il.GetSlot();
12451 }
12452
12453 return GetTargetQuantityMax(slot);
12454 }
12455
12456 override int GetTargetQuantityMax(int attSlotID = -1)
12457 {
12458 float quantity_max = 0;
12459
12460 if (IsSplitable()) //only stackable/splitable items can check for stack size
12461 {
12462 if (attSlotID != -1)
12463 quantity_max = InventorySlots.GetStackMaxForSlotId(attSlotID);
12464
12465 if (quantity_max <= 0)
12466 quantity_max = m_VarStackMax;
12467 }
12468
12469 if (quantity_max <= 0)
12470 quantity_max = m_VarQuantityMax;
12471
12472 return quantity_max;
12473 }
12474 //----------------------------------------------------------------
12475 override int GetQuantityMin()
12476 {
12477 return m_VarQuantityMin;
12478 }
12479 //----------------------------------------------------------------
12480 int GetQuantityInit()
12481 {
12482 return m_VarQuantityInit;
12483 }
12484
12485 //----------------------------------------------------------------
12486 override bool HasQuantity()
12487 {
12488 return !(GetQuantityMax() - GetQuantityMin() == 0);
12489 }
12490
12491 override float GetQuantity()
12492 {
12493 return m_VarQuantity;
12494 }
12495
12496 bool IsFullQuantity()
12497 {
12498 return GetQuantity() >= GetQuantityMax();
12499 }
12500
12501 //Calculates weight of single item without attachments and cargo
12502 override float GetSingleInventoryItemWeightEx()
12503 {
12504 //this needs to be first stored inside local variables, when returned directly during inside return call, the result is completely different due to enforce script bug
12505 float weightEx = GetWeightEx();//overall weight of the item
12506 float special = GetInventoryAndCargoWeight();//cargo and attachment weight
12507 return weightEx - special;
12508 }
12509
12510 // Obsolete, use GetSingleInventoryItemWeightEx() instead
12512 {
12514 }
12515
12516 override protected float GetWeightSpecialized(bool forceRecalc = false)
12517 {
12518 if (IsSplitable()) //quantity determines size of the stack
12519 {
12520 #ifdef DEVELOPER
12521 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12522 {
12523 WeightDebugData data1 = WeightDebug.GetWeightDebug(this);
12524 data1.SetCalcDetails("TIB1: " + GetConfigWeightModifiedDebugText() +" * " + GetQuantity()+"(quantity)");
12525 }
12526 #endif
12527
12528 return GetQuantity() * GetConfigWeightModified();
12529 }
12530 else if (HasEnergyManager())// items with energy manager
12531 {
12532 #ifdef DEVELOPER
12533 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12534 {
12535 WeightDebugData data2 = WeightDebug.GetWeightDebug(this);
12536 data2.SetCalcDetails("TIB2: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetCompEM().GetEnergy()+"(energy) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit)");
12537 }
12538 #endif
12539 return super.GetWeightSpecialized(forceRecalc) + (GetCompEM().GetEnergy() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12540 }
12541 else//everything else
12542 {
12543 #ifdef DEVELOPER
12544 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
12545 {
12546 WeightDebugData data3 = WeightDebug.GetWeightDebug(this);
12547 data3.SetCalcDetails("TIB3: "+super.GetWeightSpecialized(forceRecalc)+"(contents weight) + " + GetConfigWeightModifiedDebugText() +" + " + GetQuantity()+"(quantity) * " + ConfigGetFloat("weightPerQuantityUnit") +"(weightPerQuantityUnit))");
12548 }
12549 #endif
12550 return super.GetWeightSpecialized(forceRecalc) + (GetQuantity() * ConfigGetFloat("weightPerQuantityUnit")) + GetConfigWeightModified();
12551 }
12552 }
12553
12555 int GetNumberOfItems()
12556 {
12557 int item_count = 0;
12558 ItemBase item;
12559
12560 GameInventory inventory = GetInventory();
12561 CargoBase cargo = inventory.GetCargo();
12562 if (cargo != NULL)
12563 {
12564 item_count = cargo.GetItemCount();
12565 }
12566
12567 int nAttachments = inventory.AttachmentCount();
12568 for (int i = 0; i < nAttachments; ++i)
12569 {
12570 Class.CastTo(item, inventory.GetAttachmentFromIndex(i));
12571 if (item)
12572 item_count += item.GetNumberOfItems();
12573 }
12574 return item_count;
12575 }
12576
12578 float GetUnitWeight(bool include_wetness = true)
12579 {
12580 float weight = 0;
12581 float wetness = 1;
12582 if (include_wetness)
12583 wetness += GetWet();
12584 if (IsSplitable()) //quantity determines size of the stack
12585 {
12586 weight = wetness * m_ConfigWeight;
12587 }
12588 else if (IsLiquidContainer()) //is a liquid container, default liquid weight is set to 1. May revisit later?
12589 {
12590 weight = 1;
12591 }
12592 return weight;
12593 }
12594
12595 //-----------------------------------------------------------------
12596
12597 override void ClearInventory()
12598 {
12599 GameInventory inventory = GetInventory();
12600 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
12601 {
12602 array<EntityAI> items = new array<EntityAI>;
12603 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
12604 for (int i = 0; i < items.Count(); ++i)
12605 {
12606 ItemBase item = ItemBase.Cast(items.Get(i));
12607 if (item)
12608 {
12609 g_Game.ObjectDelete(item);
12610 }
12611 }
12612 }
12613 }
12614
12615 //------------------------- Energy
12616
12617 //----------------------------------------------------------------
12618 float GetEnergy()
12619 {
12620 float energy = 0;
12621 if (HasEnergyManager())
12622 {
12623 energy = GetCompEM().GetEnergy();
12624 }
12625 return energy;
12626 }
12627
12628
12629 override void OnEnergyConsumed()
12630 {
12631 super.OnEnergyConsumed();
12632
12634 }
12635
12636 override void OnEnergyAdded()
12637 {
12638 super.OnEnergyAdded();
12639
12641 }
12642
12643 // Converts energy (from Energy Manager) to quantity, if enabled.
12645 {
12646 if (g_Game.IsServer() && HasEnergyManager() && GetCompEM().HasConversionOfEnergyToQuantity())
12647 {
12648 if (HasQuantity())
12649 {
12650 float energy_0to1 = GetCompEM().GetEnergy0To1();
12651 SetQuantityNormalized(energy_0to1);
12652 }
12653 }
12654 }
12655
12656 //----------------------------------------------------------------
12657 float GetHeatIsolationInit()
12658 {
12659 return ConfigGetFloat("heatIsolation");
12660 }
12661
12662 float GetHeatIsolation()
12663 {
12664 return m_HeatIsolation;
12665 }
12666
12667 float GetDryingIncrement(string pIncrementName)
12668 {
12669 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Drying %2", GetType(), pIncrementName);
12670 if (g_Game.ConfigIsExisting(paramPath))
12671 return g_Game.ConfigGetFloat(paramPath);
12672
12673 return 0.0;
12674 }
12675
12676 float GetSoakingIncrement(string pIncrementName)
12677 {
12678 string paramPath = string.Format("CfgVehicles %1 EnvironmentWetnessIncrements Soaking %2", GetType(), pIncrementName);
12679 if (g_Game.ConfigIsExisting(paramPath))
12680 return g_Game.ConfigGetFloat(paramPath);
12681
12682 return 0.0;
12683 }
12684 //----------------------------------------------------------------
12685 override void SetWet(float value, bool allow_client = false)
12686 {
12687 if (!IsServerCheck(allow_client))
12688 return;
12689
12690 float min = GetWetMin();
12691 float max = GetWetMax();
12692
12693 float previousValue = m_VarWet;
12694
12695 m_VarWet = Math.Clamp(value, min, max);
12696
12697 if (previousValue != m_VarWet)
12698 {
12699 SetVariableMask(VARIABLE_WET);
12700 OnWetChanged(m_VarWet, previousValue);
12701 }
12702 }
12703 //----------------------------------------------------------------
12704 override void AddWet(float value)
12705 {
12706 SetWet(GetWet() + value);
12707 }
12708 //----------------------------------------------------------------
12709 override void SetWetMax()
12710 {
12712 }
12713 //----------------------------------------------------------------
12714 override float GetWet()
12715 {
12716 return m_VarWet;
12717 }
12718 //----------------------------------------------------------------
12719 override float GetWetMax()
12720 {
12721 return m_VarWetMax;
12722 }
12723 //----------------------------------------------------------------
12724 override float GetWetMin()
12725 {
12726 return m_VarWetMin;
12727 }
12728 //----------------------------------------------------------------
12729 override float GetWetInit()
12730 {
12731 return m_VarWetInit;
12732 }
12733 //----------------------------------------------------------------
12734 override void OnWetChanged(float newVal, float oldVal)
12735 {
12736 EWetnessLevel newLevel = GetWetLevelInternal(newVal);
12737 EWetnessLevel oldLevel = GetWetLevelInternal(oldVal);
12738 if (newLevel != oldLevel)
12739 {
12740 OnWetLevelChanged(newLevel,oldLevel);
12741 }
12742 }
12743
12744 override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
12745 {
12746 SetWeightDirty();
12747 }
12748
12749 override EWetnessLevel GetWetLevel()
12750 {
12751 return GetWetLevelInternal(m_VarWet);
12752 }
12753
12754 //----------------------------------------------------------------
12755
12756 override void SetStoreLoad(bool value)
12757 {
12758 m_IsStoreLoad = value;
12759 }
12760
12761 override bool IsStoreLoad()
12762 {
12763 return m_IsStoreLoad;
12764 }
12765
12766 override void SetStoreLoadedQuantity(float value)
12767 {
12768 m_StoreLoadedQuantity = value;
12769 }
12770
12771 override float GetStoreLoadedQuantity()
12772 {
12773 return m_StoreLoadedQuantity;
12774 }
12775
12776 //----------------------------------------------------------------
12777
12778 float GetItemModelLength()
12779 {
12780 if (ConfigIsExisting("itemModelLength"))
12781 {
12782 return ConfigGetFloat("itemModelLength");
12783 }
12784 return 0;
12785 }
12786
12787 float GetItemAttachOffset()
12788 {
12789 if (ConfigIsExisting("itemAttachOffset"))
12790 {
12791 return ConfigGetFloat("itemAttachOffset");
12792 }
12793 return 0;
12794 }
12795
12796 override void SetCleanness(int value, bool allow_client = false)
12797 {
12798 if (!IsServerCheck(allow_client))
12799 return;
12800
12801 int previousValue = m_Cleanness;
12802
12803 m_Cleanness = Math.Clamp(value, m_CleannessMin, m_CleannessMax);
12804
12805 if (previousValue != m_Cleanness)
12806 SetVariableMask(VARIABLE_CLEANNESS);
12807 }
12808
12809 override int GetCleanness()
12810 {
12811 return m_Cleanness;
12812 }
12813
12815 {
12816 return true;
12817 }
12818
12819 //----------------------------------------------------------------
12820 // ATTACHMENT LOCKING
12821 // Getters relevant to generic ActionLockAttachment
12822 int GetLockType()
12823 {
12824 return m_LockType;
12825 }
12826
12827 string GetLockSoundSet()
12828 {
12829 return m_LockSoundSet;
12830 }
12831
12832 //----------------------------------------------------------------
12833 //------------------------- Color
12834 // sets items color variable given color components
12835 override void SetColor(int r, int g, int b, int a)
12836 {
12841 SetVariableMask(VARIABLE_COLOR);
12842 }
12844 override void GetColor(out int r,out int g,out int b,out int a)
12845 {
12850 }
12851
12852 bool IsColorSet()
12853 {
12854 return IsVariableSet(VARIABLE_COLOR);
12855 }
12856
12858 string GetColorString()
12859 {
12860 int r,g,b,a;
12861 GetColor(r,g,b,a);
12862 r = r/255;
12863 g = g/255;
12864 b = b/255;
12865 a = a/255;
12866 return MiscGameplayFunctions.GetColorString(r, g, b, a);
12867 }
12868 //----------------------------------------------------------------
12869 //------------------------- LiquidType
12870
12871 override void SetLiquidType(int value, bool allow_client = false)
12872 {
12873 if (!IsServerCheck(allow_client))
12874 return;
12875
12876 int old = m_VarLiquidType;
12877 m_VarLiquidType = value;
12878 OnLiquidTypeChanged(old,value);
12879 SetVariableMask(VARIABLE_LIQUIDTYPE);
12880 }
12881
12882 int GetLiquidTypeInit()
12883 {
12884 return ConfigGetInt("varLiquidTypeInit");
12885 }
12886
12887 override int GetLiquidType()
12888 {
12889 return m_VarLiquidType;
12890 }
12891
12892 protected void OnLiquidTypeChanged(int oldType, int newType)
12893 {
12894 if (newType == LIQUID_NONE && GetIsFrozen())
12895 SetFrozen(false);
12896 }
12897
12899 void UpdateQuickbarShortcutVisibility(PlayerBase player)
12900 {
12901 player.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12902 }
12903
12904 // -------------------------------------------------------------------------
12906 void OnInventoryEnter(Man player)
12907 {
12908 PlayerBase nplayer;
12909 if (PlayerBase.CastTo(nplayer, player))
12910 {
12911 m_CanPlayImpactSound = true;
12912 nplayer.SetEnableQuickBarEntityShortcut(this,!GetHierarchyParent() || GetHierarchyParent().GetInventory().AreChildrenAccessible());
12913 }
12914 }
12915
12916 // -------------------------------------------------------------------------
12918 void OnInventoryExit(Man player)
12919 {
12920 PlayerBase nplayer;
12921 if (PlayerBase.CastTo(nplayer,player))
12922 {
12923 nplayer.SetEnableQuickBarEntityShortcut(this, false);
12924 }
12925
12926 player.GetHumanInventory().ClearUserReservedLocationForContainer(this);
12927
12928 if (HasEnergyManager())
12929 {
12930 GetCompEM().UpdatePlugState(); // Unplug the el. device if it's necesarry.
12931 }
12932 }
12933
12934 // ADVANCED PLACEMENT EVENTS
12935 override void OnPlacementStarted(Man player)
12936 {
12937 super.OnPlacementStarted(player);
12938
12939 SetTakeable(false);
12940 }
12941
12942 override void OnPlacementComplete(Man player, vector position = "0 0 0", vector orientation = "0 0 0")
12943 {
12944 if (m_AdminLog)
12945 {
12946 m_AdminLog.OnPlacementComplete(player, this);
12947 }
12948
12949 super.OnPlacementComplete(player, position, orientation);
12950 }
12951
12952 //-----------------------------
12953 // AGENT SYSTEM
12954 //-----------------------------
12955 //--------------------------------------------------------------------------
12956 bool ContainsAgent(int agent_id)
12957 {
12958 if (agent_id & m_AttachedAgents)
12959 {
12960 return true;
12961 }
12962 else
12963 {
12964 return false;
12965 }
12966 }
12967
12968 //--------------------------------------------------------------------------
12969 override void RemoveAgent(int agent_id)
12970 {
12971 if (ContainsAgent(agent_id))
12972 {
12973 m_AttachedAgents = ~agent_id & m_AttachedAgents;
12974 }
12975 }
12976
12977 //--------------------------------------------------------------------------
12978 override void RemoveAllAgents()
12979 {
12980 m_AttachedAgents = 0;
12981 }
12982 //--------------------------------------------------------------------------
12983 override void RemoveAllAgentsExcept(int agent_to_keep)
12984 {
12985 m_AttachedAgents = m_AttachedAgents & agent_to_keep;
12986 }
12987 // -------------------------------------------------------------------------
12988 override void InsertAgent(int agent, float count = 1)
12989 {
12990 if (count < 1)
12991 return;
12992 //Debug.Log("Inserting Agent on item: " + agent.ToString() +" count: " + count.ToString());
12994 }
12995
12997 void TransferAgents(int agents)
12998 {
13000 }
13001
13002 // -------------------------------------------------------------------------
13003 override int GetAgents()
13004 {
13005 return m_AttachedAgents;
13006 }
13007 //----------------------------------------------------------------------
13008
13009 /*int GetContaminationType()
13010 {
13011 int contamination_type;
13012
13013 const int CONTAMINATED_MASK = eAgents.CHOLERA | eAgents.INFLUENZA | eAgents.SALMONELLA | eAgents.BRAIN;
13014 const int POISONED_MASK = eAgents.FOOD_POISON | eAgents.CHEMICAL_POISON;
13015 const int NERVE_GAS_MASK = eAgents.CHEMICAL_POISON;
13016 const int DIRTY_MASK = eAgents.WOUND_AGENT;
13017
13018 Edible_Base edible = Edible_Base.Cast(this);
13019 int agents = GetAgents();
13020 if (edible)
13021 {
13022 NutritionalProfile profile = Edible_Base.GetNutritionalProfile(edible);
13023 if (profile)
13024 {
13025 agents = agents | profile.GetAgents();//merge item's agents with nutritional agents
13026 }
13027 }
13028 if (agents & CONTAMINATED_MASK)
13029 {
13030 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_CONTAMINATED;
13031 }
13032 if (agents & POISONED_MASK)
13033 {
13034 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_POISONED;
13035 }
13036 if (agents & NERVE_GAS_MASK)
13037 {
13038 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_NERVE_GAS;
13039 }
13040 if (agents & DIRTY_MASK)
13041 {
13042 contamination_type = contamination_type | EContaminationTypes.ITEM_BADGE_DIRTY;
13043 }
13044
13045 return agents;
13046 }*/
13047
13048 // -------------------------------------------------------------------------
13049 bool LoadAgents(ParamsReadContext ctx, int version)
13050 {
13051 if (!ctx.Read(m_AttachedAgents))
13052 return false;
13053 return true;
13054 }
13055 // -------------------------------------------------------------------------
13057 {
13058
13060 }
13061 // -------------------------------------------------------------------------
13062
13064 override void CheckForRoofLimited(float timeTresholdMS = 3000)
13065 {
13066 super.CheckForRoofLimited(timeTresholdMS);
13067
13068 float time = g_Game.GetTime();
13069 if ((time - m_PreviousRoofTestTime) >= timeTresholdMS)
13070 {
13071 m_PreviousRoofTestTime = time;
13072 SetRoofAbove(MiscGameplayFunctions.IsUnderRoof(this));
13073 }
13074 }
13075
13076 // returns item's protection level against enviromental hazard, for masks with filters, returns the filters protection for valid filter, otherwise 0
13077 float GetProtectionLevel(int type, bool consider_filter = false, int system = 0)
13078 {
13079 if (IsDamageDestroyed() || (HasQuantity() && GetQuantity() <= 0))
13080 {
13081 return 0;
13082 }
13083
13084 if (GetInventory().GetAttachmentSlotsCount() != 0)//is it an item with attachable filter ?
13085 {
13086 ItemBase filter = ItemBase.Cast(FindAttachmentBySlotName("GasMaskFilter"));
13087 if (filter)
13088 return filter.GetProtectionLevel(type, false, system);//it's a valid filter, return the protection
13089 else
13090 return 0;//otherwise return 0 when no filter attached
13091 }
13092
13093 string subclassPath, entryName;
13094
13095 switch (type)
13096 {
13097 case DEF_BIOLOGICAL:
13098 entryName = "biological";
13099 break;
13100 case DEF_CHEMICAL:
13101 entryName = "chemical";
13102 break;
13103 default:
13104 entryName = "biological";
13105 break;
13106 }
13107
13108 subclassPath = "CfgVehicles " + this.GetType() + " Protection ";
13109
13110 return g_Game.ConfigGetFloat(subclassPath + entryName);
13111 }
13112
13113
13114
13116 override void EEOnCECreate()
13117 {
13118 if (!IsMagazine())
13120
13122 }
13123
13124
13125 //-------------------------
13126 // OPEN/CLOSE USER ACTIONS
13127 //-------------------------
13129 void Open();
13130 void Close();
13131 bool IsOpen()
13132 {
13133 return true;
13134 }
13135
13136 override bool CanDisplayCargo()
13137 {
13138 return IsOpen();
13139 }
13140
13141
13142 // ------------------------------------------------------------
13143 // CONDITIONS
13144 // ------------------------------------------------------------
13145 override bool CanPutInCargo(EntityAI parent)
13146 {
13147 if (parent)
13148 {
13149 if (parent.IsInherited(DayZInfected))
13150 return true;
13151
13152 if (!parent.IsRuined())
13153 return true;
13154 }
13155
13156 return true;
13157 }
13158
13159 override bool CanPutAsAttachment(EntityAI parent)
13160 {
13161 if (!super.CanPutAsAttachment(parent))
13162 {
13163 return false;
13164 }
13165
13166 if (!IsRuined() && !parent.IsRuined())
13167 {
13168 return true;
13169 }
13170
13171 return false;
13172 }
13173
13174 override bool CanReceiveItemIntoCargo(EntityAI item)
13175 {
13176 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13177 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13178 // return false;
13179
13180 return super.CanReceiveItemIntoCargo(item);
13181 }
13182
13183 override bool CanReceiveAttachment(EntityAI attachment, int slotId)
13184 {
13185 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13186 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13187 // return false;
13188
13189 GameInventory attachmentInv = attachment.GetInventory();
13190 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13191 {
13192 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13193 return false;
13194 }
13195
13196 InventoryLocation loc = new InventoryLocation();
13197 attachment.GetInventory().GetCurrentInventoryLocation(loc);
13198 if (loc && loc.IsValid() && !GetInventory().AreChildrenAccessible())
13199 return false;
13200
13201 return super.CanReceiveAttachment(attachment, slotId);
13202 }
13203
13204 override bool CanReleaseAttachment(EntityAI attachment)
13205 {
13206 if (!super.CanReleaseAttachment(attachment))
13207 return false;
13208
13209 return GetInventory().AreChildrenAccessible();
13210 }
13211
13212 /*override bool CanLoadAttachment(EntityAI attachment)
13213 {
13214 //removed 15.06. coz of loading from storage -> after load items in cargo was lost -> waiting for proper solution
13215 //if (GetHealthLevel() == GameConstants.STATE_RUINED)
13216 // return false;
13217
13218 GameInventory attachmentInv = attachment.GetInventory();
13219 if (attachmentInv && attachmentInv.GetCargo() && attachmentInv.GetCargo().GetItemCount() > 0)
13220 {
13221 bool boo = (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase));
13222 ErrorEx("CanLoadAttachment | this: " + this + " | attachment: " + attachment + " | boo: " + boo,ErrorExSeverity.INFO);
13223
13224 if (GetHierarchyParent() && !GetHierarchyParent().IsInherited(PlayerBase))
13225 return false;
13226 }
13227
13228 return super.CanLoadAttachment(attachment);
13229 }*/
13230
13231 // Plays muzzle flash particle effects
13232 static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13233 {
13234 int id = muzzle_owner.GetMuzzleID();
13235 array<ref WeaponParticlesOnFire> WPOF_array = m_OnFireEffect.Get(id);
13236
13237 if (WPOF_array)
13238 {
13239 for (int i = 0; i < WPOF_array.Count(); i++)
13240 {
13241 WeaponParticlesOnFire WPOF = WPOF_array.Get(i);
13242
13243 if (WPOF)
13244 {
13245 WPOF.OnActivate(weapon, muzzle_index, ammoType, muzzle_owner, suppressor, config_to_search);
13246 }
13247 }
13248 }
13249 }
13250
13251 // Plays bullet eject particle effects (usually just smoke, the bullet itself is a 3D model and is not part of this function)
13252 static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13253 {
13254 int id = muzzle_owner.GetMuzzleID();
13255 array<ref WeaponParticlesOnBulletCasingEject> WPOBE_array = m_OnBulletCasingEjectEffect.Get(id);
13256
13257 if (WPOBE_array)
13258 {
13259 for (int i = 0; i < WPOBE_array.Count(); i++)
13260 {
13261 WeaponParticlesOnBulletCasingEject WPOBE = WPOBE_array.Get(i);
13262
13263 if (WPOBE)
13264 {
13265 WPOBE.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13266 }
13267 }
13268 }
13269 }
13270
13271 // Plays all weapon overheating particles
13272 static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13273 {
13274 int id = muzzle_owner.GetMuzzleID();
13275 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13276
13277 if (WPOOH_array)
13278 {
13279 for (int i = 0; i < WPOOH_array.Count(); i++)
13280 {
13281 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13282
13283 if (WPOOH)
13284 {
13285 WPOOH.OnActivate(weapon, 0, ammoType, muzzle_owner, suppressor, config_to_search);
13286 }
13287 }
13288 }
13289 }
13290
13291 // Updates all weapon overheating particles
13292 static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13293 {
13294 int id = muzzle_owner.GetMuzzleID();
13295 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13296
13297 if (WPOOH_array)
13298 {
13299 for (int i = 0; i < WPOOH_array.Count(); i++)
13300 {
13301 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13302
13303 if (WPOOH)
13304 {
13305 WPOOH.OnUpdate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13306 }
13307 }
13308 }
13309 }
13310
13311 // Stops overheating particles
13312 static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
13313 {
13314 int id = muzzle_owner.GetMuzzleID();
13315 array<ref WeaponParticlesOnOverheating> WPOOH_array = weapon.m_OnOverheatingEffect.Get(id);
13316
13317 if (WPOOH_array)
13318 {
13319 for (int i = 0; i < WPOOH_array.Count(); i++)
13320 {
13321 WeaponParticlesOnOverheating WPOOH = WPOOH_array.Get(i);
13322
13323 if (WPOOH)
13324 {
13325 WPOOH.OnDeactivate(weapon, ammoType, muzzle_owner, suppressor, config_to_search);
13326 }
13327 }
13328 }
13329 }
13330
13331 //----------------------------------------------------------------
13332 //Item Behaviour - unified approach
13333 override bool IsHeavyBehaviour()
13334 {
13335 if (m_ItemBehaviour == 0)
13336 {
13337 return true;
13338 }
13339
13340 return false;
13341 }
13342
13343 override bool IsOneHandedBehaviour()
13344 {
13345 if (m_ItemBehaviour == 1)
13346 {
13347 return true;
13348 }
13349
13350 return false;
13351 }
13352
13353 override bool IsTwoHandedBehaviour()
13354 {
13355 if (m_ItemBehaviour == 2)
13356 {
13357 return true;
13358 }
13359
13360 return false;
13361 }
13362
13363 bool IsDeployable()
13364 {
13365 return false;
13366 }
13367
13369 float GetDeployTime()
13370 {
13371 return UATimeSpent.DEFAULT_DEPLOY;
13372 }
13373
13374
13375 //----------------------------------------------------------------
13376 // Item Targeting (User Actions)
13377 override void SetTakeable(bool pState)
13378 {
13379 m_IsTakeable = pState;
13380 SetSynchDirty();
13381 }
13382
13383 override bool IsTakeable()
13384 {
13385 return m_IsTakeable;
13386 }
13387
13388 // For cases where we want to show object widget which cant be taken to hands
13390 {
13391 return false;
13392 }
13393
13395 protected void PreLoadSoundAttachmentType()
13396 {
13397 string att_type = "None";
13398
13399 if (ConfigIsExisting("soundAttType"))
13400 {
13401 att_type = ConfigGetString("soundAttType");
13402 }
13403
13404 m_SoundAttType = att_type;
13405 }
13406
13407 override string GetAttachmentSoundType()
13408 {
13409 return m_SoundAttType;
13410 }
13411
13412 //----------------------------------------------------------------
13413 //SOUNDS - ItemSoundHandler
13414 //----------------------------------------------------------------
13415
13416 string GetPlaceSoundset(); // played when deploy starts
13417 string GetLoopDeploySoundset(); // played when deploy starts and stopped when it finishes
13418 string GetDeploySoundset(); // played when deploy sucessfully finishes
13419 string GetLoopFoldSoundset(); // played when fold starts and stopped when it finishes
13420 string GetFoldSoundset(); // played when fold sucessfully finishes
13421
13423 {
13424 if (!m_ItemSoundHandler)
13426
13427 return m_ItemSoundHandler;
13428 }
13429
13430 // override to initialize sounds
13431 protected void InitItemSounds()
13432 {
13433 if (GetPlaceSoundset() == string.Empty && GetDeploySoundset() == string.Empty && GetLoopDeploySoundset() == string.Empty && !GetInventoryItemType().SetDetachSoundEvent() && !GetInventoryItemType().SetAttachSoundEvent())
13434 return;
13435
13437
13438 if (GetPlaceSoundset() != string.Empty)
13439 handler.AddSound(SoundConstants.ITEM_PLACE, GetPlaceSoundset());
13440
13441 if (GetDeploySoundset() != string.Empty)
13442 handler.AddSound(SoundConstants.ITEM_DEPLOY, GetDeploySoundset());
13443
13444 SoundParameters params = new SoundParameters();
13445 params.m_Loop = true;
13446 if (GetLoopDeploySoundset() != string.Empty)
13447 handler.AddSound(SoundConstants.ITEM_DEPLOY_LOOP, GetLoopDeploySoundset(), params);
13448 }
13449
13450 // Start sound using ItemSoundHandler
13451 void StartItemSoundServer(int id, int slotId)
13452 {
13453 if (g_Game.IsServer() || !g_Game.IsMultiplayer()) // single player or server side multiplayer
13454 {
13455 m_SoundSyncSlotID = slotId;
13456 m_SoundSyncPlay = id;
13457
13458 SetSynchDirty();
13459
13460 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStartItemSoundServer); // in case one is queued already
13461 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStartItemSoundServer, 100);
13462 }
13463 }
13464
13465 void StartItemSoundServer(int id)
13466 {
13467 StartItemSoundServer(id, InventorySlots.INVALID);
13468 }
13469
13470 // Stop sound using ItemSoundHandler
13471 void StopItemSoundServer(int id)
13472 {
13473 if (!g_Game.IsServer())
13474 return;
13475
13476 m_SoundSyncStop = id;
13477 SetSynchDirty();
13478
13479 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(ClearStopItemSoundServer); // in case one is queued already
13480 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(ClearStopItemSoundServer, 100);
13481 }
13482
13483 protected void ClearStartItemSoundServer()
13484 {
13485 m_SoundSyncPlay = 0;
13486 m_SoundSyncSlotID = InventorySlots.INVALID;
13487 }
13488
13489 protected void ClearStopItemSoundServer()
13490 {
13491 m_SoundSyncStop = 0;
13492 }
13493
13494 void OnApply(PlayerBase player);
13495
13497 {
13498 return 1.0;
13499 };
13500 //returns applicable selection
13501 array<string> GetHeadHidingSelection()
13502 {
13504 }
13505
13507 {
13509 }
13510
13511 WrittenNoteData GetWrittenNoteData() {};
13512
13514 {
13515 SetDynamicPhysicsLifeTime(0.01);
13516 m_ItemBeingDroppedPhys = false;
13517 }
13518
13520 {
13521 array<string> zone_names = new array<string>;
13522 GetDamageZones(zone_names);
13523 for (int i = 0; i < zone_names.Count(); i++)
13524 {
13525 SetHealthMax(zone_names.Get(i),"Health");
13526 }
13527 SetHealthMax("","Health");
13528 }
13529
13531 void SetZoneDamageCEInit()
13532 {
13533 float global_health = GetHealth01("","Health");
13534 array<string> zones = new array<string>;
13535 GetDamageZones(zones);
13536 //set damage of all zones to match global health level
13537 for (int i = 0; i < zones.Count(); i++)
13538 {
13539 SetHealth01(zones.Get(i),"Health",global_health);
13540 }
13541 }
13542
13544 bool IsCoverFaceForShave(string slot_name)
13545 {
13546 return IsExclusionFlagPresent(PlayerBase.GetFaceCoverageShaveValues());
13547 }
13548
13549 void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13550 {
13551 if (!hasRootAsPlayer)
13552 {
13553 if (refParentIB)
13554 {
13555 // parent is wet
13556 if ((refParentIB.GetWet() >= GameConstants.STATE_SOAKING_WET) && (m_VarWet < m_VarWetMax))
13557 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_INSIDE);
13558 // parent has liquid inside
13559 else if ((refParentIB.GetLiquidType() != 0) && (refParentIB.GetQuantity() > 0) && (m_VarWet < m_VarWetMax))
13560 AddWet(delta * GameConstants.WETNESS_RATE_WETTING_LIQUID);
13561 // drying
13562 else if (m_VarWet > m_VarWetMin)
13563 AddWet(-1 * delta * GetDryingIncrement("ground") * 2);
13564 }
13565 else
13566 {
13567 // drying on ground or inside non-itembase (car, ...)
13568 if (m_VarWet > m_VarWetMin)
13569 AddWet(-1 * delta * GetDryingIncrement("ground"));
13570 }
13571 }
13572 }
13573
13574 void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13575 {
13577 {
13578 float target = g_Game.GetMission().GetWorldData().GetBaseEnvTemperatureAtObject(this);
13579 if (GetTemperature() != target || !IsFreezeThawProgressFinished())
13580 {
13581 float heatPermCoef = 1.0;
13582 EntityAI ent = this;
13583 while (ent)
13584 {
13585 heatPermCoef *= ent.GetHeatPermeabilityCoef();
13586 ent = ent.GetHierarchyParent();
13587 }
13588
13589 SetTemperatureEx(new TemperatureDataInterpolated(target,ETemperatureAccessTypes.ACCESS_WORLD,delta,GameConstants.TEMP_COEF_WORLD,heatPermCoef));
13590 }
13591 }
13592 }
13593
13594 void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
13595 {
13596 // hierarchy check for an item to decide whether it has some parent and it is in some player inventory
13597 EntityAI parent = GetHierarchyParent();
13598 if (!parent)
13599 {
13600 hasParent = false;
13601 hasRootAsPlayer = false;
13602 }
13603 else
13604 {
13605 hasParent = true;
13606 hasRootAsPlayer = (GetHierarchyRootPlayer() != null);
13607 refParentIB = ItemBase.Cast(parent);
13608 }
13609 }
13610
13611 protected void ProcessDecay(float delta, bool hasRootAsPlayer)
13612 {
13613 // this is stub, implemented on Edible_Base
13614 }
13615
13616 bool CanDecay()
13617 {
13618 // return true used on selected food clases so they can decay
13619 return false;
13620 }
13621
13622 protected bool CanProcessDecay()
13623 {
13624 // this is stub, implemented on Edible_Base class
13625 // used to determine whether it is still necessary for the food to decay
13626 return false;
13627 }
13628
13629 protected bool CanHaveWetness()
13630 {
13631 // return true used on selected items that have a wetness effect
13632 return false;
13633 }
13634
13636 bool CanBeConsumed(ConsumeConditionData data = null)
13637 {
13638 return !GetIsFrozen() && IsOpen();
13639 }
13640
13641 override void ProcessVariables()
13642 {
13643 bool hasParent = false, hasRootAsPlayer = false;
13644 ItemBase refParentIB;
13645
13646 bool wwtu = g_Game.IsWorldWetTempUpdateEnabled();
13647 bool foodDecay = g_Game.IsFoodDecayEnabled();
13648
13649 if (wwtu || foodDecay)
13650 {
13651 bool processWetness = wwtu && CanHaveWetness();
13652 bool processTemperature = wwtu && CanHaveTemperature();
13653 bool processDecay = foodDecay && CanDecay() && CanProcessDecay();
13654
13655 if (processWetness || processTemperature || processDecay)
13656 {
13657 HierarchyCheck(hasParent, hasRootAsPlayer, refParentIB);
13658
13659 if (processWetness)
13660 ProcessItemWetness(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13661
13662 if (processTemperature)
13663 ProcessItemTemperature(m_ElapsedSinceLastUpdate, hasParent, hasRootAsPlayer, refParentIB);
13664
13665 if (processDecay)
13666 ProcessDecay(m_ElapsedSinceLastUpdate, hasRootAsPlayer);
13667 }
13668 }
13669 }
13670
13673 {
13674 return m_TemperaturePerQuantityWeight * GameConstants.ITEM_TEMPERATURE_QUANTITY_WEIGHT_MULTIPLIER;
13675 }
13676
13677 override float GetTemperatureFreezeThreshold()
13678 {
13680 return Liquid.GetFreezeThreshold(GetLiquidType());
13681
13682 return super.GetTemperatureFreezeThreshold();
13683 }
13684
13685 override float GetTemperatureThawThreshold()
13686 {
13688 return Liquid.GetThawThreshold(GetLiquidType());
13689
13690 return super.GetTemperatureThawThreshold();
13691 }
13692
13693 override float GetItemOverheatThreshold()
13694 {
13696 return Liquid.GetBoilThreshold(GetLiquidType());
13697
13698 return super.GetItemOverheatThreshold();
13699 }
13700
13701 override float GetTemperatureFreezeTime()
13702 {
13703 if (HasQuantity())
13704 return Math.Lerp(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureFreezeTime()),GetQuantityNormalized());
13705
13706 return super.GetTemperatureFreezeTime();
13707 }
13708
13709 override float GetTemperatureThawTime()
13710 {
13711 if (HasQuantity())
13712 return Math.Lerp(GameConstants.TEMPERATURE_TIME_THAW_MIN,Math.Max(GameConstants.TEMPERATURE_TIME_FREEZE_MIN,super.GetTemperatureThawTime()),GetQuantityNormalized());
13713
13714 return super.GetTemperatureThawTime();
13715 }
13716
13718 void AffectLiquidContainerOnFill(int liquid_type, float amount);
13720 void AffectLiquidContainerOnTransfer(int liquidType, float amount, float sourceLiquidTemperature);
13721
13722 bool IsCargoException4x3(EntityAI item)
13723 {
13724 return (item.IsKindOf("Cauldron") || item.IsKindOf("Pot") || item.IsKindOf("FryingPan") || item.IsKindOf("SmallProtectorCase") || (item.IsKindOf("PortableGasStove") && item.FindAttachmentBySlotName("CookingEquipment")));
13725 }
13726
13728 {
13729 MiscGameplayFunctions.TransferItemProperties(oldItem, this);
13730 }
13731
13733 void AddLightSourceItem(ItemBase lightsource)
13734 {
13735 m_LightSourceItem = lightsource;
13736 }
13737
13739 {
13740 m_LightSourceItem = null;
13741 }
13742
13744 {
13745 return m_LightSourceItem;
13746 }
13747
13749 array<int> GetValidFinishers()
13750 {
13751 return null;
13752 }
13753
13755 bool GetActionWidgetOverride(out typename name)
13756 {
13757 return false;
13758 }
13759
13760 bool PairWithDevice(notnull ItemBase otherDevice)
13761 {
13762 if (g_Game.IsServer())
13763 {
13764 ItemBase explosive = otherDevice;
13766 if (!trg)
13767 {
13768 trg = RemoteDetonatorTrigger.Cast(otherDevice);
13769 explosive = this;
13770 }
13771
13772 explosive.PairRemote(trg);
13773 trg.SetControlledDevice(explosive);
13774
13775 int persistentID = RemotelyActivatedItemBehaviour.GeneratePersistentID();
13776 trg.SetPersistentPairID(persistentID);
13777 explosive.SetPersistentPairID(persistentID);
13778
13779 return true;
13780 }
13781 return false;
13782 }
13783
13785 float GetBaitEffectivity()
13786 {
13787 float ret = 1.0;
13788 if (HasQuantity())
13789 ret *= GetQuantityNormalized();
13790 ret *= GetHealth01();
13791
13792 return ret;
13793 }
13794
13795 #ifdef DEVELOPER
13796 override void SetDebugItem()
13797 {
13798 super.SetDebugItem();
13799 _itemBase = this;
13800 }
13801
13802 override string GetDebugText()
13803 {
13804 string text = super.GetDebugText();
13805
13806 text += string.Format("Heat isolation(raw): %1\n", GetHeatIsolation());
13807 text += string.Format("Heat isolation(modified): %1\n", MiscGameplayFunctions.GetCurrentItemHeatIsolation(this));
13808
13809 return text;
13810 }
13811 #endif
13812
13813 bool CanBeUsedForSuicide()
13814 {
13815 return true;
13816 }
13817
13819 //DEPRECATED BELOW
13821 // Backwards compatibility
13822 void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
13823 {
13824 ProcessItemWetness(delta, hasParent, hasRootAsPlayer, refParentIB);
13825 ProcessItemTemperature(delta, hasParent, hasRootAsPlayer, refParentIB);
13826 }
13827
13828 // replaced by ItemSoundHandler
13829 protected EffectSound m_SoundDeployFinish;
13830 protected EffectSound m_SoundPlace;
13831 protected EffectSound m_DeployLoopSoundEx;
13832 protected EffectSound m_SoundDeploy;
13833 bool m_IsPlaceSound;
13834 bool m_IsDeploySound;
13836
13837 string GetDeployFinishSoundset();
13838 void PlayDeploySound();
13839 void PlayDeployFinishSound();
13840 void PlayPlaceSound();
13841 void PlayDeployLoopSoundEx();
13842 void StopDeployLoopSoundEx();
13843 void SoundSynchRemoteReset();
13844 void SoundSynchRemote();
13845 bool UsesGlobalDeploy(){return false;}
13846 bool CanPlayDeployLoopSound(){return false;}
13848 bool IsPlaceSound(){return m_IsPlaceSound;}
13849 bool IsDeploySound(){return m_IsDeploySound;}
13850 void SetIsPlaceSound(bool is_place_sound);
13851 void SetIsDeploySound(bool is_deploy_sound);
13852
13853 [Obsolete("Use ItemSoundHandler instead")]
13855 void PlayAttachSound(string slot_type)
13856 {
13857 if (!g_Game.IsDedicatedServer())
13858 {
13859 if (ConfigIsExisting("attachSoundSet"))
13860 {
13861 string cfg_path = "";
13862 string soundset = "";
13863 string type_name = GetType();
13864
13865 TStringArray cfg_soundset_array = new TStringArray;
13866 TStringArray cfg_slot_array = new TStringArray;
13867 ConfigGetTextArray("attachSoundSet",cfg_soundset_array);
13868 ConfigGetTextArray("attachSoundSlot",cfg_slot_array);
13869
13870 if (cfg_soundset_array.Count() > 0 && cfg_soundset_array.Count() == cfg_slot_array.Count())
13871 {
13872 for (int i = 0; i < cfg_soundset_array.Count(); i++)
13873 {
13874 if (cfg_slot_array[i] == slot_type)
13875 {
13876 soundset = cfg_soundset_array[i];
13877 break;
13878 }
13879 }
13880 }
13881
13882 if (soundset != "")
13883 {
13884 EffectSound sound = SEffectManager.PlaySound(soundset, GetPosition());
13885 sound.SetAutodestroy(true);
13886 }
13887 }
13888 }
13889 }
13890
13891 void PlayDetachSound(string slot_type) {}
13892}
13893
13894EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
13895{
13896 EntityAI entity = SpawnEntity(object_name, loc, ECE_IN_INVENTORY, RF_DEFAULT);
13897 if (entity)
13898 {
13899 bool is_item = entity.IsInherited(ItemBase);
13900 if (is_item && full_quantity)
13901 {
13902 ItemBase item = ItemBase.Cast(entity);
13903 item.SetQuantity(item.GetQuantityInit());
13904 }
13905 }
13906 else
13907 {
13908 ErrorEx("Cannot spawn entity: " + object_name,ErrorExSeverity.INFO);
13909 return NULL;
13910 }
13911 return entity;
13912}
13913
13914void SetupSpawnedItem(ItemBase item, float health, float quantity)
13915{
13916 if (item)
13917 {
13918 if (health > 0)
13919 item.SetHealth("", "", health);
13920
13921 if (item.CanHaveTemperature())
13922 {
13923 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
13924 if (item.CanFreeze())
13925 item.SetFrozen(false);
13926 }
13927
13928 if (item.HasEnergyManager())
13929 {
13930 if (quantity >= 0)
13931 {
13932 item.GetCompEM().SetEnergy0To1(quantity);
13933 }
13934 else
13935 {
13936 item.GetCompEM().SetEnergy(Math.AbsFloat(quantity));
13937 }
13938 }
13939 else if (item.IsMagazine())
13940 {
13941 Magazine mag = Magazine.Cast(item);
13942 if (quantity >= 0)
13943 {
13944 mag.ServerSetAmmoCount(mag.GetAmmoMax() * quantity);
13945 }
13946 else
13947 {
13948 mag.ServerSetAmmoCount(Math.AbsFloat(quantity));
13949 }
13950
13951 }
13952 else
13953 {
13954 if (quantity >= 0)
13955 {
13956 item.SetQuantityNormalized(quantity, false);
13957 }
13958 else
13959 {
13960 item.SetQuantity(Math.AbsFloat(quantity));
13961 }
13962
13963 }
13964 }
13965}
13966
13967#ifdef DEVELOPER
13968ItemBase _itemBase;//watched item goes here(LCTRL+RMB->Watch)
13969#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
Param3 TSelectableActionInfo
EWetnessLevel
Определения 3_Game/DayZ/Entities/EntityAI.c:2
bool SetAttachSoundEvent()
void InventoryItemType()
bool SetDetachSoundEvent()
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_ITEM_MANIPULATION
class LogManager EntityAI
eBleedingSourceType GetType()
ItemSuppressor SuppressorBase
void ActionDropItem()
Определения ActionDropItem.c:34
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
TInputActionMap m_InputActionMap
Определения AdvancedCommunication.c:137
bool m_ActionsInitialize
Определения AdvancedCommunication.c:138
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения AdvancedCommunication.c:202
void InitializeActions()
Определения AdvancedCommunication.c:190
string Debug()
Определения CachedEquipmentStorageBase.c:29
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:37
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:36
const int RF_DEFAULT
Определения CentralEconomy.c:65
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
PlayerSpawnPreset slotName
Open
Implementations only.
override void EEOnCECreate()
Определения ContaminatedArea_Dynamic.c:42
map
Определения ControlsXboxNew.c:4
CookingMethodType
Определения Cooking.c:2
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
DayZGame g_Game
Определения DayZGame.c:3942
DayZGame GetDayZGame()
Определения DayZGame.c:3944
EActions
Определения EActions.c:2
ERPCs
Определения ERPCs.c:2
PluginAdminLog m_AdminLog
Определения EmoteManager.c:159
const int MIN
Определения EnConvert.c:28
const int MAX
Определения EnConvert.c:27
float GetTemperature()
Определения Environment.c:500
override bool IsExplosive()
Определения ExplosivesBase.c:59
override bool IsPrepareToDelete()
Определения FireplaceBase.c:643
override bool CanHaveTemperature()
Определения FireplaceBase.c:561
class GP5GasMask extends MaskBase ItemBase
proto GizmoApi GetGizmoApi()
Empty
Определения Hand_States.c:14
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:18
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
bool DamageItemInCargo(float damage)
Определения ItemBase.c:6453
static bool HasDebugActionsMask(int mask)
Определения ItemBase.c:5680
bool HidesSelectionBySlot()
Определения ItemBase.c:9413
float m_VarWetMin
Определения ItemBase.c:4937
void SplitItem(PlayerBase player)
Определения ItemBase.c:6908
void CopyScriptPropertiesFrom(EntityAI oldItem)
Определения ItemBase.c:9634
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:8895
override float GetQuantityNormalized()
Gets quantity in normalized 0..1 form between the item's Min a Max values as defined by item's config...
Определения ItemBase.c:8330
static void SetDebugActionsMask(int mask)
Определения ItemBase.c:5685
void SetIsDeploySound(bool is_deploy_sound)
bool IsOpen()
Определения ItemBase.c:9038
void SplitItemToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6875
override bool IsHeavyBehaviour()
Определения ItemBase.c:9240
override void SetWetMax()
Определения ItemBase.c:8616
bool IsCoverFaceForShave(string slot_name)
DEPRECATED in use, but returns correct values nontheless. Check performed elsewhere.
Определения ItemBase.c:9451
void ClearStartItemSoundServer()
Определения ItemBase.c:9390
float m_VarWet
Определения ItemBase.c:4934
void ProcessItemTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9481
map< typename, ref ActionOverrideData > TActionAnimOverrideMap
Определения ItemBase.c:3
override void RemoveAllAgentsExcept(int agent_to_keep)
Определения ItemBase.c:8890
static ref map< int, ref array< ref WeaponParticlesOnBulletCasingEject > > m_OnBulletCasingEjectEffect
Определения ItemBase.c:4997
bool CanBeMovedOverride()
Определения ItemBase.c:7600
override void SetWet(float value, bool allow_client=false)
Определения ItemBase.c:8592
ref TIntArray m_SingleUseActions
Определения ItemBase.c:4983
void StartItemSoundServer(int id, int slotId)
Определения ItemBase.c:9358
override void ProcessVariables()
Определения ItemBase.c:9548
ref TStringArray m_HeadHidingSelections
Определения ItemBase.c:5011
float GetWeightSpecialized(bool forceRecalc=false)
Определения ItemBase.c:8423
bool LoadAgents(ParamsReadContext ctx, int version)
Определения ItemBase.c:8956
void UpdateQuickbarShortcutVisibility(PlayerBase player)
To be called on moving item within character's inventory; 'player' should never be null.
Определения ItemBase.c:8806
void OverrideActionAnimation(typename action, int commandUID, int stanceMask=-1, int commandUIDProne=-1)
Определения ItemBase.c:5271
ref array< ref OverheatingParticle > m_OverheatingParticles
Определения ItemBase.c:5009
override float GetTemperatureFreezeThreshold()
Определения ItemBase.c:9584
bool m_IsSoundSynchRemote
Определения ItemBase.c:9742
float m_OverheatingShots
Определения ItemBase.c:5004
void StopItemSoundServer(int id)
Определения ItemBase.c:9378
static void ToggleDebugActionsMask(int mask)
Определения ItemBase.c:5700
void IncreaseOverheating(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:5424
override float GetTemperatureFreezeTime()
Определения ItemBase.c:9608
ref array< int > m_CompatibleLocks
Определения ItemBase.c:5021
bool CanBeCooked()
Определения ItemBase.c:7556
override void CombineItemsClient(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:5767
float m_TemperaturePerQuantityWeight
Определения ItemBase.c:5035
bool m_RecipesInitialized
Определения ItemBase.c:4919
void SplitIntoStackMax(EntityAI destination_entity, int slot_id, PlayerBase player)
Определения ItemBase.c:6546
override float GetTemperatureThawThreshold()
Определения ItemBase.c:9592
override void OnEnergyConsumed()
Определения ItemBase.c:8536
void RefreshAudioVisualsOnClient(CookingMethodType cooking_method, bool is_done, bool is_empty, bool is_burned)
cooking-related effect methods
Определения Bottle_Base.c:158
int GetNumberOfItems()
Returns the number of items in cargo, otherwise returns 0(non-cargo objects). Recursive.
Определения ItemBase.c:8462
override EWetnessLevel GetWetLevel()
Определения ItemBase.c:8656
float GetSingleInventoryItemWeight()
Определения ItemBase.c:8418
ref TIntArray m_InteractActions
Определения ItemBase.c:4985
void MessageToOwnerStatus(string text)
Send message to owner player in grey color.
Определения ItemBase.c:7620
float m_VarQuantity
Определения ItemBase.c:4925
bool CanPlayDeployLoopSound()
Определения ItemBase.c:9753
override float GetWetMax()
Определения ItemBase.c:8626
bool CanBeUsedForSuicide()
Определения ItemBase.c:9720
override void CombineItemsEx(EntityAI entity2, bool use_stack_max=true)
Определения ItemBase.c:7193
void OnItemInHandsPlayerSwimStart(PlayerBase player)
void SetIsHologram(bool is_hologram)
Определения ItemBase.c:5905
void OnSyncVariables(ParamsReadContext ctx)
DEPRECATED (most likely)
Определения ItemBase.c:7774
void DoAmmoExplosion()
Определения ItemBase.c:6388
static ref map< int, ref array< ref WeaponParticlesOnFire > > m_OnFireEffect
Определения ItemBase.c:4996
void SplitIntoStackMaxCargoClient(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6732
int GetItemSize()
Определения ItemBase.c:7585
bool m_CanBeMovedOverride
Определения ItemBase.c:4962
override string ChangeIntoOnAttach(string slot)
Определения ItemBase.c:6312
void UpdateOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5492
bool CanDecay()
Определения ItemBase.c:9523
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...
Определения ItemBase.c:8303
void SetQuantityMax()
Определения ItemBase.c:8308
override float GetQuantity()
Определения ItemBase.c:8398
int m_ColorComponentR
Определения ItemBase.c:4974
int m_ShotsToStartOverheating
Определения ItemBase.c:5006
override void OnWetChanged(float newVal, float oldVal)
Определения ItemBase.c:8641
void StopOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5499
static void PlayFireParticles(ItemBase weapon, int muzzle_index, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9139
void OnOverheatingDecay()
Определения ItemBase.c:5462
float GetDryingIncrement(string pIncrementName)
Определения ItemBase.c:8574
void SoundSynchRemoteReset()
int m_Cleanness
Определения ItemBase.c:4940
bool HasMuzzle()
Returns true if this item has a muzzle (weapons, suppressors)
Определения ItemBase.c:5600
bool UsesGlobalDeploy()
Определения ItemBase.c:9752
int m_ItemBehaviour
Определения ItemBase.c:4955
override bool CanReleaseAttachment(EntityAI attachment)
Определения ItemBase.c:9111
float m_HeatIsolation
Определения ItemBase.c:4950
float m_VarWetInit
Определения ItemBase.c:4936
override void OnMovedInsideCargo(EntityAI container)
Определения ItemBase.c:5945
void SetCEBasedQuantity()
Определения ItemBase.c:5713
bool m_CanPlayImpactSound
Определения ItemBase.c:4946
override string GetAttachmentSoundType()
Определения ItemBase.c:9314
float GetOverheatingCoef()
Определения ItemBase.c:5519
array< string > GetHeadHidingSelection()
Определения ItemBase.c:9408
void PlayAttachSound(string slot_type)
Plays sound on item attach. Be advised, the config structure may slightly change in 1....
Определения ItemBase.c:9762
override bool IsStoreLoad()
Определения ItemBase.c:8668
int ComputeQuantityUsed(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7169
bool IsLightSource()
Определения ItemBase.c:5841
bool m_HasQuantityBar
Определения ItemBase.c:4968
void SetResultOfSplit(bool value)
Определения ItemBase.c:7164
void SplitIntoStackMaxCargo(EntityAI destination_entity, int idx, int row, int col)
Определения ItemBase.c:6796
void OnAttachmentQuantityChanged(ItemBase item)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6965
void UpdateAllOverheatingParticles()
Определения ItemBase.c:5527
float GetSoakingIncrement(string pIncrementName)
Определения ItemBase.c:8583
static void StopOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9219
override float GetStoreLoadedQuantity()
Определения ItemBase.c:8678
int m_LockType
Определения ItemBase.c:5022
const int ITEM_SOUNDS_MAX
Определения ItemBase.c:5027
bool m_CanBeDigged
Определения ItemBase.c:4969
float m_ItemAttachOffset
Определения ItemBase.c:4952
float GetItemModelLength()
Определения ItemBase.c:8685
bool m_ThrowItemOnDrop
Определения ItemBase.c:4960
override bool ReadVarsFromCTX(ParamsReadContext ctx, int version=-1)
Определения ItemBase.c:7919
override void CheckForRoofLimited(float timeTresholdMS=3000)
Roof check for entity, limited by time (anti-spam solution)
Определения ItemBase.c:8971
void Close()
float GetHeatIsolation()
Определения ItemBase.c:8569
void CombineItems(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7198
void TransferModifiers(PlayerBase reciever)
appears to be deprecated, legacy code
float GetTemperaturePerQuantityWeight()
Used in heat comfort calculations only!
Определения ItemBase.c:9579
bool CanHaveWetness()
Определения ItemBase.c:9536
int m_CleannessMin
Определения ItemBase.c:4942
void TransferAgents(int agents)
transfer agents from another item
Определения ItemBase.c:8904
string IDToName(int id)
Определения ItemBase.c:7767
bool CanBeConsumed(ConsumeConditionData data=null)
Items cannot be consumed if frozen by default. Override for exceptions.
Определения ItemBase.c:9543
float GetHeatIsolationInit()
Определения ItemBase.c:8564
void PlayPlaceSound()
void SetCanBeMovedOverride(bool setting)
Определения ItemBase.c:7607
override bool HasQuantity()
Определения ItemBase.c:8393
float m_VarWetPrev
Определения ItemBase.c:4935
int m_SoundSyncStop
Определения ItemBase.c:5029
bool IsCargoException4x3(EntityAI item)
Определения ItemBase.c:9629
ref TIntArray m_ContinuousActions
Определения ItemBase.c:4984
int GetMuzzleID()
Returns global muzzle ID. If not found, then it gets automatically registered.
Определения ItemBase.c:5609
void LoadParticleConfigOnFire(int id)
Определения ItemBase.c:5294
int m_VarLiquidType
Определения ItemBase.c:4954
int m_QuickBarBonus
Определения ItemBase.c:4956
void PreLoadSoundAttachmentType()
Attachment Sound Type getting from config file.
Определения ItemBase.c:9302
override float GetWetInit()
Определения ItemBase.c:8636
int m_ImpactSoundSurfaceHash
Определения ItemBase.c:4948
int m_SoundSyncPlay
Определения ItemBase.c:5028
int m_MaxOverheatingValue
Определения ItemBase.c:5007
void SetupSpawnedItem(ItemBase item, float health, float quantity)
Определения ItemBase.c:4931
bool m_IsTakeable
Определения ItemBase.c:4959
bool ShouldSplitQuantity(float quantity)
Определения ItemBase.c:6503
static ref map< string, int > m_WeaponTypeToID
Определения ItemBase.c:4999
string GetLockSoundSet()
Определения ItemBase.c:8734
string GetColorString()
Returns item's PROCEDURAL color as formated string, i.e. "#(argb,8,8,3)color(0.15,...
Определения ItemBase.c:8765
array< int > GetValidFinishers()
returns an array of possible finishers
Определения ItemBase.c:9656
void OnAttachmentQuantityChangedEx(ItemBase item, float delta)
Called on server side when some attachment's quantity is changed. Call super.OnAttachmentQuantityChan...
Определения ItemBase.c:6971
class ItemBase extends InventoryItem SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4911
ItemSoundHandler GetItemSoundHandler()
Определения ItemBase.c:9329
override int GetQuantityMin()
Определения ItemBase.c:8382
void SplitIntoStackMaxToInventoryLocationClient(notnull InventoryLocation dst)
Определения ItemBase.c:6711
override int GetQuickBarBonus()
Определения ItemBase.c:5179
override void SetTakeable(bool pState)
Определения ItemBase.c:9284
float m_OverheatingDecayInterval
Определения ItemBase.c:5008
void SetIsPlaceSound(bool is_place_sound)
override void SplitIntoStackMaxClient(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6523
void HierarchyCheck(out bool hasParent, out bool hasRootAsPlayer, out ItemBase refParentIB)
Определения ItemBase.c:9501
bool CanProcessDecay()
Определения ItemBase.c:9529
void RemoveAudioVisualsOnClient()
Определения Bottle_Base.c:151
void SoundSynchRemote()
static void AddDebugActionsMask(int mask)
Определения ItemBase.c:5690
void PlayDeployLoopSoundEx()
void RemoveLightSourceItem()
Определения ItemBase.c:9645
bool CanRepair(ItemBase item_repair_kit)
Определения ItemBase.c:7571
bool can_this_be_combined
Определения ItemBase.c:4964
EffectSound m_SoundDeploy
Определения ItemBase.c:9739
int m_SoundSyncSlotID
Определения ItemBase.c:5030
int m_Count
Определения ItemBase.c:4930
float GetBaitEffectivity()
generic effectivity as a bait for animal catching
Определения ItemBase.c:9692
float GetDeployTime()
how long it takes to deploy this item in seconds
Определения ItemBase.c:9276
override bool IsSplitable()
Определения ItemBase.c:6490
bool DamageItemAttachments(float damage)
Определения ItemBase.c:6473
override void WriteVarsToCTX(ParamsWriteContext ctx)
Определения ItemBase.c:7883
void ConvertEnergyToQuantity()
Определения ItemBase.c:8551
override void RemoveAllAgents()
Определения ItemBase.c:8885
override void SetQuantityToMinimum()
Определения ItemBase.c:8314
bool m_WantPlayImpactSound
Определения ItemBase.c:4945
override float GetTemperatureThawTime()
Определения ItemBase.c:9616
ref map< int, ref array< ref WeaponParticlesOnOverheating > > m_OnOverheatingEffect
Определения ItemBase.c:4998
int m_ColorComponentG
Определения ItemBase.c:4975
float m_StoreLoadedQuantity
Определения ItemBase.c:4932
void MessageToOwnerAction(string text)
Send message to owner player in yellow color.
Определения ItemBase.c:7638
int m_ColorComponentA
Определения ItemBase.c:4977
int m_VarQuantityInit
Определения ItemBase.c:4927
float GetFilterDamageRatio()
Определения ItemBase.c:5594
override void SetLiquidType(int value, bool allow_client=false)
Определения ItemBase.c:8778
void OnQuantityChanged(float delta)
Called on server side when this item's quantity is changed. Call super.OnQuantityChanged(); first whe...
Определения ItemBase.c:6942
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...
Определения ItemBase.c:8321
bool m_HideSelectionsBySlot
Определения ItemBase.c:5012
bool IsOverheatingEffectActive()
Определения ItemBase.c:5457
void SetIsBeingPlaced(bool is_being_placed)
Определения ItemBase.c:5874
int GetLiquidContainerMask()
Определения ItemBase.c:5811
void SetInventoryLocationToVicinityOrCurrent(EntityAI root, inout InventoryLocation dst)
Определения ItemBase.c:7078
ref Timer m_CheckOverheating
Определения ItemBase.c:5005
void RegisterOverheatingParticle(Particle p, float min_heat_coef, float max_heat_coef, int particle_id, Object parent, vector local_pos, vector local_ori)
Определения ItemBase.c:5505
float GetEnergy()
Определения ItemBase.c:8525
bool CanBeDigged()
Определения ItemBase.c:5890
bool GetActionWidgetOverride(out typename name)
If we need a different (handheld)item action widget displayed, the logic goes in here.
Определения ItemBase.c:9662
bool IsNVG()
Определения ItemBase.c:5822
float GetUnitWeight(bool include_wetness=true)
Obsolete, use GetWeightEx instead.
Определения ItemBase.c:8485
void SetZoneDamageCEInit()
Sets zone damages to match randomized global health set by CE (CE spawn only)
Определения ItemBase.c:9438
bool m_IsDeploySound
Определения ItemBase.c:9741
bool CanEat()
Определения ItemBase.c:7531
static void PlayOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9179
override bool IsOneHandedBehaviour()
Определения ItemBase.c:9250
void AddLightSourceItem(ItemBase lightsource)
Adds a light source child.
Определения ItemBase.c:9640
bool IsLiquidContainer()
Определения ItemBase.c:5806
FoodStage GetFoodStage()
overridden on Edible_Base; so we don't have to parse configs all the time
Определения ItemBase.c:7551
override float GetSingleInventoryItemWeightEx()
Определения ItemBase.c:8409
void SaveAgents(ParamsWriteContext ctx)
Определения ItemBase.c:8963
override int GetTargetQuantityMax(int attSlotID=-1)
Определения ItemBase.c:8363
int m_CleannessInit
Определения ItemBase.c:4941
float GetDisinfectQuantity(int system=0, Param param1=null)
Определения ItemBase.c:5589
override int GetAgents()
Определения ItemBase.c:8910
int m_VarQuantityMax
Определения ItemBase.c:4929
override bool IsHologram()
Определения ItemBase.c:5885
float GetItemAttachOffset()
Определения ItemBase.c:8694
bool IsPlaceSound()
Определения ItemBase.c:9755
static int GetDebugActionsMask()
Определения ItemBase.c:5675
override int GetLiquidType()
Определения ItemBase.c:8794
void ProcessDecay(float delta, bool hasRootAsPlayer)
Определения ItemBase.c:9518
override bool IsItemBase()
Определения ItemBase.c:7684
void PlayDeploySound()
override bool IsTwoHandedBehaviour()
Определения ItemBase.c:9260
void ExplodeAmmo()
Определения ItemBase.c:6375
bool IsCombineAll(ItemBase other_item, bool use_stack_max=false)
Определения ItemBase.c:7154
float GetProtectionLevel(int type, bool consider_filter=false, int system=0)
Определения ItemBase.c:8984
static void PlayBulletCasingEjectParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9159
override void OnEnergyAdded()
Определения ItemBase.c:8543
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()
Определения ItemBase.c:5834
EffectSound m_DeployLoopSoundEx
Определения ItemBase.c:9738
override void DeSerializeNumericalVars(array< float > floats)
Определения ItemBase.c:7824
void StopItemDynamicPhysics()
Определения ItemBase.c:9420
bool HasFoodStage()
Определения ItemBase.c:7544
override void SetStoreLoad(bool value)
Определения ItemBase.c:8663
float GetOverheatingValue()
Определения ItemBase.c:5419
bool ContainsAgent(int agent_id)
Определения ItemBase.c:8863
override void AddWet(float value)
Определения ItemBase.c:8611
bool IsLiquidPresent()
Определения ItemBase.c:5801
bool IsFullQuantity()
Определения ItemBase.c:8403
override void EOnContact(IEntity other, Contact extra)
Определения ItemBase.c:6084
void SplitIntoStackMaxHands(PlayerBase player)
Определения ItemBase.c:6847
void SplitIntoStackMaxHandsClient(PlayerBase player)
Определения ItemBase.c:6823
int m_CleannessMax
Определения ItemBase.c:4943
float m_VarStackMax
Определения ItemBase.c:4931
ref Timer m_PhysDropTimer
Определения ItemBase.c:5018
void MessageToOwnerFriendly(string text)
Send message to owner player in green color.
Определения ItemBase.c:7656
override void SetStoreLoadedQuantity(float value)
Определения ItemBase.c:8673
bool m_IsResultOfSplit string m_SoundAttType
distinguish if item has been created as new or it came from splitting (server only flag)
Определения ItemBase.c:4972
void CheckOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5440
void UnlockFromParent()
Unlocks this item from its attachment slot of its parent.
Определения ItemBase.c:5755
bool Repair(PlayerBase player, ItemBase item_repair_kit, float specialty_weight)
Определения ItemBase.c:7578
void OnLiquidTypeChanged(int oldType, int newType)
Определения ItemBase.c:8799
void StartOverheating(ItemBase weapon=null, string ammoType="", ItemBase muzzle_owner=null, ItemBase suppressor=null, string config_to_search="")
Определения ItemBase.c:5486
void PlayDeployFinishSound()
bool AllowFoodConsumption()
Определения ItemBase.c:8721
bool m_IsOverheatingEffectActive
Определения ItemBase.c:5003
int m_LiquidContainerMask
Определения ItemBase.c:4953
void ProcessItemWetness(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9456
override int GetCleanness()
Определения ItemBase.c:8716
bool PairWithDevice(notnull ItemBase otherDevice)
Определения ItemBase.c:9667
bool IsDeploySound()
Определения ItemBase.c:9756
static void RemoveDebugActionsMask(int mask)
Определения ItemBase.c:5695
static void UpdateOverheatingParticles(ItemBase weapon, string ammoType, ItemBase muzzle_owner, ItemBase suppressor, string config_to_search)
Определения ItemBase.c:9199
int m_VarQuantityMin
Определения ItemBase.c:4928
void PerformDamageSystemReinit()
Определения ItemBase.c:9426
override void ClearInventory()
Определения ItemBase.c:8504
static int m_LastRegisteredWeaponID
Определения ItemBase.c:5000
ItemBase GetLightSourceItem()
Определения ItemBase.c:9650
void MessageToOwnerImportant(string text)
Send message to owner player in red color.
Определения ItemBase.c:7674
override float GetItemOverheatThreshold()
Определения ItemBase.c:9600
void StopDeployLoopSoundEx()
bool m_CanThisBeSplit
Определения ItemBase.c:4965
override void SerializeNumericalVars(array< float > floats_out)
Определения ItemBase.c:7788
ItemBase SplitIntoStackMaxToInventoryLocationEx(notnull InventoryLocation dst)
Определения ItemBase.c:6762
float m_ItemModelLength
Определения ItemBase.c:4951
bool m_IsHologram
Определения ItemBase.c:4958
static int m_DebugActionsMask
Определения ItemBase.c:4918
void KillAllOverheatingParticles()
Определения ItemBase.c:5555
bool CanBeCookedOnStick()
Определения ItemBase.c:7561
override int GetQuantityMax()
Определения ItemBase.c:8349
void GetRecipesActions(Man player, out TSelectableActionInfoArray outputList)
Определения ItemBase.c:7232
void OnActivatedByTripWire()
bool IsColorSet()
Определения ItemBase.c:8759
override void RemoveAgent(int agent_id)
Определения ItemBase.c:8876
bool m_ItemBeingDroppedPhys
Определения ItemBase.c:4961
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:9066
void PlayDetachSound(string slot_type)
Определения ItemBase.c:9798
static ref map< typename, ref TInputActionMap > m_ItemTypeActionsMap
Определения ItemBase.c:4912
void ProcessItemWetnessAndTemperature(float delta, bool hasParent, bool hasRootAsPlayer, ItemBase refParentIB)
Определения ItemBase.c:9729
override bool IsBeingPlaced()
Определения ItemBase.c:5869
int GetQuantityInit()
Определения ItemBase.c:8387
float ComputeQuantityUsedEx(ItemBase other_item, bool use_stack_max=true)
Определения ItemBase.c:7174
bool IsResultOfSplit()
Определения ItemBase.c:7159
bool m_FixDamageSystemInit
Определения ItemBase.c:4963
float m_ImpactSpeed
Определения ItemBase.c:4947
bool m_IsStoreLoad
Определения ItemBase.c:4966
int GetLiquidTypeInit()
Определения ItemBase.c:8789
string GetDeployFinishSoundset()
ItemBase m_LightSourceItem
Определения ItemBase.c:4981
void LockToParent()
Locks this item in it's current attachment slot of its parent. This makes the "locked" icon visible i...
Определения ItemBase.c:5742
override void SplitIntoStackMaxEx(EntityAI destination_entity, int slot_id)
Определения ItemBase.c:6633
int m_AttachedAgents
Определения ItemBase.c:4989
string m_LockSoundSet
Определения ItemBase.c:5024
void LoadParticleConfigOnOverheating(int id)
Определения ItemBase.c:5363
float m_VarQuantityPrev
Определения ItemBase.c:4926
bool IsSoundSynchRemote()
Определения ItemBase.c:9754
bool m_CanShowQuantity
Определения ItemBase.c:4967
override void OnRightClick()
Определения ItemBase.c:7014
int m_ColorComponentB
Определения ItemBase.c:4976
static ref map< typename, ref TActionAnimOverrideMap > m_ItemActionOverrides
Определения ItemBase.c:4914
bool IsActionTargetVisible()
Определения ItemBase.c:9296
override void OnItemAttachmentSlotChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения ItemBase.c:6119
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения ItemBase.c:6412
bool m_IsBeingPlaced
Определения ItemBase.c:4957
int NameToID(string name)
Определения ItemBase.c:7761
void ~ItemBase()
Определения ItemBase.c:5640
override void OnWetLevelChanged(EWetnessLevel newLevel, EWetnessLevel oldLevel)
Определения ItemBase.c:8651
void ClearStopItemSoundServer()
Определения ItemBase.c:9396
override string ChangeIntoOnDetach()
Определения ItemBase.c:6336
float m_VarWetMax
Определения ItemBase.c:4938
void SplitIntoStackMaxToInventoryLocation(notnull InventoryLocation dst)
Определения ItemBase.c:6757
int GetLockType()
Определения ItemBase.c:8729
EffectSound m_SoundDeployFinish
Определения ItemBase.c:9736
override float GetWet()
Определения ItemBase.c:8621
EffectSound m_SoundPlace
Определения ItemBase.c:9737
float GetQuantityNormalizedScripted()
Определения ItemBase.c:8335
override void SetCleanness(int value, bool allow_client=false)
Определения ItemBase.c:8703
bool m_IsPlaceSound
Определения ItemBase.c:9740
override float GetWetMin()
Определения ItemBase.c:8631
ref ItemSoundHandler m_ItemSoundHandler
Определения ItemBase.c:5032
override bool KindOf(string tag)
Определения ItemBase.c:7690
void ItemSoundHandler(ItemBase parent)
Определения ItemSoundHandler.c:31
string Type
Определения JsonDataContaminatedArea.c:11
EffectSound m_LockingSound
Определения Land_Underground_Entrance.c:336
string GetDebugText()
Определения ModifierBase.c:71
@ LOWEST
Определения PPEConstants.c:54
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:325
override RemotelyActivatedItemBehaviour GetRemotelyActivatedItemBehaviour()
Определения RemoteDetonator.c:272
void RemoteDetonatorTrigger()
Определения RemoteDetonator.c:233
override void OnActivatedByItem(notnull ItemBase item)
Called when this item is activated by other.
Определения RemoteDetonator.c:305
int particle_id
Определения SmokeSimulation.c:28
ETemperatureAccessTypes
Определения TemperatureAccessConstants.c:2
override void Explode(int damageType, string ammoType="")
Определения Trap_LandMine.c:220
bool m_Initialized
Определения UiHintPanel.c:317
int GetID()
Определения ActionBase.c:1335
void OnItemLocationChanged(ItemBase item)
Определения ActionBase.c:974
GetInputType()
Определения ActionBase.c:221
int m_StanceMask
Определения ActionBase.c:25
int m_CommandUIDProne
Определения ActionBase.c:24
int m_CommandUID
Определения ActionBase.c:23
proto native int GetItemCount()
proto native EntityAI GetItem(int index)
float GetEnergyAtSpawn()
Определения ComponentEnergyManager.c:1325
void SetEnergy0To1(float energy01)
Energy manager: Sets stored energy for this device between 0 and MAX based on relative input value be...
Определения ComponentEnergyManager.c:550
float GetEnergyMaxPristine()
Energy manager: Returns the maximum amount of energy this device can store. It's damage is NOT taken ...
Определения ComponentEnergyManager.c:1320
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:603
bool IsSoundPlaying()
Get whether EffectSound is currently playing.
Определения EffectSound.c:274
override bool IsMan()
Определения 3_Game/DayZ/Entities/Man.c:48
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)
Определения ItemBase.c:21
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)
Определения InventoryLocation.c:507
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
InventoryLocation.
Определения InventoryLocation.c:30
override bool CanDisplayCargo()
Определения TentBase.c:91
override void OnInventoryEnter(Man player)
Определения BarbedWire.c:203
override string GetFoldSoundset()
Определения BaseBuildingBase.c:108
override bool CanPutAsAttachment(EntityAI parent)
Определения ItemBase.c:7
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения TentBase.c:934
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения GardenBase.c:199
override void OnWasDetached(EntityAI parent, int slot_id)
override void EEOnAfterLoad()
Определения GardenBase.c:242
override void EEDelete(EntityAI parent)
Определения BaseBuildingBase.c:68
override bool CanBeRepairedByCrafting()
Определения TentBase.c:86
override void OnPlacementStarted(Man player)
Определения BatteryCharger.c:376
override void OnItemLocationChanged(EntityAI old_owner, EntityAI new_owner)
Определения BarbedWire.c:357
override bool IsElectricAppliance()
Определения BatteryCharger.c:43
override bool IsItemTent()
Определения TentBase.c:81
override string GetLoopFoldSoundset()
Определения BaseBuildingBase.c:113
override bool CanMakeGardenplot()
Определения FieldShovel.c:3
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PowerGenerator.c:397
override void EEItemLocationChanged(notnull InventoryLocation oldLoc, notnull InventoryLocation newLoc)
Определения HandcuffsLocked.c:12
override WrittenNoteData GetWrittenNoteData()
Определения Paper.c:30
override int GetDamageSystemVersionChange()
Определения BaseBuildingBase.c:1238
override bool SetQuantity(float value, bool destroy_config=true, bool destroy_forced=false, bool allow_client=false, bool clamp_to_stack_max=true)
Определения PileOfWoodenPlanks.c:88
override void InitItemVariables()
Определения Matchbox.c:3
override void SetActionAnimOverrides()
Определения PickAxe.c:28
override void OnCreatePhysics()
Определения BaseBuildingBase.c:489
override string GetDeploySoundset()
Определения BarbedWire.c:392
override float GetBandagingEffectivity()
Определения BandageDressing.c:49
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PowerGenerator.c:409
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения BaseBuildingBase.c:496
override void OnStoreSave(ParamsWriteContext ctx)
Определения GardenBase.c:266
override void AfterStoreLoad()
Определения BarbedWire.c:155
override int GetOnDigWormsAmount()
Определения FieldShovel.c:27
override bool IsSelfAdjustingTemperature()
Определения PortableGasStove.c:287
override bool IsPlayerInside(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1037
override void OnVariablesSynchronized()
Определения GardenBase.c:97
override void RefreshPhysics()
Определения BatteryCharger.c:359
override bool CanObstruct()
Определения BaseBuildingBase.c:84
override void OnWasAttached(EntityAI parent, int slot_id)
override bool CanReceiveAttachment(EntityAI attachment, int slotId)
Определения BaseBuildingBase.c:982
override bool CanPutInCargo(EntityAI parent)
Определения GardenBase.c:331
override string GetLoopDeploySoundset()
Определения BarbedWire.c:397
override void OnPlacementComplete(Man player, vector position="0 0 0", vector orientation="0 0 0")
Определения BarbedWire.c:372
override void OnInventoryExit(Man player)
Определения BatteryCharger.c:341
override bool IsTakeable()
Определения BaseBuildingBase.c:1008
override bool IsIgnoredByConstruction()
Определения BaseBuildingBase.c:1170
override void InitItemSounds()
Определения BaseBuildingBase.c:94
override void EEKilled(Object killer)
Определения HandcuffsLocked.c:70
override void OnCombine(ItemBase other_item)
Определения BandageDressing.c:71
override bool CanExplodeInFire()
Определения LargeGasCannister.c:3
override bool IsFacingPlayer(PlayerBase player, string selection)
Определения BaseBuildingBase.c:1032
override bool CanBeCombined(EntityAI other_item, bool reservation_check=true, bool stack_max_limit=false)
Определения Rag.c:61
override bool IsBloodContainer()
Определения BloodContainerBase.c:10
override bool CanBeSplit()
Определения Rag.c:34
override bool IsDeployable()
Определения BaseBuildingBase.c:365
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения ToolBase.c:24
override bool CanBeDisinfected()
Определения BandageDressing.c:54
override float GetInfectionChance(int system=0, Param param=null)
Определения BandageDressing.c:59
override void OnEndPlacement()
Определения KitBase.c:65
Определения ItemBase.c:14
Определения EnMath.c:7
float GetOverheatingLimitMax()
Определения WeaponParticles.c:417
void SetOverheatingLimitMax(float max)
Определения WeaponParticles.c:407
void SetParticleParams(int particle_id, Object parent, vector local_pos, vector local_ori)
Определения WeaponParticles.c:422
float GetOverheatingLimitMin()
Определения WeaponParticles.c:412
Particle GetParticle()
Определения WeaponParticles.c:397
void SetOverheatingLimitMin(float min)
Определения WeaponParticles.c:402
void RegisterParticle(Particle p)
Определения WeaponParticles.c:392
void Stop()
Legacy function for backwards compatibility with 1.14 and below.
Определения Particle.c:266
void SetControlledDevice(EntityAI pDevice)
Определения RemoteDetonator.c:140
bool OnStoreLoad(ParamsReadContext ctx, int version)
void OnStoreSave(ParamsWriteContext ctx)
proto native void Send()
proto bool Write(void value_out)
proto bool Read(void value_in)
bool m_Loop
Определения ItemSoundHandler.c:5
override void Stop()
Определения DayZPlayerImplement.c:40
proto native float GetDamage(string zoneName, string healthType)
override void Refresh()
Определения ChatInputMenu.c:70
void SetCalcDetails(string details)
Определения 3_Game/DayZ/tools/Debug.c:916
void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения WrittenNoteData.c:13
const float LOWEST
Определения EnConvert.c:113
Serializer ParamsReadContext
Определения gameplay.c:15
class LOD Object
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
Serializer ParamsWriteContext
Определения gameplay.c:16
const int DEF_BIOLOGICAL
Определения 3_Game/DayZ/constants.c:515
const int DEF_CHEMICAL
Определения 3_Game/DayZ/constants.c:516
const int COMP_TYPE_ENERGY_MANAGER
Определения Component.c:9
ErrorExSeverity
Определения EnDebug.c:62
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
proto native void SetColor(int color)
array< string > TStringArray
Определения EnScript.c:712
array< int > TIntArray
Определения EnScript.c:714
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения 3_Game/DayZ/constants.c:811
const int VARIABLE_LIQUIDTYPE
Определения 3_Game/DayZ/constants.c:635
const int VARIABLE_CLEANNESS
Определения 3_Game/DayZ/constants.c:638
const int VARIABLE_COLOR
Определения 3_Game/DayZ/constants.c:637
const int VARIABLE_TEMPERATURE
Определения 3_Game/DayZ/constants.c:633
const int VARIABLE_QUANTITY
Определения 3_Game/DayZ/constants.c:631
const int VARIABLE_WET
Определения 3_Game/DayZ/constants.c:634
const int LIQUID_NONE
Определения 3_Game/DayZ/constants.c:532
static proto float AbsFloat(float f)
Returns absolute value.
const int MENU_INVENTORY
Определения 3_Game/DayZ/constants.c:180
proto native bool dBodyIsDynamic(notnull IEntity ent)
const int SAT_CRAFTING
Определения 3_Game/DayZ/constants.c:456
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:457
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
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.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8
proto native int GetColor()