Ejemplo n.º 1
0
        /// <summary>
        /// Performs the simulation of the field based on the field lastest values.
        /// </summary>
        /// <param name="lastValues">The field lastest values</param>
        public override void RunSimulation(SimulatedObjectField lastValues)
        {
            double[] values = null;

            try
            {
                values = lastValues.LastReceivedFieldValues.Select(fv => double.Parse(fv.Value)).ToArray();
            }
            catch (Exception)
            {
                return;
            }

            if (values.Length < 2)
            {
                if (values.Length > 0)
                {
                    double value = values[0];
                    SetFieldValue(lastValues, value);
                }

                return;
            }


            double   acc          = values[values.Length - 1] - values[values.Length - 2];
            DateTime time         = lastValues.LastReceivedFieldValues[values.Length - 1].Time;
            double   currentValue = GetFieldValue(lastValues);
            double   newValue     = 0;

            if (lastValues.LastSimulatedValue != lastValues.LastReceivedFieldValues[values.Length - 1].Value)
            {
                newValue = values[values.Length - 1] + acc * (DateTime.Now - time).TotalSeconds;
            }
            else
            {
                double elapsedTimeSinceLastConnect = (DateTime.Now - time).TotalMilliseconds;
                double maxAllowedTime = 250;
                double currentTime    = maxAllowedTime - elapsedTimeSinceLastConnect;

                if (currentTime < 0)
                {
                    acc = 0;
                }
                else
                {
                    double accP = currentTime / maxAllowedTime;
                    acc *= accP;
                }

                newValue = currentValue + acc * (DateTime.Now - time).TotalSeconds;
            }

            lastValues.LastSimulatedValue = lastValues.LastReceivedFieldValues[values.Length - 1].Value;

            SetFieldValue(lastValues, newValue);
        }
        /// <summary>
        /// Runs the simulation on a Simulated <see cref="LiNGS.Common.GameLogic.NetworkedField"/> following a Linear Extrapolation logic adjusted for network simulation.
        /// </summary>
        /// <param name="objectField">Field to perform simulation.</param>
        public override void RunSimulation(SimulatedObjectField objectField)
        {
            double[] intValues = null;

            try
            {
                intValues = objectField.LastReceivedFieldValues.Select(fv => double.Parse(fv.Value)).ToArray();
            }
            catch (Exception)
            {
                return;
            }

            double newValue = 0;

            if (intValues.Length > 1)
            {
                if (DateTime.Now - objectField.LastReceivedFieldValues[intValues.Length - 1].Time > TimeSpan.FromMilliseconds(200))
                {
                    newValue = Lerp(double.Parse(objectField.LastSimulatedValue), double.Parse(objectField.LastReceivedFieldValues[intValues.Length - 1].Value), .15f);
                    objectField.LastSimulatedValue = newValue.ToString();
                    objectField.LastReceivedFieldValues[intValues.Length - 1].Time = DateTime.Now - TimeSpan.FromMilliseconds(200);
                }
                else
                {
                    newValue = intValues[intValues.Length - 2] + (DateTime.Now - TimeSpan.FromMilliseconds(200) - objectField.LastReceivedFieldValues[intValues.Length - 2].Time).TotalMilliseconds / Math.Max(0.1, (objectField.LastReceivedFieldValues[intValues.Length - 1].Time - objectField.LastReceivedFieldValues[intValues.Length - 2].Time).TotalMilliseconds) * (intValues[intValues.Length - 1] - intValues[intValues.Length - 2]);
                    objectField.LastSimulatedValue = newValue.ToString();
                }
            }
            else
            {
                newValue = intValues[intValues.Length - 1];
            }

            objectField.Field.SetValue(objectField.NetworkedObject.OriginalObject, Convert.ChangeType(newValue, objectField.Field.FieldType, CultureInfo.InvariantCulture));
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Runs the simulation on a Simulated <see cref="LiNGS.Common.GameLogic.NetworkedField"/>
 /// </summary>
 /// <param name="fieldObject">Field to perform simulation</param>
 public abstract void RunSimulation(SimulatedObjectField fieldObject);
Ejemplo n.º 4
0
 private double GetFieldValue(SimulatedObjectField objectField)
 {
     return(Double.Parse(objectField.Field.GetValue(objectField.NetworkedObject.OriginalObject).ToString()));
 }
Ejemplo n.º 5
0
 private void SetFieldValue(SimulatedObjectField objectField, double value)
 {
     objectField.Field.SetValue(objectField.NetworkedObject.OriginalObject, Convert.ChangeType(value, objectField.Field.FieldType, CultureInfo.InvariantCulture));
 }