44using Microsoft . Extensions . Logging ;
55using Preparation . Utility ;
66using Protobuf ;
7+ using System . Threading ;
78using Utility = Preparation . Utility ;
89
910namespace Server
@@ -26,7 +27,7 @@ protected bool IsSpectatorJoin
2627 isSpectatorJoin = value ;
2728 }
2829 }
29-
30+
3031 #region 连接和初始化服务
3132
3233 public override Task < BoolRes > TryConnection ( IDMsg request , ServerCallContext context )
@@ -54,67 +55,156 @@ public override Task<BoolRes> TryConnection(IDMsg request, ServerCallContext con
5455
5556 protected readonly object addPlayerLock = new ( ) ;
5657 public override async Task RegisterFactory ( RegisterFactoryMsg request , IServerStreamWriter < MessageToClient > responseStream , ServerCallContext context )
57- {
58- GameServerLogging . logger . LogDebug (
59- $ "TRY Register Factory: Team { request . TeamId } ") ;
60- if ( game . GameMap . Timer . IsGaming )
61- return ;
62- if ( ! ValidPlayerID ( request . PlayerId ) ) //玩家id是否正确
63- return ;
64- if ( request . TeamId >= TeamCount )
65- return ;
66- if ( communicationToGameID [ request . TeamId ] [ request . PlayerId ] != GameObj . invalidID ) //是否已经添加了该玩家
67- return ;
68- GameServerLogging . logger . LogDebug ( "AddPlayer: Check Correct" ) ;
69- lock ( addPlayerLock )
70- {
71- GameServerLogging . logger . LogDebug ( "ch id :" + request . PlayerId + " te id:" + request . TeamId + " side: " + request . SideFlag ) ;
72- var temp = ( new SemaphoreSlim ( 0 , 1 ) , new SemaphoreSlim ( 0 , 1 ) ) ;
73- GameServerLogging . logger . LogInfo ( $ "Register Factory: Team { request . TeamId } ") ;
74- StartGame ( ) ;
75- }
76- bool exitFlag = false ;
77- bool firstTime = true ;
78- do
58+ {
59+ try
7960 {
80- semaDicts [ request . TeamId ] [ request . PlayerId ] . Item1 . Wait ( ) ;
81- Character ? character = game . GameMap . FindCharacterInPlayerID ( request . TeamId , request . PlayerId ) ;
82- // if(character!=null)
83- // {
84- // GameServerLogging.logger.LogInfo($"Character {request.PlayerId} exist! IsRemoved {character.IsRemoved}");
85- // }
86- // else{
87- // GameServerLogging.logger.LogInfo($"Character {request.PlayerId} null");
88- // }
89- if ( ! firstTime && request . PlayerId > 0 && ( character == null || character . IsRemoved == true ) )
90- {
91- // GameServerLogging.logger.LogInfo($"Cannot find character {request.PlayerId} from Team {request.TeamId}!");
92- }
93- else
61+ GameServerLogging . logger . LogDebug ( $ "TRY Register Factory: Team { request . TeamId } ") ;
62+
63+ if ( game . GameMap ? . Timer ? . IsGaming ?? false )
64+ return ;
65+
66+ if ( ! ValidPlayerID ( request . PlayerId ) )
67+ return ;
68+
69+ if ( request . TeamId < 0 || request . TeamId >= TeamCount )
70+ return ;
71+
72+ if ( communicationToGameID [ request . TeamId ] [ request . PlayerId ] != GameObj . invalidID )
73+ return ;
74+
75+ // 观战玩家分支
76+ if ( request . PlayerId >= spectatorMinPlayerID && options . NotAllowSpectator == false )
9477 {
95- if ( firstTime )
96- firstTime = false ;
97- try
78+ GameServerLogging . logger . LogDebug ( $ "TRY Add Spectator: Player { request . PlayerId } ") ;
79+ lock ( spectatorJoinLock )
9880 {
99- if ( currentGameInfo != null && ! exitFlag )
81+ if ( semaDicts [ 0 ] . TryAdd ( request . PlayerId , ( new SemaphoreSlim ( 0 , 1 ) , new SemaphoreSlim ( 0 , 1 ) ) ) )
10082 {
101- await responseStream . WriteAsync ( currentGameInfo ) ;
102- // GameServerLogging.logger.LogInfo(
103- // $"Send to Player{request.PlayerId} from Team {request.TeamId}!",
104- // false);
83+ GameServerLogging . logger . LogInfo ( "A new spectator comes to watch this game" ) ;
84+ IsSpectatorJoin = true ;
85+ }
86+ else
87+ {
88+ GameServerLogging . logger . LogInfo ( $ "Duplicated Spectator ID { request . PlayerId } ") ;
89+ return ;
10590 }
10691 }
107- catch
92+
93+ do
10894 {
109- if ( ! exitFlag )
95+ semaDicts [ 0 ] [ request . PlayerId ] . Item1 . Wait ( ) ;
96+ try
11097 {
111- GameServerLogging . logger . LogInfo ( $ "The client { request . PlayerId } exited") ;
112- exitFlag = true ;
98+ if ( currentGameInfo != null )
99+ {
100+ var info = currentGameInfo . Clone ( ) ;
101+ for ( int i = info . ObjMessage . Count - 1 ; i >= 0 ; i -- )
102+ {
103+ if ( info . ObjMessage [ i ] . NewsMessage != null )
104+ {
105+ info . ObjMessage . RemoveAt ( i ) ;
106+ }
107+ }
108+ await responseStream . WriteAsync ( info ) ;
109+ }
113110 }
111+ catch ( InvalidOperationException )
112+ {
113+ if ( semaDicts [ 0 ] . TryRemove ( request . PlayerId , out var semas ) )
114+ {
115+ try
116+ {
117+ semas . Item1 . Release ( ) ;
118+ semas . Item2 . Release ( ) ;
119+ }
120+ catch { }
121+ GameServerLogging . logger . LogInfo ( $ "The spectator { request . PlayerId } exited") ;
122+ return ;
123+ }
124+ }
125+ catch ( Exception ex )
126+ {
127+ GameServerLogging . logger . LogInfo ( ex . ToString ( ) ) ;
128+ }
129+ finally
130+ {
131+ try
132+ {
133+ semaDicts [ 0 ] [ request . PlayerId ] . Item2 . Release ( ) ;
134+ }
135+ catch { }
136+ }
137+ } while ( game . GameMap . Timer . IsGaming ) ;
138+
139+ GameServerLogging . logger . LogDebug ( "END Add Spectator" ) ;
140+ return ;
141+ }
142+
143+ GameServerLogging . logger . LogDebug ( "AddPlayer: Check Correct" ) ;
144+
145+ // 加入玩家队列
146+ var playerSemas = ( new SemaphoreSlim ( 0 , 1 ) , new SemaphoreSlim ( 0 , 1 ) ) ;
147+ lock ( addPlayerLock )
148+ {
149+ GameServerLogging . logger . LogDebug ( $ "ch id :{ request . PlayerId } te id:{ request . TeamId } side: { request . SideFlag } ") ;
150+
151+ if ( ! semaDicts [ request . TeamId ] . TryAdd ( request . PlayerId , playerSemas ) )
152+ {
153+ GameServerLogging . logger . LogWarning ( $ "Player { request . PlayerId } has already been registered in team { request . TeamId } ") ;
154+ return ;
155+ }
156+
157+ communicationToGameID [ request . TeamId ] [ request . PlayerId ] = GameObj . invalidID ;
158+
159+ bool start = Interlocked . Increment ( ref playerCountNow ) == ( playerNum * TeamCount ) ;
160+ GameServerLogging . logger . LogInfo ( $ "Register Factory: Team { request . TeamId } , current joined players: { playerCountNow } ") ;
161+
162+ if ( start )
163+ {
164+ StartGame ( ) ;
114165 }
115166 }
116- semaDicts [ request . TeamId ] [ request . PlayerId ] . Item2 . Release ( ) ;
117- } while ( game . GameMap . Timer . IsGaming ) ;
167+
168+ bool exitFlag = false ;
169+ bool firstTime = true ;
170+ do
171+ {
172+ playerSemas . Item1 . Wait ( ) ;
173+ var character = game . GameMap . FindCharacterInPlayerID ( request . TeamId , request . PlayerId ) ;
174+
175+ if ( ! firstTime && request . PlayerId > 0 && ( character == null || character . IsRemoved == true ) )
176+ {
177+ // character离开/死亡时可安全忽略继续发流
178+ }
179+ else
180+ {
181+ if ( firstTime )
182+ firstTime = false ;
183+
184+ try
185+ {
186+ if ( currentGameInfo != null && ! exitFlag )
187+ {
188+ await responseStream . WriteAsync ( currentGameInfo ) ;
189+ }
190+ }
191+ catch
192+ {
193+ if ( ! exitFlag )
194+ {
195+ GameServerLogging . logger . LogInfo ( $ "The client { request . PlayerId } exited") ;
196+ exitFlag = true ;
197+ }
198+ }
199+ }
200+
201+ playerSemas . Item2 . Release ( ) ;
202+ } while ( game . GameMap . Timer . IsGaming ) ;
203+ }
204+ catch ( Exception ex )
205+ {
206+ GameServerLogging . logger . LogError ( $ "RegisterFactory exception: { ex } ") ;
207+ }
118208 }
119209
120210 public override Task < MessageOfMap > GetMap ( NullRequest request , ServerCallContext context )
@@ -151,18 +241,18 @@ public override Task<MoveRes> Move(MoveMsg request, ServerCallContext context)
151241 public override Task < BoolRes > Recover ( RecoverMsg request , ServerCallContext context )
152242 {
153243 GameServerLogging . logger . LogDebug (
154- $ "TRY Recover: Player { request . PlayerId } from Team { request . TeamId } " +
244+ $ "TRY Recover: Player { request . PlayerId } from Team { request . TeamId } " +
155245 $ "RecoveredHp: { request . RecoveredHp } ") ;
156246 BoolRes boolRes = new ( ) ;
157-
247+
158248 boolRes . ActSuccess = game . Recover ( request . TeamId , request . PlayerId , request . RecoveredHp ) ;
159249 GameServerLogging . logger . LogDebug ( $ "END Recover:{ boolRes . ActSuccess } ") ;
160250 return Task . FromResult ( boolRes ) ;
161251 }
162252
163253 public override Task < BoolRes > Harvest ( ResourceMsg request , ServerCallContext context )
164254 {
165- GameServerLogging . logger . LogDebug ( $ "TRY Harvesting: Player { request . PlayerId } from Team { request . TeamId } " +
255+ GameServerLogging . logger . LogDebug ( $ "TRY Harvesting: Player { request . PlayerId } from Team { request . TeamId } " +
166256 $ "HarvestedResource: { request . ResourceId } , Amount: { request . Amount } ") ;
167257 BoolRes boolRes = new ( ) ;
168258 // boolRes.ActSuccess = game.Harvest(request.TeamId, request.PlayerId, request.ResourceId, request.Amount);
@@ -196,7 +286,7 @@ public override Task<BoolRes> Send(SendMsg request, ServerCallContext context)
196286 GameServerLogging . logger . LogDebug (
197287 $ "TRY Send: From Player { request . PlayerId } To Player { request . ToPlayerId } from Team { request . TeamId } ") ;
198288 BoolRes boolRes = new BoolRes ( ) ;
199-
289+
200290 GameServerLogging . logger . LogDebug ( $ "Send: As { request . MessageCase } ") ;
201291 switch ( request . MessageCase )
202292 {
@@ -260,12 +350,13 @@ public override Task<BoolRes> Send(SendMsg request, ServerCallContext context)
260350 public override Task < BoolRes > Load ( LoadMsg request , ServerCallContext context )
261351 {
262352 GameServerLogging . logger . LogDebug ( $ "TRY Load: { request . PlayerId } from Team { request . TeamId } loading Product { request . ProductType } with Amount { request . ProductAmount } ") ;
263- BoolRes boolRes = new ( ) {
264- ActSuccess =
353+ BoolRes boolRes = new ( )
354+ {
355+ ActSuccess =
265356 game . Load (
266- request . TeamId ,
267- request . PlayerId ,
268- Transformation . GoodsTypeFromProto ( request . ProductType ) ,
357+ request . TeamId ,
358+ request . PlayerId ,
359+ Transformation . GoodsTypeFromProto ( request . ProductType ) ,
269360 request . ProductAmount )
270361 } ;
271362 GameServerLogging . logger . LogDebug ( $ "END Load:{ boolRes . ActSuccess } ") ;
@@ -276,13 +367,14 @@ public override Task<BoolRes> Trade(TradeMsg request, ServerCallContext context)
276367 {
277368 GameServerLogging . logger . LogDebug ( $ "TRY Trade: Player { request . PlayerId } { ( request . IsBuy ? "buy from" : "sell to" ) } Team { request . TeamId } " +
278369 $ " Product:{ request . ProductType } , Amount:{ request . ProductAmount } ") ;
279- BoolRes boolRes = new ( ) {
280- ActSuccess =
370+ BoolRes boolRes = new ( )
371+ {
372+ ActSuccess =
281373 game . Trade (
282- request . TeamId ,
283- request . PlayerId ,
284- Transformation . GoodsTypeFromProto ( request . ProductType ) ,
285- request . ProductAmount ,
374+ request . TeamId ,
375+ request . PlayerId ,
376+ Transformation . GoodsTypeFromProto ( request . ProductType ) ,
377+ request . ProductAmount ,
286378 request . IsBuy )
287379 } ;
288380 GameServerLogging . logger . LogDebug ( $ "END Trade:{ boolRes . ActSuccess } ") ;
0 commit comments