Exemplo n.º 1
0
        private static async void Server_OnConnect(object sender, ENetConnectEventArgs connectEventArgs)
        {
            int count = 1;
            //WorldDatabase.GetWorld("START");
            //WorldDatabase.GetWorld("ADMIN");
            //WorldDatabase.GetWorld("HELLO");
            ENetPeer Peer = connectEventArgs.Peer;

            Console.WriteLine("Peer connected. IP : " + Peer.RemoteEndPoint.Address);
            foreach (var currentPeer in Peers)
            {
                if (currentPeer.State != ENetPeerState.Connected)
                {
                    continue;
                }
                if (currentPeer.RemoteEndPoint.Equals(Peer.RemoteEndPoint))
                {
                    count++;
                }
            }
            Peer.Data = new Player();
            if (count > 3)
            {
                await Peer.OnConsoleMessage("`oToo many accounts are logged in this IP. Please try again later.");
            }
            else
            {
                await Peer.SendData(1, BitConverter.GetBytes(0), 1);

                Peers.Add(Peer);
            }
            connectEventArgs.Peer.OnReceive    += Peer_OnReceive;
            connectEventArgs.Peer.OnDisconnect += Peer_OnDisconnect;
        }
Exemplo n.º 2
0
        public static async Task SendCommands(ENetPeer peer, string cch)
        {
            // When adding a command with more than 1 param , example : "/hello world",
            // Make sure you use 'Contains' instead of 'Substring'!
            string str = cch.Split('|').Last();

            if (str == "/test")
            {
                await peer.OnConsoleMessage("Worked!");
            }
            else if (str == "/clearworld")
            {
                World world = peer.GetWorld();
                int   pos   = 0;
                for (int i = 0; i < world.Items.Length; i++)
                {
                    if (world.Items[i].Foreground == 242)
                    {
                        pos = i;
                    }
                }
                if (world.OwnerName != (peer.Data as Player).RawName)
                {
                    await peer.OnTalkBubble("You need to be the world owner to do this!", (peer.Data as Player).NetID);

                    return;
                }
                WorldDatabase.Worlds[WorldDatabase.Worlds.IndexOf(world)] = WorldDatabase.GenerateClearWorld(world.Name, world.Width, world.Height
                                                                                                             , world.OwnerName, pos);
                foreach (var a in Peers.Where(x => x.InWorld(peer) && x.State == ENetPeerState.Connected))
                {
                    await a.SendLeave();

                    await a.OnAddNotification("", "World " + world.Name + " has been cleared!", "open_hub.wav");

                    await a.JoinWorld(world.Name, 0, 0);
                }
            }
            else if (str.Contains("/item "))
            {
                try
                {
                    string[] arr = str.Split(' ');
                    if (arr.Length != 3)
                    {
                        return;
                    }
                    if (Convert.ToInt32(arr[2]) > 200)
                    {
                        await peer.OnTalkBubble("Maximum is 200 items only!");
                    }
                    var a = (peer.Data as Player).PlayerInventory.Items.Where(x => x.ItemID == Convert.ToInt32(arr[1])).ToList();
                    if (a.Count == 0)
                    {
                        InventoryItems items = new InventoryItems
                        {
                            ItemCount = (byte)Convert.ToInt32(arr[2]),
                            ItemID    = Convert.ToInt32(arr[1])
                        };
                        (peer.Data as Player).PlayerInventory.Items = (peer.Data as Player)
                                                                      .PlayerInventory.Items.Append(items).ToArray();
                        await peer.OnConsoleMessage(ItemsData[items.ItemID].Name + " with ID " + items.ItemID + " " +
                                                    "has been added to your inventory.");
                    }
                    else
                    {
                        InventoryItems items = new InventoryItems
                        {
                            ItemCount = (byte)(Convert.ToInt32(arr[2]) + a[0].ItemCount),
                            ItemID    = (byte)Convert.ToInt32(arr[1])
                        };
                        if (items.ItemCount > 200)
                        {
                            await peer.OnTalkBubble("You can only add " + (200 - (items.ItemCount - Convert.ToInt32(arr[2]))) + " items more!");

                            return;
                        }
                        int index = Array.IndexOf((peer.Data as Player).PlayerInventory.Items, a[0]);
                        (peer.Data as Player).PlayerInventory.Items[index] = items;
                        await peer.OnConsoleMessage(ItemsData[items.ItemID].Name + " with ID " + items.ItemID + " " +
                                                    "has been added to your inventory.");
                    }
                    await peer.SendInventory((peer.Data as Player).PlayerInventory);
                }
                catch { return; }
            }
            else if (str == "/longpunch")
            {
                try
                {
                    (peer.Data as Player).SmState = (peer.Data as Player).SmState == 1 ? 0 : 1;
                    await peer.JoinWorld((peer.Data as Player).World, 0, 0);
                }
                catch (Exception e) { Console.WriteLine(e.Message); }
            }
            else if (str.Contains("/find "))
            {
                try
                {
                    string f   = str.Substring(6);
                    var    arr = ItemsData.Where
                                     (x => x.Name.ToLower()
                                     .Contains(f.ToLower()) && x.ItemID % 2 == 0).ToList();
                    if (arr.Count > 100)
                    {
                        await peer.OnConsoleMessage("`4More than 100 items found. " +
                                                    "Please specify more!");

                        await peer.OnTalkBubble("More than 100 items found. " +
                                                "Please specify more!");

                        return;
                    }
                    string s = "set_default_color|\nadd_label|small|Found " + arr.Count + " items|left|420|\nadd_spacer|small|\n";
                    arr.ForEach(x => s += "add_button_with_icon|findbutton" + x.ItemID + "|`9" + x.Name + "|left|" + x.ItemID + "||\n");
                    s += "\nadd_spacer|small|\nend_dialog|finddialog|Cancel||";
                    await peer.OnDialogRequest(s);
                }
                catch { return; }
            }
            else if (str == "/testing")
            {
                string s = "set_default_color|\nadd_label|small|testing|left|420|\nadd_text_input|textinput|`oWow : ||10|\nadd_spacer|small|\nadd_text_input|textinput2|`oWow||10|\nend_dialog|f|cancel|ok|";
                await peer.OnDialogRequest(s);
            }
            else
            {
                if (str[0] == '/')
                {
                    string s = str.ToLower();
                    if (s == "/fp" || s == "/dance" || s == "/dance2" ||
                        s == "/lol" || s == "/cheer")
                    {
                        await peer.OnAction(str);
                    }
                    else
                    {
                        await peer.OnConsoleMessage("Invalid Command!");
                    }
                }
                else
                {
                    if (str.All(char.IsWhiteSpace))
                    {
                        return;
                    }
                    await peer.SendChat(str);
                }
            }
        }
