From deba6d7ac038cd00d1c366c55443bfa6cdd664f4 Mon Sep 17 00:00:00 2001 From: Wanne Date: Sat, 28 Feb 2015 12:54:15 +0000 Subject: [PATCH] Merged from revision: 7757 Multiplayer Bugfix: Reverted the "endless interrupt bugfix" for the pure client, because it was not working correctly, and the server could not press ALT + E to give the turn back to the client, if stuck. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7758 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Multiplayer/client.cpp | 166 ++++++++++++++++++++++++++++------------- Multiplayer/connect.h | 4 + Tactical/TeamTurns.cpp | 17 ++++- Utils/_ChineseText.cpp | 2 +- Utils/_DutchText.cpp | 2 +- Utils/_EnglishText.cpp | 2 +- Utils/_FrenchText.cpp | 2 +- Utils/_GermanText.cpp | 2 +- Utils/_ItalianText.cpp | 2 +- Utils/_PolishText.cpp | 2 +- Utils/_RussianText.cpp | 2 +- 11 files changed, 141 insertions(+), 62 deletions(-) diff --git a/Multiplayer/client.cpp b/Multiplayer/client.cpp index f56c68bf..d6a447f8 100644 --- a/Multiplayer/client.cpp +++ b/Multiplayer/client.cpp @@ -1946,68 +1946,127 @@ void send_interrupt (SOLDIERTYPE *pSoldier) client->RPC("sendINTERRUPT",(const char*)&INT, (int)sizeof(INT_STRUCT)*8, HIGH_PRIORITY, RELIABLE, 0, UNASSIGNED_SYSTEM_ADDRESS, true, 0, UNASSIGNED_NETWORK_ID,0); } -void recieveINTERRUPT (RPCParameters *rpcParameters) -{ - if (cGameType == MP_TYPE_COOP) +#ifdef INTERRUPT_MP_DEADLOCK_FIX + void recieveINTERRUPT (RPCParameters *rpcParameters) { - INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; - SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; - - if( INT->bTeam == netbTeam || is_server)//its for us or we are server and its for AI which we control + if (cGameType == MP_TYPE_COOP) { - if(INT->bTeam == netbTeam) - { - //for me - INT->bTeam=0; - INT->ubID=INT->ubID - ubID_prefix; - AddTopMessage( PLAYER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); - } - else - { - //for ai - //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"starting ai" ); - AddTopMessage( COMPUTER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); - } + INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; + SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; - for(int i=0; i <= INT->gubOutOfTurnPersons; i++)//this loop translates soldier id's from what they are in someone else's game to what they are locally + if( INT->bTeam == netbTeam || is_server)//its for us or we are server and its for AI which we control { - if((INT->gubOutOfTurnOrder[i] >= ubID_prefix) && (INT->gubOutOfTurnOrder[i] < (ubID_prefix+6))) + if(INT->bTeam == netbTeam) { - INT->gubOutOfTurnOrder[i]=INT->gubOutOfTurnOrder[i]-ubID_prefix; + //for me + INT->bTeam=0; + INT->ubID=INT->ubID - ubID_prefix; + AddTopMessage( PLAYER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); + } + else + { + //for ai + //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"starting ai" ); + AddTopMessage( COMPUTER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); } - } - memcpy(gubOutOfTurnOrder,INT->gubOutOfTurnOrder, sizeof(UINT8) * MAXMERCS); - gubOutOfTurnPersons = INT->gubOutOfTurnPersons; - if(INT->bTeam==netbTeam)//for us - AddTopMessage( PLAYER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); + for(int i=0; i <= INT->gubOutOfTurnPersons; i++)//this loop translates soldier id's from what they are in someone else's game to what they are locally + { + if((INT->gubOutOfTurnOrder[i] >= ubID_prefix) && (INT->gubOutOfTurnOrder[i] < (ubID_prefix+6))) + { + INT->gubOutOfTurnOrder[i]=INT->gubOutOfTurnOrder[i]-ubID_prefix; + } + } + memcpy(gubOutOfTurnOrder,INT->gubOutOfTurnOrder, sizeof(UINT8) * MAXMERCS); + gubOutOfTurnPersons = INT->gubOutOfTurnPersons; - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Recieved interrupt between %s and %s.", TeamNameStrings[pOpponent->bTeam], TeamNameStrings[INT->bTeam] ); + if(INT->bTeam==netbTeam)//for us + AddTopMessage( PLAYER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); - //start interrupt turn //real interrupt code - SOLDIERTYPE* pSoldier = MercPtrs[ INT->ubID ]; - ManSeesMan(pSoldier,pOpponent,pOpponent->sGridNo,pOpponent->pathing.bLevel,2,1); - StartInterrupt(); - } - // It is our team - else if(INT->bTeam == 0) - { - //it for us ! :) - if(INT->gubOutOfTurnPersons==0)//indicates finished interrupt maybe can just call end interrupt - { - //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"old int finish" ); - } - else //start our interrupt turn - { - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt of %s awarded to you.", TeamNameStrings[pOpponent->bTeam] );//was MPClientMessage[37], can be reconnected if text updated and translated + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Recieved interrupt between %s and %s.", TeamNameStrings[pOpponent->bTeam], TeamNameStrings[INT->bTeam] ); + //start interrupt turn //real interrupt code SOLDIERTYPE* pSoldier = MercPtrs[ INT->ubID ]; ManSeesMan(pSoldier,pOpponent,pOpponent->sGridNo,pOpponent->pathing.bLevel,2,1); StartInterrupt(); } + // It is our team + else if(INT->bTeam == 0) + { + //it for us ! :) + if(INT->gubOutOfTurnPersons==0)//indicates finished interrupt maybe can just call end interrupt + { + //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"old int finish" ); + } + else //start our interrupt turn + { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt of %s awarded to you.", TeamNameStrings[pOpponent->bTeam] );//was MPClientMessage[37], can be reconnected if text updated and translated + + SOLDIERTYPE* pSoldier = MercPtrs[ INT->ubID ]; + ManSeesMan(pSoldier,pOpponent,pOpponent->sGridNo,pOpponent->pathing.bLevel,2,1); + StartInterrupt(); + } + } + } + else + { + INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; + SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; + + if(INT->bTeam==netbTeam)//for us + { + INT->bTeam=0; + INT->ubID=INT->ubID - ubID_prefix; + + for(int i=0; i <= INT->gubOutOfTurnPersons; i++)//this loop translates soldier id's from what they are in someone else's game to what they are locally + { + if((INT->gubOutOfTurnOrder[i] >= ubID_prefix) && (INT->gubOutOfTurnOrder[i] < (ubID_prefix+6))) + { + INT->gubOutOfTurnOrder[i]=INT->gubOutOfTurnOrder[i]-ubID_prefix; + } + } + memcpy(gubOutOfTurnOrder,INT->gubOutOfTurnOrder, sizeof(UINT8) * MAXMERCS); + gubOutOfTurnPersons = INT->gubOutOfTurnPersons; + + AddTopMessage( PLAYER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt of %s awarded to %s.", TeamNameStrings[pOpponent->bTeam], TeamNameStrings[INT->bTeam] ); + } + + // WANNE - MP: This seems to cause the HANG on AI interrupt where we have to press ALT + E on the server! + if( INT->bTeam != 0)//not for our team - hayden + { + //stop moving merc who was interrupted and init UI bar + SOLDIERTYPE* pMerc = MercPtrs[ INT->ubID ]; + pMerc->HaultSoldierFromSighting(TRUE); + FreezeInterfaceForEnemyTurn(); + InitEnemyUIBar( 0, 0 ); + fInterfacePanelDirty = DIRTYLEVEL2; + gTacticalStatus.fInterruptOccurred = TRUE; + + //this needed to add details of who's interrupt it is - hayden + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt with %s awarded to %s.", TeamNameStrings[pOpponent->bTeam], TeamNameStrings[INT->bTeam] );//was MPClientMessage[17], can be reconnected if text updated and translated + } + else + { + //it for us ! :) + if(INT->gubOutOfTurnPersons==0)//indicates finished interrupt maybe can just call end interrupt + { + //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"old int finish" ); + } + else //start our interrupt turn + { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt of %s awarded to you.", TeamNameStrings[pOpponent->bTeam] );//was MPClientMessage[37], can be reconnected if text updated and translated + + SOLDIERTYPE* pSoldier = MercPtrs[ INT->ubID ]; + ManSeesMan(pSoldier,pOpponent,pOpponent->sGridNo,pOpponent->pathing.bLevel,2,1); + StartInterrupt(); + } + } } } - else +#else + + void recieveINTERRUPT (RPCParameters *rpcParameters) { INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; @@ -2027,13 +2086,16 @@ void recieveINTERRUPT (RPCParameters *rpcParameters) memcpy(gubOutOfTurnOrder,INT->gubOutOfTurnOrder, sizeof(UINT8) * MAXMERCS); gubOutOfTurnPersons = INT->gubOutOfTurnPersons; + AddTopMessage( PLAYER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt of %s awarded to %s.", TeamNameStrings[pOpponent->bTeam], TeamNameStrings[INT->bTeam] ); + } // WANNE - MP: This seems to cause the HANG on AI interrupt where we have to press ALT + E on the server! if( INT->bTeam != 0)//not for our team - hayden { + //stop moving merc who was interrupted and init UI bar SOLDIERTYPE* pMerc = MercPtrs[ INT->ubID ]; pMerc->HaultSoldierFromSighting(TRUE); @@ -2062,7 +2124,8 @@ void recieveINTERRUPT (RPCParameters *rpcParameters) } } } -} + +#endif void intAI (SOLDIERTYPE *pSoldier ) { @@ -4339,11 +4402,11 @@ void overide_turn (void) CHAR16 Cmsg[255]; if (cMaxClients == 2) - swprintf(Cmsg, MPClientMessage[30], client_names[0], client_names[1],"",""); + swprintf(Cmsg, MPClientMessage[30], client_names[1],"",""); else if (cMaxClients == 3) - swprintf(Cmsg, MPClientMessage[30], client_names[0], client_names[1],client_names[2],""); + swprintf(Cmsg, MPClientMessage[30], client_names[1],client_names[2],""); else - swprintf(Cmsg, MPClientMessage[30], client_names[0], client_names[1],client_names[2],client_names[3]); + swprintf(Cmsg, MPClientMessage[30], client_names[1],client_names[2],client_names[3]); SGPRect CenterRect = { 100 + xResOffset, 100 + yResOffset, SCREEN_WIDTH - 100 - xResOffset, 300 + yResOffset }; @@ -4360,7 +4423,8 @@ void turn_callback (UINT8 ubResult) // Pressed '1' if(ubResult ==1) { - EndTurn( 0 ); + // WANNE: Nothing should happen. Do not give the turn to the server! + //EndTurn( 0 ); } else { diff --git a/Multiplayer/connect.h b/Multiplayer/connect.h index f9f9640f..ac31a953 100644 --- a/Multiplayer/connect.h +++ b/Multiplayer/connect.h @@ -148,6 +148,10 @@ extern char cServerName[30]; //OJW - 20081224 #define MAX_CONNECT_RETRIES 5 +// WANNE: After some MP-Tests: It seems there are still problems with enemy interupt and if this define is enabled the ALT + E (give turn to client) does not work either. So I disabled this define for now ... +// WANNE: If this define is enabled, it hopefully fixes the "enemy AI got stuck on pure client interrupt". (this "fix" was added in revision 5623) +//#define INTERRUPT_MP_DEADLOCK_FIX + // WANNE: This features seems to work without any errors, so it is enabled :) #define ENABLE_MP_FRIENDLY_PLAYERS_SHARE_SAME_FOV diff --git a/Tactical/TeamTurns.cpp b/Tactical/TeamTurns.cpp index 3ab1be87..62841b55 100644 --- a/Tactical/TeamTurns.cpp +++ b/Tactical/TeamTurns.cpp @@ -1199,7 +1199,14 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Continuing interrupt of AI by %s", TeamNameStrings[npSoldier->bTeam]); } - else if(gTacticalStatus.ubCurrentTeam == 0)//its our turn//else// pure client awarding interrupt resume //its our turn + +#ifdef INTERRUPT_MP_DEADLOCK_FIX + //its our turn//else// pure client awarding interrupt resume //its our turn + else if(gTacticalStatus.ubCurrentTeam == 0) +#else + // pure client awarding interrupt resume + else +#endif { ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Continuing interrupt with %s", TeamNameStrings[npSoldier->bTeam]);//this can be simplified if above comment is implemented //ClearIntList(); @@ -2298,8 +2305,12 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter // INTERRUPT is calculated on the pure client else if(gTacticalStatus.ubCurrentTeam == 0)//its our turn (we are moving) { - /*if (cGameType == MP_TYPE_COOP) - ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, MPClientMessage[79]);*/ +#ifdef INTERRUPT_MP_DEADLOCK_FIX + // Do nothing +#else + if (cGameType == MP_TYPE_COOP) + ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, MPClientMessage[79]); +#endif send_interrupt( npSoldier ); diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 5d9548c1..64cd1b2e 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -6949,7 +6949,7 @@ STR16 MPClientMessage[] = L"'%s' (客户端 %d - '%S') 已被 '%s' (客户端 %d - '%S' 杀死)", L"踢出客户端 #%d - '%S'", // 30 - L"开始排序客户端号. #1: %S, #2: %S, #3: %S, #4: %S", + L"开始排序客户端号. #1: <取消>, #2: %S, #3: %S, #4: %S", L"开始客户端 #%d", L"请求即时模式...", L"转回即时模式。", diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 37c46e79..adad36e2 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -6953,7 +6953,7 @@ STR16 MPClientMessage[] = L"'%s' (client %d - '%S') was killed by '%s' (client %d - '%S')", L"Kicked client #%d - '%S'", // 30 - L"Start a new turn for the selected client. #1: %S, #2: %S, #3: %S, #4: %S", + L"Start a new turn for the selected client. #1: , #2: %S, #3: %S, #4: %S", L"Starting turn for client #%d", L"Requesting for realtime...", L"Switched back to realtime.", diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 17d9e485..c7e1cd19 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -6947,7 +6947,7 @@ STR16 MPClientMessage[] = L"'%s' (client %d - '%S') was killed by '%s' (client %d - '%S').", L"Kicked client #%d - '%S'.", // 30 - L"Start a new turn for the selected client. #1: %S, #2: %S, #3: %S, #4: %S", + L"Start a new turn for the selected client. #1: , #2: %S, #3: %S, #4: %S", L"Starting turn for client #%d.", L"Requesting for realtime...", L"Switched back to realtime.", diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index a99f98c2..6cf88a32 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -6951,7 +6951,7 @@ STR16 MPClientMessage[] = L"'%s' (client %d - '%S') a été tué par '%s' (client %d - '%S')", L"Client kické #%d - '%S'", // 30 - L"Début de manche pour les numéros de clients : #1 - '%S' | #2 - '%S' | #3 - '%S' | #4 - '%S'", + L"Début de manche pour les numéros de clients : #1: , #2: %S, #3: %S, #4: %S", L"Début de manche pour le client #%d", L"Requête pour le realtime...", L"Commutation en mode realtime.", diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 64ffd1ef..4391f19c 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -6778,7 +6778,7 @@ STR16 MPClientMessage[] = L"'%s' (Client #%d - '%S') wurde getötet von '%s' (Client #%d - '%S')", L"Werfe Client #%d - '%S' aus dem Spiel.", // 30 - L"Starte neuen Spielzug für gewählten Client. #1: %S, #2: %S, #3: %S, #4: %S", + L"Starte neuen Spielzug für gewählten Client. #1: , #2: %S, #3: %S, #4: %S", L"Starte Spielzug für Client #%d", L"Anfrage auf Echtzeit-Modus...", L"In Echtzeit-Modus gewechselt.", diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 9cfc5bd4..f16af92c 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -6949,7 +6949,7 @@ STR16 MPClientMessage[] = L"'%s' (client %d - '%S') was killed by '%s' (client %d - '%S')", L"Kicked client #%d - '%S'", // 30 - L"Start a new turn for the selected client. #1: %S, #2: %S, #3: %S, #4: %S", + L"Start a new turn for the selected client. #1: , #2: %S, #3: %S, #4: %S", L"Starting turn for client #%d", L"Requesting for realtime...", L"Switched back to realtime.", diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 8694a2a8..a96bf675 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -6961,7 +6961,7 @@ STR16 MPClientMessage[] = L"'%s' (klient %d - '%S') zabity przez '%s' (client %d - '%S')", L"Wyrzucono #%d - '%S'", // 30 - L"Zacząć turę dla klientów. #1: %S, #2: %S, #3: %S, #4: %S", + L"Zacząć turę dla klientów. #1: , #2: %S, #3: %S, #4: %S", L"Początek tury dla #%d", L"Żądanie trybu realtime…", L"Zmieniono w tryb realtime.", diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 05ca70d9..b227dbf7 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -6945,7 +6945,7 @@ STR16 MPClientMessage[] = L"%s (клиент %d - '%S') был убит %s (клиент %d - '%S')", L"Клиент №%d - '%S' выкинут из игры.", // 30 - L"Принудительно дать ход клиенту. №1: %S, №2: %S, №3: %S, №4: %S", + L"Принудительно дать ход клиенту. №1: <Отменить>, №2: %S, №3: %S, №4: %S", L"Начался ход клиента №%d", L"Запрос перехода в режим реального время...", L"Переход в режим реального времени.",