private OTAPI.HookResult SendNetDataHandler(
            Terraria.Net.NetManager manager, Terraria.Net.Sockets.ISocket socket, ref Terraria.Net.NetPacket packet)
        {
            Debug.Assert(socket != null);
            Debug.Assert(packet.Buffer.Data != null);
            Debug.Assert(packet.Writer.BaseStream.Position >= 5);

            // Since we don't have an index, scan through the clients to find the player index.
            //
            // TODO: optimize this using a hash map, if needed
            var playerIndex = -1;

            for (var i = 0; i < Terraria.Netplay.MaxConnections; ++i)
            {
                if (Terraria.Netplay.Clients[i].Socket == socket)
                {
                    playerIndex = i;
                    break;
                }
            }

            Debug.Assert(playerIndex >= 0 && playerIndex < Count);

            var span     = packet.Buffer.Data.AsSpan(2..((int)packet.Writer.BaseStream.Position));
            var moduleId = Unsafe.ReadUnaligned <ushort>(ref span.At(1));

            // The `SendBytes` event is only triggered for module packets.
            var handler = _onSendModuleHandlers[moduleId] ?? OnSendPacket <ModulePacket <UnknownModule> >;

            handler(playerIndex, span);
            return(OTAPI.HookResult.Cancel);
        }
 private static HookResult OnSendNetData(NetManager manager, Terraria.Net.Sockets.ISocket socket, ref NetPacket packet)
 {
     if (_hookManager.InvokeNetSendNetData
         (
             ref manager,
             ref socket,
             ref packet
         ))
     {
         return(HookResult.Cancel);
     }
     return(HookResult.Continue);
 }
        internal bool InvokeNetSendNetData(
            ref NetManager netManager, ref Terraria.Net.Sockets.ISocket socket, ref NetPacket packet)
        {
            SendNetDataEventArgs args = new SendNetDataEventArgs
            {
                netManager = netManager,
                socket     = socket,
                packet     = packet
            };

            this.NetSendNetData.Invoke(args);

            return(args.Handled);
        }
Example #4
0
        static HookResult OnAccepted(Terraria.Net.Sockets.ISocket client)
        {
            int slot = FindNextOpenClientSlot();

            if (slot != -1)
            {
                Netplay.Clients[slot].Reset();
                Netplay.Clients[slot].Socket = client;
            }
            if (FindNextOpenClientSlot() == -1)
            {
                Netplay.StopListening();
            }
            return(HookResult.Cancel);
        }