public string HandlePacketFromServer(ENetPacket packet)
        {
            if (MainForm.proxyPeer == null)
            {
                return("");
            }
            if (MainForm.proxyPeer.State != ENetPeerState.Connected)
            {
                return("");
            }
            if (MainForm.realPeer == null)
            {
                return("");
            }
            if (MainForm.realPeer.State != ENetPeerState.Connected)
            {
                return("");
            }

            byte[] data = packet.GetPayloadFinal();
            if (data.Length > 5)
            {
                if (data[5] == 3)
                {
                    return("_none_");
                }
            }
            //else
            //{
            //return "_none_";
            //}


            NetTypes.NetMessages msgType = GetMessageType(data);
            switch (msgType)
            {
            case NetTypes.NetMessages.SERVER_HELLO:

                MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): Initial logon accepted." + "\n");
                break;

            case NetTypes.NetMessages.GAME_MESSAGE:

                string str = GetProperGenericText(data);
                MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A game_msg packet was sent: " + str + "\n");
                if (str.Contains("Server requesting that you re-logon..."))
                {
                    MainForm.token  = 0;
                    MainForm.doorid = "";

                    SwitchServers("213.179.209.168", 17234);

                    return("Server forces logon request, switching server automatically so user does not have to cancel to login menu and reconnect.");
                }
                break;

            case NetTypes.NetMessages.GAME_PACKET:

                byte[] tankPacket = VariantList.get_struct_data(data);
                if (tankPacket == null)
                {
                    break;
                }

                NetTypes.PacketTypes packetType = GetPacketType(tankPacket);


                switch (packetType)
                {
                case NetTypes.PacketTypes.CALL_FUNCTION:
                    VariantList.VarList VarListFetched = VariantList.GetCall(VariantList.get_extended_data(tankPacket));
                    VarListFetched.netID = BitConverter.ToInt32(tankPacket, 4);         // add netid
                    VarListFetched.delay = BitConverter.ToUInt32(tankPacket, 20);       // add keep track of delay modifier

                    int    netID   = OperateVariant(VarListFetched);
                    string argText = string.Empty;

                    for (int i = 0; i < VarListFetched.functionArgs.Count(); i++)
                    {
                        argText += " [" + i.ToString() + "]: " + (string)VarListFetched.functionArgs[i].ToString();
                    }

                    MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A function call was requested, see log infos below:\nFunction Name: " + VarListFetched.FunctionName + " parameters: " + argText + " \n");

                    if (VarListFetched.FunctionName == "OnSendToServer")
                    {
                        return("Server switching forced, not continuing as Proxy Client has to deal with this.");
                    }
                    if (VarListFetched.FunctionName == "onShowCaptcha")
                    {
                        return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side.");
                    }
                    if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("captcha"))
                    {
                        return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side.");
                    }
                    if (VarListFetched.FunctionName == "OnSetPos" && MainForm.ignoreonsetpos && netID == worldMap.netID)
                    {
                        return("Ignored position set by server, may corrupt doors but is used so it wont set back. (CAN BE BUGGY WITH SLOW CONNECTIONS)");
                    }
                    if (VarListFetched.FunctionName == "OnSpawn" && netID == -2)
                    {
                        return("Modified OnSpawn for unlimited zoom (mstate|1)");                                                                 // only doing unlimited zoom and not unlimited punch/place to be sure that no bans occur due to this. If you wish to use unlimited punching/placing as well, change the smstate in OperateVariant function instead.
                    }

                    /*if (VarListFetched.FunctionName == "OnSetClothing" && VarListFetched.netID == worldMap.netID)
                     * {
                     *  if (!worldMap.player.didClothingLoad)
                     *  {
                     *      worldMap.player.didClothingLoad = true;
                     *      Task.Delay(400).ContinueWith(t => PacketSending.SendData(data, MainForm.proxyPeer));
                     *      return "applying onsetclothing delayed...";
                     *  }
                     * }*/
                    // unused since 1.5.5
                    break;

                case NetTypes.PacketTypes.SET_CHARACTER_STATE:
                    /*if (!worldMap.player.didCharacterStateLoad)
                     * {
                     *  worldMap.player.didCharacterStateLoad = true; // optimization
                     *  Task.Delay(400).ContinueWith(t => PacketSending.SendData(data, MainForm.proxyPeer));
                     * }*/
                    // unused since 1.5.5
                    break;

                case NetTypes.PacketTypes.PING_REQ:
                    SpoofedPingReply();
                    break;

                case NetTypes.PacketTypes.LOAD_MAP:
                    if (MainForm.LogText.Length >= 65536)
                    {
                        MainForm.LogText = string.Empty;
                    }

                    worldMap = worldMap.LoadMap(tankPacket);
                    worldMap.player.didCharacterStateLoad = false;
                    worldMap.player.didClothingLoad       = false;

                    break;

                case NetTypes.PacketTypes.MODIFY_ITEM_OBJ:
                {
                    TankPacket p = TankPacket.UnpackFromPacket(data);
                    if (p.NetID == -1)
                    {
                        if (worldMap == null)
                        {
                            MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n");
                            break;
                        }

                        worldMap.dropped_ITEMUID++;

                        DroppedObject dItem = new DroppedObject();
                        dItem.id        = p.MainValue;
                        dItem.itemCount = data[16];
                        dItem.x         = p.X;
                        dItem.y         = p.Y;
                        dItem.uid       = worldMap.dropped_ITEMUID;
                        worldMap.droppedItems.Add(dItem);

                        if (MainForm.cheat_magplant)
                        {
                            TankPacket p2 = new TankPacket();
                            p2.PacketType = (int)NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ;
                            p2.NetID      = p.NetID;
                            p2.X          = (int)p.X;
                            p2.Y          = (int)p.Y;
                            p2.MainValue  = dItem.uid;

                            PacketSending.SendPacketRaw((int)NetTypes.NetMessages.GAME_PACKET, p2.PackForSendingRaw(), MainForm.realPeer);
                            //return "Blocked dropped packet due to magplant hack (auto collect/pickup range) tried to collect it instead, infos of dropped item => uid was " + worldMap.dropped_ITEMUID.ToString() + " id: " + p.MainValue.ToString();
                        }
                    }
                }
                break;

                default:
                    break;
                }
                break;

            case NetTypes.NetMessages.TRACK:
            case NetTypes.NetMessages.LOG_REQ:
            case NetTypes.NetMessages.ERROR:
                return("Blocked track/logreq/error message type by server.");

            default:
                return("(SERVER): An unknown event occured. Message Type: " + msgType.ToString() + "\n");

                break;
            }

            PacketSending.SendData(data, MainForm.proxyPeer, ENetPacketFlags.Reliable);
            if (msgType == NetTypes.NetMessages.GAME_PACKET && data[4] > 39) // customizable on which packets you wanna log, for speed im just gonna do this!
            {
                TankPacket p           = TankPacket.UnpackFromPacket(data);
                uint       extDataSize = BitConverter.ToUInt32(data, 56);
                byte[]     actualData  = data.Skip(4).Take(56).ToArray();
                byte[]     extData     = data.Skip(60).ToArray();

                string extDataStr      = "";
                string extDataStrShort = "";
                string extDataString   = Encoding.UTF8.GetString(extData);
                for (int i = 0; i < extDataSize; i++)
                {
                    //ushort pos = BitConverter.ToUInt16(extData, i);
                    extDataStr += extData[i].ToString() + "|";
                }


                return("Log of potentially wanted received GAME_PACKET Data:" +
                       "\npackettype: " + actualData[0].ToString() +
                       "\npadding byte 1|2|3: " + actualData[1].ToString() + "|" + actualData[2].ToString() + "|" + actualData[3].ToString() +
                       "\nnetID: " + p.NetID +
                       "\nsecondnetid: " + p.SecondaryNetID +
                       "\ncharacterstate (prob 8): " + p.CharacterState +
                       "\nwaterspeed / offs 16: " + p.Padding +
                       "\nmainval: " + p.MainValue +
                       "\nX|Y: " + p.X + "|" + p.Y +
                       "\nXSpeed: " + p.XSpeed +
                       "\nYSpeed: " + p.YSpeed +
                       "\nSecondaryPadding: " + p.SecondaryPadding +
                       "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY +
                       "\nExtended Packet Data Length: " + extDataSize.ToString() +
                       "\nExtended Packet Data:\n" + extDataStr + "\n");

                return(string.Empty);
            }
            else
            {
                return(string.Empty);
            }
        }
        private void Run()
        {
            ENetEvent eNetEvent = new ENetEvent();

            while (_running)
            {
                int result = _eNetHost.Service(eNetEvent, 1000);
                _logger.Info($"Result: {result}");
                switch (eNetEvent.Type)
                {
                case ENetEventType.ENET_EVENT_TYPE_CONNECT:
                    _logger.Info(
                        $"A new client connected from: {eNetEvent.Peer.Address.Address}:{eNetEvent.Peer.Address.Port}");
                    break;

                case ENetEventType.ENET_EVENT_TYPE_RECEIVE:
                    _logger.Info(
                        $"A packet of length {eNetEvent.Packet.DataLength} was received from {eNetEvent.Peer.Address.Address}:{eNetEvent.Peer.Address.Port} on channel {eNetEvent.ChannelId}");
                    ENetPacket packet = new ENetPacket();
                    packet.Data       = Encoding.UTF8.GetBytes("Test Response\0");
                    packet.DataLength = (uint)packet.Data.Length;
                    packet.Flags      = ENetPacketFlags.ENET_PACKET_FLAG_RELIABLE;
                    eNetEvent.Peer.Send(eNetEvent.ChannelId, packet);
                    break;

                case ENetEventType.ENET_EVENT_TYPE_DISCONNECT:
                    _logger.Info(
                        $"Client {eNetEvent.Peer.Address.Address}:{eNetEvent.Peer.Address.Port} disconnected");
                    break;
                }
            }
        }
