/// <summary>
        ///
        /// </summary>
        /// <param name="selectRay">A ray in Xna Coords that was cast according to the viewport</param>
        /// <param name="add">Whether to add the selected triangle to the selection</param>
        public void UpdateSelectedTriangle(Ray selectRay, bool add)
        {
            if (!add)
            {
                Vertices.Clear();
                Indices.Clear();
            }

            var pos3D = selectRay.Position;
            var dir3D = selectRay.Direction;

            PositionUtil.TransformXnaCoordsToWoWCoords(ref pos3D);
            PositionUtil.TransformXnaCoordsToWoWCoords(ref dir3D);
            var ray3D = new Ray(pos3D, dir3D);

            var pos2D = new Vector2(pos3D.X, pos3D.Y);
            var dir2D = new Vector2(dir3D.X, dir3D.Y).NormalizedCopy();
            var ray2D = new Ray2D(pos2D, dir2D);

            var closestTime = float.MaxValue;
            var closestVec0 = Vector3.Zero;
            var closestVec1 = Vector3.Zero;
            var closestVec2 = Vector3.Zero;

            foreach (var tile in _adtManager.MapTiles)
            {
                var results = new List <Index3>();
                if (!tile.GetPotentialColliders(ray2D, results))
                {
                    continue;
                }

                foreach (var tri in results)
                {
                    var vec0 = tile.TerrainVertices[tri.Index0];
                    var vec1 = tile.TerrainVertices[tri.Index1];
                    var vec2 = tile.TerrainVertices[tri.Index2];

                    float time;
                    if (!Intersection.RayTriangleIntersect(ray3D, vec0, vec1, vec2, out time))
                    {
                        continue;
                    }
                    if (time > closestTime)
                    {
                        continue;
                    }

                    closestTime = time;
                    closestVec0 = vec0;
                    closestVec1 = vec1;
                    closestVec2 = vec2;
                }
            }
            if (closestTime == float.MaxValue)
            {
                return;
            }
            AddSelectedTriangle(closestVec0, closestVec1, closestVec2);
        }
Exemple #2
0
        public override bool AttackNearestTarget()
        {
            var alreadGotAValidTarget = CurrentTarget != null && CurrentTarget.Targetable;

            if (alreadGotAValidTarget || !(nextAttackPossible < Time.time))
            {
                return(InRange);
            }
            var findNewTarget = nearestTarget == null ||
                                !IsInRange(nearestTarget) ||
                                !IsInLineOfSight(nearestTarget.gameObject) ||
                                !nearestTarget.Targetable;

            if (findNewTarget)
            {
                var target = TargetManager.Instance.GetEnemies(team)
                             .Where(o => {
                    var dmg = o.GetComponent <Damageable>();
                    return(dmg != null && dmg.Targetable);
                })
                             .Where(IsInLineOfSight)
                             .Aggregate(null, PositionUtil.FindNearest(gameObject.transform.position));
                nearestTarget = target != null?target.GetComponent <Damageable>() : null;
            }
            CurrentTarget = nearestTarget;
            return(InRange);
        }
Exemple #3
0
        private static Vector3 WarpLocation(GameObject caster)
        {
            var splat        = caster.GetComponentInChildren <SplatManager>();
            var warpLocation = PositionUtil.ClosesNavMeshPosition(splat.GetSpellCursorPosition());

            return(warpLocation);
        }
Exemple #4
0
        private void Update()
        {
            if (NotActive())
            {
                return;
            }
            if (animator != null)
            {
                animator.SetFloat("Speed", agent.velocity.magnitude);
            }
            if (nextEnemyCheck <= Time.time)
            {
                attack.SetTarget(
                    TargetManager.Instance.GetValidEnemyTargets(team)
                    .Select(dmg => dmg.gameObject)
                    .Aggregate(null, PositionUtil.FindNearest(gameObject.transform.position))
                    .GetComponent <Damageable>());

                nextEnemyCheck = Time.time + ReevaluateInterval;
            }
            agent.isStopped = attack.InRange;
            var t = attack.GetTarget();

            if (t != null)
            {
                agent.SetDestination(t.gameObject.transform.position);
            }
        }
