示例#1
1
 public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
 {
     var emotion = new EmotionPacket(data);
     //for later use -> tracking, etc.
     switch (emotion.id)
     {
         case 0:
             //dance
             //Logging->writeLine("dance");
             break;
         case 1:
             //taunt
             //Logging->writeLine("taunt");
             break;
         case 2:
             //laugh
             //Logging->writeLine("laugh");
             break;
         case 3:
             //joke
             //Logging->writeLine("joke");
             break;
     }
     var response = new EmotionPacket(emotion.id, emotion.netId);
     return PacketHandlerManager.getInstace().broadcastPacket(response, Channel.CHL_S2C);
 }
示例#2
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var sell = new SellItem(data);
            var client = game.getPeerInfo(peer);

            var i = game.getPeerInfo(peer).getChampion().getInventory().getItemSlot(sell.slotId);
            if (i == null)
                return false;

            float sellPrice = i.getTemplate().getTotalPrice() * i.getTemplate().getSellBackModifier();
            client.getChampion().getStats().setGold(client.getChampion().getStats().getGold() + sellPrice);

            if (i.getTemplate().getMaxStack() > 1)
            {
                i.decrementStacks();
                PacketNotifier.notifyRemoveItem(client.getChampion(), sell.slotId, i.getStacks());

                if (i.getStacks() == 0)
                    client.getChampion().getInventory().removeItem(sell.slotId);
            }
            else
            {
                PacketNotifier.notifyRemoveItem(client.getChampion(), sell.slotId, 0);
                client.getChampion().getInventory().removeItem(sell.slotId);
            }

            return true;
        }
示例#3
0
        private static async Task SendPacket25(ENetPeer peer)
        {
            if ((peer.Data as Player).HaveGrowID == true)
            {
                await peer.OnAddNotification("", "`wWarning from `4System`0: You have been auto banned by system for using : Cheat Engine!", "audio/open_hub.wav");

                peer.DisconnectLater(0);
                foreach (ENetPeer currentPeer in Peers)
                {
                    if (currentPeer.State != ENetPeerState.Connected)
                    {
                        continue;
                    }

                    await currentPeer.OnConsoleMessage("`4** `$" + (peer.Data as Player).RawName + " `4AUTO-BANNED BY SYSTEM **`o(`$/rules `oto view rules)");

                    await currentPeer.OnPlayPositioned("audio/beep.wav");
                }
                await Task.CompletedTask;
            }
            else
            {
                peer.DisconnectLater(0);
            }
        }
示例#4
0
        private void HandleUnreliable(ENetPeer peer, ENetProtocolSendUnreliable packet, byte[] data)
        {
            if (peer.State != ENetPeerState.Connected && peer.State != ENetPeerState.DisconnectLater) return;
            var channel = peer.Channels[packet.Header.ChannelID];
            if (DropSequencedData(channel, packet.Header) || packet.UnreliableSequenceNumber <= channel.IncomingSequenceNumber) return;

        }
示例#5
0
 private void HandleReliable(ENetPeer peer, ENetProtocol packet, bool isFragment, byte[] data)
 {
     if (peer.State != ENetPeerState.Connected && peer.State != ENetPeerState.DisconnectLater) return;
     var channel = peer.Channels[packet.Header.ChannelID];
     if (DropSequencedData(channel, packet.Header) || packet.Header.ReliableSequenceNumber == channel.IncomingSequenceNumber) return;
     if (!isFragment && packet.Header.ReliableSequenceNumber == (channel.IncomingSequenceNumber + 1))
     {
         if (OnData != null) OnData(peer, data);
         channel.IncomingSequenceNumber++;
         return;
     }
     lock (channel.IncomingCommandLock)
     {
         var command = new ENetIncomingCommand(packet.Header.ReliableSequenceNumber);
         var existingCommand = channel.IncomingCommands.Find(command); //Establish if we already have the packet
         if (existingCommand != null && !isFragment) return; //We already have the command, ignore it
         else if (existingCommand != null)
         {
             if (existingCommand.Value.FragmentsRemaining == 0) return;
         }
         if (isFragment)
         {
             command.FragmentsRemaining = packet.SendFragment.FragmentCount - 1;
         }
         if(packet.Header.ReliableSequenceNumber == (channel.IncomingSequenceNumber + 1))channel.IncomingCommands.AddFirst()
     }
 }
示例#6
0
 public void SendPacketRaw(int type, byte[] data, ENetPeer peer, ENetPacketFlags flag = ENetPacketFlags.Reliable)
 {
     byte[] packetData = new byte[data.Length + 5];
     Array.Copy(BitConverter.GetBytes(type), packetData, 4);
     Array.Copy(data, 0, packetData, 4, data.Length);
     SendData(packetData, peer);
 }