Example #3
0
        private void Peer_OnReceive_Client(object sender, ENetPacket e)
        {
            string str = messageHandler.HandlePacketFromServer(e);

            if (str != "_none_" && str != "")
            {
                AppendLog(str);
            }
        }
Example #4
0
        internal ENetAsyncPacket(ENetPacket packet, byte channelId)
        {
            ChannelId = channelId;
            Flags     = packet.Flags & ~ENetPacketFlags.NoAllocate;

            m_PacketDataLen    = packet.Data.Length;
            m_PacketDataBuffer = ArrayPool <byte> .Shared.Rent(m_PacketDataLen);

            packet.Data.CopyTo(m_PacketDataBuffer);
        }
Example #5
0
        public static void SendToClient(ENetPacket packet)
        {
            var cpy = packet.GetPayloadCopy();

            var dataHex = BitConverter.ToString(cpy).Replace("-", "");

            LogServer(dataHex);

            LocalServer.Broadcast(cpy, 0, ENetPacketFlags.Reliable);
        }
        public unsafe void TestSetAndGetUserDataPacket()
        {
            var nativePeer = new NativeENetPacket();
            var packet     = new ENetPacket(&nativePeer);
            var data       = 1399;

            packet.SetUserData(data);
            Assert.IsTrue(packet.TryGetUserData <int>(out var data2));
            Assert.AreEqual(data, data2);
        }
Example #7
0
        private void Peer_OnReceive(object sender, ENetPacket e)
        {
            /*if (proxyPeer == null || realPeer == null) return;
             * if ((proxyPeer.State != ENetPeerState.Connected || proxyPeer.Data == null) ||
             * (realPeer.State != ENetPeerState.Connected || proxyPeer.Data == null)) return;*/
            //use checkPeerUsability if you wanna check for peer, since this is an open source freeware, I will not have to for now.

            //messageHandler.HandlePacketFromClient(e);

            string str = messageHandler.HandlePacketFromClient(e);

            if (str != "_none_" && str != "")
            {
                AppendLog(str);
            }
        }
Example #8
0
        private void Peer_OnReceive(object sender, ENetPacket e)
        {
            using (var reader = new StreamReader(e.GetPayloadStream(false)))
            {
                var name = reader.ReadLine();
                var text = reader.ReadToEnd();

                if (IsClient)
                {
                    WriteLog("{0}: {1}", name, text);
                }
                else
                {
                    WriteLog("{0}: {1}", name, text);
                    m_Host.Broadcast(e.GetPayloadFinal(), 0, ENetPacketFlags.Reliable);
                }
            }
        }
Example #9
0
        public static void OnPacketReceived(ENetPeer peer, ENetPacket packet)
        {
            var data = packet.Data.ToArray();

            if (peer.TryGetUserData(out Player player))
            {
                switch (data[0])
                {
                case 0x2:
                case 0x3:
                    new TextEvent(player, packet);
                    break;

                case 0x4:
                    new TankEvent(player, packet);
                    break;
                }
            }
            else
            {
                return;
            }
        }
Example #10
0
 public abstract int peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