Exemple #5
0
        public LiquidType GetLiquidType(Vector3 worldPos)
        {
            Point2D tileCoord;
            Point2D chunkCoord;
            var     unitCoord = PositionUtil.GetHeightMapXYForPos(worldPos, out tileCoord, out chunkCoord);

            var tile = GetTile(tileCoord.X, tileCoord.Y);

            if (tile == null)
            {
                return(LiquidType.None);
            }

            var type = tile.GetLiquidType(chunkCoord);

            if (type != LiquidType.None)
            {
                // check if below the liquid height level
                if (tile.GetLiquidHeight(chunkCoord, unitCoord) > worldPos.Z)
                {
                    return(type);
                }
            }
            return(LiquidType.None);
        }
Exemple #6
0
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            TerrainDisplayConfig.Initialize();
            LogUtil.SetupConsoleLogging();
            NativeMethods.StormLibFolder = TerrainDisplayConfig.LibDir;
            NativeMethods.InitAPI();

            var defaultTileId    = TileIdentifier.DefaultTileIdentifier;
            var useExtractedData = TerrainDisplayConfig.UseExtractedData;

            if (useExtractedData)
            {
                TerrainManager = new ExtractedTerrainManager(TerrainDisplayConfig.MapDir, defaultTileId);
            }
            else
            {
                TerrainManager = new MpqTerrainManager(defaultTileId);
            }

            TerrainManager.LoadTile(defaultTileId);

            AvatarPosition = new Vector3(TerrainConstants.CenterPoint - (defaultTileId.TileX + 1) * TerrainConstants.TileSize,
                                         TerrainConstants.CenterPoint - (defaultTileId.TileY) * TerrainConstants.TileSize,
                                         100.0f);

            PositionUtil.TransformWoWCoordsToXNACoords(ref AvatarPosition);
            //new RecastRunner(TerrainManager).Start();

            using (var game = new Game1(AvatarPosition.ToXna()))
            {
                game.Run();
            }
        }
Exemple #7
0
        private bool IsInLineOfSight(GameObject target)
        {
            RaycastHit hit;

            return(PositionUtil.RayFromToHitOnlyTerrain(gameObject.transform.position, target.transform.position,
                                                        out hit));
        }
Exemple #8
0
            /// <summary>
            /// (BD-09)-->84
            /// </summary>
            /// <param name="bd_lat"></param>
            /// <param name="bd_lon"></param>
            /// <returns></returns>
            public static Gps bd09_To_Gps84(double bd_lat, double bd_lon)
            {
                Gps gcj02 = PositionUtil.bd09_To_Gcj02(bd_lat, bd_lon);
                Gps map84 = PositionUtil.gcj_To_Gps84(gcj02.getWgLat(), gcj02.getWgLon());

                return(map84);
            }
Exemple #9
0
        public Point Translate(double lat, double lng, bool address = false)
        {
            Point gps;

            if (lat == -1.0 && lat == -1.0)
            {
                gps         = new Point(-1.000, -1.000);
                gps.Address = "未解析到地址.";
                return(gps);
            }
            gps = PositionUtil.gps84_To_Gcj02(lat, lat);
            try
            {
                if (address)
                {
                    gps.Address = GetAddress(gps);
                }
                return(gps);
            }
            catch (Exception)
            {
                gps.Address = "未知";

                return(gps);
            }
        }
