예제 #1
0
        /// <summary>
        /// This method is important, because players could fall through air
        /// if they are on the top of a keep when it is captured because
        /// the keep size will reset
        /// </summary>
        protected void ResetPlayersOfKeep()
        {
            ushort distance = 0;
            int    id       = 0;

            if (this is GameKeepTower)
            {
                distance = 750;
                id       = 11;
            }
            else
            {
                distance = 1500;
                id       = 10;
            }


            GameKeepComponent component = null;

            foreach (GameKeepComponent c in this.KeepComponents)
            {
                if (c.Skin == id)
                {
                    component = c;
                    break;
                }
            }
            if (component == null)
            {
                return;
            }

            if (!component.HookPoints.TryGetValue(97, out var hookpoint))
            {
                return;
            }

            //predict Z
            DBKeepHookPoint hp = DOLDB <DBKeepHookPoint> .SelectObject(DB.Column("HookPointID").IsEqualTo(97).And(DB.Column("Height").IsEqualTo(Height)));

            if (hp == null)
            {
                return;
            }
            int z = component.Z + hp.Z;

            foreach (GamePlayer player in component.GetPlayersInRadius(WorldMgr.VISIBILITY_DISTANCE))
            {
                int d = hookpoint.GetDistance(player as IPoint2D);
                if (d > distance)
                {
                    continue;
                }

                if (player.Z > z)
                {
                    player.MoveTo(player.CurrentRegionID, player.X, player.Y, z, player.Heading);
                }
            }
        }
        /// <summary>
        /// This method is important, because players could fall through air
        /// if they are on the top of a keep when it is captured because
        /// the keep size will reset
        /// </summary>
        protected void ResetPlayersOfKeep()
        {
            ushort distance = 0;
            int    id       = 0;

            if (this is GameKeepTower)
            {
                distance = 750;
                id       = 11;
            }
            else
            {
                distance = 1500;
                id       = 10;
            }


            GameKeepComponent component = null;

            foreach (GameKeepComponent c in this.KeepComponents)
            {
                if (c.Skin == id)
                {
                    component = c;
                    break;
                }
            }
            if (component == null)
            {
                return;
            }

            GameKeepHookPoint hookpoint = component.KeepHookPoints[97] as GameKeepHookPoint;

            if (hookpoint == null)
            {
                return;
            }

            //calculate target height
            int height = GameServer.KeepManager.GetHeightFromLevel(this.Level);

            //predict Z
            DBKeepHookPoint hp = GameServer.Database.SelectObjects <DBKeepHookPoint>("`HookPointID` = @HookPointID AND `Height` = @Height",
                                                                                     new[] { new QueryParameter("@HookPointID", 97), new QueryParameter("@Height", height) }).FirstOrDefault();

            if (hp == null)
            {
                return;
            }
            int z = component.Z + hp.Z;

            foreach (GamePlayer player in component.GetPlayersInRadius(WorldMgr.VISIBILITY_DISTANCE))
            {
                int d = hookpoint.GetDistance(player as IPoint2D);
                if (d > distance)
                {
                    continue;
                }

                if (player.Z > z)
                {
                    player.MoveTo(player.CurrentRegionID, player.X, player.Y, z, player.Heading);
                }
            }
        }