Ejemplo n.º 1
0
        public bool Apply(Ets2Node node)
        {
            if (node.NodeUID == PrefabNodeUID)
            {
                PrefabNode = node;
            }

            if (node.NodeUID == StartNodeUID)
            {
                StartNode = node;
                return(true);
            }
            else if (node.NodeUID == EndNodeUID)
            {
                EndNode = node;
                return(true);
            }
            else if (NodesList.ContainsKey(node.NodeUID))
            {
                NodesList[node.NodeUID] = node;
                return(true);
            }
            else
            {
                //Console.WriteLine("Could not apply node " + node.NodeUID.ToString("X16") + " to item " + ItemUID.ToString("X16"));
                return(false);
            }
        }
Ejemplo n.º 2
0
        public void Find(Ets2Node node, ulong item, bool isBackward)
        {
            var req = new Ets2ItemSearchRequest {
                ItemUID = item, Node = node, IsBackward = isBackward, IsForward = !isBackward
            };

            ItemSearchRequests.Add(req);
        }
Ejemplo n.º 3
0
        public void ParseNodes()
        {
            if (Empty)
            {
                return;
            }
            Stopwatch sw = new Stopwatch();

            sw.Start();

            // First determine the number of positions in this file
            var nodesPieces = BitConverter.ToInt32(Stream, 0x10);

            int i = Stream.Length;

            do
            {
                i -= 56; // each block is 56 bytes long

                var node = new Ets2Node(Stream, i);
                if (node.NodeUID == 0)
                {
                    FooterStart = i + 56 - 4;
                    break;
                }
                Nodes.Add(node);

                if (Mapper.Nodes.ContainsKey(node.NodeUID) == false)
                {
                    Mapper.Nodes.TryAdd(node.NodeUID, node);
                }

                var count = BitConverter.ToInt32(Stream, i - 4);
                if (count >= nodesPieces && count == Nodes.Count)
                {
                    FooterStart = i - 4;
                    break;
                }
            } while (i > 60);
            //Console.WriteLine("Thereby footer starts at " + FooterStart.ToString("X16"));
            if (FooterStart < 0)
            {
                NoFooterError = true;
                return;
            }

            sw.Stop();
            //Console.WriteLine(Path.GetFileNameWithoutExtension(FilePath) + " contains " + Nodes.Count +
            //                  " nodes; parsed in " + sw.ElapsedMilliseconds + "ms");
        }
Ejemplo n.º 4
0
        public Ets2NavigationSegment(IEnumerable<Ets2Item> roadPath, Ets2NavigationSegment prevSeg)
        {
            Type = Ets2NavigationSegmentType.Road;

            Roads = roadPath.ToList();

            // Generate entry/exit noads & road item order
            var firstRoad = Roads.FirstOrDefault();
            var lastRoad = Roads.LastOrDefault();

            if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.StartNode))
            {
                Entry = firstRoad.StartNode;
                Exit = lastRoad.EndNode;
                ReversedRoadChain = false;
                ReversedRoadElements = false;
            }
            else if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.EndNode))
            {
                Entry = firstRoad.EndNode;
                Exit = lastRoad.StartNode;
                ReversedRoadChain = false;
                ReversedRoadElements = true;
            }
            else if (prevSeg.Prefab.NodesList.ContainsValue(lastRoad.StartNode))
            {
                Entry = lastRoad.StartNode;
                Exit = firstRoad.EndNode;
                ReversedRoadChain = true;
                ReversedRoadElements = false;
            }
            else if ( prevSeg.Prefab.NodesList.ContainsValue(lastRoad.EndNode))
            {
                Entry = lastRoad.EndNode;
                Exit = firstRoad.StartNode;
                ReversedRoadChain = true;
                ReversedRoadElements = true;
            }
            else
            {

            }
        }
