public override bool ProcessLine(IServerConnection serverConnection, string currentLine) { if (rgLLPStart.IsMatch(currentLine)) // Start of ListLandProtections deteced { PriorityProcess = true; if (IsFirst) { countStones = 0; found = new List <IAreaDefiniton>(); } Match match = rgLLPStart.Match(currentLine); GroupCollection groups = match.Groups; IPlayer p = serverConnection.AllPlayers.FindPlayerBySteamID(groups["steamid"].Value); currentPlayer = p; if (p != null) { logger.Debug("Parsing LandProtections of {0}", p.Name); } else { logger.Debug("Player {0} unknown! {1}", groups["name"].Value, currentLine); } IsFirst = false; return(true); } if (rgLLPLine.IsMatch(currentLine)) { Match match = rgLLPLine.Match(currentLine); GroupCollection groups = match.Groups; IPosition newLP = serverConnection.CreatePosition(groups["pos"].Value); if ((newLP != null) && (currentPlayer != null)) { IAreaDefiniton protection = (from p in currentPlayer.LandProtections.Items where p.Center.Equals(newLP) select p).FirstOrDefault(); if (protection == null) { protection = serverConnection.CreateArea(currentPlayer, newLP, 10.0); currentPlayer.LandProtections.Add(protection); } found.Add(protection); countStones++; } return(true); } if (rgLLPEnd.IsMatch(currentLine)) { Match match = rgLLPEnd.Match(currentLine); GroupCollection groups = match.Groups; PriorityProcess = false; IsFirst = true; int targetNum = Int32.Parse(groups["numstones"].Value); if (countStones != targetNum) { logger.Warn("Number mismatch in ListLandProtection! {0} != {1}", targetNum, countStones); } logger.Info("LandProtection Parsing done."); CleanupProtections(serverConnection); serverConnection.AllPlayers.Save(true); return(true); } return(false); }