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); }
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); }
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); }