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)); }
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))); }
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); }
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); }
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); } }
public static SharpDX.Vector3 To3D(this SharpDX.Vector2 v) { return(new SharpDX.Vector3(v.X, v.Y, ActorCommonDataHelper.GetLocalAcd().x0D8_WorldPosZ)); }