示例#7
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var click = new Click(data);
            Logger.LogCoreInfo("Object " + game.getPeerInfo(peer).getChampion().getNetId() + " clicked on " + click.targetNetId);

            return true;
        }
示例#8
0
 private ENetEvent(ENetPeer peer, ENetPacket?packet, uint data, ENetEventType type)
 {
     Peer   = peer;
     Packet = packet !;
     Data   = data;
     Type   = type;
 }
示例#9
0
        public static void ConnectToServer(ref ENetPeer peer, UserData userData = null, bool FirstInitialUseOfBot = false)
        {
            Console.WriteLine("Internal proxy client is attempting a connection to server...");

            string ip   = globalUserData.Growtopia_IP;
            int    port = globalUserData.Growtopia_Port;


            if (peer == null)
            {
                peer = client.Connect(new IPEndPoint(IPAddress.Parse(ip), port), 2, 0);
            }
            else
            {
                if (peer.IsNull)
                {
                    peer = client.Connect(new IPEndPoint(IPAddress.Parse(ip), port), 2, 0);
                }
                else if (peer.State != ENetPeerState.Connected)
                {
                    peer = client.Connect(new IPEndPoint(IPAddress.Parse(ip), port), 2, 0);
                }
                else
                {
                    // peer = client.Connect(new IPEndPoint(IPAddress.Parse(ip), port), 2, 0);
                    globalUserData.awaitingReconnect = true;
                    peer.Disconnect(0);

                    //In this case, we will want the realPeer to be disconnected first

                    // sub server switching, most likely.
                    peer = client.Connect(new IPEndPoint(IPAddress.Parse(ip), port), 2, 0);
                }
            }
        }
示例#10
0
        private static async void Server_OnConnect(object sender, ENetConnectEventArgs connectEventArgs)
        {
            int count = 1;
            //WorldDatabase.GetWorld("START");
            //WorldDatabase.GetWorld("ADMIN");
            //WorldDatabase.GetWorld("HELLO");
            ENetPeer Peer = connectEventArgs.Peer;

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

                Peers.Add(Peer);
            }
            connectEventArgs.Peer.OnReceive    += Peer_OnReceive;
            connectEventArgs.Peer.OnDisconnect += Peer_OnDisconnect;
        }
示例#11
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var spell = new CastSpell(data);
            //Todo spellslot 0-3 qwer, 4-5 d f, 6-11 items

            // There are some bits triggering this
            if ((spell.spellSlotType & 0x0F) > 0)
            {
                Logger.LogCoreInfo("Summoner Spell Cast");
                Logger.LogCoreInfo("Type: " + spell.spellSlotType.ToString("x") + ", Slot " + spell.spellSlot + ", coord " + spell.x + " ; " + spell.y + ", coord2 " + spell.x2 + ", " + spell.y2 + ", target NetId " + spell.targetNetId.ToString("x"));
                return true;
            }

            var futureProjNetId = Game.GetNewNetID();
            var spellNetId = Game.GetNewNetID();
            var targetObj = game.getMap().getObjectById(spell.targetNetId);
            var targetUnit = targetObj as Unit;

            var s = game.getPeerInfo(peer).getChampion().castSpell(spell.spellSlot, spell.x, spell.y, targetUnit, futureProjNetId, spellNetId);

            if (s == null)
                return false;

            var response = new CastSpellAns(s, spell.x, spell.y, futureProjNetId, spellNetId);
            PacketHandlerManager.getInstace().broadcastPacket(response, Channel.CHL_S2C);
            return true;
        }
示例#12
0
        public static async Task SendPacketType(this ENetPeer peer, int id, PlayerMoving pMov,
                                                PlayerMoving data2, World world)
        {
            switch (id)
            {
            case 25:
                await SendPacket25(peer);

                break;

            case 7:
                await SendPacket7(peer, pMov, world);

                break;

            case 10:
                await SendPacket10(peer, pMov);

                break;

            case 18:
                await SendPacket18(peer, pMov);

                break;

            case 3:
                await SendPacket3(peer, data2);

                break;

            default:
                break;
            }
        }
示例#13
0
        private static async Task SendPacket7(ENetPeer peer, PlayerMoving pMov, World world)
        {
            if (pMov.PunchX < 0 || pMov.PunchY < 0 || pMov.PunchX > 100 || pMov.PunchY > 100)
            {
                return;
            }
            if ((peer.Data as Player).World == " EXIT")
            {
                return;
            }
            int x    = pMov.PunchX;
            int y    = pMov.PunchY;
            int tile = world.Items[x + (y * world.Width)].Foreground;

            if (tile == 6)
            {
                await peer.SendLeave();

                (peer.Data as Player).World = "EXIT";
                await peer.SendWorldOffers();
            }
            else if (tile == 410 || tile == 1832 || tile == 1770)
            {
                (peer.Data as Player).CpX = x * 32;
                (peer.Data as Player).CpY = y * 32;
            }
        }
