Ejemplo n.º 1
0
        /// <summary>
        ///     Serialize suit sensor status into device network package.
        /// </summary>
        public NetworkPayload SuitSensorToPacket(SuitSensorStatus status)
        {
            var payload = new NetworkPayload()
            {
                [DeviceNetworkConstants.Command]   = DeviceNetworkConstants.CmdUpdatedState,
                [SuitSensorConstants.NET_NAME]     = status.Name,
                [SuitSensorConstants.NET_JOB]      = status.Job,
                [SuitSensorConstants.NET_IS_ALIVE] = status.IsAlive,
            };

            if (status.TotalDamage != null)
            {
                payload.Add(SuitSensorConstants.NET_TOTAL_DAMAGE, status.TotalDamage);
            }
            if (status.Coordinates != null)
            {
                payload.Add(SuitSensorConstants.NET_CORDINATES, status.Coordinates);
            }

            return(payload);
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     Try to deserialize device network message into suit sensor status
        /// </summary>
        public SuitSensorStatus?PacketToSuitSensor(NetworkPayload payload)
        {
            // check command
            if (!payload.TryGetValue(DeviceNetworkConstants.Command, out string?command))
            {
                return(null);
            }
            if (command != DeviceNetworkConstants.CmdUpdatedState)
            {
                return(null);
            }

            // check name, job and alive
            if (!payload.TryGetValue(SuitSensorConstants.NET_NAME, out string?name))
            {
                return(null);
            }
            if (!payload.TryGetValue(SuitSensorConstants.NET_JOB, out string?job))
            {
                return(null);
            }
            if (!payload.TryGetValue(SuitSensorConstants.NET_IS_ALIVE, out bool?isAlive))
            {
                return(null);
            }

            // try get total damage and cords (optionals)
            payload.TryGetValue(SuitSensorConstants.NET_TOTAL_DAMAGE, out int?totalDamage);
            payload.TryGetValue(SuitSensorConstants.NET_CORDINATES, out MapCoordinates? cords);

            var status = new SuitSensorStatus(name, job)
            {
                IsAlive     = isAlive.Value,
                TotalDamage = totalDamage,
                Coordinates = cords
            };

            return(status);
        }
Ejemplo n.º 3
0
        public SuitSensorStatus?GetSensorState(EntityUid uid, SuitSensorComponent?sensor = null, TransformComponent?transform = null)
        {
            if (!Resolve(uid, ref sensor, ref transform))
            {
                return(null);
            }

            // check if sensor is enabled and worn by user
            if (sensor.Mode == SuitSensorMode.SensorOff || sensor.User == null)
            {
                return(null);
            }

            // try to get mobs id from ID slot
            var userName = Loc.GetString("suit-sensor-component-unknown-name");
            var userJob  = Loc.GetString("suit-sensor-component-unknown-job");

            if (_idCardSystem.TryFindIdCard(sensor.User.Value, out var card))
            {
                if (card.FullName != null)
                {
                    userName = card.FullName;
                }
                if (card.JobTitle != null)
                {
                    userJob = card.JobTitle;
                }
            }

            // get health mob state
            var isAlive = false;

            if (EntityManager.TryGetComponent(sensor.User.Value, out MobStateComponent? mobState))
            {
                isAlive = mobState.IsAlive();
            }

            // get mob total damage
            var totalDamage = 0;

            if (EntityManager.TryGetComponent(sensor.User.Value, out DamageableComponent? damageable))
            {
                totalDamage = damageable.TotalDamage.Int();
            }

            // finally, form suit sensor status
            var status = new SuitSensorStatus(userName, userJob);

            switch (sensor.Mode)
            {
            case SuitSensorMode.SensorBinary:
                status.IsAlive = isAlive;
                break;

            case SuitSensorMode.SensorVitals:
                status.IsAlive     = isAlive;
                status.TotalDamage = totalDamage;
                break;

            case SuitSensorMode.SensorCords:
                status.IsAlive     = isAlive;
                status.TotalDamage = totalDamage;
                status.Coordinates = transform.MapPosition;
                break;
            }

            return(status);
        }