Фикс андроидов (#276)

* Фикс батареи и светодиодов

* Фикс аварийных наборов
This commit is contained in:
MishaUnity
2025-12-28 04:42:03 +03:00
committed by GitHub
parent e9cf093025
commit 496af0bc0f
6 changed files with 133 additions and 104 deletions

View File

@@ -1,11 +1,47 @@
using Content.Shared.Alert;
using Content.Shared.Android;
using Content.Shared.Power.EntitySystems;
using Content.Shared.PowerCell;
namespace Content.Client.Android;
public sealed class AndroidSystem : SharedAndroidSystem
{
[Dependency] private readonly PowerCellSystem _powerCell = default!;
[Dependency] private readonly PredictedBatterySystem _battery = default!;
[Dependency] private readonly AlertsSystem _alerts = default!;
public override void Initialize()
{
base.Initialize();
}
public override void Update(float frameTime)
{
base.Update(frameTime);
var androidsQuery = EntityQueryEnumerator<AndroidComponent>();
while (androidsQuery.MoveNext(out var ent, out var component))
{
UpdateBatteryAlert((ent, component));
}
}
private void UpdateBatteryAlert(Entity<AndroidComponent> ent)
{
if (!_powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery))
{
_alerts.ShowAlert(ent.Owner, ent.Comp.NoBatteryAlert);
return;
}
var chargeLevel = (short)MathF.Round(_battery.GetChargeLevel(battery.Value.AsNullable()) * 10f);
if (chargeLevel == 0 && _powerCell.HasDrawCharge(ent.Owner))
{
chargeLevel = 1;
}
_alerts.ShowAlert(ent.Owner, ent.Comp.BatteryAlert, chargeLevel);
}
}

View File

@@ -22,6 +22,8 @@ using Robust.Server.GameObjects;
using Robust.Shared.Containers;
using Robust.Shared.Random;
using Robust.Shared.Timing;
using Content.Shared.Power;
using Content.Server.Power.EntitySystems;
namespace Content.Server.Android;
@@ -35,7 +37,6 @@ public sealed partial class AndroidSystem : SharedAndroidSystem
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifier = default!;
[Dependency] private readonly PowerCellSystem _powerCell = default!;
[Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly ActionsSystem _actions = default!;
[Dependency] private readonly LockSystem _lock = default!;
[Dependency] private readonly AudioSystem _audio = default!;
@@ -43,6 +44,7 @@ public sealed partial class AndroidSystem : SharedAndroidSystem
[Dependency] private readonly PointLightSystem _pointLight = default!;
[Dependency] private readonly StunSystem _stun = default!;
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
public override void Initialize()
{
@@ -71,6 +73,8 @@ public sealed partial class AndroidSystem : SharedAndroidSystem
DoDischargeStun(ent, component);
DelayDischargeStun(component);
}
UpdatePowerCell(ent, component);
}
}
@@ -109,7 +113,11 @@ public sealed partial class AndroidSystem : SharedAndroidSystem
EntityUid lightEntity = component.LightEntity.Value;
if (enabled != null)
{
_appearance.SetData(uid, AndroidVisuals.Light, enabled.Value);
_pointLight.SetEnabled(lightEntity, enabled.Value);
_audio.PlayPvs(component.ToggleLightSound, uid);
}
_pointLight.SetRadius(lightEntity, _toggle.IsActivated(lightEntity) ? component.BasePointLightRadiuse : Math.Max(component.BasePointLightRadiuse / 3f, 1.3f));
_pointLight.SetEnergy(lightEntity, _toggle.IsActivated(lightEntity) ? component.BasePointLightEnergy : component.BasePointLightEnergy * 0.75f);
@@ -122,8 +130,6 @@ public sealed partial class AndroidSystem : SharedAndroidSystem
Color ledColor = markings[0].MarkingColors[0].WithAlpha(255);
_pointLight.SetColor(lightEntity, ledColor);
_audio.PlayPvs(component.ToggleLightSound, uid);
}
#region Battery
@@ -133,14 +139,15 @@ public sealed partial class AndroidSystem : SharedAndroidSystem
_powerCell.SetDrawEnabled(uid, args.NewMobState == MobState.Alive);
}
private void OnPowerCellChanged(EntityUid uid, AndroidComponent component, PowerCellChangedEvent args)
private void OnPowerCellChanged(EntityUid uid, AndroidComponent component, ref PowerCellChangedEvent args)
{
UpdateBatteryAlert((uid, component));
UpdatePowerCell(uid, component);
}
private void UpdatePowerCell(EntityUid uid, AndroidComponent component)
{
if (_powerCell.HasDrawCharge(uid))
{
_toggle.TryActivate(uid);
}
}
private void OnPowerCellSlotEmpty(EntityUid uid, AndroidComponent component, ref PowerCellSlotEmptyEvent args)
@@ -164,24 +171,6 @@ public sealed partial class AndroidSystem : SharedAndroidSystem
UpdateLight(uid, component);
}
private void UpdateBatteryAlert(Entity<AndroidComponent> ent, PowerCellSlotComponent? slotComponent = null)
{
if (!_powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery))
{
_alerts.ClearAlert(ent.Owner, ent.Comp.BatteryAlert);
_alerts.ShowAlert(ent.Owner, ent.Comp.NoBatteryAlert);
return;
}
var chargePercent = (short)MathF.Round(battery.Value.Comp.LastCharge / battery.Value.Comp.MaxCharge * 10f);
if (chargePercent == 0 && _powerCell.HasDrawCharge(ent.Owner))
chargePercent = 1;
_alerts.ClearAlert(ent.Owner, ent.Comp.NoBatteryAlert);
_alerts.ShowAlert(ent.Owner, ent.Comp.BatteryAlert, chargePercent);
}
private void DelayDischargeStun(AndroidComponent component)
{
double multiplier = 1f + (_timing.CurTime - component.DischargeTime).TotalSeconds * 0.03f;

View File

@@ -99,26 +99,6 @@ public sealed class BatteryDrainerImplantSystem : EntitySystem
return null;
}
private void ChargeBattery(EntityUid user, BatteryDrainerImplantComponent component, EntityUid target)
{
if (!_powerCell.TryGetBatteryFromSlot(user, out var battery))
return;
if (!TryComp<BatteryComponent>(target, out var targetBattery))
return;
float transfer = Math.Clamp(targetBattery.MaxCharge - targetBattery.CurrentCharge, 0f, battery.Value.Comp.LastCharge);
if (transfer == 0f)
{
_popup.PopupEntity(Loc.GetString("implant-battery-drainer-no-transfer"), user, user);
return;
}
_powerCell.TryUseCharge(user, transfer);
_battery.ChangeCharge(target, transfer);
_audio.PlayPvs(component.UseSound, user);
}
private void TransferCharge(BatteryDrainerImplantComponent component, EntityUid source, EntityUid target, EntityUid user)
{
var sourceUid = TryGetBattery(source);

View File

@@ -3,6 +3,7 @@ using Content.Shared.Alert;
using Robust.Shared.Audio;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared.Android;
@@ -30,7 +31,7 @@ public sealed partial class AndroidComponent : Component
[DataField]
public float BasePointLightRadiuse = 2.5f;
[DataField]
public float BasePointLightEnergy = 1.2f;
public float BasePointLightEnergy = 1.6f;
[ViewVariables(VVAccess.ReadWrite)]
public EntityUid? LightEntity;
[DataField]
@@ -41,3 +42,9 @@ public sealed partial class AndroidComponent : Component
public string TogglelLightAction = "ActionToggleAndroidLeds";
public EntityUid? ToggleLightActionEntity;
}
[Serializable, NetSerializable]
public enum AndroidVisuals : byte
{
Light
}

