Ejemplo n.º 1
0
        public static Point FromD3toScreenCoords(Vector3 objectGameLocation)
        {
            var     localAcd           = ActorCommonDataHelper.GetLocalAcd();
            Vector3 currentCharGameLoc = new Vector3()
            {
                X = localAcd.x0D0_WorldPosX, Y = localAcd.x0D4_WorldPosY, Z = localAcd.x0D8_WorldPosZ
            };

            double xd = objectGameLocation.X - currentCharGameLoc.X;
            double yd = objectGameLocation.Y - currentCharGameLoc.Y;
            double zd = objectGameLocation.Z - currentCharGameLoc.Z;

            double w = -0.515 * xd + -0.514 * yd + -0.686 * zd + 97.985;
            double X = (-1.682 * xd + 1.683 * yd + 0 * zd + 7.045e-3) / w;
            double Y = (-1.54 * xd + -1.539 * yd + 2.307 * zd + 6.161) / w;

            double width  = Engine.Current.VideoPreferences.x0C_DisplayMode.x20_Width;
            double height = Engine.Current.VideoPreferences.x0C_DisplayMode.x24_Height;

            double aspectChange = (double)((double)width / (double)height) / (double)(4.0f / 3.0f); // 4:3 = default aspect ratio

            X /= aspectChange;

            float rX = (float)((X + 1) / 2 * width);
            float rY = (float)((1 - Y) / 2 * height);

            if ((uint)rX > width || (uint)rY > height)
            {
            }

            return(new Point((int)rX, (int)rY));
        }
Ejemplo n.º 2
0
 private void DumpAttributeDescriptors()
 {
     var attribDescriptors = Engine.Current.AttributeDescriptors;
     var acd = ActorCommonDataHelper.GetLocalAcd();
     var q   = acd.EnumerateAttributes().Select(a => new { Id = a.x04_Key & 0xFFF, Key = a.x04_Key, Mod = (a.x04_Key >> 12), Value = a.x08_Value, Descriptor = attribDescriptors.Single(d => d.x00_Id == (a.x04_Key & 0xFFF)) });
     var str = string.Join(Environment.NewLine, q.Select(a => string.Join("\t",
                                                                          a.Id.ToString().PadRight(5),
                                                                          "0x" + a.Key.ToString("X8"),
                                                                          (a.Mod == 0xFFFFF ? "-1" : a.Mod.ToString()).PadRight(5),
                                                                          "0x" + a.Mod.ToString("X8").Substring(3),
                                                                          a.Descriptor.x1C_Name,
                                                                          a.Descriptor.x10_DataType == 1 ? a.Value.Int32 : a.Value.Single)));
 }
Ejemplo n.º 3
0
        public static async Task <bool> MoveToPosWithNavMeshAsync(SharpDX.Vector3 vecDest, int NearDistance = 50)
        {
            if (Nav.D3.Navmesh.Current == null)
            {
                Nav.D3.Navmesh.Create(Enigma.D3.Engine.Current, new Nav.ExploreEngine.Nearest());
            }

            var localAcd = ActorCommonDataHelper.GetLocalAcd();
            var distance = vecDest.Distance(); // (Math.Pow(localAcd.x0D0_WorldPosX - vecDest.X, 2) + Math.Pow(localAcd.x0D4_WorldPosY - vecDest.Y, 2));

            var minDistanceReached = distance;
            var dtDistanceReached  = DateTime.Now;

            DateTime dtTimeout = DateTime.Now;

            while (distance > NearDistance)
            {
                if (DateTime.Now > dtTimeout.AddSeconds(30) || DateTime.Now > dtDistanceReached.AddSeconds(10))
                {
                    return(false);
                }

                SharpDX.Vector2 curVector  = localAcd.ToSharpDXVector2(); // new SharpDX.Vector2(localAcd.x0D0_WorldPosX, localAcd.x0D4_WorldPosY);
                SharpDX.Vector2 destVector = new SharpDX.Vector2(vecDest.X, vecDest.Y);

                // Update current player position.
                Nav.D3.Navmesh.Current.Navigator.CurrentPos = localAcd.ToNavVec3(); // new Nav.Vec3(localAcd.x0D0_WorldPosX, localAcd.x0D4_WorldPosY, localAcd.x0D8_WorldPosZ);

                // Update destination. You can keep setting the same value there is internal check if destination has actually changed.
                // This destination overrides any internal destinations (including exploration). When You just want to explore You do
                // not need to set any destination. It will be set automatically.
                Nav.D3.Navmesh.Current.Navigator.Destination = new Nav.Vec3(vecDest.X, vecDest.Y, vecDest.Z);

                // Get current destination.
                Nav.Vec3 goToPosition = Nav.D3.Navmesh.Current.Navigator.GoToPosition;
                while (goToPosition.IsEmpty)
                {
                    await Task.Delay(10);
                }

                SharpDX.Vector3 goToPositionVector = new SharpDX.Vector3(goToPosition.X, goToPosition.Y, goToPosition.Z);
                await MoveToPosAsync(goToPositionVector);
            }

            return(true);
        }