Example #11
0
        private static async void Peer_OnReceive(object sender, ENetPacket e)
        {
            byte[] payLoad = e.GetPayloadCopy();
            var    peer    = sender as ENetPeer;
            var    pData   = peer.Data as Player;

            if (pData.Updating)
            {
                Console.WriteLine("PACKET DROP");
                return;
            }
            var world = peer.GetWorld();

            (peer.Data as Player).PWorld = world;
            int    type   = payLoad[0];
            string action = Encoding.ASCII.GetString(payLoad.Take(payLoad.Length - 1).Skip(4).ToArray());

            string[] actionArr = action.Split("\n".ToCharArray());
            string[,] loginArr = new string[actionArr.Length, 2];
            if (actionArr.Length > 17)
            {
                try
                {
                    for (int i = 0; i < actionArr.Length; i++)
                    {
                        for (int j = 0; j < 2; j++)
                        {
                            loginArr[i, j] = actionArr[i].Split('|')[j];
                            LoginArray     = loginArr;
                        }
                    }
                }
                catch { }
            }
            switch (type)
            {
            case 2:
                //    long time = DateTimeOffset.Now.ToUnixTimeMilliseconds();
                //    if(pData.LastPlayerEnter + 350 < time)
                //    {
                //        (peer.Data as Player).LastPlayerEnter = time;
                //        goto b;
                //    }
                //    else
                //    {
                //        if (action != "action|refresh_item_data\n") return;
                //    }
                //b:;
                if (action.Is("action|respawn"))
                {
                    try
                    {
                        if (action.Is("action|respawn_spike"))
                        {
                            await peer.Respawn(true);
                        }
                        else
                        {
                            await peer.Respawn(false);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Respawn Error! Message : " + ex.Message);
                    }
                }
                if (action.Is("action|growid"))
                {
                    try
                    {
                        await peer.SendCreateGID();

                        return;
                    }
                    catch (Exception ex) { Console.WriteLine("Action|growid error! Message : " + ex.Message); }
                }
                else if (action.Is("action|store"))
                {
                    try
                    {
                        await peer.OnConsoleMessage("Store is not implemented yet!");

                        Dialog d = new Dialog();
                        // to create the dialog
                        string dialog = d.SetDefaultColor()
                                        .AddBigLabel("Store is not implemented yet!")
                                        .EndDialog("nothing", "Cancel", "Ok").Result;
                        await peer.OnDialogRequest(dialog);

                        return;
                    }
                    catch (Exception ex) { Console.WriteLine("Action|store error! Message : " + ex.Message); }
                }
                else if (action.Is("action|info"))
                {
                    try
                    {
                        if (!(peer.Data as Player).HaveGrowID)
                        {
                            await peer.SendCreateGID();

                            return;
                        }
                        int id    = -1;
                        int count = -1;
                        foreach (string to in action.Split("\n".ToCharArray()))
                        {
                            string[] infoDat = action.Split("|".ToCharArray());
                            if (infoDat.Length == 3)
                            {
                                if (infoDat[1] == "itemID")
                                {
                                    int a = Convert.ToInt32(infoDat[2]);
                                    if (a > 9279)
                                    {
                                        return;
                                        //thanks for raiter for the fix
                                    }
                                    else if (a < 0)
                                    {
                                        return;
                                    }
                                    else
                                    {
                                        id = a;
                                    }
                                }
                                if (infoDat[1] == "count")
                                {
                                    int a1 = Convert.ToInt32(infoDat[2]);
                                    if (a1 > 200)
                                    {
                                        return;
                                    }
                                    else if (a1 < 200)
                                    {
                                        return;
                                    }
                                    else
                                    {
                                        count = a1;
                                    }
                                }
                            }
                        }

                        if (id == -1 || count == -1)
                        {
                            return;
                        }
                        if (ItemsData.Count < id || id < 0)
                        {
                            return;
                        }
                        await peer.OnDialogRequest("set_default_color|`o\n\nadd_label_with_icon|big|`w" + ItemsData[id].Name +
                                                   "``|left|" + id + "|\n\nadd_spacer|small|\nadd_textbox|" +
                                                   ItemsData[id].Description +
                                                   "|left|\nadd_spacer|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|");

                        //enet_host_flush(server);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error in action|info! Message : " + ex.Message);
                    }
                }
                else if (action.Is("action|dialog_return"))
                {
                    await DialogHandler.SendDialogAsync(peer, world, action);
                }
                else if (action.Is("action|drop\n|itemID|"))
                {
                    Console.WriteLine("TODO => ACTION_DROP");
                }
                else if (action.Contains("text|"))
                {
                    try
                    {
                        if (!(peer.Data as Player).HaveGrowID)
                        {
                            await peer.SendCreateGID();

                            return;
                        }
                        await peer.SendCommands(action);
                    }
                    catch (Exception ex) { Console.WriteLine("action text error! Message : " + ex.Message); }
                }
                if (!(peer.Data as Player).InGame)
                {
                    try
                    {
                        int a = 0;
                        await peer.OnSuperMain();

                        if (LoginArray[0, 0] == "tankIDName")
                        {
                            a = 2;
                            (peer.Data as Player).TankIDName     = LoginArray[0, 1];
                            (peer.Data as Player).RawName        = LoginArray[0, 1];
                            (peer.Data as Player).DisplayName    = LoginArray[0, 1];
                            (peer.Data as Player).TankIDPassword = LoginArray[1, 1];
                            (peer.Data as Player).HaveGrowID     = true;
                        }
                        if (LoginArray[17 + a, 1].Length < 15 || LoginArray[17 + a, 1].Length > 20 ||
                            LoginArray[12 + a, 1].Length < 30 || LoginArray[12 + a, 1].Length > 38)
                        {
                            peer.DisconnectLater(0);
                        }
                        (peer.Data as Player).RequestedName = LoginArray[0 + a, 1];
                        foreach (char c in (peer.Data as Player).RequestedName)
                        {
                            if (c < 0x20 || c > 0x7A)
                            {
                                await peer.OnConsoleMessage("Bad characters detected in your name! Please remove them!");

                                peer.DisconnectLater(0);
                                return;
                            }
                        }
                        (peer.Data as Player).Mac     = LoginArray[17 + a, 1];
                        (peer.Data as Player).RID     = LoginArray[12 + a, 1];
                        (peer.Data as Player).Country = LoginArray[15 + a, 1];
                        if (!(peer.Data as Player).HaveGrowID)
                        {
                            Random r         = new Random();
                            int    randomInt = r.Next(100, 1001);
                            (peer.Data as Player).RawName     = "";
                            (peer.Data as Player).DisplayName = (peer.Data as Player).RequestedName + "_" + randomInt;
                        }
                        else
                        {
                            if (!peer.SendLogin().Result)
                            {
                                return;
                            }
                        }
                        await peer.SetHasGrowID((peer.Data as Player).TankIDName, (peer.Data as Player).TankIDPassword);
                    }
                    catch (Exception ex) { Console.WriteLine("Error occured at OnSuperMain! Message : " + ex.Message); }
                }
                if (action.Contains("action|enter_game") && (peer.Data as Player).InGame == false)
                {
                    try
                    {
                        //long joinTime = DateTimeOffset.Now.ToUnixTimeMilliseconds();
                        //if ((peer.Data as Player).LastPlayerEnter + 4000 < joinTime)
                        //{
                        //    (peer.Data as Player).LastPlayerEnter = joinTime;
                        //}
                        //else
                        //{
                        //    peer.DisconnectLater(0);
                        //    return;
                        //}
                        (peer.Data as Player).InGame = true;
                        if ((peer.Data as Player).TankIDName.Any(char.IsSymbol))
                        {
                            await peer.OnConsoleMessage("Please remove bad characters in your name!");

                            peer.DisconnectLater(0);
                            return;
                        }
                        await peer.OnConsoleMessage("Welcome to the server!");

                        await peer.SendWorldOffers();

                        await peer.UpdateClothes();

                        Inventory      inventory = new Inventory();
                        InventoryItems items     = new InventoryItems
                        {
                            ItemID    = 18,
                            ItemCount = 1
                        };
                        inventory.Items = inventory.Items.Append(items).ToArray();
                        items.ItemID    = 32;
                        items.ItemCount = 1;
                        inventory.Items = inventory.Items.Append(items).ToArray();
                        items.ItemID    = 2;
                        items.ItemCount = 200;
                        inventory.Items = inventory.Items.Append(items).ToArray();
                        await peer.SendInventory(inventory);

                        (peer.Data as Player).PlayerInventory = inventory;
                        //await peer.OnDialogRequest("set_default_color|\nadd_label|big|`9Hello!|left|420|\nadd_spacer|small|" +
                        //    "\nadd_button|nothing|`oContinue|noflags|0|0|");
                    }
                    catch (Exception ex) { Console.WriteLine("action enter_game error! Message : " + ex.Message); }
                }
                if (Encoding.ASCII.GetString(payLoad.Take(payLoad.Length - 1).Skip(4).ToArray()) == "action|refresh_item_data\n")
                {
                    try
                    {
                        if (ItemsDat != null)
                        {
                            await peer.OnConsoleMessage("`oOne moment, updating items data...");

                            peer.Send(ItemsDat, 0, ENetPacketFlags.Reliable);
                            (peer.Data as Player).Updating = true;
                            string iStr = BitConverter.ToString(ItemsDat);
                            iStr = iStr.Replace("-", "");
                            peer.DisconnectLater(0);
                        }
                    }
                    catch (Exception ex) { Console.WriteLine("refresh_item_data error! Message : " + ex.Message); }
                }
                break;

            case 3:
                try
                {
                    bool     isJoinReq = false;
                    string[] arr       = Encoding.ASCII.GetString(payLoad.Take(payLoad.Length - 1).Skip(4).ToArray()).Split("\n".ToCharArray());
                    foreach (var a in arr)
                    {
                        if (a == "")
                        {
                            continue;
                        }
                        string id  = a.Substring(0, a.IndexOf("|"));
                        string act = a.Substring(a.IndexOf("|") + 1, a.Length - a.IndexOf("|") - 1);
                        if (id == "name" && isJoinReq)
                        {
                            await peer.JoinWorld(act, 0, 0);

                            (peer.Data as Player).World = act;
                        }
                        if (id == "action")
                        {
                            if (act == "join_request")
                            {
                                isJoinReq = true;
                            }

                            if (act == "quit_to_exit")
                            {
                                await peer.SendLeave();

                                (peer.Data as Player).World = "EXIT";
                                await peer.SendWorldOffers();
                            }

                            if (act == "quit")
                            {
                                peer.DisconnectLater(0);
                            }
                        }
                    }
                }
                catch (Exception ex) { Console.WriteLine("Error at case 3 of action! Message : " + ex.Message); }
                break;

            case 4:
                byte[] tankUpdatePacket = payLoad.Skip(4).ToArray();
                if (tankUpdatePacket.Length != 0)
                {
                    try
                    {
                        var pMov = UnpackPlayerMoving(tankUpdatePacket);
                        switch (pMov.PacketType)
                        {
                        case 0:
                            (peer.Data as Player).X = (int)pMov.X;
                            (peer.Data as Player).Y = (int)pMov.Y;
                            (peer.Data as Player).IsRotatingLeft = (pMov.CharacterState & 0x10) != 0;
                            await peer.SendPData(pMov);

                            if (!(peer.Data as Player).ClothesUpdated)
                            {
                                (peer.Data as Player).ClothesUpdated = true;
                                await peer.UpdateClothes();
                            }
                            break;

                        default:
                            break;
                        }
                        var data2 = UnpackPlayerMoving(tankUpdatePacket);
                        if (data2.PacketType != 3)
                        {
                            await peer.SendPacketType(data2.PacketType, pMov, data2, world);
                        }
                        else
                        {
                            await peer.SendPacketType(data2.PacketType, pMov, data2,
                                                      world);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("Error occured in packet types! Message : " + ex.Message);
                    }
                }
                else
                {
                    Console.WriteLine("Bad Tank Packet detected!");
                }
                break;

            case 5:
                break;

            case 6:
                break;
            }
        }
Example #12
0
 unsafe bool handleGameNumber(ClientInfo client, ENetPeer* peer, ENetPacket* packet)
 {
     var world = new WorldSendGameNumber(1, client.getName());
     return PacketHandlerManager.getInstace().sendPacket(peer, world, Channel.CHL_S2C);
 }
Example #13
0
 public static extern void enet_host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet);
Example #14
0
 public TextEvent(Player player, ENetPacket packet)
 {
     Handle(player, GetText(packet.Data.ToArray()));
 }
Example #15
0
 static extern int native_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
Example #16
0
 public static extern int enet_packet_resize(ENetPacket* packet, IntPtr dataLength);
Example #17
0
 static extern int native_packet_resize(ENetPacket* packet, IntPtr dataLength);
Example #18
0
 public override int packet_resize(ENetPacket* packet, IntPtr dataLength)
 {
     return native_packet_resize(packet, dataLength);
 }
Example #19
0
        private void OnReceive(object sender, ENetPacket e)
        {
            //SendMovement();
            var peer   = sender as ENetPeer;
            var packet = e.GetPayloadCopy();

            int packetType = packet[0];

            switch (packetType)
            {
            case 3:
            case 2:
            {
                var packetData = CTextPacket.Unpack(packet);
                if (!HasLoggedIn)
                {
                    var requestedName = packetData["requestedName"];
                    var f             = packetData["f"];
                    var protocol      = packetData["protocol"];
                    var gameVersion   = packetData["game_version"];
                    var fz            = packetData["fz"];
                    var lMode         = packetData["lmode"];
                    var cBits         = packetData["cbits"];
                    var playerAge     = packetData["player_age"];
                    var gdpr          = packetData["GDPR"];
                    var hash2         = packetData["hash2"];
                    var meta          = packetData["meta"];
                    var fHash         = packetData["fhash"];
                    var rid           = packetData["rid"];
                    var platformId    = packetData["platformID"];
                    var deviceVersion = packetData["deviceVersion"];
                    var country       = packetData["country"];
                    var hash          = packetData["hash"];
                    var mac           = packetData["mac"];
                    var wk            = packetData["wk"];
                    var zf            = packetData["zf"];

                    var rnd = new Random(wk.GetHashCode());

                    Country = country;

                    NameNr      = rnd.Next(999);
                    HasLoggedIn = true;

                    AcceptLogin(requestedName, string.Empty);
                    return;
                }

                EventManager.Instance.RunEvent(EventType.TextPacket,
                                               packetData["action"],
                                               this, packetData);
            } break;

            case 4:
            {
                var(header, tankPacketData) = CTankPacket.Unpack(packet);

                switch (header.TankPacketType)
                {
                case TankPacketType.VariantList:
                    break;

                default:
                    Console.WriteLine($"Unknown TankPacket Type! {(int) header.TankPacketType}\n" +
                                      $"\tData: {BitConverter.ToString(tankPacketData).Replace("-", " ")}");
                    break;
                }
            } break;

            default:
                Console.WriteLine($"Unknown PacketType! {packetType}\n" +
                                  $"\tData: {BitConverter.ToString(packet, 4).Replace("-", " ")}");
                break;
            }
        }
Example #20
0
 public TankEvent(Player player, ENetPacket packet)
 {
     Handle(player, TankPacket.Unpack(packet.Data.ToArray()), Database.GetWorld(player.CurrentWorld).Result);
 }
Example #21
0
        public string HandlePacketFromClient(ref ENetPeer peer, ENetPacket packet) // Why string? Oh yeah, it's the best thing to also return a string response for anything you want!
        {
            if (peer.IsNull)
            {
                return("");
            }
            if (peer.State != ENetPeerState.Connected)
            {
                return("");
            }
            if (Proxyhelper.realPeer.IsNull)
            {
                return("");
            }
            if (Proxyhelper.realPeer.State != ENetPeerState.Connected)
            {
                return("");
            }

            bool respondToBotPeers = true;

            byte[] data = packet.Data.ToArray();

            string log = string.Empty;



            switch ((NetTypes.NetMessages)data[0])
            {
            case NetTypes.NetMessages.GENERIC_TEXT:
                string str = GetProperGenericText(data);

                if (str.StartsWith("action|"))
                {
                    string actionExecuted = str.Substring(7, str.Length - 7);
                    string inputPH        = "input\n|text|";
                    if (actionExecuted.StartsWith("enter_game"))
                    {
                        respondToBotPeers = true;
                        if (Proxyhelper.globalUserData.blockEnterGame)
                        {
                            return("Blocked enter_game packet!");
                        }
                        enteredGame = true;
                    }
                    else if (actionExecuted.StartsWith(inputPH))
                    {
                        string text = actionExecuted.Substring(inputPH.Length);

                        if (text.Length > 0)
                        {
                            if (text.StartsWith("/"))     // bAd hAcK - but also lazy, so i'll be doing this.
                            {
                                switch (text)
                                {
                                case "/banworld":
                                {
                                    banEveryoneInWorld();
                                    return("called /banworld, attempting to ban everyone who is in world (requires admin/owner)");
                                }
                                break;

                                default:
                                    break;
                                }
                            }
                        }
                    }
                }
                else
                {
                    // for (int i = 0; i < 1000; i++) packetSender.SendPacket(2, "action|refresh_item_data\n", MainForm.realPeer);
                    respondToBotPeers = false;
                    string[] lines = str.Split('\n');

                    string tankIDName = "";
                    foreach (string line in lines)
                    {
                        string[] lineToken = line.Split('|');
                        if (lineToken.Length != 2)
                        {
                            continue;
                        }
                        switch (lineToken[0])
                        {
                        case "tankIDName":
                            tankIDName = lineToken[1];
                            break;

                        case "tankIDPass":
                            Proxyhelper.globalUserData.tankIDPass = lineToken[1];
                            break;

                        case "requestedName":
                            Proxyhelper.globalUserData.requestedName = lineToken[1];
                            break;

                        case "token":
                            Proxyhelper.globalUserData.token = int.Parse(lineToken[1]);
                            break;

                        case "user":
                            Proxyhelper.globalUserData.userID = int.Parse(lineToken[1]);
                            break;

                        case "lmode":
                            Proxyhelper.globalUserData.lmode = int.Parse(lineToken[1]);
                            break;
                        }
                    }
                    Proxyhelper.globalUserData.tankIDName = tankIDName;

                    bool hasAcc = false;

                    packetSender.SendPacket((int)NetTypes.NetMessages.GENERIC_TEXT, Proxyhelper.CreateLogonPacket(), Proxyhelper.realPeer);
                    return("Sent logon packet!");    // handling logon over proxy
                }
                break;

            case NetTypes.NetMessages.GAME_MESSAGE:
                string str2 = GetProperGenericText(data);

                if (str2.StartsWith("action|"))
                {
                    string actionExecuted = str2.Substring(7);
                    if (actionExecuted.StartsWith("quit") && !actionExecuted.StartsWith("quit_to_exit"))
                    {
                        // super multibotting will not mirror all packets in here (the "quit" action), cuz i found it unnecessary, although, you can enable that by pasting the code that does it.
                        respondToBotPeers = true;
                        Proxyhelper.globalUserData.token          = -1;
                        Proxyhelper.globalUserData.Growtopia_IP   = Proxyhelper.globalUserData.Growtopia_Master_IP;
                        Proxyhelper.globalUserData.Growtopia_Port = Proxyhelper.globalUserData.Growtopia_Master_Port;

                        if (Proxyhelper.realPeer != null)
                        {
                            if (!Proxyhelper.realPeer.IsNull)
                            {
                                if (Proxyhelper.realPeer.State != ENetPeerState.Disconnected)
                                {
                                    Proxyhelper.realPeer.Disconnect(0);
                                }
                            }
                        }
                        if (Proxyhelper.proxyPeer != null)
                        {
                            if (!Proxyhelper.proxyPeer.IsNull)
                            {
                                if (Proxyhelper.proxyPeer.State == ENetPeerState.Connected)
                                {
                                    Proxyhelper.proxyPeer.Disconnect(0);
                                }
                            }
                        }
                    }
                    else if (actionExecuted.StartsWith("join_request\nname|"))     // ghetto fetching of worldname
                    {
                        string[] rest          = actionExecuted.Substring(18).Split('\n');
                        string   joinWorldName = rest[0];
                        Console.WriteLine($"Joining world {joinWorldName}...");
                    }
                }
                break;

            case NetTypes.NetMessages.GAME_PACKET:
            {
                TankPacket p = TankPacket.UnpackFromPacket(data);

                switch ((NetTypes.PacketTypes)(byte) p.PacketType)
                {
                case NetTypes.PacketTypes.APP_INTEGRITY_FAIL:                                             /*rn definitely just blocking autoban packets,
                                                                                                           * usually a failure of an app integrity is never good
                                                                                                           * and usually used for security stuff*/
                    return("Possible autoban packet with id (25) from your GT Client has been blocked."); // remember, returning anything will interrupt sending this packet. To Edit packets, load/parse them and you may just resend them like normally after fetching their bytes.

                case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE:
                    if (p.PunchX > 0 || p.PunchY > 0)
                    {
                        Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (PROXY): PunchX/PunchY detected, pX: " + p.PunchX.ToString() + " pY: " + p.PunchY.ToString() + "\n");
                    }
                    Proxyhelper.globalUserData.isFacingSwapped = IsBitSet(p.CharacterState, 4);

                    worldMap.player.X = (int)p.X;
                    worldMap.player.Y = (int)p.Y;
                    break;

                case NetTypes.PacketTypes.PING_REPLY:
                {
                    //SpoofedPingReply(p);
                    return("Blocked ping reply!");
                }

                case NetTypes.PacketTypes.TILE_CHANGE_REQ:
                    respondToBotPeers = true;

                    if (p.MainValue == 32)
                    {
                        /*MessageBox.Show("Log of potentially wanted received GAME_PACKET Data:" +
                         * "\npackettype: " + data[4].ToString() +
                         * "\npadding byte 1|2|3: " + data[5].ToString() + "|" + data[6].ToString() + "|" + data[7].ToString() +
                         * "\nnetID: " + p.NetID +
                         * "\nsecondnetid: " + p.SecondaryNetID +
                         * "\ncharacterstate (prob 8): " + p.CharacterState +
                         * "\nwaterspeed / offs 16: " + p.Padding +
                         * "\nmainval: " + p.MainValue +
                         * "\nX|Y: " + p.X + "|" + p.Y +
                         * "\nXSpeed: " + p.XSpeed +
                         * "\nYSpeed: " + p.YSpeed +
                         * "\nSecondaryPadding: " + p.SecondaryPadding +
                         * "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY);*/

                        Proxyhelper.globalUserData.lastWrenchX = (short)p.PunchX;
                        Proxyhelper.globalUserData.lastWrenchY = (short)p.PunchY;
                    }
                    else if (p.MainValue == 18 && Proxyhelper.globalUserData.redDamageToBlock)
                    {
                        // playingo
                        p.SecondaryPadding = -1;
                        p.ExtDataMask     |= 1 << 27;         // 28
                        p.Padding          = 1;
                        packetSender.SendPacketRaw(4, p.PackForSendingRaw(), Proxyhelper.realPeer);
                        return("");
                    }
                    break;

                case NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ:             // just incase, to keep better track of items incase something goes wrong
                    worldMap.dropped_ITEMUID = p.MainValue;
                    if (Proxyhelper.globalUserData.blockCollecting)
                    {
                        return("");
                    }
                    break;

                default:
                    //MainForm.LogText += ("[" + DateTime.UtcNow + "] (CLIENT): Got Packet Type: " + p.PacketType.ToString() + "\n");
                    break;
                }

                if (data[4] > 23)
                {
                    log = $"(CLIENT) Log of potentially wanted received GAME_PACKET Data:" +
                          "\npackettype: " + data[4].ToString() +
                          "\npadding byte 1|2|3: " + data[5].ToString() + "|" + data[6].ToString() + "|" + data[7].ToString() +
                          "\nnetID: " + p.NetID +
                          "\nsecondnetid: " + p.SecondaryNetID +
                          "\ncharacterstate (prob 8): " + p.CharacterState +
                          "\nwaterspeed / offs 16: " + p.Padding +
                          "\nmainval: " + p.MainValue +
                          "\nX|Y: " + p.X + "|" + p.Y +
                          "\nXSpeed: " + p.XSpeed +
                          "\nYSpeed: " + p.YSpeed +
                          "\nSecondaryPadding: " + p.SecondaryPadding +
                          "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY;
                }
            }

            break;

            case NetTypes.NetMessages.TRACK:
                return("Packet with messagetype used for tracking was blocked!");

            case NetTypes.NetMessages.LOG_REQ:
                return("Log request packet from client was blocked!");

            default:
                break;
            }

            packetSender.SendData(data, Proxyhelper.realPeer);

            return(log);
        }
Example #22
0
 public override void packet_destroy(ENetPacket* packet)
 {
     native_packet_destroy(packet);
 }
Example #23
0
 public static void enet_host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet)
 {
     Platform.host_broadcast(host, channelID, packet);
 }
Example #24
0
 static extern void native_packet_destroy(ENetPacket* packet);
Example #25
0
 public abstract void host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet);
Example #26
0
 public override int peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet)
 {
     return native_peer_send(peer, channelID, packet);
 }
Example #27
0
 public static void enet_packet_destroy(ENetPacket* packet)
 {
     Platform.packet_destroy(packet);
 }
Example #28
0
 public override void host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet)
 {
     native_host_broadcast(host, channelID, packet);
 }
Example #29
0
 public static int enet_packet_resize(ENetPacket* packet, IntPtr dataLength)
 {
     return Platform.packet_resize(packet, dataLength);
 }
Example #30
0
 public static extern int enet_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
Example #31
0
 public abstract void packet_destroy(ENetPacket* packet);
Example #32
0
 public static extern void enet_packet_destroy(ENetPacket* packet);
Example #33
0
 public abstract int packet_resize(ENetPacket* packet, IntPtr dataLength);
Example #34
0
        private void Peer_OnReceive_Client(object sender, ENetPacket e)
        {
            try
            {
                // this is a specific, external client made only for the purpose of using the TRACK packet for our gains/advantage in order to check all accounts quick and efficiently.
                byte[] packet = e.GetPayloadFinal();
                Console.WriteLine("RECEIVE TYPE: " + packet[0].ToString());
                updatestatus("Received:" + packet[0].ToString(), 1);
                switch (packet[0])
                {
                case 1:     // HELLO server packet.
                {
                    PacketSending packetSender = new PacketSending();
                    packetSender.SendPacket(2, CreateLogonPacket(animaTextBox4.Text, animaTextBox3.Text), eNetP);
                    updatestatus("Loginning: " + packet[0].ToString(), 1);
                    break;
                }

                case 2:
                case 3:
                {
                    Console.WriteLine("[ACCOUNT-CHECKER] TEXT PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray()));
                    string game = Encoding.ASCII.GetString(packet.Skip(4).ToArray());
                    if (game.Contains("suspend"))
                    {
                        updatestatus("Account Suspended!", 3);
                        eNetP.Disconnect(0);
                    }
                    if (game.Contains("ban"))
                    {
                        updatestatus("Account Banned!", 3);
                        eNetP.Disconnect(0);
                    }
                    if (game.Contains("maint"))
                    {
                        updatestatus("Growtopia servers f**k!", 3);
                        eNetP.Disconnect(0);
                    }
                    if (game.Contains("play.sfx"))
                    {
                        updatestatus("Account Bug!", 3);
                        eNetP.Disconnect(0);
                    }
                    if (game.Contains("UPDATE REQUIRED"))
                    {
                        game.Replace("msg|`4", "");
                        game = Regex.Match(game, @"\d+").Value;
                        game = game.Insert(1, ".");
                        ACCOUNTCHECK.Properties.Settings.Default.gamever = game;
                        ACCOUNTCHECK.Properties.Settings.Default.Save();
                        ACCOUNTCHECK.Properties.Settings.Default.gamever = game_version;
                        Console.WriteLine("fuckchecker:" + game);
                        updatestatus("Restart need!", 1);
                    }
                    if (game.Contains("password is wrong"))
                    {
                        updatestatus("Wrong Password!", 3);
                        eNetP.Disconnect(0);
                    }        //Incorrect logon token..
                    if (game.Contains("Incorrect logon token"))
                    {
                        VariantList         ad         = new VariantList();
                        byte[]              tankPacket = ad.get_struct_data(packet);
                        VariantList.VarList vList      = ad.GetCall(ad.get_extended_data(tankPacket));
                        vList.netID = BitConverter.ToInt32(tankPacket, 4);         // add netid
                        vList.delay = BitConverter.ToUInt32(tankPacket, 20);       // add keep track of delay modifier
                        string ip = (string)vList.functionArgs[4];

                        if (ip.Contains("|"))
                        {
                            ip = ip.Substring(0, ip.IndexOf("|"));
                        }

                        int port = (int)vList.functionArgs[1];
                        userID         = (int)vList.functionArgs[3];
                        token          = (int)vList.functionArgs[2];
                        lmode          = (int)vList.functionArgs[5];
                        Growtopia_IP   = ip;
                        Growtopia_Port = port;
                        ConnectCurrent();
                        updatestatus("Peer Reset Success!", 1);
                        Thread.Sleep(10);
                    }        //Incorrect logon token..
                    break;
                }

                case 4:
                {
                    VariantList ad         = new VariantList();
                    byte[]      tankPacket = ad.get_struct_data(packet);
                    if (tankPacket[0] == 1)
                    {
                        VariantList.VarList vList = ad.GetCall(ad.get_extended_data(tankPacket));
                        vList.netID = BitConverter.ToInt32(tankPacket, 4);         // add netid
                        vList.delay = BitConverter.ToUInt32(tankPacket, 20);       // add keep track of delay modifier

                        // Console.WriteLine(VarListFetched.FunctionName);
                        if (vList.FunctionName == "OnSendToServer")
                        {
                            string ip = (string)vList.functionArgs[4];

                            if (ip.Contains("|"))
                            {
                                ip = ip.Substring(0, ip.IndexOf("|"));
                            }

                            int port = (int)vList.functionArgs[1];
                            userID         = (int)vList.functionArgs[3];
                            token          = (int)vList.functionArgs[2];
                            lmode          = (int)vList.functionArgs[5];
                            Growtopia_IP   = ip;
                            Growtopia_Port = port;
                            ConnectCurrent();
                            updatestatus("Peer Reset Success!", 1);
                        }
                        // variant call, just rn used for subserver switching
                    }
                    break;
                }

                case (byte)NetTypes.NetMessages.TRACK:     // TRACK packet.
                {
                    Console.WriteLine("[ACCOUNT-CHECKER] TRACK PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray()));
                    File.AppendAllText("s.temp", Encoding.ASCII.GetString(packet.Skip(4).ToArray()));
                    Growtopia_Port = Growtopia_Master_Port;         // todo auto get port
                    Growtopia_IP   = Growtopia_Master_IP;
                    PacketSending asd = new PacketSending();
                    asd.SendPacket(2, "action|enter_game", eNetP);

                    if (Encoding.ASCII.GetString(packet.Skip(4).ToArray()).Contains("Gem"))
                    {
                        File.AppendAllText("d.temp", Encoding.ASCII.GetString(packet.Skip(4).ToArray()));
                        eNetP.Disconnect(0);
                    }
                    break;
                }

                default:
                    break;
                }
            }
            catch
            {
            }
        }
Example #35
0
 public static int enet_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet)
 {
     return Platform.peer_send(peer, channelID, packet);
 }
Example #36
0
 public static void Peer_OnReceive_Client(object sender, ENetPacket e)
 {
     ENetPeer peer = (ENetPeer)sender;
     string   str  = messageHandler.HandlePacketFromServer(ref peer, e);
 }
Example #37
0
 static extern void native_host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet);
        private static void Peer_OnReceive_Client(object sender, ENetPacket e)
        {
            try
            {
                // this is a specific, external client made only for the purpose of using the TRACK packet for our gains/advantage in order to check all accounts quick and efficiently.
                byte[] packet = e.GetPayloadFinal();
                Console.WriteLine("RECEIVE TYPE: " + packet[0].ToString());
                switch (packet[0])
                {
                case 1:     // HELLO server packet.
                {
                    string username = accountsToCheck[checkCurrentIndex].GrowID;
                    string pass     = accountsToCheck[checkCurrentIndex].password;
                    // todo add mac optionally, will do that incases aap bypass gets fixed.
                    Console.WriteLine("[ACCOUNT-CHECKER] Logging on " + username + "...");

                    packetSender.SendPacket(2, MainForm.CreateLogonPacket(username, pass), g_Peer);
                    break;
                }

                case 2:
                case 3:
                {
                    Console.WriteLine("[ACCOUNT-CHECKER] TEXT PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray()));
                    break;
                }

                case 4:
                {
                    byte[] tankPacket = VariantList.get_struct_data(packet);
                    if (tankPacket[0] == 1)
                    {
                        VariantList.VarList vList = VariantList.GetCall(VariantList.get_extended_data(tankPacket));
                        vList.netID = BitConverter.ToInt32(tankPacket, 4);         // add netid
                        vList.delay = BitConverter.ToUInt32(tankPacket, 20);       // add keep track of delay modifier

                        // Console.WriteLine(VarListFetched.FunctionName);
                        if (vList.FunctionName == "OnSendToServer")
                        {
                            string ip = (string)vList.functionArgs[4];

                            if (ip.Contains("|"))
                            {
                                ip = ip.Substring(0, ip.IndexOf("|"));
                            }

                            int port   = (int)vList.functionArgs[1];
                            int userID = (int)vList.functionArgs[3];
                            int token  = (int)vList.functionArgs[2];
                            int lmode  = (int)vList.functionArgs[5];
                            Growtopia_IP   = ip;
                            Growtopia_Port = port;
                            ConnectCurrent();
                        }
                        // variant call, just rn used for subserver switching
                    }
                    break;
                }

                case (byte)NetTypes.NetMessages.TRACK:     // TRACK packet.
                {
                    Console.WriteLine("[ACCOUNT-CHECKER] TRACK PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray()));
                    checkCurrentIndex++;
                    Console.WriteLine("[ACCOUNT-CHECKER] +1 account checked, disconnecting and moving onto the next one.");
                    Growtopia_Port = MainForm.Growtopia_Master_Port;         // todo auto get port
                    Growtopia_IP   = MainForm.Growtopia_Master_IP;
                    ConnectCurrent();
                    break;
                }

                default:
                    break;
                }
            }
            catch
            {
            }
        }
        public bool handlePacket(ENetPeer* peer, ENetPacket* packet, Channel channelID)
        {
            if ((int)packet->dataLength >= 8)
                if (game.getPeerInfo(peer) != null)
                    BlowFishCS.BlowFishCS.Decrypt1(game.getBlowfish(), (byte*)packet->data, new IntPtr((int)packet->dataLength - ((int)packet->dataLength % 8)));

            var data = new byte[(int)packet->dataLength];
            Marshal.Copy(packet->data, data, 0, data.Length);

            return handlePacket(peer, data, channelID);
        }
Example #40
0
 public void OnReceive(ENetPeer peer, ENetPacket packet, byte channelId)
 {
     OnReceiveCalled = true;
 }
Example #41
0
        public string HandlePacketFromClient(ENetPacket packet) // Why string? Oh yeah, it's the best thing to also return a string response for anything you want!
        {
            if (MainForm.proxyPeer == null)
            {
                return("");
            }
            if (MainForm.proxyPeer.State != ENetPeerState.Connected)
            {
                return("");
            }
            if (MainForm.realPeer == null)
            {
                return("");
            }
            if (MainForm.realPeer.State != ENetPeerState.Connected)
            {
                return("");
            }

            byte[] data = packet.GetPayloadFinal();

            switch ((NetTypes.NetMessages)data[0])
            {
            case NetTypes.NetMessages.GENERIC_TEXT:
                string str = GetProperGenericText(data);

                MainForm.LogText += ("[" + DateTime.UtcNow + "] (CLIENT): String package fetched:\n" + str + "\n");
                if (str.StartsWith("action|"))
                {
                    string actionExecuted = str.Substring(7, str.Length - 7);
                    string inputPH        = "input\n|text|";
                    if (actionExecuted.StartsWith("enter_game"))
                    {
                        if (MainForm.blockEnterGame)
                        {
                            return("Blocked enter_game packet!");
                        }
                        enteredGame = true;
                    }
                    else if (actionExecuted.StartsWith(inputPH))
                    {
                        string text = actionExecuted.Substring(inputPH.Length);

                        if (text.Length > 0)
                        {
                            if (text.StartsWith("/"))     // bAd hAcK - but also lazy, so i'll be doing this.
                            {
                                switch (text)
                                {
                                case "/banworld":
                                {
                                    banEveryoneInWorld();
                                    return("called /banworld, attempting to ban everyone who is in world (requires admin/owner)");
                                }
                                break;

                                default:
                                    break;
                                }
                            }
                        }
                    }
                }
                else
                {
                    // for (int i = 0; i < 1000; i++) packetSender.SendPacket(2, "action|refresh_item_data\n", MainForm.realPeer);
                    string[] lines = str.Split('\n');

                    string tankIDName = "";
                    foreach (string line in lines)
                    {
                        string[] lineToken = line.Split('|');
                        if (lineToken.Length != 2)
                        {
                            continue;
                        }
                        switch (lineToken[0])
                        {
                        case "tankIDName":
                            tankIDName = lineToken[1];
                            break;

                        case "tankIDPass":
                            MainForm.tankIDPass = lineToken[1];
                            break;

                        case "requestedName":
                            MainForm.requestedName = lineToken[1];
                            break;
                        }
                    }
                    MainForm.tankIDName = tankIDName;

                    bool hasAcc = false;

                    packetSender.SendPacket((int)NetTypes.NetMessages.GENERIC_TEXT, MainForm.CreateLogonPacket(), MainForm.realPeer);
                    return("Sent logon packet!");    // handling logon over proxy
                }
                break;

            case NetTypes.NetMessages.GAME_MESSAGE:
                string str2 = GetProperGenericText(data);
                MainForm.LogText += ("[" + DateTime.UtcNow + "] (CLIENT): String package fetched:\n" + str2 + "\n");
                if (str2.StartsWith("action|"))
                {
                    string actionExecuted = str2.Substring(7, str2.Length - 7);
                    if (actionExecuted == "quit")
                    {
                        MainForm.token          = 0;
                        MainForm.Growtopia_IP   = MainForm.Growtopia_Master_IP;
                        MainForm.Growtopia_Port = MainForm.Growtopia_Master_Port;

                        if (MainForm.realPeer != null && MainForm.proxyPeer != null)
                        {
                            if (MainForm.realPeer.State == ENetPeerState.Connected)
                            {
                                MainForm.realPeer.Disconnect(0);
                            }
                            if (MainForm.proxyPeer.State == ENetPeerState.Connected)
                            {
                                MainForm.proxyPeer.Disconnect(0);
                            }
                        }
                    }
                }
                break;

            case NetTypes.NetMessages.GAME_PACKET:
            {
                TankPacket p = TankPacket.UnpackFromPacket(data);
                switch ((NetTypes.PacketTypes)(byte) p.PacketType)
                {
                case NetTypes.PacketTypes.APP_INTEGRITY_FAIL:                                             /*rn definitely just blocking autoban packets,
                                                                                                           * usually a failure of an app integrity is never good
                                                                                                           * and usually used for security stuff*/
                    return("Possible autoban packet with id (25) from your GT Client has been blocked."); // remember, returning anything will interrupt sending this packet. To Edit packets, load/parse them and you may just resend them like normally after fetching their bytes.

                case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE:
                    if (p.PunchX > 0 || p.PunchY > 0)
                    {
                        MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): PunchX/PunchY detected, pX: " + p.PunchX.ToString() + " pY: " + p.PunchY.ToString() + "\n");
                    }
                    MainForm.isFacingSwapped = IsBitSet(p.CharacterState, 4);

                    worldMap.player.X = (int)p.X;
                    worldMap.player.Y = (int)p.Y;
                    break;

                case NetTypes.PacketTypes.TILE_CHANGE_REQ:
                    if (p.MainValue == 18 && MainForm.redDamageToBlock)
                    {
                        // playingo
                        p.SecondaryPadding = -1;
                        p.ExtDataMask     |= 1 << 27;
                        p.Padding          = 1;
                        packetSender.SendPacketRaw(4, p.PackForSendingRaw(), MainForm.realPeer);
                        return("");
                    }
                    break;

                case NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ:             // just incase, to keep better track of items incase something goes wrong
                    worldMap.dropped_ITEMUID = p.MainValue;
                    if (MainForm.blockCollecting)
                    {
                        return("");
                    }
                    break;

                default:
                    break;
                }
            }
            break;

            case NetTypes.NetMessages.TRACK:
                return("Packet with messagetype used for tracking was blocked!");

            case NetTypes.NetMessages.LOG_REQ:
                return("Log request packet from client was blocked!");

            default:
                break;
            }

            packetSender.SendData(data, MainForm.realPeer, ENetPacketFlags.Reliable);
            return(string.Empty);
        }
Example #42
-1
        public string HandlePacketFromServer(ENetPacket packet)
        {
            if (MainForm.proxyPeer == null)
            {
                return("");
            }
            if (MainForm.proxyPeer.State != ENetPeerState.Connected)
            {
                return("");
            }
            if (MainForm.realPeer == null)
            {
                return("");
            }
            if (MainForm.realPeer.State != ENetPeerState.Connected)
            {
                return("");
            }

            byte[] data = packet.GetPayloadFinal();

            //else
            //{
            //return "_none_";
            //}


            NetTypes.NetMessages msgType = (NetTypes.NetMessages)data[0]; // more performance.
            switch (msgType)
            {
            case NetTypes.NetMessages.SERVER_HELLO:

                MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): Initial logon accepted." + "\n");
                break;

            case NetTypes.NetMessages.GAME_MESSAGE:

                string str = GetProperGenericText(data);
                MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A game_msg packet was sent: " + str + "\n");


                if (str.Contains("Server requesting that you re-logon..."))
                {
                    MainForm.token  = 0;
                    MainForm.doorid = "";
                    GamePacketProton gp = new GamePacketProton();
                    gp.AppendString("OnConsoleMessage");
                    gp.AppendString("`6(PROXY) `4Handling server relogon request automatically...");
                    packetSender.SendData(gp.GetBytes(), MainForm.proxyPeer);

                    SwitchServers(MainForm.Growtopia_Master_IP, MainForm.Growtopia_Master_Port);

                    return("Server forces logon request, switching server automatically so user does not have to cancel to login menu and reconnect.");
                }

                break;

            case NetTypes.NetMessages.GAME_PACKET:

                byte[] tankPacket = VariantList.get_struct_data(data);
                if (tankPacket == null)
                {
                    break;
                }

                byte tankPacketType             = tankPacket[0];
                NetTypes.PacketTypes packetType = (NetTypes.PacketTypes)tankPacketType;
                if (MainForm.logallpackettypes)
                {
                    GamePacketProton gp = new GamePacketProton();
                    gp.AppendString("OnConsoleMessage");
                    gp.AppendString("`6(PROXY) `wPacket TYPE: " + tankPacketType.ToString());
                    packetSender.SendData(gp.GetBytes(), MainForm.proxyPeer);
                }

                switch (packetType)
                {
                case NetTypes.PacketTypes.INVENTORY_STATE:
                {
                    worldMap.player.SerializePlayerInventory(VariantList.get_extended_data(tankPacket));

                    /*foreach (InventoryItem item in worldMap.player.inventory.items)
                     * {
                     *  ItemDatabase.ItemDefinition itemDef = ItemDatabase.GetItemDef(item.itemID);
                     *  MessageBox.Show("ITEM NAME: " + itemDef.itemName + " AMOUNT: " + item.amount);
                     * }*/
                    break;
                }

                case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE:
                {
                    TankPacket p = TankPacket.UnpackFromPacket(data);
                    foreach (Player pl in worldMap.players)
                    {
                        if (pl.netID == p.NetID)
                        {
                            pl.X = (int)p.X;
                            pl.Y = (int)p.Y;
                            break;
                        }
                    }
                    break;
                }

                case NetTypes.PacketTypes.TILE_CHANGE_REQ:
                {
                    TankPacket p = TankPacket.UnpackFromPacket(data);

                    // world tile map in proxy, by playingo :)
                    if (worldMap == null)
                    {
                        MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n");
                        break;
                    }
                    byte   tileX = (byte)p.PunchX;
                    byte   tileY = (byte)p.PunchY;
                    ushort item  = (ushort)p.MainValue;


                    if (tileX >= worldMap.width)
                    {
                        break;
                    }
                    else if (tileY >= worldMap.height)
                    {
                        break;
                    }

                    ItemDatabase.ItemDefinition itemDef = ItemDatabase.GetItemDef(item);

                    if (ItemDatabase.isBackground(item))
                    {
                        worldMap.tiles[tileX + (tileY * worldMap.width)].bg = item;
                    }
                    else
                    {
                        worldMap.tiles[tileX + (tileY * worldMap.width)].fg = item;
                    }

                    break;
                }

                case NetTypes.PacketTypes.CALL_FUNCTION:
                    VariantList.VarList VarListFetched = VariantList.GetCall(VariantList.get_extended_data(tankPacket));
                    VarListFetched.netID = BitConverter.ToInt32(tankPacket, 4);         // add netid
                    VarListFetched.delay = BitConverter.ToUInt32(tankPacket, 20);       // add keep track of delay modifier

                    int    netID   = OperateVariant(VarListFetched);
                    string argText = string.Empty;

                    for (int i = 0; i < VarListFetched.functionArgs.Count(); i++)
                    {
                        argText += " [" + i.ToString() + "]: " + (string)VarListFetched.functionArgs[i].ToString();
                    }

                    MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A function call was requested, see log infos below:\nFunction Name: " + VarListFetched.FunctionName + " parameters: " + argText + " \n");

                    if (VarListFetched.FunctionName == "OnSendToServer")
                    {
                        return("Server switching forced, not continuing as Proxy Client has to deal with this.");
                    }
                    if (VarListFetched.FunctionName == "onShowCaptcha")
                    {
                        return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side.");
                    }
                    if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("captcha"))
                    {
                        return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side.");
                    }
                    if (VarListFetched.FunctionName == "OnSetPos" && MainForm.ignoreonsetpos && netID == worldMap.netID)
                    {
                        return("Ignored position set by server, may corrupt doors but is used so it wont set back. (CAN BE BUGGY WITH SLOW CONNECTIONS)");
                    }
                    if (VarListFetched.FunctionName == "OnSpawn" && netID == -2)
                    {
                        if (MainForm.unlimitedZoom)
                        {
                            return("Modified OnSpawn for unlimited zoom (mstate|1)");        // only doing unlimited zoom and not unlimited punch/place to be sure that no bans occur due to this. If you wish to use unlimited punching/placing as well, change the smstate in OperateVariant function instead.
                        }
                    }

                    break;

                case NetTypes.PacketTypes.SET_CHARACTER_STATE:
                {
                    /*TankPacket p = TankPacket.UnpackFromPacket(data);
                     *
                     * return "Log of potentially wanted received GAME_PACKET Data:" +
                     * "\nnetID: " + p.NetID +
                     * "\nsecondnetid: " + p.SecondaryNetID +
                     * "\ncharacterstate (prob 8): " + p.CharacterState +
                     * "\nwaterspeed / offs 16: " + p.Padding +
                     * "\nmainval: " + p.MainValue +
                     * "\nX|Y: " + p.X + "|" + p.Y +
                     * "\nXSpeed: " + p.XSpeed +
                     * "\nYSpeed: " + p.YSpeed +
                     * "\nSecondaryPadding: " + p.SecondaryPadding +
                     * "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY;*/
                    break;
                }

                case NetTypes.PacketTypes.PING_REQ:
                    SpoofedPingReply();
                    break;

                case NetTypes.PacketTypes.LOAD_MAP:
                    if (MainForm.LogText.Length >= 32678)
                    {
                        MainForm.LogText = string.Empty;
                    }

                    worldMap = worldMap.LoadMap(tankPacket);
                    worldMap.player.didCharacterStateLoad = false;
                    worldMap.player.didClothingLoad       = false;
                    if (MainForm.pForm.IsHandleCreated)
                    {
                        Action action = () =>
                        {
                            MainForm.pForm.Text = "All players in " + worldMap.currentWorld;

                            foreach (Button btn in MainForm.pForm.playerBox.Controls)
                            {
                                btn.Dispose();
                            }

                            MainForm.pForm.playerBox.Controls.Clear();
                        };

                        MainForm.pForm.Invoke(action);
                    }


                    MainForm.realPeer.Timeout(1000, 7000, 11000);

                    break;

                case NetTypes.PacketTypes.MODIFY_ITEM_OBJ:
                {
                    TankPacket p = TankPacket.UnpackFromPacket(data);
                    if (p.NetID == -1)
                    {
                        if (worldMap == null)
                        {
                            MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n");
                            break;
                        }

                        worldMap.dropped_ITEMUID++;

                        DroppedObject dItem = new DroppedObject();
                        dItem.id        = p.MainValue;
                        dItem.itemCount = data[16];
                        dItem.x         = p.X;
                        dItem.y         = p.Y;
                        dItem.uid       = worldMap.dropped_ITEMUID;
                        worldMap.droppedItems.Add(dItem);

                        if (MainForm.cheat_magplant)
                        {
                            TankPacket p2 = new TankPacket();
                            p2.PacketType = (int)NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ;
                            p2.NetID      = p.NetID;
                            p2.X          = (int)p.X;
                            p2.Y          = (int)p.Y;
                            p2.MainValue  = dItem.uid;

                            packetSender.SendPacketRaw((int)NetTypes.NetMessages.GAME_PACKET, p2.PackForSendingRaw(), MainForm.realPeer);
                            //return "Blocked dropped packet due to magplant hack (auto collect/pickup range) tried to collect it instead, infos of dropped item => uid was " + worldMap.dropped_ITEMUID.ToString() + " id: " + p.MainValue.ToString();
                        }
                    }
                }
                break;

                default:
                    break;
                }
                break;

            case NetTypes.NetMessages.TRACK:
            case NetTypes.NetMessages.LOG_REQ:
            case NetTypes.NetMessages.ERROR:
                return("Blocked track/logreq/error message type by server.");

            default:
                //return "(SERVER): An unknown event occured. Message Type: " + msgType.ToString() + "\n";
                break;
            }

            packetSender.SendData(data, MainForm.proxyPeer, ENetPacketFlags.Reliable);
            if (msgType == NetTypes.NetMessages.GAME_PACKET && data[4] > 39) // customizable on which packets you wanna log, for speed im just gonna do this!
            {
                TankPacket p           = TankPacket.UnpackFromPacket(data);
                uint       extDataSize = BitConverter.ToUInt32(data, 56);
                byte[]     actualData  = data.Skip(4).Take(56).ToArray();
                byte[]     extData     = data.Skip(60).ToArray();

                string extDataStr      = "";
                string extDataStrShort = "";
                string extDataString   = Encoding.UTF8.GetString(extData);
                for (int i = 0; i < extDataSize; i++)
                {
                    //ushort pos = BitConverter.ToUInt16(extData, i);
                    extDataStr += extData[i].ToString() + "|";
                }


                return("Log of potentially wanted received GAME_PACKET Data:" +
                       "\npackettype: " + actualData[0].ToString() +
                       "\npadding byte 1|2|3: " + actualData[1].ToString() + "|" + actualData[2].ToString() + "|" + actualData[3].ToString() +
                       "\nnetID: " + p.NetID +
                       "\nsecondnetid: " + p.SecondaryNetID +
                       "\ncharacterstate (prob 8): " + p.CharacterState +
                       "\nwaterspeed / offs 16: " + p.Padding +
                       "\nmainval: " + p.MainValue +
                       "\nX|Y: " + p.X + "|" + p.Y +
                       "\nXSpeed: " + p.XSpeed +
                       "\nYSpeed: " + p.YSpeed +
                       "\nSecondaryPadding: " + p.SecondaryPadding +
                       "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY +
                       "\nExtended Packet Data Length: " + extDataSize.ToString() +
                       "\nExtended Packet Data:\n" + extDataStr + "\n");

                return(string.Empty);
            }
            else
            {
                return(string.Empty);
            }
        }
Example #43
-1
        public string HandlePacketFromServer(ref ENetPeer peer, ENetPacket packet)
        {
            if (Proxyhelper.proxyPeer.IsNull)
            {
                return("HandlePacketFromServer() -> Proxy peer is null!");
            }
            if (Proxyhelper.proxyPeer.State != ENetPeerState.Connected)
            {
                return($"HandlePacketFromServer() -> proxyPeer is not connected: state = {Proxyhelper.proxyPeer.State}");
            }
            if (peer.IsNull)
            {
                return("HandlePacketFromServer() -> peer.IsNull is true!");
            }
            if (peer.State != ENetPeerState.Connected)
            {
                return("HandlePacketFromServer() -> peer.State was not ENetPeerState.Connected!");
            }

            byte[] data = packet.Data.ToArray();


            NetTypes.NetMessages msgType = (NetTypes.NetMessages)data[0]; // more performance.
            switch (msgType)
            {
            case NetTypes.NetMessages.SERVER_HELLO:
            {
                Proxyhelper.UserData ud;

                if (peer.TryGetUserData(out ud))
                {
                    packetSender.SendPacket(2, Proxyhelper.CreateLogonPacket(ud.tankIDName, ud.tankIDPass, ud.userID, ud.token, ud.doorid), peer);
                }

                break;
            }

            case NetTypes.NetMessages.GAME_MESSAGE:

                string str = GetProperGenericText(data);
                Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A game_msg packet was sent: " + str + "\n");

                if (str.Contains("Server requesting that you re-logon"))
                {
                    Proxyhelper.globalUserData.token             = -1;
                    Proxyhelper.globalUserData.Growtopia_IP      = Proxyhelper.globalUserData.Growtopia_Master_IP;
                    Proxyhelper.globalUserData.Growtopia_Port    = Proxyhelper.globalUserData.Growtopia_Master_Port;
                    Proxyhelper.globalUserData.isSwitchingServer = true;

                    Proxyhelper.realPeer.Disconnect(0);
                }

                break;

            case NetTypes.NetMessages.GAME_PACKET:

                byte[] tankPacket = VariantList.get_struct_data(data);
                if (tankPacket == null)
                {
                    break;
                }

                byte tankPacketType             = tankPacket[0];
                NetTypes.PacketTypes packetType = (NetTypes.PacketTypes)tankPacketType;
                if (Proxyhelper.logallpackettypes)
                {
                    GamePacketProton gp = new GamePacketProton();
                    gp.AppendString("OnConsoleMessage");
                    gp.AppendString("`6(PROXY) `wPacket TYPE: " + tankPacketType.ToString());
                    packetSender.SendData(gp.GetBytes(), Proxyhelper.proxyPeer);

                    if (tankPacketType > 18)
                    {
                        File.WriteAllBytes("newpacket.dat", tankPacket);
                    }
                }

                switch (packetType)
                {
                case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE:
                {
                    TankPacket p = TankPacket.UnpackFromPacket(data);
                    foreach (Player pl in worldMap.players)
                    {
                        if (pl.netID == p.NetID)
                        {
                            pl.X = (int)p.X;
                            pl.Y = (int)p.Y;
                            break;
                        }
                    }
                    break;
                }

                case NetTypes.PacketTypes.INVENTORY_STATE:
                {
                    if (!Proxyhelper.globalUserData.dontSerializeInventory)
                    {
                        worldMap.player.SerializePlayerInventory(VariantList.get_extended_data(tankPacket));
                    }
                    break;
                }

                case NetTypes.PacketTypes.TILE_CHANGE_REQ:
                {
                    TankPacket p = TankPacket.UnpackFromPacket(data);

                    if (worldMap == null)
                    {
                        Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n");
                        break;
                    }
                    byte   tileX = (byte)p.PunchX;
                    byte   tileY = (byte)p.PunchY;
                    ushort item  = (ushort)p.MainValue;


                    if (tileX >= worldMap.width)
                    {
                        break;
                    }
                    else if (tileY >= worldMap.height)
                    {
                        break;
                    }

                    ItemDatabase.ItemDefinition itemDef = ItemDatabase.GetItemDef(item);



                    if (ItemDatabase.isBackground(item))
                    {
                        worldMap.tiles[tileX + (tileY * worldMap.width)].bg = item;
                    }
                    else
                    {
                        worldMap.tiles[tileX + (tileY * worldMap.width)].fg = item;
                    }

                    break;
                }

                case NetTypes.PacketTypes.CALL_FUNCTION:
                    VariantList.VarList VarListFetched = VariantList.GetCall(VariantList.get_extended_data(tankPacket));
                    VarListFetched.netID = BitConverter.ToInt32(tankPacket, 4);         // add netid
                    VarListFetched.delay = BitConverter.ToUInt32(tankPacket, 20);       // add keep track of delay modifier

                    bool isABot             = false;
                    Proxyhelper.UserData ud = null;

                    int    netID   = OperateVariant(VarListFetched, isABot ? (object)peer : null);    // box enetpeer obj to generic obj
                    string argText = string.Empty;

                    for (int i = 0; i < VarListFetched.functionArgs.Count(); i++)
                    {
                        argText += " [" + i.ToString() + "]: " + (string)VarListFetched.functionArgs[i].ToString();
                    }

                    Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A function call was requested, see log infos below:\nFunction Name: " + VarListFetched.FunctionName + " parameters: " + argText + " \n");

                    if (VarListFetched.FunctionName == "OnSendToServer")
                    {
                        return("Server switching forced, not continuing as Proxy Client has to deal with this.");
                    }
                    if (VarListFetched.FunctionName == "onShowCaptcha")
                    {
                        return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side.");
                    }
                    if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("captcha"))
                    {
                        return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side.");
                    }
                    if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("gazette"))
                    {
                        return("Received gazette, skipping it...");
                    }
                    if (VarListFetched.FunctionName == "OnSetPos" && Proxyhelper.globalUserData.ignoreonsetpos && netID == worldMap.netID)
                    {
                        return("Ignored position set by server, may corrupt doors but is used so it wont set back. (CAN BE BUGGY WITH SLOW CONNECTIONS)");
                    }
                    if (VarListFetched.FunctionName == "OnSpawn" && netID == -2)
                    {
                        if (Proxyhelper.globalUserData.unlimitedZoom)
                        {
                            return("Modified OnSpawn for unlimited zoom (mstate|1)");        // only doing unlimited zoom and not unlimited punch/place to be sure that no bans occur due to this. If you wish to use unlimited punching/placing as well, change the smstate in OperateVariant function instead.
                        }
                    }


                    break;

                case NetTypes.PacketTypes.SET_CHARACTER_STATE:
                {
                    /*TankPacket p = TankPacket.UnpackFromPacket(data);
                     *
                     * return "Log of potentially wanted received GAME_PACKET Data:" +
                     * "\nnetID: " + p.NetID +
                     * "\nsecondnetid: " + p.SecondaryNetID +
                     * "\ncharacterstate (prob 8): " + p.CharacterState +
                     * "\nwaterspeed / offs 16: " + p.Padding +
                     * "\nmainval: " + p.MainValue +
                     * "\nX|Y: " + p.X + "|" + p.Y +
                     * "\nXSpeed: " + p.XSpeed +
                     * "\nYSpeed: " + p.YSpeed +
                     * "\nSecondaryPadding: " + p.SecondaryPadding +
                     * "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY;*/
                    break;
                }

                case NetTypes.PacketTypes.PING_REQ:
                    SpoofedPingReply(TankPacket.UnpackFromPacket(data));
                    break;

                case NetTypes.PacketTypes.LOAD_MAP:
                    if (Proxyhelper.LogText.Length >= 32678)
                    {
                        Proxyhelper.LogText = string.Empty;
                    }

                    worldMap = worldMap.LoadMap(tankPacket);
                    worldMap.player.didCharacterStateLoad = false;
                    worldMap.player.didClothingLoad       = false;


                    Proxyhelper.realPeer.Timeout(1000, 2800, 3400);

                    break;

                case NetTypes.PacketTypes.MODIFY_ITEM_OBJ:
                {
                    TankPacket p = TankPacket.UnpackFromPacket(data);
                    if (p.NetID == -1)
                    {
                        if (worldMap == null)
                        {
                            break;
                        }

                        worldMap.dropped_ITEMUID++;

                        DroppedObject dItem = new DroppedObject();
                        dItem.id        = p.MainValue;
                        dItem.itemCount = data[16];
                        dItem.x         = p.X;
                        dItem.y         = p.Y;
                        dItem.uid       = worldMap.dropped_ITEMUID;
                        worldMap.droppedItems.Add(dItem);

                        if (Proxyhelper.globalUserData.cheat_magplant)
                        {
                            TankPacket p2 = new TankPacket();
                            p2.PacketType = (int)NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ;
                            p2.NetID      = p.NetID;
                            p2.X          = (int)p.X;
                            p2.Y          = (int)p.Y;
                            p2.MainValue  = dItem.uid;

                            packetSender.SendPacketRaw((int)NetTypes.NetMessages.GAME_PACKET, p2.PackForSendingRaw(), Proxyhelper.realPeer);
                            //return "Blocked dropped packet due to magplant hack (auto collect/pickup range) tried to collect it instead, infos of dropped item => uid was " + worldMap.dropped_ITEMUID.ToString() + " id: " + p.MainValue.ToString();
                        }
                    }
                }
                break;

                default:
                    break;
                }
                break;

            case NetTypes.NetMessages.TRACK:
            {
                return("Track message:\n" + GetProperGenericText(data));

                break;
            }

            case NetTypes.NetMessages.LOG_REQ:
            case NetTypes.NetMessages.ERROR:
                return("Blocked LOG_REQUEST/ERROR message from server");

            default:
                //return "(SERVER): An unknown event occured. Message Type: " + msgType.ToString() + "\n";
                break;
            }

            packetSender.SendData(data, Proxyhelper.proxyPeer);
            if (msgType == NetTypes.NetMessages.GAME_PACKET && data[4] > 39) // customizable on which packets you wanna log, for speed im just gonna do this!
            {
                TankPacket p           = TankPacket.UnpackFromPacket(data);
                uint       extDataSize = BitConverter.ToUInt32(data, 56);
                byte[]     actualData  = data.Skip(4).Take(56).ToArray();
                byte[]     extData     = data.Skip(60).ToArray();

                string extDataStr      = "";
                string extDataStrShort = "";
                string extDataString   = Encoding.UTF8.GetString(extData);
                for (int i = 0; i < extDataSize; i++)
                {
                    //ushort pos = BitConverter.ToUInt16(extData, i);
                    extDataStr += extData[i].ToString() + "|";
                }


                return("Log of potentially wanted received GAME_PACKET Data:" +
                       "\npackettype: " + actualData[0].ToString() +
                       "\npadding byte 1|2|3: " + actualData[1].ToString() + "|" + actualData[2].ToString() + "|" + actualData[3].ToString() +
                       "\nnetID: " + p.NetID +
                       "\nsecondnetid: " + p.SecondaryNetID +
                       "\ncharacterstate (prob 8): " + p.CharacterState +
                       "\nwaterspeed / offs 16: " + p.Padding +
                       "\nmainval: " + p.MainValue +
                       "\nX|Y: " + p.X + "|" + p.Y +
                       "\nXSpeed: " + p.XSpeed +
                       "\nYSpeed: " + p.YSpeed +
                       "\nSecondaryPadding: " + p.SecondaryPadding +
                       "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY +
                       "\nExtended Packet Data Length: " + extDataSize.ToString() +
                       "\nExtended Packet Data:\n" + extDataStr + "\n");

                return(string.Empty);
            }
            else
            {
                return(string.Empty);
            }
        }