Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
M
MDPro3
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
32
Issues
32
List
Boards
Labels
Service Desk
Milestones
Merge Requests
5
Merge Requests
5
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
赤子奈落
MDPro3
Commits
eea83a16
Commit
eea83a16
authored
Nov 25, 2025
by
SherryChaos
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Hand Test
parent
93c940ec
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
130 additions
and
19 deletions
+130
-19
Assets/Scripts/MDPro3/Duel/TcpHelper.cs
Assets/Scripts/MDPro3/Duel/TcpHelper.cs
+46
-6
Assets/Scripts/MDPro3/Servant/OnlineServant.cs
Assets/Scripts/MDPro3/Servant/OnlineServant.cs
+4
-0
Assets/Scripts/MDPro3/Servant/RoomServant.cs
Assets/Scripts/MDPro3/Servant/RoomServant.cs
+7
-2
Assets/Scripts/MDPro3/Servant/SoloSelector.cs
Assets/Scripts/MDPro3/Servant/SoloSelector.cs
+9
-0
Assets/Scripts/MDPro3/UI/ServantUI/DeckEditorUI.cs
Assets/Scripts/MDPro3/UI/ServantUI/DeckEditorUI.cs
+64
-11
No files found.
Assets/Scripts/MDPro3/Duel/TcpHelper.cs
View file @
eea83a16
using
MDPro3.Duel.YGOSharp
;
using
MDPro3.Net
;
using
MDPro3.Servant
;
using
System
;
using
System.Collections.Generic
;
using
System.IO
;
using
System.Linq
;
using
System.Net
;
using
System.Net.NetworkInformation
;
using
System.Net.Sockets
;
using
System.Text
;
using
System.Threading
;
using
UnityEngine
;
using
MDPro3.Duel.YGOSharp
;
using
MDPro3.Net
;
using
System.Net
;
using
MDPro3.Servant
;
namespace
MDPro3
{
...
...
@@ -183,10 +185,12 @@ namespace MDPro3
Program
.
instance
.
room
.
StocMessage_ErrorMsg
(
r
);
break
;
case
StocMessage
.
SelectHand
:
Program
.
instance
.
room
.
StocMessage_SelectHand
(
r
);
if
(!
RoomServant
.
FromHandTest
)
Program
.
instance
.
room
.
StocMessage_SelectHand
(
r
);
break
;
case
StocMessage
.
SelectTp
:
Program
.
instance
.
room
.
StocMessage_SelectTp
(
r
);
if
(!
RoomServant
.
FromHandTest
)
Program
.
instance
.
room
.
StocMessage_SelectTp
(
r
);
break
;
case
StocMessage
.
HandResult
:
Program
.
instance
.
room
.
StocMessage_HandResult
(
r
);
...
...
@@ -342,6 +346,7 @@ namespace MDPro3
}
#
region
CtosMessage
public
static
void
CtosMessage_Response
(
byte
[]
response
)
{
var
message
=
new
Package
();
...
...
@@ -607,6 +612,36 @@ namespace MDPro3
}
public
static
bool
IsPortAvailable
(
int
port
)
{
if
(
port
<
IPEndPoint
.
MinPort
||
port
>
IPEndPoint
.
MaxPort
)
{
throw
new
ArgumentException
(
$"指定的端口号
{
port
}
超出有效范围。"
);
}
bool
?
systemQueryResult
=
IsPortOccupiedBySystem
(
port
);
if
(
systemQueryResult
==
true
)
return
false
;
return
TryBindSocket
(
port
);
}
private
static
bool
?
IsPortOccupiedBySystem
(
int
port
)
{
try
{
IPGlobalProperties
ipProperties
=
IPGlobalProperties
.
GetIPGlobalProperties
();
IPEndPoint
[]
activeTcpListeners
=
ipProperties
.
GetActiveTcpListeners
();
bool
isInUse
=
activeTcpListeners
.
Any
(
endpoint
=>
endpoint
.
Port
==
port
);
return
isInUse
;
}
catch
(
Exception
)
{
return
null
;
}
}
private
static
bool
TryBindSocket
(
int
port
)
{
try
{
...
...
@@ -614,11 +649,16 @@ namespace MDPro3
socket
.
Bind
(
new
IPEndPoint
(
IPAddress
.
Loopback
,
port
));
return
true
;
}
catch
(
SocketException
)
{
return
false
;
}
catch
{
return
false
;
}
}
}
public
class
Package
...
...
Assets/Scripts/MDPro3/Servant/OnlineServant.cs
View file @
eea83a16
...
...
@@ -107,6 +107,7 @@ namespace MDPro3.Servant
RoomServant
.
FromSolo
=
false
;
RoomServant
.
FromLocalHost
=
false
;
RoomServant
.
FromHandTest
=
false
;
TcpHelper
.
LinkStart
(
ip
,
name
,
port
,
password
,
false
,
null
);
}
...
...
@@ -137,8 +138,11 @@ namespace MDPro3.Servant
serverArgs
[
9
],
serverArgs
[
6
],
"0"
);
RoomServant
.
FromSolo
=
false
;
RoomServant
.
FromLocalHost
=
true
;
RoomServant
.
FromHandTest
=
false
;
YgoServer
.
StartServer
(
args
);
TcpHelper
.
LinkStart
(
"127.0.0.1"
,
Config
.
Get
(
"DuelPlayerName0"
,
Config
.
EMPTY_STRING
),
port
.
ToString
(),
string
.
Empty
,
true
,
null
);
}
...
...
Assets/Scripts/MDPro3/Servant/RoomServant.cs
View file @
eea83a16
...
...
@@ -38,6 +38,7 @@ namespace MDPro3.Servant
public
static
bool
FromSolo
;
public
static
bool
SoloLockHand
;
public
static
bool
FromLocalHost
;
public
static
bool
FromHandTest
;
public
static
int
CoreShowing
=
0
;
public
class
Player
...
...
@@ -193,6 +194,8 @@ namespace MDPro3.Servant
OcgCore
.
lpLimit
=
StartLp
;
if
(
FromSolo
)
Program
.
instance
.
ocgcore
.
returnServant
=
Program
.
instance
.
solo
;
else
if
(
FromHandTest
)
Program
.
instance
.
ocgcore
.
returnServant
=
Program
.
instance
.
deckEditor
;
else
Program
.
instance
.
ocgcore
.
returnServant
=
Program
.
instance
.
online
;
if
(
SelfType
==
7
)
...
...
@@ -410,7 +413,8 @@ namespace MDPro3.Servant
for
(
int
i
=
0
;
i
<
4
;
i
++)
players
[
i
]
=
null
;
Program
.
instance
.
ShiftToServant
(
Program
.
instance
.
room
);
if
(!
FromHandTest
)
Program
.
instance
.
ShiftToServant
(
Program
.
instance
.
room
);
}
public
void
StocMessage_TypeChange
(
BinaryReader
r
)
...
...
@@ -434,7 +438,8 @@ namespace MDPro3.Servant
if
(
Program
.
instance
.
deckEditor
.
showing
)
{
Program
.
instance
.
deckEditor
.
Hide
(
0
);
MessageManager
.
Cast
(
InterString
.
Get
(
"更换副卡组成功,请等待对手更换副卡组。"
));
if
(!
FromHandTest
)
MessageManager
.
Cast
(
InterString
.
Get
(
"更换副卡组成功,请等待对手更换副卡组。"
));
}
if
(
showing
)
...
...
Assets/Scripts/MDPro3/Servant/SoloSelector.cs
View file @
eea83a16
...
...
@@ -176,6 +176,14 @@ namespace MDPro3.Servant
Program
.
instance
.
ShiftToServant
(
Program
.
instance
.
room
);
}
}
public
void
StartAIForHandTest
(
int
port
)
{
string
aiCommand
=
GetWindBotCommand
(
0
,
false
);
if
(!
string
.
IsNullOrEmpty
(
aiCommand
))
StartWindBot
(
aiCommand
,
"127.0.0.1"
,
port
.
ToString
(),
string
.
Empty
,
true
,
0
);
}
private
string
GetRandomBot
(
string
flag
)
{
IList
<
BotInfo
>
foundBots
=
new
List
<
BotInfo
>();
...
...
@@ -236,6 +244,7 @@ namespace MDPro3.Servant
else
RoomServant
.
SoloLockHand
=
false
;
RoomServant
.
FromLocalHost
=
false
;
RoomServant
.
FromHandTest
=
false
;
TcpHelper
.
LinkStart
(
"127.0.0.1"
,
Config
.
Get
(
"DuelPlayerName0"
,
Config
.
EMPTY_STRING
),
port
,
string
.
Empty
,
true
,
()
=>
StartWindBot
(
command
,
"127.0.0.1"
,
port
,
string
.
Empty
,
lockHand
,
0
));
...
...
Assets/Scripts/MDPro3/UI/ServantUI/DeckEditorUI.cs
View file @
eea83a16
using
Cysharp.Threading.Tasks
;
using
DG.Tweening
;
using
System.Collections.Generic
;
using
UnityEngine
;
using
UnityEngine.EventSystems
;
using
UnityEngine.UI
;
using
MDPro3.Servant
;
using
static
MDPro3
.
Servant
.
DeckEditor
;
using
MDPro3.Duel.YGOSharp
;
using
MDPro3.Net
;
using
System.Collections
;
using
MDPro3.Servant
;
using
MDPro3.Utility
;
using
System
;
using
System.Collections
;
using
System.Collections.Generic
;
using
System.IO
;
using
System.Threading.Tasks
;
using
MDPro3.Utility
;
using
Cysharp.Threading.Tasks
;
using
UnityEditor.Experimental.GraphView
;
using
UnityEngine
;
using
UnityEngine.EventSystems
;
using
UnityEngine.UI
;
using
static
MDPro3
.
Servant
.
DeckEditor
;
namespace
MDPro3.UI.ServantUI
{
...
...
@@ -199,7 +200,7 @@ namespace MDPro3.UI.ServantUI
{
base
.
ShowEvent
();
if
(!
gotoAppearance
)
if
(!
gotoAppearance
&&
!
RoomServant
.
FromHandTest
)
{
if
(
condition
!=
Condition
.
ChangeSide
)
ShowBackButton
();
...
...
@@ -209,6 +210,7 @@ namespace MDPro3.UI.ServantUI
else
{
gotoAppearance
=
false
;
RoomServant
.
FromHandTest
=
false
;
ShowBackButton
();
}
...
...
@@ -228,7 +230,7 @@ namespace MDPro3.UI.ServantUI
{
base
.
AfterHideEvent
();
if
(!
gotoAppearance
)
if
(!
gotoAppearance
||
!
RoomServant
.
FromHandTest
)
Dispose
();
}
...
...
@@ -923,8 +925,59 @@ namespace MDPro3.UI.ServantUI
public
void
OnHandTest
()
{
_
=
HandTestAsync
();
}
private
async
UniTask
HandTestAsync
()
{
UIManager
.
UIBlackIn
(
0.3f
);
await
UniTask
.
WaitForSeconds
(
0.3f
);
int
port
=
7911
;
while
(!
TcpHelper
.
IsPortAvailable
(
port
))
{
port
++;
if
(
port
==
65536
)
port
=
1
;
}
string
args
=
string
.
Format
(
"{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11}"
,
port
.
ToString
(),
BanlistManager
.
EmptyBanlistName
,
"5"
,
// Pool
"0"
,
// Model
"F"
,
//
"F"
,
// Check
"F"
,
// Shuffle
"8000"
,
// Life Point
"5"
,
// Hand
"1"
,
// Time
"0"
,
// Draw
"0"
);
RoomServant
.
FromSolo
=
false
;
RoomServant
.
FromLocalHost
=
false
;
RoomServant
.
FromHandTest
=
true
;
YgoServer
.
StartServer
(
args
);
await
UniTask
.
Delay
(
50
);
Program
.
instance
.
solo
.
StartAIForHandTest
(
port
);
await
UniTask
.
Delay
(
50
);
bool
joined
=
false
;
TcpHelper
.
LinkStart
(
"127.0.0.1"
,
Config
.
Get
(
"DuelPlayerName0"
,
Config
.
EMPTY_STRING
),
port
.
ToString
(),
string
.
Empty
,
true
,
()
=>
joined
=
true
);
await
UniTask
.
WaitUntil
(()
=>
joined
);
var
deck
=
DeckView
.
FromObjectDeckToCodedDeck
();
TcpHelper
.
CtosMessage_UpdateDeck
(
deck
);
TcpHelper
.
CtosMessage_HsReady
();
await
UniTask
.
Delay
(
50
);
TcpHelper
.
CtosMessage_HandResult
(
2
);
await
UniTask
.
Delay
(
50
);
TcpHelper
.
CtosMessage_TpResult
(
true
);
}
private
void
OnClearDeck
()
{
var
codes
=
new
List
<
int
>();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment