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); }
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); }