示例#14
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var version = new SynchVersion(data);
            //Logging->writeLine("Client version: %s", version->version);

            var mapId = Config.gameConfig.map;
            Logger.LogCoreInfo("Current map: " + mapId);

            bool versionMatch = true;
            // Version might be an invalid value, currently it trusts the client
            if (version.version != Config.version)
            {
                versionMatch = false;
                Logger.LogCoreWarning("Client " + version.version + " does not match Server " + Config.version);
            }
            else
            {
                Logger.LogCoreInfo("Accepted client version (" + version.version + ")");
            }

            foreach (var player in game.getPlayers())
            {
                if (player.Item1 == peer->address.host)
                {
                    player.Item2.setVersionMatch(versionMatch);
                    break;
                }
            }
            int map;
            if (!int.TryParse(mapId, out map))
                map = 1;
            var answer = new SynchVersionAns(game.getPlayers(), Config.version, "CLASSIC", map);

            return PacketHandlerManager.getInstace().sendPacket(peer, answer, Channel.CHL_S2C);
        }
示例#15
0
        private void SwitchServers(ref ENetPeer peer, string ip, int port, int lmode = 0, int userid = 0, int token = 0)
        {
            MainForm.globalUserData.Growtopia_IP   = ip;
            MainForm.globalUserData.Growtopia_Port = port;
            isSwitchingServers = true;

            MainForm.ConnectToServer(ref peer);
        }
示例#16
0
        public static void Client_OnConnect(ENetPeer peer)
        {
            peer.Timeout(1000, 4000, 6000);
            //peer.PingInterval(TimeSpan.FromMilliseconds(1000));

            realPeer = peer;
            globalUserData.connectIDReal++;
        }
示例#17
0
        private void SwitchServers(ref ENetPeer peer, string ip, int port, int lmode = 0, int userid = 0, int token = 0)
        {
            Proxyhelper.globalUserData.Growtopia_IP   = token < 0 ? Proxyhelper.globalUserData.Growtopia_Master_IP : ip;
            Proxyhelper.globalUserData.Growtopia_Port = token < 0 ? Proxyhelper.globalUserData.Growtopia_Master_Port : port;
            isSwitchingServers = true;

            Proxyhelper.ConnectToServer(ref peer, Proxyhelper.globalUserData);
        }
示例#18
0
        public Player(ENetPeer peer)
        {
            Pos       = Vector2.Zero;
            Clothes   = new Clothes();
            Inventory = new Inventory(this);

            peer.SetUserData(this);
            Peer = peer;
        }
示例#19
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var peerInfo = game.getPeerInfo(peer);
            if (peerInfo == null || peerInfo.getChampion().isDashing() || peerInfo.getChampion().isDead())
                return true;

            var request = new MovementReq(data);
            var vMoves = new List<Vector2>();//readWaypoints(request.moveData, request.coordCount, game.getMap());
            vMoves.Add(new Vector2(peerInfo.getChampion().getX(), peerInfo.getChampion().getY()));
            vMoves.Add(new Vector2(request.x, request.y)); // TODO
            switch (request.type)
            {
                case MoveType.STOP:
                    {
                        //TODO anticheat, currently it trusts client 100%

                        peerInfo.getChampion().setPosition(request.x, request.y);
                        float x = ((request.x) - game.getMap().getWidth()) / 2;
                        float y = ((request.y) - game.getMap().getHeight()) / 2;

                        for (var i = 0; i < vMoves.Count; i++)
                        {
                            var v = vMoves[i];
                            v.X = (short)request.x;
                            v.Y = (short)request.y;
                        }

                        Logger.LogCoreInfo("Stopped at x: " + request.x + ", y: " + request.y);
                        break;
                    }
                case MoveType.EMOTE:
                    //Logging->writeLine("Emotion");
                    return true;
                case MoveType.ATTACKMOVE:
                    peerInfo.getChampion().setMoveOrder(MoveOrder.MOVE_ORDER_ATTACKMOVE);
                    break;
                case MoveType.MOVE:
                    peerInfo.getChampion().setMoveOrder(MoveOrder.MOVE_ORDER_MOVE);
                    break;
            }

            // Sometimes the client will send a wrong position as the first one, override it with server data
            vMoves[0] = new Vector2(peerInfo.getChampion().getX(), peerInfo.getChampion().getY());

            peerInfo.getChampion().setWaypoints(vMoves);

            var u = game.getMap().getObjectById(request.targetNetId) as Unit;
            if (u == null)
            {
                peerInfo.getChampion().setTargetUnit(null);
                return true;
            }

            peerInfo.getChampion().setTargetUnit(u);

            return true;
        }
示例#20
0
 private void animaButton2_Click(object sender, EventArgs e)
 {
     eNet            = new ENetHost(1, 2);
     eNet.OnConnect += Client_OnConnect;
     eNet.CompressWithRangeCoder();
     eNet.ChecksumWithCRC32();
     eNet.StartServiceThread();
     eNetP = eNet.Connect(new System.Net.IPEndPoint(IPAddress.Parse(Growtopia_Master_IP), Growtopia_Master_Port), 2, 0);
 }
        public unsafe void TestSetAndGetUserDataPeer()
        {
            var nativePeer = new NativeENetPeer();
            var peer       = new ENetPeer(&nativePeer);
            var data       = 1399;

            peer.SetUserData(data);
            Assert.IsTrue(peer.TryGetUserData <int>(out var data2));
            Assert.AreEqual(data, data2);
        }
示例#22
0
        private static async void Peer_OnDisconnect(object sender, uint e)
        {
            ENetPeer peer = sender as ENetPeer;

            Console.WriteLine("Peer disconnected");
            await peer.SendLeave();

            peer.Data = null;
            Peers.Remove(peer);
        }
示例#23
0
        public static async Task UpdateDoor(ENetPeer peer, int foreground, int x, int y, string text)
        {
            try
            {
                PlayerMoving sign = new PlayerMoving
                {
                    PacketType     = 0x3,
                    CharacterState = 0x0,
                    X            = x,
                    Y            = y,
                    PunchX       = x,
                    PunchY       = y,
                    NetID        = -1,
                    PlantingTree = foreground
                };
                await SendPacketRaw(4, PlayerMovingPack(sign), 56, 0, peer);

                int    hmm = 8; int text_len = text.Length; int lol = 0; int wut = 5; int yeh = hmm + 3 + 1; int idk = 15 + text_len;
                int    is_locked = 0; int bubble_type = 1; int ok = 52 + idk; int kek = ok + 4; int yup = ok - 8 - idk; int magic = 56;
                int    wew = ok + 5 + 4; int wow = magic + 4 + 5; int four = 4;
                byte[] data = new byte[kek]; byte[] p = new byte[wew];
                for (int i = 0; i < kek; i++)
                {
                    data[i] = 0;
                }
                Array.Copy(BitConverter.GetBytes(wut), 0, data, 0, four);
                Array.Copy(BitConverter.GetBytes(hmm), 0, data, yeh, four);
                Array.Copy(BitConverter.GetBytes(x), 0, data, yup, 4);
                Array.Copy(BitConverter.GetBytes(y), 0, data, yup + 4, 4);
                Array.Copy(BitConverter.GetBytes(idk), 0, data, 4 + yup + 4, four);
                Array.Copy(BitConverter.GetBytes(foreground), 0, data, magic, 2);
                Array.Copy(BitConverter.GetBytes(lol), 0, data, four + magic, four);
                Array.Copy(BitConverter.GetBytes(bubble_type), 0, data, magic + 4 + four, 1);
                Array.Copy(BitConverter.GetBytes(text_len), 0, data, wow, 2);
                Array.Copy(Encoding.ASCII.GetBytes(text), 0, data, 2 + wow, text_len);
                Array.Copy(BitConverter.GetBytes(is_locked), 0, data, ok, four);
                Array.Copy(BitConverter.GetBytes(four), 0, p, 0, four);
                Array.Copy(data, 0, p, four, kek);
                foreach (ENetPeer currentPeer in Peers)
                {
                    if (currentPeer.State != ENetPeerState.Connected)
                    {
                        continue;
                    }
                    if (peer.InWorld(currentPeer))
                    {
                        currentPeer.Send(p, 0, ENetPacketFlags.Reliable);
                    }
                }
            }
            catch
            {
                Console.WriteLine("error in updatedoor");
            }
        }
示例#24
0
        public static async Task SendGrowScanDialog(ENetPeer peer)
        {
            World      world      = peer.GetWorld();
            List <int> items      = new List <int>();
            List <int> itemscount = new List <int>();

            for (int i = 0; i < world.Width * world.Height; i++)
            {
                int fg = world.Items[i].Foreground;
                int bg = world.Items[i].Background;
                if (fg == 0 && bg == 0)
                {
                    continue;
                }
                else if (fg == 8 || fg == 6)
                {
                    continue;
                }
                if (items.Contains(fg))
                {
                    itemscount[items.IndexOf(fg)]++;
                }
                else
                {
                    if (fg != 0)
                    {
                        items.Add(fg);
                        itemscount.Add(1);
                    }
                }
                if (items.Contains(bg))
                {
                    itemscount[items.IndexOf(bg)]++;
                }
                else
                {
                    if (bg != 0)
                    {
                        items.Add(bg);
                        itemscount.Add(1);
                    }
                }
            }
            string dd = new Dialog().SetDefaultColor()
                        .AddLabelWithIcon("Found items : ", 6016, false)
                        .AddSmallSpacer()
                        .Result;

            for (int i = 0; i < items.Count; i++)
            {
                dd += new Dialog().AddLabelWithIcon(ItemsData[items[i]].Name + " : " + itemscount[i], items[i], true).Result;
            }
            dd += new Dialog().AddSmallSpacer().EndDialog("a", "Back", "");
            await peer.OnDialogRequest(dd);
        }
示例#25
0
        public Player(ENetPeer peer)
        {
            Peer = peer;

            Peer.OnReceive += OnReceive;
            Peer.Data       = this;

            Inventory.InventorySize = 16;
            Inventory.AddItem(ItemId.i18_Fist, 1);
            Inventory.AddItem(ItemId.i32_Wrench, 1);
        }
示例#26
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var loadInfo = new PingLoadInfo(data);
            var peerInfo = game.getPeerInfo(peer);
            if (peerInfo == null)
                return false;
            var response = new PingLoadInfo(loadInfo, peerInfo.userId);

            //Logging->writeLine("loaded: %f, ping: %f, %f", loadInfo->loaded, loadInfo->ping, loadInfo->f3);
            return PacketHandlerManager.getInstace().broadcastPacket(response, Channel.CHL_LOW_PRIORITY, PacketFlags.None);
        }
示例#27
0
 public static async Task SendDialogAsync(ENetPeer peer, World world, string act)
 {
     try
     {
         bool   registerDialog = false;
         string growid = "", password = "", email = "", discord = "";
         foreach (var a in act.Split("\n".ToCharArray()))
         {
             var info   = a.Split('|');
             var button = info[0] == "buttonClicked" ? info[1] : "";
             if (info[0] == "dialog_name" && info[1] == "creategrowid")
             {
                 registerDialog = true;
             }
             if (registerDialog)
             {
                 if (info[0] == "growid")
                 {
                     growid = info[1];
                 }
                 else if (info[0] == "password")
                 {
                     password = info[1];
                 }
                 else if (info[0] == "email")
                 {
                     email = info[1];
                 }
                 else if (info[0] == "discord")
                 {
                     discord = info[1];
                 }
             }
             if (button.Contains("findbutton"))
             {
                 int            id   = Convert.ToInt32(button.Substring(10));
                 var            item = ItemsData[id];
                 InventoryItems inv  = new InventoryItems
                 {
                     ItemID    = id,
                     ItemCount = 1
                 };
                 (peer.Data as Player).PlayerInventory.Items = (peer.Data as Player).PlayerInventory.Items.Append(inv).ToArray();
                 await peer.SendInventory((peer.Data as Player).PlayerInventory);
             }
         }
         if (registerDialog)
         {
             await peer.CreateGrowID(growid, password, email, discord);
         }
     }
     catch (Exception e) { Console.WriteLine(e.Source + " " + e.TargetSite); }
 }
示例#28
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var request = new SwapItems(data);

            if (request.slotFrom > 6 || request.slotTo > 6)
                return false;

            game.getPeerInfo(peer).getChampion().getInventory().swapItems(request.slotFrom, request.slotTo);
            PacketNotifier.notifyItemsSwapped(game.getPeerInfo(peer).getChampion(), request.slotFrom, request.slotTo);

            return true;
        }
示例#29
0
 public void SendData(byte[] data, ENetPeer peer, ENetPacketFlags flag = ENetPacketFlags.Reliable)
 {
     if (peer == null)
     {
         return;
     }
     if (peer.State != ENetPeerState.Connected)
     {
         return;
     }
     peer.Send((byte)rand.Next(0, 1), data, flag);
 }
示例#30
0
        int checkPeerUsability(ENetPeer peer)
        {
            if (peer.IsNull)
            {
                return(-1);
            }
            if (peer.State != ENetPeerState.Connected)
            {
                return(-3);
            }

            return(0);
        }