Ejemplo n.º 5
0
        public Ets2NavigationSegment(IEnumerable <Ets2Item> roadPath, Ets2NavigationSegment prevSeg)
        {
            Type = Ets2NavigationSegmentType.Road;

            Roads = roadPath.ToList();

            // Generate entry/exit noads & road item order
            var firstRoad = Roads.FirstOrDefault();
            var lastRoad  = Roads.LastOrDefault();

            if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.StartNode))
            {
                Entry                = firstRoad.StartNode;
                Exit                 = lastRoad.EndNode;
                ReversedRoadChain    = false;
                ReversedRoadElements = false;
            }
            else if (prevSeg.Prefab.NodesList.ContainsValue(firstRoad.EndNode))
            {
                Entry                = firstRoad.EndNode;
                Exit                 = lastRoad.StartNode;
                ReversedRoadChain    = false;
                ReversedRoadElements = true;
            }
            else if (prevSeg.Prefab.NodesList.ContainsValue(lastRoad.StartNode))
            {
                Entry                = lastRoad.StartNode;
                Exit                 = firstRoad.EndNode;
                ReversedRoadChain    = true;
                ReversedRoadElements = false;
            }
            else if (prevSeg.Prefab.NodesList.ContainsValue(lastRoad.EndNode))
            {
                Entry                = lastRoad.EndNode;
                Exit                 = firstRoad.StartNode;
                ReversedRoadChain    = true;
                ReversedRoadElements = true;
            }
            else
            {
            }
        }
Ejemplo n.º 6
0
        public IEnumerable<IEnumerable<PointF>> GeneratePolygonCurves(Ets2Node node, int nodeOr)
        {
            List<IEnumerable<PointF>> ks = new List<IEnumerable<PointF>>();

            var steps = 16;

            if (nodeOr >= this.Nodes.Count)
                nodeOr = 0;
            if (Nodes.Any() == false)
                return ks;

            //Console.WriteLine("Rendering prefab " + Path.GetFileNameWithoutExtension(FilePath) + " Or " + nodeOr + " yaw " + Math.Round(180.0f/Math.PI*yaw));

            var xOr = node.X;
            var yOr = node.Z;
            var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI/2;

            foreach (var curve in Curves)
            {

                var ps = new PointF[steps];

                var srx = curve.StartX - this.Nodes[nodeOr].X;
                var erx = curve.EndX - this.Nodes[nodeOr].X;
                var sry = curve.StartZ - this.Nodes[nodeOr].Z;
                var ery = curve.EndZ - this.Nodes[nodeOr].Z;

                var sr = (float) Math.Sqrt(srx * srx + sry * sry);
                var er = (float)Math.Sqrt(erx * erx + ery * ery);

                var ans = yaw - Math.Atan2(sry,srx);
                var ane = yaw - Math.Atan2(ery, erx);

                var sx = xOr - sr * (float)Math.Sin(ans);
                var ex = xOr - er * (float)Math.Sin(ane);
                var sy = yOr - sr * (float)Math.Cos(ans);
                var ey = yOr - er * (float)Math.Cos(ane);
                // tmp
                ps = new PointF[2];
                ps[0] = new PointF(sx, sy);
                ps[1] = new PointF(ex, ey);
                ks.Add(ps);
                continue;

                var tangentSX = (float)Math.Cos(ans) * curve.Length;
                var tangentEX = (float)Math.Cos(ane) * curve.Length;
                var tangentSY = (float)Math.Sin(ans) * curve.Length;
                var tangentEY = (float)Math.Sin(ane) * curve.Length;

                for (int k = 0; k < steps; k++)
                {
                    var s = (float)k / (float)steps;
                    var x = (float)Ets2CurveHelper.Hermite(s, sx, ex, tangentSX, tangentEX);
                    var y = (float)Ets2CurveHelper.Hermite(s, sy, ey, tangentSY, tangentEY);
                    ps[k] = new PointF(x, y);
                }

                ks.Add(ps);
            }
            return ks;
        }
