private static double ServerGetLowestEquipmentDurabilityFraction(IEnumerable <IItem> items) { var lowestDurabilityFraction = 1.0; foreach (var item in items) { if (!(item.ProtoItem is IProtoItemEquipment protoItemEquipment)) { // not an equipment continue; } switch (protoItemEquipment.EquipmentType) { case EquipmentType.FullBody: case EquipmentType.Head: case EquipmentType.Chest: case EquipmentType.Legs: // consider these equipment item types for the durability check break; default: // don't consider implants, devices and other (future?) slots continue; } var durabilityFraction = ItemDurabilitySystem.SharedGetDurabilityFraction(item); if (durabilityFraction < lowestDurabilityFraction) { lowestDurabilityFraction = durabilityFraction; } } return(lowestDurabilityFraction); }
private static bool SharedTryFindItemsOfType( IItemsContainerProvider containers, IProtoItem requiredProtoItem, uint count, out List <IItem> result, double minQualityFraction) { var countToFindRemains = (int)count; result = new List <IItem>(); foreach (var container in containers.ItemsContainers) { foreach (var item in container.Items) { if (item.ProtoItem != requiredProtoItem) { continue; } if (requiredProtoItem is IProtoItemWithDurability && ItemDurabilitySystem.SharedGetDurabilityFraction(item) < minQualityFraction) { // not enough durability continue; } if (requiredProtoItem is IProtoItemWithFreshness && ItemFreshnessSystem.SharedGetFreshnessFraction(item) < minQualityFraction) { // not enough durability continue; } result.Add(item); countToFindRemains -= item.Count; if (countToFindRemains <= 0) { break; } } if (countToFindRemains <= 0) { break; } } return(countToFindRemains <= 0); }
private void TrySendDrone() { var targetsList = Api.Client.World.GetStaticWorldObjectsOfProto <IProtoStaticWorldObject>() .Where(IsValidObject) .OrderBy(o => CurrentCharacter.Position.DistanceTo(o.TilePosition.ToVector2D())) .ToList(); if (targetsList.Count == 0) { return; } int targetN = 0; int droneControlLimit = ((IProtoItemDroneControl)SelectedItem.ProtoGameObject).MaxDronesToControl; int droneNumberToSend = Math.Min( droneControlLimit - CurrentCharacter.SharedGetCurrentControlledDronesNumber(), targetsList.Count); using var tempExceptDrones = Api.Shared.GetTempList <IItem>(); for (var index = 0; index < droneNumberToSend; index++) { IItem itemDrone; do { itemDrone = CharacterDroneControlSystem.ClientSelectNextDrone(tempExceptDrones.AsList()); if (itemDrone is null) { return; } tempExceptDrones.Add(itemDrone); } while (ItemDurabilitySystem.SharedGetDurabilityFraction(itemDrone) < DroneDurabilityThreshold); if (!CharacterDroneControlSystem.ClientTryStartDrone(itemDrone, targetsList[targetN].TilePosition, showErrorNotification: false)) { return; } targetN++; } }
private void CheckItemDurability([NotNull] IItem item) { double itemDurabilityFraction = ItemDurabilitySystem.SharedGetDurabilityFraction(item); if (IsUnequipEnabled && itemDurabilityFraction <= UnequipThreshold) { if (TryToMoveItem( item: item, toContainer: CurrentCharacter.SharedGetPlayerContainerInventory())) { if (item != null) { itemAlerts.Remove(item); } return; } } if (!itemAlerts.ContainsKey(item)) { itemAlerts.Add(item, new AlertDetails()); } if (IsAlertNotificationEnabled && itemDurabilityFraction <= AlertThreshold && (itemAlerts[item].Durability - itemDurabilityFraction >= AlertStep || (AlertTimeout > 0 && itemAlerts[item].Time + AlertTimeout < Api.Client.Core.ClientRealTime))) { itemAlerts[item].Durability = itemDurabilityFraction; itemAlerts[item].Time = Api.Client.Core.ClientRealTime; NotificationSystem.ClientShowNotification( title: "Item durability low!", color: NotificationColor.Bad, icon: item.ProtoItem.Icon); } }
public static bool ValidateCanRepair( ICharacter character, IStaticWorldObject tinkerTableObject, out string errorMessage) { var worldObjectPrivateState = GetPrivateState(tinkerTableObject); var containerInput = worldObjectPrivateState.ContainerInput; var containerOutput = worldObjectPrivateState.ContainerOutput; var inputItem1 = containerInput.GetItemAtSlot(0); var inputItem2 = containerInput.GetItemAtSlot(1); if (inputItem1 == null || inputItem2 == null || inputItem1.ProtoItem != inputItem2.ProtoItem) { errorMessage = ErrorMessage_Input; return(false); } var resultItemProto = (IProtoItemWithDurablity)inputItem1.ProtoGameObject; if (!resultItemProto.IsRepairable) { throw new Exception("Cannot repair: the input items prototype is not repairable"); } var durabilityItem1 = ItemDurabilitySystem.SharedGetDurabilityFraction(inputItem1); var durabilityItem2 = ItemDurabilitySystem.SharedGetDurabilityFraction(inputItem2); if (durabilityItem1 >= 1.0 || durabilityItem2 >= 1.0) { // one of the items is 100% green errorMessage = ErrorMessage_NoRepairNecessary; return(false); } var thresholdGreen = ItemDurabilitySystem.ThresholdFractionGreenStatus; if (durabilityItem1 >= thresholdGreen && durabilityItem2 >= thresholdGreen) { // both items are green errorMessage = ErrorMessage_NoRepairNecessary; return(false); } if (!SharedValidateHasRequiredComponentItems(character)) { errorMessage = ErrorMessage_ComponentItemsRequried; return(false); } if (containerOutput.GetItemAtSlot(0) != null) { errorMessage = ErrorMessage_OutputIsFull; return(false); } errorMessage = null; return(true); }