Ejemplo n.º 4
0
        public static async Task <bool> MoveToPosAsync(SharpDX.Vector3 vecDest, int NearDistance = 50)
        {
            var localAcd = ActorCommonDataHelper.GetLocalAcd();
            var distance = (Math.Pow(localAcd.x0D0_WorldPosX - vecDest.X, 2) + Math.Pow(localAcd.x0D4_WorldPosY - vecDest.Y, 2));

            var minDistanceReached = distance;
            var dtDistanceReached  = DateTime.Now;

            DateTime dtTimeout = DateTime.Now;

            while (distance > NearDistance)
            {
                if (DateTime.Now > dtTimeout.AddSeconds(30) || DateTime.Now > dtDistanceReached.AddSeconds(10))
                {
                    return(false);
                }

                SharpDX.Vector2 curVector  = new SharpDX.Vector2(localAcd.x0D0_WorldPosX, localAcd.x0D4_WorldPosY);
                SharpDX.Vector2 destVector = new SharpDX.Vector2(vecDest.X, vecDest.Y);

                distance = (Math.Pow(localAcd.x0D0_WorldPosX - vecDest.X, 2) + Math.Pow(localAcd.x0D4_WorldPosY - vecDest.Y, 2));
                var minExtendValue = Math.Min(10f, float.Parse(distance.ToString(), CultureInfo.InvariantCulture.NumberFormat));

                var vecNormalized = curVector.Extend(destVector, minExtendValue).To3D();

                System.Drawing.Point screenPoint = D3ToScreen.FromD3toScreenCoords(vecNormalized);

                MouseEvents.RightClick(screenPoint.X, screenPoint.Y);
                await Task.Delay(new Random().Next(100, 250));

                if (distance < minDistanceReached)
                {
                    minDistanceReached = distance;
                    dtDistanceReached  = DateTime.Now;
                }
            }

            return(true);
        }
Ejemplo n.º 5
0
        public void Update(Engine engine)
        {
            try
            {
                if (!IsLocalActorValid(engine))
                {
                    return;
                }

                if (!IsObjectManagerOnNewFrame(engine))
                {
                    return;
                }

                var itemsToAdd = new List <IMapMarker>();

                var acds = ActorCommonData.Container;
                if (acds == null)
                {
                    Trace.TraceError("ACDs == null");
                }
                else
                {
                    var bufferSizePreDump = _acdsBuffer.Length;

                    acds.TakeSnapshot();
                    var dump = acds.GetBufferDump(ref _acdsBuffer);

                    var bufferSizePostDump = _acdsBuffer.Length;
                    if (bufferSizePostDump < bufferSizePreDump)
                    {
                        _minimapItems.Clear();
                        _minimapItemsDic.Clear();
                        _playerAcd = null;
                        return;
                    }

                    // Must have a local ACD to base coords on.
                    if (_playerAcd == null)
                    {
                        var playerAcdId = ActorCommonDataHelper.GetLocalAcd().x000_Id;

                        foreach (var item in dump)
                        {
                            var acdId = BitConverter.ToInt32(_acdsBuffer, item.BufferOffset + 0x00);
                            if (acdId == playerAcdId)
                            {
                                _playerAcd = item.Create();
                            }
                        }

                        if (_playerAcd == null)
                        {
                            return;
                        }
                    }

                    var firstFreeAcd = acds.x114_Free;
                    if (firstFreeAcd != _firstFreeAcd)
                    {
                        foreach (var item in dump)
                        {
                            if (_minimapItemsDic.ContainsKey(item.Address))
                            {
                                continue;
                            }
                            var acd = item.Create();

                            int acdId = acd.x000_Id;
                            if (acdId == -1)
                            {
                                continue;
                            }

                            var actorSnoId = acd.x090_ActorSnoId;
                            if (_ignoredSnoIds.Contains(actorSnoId))
                            {
                                continue;
                            }

                            if (!_minimapItemsDic.ContainsKey(acd.Address))
                            {
                                bool ignore;
                                var  minimapItem = MapMarkerFactory.Create(acd, out ignore);
                                if (ignore)
                                {
                                    _ignoredSnoIds.Add(actorSnoId);
                                }
                                else if (minimapItem != null)
                                {
                                    _minimapItemsDic.Add(acd.Address, minimapItem);
                                    itemsToAdd.Add(minimapItem);
                                }
                            }
                        }
                    }

                    _firstFreeAcd = firstFreeAcd;
                    acds.FreeSnapshot();
                }

                UpdateUI(itemsToAdd);
            }
            catch (Exception exception)
            {
                OnUpdateException(exception);
            }
        }
Ejemplo n.º 6
0
 public static SharpDX.Vector3 To3D(this SharpDX.Vector2 v)
 {
     return(new SharpDX.Vector3(v.X, v.Y, ActorCommonDataHelper.GetLocalAcd().x0D8_WorldPosZ));
 }