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); }
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; } }
/// <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 { } }