Exemple #10
0
        public override void Process(CmdTrigger <RealmServerCmdArgs> trigger)
        {
            WorldObject obj = trigger.Args.Target;

            var    zone = obj.Zone;
            string zoneStr;

            if (zone != null)
            {
                zoneStr = zone.Id.ToString();

                while ((zone = zone.ParentZone) != null)
                {
                    zoneStr += " in " + zone;
                }
            }
            else
            {
                zoneStr = "<null>";
            }

            var height = obj.TerrainHeight;

            trigger.Reply("Map: " + obj.Map + ", Zone: " + zoneStr);
            trigger.Reply("Position X: " + obj.Position.X + ", Y: " + obj.Position.Y + ", Z: " + obj.Position.Z + ", O: " + obj.Orientation +
                          "(" + Math.Abs(obj.Position.Z - height) + " yds from Ground)");

            int tileX, tileY;

            PositionUtil.GetTileXYForPos(obj.Position, out tileX, out tileY);
            trigger.ReplyFormat("Tile: X={0}, Y={1} (Collision Data {2})", tileX, tileY,
                                obj.Map.Terrain.IsAvailable(tileX, tileY) ?
                                ChatUtility.Colorize("Available", Color.Green) :
                                ChatUtility.Colorize("Unavailable", Color.Red));
        }
Exemple #11
0
        protected override bool BuildPolyVerticiesAndIndicies()
        {
            List <Vector3> vertices;
            List <int>     indices;

            _manager.GetMeshVerticesAndIndices(out vertices, out indices);

            if (vertices.Count == 0 || indices.Count == 0)
            {
                return(false);
            }

            _cachedPolyVertices = new VertexPositionNormalColored[vertices.Count];
            for (var i = 0; i < vertices.Count; i++)
            {
                _cachedPolyVertices[i] = new VertexPositionNormalColored(vertices[i].ToXna(), MeshPolyColor,
                                                                         Vector3.Up.ToXna());
                PositionUtil.TransformWoWCoordsToXNACoords(ref _cachedPolyVertices[i]);
            }

            _cachedPolyIndices = new int[indices.Count];
            for (int i = 0; i < indices.Count; i++)
            {
                _cachedPolyIndices[i] = indices[i];
            }

            RenderPolyCached = true;
            return(true);
        }
Exemple #12
0
 public bool IsAvailable(int tileX, int tileY)
 {
     if (PositionUtil.VerifyTileCoords(tileX, tileY))
     {
         return(TileProfile[tileX, tileY]);
     }
     return(false);
 }
Exemple #13
0
 /// <summary>
 /// Google中国用的是GCJ02坐标系,Google国外用的是WGS84坐标系
 /// </summary>
 /// <param name="lat"></param>
 /// <param name="lng"></param>
 /// <param name="address"></param>
 /// <returns></returns>
 public Point Translate(double lat, double lng, bool address = false)
 {
     //国内转成 Gcj02
     if (PositionUtil.outOfChina(lat, lng))
     {
         return(PositionUtil.gps84_To_Gcj02(lat, lng));
     }
     //国外直接返回
     return(new Point(lat, lng));
 }
 /// <summary>
 /// Creates a backstab action. Backstab does more damage when the target isn't facing the attacker.
 /// </summary>
 /// <param name="factor">
 /// The damage multiplication factor. 2 = double damage
 /// </param>
 /// <returns></returns>
 public static Action <MeleeAttack> Backstab(double factor)
 {
     return(attack => {
         var dmg = attack.AttackDamage;
         if (!PositionUtil.Facing(attack.GetTarget().gameObject.transform, attack.gameObject.transform))
         {
             dmg = (int)(dmg * factor);
         }
         attack.GetTarget().Damage(dmg);
     });
 }
    void CenterMap(int index)
    {
        var camPos = Camera.main.transform.position;
        var width  = Map.row; //May need to change to Map.row

        PositionUtil.CalcPosition(index, width, out tempX, out tempY);

        camPos.x = tempX * TileSize.x;
        camPos.y = -(tempY * TileSize.y);
        Camera.main.transform.position = camPos;
    }
Exemple #16
0
        public float GetLiquidHeight(Vector3 worldPos)
        {
            Point2D tileCoord;
            Point2D chunkCoord;
            var     unitCoord = PositionUtil.GetHeightMapXYForPos(worldPos, out tileCoord, out chunkCoord);

            var tile = GetTile(tileCoord.X, tileCoord.Y);

            return((tile == null)
                    ? float.MinValue
                    : tile.GetLiquidHeight(chunkCoord, unitCoord));
        }
Exemple #17
0
    public void MoveInDir(Vector2 dir)
    {
        PositionUtil.CalcPosition(currentTile, map.row, out tempX, out tempY);

        tempX += (int)dir.x;
        tempY += (int)dir.y;

        PositionUtil.CalcIndex(tempX, tempY, map.row, out tempIndex);

        //Debug.Log("Moving to: " + tempIndex);
        MoveTo(tempIndex, true);
    }
Exemple #18
0
        public override bool OnActivation(GameObject c)
        {
            Vector3 hitOnTerrain;

            PositionUtil.ProjectOnTerrainFromPosition(c.transform.position, out hitOnTerrain);
            var areaOfEffect = Instantiate(AoEPrefab, hitOnTerrain, c.transform.rotation);

            areaOfEffect.AffectedTeams = new List <int> {
                c.GetComponent <Team>().TeamId
            };
            return(true);
        }
Exemple #19
0
        public void TestGetValidVerticalPositionMethod()
        {
            Position pos   = new Position(1, 1);
            var      moves = PositionUtil.GetValidVerticalPosition(pos).ToList();

            Assert.IsNotNull(moves);
            Assert.AreEqual(7, moves.Count);

            var possibles = new[] { new Position(2, 1), new Position(3, 1), new Position(4, 1), new Position(5, 1), new Position(6, 1), new Position(7, 1), new Position(8, 1) };

            foreach (var possible in possibles)
            {
                Assert.IsTrue(moves.Contains(possible));
            }
        }
Exemple #20
0
        public void TestGetValidHorizontalPositionMethod()
        {
            Position pos   = new Position(1, 1);
            var      moves = PositionUtil.GetValidHorizontalPosition(pos).ToList();

            Assert.IsNotNull(moves);
            Assert.AreEqual(7, moves.Count);

            var possibles = new[] { new Position(1, 2), new Position(1, 3), new Position(1, 4), new Position(1, 5), new Position(1, 6), new Position(1, 7), new Position(1, 8) };

            foreach (var possible in possibles)
            {
                Assert.IsTrue(moves.Contains(possible));
            }
        }
 private static int CopyVectorsToRecastArray(IList <Vector3> renderVertices, IList <Vector3> vertices, int vecOffset)
 {
     if (renderVertices != null)
     {
         var length = renderVertices.Count;
         for (var i = 0; i < length; i++)
         {
             var vertex = renderVertices[i];
             PositionUtil.TransformWoWCoordsToRecastCoords(ref vertex);
             vertices[vecOffset + i] = vertex;
         }
         vecOffset += renderVertices.Count;
     }
     return(vecOffset);
 }
Exemple #22
0
        private void BuildVerticiesAndIndicies()
        {
            // Cycle through each ADT
            var tempVertices = new List <VertexPositionNormalColored>();
            var tempIndicies = new List <int>();
            var offset       = 0;

            foreach (var adt in _manager.MapTiles)
            {
                // Handle the ADTs
                for (var v = 0; v < adt.TerrainVertices.Count; v++)
                {
                    var vertex          = adt.TerrainVertices[v];
                    var vertexPosNmlCol = new VertexPositionNormalColored(vertex.ToXna(), TerrainColor,
                                                                          Microsoft.Xna.Framework.Vector3.Down);
                    tempVertices.Add(vertexPosNmlCol);
                }
                for (var i = 0; i < adt.Indices.Count; i++)
                {
                    tempIndicies.Add(adt.Indices[i] + offset);
                }
                offset = tempVertices.Count;

                //if (!DrawLiquids) continue;
                for (var v = 0; v < adt.LiquidVertices.Count; v++)
                {
                    var vertex          = adt.LiquidVertices[v];
                    var vertexPosNmlCol = new VertexPositionNormalColored(vertex.ToXna(), WaterColor,
                                                                          Microsoft.Xna.Framework.Vector3.Down);
                    tempVertices.Add(vertexPosNmlCol);
                }
                for (var i = 0; i < adt.LiquidIndices.Count; i++)
                {
                    tempIndicies.Add(adt.LiquidIndices[i] + offset);
                }
                offset = tempVertices.Count;
            }

            _cachedIndices  = tempIndicies.ToArray();
            _cachedVertices = tempVertices.ToArray();

            _renderCached = true;

            for (var i = 0; i < _cachedVertices.Length; i++)
            {
                PositionUtil.TransformWoWCoordsToXNACoords(ref _cachedVertices[i]);
            }
        }