Exemplo n.º 3
0
        public static async Task SendCommands(ENetPeer peer, string cch)
        {
            // When adding a command with more than 1 param , example : "/hello world",
            // Make sure you use 'Contains' instead of 'Substring'!
            string str = cch.Split('|').Last();

            if (str == "/test")
            {
                await peer.OnConsoleMessage("Worked!");
            }
            else if (str.Contains("/item "))
            {
                try
                {
                    string[] arr = str.Split(' ');
                    if (arr.Length != 3)
                    {
                        return;
                    }
                    if (Convert.ToInt32(arr[2]) > 200)
                    {
                        await peer.OnTalkBubble("Maximum is 200 items only!");
                    }
                    var a = (peer.Data as Player).PlayerInventory.Items.Where(x => x.ItemID == Convert.ToInt32(arr[1])).ToList();
                    if (a.Count == 0)
                    {
                        InventoryItems items = new InventoryItems
                        {
                            ItemCount = (byte)Convert.ToInt32(arr[2]),
                            ItemID    = Convert.ToInt32(arr[1])
                        };
                        (peer.Data as Player).PlayerInventory.Items = (peer.Data as Player)
                                                                      .PlayerInventory.Items.Append(items).ToArray();
                        await peer.OnConsoleMessage(ItemsData[items.ItemID].Name + " with ID " + items.ItemID + " " +
                                                    "has been added to your inventory.");
                    }
                    else
                    {
                        InventoryItems items = new InventoryItems
                        {
                            ItemCount = (byte)(Convert.ToInt32(arr[2]) + a[0].ItemCount),
                            ItemID    = (byte)Convert.ToInt32(arr[1])
                        };
                        if (items.ItemCount > 200)
                        {
                            await peer.OnTalkBubble("You can only add " + (200 - (items.ItemCount - Convert.ToInt32(arr[2]))) + " items more!");

                            return;
                        }
                        int index = Array.IndexOf((peer.Data as Player).PlayerInventory.Items, a[0]);
                        (peer.Data as Player).PlayerInventory.Items[index] = items;
                        await peer.OnConsoleMessage(ItemsData[items.ItemID].Name + " with ID " + items.ItemID + " " +
                                                    "has been added to your inventory.");
                    }
                    await peer.SendInventory((peer.Data as Player).PlayerInventory);
                }
                catch { return; }
            }
            else if (str.Contains("/find "))
            {
                try
                {
                    string f   = str.Substring(6);
                    var    arr = ItemsData.Where
                                     (x => x.Name.ToLower()
                                     .Contains(f.ToLower()) && x.ItemID % 2 == 0).ToList();
                    if (arr.Count > 100)
                    {
                        await peer.OnConsoleMessage("`4More than 100 items found. " +
                                                    "Please specify more!");

                        await peer.OnTalkBubble("More than 100 items found. " +
                                                "Please specify more!");

                        return;
                    }
                    string s = "set_default_color|\nadd_label|small|Found " + arr.Count + " items|left|420|\nadd_spacer|small|\n";
                    arr.ForEach(x => s += "add_button_with_icon|findbutton" + x.ItemID + "|`9" + x.Name + "|left|" + x.ItemID + "||\n");
                    s += "\nadd_spacer|small|\nend_dialog|finddialog|Cancel||";
                    await peer.OnDialogRequest(s);
                }
                catch { return; }
            }
            else if (str == "/testing")
            {
                string s = "set_default_color|\nadd_label|small|testing|left|420|\nadd_text_input|textinput|`oWow : ||10|\nadd_spacer|small|\nadd_text_input|textinput2|`oWow||10|\nend_dialog|f|cancel|ok|";
                await peer.OnDialogRequest(s);
            }
            else
            {
                if (str[0] == '/')
                {
                    string s = str.ToLower();
                    if (s == "/fp" || s == "/dance" || s == "/dance2" ||
                        s == "/lol" || s == "/cheer")
                    {
                        await peer.OnAction(str);
                    }
                    else
                    {
                        await peer.OnConsoleMessage("Invalid Command!");
                    }
                }
                else
                {
                    if (str.All(char.IsWhiteSpace))
                    {
                        return;
                    }
                    await peer.SendChat(str);
                }
            }
        }
