示例#1
0
        private void UpdatePylonsListAndBroadcastChanges()
        {
            Utils.Swap(ref _pylons, ref _pylonsOld);
            _pylons.Clear();
            foreach (TileEntity value in TileEntity.ByPosition.Values)
            {
                TETeleportationPylon tETeleportationPylon = value as TETeleportationPylon;
                if (tETeleportationPylon != null && tETeleportationPylon.TryGetPylonType(out TeleportPylonType pylonType))
                {
                    TeleportPylonInfo teleportPylonInfo = default(TeleportPylonInfo);
                    teleportPylonInfo.PositionInTiles = tETeleportationPylon.Position;
                    teleportPylonInfo.TypeOfPylon     = pylonType;
                    TeleportPylonInfo item = teleportPylonInfo;
                    _pylons.Add(item);
                }
            }
            IEnumerable <TeleportPylonInfo> enumerable = _pylonsOld.Except(_pylons);

            foreach (TeleportPylonInfo item2 in _pylons.Except(_pylonsOld))
            {
                NetManager.Instance.BroadcastOrLoopback(NetTeleportPylonModule.SerializePylonWasAddedOrRemoved(item2, NetTeleportPylonModule.SubPacketType.PylonWasAdded));
            }
            foreach (TeleportPylonInfo item3 in enumerable)
            {
                NetManager.Instance.BroadcastOrLoopback(NetTeleportPylonModule.SerializePylonWasAddedOrRemoved(item3, NetTeleportPylonModule.SubPacketType.PylonWasRemoved));
            }
        }
示例#2
0
 public void AddForClient(TeleportPylonInfo info)
 {
     if (!_pylons.Contains(info))
     {
         _pylons.Add(info);
     }
 }
示例#3
0
 public void AddForClient(TeleportPylonInfo info)
 {
     if (this._pylons.Contains(info))
     {
         return;
     }
     this._pylons.Add(info);
 }
示例#4
0
        private int HowManyNPCsDoesPylonNeed(TeleportPylonInfo info, Player player)
        {
            TeleportPylonType typeOfPylon = info.TypeOfPylon;

            if (typeOfPylon != TeleportPylonType.Victory)
            {
                return(2);
            }
            return(0);
        }
示例#5
0
        private bool DoesPylonAcceptTeleportation(TeleportPylonInfo info, Player player)
        {
            switch (info.TypeOfPylon)
            {
            case TeleportPylonType.SurfacePurity:
            {
                bool num   = (double)info.PositionInTiles.Y <= Main.worldSurface && (double)info.PositionInTiles.Y > Main.worldSurface * 0.34999999403953552;
                bool flag2 = info.PositionInTiles.X >= Main.maxTilesX - 380 || info.PositionInTiles.X <= 380;
                if (!num | flag2)
                {
                    return(false);
                }
                if (_sceneMetrics.EnoughTilesForJungle || _sceneMetrics.EnoughTilesForSnow || _sceneMetrics.EnoughTilesForDesert || _sceneMetrics.EnoughTilesForGlowingMushroom || _sceneMetrics.EnoughTilesForHallow || _sceneMetrics.EnoughTilesForCrimson || _sceneMetrics.EnoughTilesForCorruption)
                {
                    return(false);
                }
                return(true);
            }

            case TeleportPylonType.Jungle:
                return(_sceneMetrics.EnoughTilesForJungle);

            case TeleportPylonType.Snow:
                return(_sceneMetrics.EnoughTilesForSnow);

            case TeleportPylonType.Desert:
                return(_sceneMetrics.EnoughTilesForDesert);

            case TeleportPylonType.Beach:
            {
                bool flag = (double)info.PositionInTiles.Y <= Main.worldSurface && (double)info.PositionInTiles.Y > Main.worldSurface * 0.34999999403953552;
                return((info.PositionInTiles.X >= Main.maxTilesX - 380 || info.PositionInTiles.X <= 380) & flag);
            }

            case TeleportPylonType.GlowingMushroom:
                return(_sceneMetrics.EnoughTilesForGlowingMushroom);

            case TeleportPylonType.Hallow:
                return(_sceneMetrics.EnoughTilesForHallow);

            case TeleportPylonType.Underground:
                return((double)info.PositionInTiles.Y >= Main.worldSurface);

            case TeleportPylonType.Victory:
                return(true);

            default:
                return(true);
            }
        }
示例#6
0
        private bool DoesPylonHaveEnoughNPCsAroundIt(TeleportPylonInfo info, int necessaryNPCCount)
        {
            if (necessaryNPCCount <= 0)
            {
                return(true);
            }
            Point16   positionInTiles = info.PositionInTiles;
            Rectangle rectangle       = new Rectangle(positionInTiles.X - Main.buffScanAreaWidth / 2, positionInTiles.Y - Main.buffScanAreaHeight / 2, Main.buffScanAreaWidth, Main.buffScanAreaHeight);
            int       num             = necessaryNPCCount;

            for (int i = 0; i < 200; i++)
            {
                NPC nPC = Main.npc[i];
                if (nPC.active && nPC.isLikeATownNPC && !nPC.homeless && rectangle.Contains(nPC.homeTileX, nPC.homeTileY))
                {
                    num--;
                    if (num == 0)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
示例#7
0
        private bool DoesPylonAcceptTeleportation(TeleportPylonInfo info, Player player)
        {
            switch (info.TypeOfPylon)
            {
            case TeleportPylonType.SurfacePurity:
                return(!(((double)info.PositionInTiles.Y <= Main.worldSurface ? 1 : 0) == 0 | ((int)info.PositionInTiles.X >= Main.maxTilesX - 380 || info.PositionInTiles.X <= (short)380)) && (this._sceneMetrics.EnoughTilesForJungle || this._sceneMetrics.EnoughTilesForSnow || (this._sceneMetrics.EnoughTilesForDesert || this._sceneMetrics.EnoughTilesForGlowingMushroom) || (this._sceneMetrics.EnoughTilesForHallow || this._sceneMetrics.EnoughTilesForCrimson) ? 1 : (this._sceneMetrics.EnoughTilesForCorruption ? 1 : 0)) == 0);

            case TeleportPylonType.Jungle:
                return(this._sceneMetrics.EnoughTilesForJungle);

            case TeleportPylonType.Hallow:
                return(this._sceneMetrics.EnoughTilesForHallow);

            case TeleportPylonType.Underground:
                return((double)info.PositionInTiles.Y >= Main.worldSurface);

            case TeleportPylonType.Beach:
                bool flag = (double)info.PositionInTiles.Y <= Main.worldSurface && (double)info.PositionInTiles.Y > Main.worldSurface * 0.349999994039536;
                return((((int)info.PositionInTiles.X >= Main.maxTilesX - 380 ? 1 : (info.PositionInTiles.X <= (short)380 ? 1 : 0)) & (flag ? 1 : 0)) != 0);

            case TeleportPylonType.Desert:
                return(this._sceneMetrics.EnoughTilesForDesert);

            case TeleportPylonType.Snow:
                return(this._sceneMetrics.EnoughTilesForSnow);

            case TeleportPylonType.GlowingMushroom:
                return(this._sceneMetrics.EnoughTilesForGlowingMushroom);

            case TeleportPylonType.Victory:
                return(true);

            default:
                return(true);
            }
        }
示例#8
0
        private bool DoesPylonHaveEnoughNPCsAroundIt(TeleportPylonInfo info, int necessaryNPCCount)
        {
            if (necessaryNPCCount <= 0)
            {
                return(true);
            }
            Point16   positionInTiles = info.PositionInTiles;
            Rectangle rectangle       = new Rectangle((int)positionInTiles.X - Main.buffScanAreaWidth / 2, (int)positionInTiles.Y - Main.buffScanAreaHeight / 2, Main.buffScanAreaWidth, Main.buffScanAreaHeight);
            int       num             = necessaryNPCCount;

            for (int index = 0; index < 200; ++index)
            {
                NPC npc = Main.npc[index];
                if (npc.active && npc.isLikeATownNPC && (!npc.homeless && rectangle.Contains(npc.homeTileX, npc.homeTileY)))
                {
                    --num;
                    if (num == 0)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
示例#9
0
 public void RemoveForClient(TeleportPylonInfo info)
 {
     _pylons.RemoveAll((TeleportPylonInfo x) => x.Equals(info));
 }
示例#10
0
 public void RequestTeleportation(TeleportPylonInfo info, Player player)
 {
     NetManager.Instance.SendToServerOrLoopback(NetTeleportPylonModule.SerializeUseRequest(info));
 }
示例#11
0
        public void HandleTeleportRequest(TeleportPylonInfo info, int playerIndex)
        {
            Player player = Main.player[playerIndex];
            string key    = null;
            bool   flag   = true;

            if (flag)
            {
                flag &= IsPlayerNearAPylon(player);
                if (!flag)
                {
                    key = "Net.CannotTeleportToPylonBecausePlayerIsNotNearAPylon";
                }
            }
            if (flag)
            {
                int necessaryNPCCount = HowManyNPCsDoesPylonNeed(info, player);
                flag &= DoesPylonHaveEnoughNPCsAroundIt(info, necessaryNPCCount);
                if (!flag)
                {
                    key = "Net.CannotTeleportToPylonBecauseNotEnoughNPCs";
                }
            }
            if (flag)
            {
                flag &= !NPC.AnyDanger();
                if (!flag)
                {
                    key = "Net.CannotTeleportToPylonBecauseThereIsDanger";
                }
            }
            if (flag)
            {
                if (!NPC.downedPlantBoss && (double)info.PositionInTiles.Y > Main.worldSurface && Framing.GetTileSafely(info.PositionInTiles.X, info.PositionInTiles.Y).wall == 87)
                {
                    flag = false;
                }
                if (!flag)
                {
                    key = "Net.CannotTeleportToPylonBecauseAccessingLihzahrdTempleEarly";
                }
            }
            SceneMetricsScanSettings settings;

            if (flag)
            {
                SceneMetrics sceneMetrics = _sceneMetrics;
                settings = new SceneMetricsScanSettings
                {
                    VisualScanArea = null,
                    BiomeScanCenterPositionInWorld = info.PositionInTiles.ToWorldCoordinates(),
                    ScanOreFinderData = false
                };
                sceneMetrics.ScanAndExportToMain(settings);
                flag = DoesPylonAcceptTeleportation(info, player);
                if (!flag)
                {
                    key = "Net.CannotTeleportToPylonBecauseNotMeetingBiomeRequirements";
                }
            }
            if (flag)
            {
                bool flag2 = false;
                int  num   = 0;
                for (int i = 0; i < _pylons.Count; i++)
                {
                    TeleportPylonInfo info2 = _pylons[i];
                    if (!player.InInteractionRange(info2.PositionInTiles.X, info2.PositionInTiles.Y))
                    {
                        continue;
                    }
                    if (num < 1)
                    {
                        num = 1;
                    }
                    int necessaryNPCCount2 = HowManyNPCsDoesPylonNeed(info2, player);
                    if (DoesPylonHaveEnoughNPCsAroundIt(info2, necessaryNPCCount2))
                    {
                        if (num < 2)
                        {
                            num = 2;
                        }
                        SceneMetrics sceneMetrics2 = _sceneMetrics;
                        settings = new SceneMetricsScanSettings
                        {
                            VisualScanArea = null,
                            BiomeScanCenterPositionInWorld = info2.PositionInTiles.ToWorldCoordinates(),
                            ScanOreFinderData = false
                        };
                        sceneMetrics2.ScanAndExportToMain(settings);
                        if (DoesPylonAcceptTeleportation(info2, player))
                        {
                            flag2 = true;
                            break;
                        }
                    }
                }
                if (!flag2)
                {
                    flag = false;
                    switch (num)
                    {
                    default:
                        key = "Net.CannotTeleportToPylonBecausePlayerIsNotNearAPylon";
                        break;

                    case 1:
                        key = "Net.CannotTeleportToPylonBecauseNotEnoughNPCsAtCurrentPylon";
                        break;

                    case 2:
                        key = "Net.CannotTeleportToPylonBecauseNotMeetingBiomeRequirements";
                        break;
                    }
                }
            }
            if (flag)
            {
                Vector2 newPos      = info.PositionInTiles.ToWorldCoordinates() - new Vector2(0f, player.HeightOffsetBoost);
                int     num2        = 9;
                int     typeOfPylon = (int)info.TypeOfPylon;
                int     number      = 0;
                player.Teleport(newPos, num2, typeOfPylon);
                player.velocity = Vector2.Zero;
                if (Main.netMode == 2)
                {
                    RemoteClient.CheckSection(player.whoAmI, player.position);
                    NetMessage.SendData(65, -1, -1, null, 0, player.whoAmI, newPos.X, newPos.Y, num2, number, typeOfPylon);
                }
            }
            else
            {
                ChatHelper.SendChatMessageToClient(NetworkText.FromKey(key), new Color(255, 240, 20), playerIndex);
            }
        }
示例#12
0
 private int HowManyNPCsDoesPylonNeed(TeleportPylonInfo info, Player player)
 {
     return(info.TypeOfPylon != TeleportPylonType.Victory ? 2 : 0);
 }
示例#13
0
        public void HandleTeleportRequest(TeleportPylonInfo info, int playerIndex)
        {
            Player player = Main.player[playerIndex];
            string key    = (string)null;
            bool   flag1  = true;

            if (flag1)
            {
                flag1 &= TeleportPylonsSystem.IsPlayerNearAPylon(player);
                if (!flag1)
                {
                    key = "Net.CannotTeleportToPylonBecausePlayerIsNotNearAPylon";
                }
            }
            if (flag1)
            {
                int necessaryNPCCount = this.HowManyNPCsDoesPylonNeed(info, player);
                flag1 &= this.DoesPylonHaveEnoughNPCsAroundIt(info, necessaryNPCCount);
                if (!flag1)
                {
                    key = "Net.CannotTeleportToPylonBecauseNotEnoughNPCs";
                }
            }
            if (flag1)
            {
                flag1 &= !NPC.AnyDanger(false);
                if (!flag1)
                {
                    key = "Net.CannotTeleportToPylonBecauseThereIsDanger";
                }
            }
            if (flag1)
            {
                if (!NPC.downedPlantBoss && (double)info.PositionInTiles.Y > Main.worldSurface && Framing.GetTileSafely((int)info.PositionInTiles.X, (int)info.PositionInTiles.Y).wall == (ushort)87)
                {
                    flag1 = false;
                }
                if (!flag1)
                {
                    key = "Net.CannotTeleportToPylonBecauseAccessingLihzahrdTempleEarly";
                }
            }
            SceneMetricsScanSettings metricsScanSettings;

            if (flag1)
            {
                SceneMetrics sceneMetrics = this._sceneMetrics;
                metricsScanSettings = new SceneMetricsScanSettings();
                metricsScanSettings.VisualScanArea = new Rectangle?();
                metricsScanSettings.BiomeScanCenterPositionInWorld = new Vector2?(info.PositionInTiles.ToWorldCoordinates(8f, 8f));
                metricsScanSettings.ScanOreFinderData = false;
                SceneMetricsScanSettings settings = metricsScanSettings;
                sceneMetrics.ScanAndExportToMain(settings);
                flag1 = this.DoesPylonAcceptTeleportation(info, player);
                if (!flag1)
                {
                    key = "Net.CannotTeleportToPylonBecauseNotMeetingBiomeRequirements";
                }
            }
            if (flag1)
            {
                bool flag2 = false;
                int  num   = 0;
                for (int index = 0; index < this._pylons.Count; ++index)
                {
                    TeleportPylonInfo pylon = this._pylons[index];
                    if (player.InInteractionRange((int)pylon.PositionInTiles.X, (int)pylon.PositionInTiles.Y))
                    {
                        if (num < 1)
                        {
                            num = 1;
                        }
                        int necessaryNPCCount = this.HowManyNPCsDoesPylonNeed(pylon, player);
                        if (this.DoesPylonHaveEnoughNPCsAroundIt(pylon, necessaryNPCCount))
                        {
                            if (num < 2)
                            {
                                num = 2;
                            }
                            SceneMetrics sceneMetrics = this._sceneMetrics;
                            metricsScanSettings = new SceneMetricsScanSettings();
                            metricsScanSettings.VisualScanArea = new Rectangle?();
                            metricsScanSettings.BiomeScanCenterPositionInWorld = new Vector2?(pylon.PositionInTiles.ToWorldCoordinates(8f, 8f));
                            metricsScanSettings.ScanOreFinderData = false;
                            SceneMetricsScanSettings settings = metricsScanSettings;
                            sceneMetrics.ScanAndExportToMain(settings);
                            if (this.DoesPylonAcceptTeleportation(pylon, player))
                            {
                                flag2 = true;
                                break;
                            }
                        }
                    }
                }
                if (!flag2)
                {
                    flag1 = false;
                    switch (num)
                    {
                    case 1:
                        key = "Net.CannotTeleportToPylonBecauseNotEnoughNPCsAtCurrentPylon";
                        break;

                    case 2:
                        key = "Net.CannotTeleportToPylonBecauseNotMeetingBiomeRequirements";
                        break;

                    default:
                        key = "Net.CannotTeleportToPylonBecausePlayerIsNotNearAPylon";
                        break;
                    }
                }
            }
            if (flag1)
            {
                Vector2 newPos      = info.PositionInTiles.ToWorldCoordinates(8f, 8f) - new Vector2(0.0f, (float)player.HeightOffsetBoost);
                int     num         = 9;
                int     typeOfPylon = (int)info.TypeOfPylon;
                int     number6     = 0;
                player.Teleport(newPos, num, typeOfPylon);
                player.velocity = Vector2.Zero;
                if (Main.netMode != 2)
                {
                    return;
                }
                RemoteClient.CheckSection(player.whoAmI, player.position, 1);
                NetMessage.SendData(65, -1, -1, (NetworkText)null, 0, (float)player.whoAmI, newPos.X, newPos.Y, num, number6, typeOfPylon);
            }
            else
            {
                ChatHelper.SendChatMessageToClient(NetworkText.FromKey(key), new Color((int)byte.MaxValue, 240, 20), playerIndex);
            }
        }
示例#14
0
 public void RemoveForClient(TeleportPylonInfo info)
 {
     this._pylons.RemoveAll((Predicate <TeleportPylonInfo>)(x => x.Equals(info)));
 }