コード例 #1
0
ファイル: Liquid.cs プロジェクト: amarriner/Liquid
        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);
        }
コード例 #2
0
 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;
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
                            }
                        }
                    }

                }
        }
コード例 #5
0
ファイル: CropCircles.cs プロジェクト: AWRyder/CropCircles
        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)
                    }
                }
            }
        }
コード例 #6
0
 /// <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)
 {
 }
コード例 #7
0
        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;
                }

            }
        }
コード例 #8
0
        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);
        }
コード例 #9
0
 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);
         }
     }
 }
コード例 #10
0
 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);
 }
コード例 #11
0
ファイル: House.cs プロジェクト: Ricealso/House
        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);
        }
コード例 #12
0
        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);
            }
        }
コード例 #13
0
ファイル: CropCircles.cs プロジェクト: AWRyder/CropCircles
 public override void onPlayerTileChange(PlayerTileChangeEvent Event)
 {
     base.onPlayerTileChange(Event);
     checkRune(Event);
 }
コード例 #14
0
 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;
 }
コード例 #15
0
        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);
            }
        }
コード例 #16
0
 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);
        }
コード例 #18
0
ファイル: Login.cs プロジェクト: amarriner/Login
        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);
                    }
                }
            }
        }
コード例 #19
0
        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);
                }
            }
        }