Beispiel #1
0
        public ComponentTrain FindNearestTrain()
        {
            var bodies = new DynamicArray <ComponentBody>();

            Utils.SubsystemBodies.FindBodiesAroundPoint(m_componentBody.Position.XZ, 2f, bodies);
            float          num    = 0f;
            ComponentTrain result = null;

            foreach (ComponentTrain train in bodies.Select(GetRailEntity))
            {
                if (train == null || train.Entity == Entity)
                {
                    continue;
                }
                float       score       = 0f;
                const float maxDistance = 4f;
                if (train.m_componentBody.Velocity.LengthSquared() < 1f && train.Direction == Direction)
                {
                    var v = train.m_componentBody.Position + Vector3.Transform(train.m_componentMount.MountOffset, train.m_componentBody.Rotation) - m_componentBody.Position;
                    if (v.LengthSquared() <= maxDistance)
                    {
                        score = maxDistance - v.LengthSquared();
                    }
                }
                if (score > num)
                {
                    num    = score;
                    result = train;
                }
            }
            return(result);
        }
Beispiel #2
0
        public override void Load(ValuesDictionary valuesDictionary, IdToEntityMap idToEntityMap)
        {
            base.Load(valuesDictionary, idToEntityMap);
            m_componentBody  = Entity.FindComponent <ComponentBody>(true);
            componentDamage  = Entity.FindComponent <ComponentDamage>();
            m_componentMount = Entity.FindComponent <ComponentMount>(true);
            if ((ComponentEngine = Entity.FindComponent <ComponentEngine>()) != null)
            {
                m_componentBody.CollidedWithBody += CollidedWithBody;
            }
            else
            {
                ParentBody = valuesDictionary.GetValue("ParentBody", default(EntityReference)).GetComponent <ComponentTrain>(Entity, idToEntityMap, false);
            }

            Direction = valuesDictionary.GetValue("Direction", 0);
        }
Beispiel #3
0
        public void Update(float dt)
        {
            if (ComponentEngine != null)
            {
                ComponentEngine.Coordinates = new Point3((int)m_componentBody.Position.X, (int)m_componentBody.Position.Y, (int)m_componentBody.Position.Z);
            }
            if (m_componentMount.Rider != null)
            {
                var player = m_componentMount.Rider.Entity.FindComponent <ComponentPlayer>(true);
                player.ComponentLocomotion.LookOrder = player.ComponentInput.PlayerInput.Look;
            }

            ComponentTrain t     = this;
            int            level = 0;

            for (; t.ParentBody != null; level++)
            {
                t = t.ParentBody;
            }
            if (level > 0)
            {
                var body = t.m_componentBody;
                var pos  = body.Position;
                var r    = body.Rotation;
                Utils.SubsystemTime.QueueGameTimeDelayedExecution(Utils.SubsystemTime.GameTime + 0.23 * level, delegate
                {
                    if (body.Velocity.XZ.LengthSquared() > 10f)
                    {
                        m_componentBody.Position = pos;
                        m_componentBody.Rotation = r;
                    }
                });
                m_outOfMountTime = Vector3.DistanceSquared(ParentBody.m_componentBody.Position, m_componentBody.Position) > 8f
                                        ? m_outOfMountTime + dt
                                        : 0f;
                ComponentDamage ComponentDamage = ParentBody.Entity.FindComponent <ComponentDamage>();
                if (m_outOfMountTime > 1f || (componentDamage != null && componentDamage.Hitpoints <= .05f) || ComponentDamage != null && ComponentDamage.Hitpoints <= .05f)
                {
                    ParentBody = null;
                }
                return;
            }

            switch (Direction)
            {
            case 0:
            case 2:
                m_componentBody.Position = new Vector3(MathUtils.Floor(m_componentBody.Position.X) + 0.5f, m_componentBody.Position.Y, m_componentBody.Position.Z);
                break;

            case 1:
            case 3:
                m_componentBody.Position = new Vector3(m_componentBody.Position.X, m_componentBody.Position.Y, MathUtils.Floor(m_componentBody.Position.Z) + 0.5f);
                break;
            }

            if (ComponentEngine != null && ComponentEngine.HeatLevel >= 100f && m_componentBody.StandingOnValue.HasValue)
            {
                var result = Utils.SubsystemTerrain.Raycast(m_componentBody.Position, m_componentBody.Position + new Vector3(0, -3f, 0), false, true, null);

                if (result.HasValue && Terrain.ExtractContents(result.Value.Value) == RailBlock.Index && (dt *= SimulateRail(RailBlock.GetRailType(Terrain.ExtractData(result.Value.Value)))) > 0f)
                {
                    m_componentBody.m_velocity += dt * rotation.ToForwardVector();
                }
            }
            m_componentBody.Rotation = Quaternion.Slerp(m_componentBody.Rotation, rotation, 0.15f);
        }