示例#31
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var request = new BuyItemReq(data);

            var itemTemplate = ItemManager.getInstance().getItemTemplateById(request.id);
            if (itemTemplate == null)
                return false;

            var recipeParts = game.getPeerInfo(peer).getChampion().getInventory().getAvailableRecipeParts(itemTemplate);
            var price = itemTemplate.getTotalPrice();
            ItemInstance i;

            if (recipeParts.Count == 0)
            {
                if (game.getPeerInfo(peer).getChampion().getStats().getGold() < price)
                {
                    return true;
                }

                i = game.getPeerInfo(peer).getChampion().getInventory().addItem(itemTemplate);

                if (i == null)
                { // Slots full
                    return false;
                }
            }
            else
            {
                foreach (var instance in recipeParts)
                    price -= instance.getTemplate().getTotalPrice();

                if (game.getPeerInfo(peer).getChampion().getStats().getGold() < price)
                    return false;


                foreach (var instance in recipeParts)
                {
                    game.getPeerInfo(peer).getChampion().getStats().unapplyStatMods(instance.getTemplate().getStatMods());
                    PacketNotifier.notifyRemoveItem(game.getPeerInfo(peer).getChampion(), instance.getSlot(), 0);
                    game.getPeerInfo(peer).getChampion().getInventory().removeItem(instance.getSlot());
                }

                i = game.getPeerInfo(peer).getChampion().getInventory().addItem(itemTemplate);
            }

            game.getPeerInfo(peer).getChampion().getStats().setGold(game.getPeerInfo(peer).getChampion().getStats().getGold() - price);
            game.getPeerInfo(peer).getChampion().getStats().applyStatMods(itemTemplate.getStatMods());
            PacketNotifier.notifyItemBought(game.getPeerInfo(peer).getChampion(), i);

            return true;
        }
示例#32
0
        private void Host_OnConnect(object sender, ENetConnectEventArgs e)
        {
            proxyPeer            = e.Peer;
            e.Peer.OnReceive    += Peer_OnReceive;
            e.Peer.OnDisconnect += Peer_OnDisconnect;



            AppendLog("A new client connected from {0} " + e.Peer.RemoteEndPoint);
            e.Peer.Timeout(30000, 25000, 30000);

            AppendLog("Connecting to gt servers...");
            ConnectToServer();
        }
示例#33
0
        private static void Main(string[] args)
        {
            ManagedENet.Startup();

            Console.WriteLine("Setting up Local Server");
            LocalServer = new ENetHost(new IPEndPoint(IPAddress.Any, 17091), 1024, 10, 0, 0);
            LocalServer.ChecksumWithCRC32();
            LocalServer.CompressWithRangeCoder();

            LocalServer.OnConnect += (sender, eventArgs) =>
            {
                LogClient("Connected!");

                RemotePeer = RemoteServer.Connect(RemoteEndpoint, 1, 0);

                RemotePeer.OnReceive += (o, packet) =>
                {
                    SendToClient(packet);
                };

                eventArgs.Peer.OnReceive += (o, packet) =>
                {
                    SendToRemote(packet);
                };

                eventArgs.Peer.OnDisconnect += (o, u) =>
                {
                    RemotePeer.DisconnectNow(0);
                    LogClient("Disconnected!");
                };
            };

            LocalServer.StartServiceThread();

            Console.WriteLine("Setting up Remote Server");

            RemoteServer = new ENetHost(1, 10);
            RemoteServer.ChecksumWithCRC32();
            RemoteServer.CompressWithRangeCoder();

            RemoteServer.OnConnect += (sender, eventArgs) => LogServer("Connected!");

            RemoteServer.StartServiceThread();

            while (true)
            {
                Thread.Sleep(5);
            }
        }
示例#34
0
 private ENetPeer? HandleConnect(IPEndPoint from, ENetProtocolConnect packet)
 {
     lock (connectionLock)
     {
         foreach (var peer in Peers)
         {
             if (peer.Value.Address.Equals(from) && peer.Value.SessionID == packet.SessionID) return null;
         }
         ushort peerId;
         if (!AvailablePeerIds.TryDequeue(out peerId)) return null; //No peers available within the client limit
         ENetPeer newPeer = new ENetPeer(from, peerId, packet, ChannelLayout);
         ((IDictionary)Peers).Add(peerId, newPeer);
         return newPeer;
     }
 }
示例#35
0
 private void animaButton5_Click(object sender, EventArgs e)
 {
     animaTextBox4.Enabled = false;
     animaTextBox3.Enabled = false;
     animaButton6.Enabled  = false;
     animaButton5.Enabled  = false;
     ManagedENet.Startup();
     eNet            = new ENetHost(1, 2);
     eNet.OnConnect += Client_OnConnect;
     eNet.CompressWithRangeCoder();
     eNet.ChecksumWithCRC32();
     eNet.StartServiceThread();
     eNetP = eNet.Connect(new System.Net.IPEndPoint(IPAddress.Parse(Growtopia_Master_IP), Growtopia_Master_Port), 2, 0);
     updatestatus("Connected!", 2);
 }
示例#36
0
 public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
 {
     var request = new SpawnParticle.ViewRequest(data);
     var answer = new SpawnParticle.ViewAnswer(request);
     if (request.requestNo == 0xFE)
     {
         answer.setRequestNo(0xFF);
     }
     else
     {
         answer.setRequestNo(request.requestNo);
     }
     PacketHandlerManager.getInstace().sendPacket(peer, answer, Channel.CHL_S2C, PacketFlags.None);
     return true;
 }