View File

@@ -4,13 +4,15 @@
id: BoxSurvivalAndroid
suffix: Android
components:
- type: StorageFill
contents:
- id: ClothingMaskBreath
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskBreath
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: Sprite
layers:
- state: internals
@@ -24,93 +26,108 @@
id: BoxSurvivalAndroidExtended
suffix: Extended Android
components:
- type: StorageFill
contents:
- id: ClothingMaskBreath
- id: ExtendedEmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskBreath
- id: ExtendedEmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: entity
parent: BoxSurvivalAndroid
id: BoxSurvivalAndroidMedical
suffix: Medical Android
components:
- type: StorageFill
contents:
- id: ClothingMaskBreathMedical
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskBreathMedical
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: entity
parent: BoxSurvivalAndroid
id: BoxSurvivalAndroidSecurity
suffix: Security Android
components:
- type: StorageFill
contents:
- id: ClothingMaskGasSecurity
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskGasSecurity
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: entity
parent: BoxHug
id: BoxAndroidHug
suffix: Emergency Android
components:
- type: StorageFill
contents:
- id: ClothingMaskBreath
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskBreath
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: Label
currentLabel: reagent-name-nitrogen
- type: entity
parent: BoxSurvivalNitrogen
parent: BoxSurvivalAndroid
id: BoxAndroidMime
suffix: Mime Android
components:
- type: StorageFill
contents:
- id: ClothingMaskBreath
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskBreath
- id: EmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- id: FoodBreadNutriBatard
- type: entity
parent: BoxSurvivalAndroid
id: BoxSurvivalAndroidBlueShield
suffix: Blue Shield Android
components:
- type: StorageFill
contents:
- id: ClothingMaskGasBlueShield
- id: ExtendedEmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskGasBlueShield
- id: ExtendedEmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: entity
parent: BoxSurvivalAndroid
id: BoxSurvivalAndroidSyndicate
suffix: Syndicate Android
components:
- type: StorageFill
contents:
- id: ClothingMaskGasSyndicate
- id: ExtendedEmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: ClothingMaskGasSyndicate
- id: ExtendedEmergencyNitrogenTankFilled
- id: Flare
- id: Tyriumpack3
- id: WelderMini
# BlueShield
- type: entity

View File

@@ -66,7 +66,7 @@
# TODO, normally make light switching
- type: GenericVisualizer
visuals:
enum.UnpoweredFlashlightVisuals.LightOn:
enum.AndroidVisuals.Light:
AndroidLeds-leds:
True: { shader: unshaded }
False: { shader: shaded }