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)); } }
public void AddForClient(TeleportPylonInfo info) { if (!_pylons.Contains(info)) { _pylons.Add(info); } }
public void AddForClient(TeleportPylonInfo info) { if (this._pylons.Contains(info)) { return; } this._pylons.Add(info); }
private int HowManyNPCsDoesPylonNeed(TeleportPylonInfo info, Player player) { TeleportPylonType typeOfPylon = info.TypeOfPylon; if (typeOfPylon != TeleportPylonType.Victory) { return(2); } return(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); } }
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); }
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); } }
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); }
public void RemoveForClient(TeleportPylonInfo info) { _pylons.RemoveAll((TeleportPylonInfo x) => x.Equals(info)); }
public void RequestTeleportation(TeleportPylonInfo info, Player player) { NetManager.Instance.SendToServerOrLoopback(NetTeleportPylonModule.SerializeUseRequest(info)); }
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); } }
private int HowManyNPCsDoesPylonNeed(TeleportPylonInfo info, Player player) { return(info.TypeOfPylon != TeleportPylonType.Victory ? 2 : 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); } }
public void RemoveForClient(TeleportPylonInfo info) { this._pylons.RemoveAll((Predicate <TeleportPylonInfo>)(x => x.Equals(info))); }