Exemple #23
0
        internal static bool TryLoad(TileIdentifier tileId, out Tile tile)
        {
            tile = null;
            var mpqManager = new MpqTerrainManager(tileId);
            if (!mpqManager.LoadTile(tileId)) return false;
            
            tile = new Tile
            {
                //_terrainTree = mpqManager.ADTManager.MapTiles[0].QuadTree,
                //_m2Tree = ((M2Manager) mpqManager.M2Manager).QuadTree,
                //_wmoTree = ((WMOManager) mpqManager.WMOManager).QuadTree,
                Bounds = PositionUtil.GetTileBoundingRect(tileId),
            };

            return true;
        }
Exemple #24
0
        public bool GetClickLocation(out GameObject target, out ClickLocation click)
        {
            click = new ClickLocation();
            Vector3 terrainHit;

            if (!PositionUtil.GetCursorLocation(out target, out terrainHit, ClickableLayers) ||
                EventSystem.current.IsPointerOverGameObject())
            {
                return(false);
            }

            click = new ClickLocation {
                Target = target, Location = terrainHit
            };
            return(true);
        }
Exemple #25
0
        private void BuildVerticiesAndIndicies()
        {
            var tileId       = TileIdentifier.DefaultTileIdentifier;
            var tempVertices = new List <VertexPositionNormalColored>();
            var tempIndices  = new List <int>();
            var offset       = 0;

            var baseXPos = TerrainConstants.CenterPoint - (tileId.TileX + 1) * TerrainConstants.TileSize;
            var baseYPos = TerrainConstants.CenterPoint - (tileId.TileY + 1) * TerrainConstants.TileSize;
            var baseZPos = -100.0f;

            // The Bottom-Righthand corner of a Tile in WoW coords
            var baseAxisVec = new Vector3(baseXPos, baseYPos, baseZPos);
            //var baseAxisVec = new Vector3(0.0f);

            // The Top-Lefthand corner of a Tile in WoW coords
            var endAxisVec = baseAxisVec + new Vector3(TerrainConstants.TileSize * 2);

            PositionUtil.TransformWoWCoordsToXNACoords(ref baseAxisVec);
            PositionUtil.TransformWoWCoordsToXNACoords(ref endAxisVec);

            // The WoW X-axis drawn in XNA coords
            tempVertices.Add(new VertexPositionNormalColored(baseAxisVec, Color.Red, Vector3.Up));
            tempIndices.Add(0);
            tempVertices.Add(new VertexPositionNormalColored(new Vector3(baseAxisVec.X, baseAxisVec.Y, endAxisVec.Z), Color.Red, Vector3.Up));
            tempIndices.Add(1);
            tempIndices.Add(0);

            // The WoW Y-axis drawn in XNA coords
            tempVertices.Add(new VertexPositionNormalColored(baseAxisVec, Color.White, Vector3.Up));
            tempIndices.Add(2);
            tempVertices.Add(new VertexPositionNormalColored(new Vector3(endAxisVec.X, baseAxisVec.Y, baseAxisVec.Z), Color.White, Vector3.Up));
            tempIndices.Add(3);
            tempIndices.Add(2);

            // The WoW Z-axis
            tempVertices.Add(new VertexPositionNormalColored(baseAxisVec, Color.Blue, Vector3.Up));
            tempIndices.Add(4);
            tempVertices.Add(new VertexPositionNormalColored(new Vector3(baseAxisVec.X, endAxisVec.Y, baseAxisVec.Z), Color.Blue, Vector3.Up));
            tempIndices.Add(5);
            tempIndices.Add(4);

            _cachedIndices  = tempIndices.ToArray();
            _cachedVertices = tempVertices.ToArray();

            _renderCached = true;
        }