Exemplo n.º 4
0
        public static async Task SendTileUpdate(int x, int y, int tile, int causedBy, ENetPeer peer)
        {
            try
            {
                if (tile == 18)
                {
                    (peer.Data as Player).LastPunchX = x;
                    (peer.Data as Player).LastPunchY = y;
                }
                else if (tile == 32)
                {
                    (peer.Data as Player).LastWrenchX = x;
                    (peer.Data as Player).LastWrenchY = y;
                }
                PlayerMoving data = new PlayerMoving
                {
                    PacketType     = 0x3,
                    CharacterState = 0x0,
                    X            = x,
                    Y            = y,
                    PunchX       = x,
                    PunchY       = y,
                    XSpeed       = 0,
                    YSpeed       = 0,
                    NetID        = causedBy,
                    PlantingTree = tile
                };
                World world = (peer.Data as Player).PWorld;
                int   b     = world.Items[x + y * world.Width].Background;
                if (world == null)
                {
                    return;
                }
                if (x < 0 || y < 0 || x > world.Width || y > world.Height)
                {
                    return;
                }
                await SendNothingHappened(peer, x, y);

                if ((peer.Data as Player).AdminID < 666)
                {
                    if (world.Items[x + (y * world.Width)].Foreground == 6 || world.Items[x + (y * world.Width)].Foreground == 8 || world.Items[x + (y * world.Width)].Foreground == 3760)
                    {
                        return;
                    }
                    if (tile == 6 || tile == 8 || tile == 3760)
                    {
                        return;
                    }
                }
                if ((peer.Data as Player).RawName != world.OwnerName)
                {
                    if (world.Items[x + (y * world.Width)].Foreground == 242)
                    {
                        return;
                    }
                }
                if (world.Name == "ADMIN" && (peer.Data as Player).AdminID > 0)
                {
                    if (world.Items[x + (y * world.Width)].Foreground == 758)
                    {
                        await peer.SendRoulette();
                    }
                    return;
                }
                if (tile == 32 && world.Items[x + y * world.Width].Foreground == 6016)
                {
                    await SendGrowScanDialog(peer);
                }
                if (tile != 18 && tile != 32 && !ItemsData[tile].IsBackground && world.Items[x + (y * world.Width)].Foreground != 0)
                {
                    if (tile != 822)
                    { // allowed to place water on other blocks
                        await SendNothingHappened(peer, x, y);

                        return;
                    }
                }
                if (world.Name != "ADMIN")
                {
                    if (world.OwnerName != "")
                    {
                        int fg = world.Items[x + (y * world.Width)].Foreground;
                        if (world.OwnerName != "")
                        {
                            var p = peer.Data as Player;
                            if (!world.IsPublic)
                            {
                                if (p.RawName != world.OwnerName)
                                {
                                    await peer.OnPlayPositioned("audio/punch_locked.wav");

                                    await peer.SendSound("punch_locked.wav");

                                    if (ItemsData[fg].Name.ToLower().Contains("lock"))
                                    {
                                        await peer.OnConsoleMessage(world.OwnerName + "'s `9World Lock");
                                    }
                                }
                            }
                            else
                            {
                                if (p.RawName != world.OwnerName && ItemsData[fg].Name.ToLower().Contains("lock"))
                                {
                                    await peer.OnPlayPositioned("audio/punch_locked.wav");

                                    await peer.SendSound("punch_locked.wav");

                                    await peer.OnConsoleMessage(world.OwnerName + "'s World Lock `o(`$Open to Public`o)");
                                }
                            }
                        }
                        else if (world.IsPublic)
                        {
                            if (world.Items[x + (y * world.Width)].Foreground == 242)
                            {
                                return;
                            }
                        }
                        else
                        {
                            return;
                        }
                    }
                }

                if (tile == 32)
                {
                    // TODO
                    return;
                }
                DataItems def = new DataItems();
                try
                {
                    def = ItemsData[tile];
                }
                catch
                {
                    def.BreakHits = 4;
                }

                if (tile == 544 || tile == 546 || tile == 4520 || tile == 382 || tile == 3116 || tile == 4520 || tile == 1792 || tile == 5666 || tile == 2994 || tile == 4368)
                {
                    return;
                }
                if (tile == 5708 || tile == 5709 || tile == 5780 || tile == 5781 || tile == 5782 || tile == 5783 || tile == 5784 || tile == 5785 || tile == 5710 || tile == 5711 || tile == 5786 || tile == 5787 || tile == 5788 || tile == 5789 || tile == 5790 || tile == 5791 || tile == 6146 || tile == 6147 || tile == 6148 || tile == 6149 || tile == 6150 || tile == 6151 || tile == 6152 || tile == 6153 || tile == 5670 || tile == 5671 || tile == 5798 || tile == 5799 || tile == 5800 || tile == 5801 || tile == 5802 || tile == 5803 || tile == 5668 || tile == 5669 || tile == 5792 || tile == 5793 || tile == 5794 || tile == 5795 || tile == 5796 || tile == 5797 || tile == 544 || tile == 546 || tile == 4520 || tile == 382 || tile == 3116 || tile == 1792 || tile == 5666 || tile == 2994 || tile == 4368)
                {
                    return;
                }
                if (tile == 1902 || tile == 1508 || tile == 428)
                {
                    return;
                }
                if (tile == 1770 || tile == 4720 || tile == 4882 || tile == 6392 || tile == 3212 || tile == 1832 || tile == 4742 || tile == 3496 || tile == 3270 || tile == 4722 || tile == 6864)
                {
                    return;
                }
                if (tile >= 7068)
                {
                    return;
                }
                if (tile == 18)
                {
                    if (world.Items[x + (y * world.Width)].Background == 6864 && world.Items[x + (y * world.Width)].Foreground == 0)
                    {
                        return;
                    }
                    if (world.Items[x + (y * world.Width)].Background == 0 && world.Items[x + (y * world.Width)].Foreground == 0)
                    {
                        return;
                    }
                    //data.netID = -1;

                    data.PacketType   = 0x8;
                    data.PlantingTree = 4;
                    long time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                    //if (world->Items[x + (y*world->Width)].foreground == 0) return;
                    int a = world.Items[x + y * world.Width].Foreground;
                    if (time - world.Items[x + (y * world.Width)].BreakTime >= 4000)
                    {
                        world.Items[x + (y * world.Width)].BreakTime  = time;
                        world.Items[x + (y * world.Width)].BreakLevel = 6;
                        if (world.Items[x + (y * world.Width)].Foreground == 758)
                        {
                            await peer.SendRoulette();
                        }
                    }
                    else if (y < world.Height && world.Items[x + (y * world.Width)].BreakLevel + 6 >= ItemsData[a].BreakHits)
                    {
                        data.PacketType   = 0x3;
                        data.NetID        = -1;
                        data.PlantingTree = 18;
                        data.PunchX       = x;
                        data.PunchY       = y;
                        world.Items[x + (y * world.Width)].BreakLevel = 0;
                        int brokentile = world.Items[x + (y * world.Width)].Foreground;

                        if (world.Items[x + (y * world.Width)].Foreground != 0)
                        {
                            if (world.Items[x + (y * world.Width)].Foreground == 242)
                            {
                                world.OwnerName      = "";
                                world.IsPublic       = false;
                                world.AccessedPlayer = "";
                                foreach (var p in Peers)
                                {
                                    if (p.State != ENetPeerState.Connected)
                                    {
                                        continue;
                                    }
                                    await p.OnConsoleMessage("`oWorld `0" + world.Name + " `ohas had it's World Lock's removed!");
                                }
                            }
                            world.Items[x + y * world.Width].Foreground = 0;
                        }
                        else
                        {
                            world.Items[x + (y * world.Width)].Background = 0;
                        }
                    }
                    else
                    {
                        world.Items[x + (y * world.Width)].BreakTime   = time;
                        world.Items[x + (y * world.Width)].BreakLevel += 6; // TODO
                        if (world.Items[x + (y * world.Width)].Foreground == 758)
                        {
                            await peer.SendRoulette();
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < (peer.Data as Player).PlayerInventory.Items.Length; i++)
                    {
                        if ((peer.Data as Player).PlayerInventory.Items[i].ItemID == tile)
                        {
                            if ((uint)(peer.Data as Player).PlayerInventory.Items[i].ItemCount > 1)
                            {
                                (peer.Data as Player).PlayerInventory.Items[i].ItemCount--;
                            }
                            else
                            {
                                Array.Clear((peer.Data as Player).PlayerInventory.Items, i, 1);
                            }
                        }
                    }
                    if (ItemsData[tile].IsBackground)
                    {
                        world.Items[x + (y * world.Width)].Background = (short)tile;
                    }
                    if (world.Items[x + (y * world.Width)].Foreground != 0)
                    {
                        Console.WriteLine("return 11");
                        return;
                    }
                    else
                    {
                        int xx = data.PunchX;
                        int yy = data.PunchY;
                        foreach (ENetPeer currentPeer in Peers)
                        {
                            if (currentPeer.State != ENetPeerState.Connected)
                            {
                                continue;
                            }
                            if (peer.InWorld(currentPeer))
                            {
                                //dont allow to put consumbales
                                if (tile == 1368)
                                {
                                    return;
                                }
                                if (tile == 276)
                                {
                                    return;
                                }
                            }
                        }
                        world.Items[x + (y * world.Width)].Foreground = (short)tile;
                        if (tile == 242)
                        {
                            world.OwnerName  = (peer.Data as Player).RawName;
                            world.OwnerNetID = (peer.Data as Player).NetID;
                            world.IsPublic   = false;
                            await peer.OnPlayPositioned("audio/use_lock.wav");

                            await peer.SendSound("use_lock.wav");

                            foreach (ENetPeer currentPeer in Peers)
                            {
                                if (currentPeer.State != ENetPeerState.Connected)
                                {
                                    continue;
                                }
                                if (peer.InWorld(currentPeer))
                                {
                                    await currentPeer.OnConsoleMessage("`3[`w" + world.Name + " `ohas been World Locked by `2" + (peer.Data as Player).DisplayName + "`3]");
                                }
                            }
                        }
                    }

                    world.Items[x + (y * world.Width)].BreakLevel = 0;
                }
                Random r  = new Random();
                byte   xd = (byte)r.Next(1, 5);
                foreach (ENetPeer currentPeer in Peers)
                {
                    byte[] raw = PlayerMovingPack(data);
                    if (currentPeer.State != ENetPeerState.Connected)
                    {
                        continue;
                    }
                    if (peer.InWorld(currentPeer))
                    {
                        await SendPacketRaw(4, raw, 56, 0, currentPeer);
                    }
                    //cout << "Tile update at: " << data2->punchX << "x" << data2->punchY << endl;
                }
                // To save all the worlds DB (memory)
                await SaveOrAddWorldAsync(world);
            }
            catch (Exception e)
            {
                Console.WriteLine("error in async Task sendtileupdate");
                await peer.OnConsoleMessage(e.Message + " " + e.TargetSite + ",SOURCE : " + e.Source);
            }
        }