Ejemplo n.º 7
0
        public IEnumerable<Ets2Point> GeneratePolygonForRoute(Ets2PrefabRoute route, Ets2Node node,  int nodeOr)
        {
            List<Ets2Point> p = new List<Ets2Point>();

            if (route == null || route.Route == null)
            return p;

            /*
            yaw -= this.Nodes[nodeOr].Yaw;
            yaw += Math.PI/2;
            */
            var xOr = node.X;
            var yOr = node.Z;
            var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI / 2;

            foreach (var curve in route.Route)
            {
                var srx = curve.StartX - this.Nodes[nodeOr].X;
                var erx = curve.EndX - this.Nodes[nodeOr].X;
                var sry = curve.StartZ - this.Nodes[nodeOr].Z;
                var ery = curve.EndZ - this.Nodes[nodeOr].Z;

                var sr = (float) Math.Sqrt(srx*srx + sry*sry);
                var er = (float) Math.Sqrt(erx*erx + ery*ery);

                var ans = yaw - Math.Atan2(sry, srx);
                var ane = yaw - Math.Atan2(ery, erx);

                var sx = xOr - sr*(float) Math.Sin(ans);
                var ex = xOr - er*(float) Math.Sin(ane);
                var sy = yOr - sr*(float) Math.Cos(ans);
                var ey = yOr - er*(float) Math.Cos(ane);
                // tmp
                var ps = new Ets2Point[2];
                ps[0] = new Ets2Point(sx, node.Y, sy,(float) ans);
                ps[1] = new Ets2Point(ex, node.Y, ey, (float)ane);

                p.AddRange(ps);
            }

            return p;
        }
Ejemplo n.º 8
0
        public IEnumerable <IEnumerable <PointF> > GeneratePolygonCurves(Ets2Node node, int nodeOr)
        {
            List <IEnumerable <PointF> > ks = new List <IEnumerable <PointF> >();

            var steps = 16;

            if (nodeOr >= this.Nodes.Count)
            {
                nodeOr = 0;
            }
            if (Nodes.Any() == false)
            {
                return(ks);
            }

            //Console.WriteLine("Rendering prefab " + Path.GetFileNameWithoutExtension(FilePath) + " Or " + nodeOr + " yaw " + Math.Round(180.0f/Math.PI*yaw));

            var xOr = node.X;
            var yOr = node.Z;
            var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI / 2;

            foreach (var curve in Curves)
            {
                var ps = new PointF[steps];

                var srx = curve.StartX - this.Nodes[nodeOr].X;
                var erx = curve.EndX - this.Nodes[nodeOr].X;
                var sry = curve.StartZ - this.Nodes[nodeOr].Z;
                var ery = curve.EndZ - this.Nodes[nodeOr].Z;

                var sr = (float)Math.Sqrt(srx * srx + sry * sry);
                var er = (float)Math.Sqrt(erx * erx + ery * ery);

                var ans = yaw - Math.Atan2(sry, srx);
                var ane = yaw - Math.Atan2(ery, erx);

                var sx = xOr - sr * (float)Math.Sin(ans);
                var ex = xOr - er * (float)Math.Sin(ane);
                var sy = yOr - sr * (float)Math.Cos(ans);
                var ey = yOr - er * (float)Math.Cos(ane);
                // tmp
                ps    = new PointF[2];
                ps[0] = new PointF(sx, sy);
                ps[1] = new PointF(ex, ey);
                ks.Add(ps);
                continue;

                var tangentSX = (float)Math.Cos(ans) * curve.Length;
                var tangentEX = (float)Math.Cos(ane) * curve.Length;
                var tangentSY = (float)Math.Sin(ans) * curve.Length;
                var tangentEY = (float)Math.Sin(ane) * curve.Length;

                for (int k = 0; k < steps; k++)
                {
                    var s = (float)k / (float)steps;
                    var x = (float)Ets2CurveHelper.Hermite(s, sx, ex, tangentSX, tangentEX);
                    var y = (float)Ets2CurveHelper.Hermite(s, sy, ey, tangentSY, tangentEY);
                    ps[k] = new PointF(x, y);
                }

                ks.Add(ps);
            }
            return(ks);
        }
