Commit 9e5a0496 authored by hex's avatar hex

refactor tcphelper

parent eea918a9
Pipeline #38649 failed
...@@ -97,7 +97,7 @@ public class Book : WindowServant2D ...@@ -97,7 +97,7 @@ public class Book : WindowServant2D
{ {
deckString = ""; deckString = "";
master = new MultiStringMaster(); master = new MultiStringMaster();
foreach (var item in TcpHelper.deckStrings) foreach (var item in TcpHelperAsync.DeckStrings)
{ {
master.Add(item); master.Add(item);
} }
......
...@@ -97,7 +97,7 @@ public class Menu : WindowServantSP ...@@ -97,7 +97,7 @@ public class Menu : WindowServantSP
{ {
Program.I().quit(); Program.I().quit();
Program.Running = false; Program.Running = false;
TcpHelper.SaveRecord(); GameRecordManager.SaveRecord();
#if !UNITY_EDITOR && (UNITY_ANDROID || UNITY_IPHONE) // IL2CPP 使用此方法才能退出 #if !UNITY_EDITOR && (UNITY_ANDROID || UNITY_IPHONE) // IL2CPP 使用此方法才能退出
Application.Quit(); Application.Quit();
#else #else
......
using System;
using System.Collections.Concurrent;
using UnityEngine;
using YGOSharp.Network.Enums;
public class GameMessage
{
public CtosMessage MessageType { get; set; }
public object Data { get; set; }
public Action<bool> OnComplete { get; set; }
public GameMessage(CtosMessage messageType, object data = null, Action<bool> onComplete = null)
{
MessageType = messageType;
Data = data;
OnComplete = onComplete;
}
}
public static class GameMessageQueue
{
private static readonly ConcurrentQueue<GameMessage> _messageQueue = new ConcurrentQueue<GameMessage>();
public static void Enqueue(GameMessage message)
{
_messageQueue.Enqueue(message);
Debug.Log($"[GameMessageQueue] Enqueued message: {message.MessageType}");
}
public static bool TryDequeue(out GameMessage message)
{
return _messageQueue.TryDequeue(out message);
}
// 便捷方法
public static void SendResponse(byte[] response)
{
Enqueue(new GameMessage(CtosMessage.Response, response));
}
public static void SendChat(string text)
{
Enqueue(new GameMessage(CtosMessage.Chat, text));
}
public static void SendSurrender()
{
Enqueue(new GameMessage(CtosMessage.Surrender));
}
public static void SendHandResult(int result)
{
Enqueue(new GameMessage(CtosMessage.HandResult, result));
}
public static void SendTpResult(bool tp)
{
Enqueue(new GameMessage(CtosMessage.TpResult, tp));
}
public static void SendUpdateDeck(YGOSharp.Deck deck)
{
Enqueue(new GameMessage(CtosMessage.UpdateDeck, deck));
}
public static void SendLeaveGame()
{
Enqueue(new GameMessage(CtosMessage.LeaveGame));
}
public static void SendTimeConfirm()
{
Enqueue(new GameMessage(CtosMessage.TimeConfirm));
}
public static void SendHsToDuelist()
{
Enqueue(new GameMessage(CtosMessage.HsToDuelist));
}
public static void SendHsToObserver()
{
Enqueue(new GameMessage(CtosMessage.HsToObserver));
}
public static void SendHsReady()
{
Enqueue(new GameMessage(CtosMessage.HsReady));
}
public static void SendHsNotReady()
{
Enqueue(new GameMessage(CtosMessage.HsNotReady));
}
public static void SendHsKick(int position)
{
Enqueue(new GameMessage(CtosMessage.HsKick, position));
}
public static void SendHsStart()
{
Enqueue(new GameMessage(CtosMessage.HsStart));
}
public static void SendExternalAddress(string hostname)
{
Enqueue(new GameMessage(CtosMessage.ExternalAddress, hostname));
}
public static void SendPlayerInfo(string name)
{
Enqueue(new GameMessage(CtosMessage.PlayerInfo, name));
}
public static void SendJoinGame(string password, string version = null)
{
Enqueue(new GameMessage(CtosMessage.JoinGame, new { password, version }));
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using YGOSharp.OCGWrapper.Enums;
public static class GameRecordManager
{
private static readonly List<Package> _packagesInRecord = new List<Package>();
public static string LastRecordName { get; private set; } = "";
public static void AddRecordLine(Package package)
{
if (Program.I().ocgcore.condition != Ocgcore.Condition.record)
{
_packagesInRecord.Add(package);
}
}
public static void SaveRecord()
{
try
{
if (_packagesInRecord.Count > 10)
{
bool shouldWrite = false;
int startIndex = 0;
int currentIndex = 0;
foreach (var package in _packagesInRecord)
{
currentIndex++;
try
{
if (package.Fuction == (int)GameMessage.Start ||
package.Fuction == (int)GameMessage.ReloadField)
{
shouldWrite = true;
startIndex = currentIndex;
}
}
catch (Exception e)
{
Debug.LogError($"[GameRecordManager] Error processing package: {e.Message}");
}
}
if (shouldWrite)
{
if (startIndex > _packagesInRecord.Count)
{
startIndex = _packagesInRecord.Count;
}
_packagesInRecord.Insert(startIndex, Program.I().ocgcore.getNamePacket());
LastRecordName = UIHelper.getTimeString();
string replayPath = "replay/" + LastRecordName + ".yrp3d";
using (var stream = File.Create(replayPath))
using (var writer = new BinaryWriter(stream))
{
foreach (var package in _packagesInRecord)
{
writer.Write((byte)package.Fuction);
writer.Write((uint)package.Data.getLength());
writer.Write(package.Data.get());
}
stream.Flush();
}
Debug.Log($"[GameRecordManager] Record saved: {replayPath}");
}
}
_packagesInRecord.Clear();
}
catch (Exception e)
{
Debug.LogError($"[GameRecordManager] Error saving record: {e.Message}");
}
}
public static void ClearRecord()
{
_packagesInRecord.Clear();
Debug.Log("[GameRecordManager] Record cleared");
}
public static List<Package> ReadPackagesFromRecord(string path)
{
Debug.Log($"[GameRecordManager] Reading record from: {path}");
List<Package> packages = new List<Package>();
try
{
byte[] data = File.ReadAllBytes(path);
packages = ParsePackages(data);
}
catch (Exception e)
{
Debug.LogError($"[GameRecordManager] Error reading record: {e.Message}");
}
return packages;
}
public static List<Package> ParsePackages(byte[] buffer)
{
List<Package> packages = new List<Package>();
try
{
using (var reader = new BinaryReader(new MemoryStream(buffer)))
{
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
Package package = new Package();
package.Fuction = reader.ReadByte();
uint dataLength = reader.ReadUInt32();
package.Data = new BinaryMaster(reader.ReadBytes((int)dataLength));
packages.Add(package);
}
}
}
catch (Exception e)
{
Debug.LogError($"[GameRecordManager] Error parsing packages: {e.Message}");
}
return packages;
}
}
\ No newline at end of file
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
using YGOSharp.Network.Enums;
using YGOSharp.OCGWrapper.Enums;
public enum ConnectionState
{
Disconnected,
Connecting,
Connected,
Error
}
public static class TcpHelperAsync
{
public static event Action<ConnectionState> OnStateChanged;
public static event Action<Exception> OnError;
public static event Action OnConnected;
public static event Action OnDisconnected;
private static TcpClient _tcpClient;
private static NetworkStream _networkStream;
private static ConnectionState _currentState = ConnectionState.Disconnected;
private static CancellationTokenSource _cancellationTokenSource;
private static readonly ConcurrentQueue<byte[]> _receivedData = new ConcurrentQueue<byte[]>();
private static readonly object _stateLock = new object();
private static bool _isRoomListMode = false;
public static ConnectionState CurrentState => _currentState;
public static bool IsConnected => _currentState == ConnectionState.Connected;
public static YGOSharp.Deck CurrentDeck { get; private set; }
public static List<string> DeckStrings { get; private set; } = new List<string>();
public static void AddReceivedData(byte[] data)
{
_receivedData.Enqueue(data);
}
public static async Task<bool> ConnectAsync(string ip, string name, string port, string password, string version)
{
if (_currentState == ConnectionState.Connecting || _currentState == ConnectionState.Connected)
{
Debug.LogWarning("[TcpHelper] Already connecting or connected");
return false;
}
SetState(ConnectionState.Connecting);
try
{
_cancellationTokenSource?.Cancel();
_cancellationTokenSource = new CancellationTokenSource();
int portInt = int.Parse(port);
_tcpClient = new TcpClient();
await _tcpClient.ConnectAsync(ip, portInt);
if (_tcpClient.Connected)
{
_networkStream = _tcpClient.GetStream();
SetState(ConnectionState.Connected);
// 发送初始化消息
SendInitialMessages(ip, name, password, version);
// 启动接收循环
_ = Task.Run(async () => await ReceiveLoop(_cancellationTokenSource.Token));
OnConnected?.Invoke();
return true;
}
}
catch (Exception ex)
{
Debug.LogError($"[TcpHelper] Connection failed: {ex.Message}");
SetState(ConnectionState.Error);
OnError?.Invoke(ex);
CleanupConnection();
}
return false;
}
public static void Disconnect()
{
if (_currentState == ConnectionState.Disconnected)
return;
Debug.Log("[TcpHelper] Disconnecting...");
_cancellationTokenSource?.Cancel();
CleanupConnection();
SetState(ConnectionState.Disconnected);
OnDisconnected?.Invoke();
}
public static void ProcessMessages()
{
// 处理接收到的消息
while (_receivedData.TryDequeue(out byte[] data))
{
try
{
ProcessReceivedData(data);
}
catch (Exception ex)
{
Debug.LogError($"[TcpHelper] Error processing received message: {ex.Message}");
}
}
// 处理待发送的消息
ProcessOutgoingMessages();
}
private static void ProcessOutgoingMessages()
{
while (GameMessageQueue.TryDequeue(out GameMessage message))
{
try
{
var package = CreatePackageFromMessage(message);
if (package != null)
{
_ = SendPackageAsync(package, message.OnComplete);
}
}
catch (Exception ex)
{
Debug.LogError($"[TcpHelper] Error processing outgoing message: {ex.Message}");
message.OnComplete?.Invoke(false);
}
}
}
private static Package CreatePackageFromMessage(GameMessage message)
{
var package = new Package();
package.Fuction = (int)message.MessageType;
switch (message.MessageType)
{
case CtosMessage.Response:
if (message.Data is byte[] response)
package.Data.writer.Write(response);
break;
case CtosMessage.Chat:
if (message.Data is string text)
package.Data.writer.WriteUnicode(text, text.Length + 1);
break;
case CtosMessage.HandResult:
if (message.Data is int result)
package.Data.writer.Write((byte)result);
break;
case CtosMessage.TpResult:
if (message.Data is bool tp)
package.Data.writer.Write((byte)(tp ? 1 : 0));
break;
case CtosMessage.UpdateDeck:
if (message.Data is YGOSharp.Deck deck)
{
if (deck.Main.Count == 0)
{
Debug.LogWarning("[TcpHelper] Cannot send empty deck");
return null;
}
CurrentDeck = deck; // 保存当前卡组
DeckStrings.Clear(); // 清除旧的卡组名称
package.Data.writer.Write(deck.Main.Count + deck.Extra.Count);
package.Data.writer.Write(deck.Side.Count);
foreach (int cardId in deck.Main)
{
package.Data.writer.Write(cardId);
var card = YGOSharp.CardsManager.Get(cardId);
DeckStrings.Add(card.Name);
}
foreach (int cardId in deck.Extra)
package.Data.writer.Write(cardId);
foreach (int cardId in deck.Side)
package.Data.writer.Write(cardId);
}
break;
case CtosMessage.HsKick:
if (message.Data is int position)
package.Data.writer.Write((byte)position);
break;
case CtosMessage.ExternalAddress:
if (message.Data is string hostname)
{
package.Data.writer.Write((uint)0);
package.Data.writer.WriteUnicode(hostname, hostname.Length + 1);
}
break;
case CtosMessage.PlayerInfo:
if (message.Data is string name)
package.Data.writer.WriteUnicode(name, 20);
break;
case CtosMessage.JoinGame:
if (message.Data != null)
{
DeckStrings.Clear(); // 清除卡组名称
dynamic joinData = message.Data;
package.Data.writer.Write((short)Config.ClientVersion);
package.Data.writer.Write((byte)204);
package.Data.writer.Write((byte)204);
package.Data.writer.Write(0);
package.Data.writer.WriteUnicode(joinData.password ?? "", 20);
}
break;
// 无参数消息
case CtosMessage.Surrender:
case CtosMessage.LeaveGame:
case CtosMessage.TimeConfirm:
case CtosMessage.HsToDuelist:
case CtosMessage.HsToObserver:
case CtosMessage.HsReady:
case CtosMessage.HsNotReady:
case CtosMessage.HsStart:
// 无需额外数据
break;
default:
Debug.LogWarning($"[TcpHelper] Unhandled message type: {message.MessageType}");
return null;
}
return package;
}
private static async Task SendPackageAsync(Package package, Action<bool> onComplete)
{
bool success = await SendAsync(package);
onComplete?.Invoke(success);
}
public static async Task<bool> SendAsync(Package message)
{
if (_currentState != ConnectionState.Connected || _networkStream == null)
{
Debug.LogWarning("[TcpHelper] Cannot send - not connected");
return false;
}
try
{
byte[] data = message.Data.get();
int totalLen = 2 + 1 + data.Length;
byte[] buffer = new byte[totalLen];
short len = (short)(data.Length + 1);
buffer[0] = (byte)(len & 0xFF);
buffer[1] = (byte)((len >> 8) & 0xFF);
buffer[2] = (byte)message.Fuction;
Buffer.BlockCopy(data, 0, buffer, 3, data.Length);
await _networkStream.WriteAsync(buffer, 0, buffer.Length);
await _networkStream.FlushAsync();
return true;
}
catch (Exception ex)
{
Debug.LogError($"[TcpHelper] Send failed: {ex.Message}");
SetState(ConnectionState.Error);
OnError?.Invoke(ex);
return false;
}
}
private static async Task ReceiveLoop(CancellationToken cancellationToken)
{
try
{
while (!cancellationToken.IsCancellationRequested && _tcpClient?.Connected == true)
{
byte[] data = await ReadPacketAsync(_networkStream, cancellationToken);
if (data != null)
{
_receivedData.Enqueue(data);
}
}
}
catch (OperationCanceledException)
{
Debug.Log("[TcpHelper] Receive loop cancelled");
}
catch (Exception ex)
{
Debug.LogError($"[TcpHelper] Receive error: {ex.Message}");
SetState(ConnectionState.Error);
OnError?.Invoke(ex);
}
finally
{
if (_currentState == ConnectionState.Connected)
{
SetState(ConnectionState.Disconnected);
OnDisconnected?.Invoke();
}
}
}
private static async Task<byte[]> ReadPacketAsync(NetworkStream stream, CancellationToken cancellationToken)
{
byte[] header = new byte[2];
int headerBytesRead = 0;
while (headerBytesRead < 2)
{
int bytesRead = await stream.ReadAsync(header, headerBytesRead, 2 - headerBytesRead, cancellationToken);
if (bytesRead == 0)
{
Debug.LogWarning("[TcpHelper] Connection closed by server");
return null;
}
headerBytesRead += bytesRead;
}
int packetLength = BitConverter.ToUInt16(header, 0);
byte[] packet = new byte[packetLength];
int packetBytesRead = 0;
while (packetBytesRead < packetLength)
{
int bytesRead = await stream.ReadAsync(packet, packetBytesRead, packetLength - packetBytesRead, cancellationToken);
if (bytesRead == 0)
{
Debug.LogWarning("[TcpHelper] Connection closed during packet read");
return null;
}
packetBytesRead += bytesRead;
}
return packet;
}
private static void SetState(ConnectionState newState)
{
lock (_stateLock)
{
if (_currentState != newState)
{
Debug.Log($"[TcpHelper] State changed: {_currentState} -> {newState}");
_currentState = newState;
OnStateChanged?.Invoke(newState);
}
}
}
private static void CleanupConnection()
{
try
{
_networkStream?.Close();
_tcpClient?.Close();
}
catch (Exception ex)
{
Debug.LogWarning($"[TcpHelper] Cleanup error: {ex.Message}");
}
finally
{
_networkStream = null;
_tcpClient = null;
}
}
private static void SendInitialMessages(string ip, string name, string password, string version)
{
GameMessageQueue.SendExternalAddress(ip);
GameMessageQueue.SendPlayerInfo(name);
_isRoomListMode = password == "L";
GameMessageQueue.SendJoinGame(password, version);
}
private static void ProcessReceivedData(byte[] data)
{
using (var memoryStream = new MemoryStream(data))
using (var reader = new BinaryReader(memoryStream))
{
var messageType = (StocMessage)reader.ReadByte();
switch (messageType)
{
case StocMessage.GameMsg:
Program.I().room.StocMessage_GameMsg(reader);
break;
case StocMessage.ErrorMsg:
Program.I().room.StocMessage_ErrorMsg(reader);
break;
case StocMessage.Chat:
Program.I().room.StocMessage_Chat(reader);
break;
case StocMessage.DuelEnd:
Program.I().room.StocMessage_DuelEnd(reader);
break;
case StocMessage.RoomList:
((Room)Program.I().room).StocMessage_RoomList(reader);
break;
default:
HandleOtherMessages(messageType, reader);
break;
}
}
}
private static void HandleOtherMessages(StocMessage messageType, BinaryReader reader)
{
switch (messageType)
{
case StocMessage.SelectHand:
Program.I().room.StocMessage_SelectHand(reader);
break;
case StocMessage.SelectTp:
Program.I().room.StocMessage_SelectTp(reader);
break;
case StocMessage.HandResult:
Program.I().room.StocMessage_HandResult(reader);
break;
case StocMessage.TpResult:
Program.I().room.StocMessage_TpResult(reader);
break;
case StocMessage.ChangeSide:
Program.I().room.StocMessage_ChangeSide(reader);
break;
case StocMessage.WaitingSide:
Program.I().room.StocMessage_WaitingSide(reader);
break;
case StocMessage.DeckCount:
Program.I().room.StocMessage_DeckCount(reader);
break;
case StocMessage.CreateGame:
Program.I().room.StocMessage_CreateGame(reader);
break;
case StocMessage.JoinGame:
Program.I().room.StocMessage_JoinGame(reader);
break;
case StocMessage.TypeChange:
Program.I().room.StocMessage_TypeChange(reader);
break;
case StocMessage.LeaveGame:
Program.I().room.StocMessage_LeaveGame(reader);
break;
case StocMessage.DuelStart:
Program.I().room.StocMessage_DuelStart(reader);
break;
case StocMessage.Replay:
Program.I().room.StocMessage_Replay(reader);
break;
case StocMessage.TimeLimit:
Program.I().ocgcore.StocMessage_TimeLimit(reader);
break;
case StocMessage.HsPlayerEnter:
Program.I().room.StocMessage_HsPlayerEnter(reader);
break;
case StocMessage.HsPlayerChange:
Program.I().room.StocMessage_HsPlayerChange(reader);
break;
case StocMessage.HsWatchChange:
Program.I().room.StocMessage_HsWatchChange(reader);
break;
case StocMessage.TeammateSurrender:
Program.I().room.StocMessage_TeammateSurrender(reader);
break;
}
}
}
\ No newline at end of file
using UnityEngine;
public class TcpHelperTest : MonoBehaviour
{
void Start()
{
// 测试连接状态
Debug.Log($"[Test] Initial state: {TcpHelperAsync.CurrentState}");
Debug.Log($"[Test] Is connected: {TcpHelperAsync.IsConnected}");
// 测试消息队列
GameMessageQueue.SendChat("Test message from queue");
Debug.Log("[Test] Message queued successfully");
// 测试事件订阅
TcpHelperAsync.OnStateChanged += OnConnectionStateChanged;
TcpHelperAsync.OnConnected += OnConnected;
TcpHelperAsync.OnDisconnected += OnDisconnected;
TcpHelperAsync.OnError += OnError;
Debug.Log("[Test] Event handlers registered");
}
void Update()
{
// 在主线程处理消息
TcpHelperAsync.ProcessMessages();
}
void OnDestroy()
{
// 清理事件订阅
TcpHelperAsync.OnStateChanged -= OnConnectionStateChanged;
TcpHelperAsync.OnConnected -= OnConnected;
TcpHelperAsync.OnDisconnected -= OnDisconnected;
TcpHelperAsync.OnError -= OnError;
}
private void OnConnectionStateChanged(ConnectionState newState)
{
Debug.Log($"[Test] Connection state changed to: {newState}");
}
private void OnConnected()
{
Debug.Log("[Test] Connected successfully!");
}
private void OnDisconnected()
{
Debug.Log("[Test] Disconnected");
}
private void OnError(System.Exception error)
{
Debug.LogError($"[Test] Connection error: {error.Message}");
}
// 测试连接方法
[ContextMenu("Test Connection")]
public async void TestConnection()
{
bool success = await TcpHelperAsync.ConnectAsync("127.0.0.1", "TestUser", "7911", "TestRoom", "0x1340");
Debug.Log($"[Test] Connection result: {success}");
}
[ContextMenu("Test Disconnect")]
public void TestDisconnect()
{
TcpHelperAsync.Disconnect();
Debug.Log("[Test] Disconnect called");
}
}
\ No newline at end of file
...@@ -54,15 +54,12 @@ public class MyCard : WindowServantSP ...@@ -54,15 +54,12 @@ public class MyCard : WindowServantSP
void onClickExit() void onClickExit()
{ {
Program.I().shiftToServant(Program.I().menu); Program.I().shiftToServant(Program.I().menu);
if (TcpHelper.tcpClient != null) if (TcpHelperAsync.IsConnected)
{ {
if (isRequesting) { if (isRequesting) {
terminateThread(); terminateThread();
} }
if (TcpHelper.tcpClient.Connected) TcpHelperAsync.Disconnect();
{
TcpHelper.tcpClient.Close();
}
} }
} }
...@@ -95,7 +92,7 @@ public class MyCard : WindowServantSP ...@@ -95,7 +92,7 @@ public class MyCard : WindowServantSP
Program.PrintToChat(InterString.Get("匹配成功。正在进入房间。")); Program.PrintToChat(InterString.Get("匹配成功。正在进入房间。"));
this.isMatching = true; this.isMatching = true;
(new Thread(() => { TcpHelper.join(matchResultObject.address, mycardHelper.username, matchResultObject.port.ToString(), matchResultObject.password, "0x" + String.Format("{0:X}", Config.ClientVersion)); })).Start(); _ = TcpHelperAsync.ConnectAsync(matchResultObject.address, mycardHelper.username, matchResultObject.port.ToString(), matchResultObject.password, "0x" + String.Format("{0:X}", Config.ClientVersion));
isRequesting = false; isRequesting = false;
} catch (Exception e) { } catch (Exception e) {
if (e.GetType() != typeof(ThreadAbortException)) { if (e.GetType() != typeof(ThreadAbortException)) {
......
...@@ -794,7 +794,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -794,7 +794,7 @@ public class Ocgcore : ServantWithCardDescription
public void returnTo() public void returnTo()
{ {
TcpHelper.SaveRecord(); GameRecordManager.SaveRecord();
if (returnServant != null) if (returnServant != null)
{ {
Program.I().shiftToServant(returnServant); Program.I().shiftToServant(returnServant);
...@@ -815,30 +815,19 @@ public class Ocgcore : ServantWithCardDescription ...@@ -815,30 +815,19 @@ public class Ocgcore : ServantWithCardDescription
public void onExit() public void onExit()
{ {
if (TcpHelper.tcpClient != null) if (TcpHelperAsync.IsConnected)
{
if (TcpHelper.tcpClient.Connected)
{ {
setDefaultReturnServant(); setDefaultReturnServant();
TcpHelper.tcpClient.Client.Shutdown(0); TcpHelperAsync.Disconnect();
TcpHelper.tcpClient.Close();
}
TcpHelper.tcpClient = null;
} }
returnTo(); returnTo();
} }
public void onEmergencyExit() public void onEmergencyExit()
{ {
if (TcpHelper.tcpClient != null) if (TcpHelperAsync.IsConnected)
{ {
/*if (TcpHelper.tcpClient.Connected) TcpHelperAsync.Disconnect();
{
setDefaultReturnServant();
TcpHelper.tcpClient.Client.Shutdown(0);
TcpHelper.tcpClient.Close();
} */
TcpHelper.tcpClient = null;
} }
returnTo(); returnTo();
} }
...@@ -876,7 +865,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -876,7 +865,7 @@ public class Ocgcore : ServantWithCardDescription
public void addPackage(Package p) public void addPackage(Package p)
{ {
TcpHelper.AddRecordLine(p); GameRecordManager.AddRecordLine(p);
Packages.Enqueue(p); Packages.Enqueue(p);
Packages_ALL.Add(p); Packages_ALL.Add(p);
} }
...@@ -2908,9 +2897,9 @@ public class Ocgcore : ServantWithCardDescription ...@@ -2908,9 +2897,9 @@ public class Ocgcore : ServantWithCardDescription
{ {
try try
{ {
if (File.Exists("replay/" + TcpHelper.lastRecordName + ".yrp3d")) if (File.Exists("replay/" + GameRecordManager.LastRecordName + ".yrp3d"))
{ {
if (TcpHelper.lastRecordName != winCaculator.input.value) if (GameRecordManager.LastRecordName != winCaculator.input.value)
{ {
if (File.Exists("replay/" + winCaculator.input.value + ".yrp3d")) if (File.Exists("replay/" + winCaculator.input.value + ".yrp3d"))
{ {
...@@ -2918,7 +2907,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -2918,7 +2907,7 @@ public class Ocgcore : ServantWithCardDescription
} }
} }
File.Move( File.Move(
"replay/" + TcpHelper.lastRecordName + ".yrp3d", "replay/" + GameRecordManager.LastRecordName + ".yrp3d",
"replay/" + winCaculator.input.value + ".yrp3d" "replay/" + winCaculator.input.value + ".yrp3d"
); );
} }
...@@ -2937,14 +2926,14 @@ public class Ocgcore : ServantWithCardDescription ...@@ -2937,14 +2926,14 @@ public class Ocgcore : ServantWithCardDescription
{ {
try try
{ {
if (File.Exists("replay/" + TcpHelper.lastRecordName + ".yrp3d")) if (File.Exists("replay/" + GameRecordManager.LastRecordName + ".yrp3d"))
{ {
if (File.Exists("replay/" + "-lastReplay" + ".yrp3d")) if (File.Exists("replay/" + "-lastReplay" + ".yrp3d"))
{ {
File.Delete("replay/" + "-lastReplay" + ".yrp3d"); File.Delete("replay/" + "-lastReplay" + ".yrp3d");
} }
File.Move( File.Move(
"replay/" + TcpHelper.lastRecordName + ".yrp3d", "replay/" + GameRecordManager.LastRecordName + ".yrp3d",
"replay/-lastReplay.yrp3d" "replay/-lastReplay.yrp3d"
); );
} }
...@@ -7146,7 +7135,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -7146,7 +7135,7 @@ public class Ocgcore : ServantWithCardDescription
flagForCancleChain = false; flagForCancleChain = false;
//Package p = new Package(); //Package p = new Package();
//p.Fuction = (int)GameMessage.sibyl_clear; //p.Fuction = (int)GameMessage.sibyl_clear;
//TcpHelper.AddRecordLine(p); //GameRecordManager.AddRecordLine(p);
if (clearTimeFlag) if (clearTimeFlag)
{ {
clearTimeFlag = false; clearTimeFlag = false;
...@@ -7270,7 +7259,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -7270,7 +7259,7 @@ public class Ocgcore : ServantWithCardDescription
int player = r.ReadByte(); int player = r.ReadByte();
r.ReadByte(); r.ReadByte();
int time_limit = r.ReadInt16(); int time_limit = r.ReadInt16();
TcpHelper.CtosMessage_TimeConfirm(); GameMessageQueue.SendTimeConfirm();
gameInfo.setTime(unSwapPlayer(localPlayer(player)), time_limit); gameInfo.setTime(unSwapPlayer(localPlayer(player)), time_limit);
if (unSwapPlayer(localPlayer(player)) == 0) if (unSwapPlayer(localPlayer(player)) == 0)
{ {
...@@ -9079,7 +9068,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -9079,7 +9068,7 @@ public class Ocgcore : ServantWithCardDescription
void returnFromDeckEdit() void returnFromDeckEdit()
{ {
TcpHelper.CtosMessage_UpdateDeck(((DeckManager)Program.I().deckManager).getRealDeck()); GameMessageQueue.SendUpdateDeck(((DeckManager)Program.I().deckManager).getRealDeck());
} }
public GameField gameField; public GameField gameField;
...@@ -9941,13 +9930,13 @@ public class Ocgcore : ServantWithCardDescription ...@@ -9941,13 +9930,13 @@ public class Ocgcore : ServantWithCardDescription
if (result.value == "yes") if (result.value == "yes")
{ {
surrended = true; surrended = true;
if (TcpHelper.tcpClient != null && TcpHelper.tcpClient.Connected) if (TcpHelperAsync.IsConnected)
{ {
if (paused) if (paused)
{ {
EventDelegate.Execute(UIHelper.getByName<UIButton>(toolBar, "go_").onClick); EventDelegate.Execute(UIHelper.getByName<UIButton>(toolBar, "go_").onClick);
} }
TcpHelper.CtosMessage_Surrender(); GameMessageQueue.SendSurrender();
} }
else else
{ {
...@@ -9965,8 +9954,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -9965,8 +9954,7 @@ public class Ocgcore : ServantWithCardDescription
if ( if (
Program.I().room.duelEnded == true Program.I().room.duelEnded == true
|| surrended || surrended
|| TcpHelper.tcpClient == null || !TcpHelperAsync.IsConnected
|| TcpHelper.tcpClient.Connected == false
) )
{ {
surrended = false; surrended = false;
...@@ -9983,7 +9971,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -9983,7 +9971,7 @@ public class Ocgcore : ServantWithCardDescription
RMSshow_none(InterString.Get("右侧为您准备了对手上一局使用的卡。")); RMSshow_none(InterString.Get("右侧为您准备了对手上一局使用的卡。"));
((DeckManager)Program.I().deckManager).shiftCondition(DeckManager.Condition.changeSide); ((DeckManager)Program.I().deckManager).shiftCondition(DeckManager.Condition.changeSide);
returnTo(); returnTo();
((DeckManager)Program.I().deckManager).deck = TcpHelper.deck; ((DeckManager)Program.I().deckManager).deck = TcpHelperAsync.CurrentDeck;
((DeckManager)Program.I().deckManager).FormCodedDeckToObjectDeck(); ((DeckManager)Program.I().deckManager).FormCodedDeckToObjectDeck();
((CardDescription)Program.I().cardDescription).setTitle( ((CardDescription)Program.I().cardDescription).setTitle(
Config.Get("deckInUse", "miaowu") Config.Get("deckInUse", "miaowu")
...@@ -10013,8 +10001,7 @@ public class Ocgcore : ServantWithCardDescription ...@@ -10013,8 +10001,7 @@ public class Ocgcore : ServantWithCardDescription
if ( if (
Program.I().room.duelEnded == true Program.I().room.duelEnded == true
|| surrended || surrended
|| TcpHelper.tcpClient == null || !TcpHelperAsync.IsConnected
|| TcpHelper.tcpClient.Connected == false
|| Program.I().room.needSide == true || Program.I().room.needSide == true
|| condition != Condition.duel || condition != Condition.duel
) )
......
...@@ -1234,7 +1234,7 @@ public class Program : MonoBehaviour ...@@ -1234,7 +1234,7 @@ public class Program : MonoBehaviour
{ {
servants[i].Update(); servants[i].Update();
} }
TcpHelper.preFrameFunction(); TcpHelperAsync.ProcessMessages();
delayedTask remove = null; delayedTask remove = null;
while (true) while (true)
{ {
...@@ -1321,7 +1321,7 @@ public class Program : MonoBehaviour ...@@ -1321,7 +1321,7 @@ public class Program : MonoBehaviour
void OnApplicationQuit() void OnApplicationQuit()
{ {
TcpHelper.SaveRecord(); GameRecordManager.SaveRecord();
SaveConfig(); SaveConfig();
for (int i = 0; i < servants.Count; i++) for (int i = 0; i < servants.Count; i++)
{ {
...@@ -1330,7 +1330,7 @@ public class Program : MonoBehaviour ...@@ -1330,7 +1330,7 @@ public class Program : MonoBehaviour
Running = false; Running = false;
try try
{ {
TcpHelper.tcpClient.Close(); TcpHelperAsync.Disconnect();
} }
catch (System.Exception e) catch (System.Exception e)
{ {
......
...@@ -29,11 +29,11 @@ public class Room : WindowServantSP ...@@ -29,11 +29,11 @@ public class Room : WindowServantSP
&& realPlayers[selftype].getIfPreped() && realPlayers[selftype].getIfPreped()
) )
{ {
TcpHelper.CtosMessage_HsNotReady(); GameMessageQueue.SendHsNotReady();
TcpHelper.CtosMessage_UpdateDeck( GameMessageQueue.SendUpdateDeck(
new YGOSharp.Deck("deck/" + superScrollView.selectedString + ".ydk") new YGOSharp.Deck("deck/" + superScrollView.selectedString + ".ydk")
); );
TcpHelper.CtosMessage_HsReady(); GameMessageQueue.SendHsReady();
} }
} }
...@@ -99,7 +99,7 @@ public class Room : WindowServantSP ...@@ -99,7 +99,7 @@ public class Room : WindowServantSP
{ {
if (val != "") if (val != "")
{ {
TcpHelper.CtosMessage_Chat(val); GameMessageQueue.SendChat(val);
//AddChatMsg(val, -1); //AddChatMsg(val, -1);
} }
} }
...@@ -112,7 +112,7 @@ public class Room : WindowServantSP ...@@ -112,7 +112,7 @@ public class Room : WindowServantSP
void handler(byte[] buffer) void handler(byte[] buffer)
{ {
TcpHelper.CtosMessage_Response(buffer); GameMessageQueue.SendResponse(buffer);
} }
#region STOC #region STOC
...@@ -288,7 +288,7 @@ public class Room : WindowServantSP ...@@ -288,7 +288,7 @@ public class Room : WindowServantSP
p.Fuction = (int)YGOSharp.OCGWrapper.Enums.GameMessage.sibyl_chat; p.Fuction = (int)YGOSharp.OCGWrapper.Enums.GameMessage.sibyl_chat;
p.Data = new BinaryMaster(); p.Data = new BinaryMaster();
p.Data.writer.WriteUnicode(res, res.Length + 1); p.Data.writer.WriteUnicode(res, res.Length + 1);
TcpHelper.AddRecordLine(p); GameRecordManager.AddRecordLine(p);
switch ((PlayerType)player) switch ((PlayerType)player)
{ {
case PlayerType.Red: case PlayerType.Red:
...@@ -537,8 +537,8 @@ public class Room : WindowServantSP ...@@ -537,8 +537,8 @@ public class Room : WindowServantSP
p.Fuction = (int)YGOSharp.OCGWrapper.Enums.GameMessage.sibyl_replay; p.Fuction = (int)YGOSharp.OCGWrapper.Enums.GameMessage.sibyl_replay;
p.Data = new BinaryMaster(); p.Data = new BinaryMaster();
p.Data.writer.Write(data); p.Data.writer.Write(data);
TcpHelper.AddRecordLine(p); GameRecordManager.AddRecordLine(p);
TcpHelper.SaveRecord(); GameRecordManager.SaveRecord();
} }
public bool duelEnded = false; public bool duelEnded = false;
...@@ -739,26 +739,26 @@ public class Room : WindowServantSP ...@@ -739,26 +739,26 @@ public class Room : WindowServantSP
{ {
if (result[0].value == "first") if (result[0].value == "first")
{ {
TcpHelper.CtosMessage_TpResult(true); GameMessageQueue.SendTpResult(true);
} }
if (result[0].value == "second") if (result[0].value == "second")
{ {
TcpHelper.CtosMessage_TpResult(false); GameMessageQueue.SendTpResult(false);
} }
} }
if (hashCode == "StocMessage_SelectHand") if (hashCode == "StocMessage_SelectHand")
{ {
if (result[0].value == "jiandao") if (result[0].value == "jiandao")
{ {
TcpHelper.CtosMessage_HandResult(1); GameMessageQueue.SendHandResult(1);
} }
if (result[0].value == "shitou") if (result[0].value == "shitou")
{ {
TcpHelper.CtosMessage_HandResult(2); GameMessageQueue.SendHandResult(2);
} }
if (result[0].value == "bu") if (result[0].value == "bu")
{ {
TcpHelper.CtosMessage_HandResult(3); GameMessageQueue.SendHandResult(3);
} }
} }
} }
...@@ -1236,20 +1236,20 @@ public class Room : WindowServantSP ...@@ -1236,20 +1236,20 @@ public class Room : WindowServantSP
} }
if (arg2) if (arg2)
{ {
TcpHelper.CtosMessage_UpdateDeck( GameMessageQueue.SendUpdateDeck(
new YGOSharp.Deck("deck/" + Config.Get("deckInUse", "miaouwu") + ".ydk") new YGOSharp.Deck("deck/" + Config.Get("deckInUse", "miaouwu") + ".ydk")
); );
TcpHelper.CtosMessage_HsReady(); GameMessageQueue.SendHsReady();
} }
else else
{ {
TcpHelper.CtosMessage_HsNotReady(); GameMessageQueue.SendHsNotReady();
} }
} }
private void OnKick(int pos) private void OnKick(int pos)
{ {
TcpHelper.CtosMessage_HsKick(pos); GameMessageQueue.SendHsKick(pos);
} }
private UIButton startButton() private UIButton startButton()
...@@ -1289,28 +1289,28 @@ public class Room : WindowServantSP ...@@ -1289,28 +1289,28 @@ public class Room : WindowServantSP
{ {
if (realPlayers[selftype].getIfPreped()) if (realPlayers[selftype].getIfPreped())
{ {
TcpHelper.CtosMessage_HsNotReady(); GameMessageQueue.SendHsNotReady();
} }
else else
{ {
TcpHelper.CtosMessage_UpdateDeck( GameMessageQueue.SendUpdateDeck(
new YGOSharp.Deck("deck/" + Config.Get("deckInUse", "wizard") + ".ydk") new YGOSharp.Deck("deck/" + Config.Get("deckInUse", "wizard") + ".ydk")
); );
TcpHelper.CtosMessage_HsReady(); GameMessageQueue.SendHsReady();
} }
} }
} }
if (gameObjectListened.name == "duelist_") if (gameObjectListened.name == "duelist_")
{ {
TcpHelper.CtosMessage_HsToDuelist(); GameMessageQueue.SendHsToDuelist();
} }
if (gameObjectListened.name == "observer_") if (gameObjectListened.name == "observer_")
{ {
TcpHelper.CtosMessage_HsToObserver(); GameMessageQueue.SendHsToObserver();
} }
if (gameObjectListened.name == "start_") if (gameObjectListened.name == "start_")
{ {
TcpHelper.CtosMessage_HsStart(); GameMessageQueue.SendHsStart();
} }
} }
......
...@@ -33,7 +33,7 @@ public class PrecyOcg ...@@ -33,7 +33,7 @@ public class PrecyOcg
byte[] bufferR = new byte[buffer.Length + 1]; byte[] bufferR = new byte[buffer.Length + 1];
bufferR[0] = 1; bufferR[0] = 1;
buffer.CopyTo(bufferR,1); buffer.CopyTo(bufferR,1);
TcpHelper.addDateJumoLine(bufferR); TcpHelperAsync.AddReceivedData(bufferR);
} }
public void startPuzzle(System.String path) public void startPuzzle(System.String path)
......
...@@ -141,7 +141,7 @@ public class selectReplay : WindowServantSP ...@@ -141,7 +141,7 @@ public class selectReplay : WindowServantSP
byte[] returnValue = null; byte[] returnValue = null;
try try
{ {
var collection = TcpHelper.readPackagesInRecord(path); var collection = GameRecordManager.ReadPackagesFromRecord(path);
foreach (var item in collection) foreach (var item in collection)
{ {
Debug.Log(item.Fuction); Debug.Log(item.Fuction);
...@@ -467,7 +467,7 @@ public class selectReplay : WindowServantSP ...@@ -467,7 +467,7 @@ public class selectReplay : WindowServantSP
if (precy != null) if (precy != null)
precy.dispose(); precy.dispose();
precy = new PrecyOcg(); precy = new PrecyOcg();
var collections = TcpHelper.getPackages( var collections = GameRecordManager.ParsePackages(
precy.ygopro.getYRP3dBuffer( precy.ygopro.getYRP3dBuffer(
getYRP(getYRPbuffer("replay/" + name + ".yrp3d")) getYRP(getYRPbuffer("replay/" + name + ".yrp3d"))
) )
...@@ -476,7 +476,7 @@ public class selectReplay : WindowServantSP ...@@ -476,7 +476,7 @@ public class selectReplay : WindowServantSP
} }
else else
{ {
var collection = TcpHelper.readPackagesInRecord("replay/" + name + ".yrp3d"); var collection = GameRecordManager.ReadPackagesFromRecord("replay/" + name + ".yrp3d");
pushCollection(collection); pushCollection(collection);
} }
} }
...@@ -492,7 +492,7 @@ public class selectReplay : WindowServantSP ...@@ -492,7 +492,7 @@ public class selectReplay : WindowServantSP
if (precy != null) if (precy != null)
precy.dispose(); precy.dispose();
precy = new PrecyOcg(); precy = new PrecyOcg();
var collections = TcpHelper.getPackages( var collections = GameRecordManager.ParsePackages(
precy.ygopro.getYRP3dBuffer(getYRP(File.ReadAllBytes("replay/" + name))) precy.ygopro.getYRP3dBuffer(getYRP(File.ReadAllBytes("replay/" + name)))
); );
pushCollection(collections); pushCollection(collections);
......
...@@ -300,12 +300,9 @@ public class SelectServer : WindowServantSP ...@@ -300,12 +300,9 @@ public class SelectServer : WindowServantSP
void onClickExit() void onClickExit()
{ {
Program.I().shiftToServant(Program.I().menu); Program.I().shiftToServant(Program.I().menu);
if (TcpHelper.tcpClient != null) if (TcpHelperAsync.IsConnected)
{ {
if (TcpHelper.tcpClient.Connected) TcpHelperAsync.Disconnect();
{
TcpHelper.tcpClient.Close();
}
} }
} }
...@@ -383,12 +380,7 @@ public class SelectServer : WindowServantSP ...@@ -383,12 +380,7 @@ public class SelectServer : WindowServantSP
File.WriteAllText("config/passwords.conf", all); File.WriteAllText("config/passwords.conf", all);
printFile(false); printFile(false);
Program.I().mycard.isMatching = false; Program.I().mycard.isMatching = false;
( _ = TcpHelperAsync.ConnectAsync(ipString, name, portString, pswString, versionString);
new Thread(() =>
{
TcpHelper.join(ipString, name, portString, pswString, versionString);
})
).Start();
} }
else else
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment