public override void onPlayerTileChange(PlayerTileChangeEvent Event) { Player player = Server.GetPlayerByName(Event.Sender.Name); bool water = player.PluginData.ContainsKey("water") ? (bool)player.PluginData["water"] : false; bool lava = player.PluginData.ContainsKey("lava") ? (bool)player.PluginData["lava"] : false; if (player.isInOpList() && (water || lava)) { LiquidTile liquidTile = new LiquidTile( (int)Event.Position.X, (int)Event.Position.Y, Server.tile.At((int)Event.Position.X, (int)Event.Position.Y)); FillLiquid(liquidTile, water, lava); } base.onPlayerTileChange(Event); }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { if (!Enabled || tileBreakageAllowed == false) { return; } ProgramLog.Log("[TSDM Plugin] Cancelled Tile change of Player: " + ((Player)Event.Sender).Name); Event.Cancelled = true; }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { if (isEnabled == false || tileBreak == false) { Event.Cancelled = true; } //Program.tConsole.WriteLine("[Plugin] Cancelled Tile change of Player: " + ((Player)Event.Sender).Name); }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { if(Event.Sender is Player) { var player = Event.Sender as Player; if (Event.Action == TileAction.PLACED && Event.TileType == TileType.BLOCK && (int)Event.Tile.Type == SelectorItem && Selection.isInSelectionlist(player)) { Event.Cancelled = true; SelectorPos = !SelectorPos; Vector2[] mousePoints = Selection.GetSelection(player); if (!SelectorPos) mousePoints[0] = Event.Position; else mousePoints[1] = Event.Position; Selection.SetSelection(player, mousePoints); player.sendMessage(string.Format("You have selected block at {0},{1}, {2} position", Event.Position.X, Event.Position.Y, (!SelectorPos) ? "First" : "Second"), ChatColour.Green); return; } foreach (Region.Region rgn in regionManager.Regions) { if (rgn.HasPoint(Event.Position)) { if (rgn.IsRestrictedForUser(player)) { Event.Cancelled = true; player.sendMessage("You cannot edit this area!", ChatColour.Red); return; } } } } }
private void checkRune(PlayerTileChangeEvent Event) { if (Event.Action == TileAction.BREAK) return; int x = (int)Event.Position.X, y = (int)Event.Position.Y; for (int p = 0; p < patterns.Count; p++) { Pattern patt = patterns.ElementAt(p); int[][] patArr = patt.pattern; x = x-patt.sizeX<0?0:x-patt.sizeX; y = y-patt.sizeY<0?0:y-patt.sizeY; for (int i = 0; i < patt.sizeX * 2; i++) { for (int j = 0; j < patt.sizeY * 2; j++) { //For each possible position, lets check for a rune... //int currX = x, currY = y; int currX = x + j, currY = y + i; bool ok = true; for (int zi = 0; zi < patt.sizeX; zi++) { for (int zj = 0; zj < patt.sizeY; zj++) { if (zi == 0 && zj == 0 && Event.Tile.Type == patArr[zi][zj]) { continue; } if (patArr[zi][zj] != -1 && Main.tile.At(currX + zi, currY + zj).Type != patArr[zi][zj]) { //Event.Sender.sendMessage("-> " + Main.tile.At(currX + zj, currY + zi).Type + " != " + patArr[zj][zi] + " and " + zi + "-" + zj + "."); ok = false; break; } } if (!ok) break; } if (ok) { registeredPatterns.AddLast(new RegisteredPattern(patt, currX, currY)); Event.Sender.sendMessage("Rune "+patt.name+" registered! :D"); Event.Sender.sendMessage("in x=" + currX + " y=" + currY); return; } /*else { //Event.Sender.sendMessage("No rune detected! :("); }*/ //Main.tile.At(y+j,x+i) } } } }
/// <summary> /// Hook method for any player-initiated tile changes (place, break, etc) /// </summary> /// <param name="Event">PlayerTileChangeEvent info</param> public virtual void onPlayerTileChange(PlayerTileChangeEvent Event) { }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { if (isEnabled == false) { return; } breakx = (int)Event.Position.X; breaky = (int)Event.Position.Y; string tileid = Event.Tile.Type.ToString(); user = Event.Sender.Name.ToString().Replace(" ", "").ToLower(); FileStream primerread = new FileStream(pluginFolder + "/PlayerPerms/" + user + ".dat", FileMode.Open); BinaryReader binaryprimer = new BinaryReader(primerread); primer = binaryprimer.ReadInt32(); userperm = binaryprimer.ReadString(); binaryprimer.Close(); if (userperm == "guest" && Event.Sender.Op == false) { if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage("You are a guest. Talk to an OP to enable building.", 255, 255f, 0f, 0f); } } Event.Cancelled = true; } if (breakx > spawnxstart1 && breakx < spawnxend1 && Event.Sender.Op == false && userperm != "officer" && userperm != "guest") { if (breaky > spawnystart1 && breaky < spawnyend1 && Event.Sender.Op == false && userperm != "officer" && userperm != "guest") { if (userperm == "builder") { if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage(warntext, 255, 255f, 0f, 0f); } Event.Cancelled = true; } } if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage(warntext, 255, 255f, 0f, 0f); } } Event.Cancelled = true; } } if (userperm == "guest" && Event.Sender.Op == false) { if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage("You are a guest. Talk to an OP to enable building.", 255, 255f, 0f, 0f); } } Event.Cancelled = true; } if (breakx > spawnxstart2 && breakx < spawnxend2 && Event.Sender.Op == false && userperm != "officer" && userperm != "guest") { if (breaky > spawnystart2 && breaky < spawnyend2 && Event.Sender.Op == false && userperm != "officer" && userperm != "guest") { if (userperm == "builder") { if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage(warntext, 255, 255f, 0f, 0f); } } Event.Cancelled = true; } if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage(warntext, 255, 255f, 0f, 0f); } } Event.Cancelled = true; } } if (userperm == "guest" && Event.Sender.Op == false) { if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage("You are a guest. Talk to an OP to enable building.", 255, 255f, 0f, 0f); } } Event.Cancelled = true; } if (breakx > spawnxstart3 && breakx < spawnxend3 && Event.Sender.Op == false && userperm != "officer" && userperm != "guest") { if (breaky > spawnystart3 && breaky < spawnyend3 && Event.Sender.Op == false && userperm != "officer" && userperm != "guest") { if (userperm == "builder") { if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage(warntext, 255, 255f, 0f, 0f); } } Event.Cancelled = true; } if (used == "no") { used = "yes"; if (tileid != "73" && tileid != "3" && tileid != "52" && tileid != "83" && tileid != "82") { Event.Sender.sendMessage(warntext, 255, 255f, 0f, 0f); } } Event.Cancelled = true; } } used = "no"; if (spawnstartcommand == "using" && spawnstartuser == Event.Sender.Name && Event.Sender.Op) { if (spawnnumber == 1) { spawnxstart1 = (int)Event.Position.X; spawnystart1 = (int)Event.Position.Y; Event.Sender.sendMessage("Top left corner set to (" + spawnxstart1 + "," + spawnystart1 + ")"); Event.Sender.sendMessage("Next step: /spawnend"); spawnstartuser = ""; spawnstartcommand = "unused"; Event.Cancelled = true; } if (spawnnumber == 2) { spawnxstart2 = (int)Event.Position.X; spawnystart2 = (int)Event.Position.Y; Event.Sender.sendMessage("Top left corner set to (" + spawnxstart2 + "," + spawnystart2 + ")"); Event.Sender.sendMessage("Next step: /spawnend"); spawnstartuser = ""; spawnstartcommand = "unused"; Event.Cancelled = true; } if (spawnnumber == 3) { spawnxstart3 = (int)Event.Position.X; spawnystart3 = (int)Event.Position.Y; Event.Sender.sendMessage("Top left corner set to (" + spawnxstart3 + "," + spawnystart3 + ")"); Event.Sender.sendMessage("Next step: /spawnend"); spawnstartuser = ""; spawnstartcommand = "unused"; Event.Cancelled = true; } } if (spawnendcommand == "using" && spawnenduser == Event.Sender.Name && Event.Sender.Op) { if (spawnnumber == 1) { spawnxend1 = (int)Event.Position.X; spawnyend1 = (int)Event.Position.Y; Event.Sender.sendMessage("Bottom right corner set to (" + spawnxend1 + "," + spawnyend1 + ")"); Event.Sender.sendMessage("Next step: /spawnsave"); spawnenduser = ""; spawnendcommand = "unused"; Event.Cancelled = true; } if (spawnnumber == 2) { spawnxend2 = (int)Event.Position.X; spawnyend2 = (int)Event.Position.Y; Event.Sender.sendMessage("Bottom right corner set to (" + spawnxend2 + "," + spawnyend2 + ")"); Event.Sender.sendMessage("Next step: /spawnsave"); spawnenduser = ""; spawnendcommand = "unused"; Event.Cancelled = true; } if (spawnnumber == 3) { spawnxend3 = (int)Event.Position.X; spawnyend3 = (int)Event.Position.Y; Event.Sender.sendMessage("Bottom right corner set to (" + spawnxend3 + "," + spawnyend3 + ")"); Event.Sender.sendMessage("Next step: /spawnsave"); spawnenduser = ""; spawnendcommand = "unused"; Event.Cancelled = true; } } }
public void Process(int start, int length, int num, int whoAmI, byte[] readBuffer, byte bufferData) { short size = BitConverter.ToInt16(readBuffer, start + 1); int left = BitConverter.ToInt32(readBuffer, start + 3); int top = BitConverter.ToInt32(readBuffer, start + 7); num = start + 11; for (int x = left; x < left + (int)size; x++) { for (int y = top; y < top + (int)size; y++) { TileData tile = Main.tile.At(x, y).Data; byte b9 = readBuffer[num++]; bool wasActive = tile.Active; tile.Active = ((b9 & 1) == 1); if ((b9 & 2) == 2) { tile.Lighted = true; } if ((b9 & 4) == 4) { tile.Wall = 1; } else { tile.Wall = 0; } if ((b9 & 8) == 8) { tile.Liquid = 1; } else { tile.Liquid = 0; } if (tile.Active) { int wasType = (int)tile.Type; tile.Type = readBuffer[num++]; if (Main.tileFrameImportant[(int)tile.Type]) { tile.FrameX = BitConverter.ToInt16(readBuffer, num); num += 2; tile.FrameY = BitConverter.ToInt16(readBuffer, num); num += 2; } else if (!wasActive || (int)tile.Type != wasType) { tile.FrameX = -1; tile.FrameY = -1; } } if (tile.Wall > 0) { tile.Wall = readBuffer[num++]; } if (tile.Liquid > 0) { tile.Liquid = readBuffer[num++]; byte b10 = readBuffer[num++]; tile.Lava = (b10 == 1); } PlayerTileChangeEvent tileEvent = new PlayerTileChangeEvent(); tileEvent.Sender = Main.players[whoAmI]; tileEvent.Tile = tile; tileEvent.Action = (tile.Active) ? TileAction.PLACED : TileAction.BREAK; //Not sure of this tileEvent.TileType = (tile.wall == 1) ? TileType.WALL : TileType.BLOCK; tileEvent.Position = new Vector2(x, y); Program.server.PluginManager.processHook(Hooks.PLAYER_TILECHANGE, tileEvent); if (tileEvent.Cancelled) { NetMessage.SendTileSquare(whoAmI, x, y, 1); return; } Main.tile.At(x, y).SetData(tile); } } WorldGen.RangeFrame(left, top, left + (int)size, top + (int)size); NetMessage.SendData((int)bufferData, -1, whoAmI, "", (int)size, (float)left, (float)top); }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { if (isEnabled == false || configTileChange == false) { return; } else { Player Player = (Player)Event.Sender; if (Math.Sqrt(Math.Pow((Player.Location.X / 16 - Event.Position.X), 2) + Math.Pow((Player.Location.Y / 16 - Event.Position.Y), 2)) > configRange) { Event.Cancelled = true; // Program.tConsole.WriteLine("[" + base.Name + "] Cancelled Tile Change (" + Event.Position.X + "," + Event.Position.Y + ") of Player: " + Player.Name + " (" + Player.getLocation().X / 16 + "," + Player.getTileLocation().Y * 16 + ") at distance: " + Distance); //} //else //{ // Program.tConsole.WriteLine("[" + base.Name + "] Allowed Tile Change (" + Event.Position.X + "," + Event.Position.Y + ") of Player: " + Player.Name + " (" + Player.getLocation().X / 16 + "," + Player.getTileLocation().Y * 16 + ") at distance: " + Distance); } } }
public override void onTileChange(PlayerTileChangeEvent Event) { if (isEnabled == false || tileBreakageAllowed == false) { return; } Event.Cancelled = true; Program.tConsole.WriteLine("[TSDM Plugin] Cancelled Tile change of Player: " + ((Player)Event.Sender).Name); }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { Player player = Server.GetPlayerByName(Event.Sender.Name); bool starthouse = player.PluginData.ContainsKey("starthouse") ? (bool)player.PluginData["starthouse"] : false; bool endhouse = player.PluginData.ContainsKey("endhouse") ? (bool)player.PluginData["endhouse"] : false; bool check = player.PluginData.ContainsKey("check") ? (bool)player.PluginData["check"] : false; bool teleportSet = player.PluginData.ContainsKey("teleportset") ? (bool)player.PluginData["teleportset"] : false; int houseIndex = player.PluginData.ContainsKey("houseIndex") ? (int)player.PluginData["houseIndex"] : -1; string houseName = player.PluginData.ContainsKey("houseName") ? (string)player.PluginData["houseName"] : null; if (starthouse || endhouse) { String NodeName = starthouse ? "topleft" : "bottomright"; String cornerDesc = starthouse ? "top-left" : "bottom-right"; Event.Cancelled = true; if (GetHouseNameImInside(player) == null) { UpdateCoordsForPlayer(player.Name, (int)Event.Position.X, (int)Event.Position.Y, houseIndex); player.sendMessage("You've set the " + cornerDesc + " corner of house " + houseName, chatColor); player.PluginData["starthouse"] = false; player.PluginData["endhouse"] = false; } else { player.sendMessage("You're inside another house, you cannot set your " + cornerDesc + " here"); } } else if (IsInsideAnotherHouse(player.Name, (int)Event.Position.X, (int)Event.Position.Y) && ! starthouse && ! endhouse && !player.Op) { Event.Cancelled = true; player.sendMessage("You're trying to build inside someone's house--this is not allowed", chatColor); } else if (check) { Event.Cancelled = true; player.PluginData["check"] = false; player.sendMessage("The block you just clicked on is at " + (int)Event.Position.X + "," + (int)Event.Position.Y, chatColor); } else if (teleportSet) { if (GetMyHouseNamePositionInside(player.Name, (int)Event.Position.X, (int)Event.Position.Y) == (string)player.PluginData["teleporthouse"]) { int playerIndex = GetPlayerHouseIndex(player.Name); houseIndex = GetHouseCoordsIndexByName(player.Name, (string)player.PluginData["teleporthouse"]); PlayerHouseCoords tempCoords = playerHouses[playerIndex].Houses[houseIndex]; tempCoords.TeleportPoint.X = (int)Event.Position.X; tempCoords.TeleportPoint.Y = (int)Event.Position.Y; playerHouses[playerIndex].Houses[houseIndex] = tempCoords; player.sendMessage("Teleport point set for house " + (string)player.PluginData["teleporthouse"], chatColor); } else player.sendMessage("That block is not inside your house called " + (string)player.PluginData["teleporthouse"], chatColor); player.PluginData["teleportset"] = false; } base.onPlayerTileChange(Event); }
public void Process(int start, int length, int num, int whoAmI, byte[] readBuffer, byte bufferData) { byte tileAction = readBuffer[num++]; int x = BitConverter.ToInt32(readBuffer, num); num += 4; int y = BitConverter.ToInt32(readBuffer, num); num += 4; byte tileType = readBuffer[num++]; int style = (int)readBuffer[num]; bool failFlag = (tileType == 1); bool placed = false; bool wall = false; switch (tileAction) { case 1: placed = true; break; case 2: wall = true; break; case 3: wall = true; placed = true; break; } PlayerTileChangeEvent tileEvent = new PlayerTileChangeEvent(); tileEvent.Sender = Main.players[whoAmI]; tileEvent.Tile = Main.tile.At(x, y).Data; tileEvent.Action = (placed) ? TileAction.PLACED : TileAction.BREAK; tileEvent.TileType = (wall) ? TileType.WALL : TileType.BLOCK; tileEvent.Position = new Vector2(x, y); Program.server.PluginManager.processHook(Hooks.PLAYER_TILECHANGE, tileEvent); if (tileEvent.Cancelled) { NetMessage.SendTileSquare(whoAmI, x, y, 1); return; } if (!failFlag) { if (tileAction == 0 || tileAction == 2 || tileAction == 4) { Netplay.slots[whoAmI].spamDelBlock += 1f; } else if (tileAction == 1 || tileAction == 3) { Netplay.slots[whoAmI].spamAddBlock += 1f; } } if (!Netplay.slots[whoAmI].tileSection[Netplay.GetSectionX(x), Netplay.GetSectionY(y)]) { failFlag = true; } switch (tileAction) { case 0: WorldGen.KillTile(x, y, failFlag, false, false); break; case 1: WorldGen.PlaceTile(x, y, (int)tileType, false, true, -1, style); break; case 2: WorldGen.KillWall(x, y, failFlag); break; case 3: WorldGen.PlaceWall(x, y, (int)tileType, false); break; case 4: WorldGen.KillTile(x, y, failFlag, false, true); break; } NetMessage.SendData(17, -1, whoAmI, "", (int)tileAction, (float)x, (float)y, (float)tileType); if (tileAction == 1 && tileType == 53) { NetMessage.SendTileSquare(-1, x, y, 1); } }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { base.onPlayerTileChange(Event); checkRune(Event); }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { int player = ((Player)Event.Sender).whoAmi; var sender = Event.Sender; if (Waiting1.ContainsKey(player) && Waiting1[player]) { if (!Pos1.ContainsKey(player)) Pos1.Add(player, Event.Position); Pos1[player] = Event.Position; sender.sendMessage("Position 1 set (" + Event.Position.X + ", " + Event.Position.Y + ")"); Waiting1[player] = false; Waiting2[player] = false; Event.Cancelled = true; return; } if (Waiting1.ContainsKey(player) && Waiting2[player]) { if (!Pos2.ContainsKey(player)) Pos2.Add(player, Event.Position); Pos2[player] = Event.Position; sender.sendMessage("Position 2 set (" + Event.Position.X + ", " + Event.Position.Y + ")"); Waiting1[player] = false; Waiting2[player] = false; Event.Cancelled = true; return; } return; }
public void Process(int start, int length, int num, int whoAmI, byte[] readBuffer, byte bufferData) { var slot = Netplay.slots[whoAmI]; byte tileAction = readBuffer[num++]; int x = BitConverter.ToInt32(readBuffer, num); num += 4; int y = BitConverter.ToInt32(readBuffer, num); num += 4; byte tileType = readBuffer[num++]; int style = (int)readBuffer[num]; bool failFlag = (tileType == 1); bool placed = false; bool wall = false; //Logging.ProgramLog.Debug.Log ("TileBreak({0}s, {4}a, {1}t) @ {2}, {3}", style, tileType, x, y, tileAction); if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY) { slot.Kick ("Invalid tile received from client."); return; } var tile = Main.tile.At(x, y).Data; switch (tileAction) { case 1: if (tileType >= Main.MAX_TILE_SETS) { slot.Kick ("Invalid tile received from client."); return; } tile.Type = tileType; placed = true; break; case 2: wall = true; break; case 3: if (tileType >= Main.MAX_WALL_SETS) { slot.Kick ("Invalid tile received from client."); return; } wall = true; placed = true; tile.Wall = tileType; break; } var player = Main.players[whoAmI]; PlayerTileChangeEvent tileEvent = new PlayerTileChangeEvent(); tileEvent.Sender = player; tileEvent.Tile = tile; tileEvent.Action = (placed) ? TileAction.PLACED : TileAction.BREAK; tileEvent.TileType = (wall) ? TileType.WALL : TileType.BLOCK; tileEvent.Position = new Vector2(x, y); Program.server.PluginManager.processHook(Hooks.PLAYER_TILECHANGE, tileEvent); if (tileEvent.Cancelled) { int sectionX = Netplay.GetSectionX(Main.spawnTileX); int sectionY = Netplay.GetSectionY(Main.spawnTileY); NetMessage.SendSection(whoAmI, sectionX, sectionY); //NetMessage.SendTileSquare(whoAmI, x, y, 1); return; } if (!failFlag) { if (tileAction == 0 || tileAction == 2 || tileAction == 4) { Netplay.slots[whoAmI].spamDelBlock += 1f; } else if (tileAction == 1 || tileAction == 3) { Netplay.slots[whoAmI].spamAddBlock += 1f; } } if (!Netplay.slots[whoAmI].tileSection[Netplay.GetSectionX(x), Netplay.GetSectionY(y)]) { failFlag = true; } switch (tileAction) { case 0: WorldModify.KillTile(x, y, failFlag, false, false); break; case 1: WorldModify.PlaceTile(x, y, (int)tileType, false, true, whoAmI, style); if (tileType == 15 && player.direction == 1) { Main.tile.At(x, y).AddFrameX (18); Main.tile.At(x, y - 1).AddFrameX (18); } else if (tileType == 106) { WorldModify.SquareTileFrame (x, y, true); } break; case 2: WorldModify.KillWall(x, y, failFlag); break; case 3: WorldModify.PlaceWall(x, y, (int)tileType, false); break; case 4: WorldModify.KillTile(x, y, failFlag, false, true); break; } NetMessage.SendData(17, -1, whoAmI, "", (int)tileAction, (float)x, (float)y, (float)tileType, style); if (tileAction == 1 && tileType == 53) { NetMessage.SendTileSquare(-1, x, y, 1); } }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { int player = ((Player)Event.Sender).whoAmi; var region = IsPointInRegion(Event.Position); if (region != null && !IsPlayerRegionMember(player, region)) { Event.Sender.sendMessage("This area is protected!"); Event.Cancelled = true; return; } return; }
public void Process(int start, int length, int num, int whoAmI, byte[] readBuffer, byte bufferData) { short size = BitConverter.ToInt16(readBuffer, start + 1); int left = BitConverter.ToInt32(readBuffer, start + 3); int top = BitConverter.ToInt32(readBuffer, start + 7); num = start + 11; var slot = Netplay.slots[whoAmI]; #if IGNORE_TILE_SQUARE if (size > 7) { Logging.ProgramLog.Debug.Log ("{0}: Ignoring tile square of size {1}", whoAmI, size); return; } bool different = false; for (int x = left; x < left + (int)size; x++) { for (int y = top; y < top + (int)size; y++) { TileData tile = Main.tile.At(x, y).Data; byte b9 = readBuffer[num++]; bool wasActive = tile.Active; tile.Active = ((b9 & 1) == 1); different |= tile.Active != wasActive; if ((b9 & 2) == 2) { different |= tile.Lighted == false; tile.Lighted = true; } if (tile.Active) { int wasType = (int)tile.Type; tile.Type = readBuffer[num++]; different |= tile.Type != wasType; short framex = tile.FrameX; short framey = tile.FrameY; if (tile.Type >= Main.MAX_TILE_SETS) { slot.Kick ("Invalid tile received from client."); return; } if (Main.tileFrameImportant[(int)tile.Type]) { framex = BitConverter.ToInt16(readBuffer, num); num += 2; framey = BitConverter.ToInt16(readBuffer, num); num += 2; } else if (!wasActive || (int)tile.Type != wasType) { framex = -1; framey = -1; } different |= (framex != tile.FrameX) || (framey != tile.FrameY); } if ((b9 & 4) == 4) { different |= tile.Wall == 0; different |= tile.Wall != readBuffer[num++]; } if ((b9 & 8) == 8) { // TODO: emit a liquid event different |= tile.Liquid != readBuffer[num++]; different |= (tile.Lava ? 1 : 0) != readBuffer[num++]; } if (different) { break; } } } //Logging.ProgramLog.Debug.Log ("TileSquare({0}): {1}", size, different); if (different) { System.Threading.Interlocked.Add (ref diffTiles, size); if (size != 3) Logging.ProgramLog.Debug.Log ("{0}: TileSquare({1}): {2:0.0} ({3})", whoAmI, size, diffTiles * 100.0 / (sameTiles + diffTiles), diffTiles); } else { System.Threading.Interlocked.Add (ref sameTiles, size); //Logging.ProgramLog.Debug.Log ("{0}: same TileSquare({1}): {2:0.0} ({3})", whoAmI, size, diffTiles * 100.0 / (sameTiles + diffTiles), diffTiles); } if (different) NetMessage.SendTileSquare (whoAmI, left, top, size, false); return; #endif for (int x = left; x < left + (int)size; x++) { for (int y = top; y < top + (int)size; y++) { TileData tile = Main.tile.At(x, y).Data; byte b9 = readBuffer[num++]; bool wasActive = tile.Active; tile.Active = ((b9 & 1) == 1); if ((b9 & 2) == 2) { tile.Lighted = true; } if ((b9 & 4) == 4) { tile.Wall = 1; } else { tile.Wall = 0; } if ((b9 & 8) == 8) { tile.Liquid = 1; } else { tile.Liquid = 0; } if (tile.Active) { int wasType = (int)tile.Type; tile.Type = readBuffer[num++]; if (tile.Type >= Main.MAX_TILE_SETS) { slot.Kick ("Invalid tile received from client."); return; } if (Main.tileFrameImportant[(int)tile.Type]) { tile.FrameX = BitConverter.ToInt16(readBuffer, num); num += 2; tile.FrameY = BitConverter.ToInt16(readBuffer, num); num += 2; } else if (!wasActive || (int)tile.Type != wasType) { tile.FrameX = -1; tile.FrameY = -1; } } if (tile.Wall > 0) { tile.Wall = readBuffer[num++]; if (tile.Wall >= Main.MAX_WALL_SETS) { slot.Kick ("Invalid tile received from client."); return; } } if (tile.Liquid > 0) { // TODO: emit a liquid event tile.Liquid = readBuffer[num++]; byte b10 = readBuffer[num++]; tile.Lava = (b10 == 1); } PlayerTileChangeEvent tileEvent = new PlayerTileChangeEvent(); tileEvent.Sender = Main.players[whoAmI]; tileEvent.Tile = tile; tileEvent.Action = (tile.Active) ? TileAction.PLACED : TileAction.BREAK; //Not sure of this tileEvent.TileType = (tile.wall == 1) ? TileType.WALL : TileType.BLOCK; tileEvent.Position = new Vector2(x, y); Program.server.PluginManager.processHook(Hooks.PLAYER_TILECHANGE, tileEvent); if (tileEvent.Cancelled) { NetMessage.SendTileSquare(whoAmI, x, y, 1); return; } Main.tile.At(x, y).SetData(tile); } } WorldModify.RangeFrame(left, top, left + (int)size, top + (int)size); NetMessage.SendData((int)bufferData, -1, whoAmI, "", (int)size, (float)left, (float)top); }
public override void onPlayerTileChange(PlayerTileChangeEvent Event) { Player player = Server.GetPlayerByName(Event.Sender.Name); bool lobby = player.PluginData.ContainsKey("lobby") ? (bool)player.PluginData["lobby"] : false; bool validated = player.PluginData.ContainsKey("validated") ? (bool)player.PluginData["validated"] : false; Program.tConsole.WriteLine("Tile Type: " + Event.Tile.Type.ToString()); if ((lobby || validated) && player.Op) { if (lobby) { lobbyPoint = (int)Event.Position.X + "," + (int)Event.Position.Y; properties.LobbyPoint = lobbyPoint; properties.Save(true); player.sendMessage("You have set the lobby point", chatColor); } else if (validated) { validatedPoint = (int)Event.Position.X + "," + (int)Event.Position.Y; properties.ValidatedPoint = validatedPoint; properties.Save(true); player.sendMessage("You have set the validated point", chatColor); } Event.Cancelled = true; player.PluginData["lobby"] = false; player.PluginData["validated"] = false; } else { if (Event.Tile.Type != 29 || !banPiggyBanks) Event.Cancelled = CancelEvent(Event.Sender.Name); if (Event.Tile.Type == 97 && banSafes) { player.sendMessage("Safes are banned on this server", chatColor); Event.Cancelled = true; } base.onPlayerTileChange(Event); if (Event.Tile.Type == 29 && banPiggyBanks) { for (int i = (int)Event.Position.X; i <= (int)Event.Position.X + 1; i++) { Terraria_Server.WorldMod.WorldModify.KillTile(i, (int)Event.Position.Y); Terraria_Server.WorldMod.WorldModify.meteor(i, (int)Event.Position.Y); NetMessage.SendTileSquare(Server.GetPlayerByName(Event.Sender.Name).whoAmi, i, (int)Event.Position.Y, 1); player.sendMessage("Piggy banks are banned on this server", chatColor); } } } }
public void Process(int start, int length, int num, int whoAmI, byte[] readBuffer, byte bufferData) { byte tileAction = readBuffer[num++]; int x = BitConverter.ToInt32(readBuffer, num); num += 4; int y = BitConverter.ToInt32(readBuffer, num); num += 4; byte tileType = readBuffer[num++]; int style = (int)readBuffer[num]; bool failFlag = (tileType == 1); Tile tile = new Tile(); if (Main.tile[x, y] != null) { tile = WorldGen.cloneTile(Main.tile[x, y]); } if (Main.tile[x, y] == null) { Main.tile[x, y] = new Tile(); } tile.tileX = x; tile.tileY = y; PlayerTileChangeEvent breakEvent = new PlayerTileChangeEvent(); breakEvent.Sender = Main.players[whoAmI]; breakEvent.Tile = tile; breakEvent.Type = tileType; breakEvent.Position = new Vector2(x, y); Program.server.getPluginManager().processHook(Hooks.TILE_CHANGE, breakEvent); if (breakEvent.Cancelled) { NetMessage.SendTileSquare(whoAmI, x, y, 1); return; } if (Main.netMode == 2) { if (!failFlag) { if (tileAction == 0 || tileAction == 2 || tileAction == 4) { Netplay.serverSock[whoAmI].spamDelBlock += 1f; } else if (tileAction == 1 || tileAction == 3) { Netplay.serverSock[whoAmI].spamAddBlock += 1f; } } if (!Netplay.serverSock[whoAmI].tileSection[Netplay.GetSectionX(x), Netplay.GetSectionY(y)]) { failFlag = true; } } switch (tileAction) { case 0: WorldGen.KillTile(x, y, failFlag, false, false); break; case 1: WorldGen.PlaceTile(x, y, (int)tileType, false, true, -1, style); break; case 2: WorldGen.KillWall(x, y, failFlag); break; case 3: WorldGen.PlaceWall(x, y, (int)tileType, false); break; case 4: WorldGen.KillTile(x, y, failFlag, false, true); break; } if (Main.netMode == 2) { NetMessage.SendData(17, -1, whoAmI, "", (int)tileAction, (float)x, (float)y, (float)tileType); if (tileAction == 1 && tileType == 53) { NetMessage.SendTileSquare(-1, x, y, 1); } } }