Ejemplo n.º 9
0
        public IEnumerable <Ets2Point> GeneratePolygonForRoute(Ets2PrefabRoute route, Ets2Node node, int nodeOr)
        {
            List <Ets2Point> p = new List <Ets2Point>();

            if (route == null || route.Route == null)
            {
                return(p);
            }

            /*
             * yaw -= this.Nodes[nodeOr].Yaw;
             * yaw += Math.PI/2;
             */
            var xOr = node.X;
            var yOr = node.Z;
            var yaw = node.Yaw - this.Nodes[nodeOr].Yaw + Math.PI / 2;

            foreach (var curve in route.Route)
            {
                var srx = curve.StartX - this.Nodes[nodeOr].X;
                var erx = curve.EndX - this.Nodes[nodeOr].X;
                var sry = curve.StartZ - this.Nodes[nodeOr].Z;
                var ery = curve.EndZ - this.Nodes[nodeOr].Z;

                var sr = (float)Math.Sqrt(srx * srx + sry * sry);
                var er = (float)Math.Sqrt(erx * erx + ery * ery);

                var ans = yaw - Math.Atan2(sry, srx);
                var ane = yaw - Math.Atan2(ery, erx);

                var sx = xOr - sr * (float)Math.Sin(ans);
                var ex = xOr - er * (float)Math.Sin(ane);
                var sy = yOr - sr * (float)Math.Cos(ans);
                var ey = yOr - er * (float)Math.Cos(ane);
                // tmp
                var ps = new Ets2Point[2];
                ps[0] = new Ets2Point(sx, node.Y, sy, (float)ans);
                ps[1] = new Ets2Point(ex, node.Y, ey, (float)ane);

                p.AddRange(ps);
            }

            return(p);
        }
Ejemplo n.º 10
0
        public bool Apply(Ets2Node node)
        {
            if (node.NodeUID == PrefabNodeUID)
            {
                PrefabNode = node;
            }

            if (node.NodeUID == StartNodeUID)
            {
                StartNode = node;
                return true;
            }
            else if (node.NodeUID == EndNodeUID)
            {
                EndNode = node;
                return true;
            }
            else if (NodesList.ContainsKey(node.NodeUID))
            {
                NodesList[node.NodeUID] = node;
                return true;
            }
            else
            {
                //Console.WriteLine("Could not apply node " + node.NodeUID.ToString("X16") + " to item " + ItemUID.ToString("X16"));
                return false;
            }
        }
Ejemplo n.º 11
0
        public void FindItems(Ets2Node node, bool postpone)
        {
            if (node.ForwardItemUID > 0)
            {
                Ets2Item itemForward;
                if (Mapper.Items.TryGetValue(node.ForwardItemUID, out itemForward))
                {
                    if (itemForward.Apply(node))
                    {
                        node.ForwardItem = itemForward;
                    }
                }
                else
                {
                    itemForward = FindItem(node.ForwardItemUID);
                    if (itemForward == null)
                    {
                        if (postpone)
                        {
                            Mapper.Find(node, node.ForwardItemUID, false);
                        }
                    }
                    else
                    {
                        Items.Add(itemForward);
                        Mapper.Items.TryAdd(node.ForwardItemUID, itemForward);
                        node.ForwardItem = itemForward;

                        if (itemForward.Apply(node))
                        {
                            node.ForwardItem = itemForward;
                        }
                    }
                }
            }
            if (node.BackwardItemUID > 0)
            {
                Ets2Item itemBackward;
                if (Mapper.Items.TryGetValue(node.BackwardItemUID, out itemBackward))
                {
                    if (itemBackward.Apply(node))
                    {
                        node.BackwardItem = itemBackward;
                    }
                }
                else
                {
                    itemBackward = FindItem(node.BackwardItemUID);
                    if (itemBackward == null)
                    {
                        if (postpone)
                        {
                            Mapper.Find(node, node.BackwardItemUID, true);
                        }
                    }
                    else
                    {
                        Items.Add(itemBackward);
                        Mapper.Items.TryAdd(node.BackwardItemUID, itemBackward);
                        node.BackwardItem = itemBackward;

                        if (itemBackward.Apply(node))
                        {
                            node.BackwardItem = itemBackward;
                        }
                    }
                }
            }
        }
