コード例 #1
0
    public override StatusLightData?GetStatusLightData(Wire wire)
    {
        StatusLightState lightState = StatusLightState.Off;

        if (WiresSystem.TryGetData(wire.Owner, PowerWireActionKey.MainWire, out int main) &&
            main != wire.Id)
        {
            return(null);
        }

        if (IsPowered(wire.Owner))
        {
            if (!AllWiresMended(wire.Owner) ||
                WiresSystem.TryGetData(wire.Owner, PowerWireActionKey.Pulsed, out bool pulsed) &&
                pulsed)
            {
                lightState = StatusLightState.BlinkingSlow;
            }
            else
            {
                lightState = (AllWiresCut(wire.Owner))
                    ? StatusLightState.Off
                    : StatusLightState.On;
            }
        }

        return(new StatusLightData(
                   _statusColor,
                   lightState,
                   _text));
    }
コード例 #2
0
    // I feel like these two should be within ApcPowerReceiverComponent at this point.
    // Getting it from a dictionary is significantly more expensive.
    private void SetPower(EntityUid owner, bool pulsed)
    {
        if (!EntityManager.TryGetComponent(owner, out ApcPowerReceiverComponent? power))
        {
            return;
        }

        if (pulsed)
        {
            power.PowerDisabled = true;
            return;
        }

        if (AllWiresCut(owner))
        {
            power.PowerDisabled = true;
        }
        else
        {
            if (WiresSystem.TryGetData(owner, PowerWireActionKey.Pulsed, out bool isPulsed) &&
                isPulsed)
            {
                return;
            }

            power.PowerDisabled = false;
        }
    }
コード例 #3
0
    private void UpdateElectrocution(Wire wire)
    {
        var allCut = AllWiresCut(wire.Owner);

        var activePulse = false;

        if (WiresSystem.TryGetData(wire.Owner, PowerWireActionKey.Pulsed, out bool pulsed))
        {
            activePulse = pulsed;
        }

        // if this is actively pulsed,
        // and there's not already an electrification cancel occurring,
        // we need to start that timer immediately
        if (!WiresSystem.HasData(wire.Owner, PowerWireActionKey.ElectrifiedCancel) &&
            activePulse &&
            IsPowered(wire.Owner) &&
            !allCut)
        {
            WiresSystem.StartWireAction(wire.Owner, _pulseTimeout, PowerWireActionKey.ElectrifiedCancel, new TimedWireEvent(AwaitElectrifiedCancel, wire));
        }
        else
        {
            if (!activePulse && allCut || AllWiresMended(wire.Owner))
            {
                SetElectrified(wire.Owner, false);
            }
        }
    }
コード例 #4
0
 private void SetWireCuts(EntityUid owner, bool isCut)
 {
     if (WiresSystem.TryGetData(owner, PowerWireActionKey.CutWires, out int?cut))
     {
         cut = isCut ? cut + 1 : cut - 1;
         WiresSystem.SetData(owner, PowerWireActionKey.CutWires, cut);
     }
 }
コード例 #5
0
 public override void Update(Wire wire)
 {
     if (!IsPowered(wire.Owner))
     {
         if (!WiresSystem.TryGetData(wire.Owner, PowerWireActionKey.Pulsed, out bool pulsed) ||
             !pulsed)
         {
             WiresSystem.TryCancelWireAction(wire.Owner, PowerWireActionKey.ElectrifiedCancel);
             WiresSystem.TryCancelWireAction(wire.Owner, PowerWireActionKey.PulseCancel);
         }
     }
 }
コード例 #6
0
    private void SetWireCuts(EntityUid owner, bool isCut)
    {
        if (WiresSystem.TryGetData(owner, PowerWireActionKey.CutWires, out int?cut) &&
            WiresSystem.TryGetData(owner, PowerWireActionKey.WireCount, out int?count))
        {
            if (cut == count && isCut ||
                cut <= 0 && !isCut)
            {
                return;
            }

            cut = isCut ? cut + 1 : cut - 1;
            WiresSystem.SetData(owner, PowerWireActionKey.CutWires, cut);
        }
    }
コード例 #7
0
    public override bool Pulse(EntityUid user, Wire wire)
    {
        WiresSystem.TryCancelWireAction(wire.Owner, PowerWireActionKey.ElectrifiedCancel);

        var electrocuted = !TrySetElectrocution(user, wire, true);

        if (WiresSystem.TryGetData(wire.Owner, PowerWireActionKey.Pulsed, out bool pulsedKey) &&
            pulsedKey)
        {
            return(false);
        }

        WiresSystem.SetData(wire.Owner, PowerWireActionKey.Pulsed, true);
        WiresSystem.StartWireAction(wire.Owner, _pulseTimeout, PowerWireActionKey.PulseCancel, new TimedWireEvent(AwaitPulseCancel, wire));

        if (electrocuted)
        {
            return(false);
        }

        SetPower(wire.Owner, true);
        return(true);
    }
コード例 #8
0
 private bool AllWiresMended(EntityUid owner)
 {
     return(WiresSystem.TryGetData(owner, PowerWireActionKey.CutWires, out int?cut) &&
            cut == 0);
 }
コード例 #9
0
 private bool AllWiresCut(EntityUid owner)
 {
     return(WiresSystem.TryGetData(owner, PowerWireActionKey.CutWires, out int?cut) &&
            WiresSystem.TryGetData(owner, PowerWireActionKey.WireCount, out int?count) &&
            count == cut);
 }