示例#37
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var skillUpPacket = new SkillUpPacket(data);
            //!TODO Check if can up skill? :)

            var s = game.getPeerInfo(peer).getChampion().levelUpSpell(skillUpPacket.skill);

            if (s == null)
                return false;

            var skillUpResponse = new SkillUpPacket(game.getPeerInfo(peer).getChampion().getNetId(), skillUpPacket.skill, (byte)s.getLevel(), (byte)s.getOwner().getSkillPoints());
            PacketHandlerManager.getInstace().sendPacket(peer, skillUpResponse, Channel.CHL_GAMEPLAY);
            game.getPeerInfo(peer).getChampion().getStats().setSpellEnabled(skillUpPacket.skill, true);

            return true;
        }
示例#38
0
        private void Host_OnConnect(object sender, ENetConnectEventArgs e)
        {
            if (IsClient)
            {
                m_Peer          = e.Peer;
                chatBox.Enabled = true;
                WriteLog("Connected");
            }
            else
            {
                WriteLog("Peer connected from {0}", e.Peer.RemoteEndPoint);
            }

            e.Peer.OnReceive    += Peer_OnReceive;
            e.Peer.OnDisconnect += Peer_OnDisconnect;
        }
示例#39
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            var heartbeat = new HeartBeat(data);

            float diff = heartbeat.ackTime - heartbeat.receiveTime;
            if (heartbeat.receiveTime > heartbeat.ackTime)
            {
                Logger.LogCoreWarning("Player " + game.getPeerInfo(peer).userId + " sent an invalid heartbeat - Timestamp error (diff: " + diff);
            }
            else
            {
              //  Logger.LogCoreInfo("Player %d sent heartbeat (diff: %.f)", peerInfo(peer)->userId, diff);
            }

            return true;
        }
示例#40
0
        public static async Task SendNothingHappened(ENetPeer peer, int x, int y)
        {
            PlayerMoving data = new PlayerMoving
            {
                NetID        = (peer.Data as Player).NetID,
                PacketType   = 0x8,
                PlantingTree = 0
            };

            data.NetID  = -1;
            data.X      = x;
            data.Y      = y;
            data.PunchX = x;
            data.PunchY = y;
            await SendPacketRaw(4, PlayerMovingPack(data), 56, 0, peer);
        }
示例#41
0
 public static async Task SendRandomItems(ENetPeer peer, int x, int y, int items, World world)
 {
     try
     {
         Random r = new Random();
         int    rarity = ItemsData[items].Rarity / 3;
         int    a = x / 32, b = y / 32;
         if (rarity <= 5)
         {
             rarity = 3;
         }
         int gems = r.Next(0, rarity);
         int rand = r.Next(0, 20);
         if (rand > 10)
         {
             await SendGems(peer, x, y, 0, gems, world);
         }
         else if (rand > 4 && rand <= 10)
         {
             DroppedItem drop = new DroppedItem
             {
                 ItemID    = items + 1,
                 ItemCount = 1,
                 ItemName  = ""
             };
             world.Items[a + b * world.Width].DroppedItems.Add(drop);
             await peer.SendDrop(-1, x, y, items + 1, 1, 0);
         }
         else
         {
             DroppedItem drop = new DroppedItem
             {
                 ItemID    = items,
                 ItemCount = 1,
                 ItemName  = ItemsData[items + 1].Name
             };
             world.Items[a + b * world.Width].DroppedItems.Add(drop);
             await peer.SendDrop(-1, x, y, items, 1, 0);
         }
     }
     catch (Exception e) { Console.WriteLine("RandomItems error : " + e.Message); }
 }
        public void SendPacketRaw(int type, byte[] data, ENetPeer peer, ENetPacketFlags flag = ENetPacketFlags.Reliable)
        {
            if (peer == null)
            {
                return;
            }
            if (peer.IsNull)
            {
                return;
            }
            if (peer.State != ENetPeerState.Connected)
            {
                return;
            }

            byte[] packetData = new byte[data.Length + 5];
            Array.Copy(BitConverter.GetBytes(type), packetData, 4);
            Array.Copy(data, 0, packetData, 4, data.Length);
            SendData(packetData, peer);
        }