Ejemplo n.º 12
0
        public void Find(Ets2Node node, ulong item, bool isBackward)
        {
            var req = new Ets2ItemSearchRequest
            {
                ItemUID = item,
                Node = node,
                IsBackward = isBackward,
                IsForward = !isBackward
            };

            ItemSearchRequests.Add(req);
        }
Ejemplo n.º 13
0
        public void ParseNodes()
        {
            if (Empty) return;
            Stopwatch sw = new Stopwatch();
            sw.Start();

            // First determine the number of positions in this file
            var nodesPieces = BitConverter.ToInt32(Stream, 0x10);

            int i = Stream.Length;

            do
            {
                i -= 56; // each block is 56 bytes long

                var node = new Ets2Node(Stream, i);
                if (node.NodeUID == 0)
                {
                    FooterStart = i + 56 - 4;
                    break;
                }
                Nodes.Add(node);

                if (Mapper.Nodes.ContainsKey(node.NodeUID) == false)
                    Mapper.Nodes.TryAdd(node.NodeUID, node);

                var count = BitConverter.ToInt32(Stream, i - 4);
                if (count >= nodesPieces && count == Nodes.Count)
                {
                    FooterStart = i - 4;
                    break;
                }

            } while (i > 60);
            //Console.WriteLine("Thereby footer starts at " + FooterStart.ToString("X16"));
            if (FooterStart < 0)
            {
                NoFooterError = true;
                return;
            }

            sw.Stop();
            //Console.WriteLine(Path.GetFileNameWithoutExtension(FilePath) + " contains " + Nodes.Count +
            //                  " nodes; parsed in " + sw.ElapsedMilliseconds + "ms");
        }
Ejemplo n.º 14
0
        public void FindItems(Ets2Node node, bool postpone)
        {
            if (node.ForwardItemUID > 0)
            {
                Ets2Item itemForward;
                if (Mapper.Items.TryGetValue(node.ForwardItemUID, out itemForward))
                {
                    if (itemForward.Apply(node))
                        node.ForwardItem = itemForward;
                }
                else
                {
                    itemForward = FindItem(node.ForwardItemUID);
                    if (itemForward == null)
                    {
                        if (postpone)
                            Mapper.Find(node, node.ForwardItemUID, false);
                    }
                    else
                    {
                        Items.Add(itemForward);
                        Mapper.Items.TryAdd(node.ForwardItemUID, itemForward);
                        node.ForwardItem = itemForward;

                        if (itemForward.Apply(node))
                            node.ForwardItem = itemForward;
                    }
                }
            }
            if (node.BackwardItemUID > 0)
            {
                Ets2Item itemBackward;
                if (Mapper.Items.TryGetValue(node.BackwardItemUID, out itemBackward))
                {
                    if (itemBackward.Apply(node))
                        node.BackwardItem = itemBackward;
                }
                else
                {
                    itemBackward = FindItem(node.BackwardItemUID);
                    if (itemBackward == null)
                    {
                        if (postpone)
                            Mapper.Find(node, node.BackwardItemUID, true);
                    }
                    else
                    {
                        Items.Add(itemBackward);
                        Mapper.Items.TryAdd(node.BackwardItemUID, itemBackward);
                        node.BackwardItem = itemBackward;

                        if (itemBackward.Apply(node))
                            node.BackwardItem = itemBackward;
                    }
                }
            }
        }