Пример #1
0
        public static bool IsBlockProtected(WorldSession session, WorldRegion r)
        {
            if (r == null)
            {
                return(false);
            }

            if (session.Mode == GameMode.Creative && session.Player.Admin(Permissions.AnyAdmin))
            {
                return(false);
            }
            if (r.IsResident(session.Player))
            {
                return(false);
            }

            switch (r.Type)
            {
            case Protected.Type:
            case Preserved.Type:
            case Adventure.Type:
            case Honeypot.Type:
            case SpawnRegion.Type:
            case WarpZone.Type:
                return(true);
            }

            return(false);
        }
Пример #2
0
 static void SetStats(WorldRegion r, Client player)
 {
     if (r == null)
     {
         return;
     }
     if (r.Stats == null)
     {
         r.Stats = new RegionStats();
     }
     r.Stats.LastVisit = DateTime.UtcNow;
     if (r.IsResident(player))
     {
         r.Stats.LastVisitResident = DateTime.UtcNow;
     }
 }
Пример #3
0
        /// <summary>
        /// Find region and send message
        /// </summary>
        internal static void SetRegion(WorldSession session)
        {
            RegionList regions = session.World.Regions;

            if (regions == null)
            {
                return;
            }

            try
            {
                //This is called every single player movement, 20 times a second, some optimization might be needed.
                WorldRegion w = null;
                //First test if we are in the same as before
                WorldRegion current = session.CurrentRegion;
                if (current != null)
                {
                    if (current.Deleted == false && current.Contains(session.Position))
                    {
                        w = GetRegion(current.SubRegions, session.Position, session.Dimension);
                        if (w == null)
                        {
                            w = current;
                        }
                    }
                }
                if (w == null)
                {
                    w = GetRegion(regions.List, session.Position, session.Dimension);
                }

                //Debug.Write("Setregion: " + w);

                //If different
                if (session.CurrentRegion != w)
                {
                    //Leaving
                    if (session.CurrentRegion != null && (session.CurrentRegion.HasChild(w) == false))
                    {
                        session.CurrentRegion.Leaving(session.Player, w);
                    }

                    //Entering
                    if (w != null && w.HasChild(session.CurrentRegion) == false)
                    {
                        w.Entering(session.Player);
                    }

                    //Stats
                    SetStats(session.CurrentRegion, session.Player);
                    SetStats(w, session.Player);
                }
                //Adjust Survival/Adventure mode
                if (session.Mode != GameMode.Creative &&
                    session.Mode != GameMode.Spectator)
                {
                    bool protect = Protected.IsBlockProtected(session, w);
                    if (protect && w.IsResident(session.Player))
                    {
                        protect = false;
                    }

                    if (protect)
                    {
                        session.SetMode(GameMode.Adventure);
                    }
                    else
                    {
                        session.SetMode(GameMode.Survival);
                    }
                }

                if (w != null && w.Type == WarpZone.Type)
                {
                    if (session.Mode != GameMode.Creative)
                    {
                        WarpZone wz = new WarpZone(w.Name);
                        session.Player.Warp(wz.Destination, (Dimensions)wz.DestinationDimension, wz.DesinationWorld);
                    }
                }

                bool update = (w != session.CurrentRegion);
                session.CurrentRegion = w;
                if (update)
                {
                    ScoreboardRegionManager.UpdateRegion(session.Player);
                }
#if !DEBUG
            } catch (Exception e)
            {
                Log.WriteServer(e);
                return;
#endif
            } finally
            {
            }
        }