Exemple #26
0
        private void SpawnFire()
        {
            PlayersWithinDistance(VulnerabilityRange).ForEach(o => o.AddComponent <Vulnerability>().Duration = 2);
            var availablePlayers = PlayersWithinDistance(FireRange);

            if (!availablePlayers.Any())
            {
                return;
            }
            var     target = availablePlayers.ElementAt(Random.Range(0, availablePlayers.Count));
            Vector3 targetPos;

            if (PositionUtil.HighestTerrain(target.transform.position, out targetPos))
            {
                Instantiate(FirePrefab, targetPos, FirePrefab.transform.rotation);
            }
        }
    void VisitTile(int index)
    {
        int column, newX, newY, row = 0;

        PositionUtil.CalcPosition(index, Map.col, out tempX, out tempY);
        var half = Mathf.FloorToInt(viewDistance / 2f);

        tempX -= half;
        tempY -= half;

        var total  = viewDistance * viewDistance;
        var maxCol = viewDistance - 1;

        for (int i = 0; i < total; i++)
        {
            column = i % viewDistance;

            newX = column + tempX;
            newY = row + tempY;

            PositionUtil.CalcIndex(newX, newY, Map.col, out index);
            if (index > -1 && index < Map.mapTiles.Length)
            {
                var tile = Map.mapTiles[index];
                tile.visited = true;
                DecorateTile(index);

                foreach (var neighbor in tile.Neighbors)
                {
                    if (neighbor != null)
                    {
                        if (!neighbor.visited)
                        {
                            neighbor.CalcFOWAutoTileID();
                            DecorateTile(neighbor.TileID);
                        }
                    }
                }
            }

            if (column == maxCol)
            {
                row++;
            }
        }
    }
Exemple #28
0
        public static TileIdentifier ByPosition(MapId mapId, Vector3 position)
        {
            int tileX, tileY;

            if (!PositionUtil.GetTileXYForPos(position, out tileX, out tileY))
            {
                return(null);
            }

            return(new TileIdentifier
            {
                MapId = mapId,
                MapName = InternalMapNames[mapId],
                TileX = tileX,
                TileY = tileY
            });
        }
        protected override void BuildVerticiesAndIndicies()
        {
            _cachedVertices = new VertexPositionNormalColored[_manager.Vertices.Count];
            _cachedIndices  = new int[_manager.Indices.Count];

            for (var i = 0; i < _manager.Vertices.Count; i++)
            {
                var position = _manager.Vertices[i];
                PositionUtil.TransformWoWCoordsToXNACoords(ref position);
                _cachedVertices[i] = new VertexPositionNormalColored(position.ToXna(), SelectedTriangleColor,
                                                                     Vector3.Up);
            }

            for (var i = 0; i < _manager.Indices.Count; i++)
            {
                _cachedIndices[i] = _manager.Indices[i];
            }
        }
Exemple #30
0
        private void Shoot()
        {
            var hits = PositionUtil.RayAllFromTo(gameObject, Target, Range);

            foreach (var hit in hits)
            {
                var dmg  = hit.transform.gameObject.GetComponent <Damageable>();
                var team = hit.transform.gameObject.GetComponent <Team>();
                if (dmg == null || !AffectedTeams.Contains(team.TeamId))
                {
                    continue;
                }
                dmg.Damage(Damage);
                break;
            }

            Destroy(gameObject);
        }