示例#43
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            game.IncrementReadyPlayers();
            if (game.getReadyPlayers() == game.getPlayers().Count)
            {
                var start = new StatePacket(PacketCmdS2C.PKT_S2C_StartGame);
                PacketHandlerManager.getInstace().broadcastPacket(start, Channel.CHL_S2C);

                foreach (var player in game.getPlayers())
                {
                    if (player.Item2.getPeer() == peer && !player.Item2.isVersionMatch())
                    {
                        var dm = new SpawnParticle.DebugMessage("Your client version does not match the server. Check the server log for more information.");
                        PacketHandlerManager.getInstace().sendPacket(peer, dm, Channel.CHL_S2C);
                    }
                }

                game.setStarted(true);
            }

            if (game.isStarted())
            {
                foreach (var p in game.getPlayers())
                {
                    var map = game.getMap();
                    map.addObject(p.Item2.getChampion());

                    // Send the initial game time sync packets, then let the map send another
                    float gameTime = map.getGameTime() / 1000.0f;

                    var timer = new GameTimer(gameTime); // 0xC1
                    PacketHandlerManager.getInstace().sendPacket(p.Item2.getPeer(), timer, Channel.CHL_S2C);

                    var timer2 = new GameTimerUpdate(gameTime); // 0xC2
                    PacketHandlerManager.getInstace().sendPacket(p.Item2.getPeer(), timer2, Channel.CHL_S2C);
                }
            }

            return true;
        }
示例#44
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            //Builds team info
            var screenInfo = new LoadScreenInfo(game.getPlayers());
            bool pInfo = PacketHandlerManager.getInstace().sendPacket(peer, screenInfo, Channel.CHL_LOADING_SCREEN);

            //For all players send this info
            bool bOk = false;
            foreach (var player in game.getPlayers())
            {
                var loadName = new LoadScreenPlayerName(player);
                var loadChampion = new LoadScreenPlayerChampion(player);
                bool pName = PacketHandlerManager.getInstace().sendPacket(peer, loadName, Channel.CHL_LOADING_SCREEN);
                bool pHero = PacketHandlerManager.getInstace().sendPacket(peer, loadChampion, Channel.CHL_LOADING_SCREEN);

                bOk = (pName && pHero);

                if (!bOk)
                    break;
            }

            return (pInfo && bOk);
        }
示例#45
0
        public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
        {
            // players[0].Item1 = peer->address.host; //temp
            //   players[0].Item2.setPeer(enetEvent.peer);

            var keyCheck = new KeyCheck(data);
            var userId = (long)BlowFishCS.BlowFishCS.Decrypt2(game.getBlowfish(), (ulong)keyCheck.checkId);

            if (userId != keyCheck.userId)
                return false;

            var playerNo = 0;

            foreach (var p in game.getPlayers())
            {
                var player = p.Item2;
                if (player.userId == userId)
                {
                    if (player.getPeer() != null)
                    {
                        Logger.LogCoreWarning("Ignoring new player " + userId + ", already connected!");
                        return false;
                    }

                    //TODO: add at least port or smth
                    p.Item1 = peer->address.host;
                    player.setPeer(peer);
                    var response = new KeyCheck(keyCheck.userId, playerNo);
                    bool bRet = PacketHandlerManager.getInstace().sendPacket(peer, response, Channel.CHL_HANDSHAKE);
                    handleGameNumber(player, peer, null);//Send 0x91 Packet?
                    return true;
                }
                ++playerNo;
            }
            return false;
        }
示例#46
0
 static extern void native_peer_timeout(ENetPeer* peer, uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum);
示例#47
0
 static extern void native_peer_disconnect_later(ENetPeer* peer, uint data);
示例#48
0
 static extern void native_peer_ping(ENetPeer* peer);
示例#49
0
 static extern void native_peer_ping_interval(ENetPeer* peer, uint pingInterval);
示例#50
0
 static extern ENetPacket* native_peer_receive(ENetPeer* peer, out byte channelID);
示例#51
0
 static extern void native_peer_reset(ENetPeer* peer);
示例#52
0
 public unsafe bool HandlePacket(ENetPeer* peer, byte[] data, Game game)
 {
     var ping = new AttentionPing(data);
     var response = new AttentionPingAns(game.getPeerInfo(peer), ping);
     return PacketHandlerManager.getInstace().broadcastPacketTeam(game.getPeerInfo(peer).getTeam(), response, Channel.CHL_S2C);
 }
示例#53
0
 static extern int native_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
示例#54
0
 public static extern void enet_peer_ping(ENetPeer* peer);
示例#55
0
 public static extern ENetPacket* enet_peer_receive(ENetPeer* peer, out byte channelID);
示例#56
0
 public static extern void enet_peer_reset(ENetPeer* peer);
示例#57
0
 public static extern int enet_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
示例#58
0
 public static extern void enet_peer_throttle_configure(ENetPeer* peer, uint interval, uint acceleration, uint deceleration);
示例#59
0
 public override void peer_timeout(ENetPeer* peer, uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum)
 {
     native_peer_timeout(peer, timeoutLimit, timeoutMinimum, timeoutMaximum);
 }
示例#60
0
 public static extern void enet_peer_disconnect_now(ENetPeer* peer, uint data);