From 00999d673a39acbc3a7abbae15645ccb010b8132 Mon Sep 17 00:00:00 2001 From: Wanne Date: Tue, 14 Oct 2014 18:22:18 +0000 Subject: [PATCH] Merged from revision: 7565 Multiplayer Bugfix: Fixed endless clock on enemy interrupt on the server, by reverting the non working interrupt fix which was introduced in revision 5623 - INFO: The endless clock on the client still occurs on certain enemy interrupts, but this can be fixed by pressing ALT + E on the server and giving the turn back to the client. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7566 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Multiplayer/client.cpp | 148 +++++++++++------------------------------ Multiplayer/connect.h | 4 -- Tactical/TeamTurns.cpp | 58 ++++++---------- 3 files changed, 59 insertions(+), 151 deletions(-) diff --git a/Multiplayer/client.cpp b/Multiplayer/client.cpp index fc38ef3e..9fc8fa3b 100644 --- a/Multiplayer/client.cpp +++ b/Multiplayer/client.cpp @@ -1947,134 +1947,66 @@ void send_interrupt (SOLDIERTYPE *pSoldier) } // WANNE - MP: Here we have to add AddTopMessage() on the clients -#ifdef INTERRUPT_MP_DEADLOCK_FIX - - void recieveINTERRUPT (RPCParameters *rpcParameters) +void recieveINTERRUPT (RPCParameters *rpcParameters) +{ + INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; + SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; + + if(INT->bTeam==netbTeam)//for us { - INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; - SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; + INT->bTeam=0; + INT->ubID=INT->ubID - ubID_prefix; - if(INT->bTeam == netbTeam || (is_server && INT->bTeam == 1))//its for us or we are server and its for AI which we control + 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){//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 ] ); - } - - - 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))) { - if((INT->gubOutOfTurnOrder[i] >= ubID_prefix) && (INT->gubOutOfTurnOrder[i] < (ubID_prefix+6))) - { - INT->gubOutOfTurnOrder[i]=INT->gubOutOfTurnOrder[i]-ubID_prefix; - } + 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"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(); - - } - else//its not for us, make faux interrupt look while it happens - { - //this following section starts the interrupt, either with faux interrupt look, or real interrupt code, or nothing if already there + memcpy(gubOutOfTurnOrder,INT->gubOutOfTurnOrder, sizeof(UINT8) * MAXMERCS); + gubOutOfTurnPersons = INT->gubOutOfTurnPersons; - //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; - AddTopMessage( COMPUTER_INTERRUPT_MESSAGE, TeamTurnString[ INT->bTeam ] ); - //this needed to add details of who's interrupt it is - hayden - - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Recieved interrupt with %s and %s.", TeamNameStrings[pOpponent->bTeam], TeamNameStrings[INT->bTeam] );//was MPClientMessage[17], can be reconnected if text updated and translated - } + 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] ); } -#else - - void recieveINTERRUPT (RPCParameters *rpcParameters) + // 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 { - INT_STRUCT* INT = (INT_STRUCT*)rpcParameters->input; - SOLDIERTYPE* pOpponent = MercPtrs[ INT->Interrupted]; + + //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; - if(INT->bTeam==netbTeam)//for us + //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 { - 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] ); - + //ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"old int finish" ); } - - // 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 + else //start our interrupt turn { - - //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; + 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 - //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(); - } + SOLDIERTYPE* pSoldier = MercPtrs[ INT->ubID ]; + ManSeesMan(pSoldier,pOpponent,pOpponent->sGridNo,pOpponent->pathing.bLevel,2,1); + StartInterrupt(); } } +} -#endif void intAI (SOLDIERTYPE *pSoldier ) { diff --git a/Multiplayer/connect.h b/Multiplayer/connect.h index 370a9fda..7c487ac5 100644 --- a/Multiplayer/connect.h +++ b/Multiplayer/connect.h @@ -148,10 +148,6 @@ 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 c54d2636..79589cf4 100644 --- a/Tactical/TeamTurns.cpp +++ b/Tactical/TeamTurns.cpp @@ -1161,7 +1161,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred ) { StartInterrupt(); } - else + else { UINT8 nubFirstInterrupter; INT8 nbTeam; @@ -1178,22 +1178,15 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred ) #ifdef BETAVERSION ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"unchecked interrupt call area:(resume interrupted interrupt)..."); #endif - - -#ifdef INTERRUPT_MP_DEADLOCK_FIX - // INTERRUPT is calculated on the server who controls AI - if (0) //the AI had interrupted someone //experiment with 0 as with doneaddindtointlist func -#else + if ((nbTeam > 0) && (nbTeam <6 ) && is_server) // AI interrupt resume and im server -#endif { send_interrupt( npSoldier ); StartInterrupt(); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Continuing interrupt with %s and AI", TeamNameStrings[npSoldier->bTeam]);//tried to use pSoldier, but its not available. find another way to get correct team } - // INTERRUPT is calculated on the server who controls AI - else if(is_server && gTacticalStatus.ubCurrentTeam == 1)//its AI's turn (it got interrupted) + else if(is_server && gTacticalStatus.ubCurrentTeam == 1)// resume AI interrupted and im server { //hayden send_interrupt( npSoldier ); @@ -1204,16 +1197,11 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred ) StartInterrupt(); ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Continuing interrupt of AI by %s", TeamNameStrings[npSoldier->bTeam]); - } -#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 + } + else// pure client awarding interrupt resume //suspect it needs to be: else if(gTacticalStatus.ubCurrentTeam == 0)//its our turn (we are moving) { + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Continuing interrupt with %s", TeamNameStrings[npSoldier->bTeam]);//this can be simplified if above comment is implemented //ClearIntList(); //hayden//may need more work. @@ -2269,7 +2257,7 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter { StartInterrupt(); } - else + else { UINT8 nubFirstInterrupter; INT8 nbTeam; @@ -2283,16 +2271,11 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter //npSoldier is interruptor //hayden -#ifdef INTERRUPT_MP_DEADLOCK_FIX - // INTERRUPT is calculated on the server who controls AI - if (0) //the AI has interrupted someone//made this 0 as interrupt should only be calculated by person whos turn it is -#else + // INTERRUPT is calculated on the server if ((nbTeam > 0) && (nbTeam <6 ) && is_server) //is for AI and are server -#endif { - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt calculated between %s and AI", TeamNameStrings[pSoldier->bTeam]); - - + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%s is interrupt by AI", TeamNameStrings[pSoldier->bTeam]); + // Only display the top message if we (the server) got interrupted if (pSoldier->bTeam == 0) AddTopMessage( COMPUTER_INTERRUPT_MESSAGE, TeamTurnString[ nbTeam ] ); @@ -2301,8 +2284,8 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter StartInterrupt(); } - // INTERRUPT is calculated on the server who controls AI - else if(is_server && gTacticalStatus.ubCurrentTeam == 1)//the AI has been interrupted + // INTERRUPT is calculated on the server + else if(is_server && gTacticalStatus.ubCurrentTeam == 1)// against ai and are server { //hayden send_interrupt( npSoldier ); // @@ -2311,20 +2294,17 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter else StartInterrupt();// - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt calculated with AI and %s", TeamNameStrings[npSoldier->bTeam]); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"AI is interrupted by %s", TeamNameStrings[npSoldier->bTeam]); } - // INTERRUPT is calculated on the pure client or server - else if(gTacticalStatus.ubCurrentTeam == 0)//its our turn - { -#ifdef INTERRUPT_MP_DEADLOCK_FIX - // Do nothing -#else + // 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]); -#endif + ScreenMsg( FONT_MCOLOR_LTRED, MSG_INTERFACE, MPClientMessage[79]); send_interrupt( npSoldier ); + SOLDIERTYPE* pMerc = MercPtrs[ gusSelectedSoldier ]; //AdjustNoAPToFinishMove( pMerc, TRUE ); pMerc->HaultSoldierFromSighting(TRUE); @@ -2335,7 +2315,7 @@ void DoneAddingToIntList( SOLDIERTYPE * pSoldier, BOOLEAN fChange, UINT8 ubInter AddTopMessage( COMPUTER_INTERRUPT_MESSAGE, TeamTurnString[ nbTeam ] ); gTacticalStatus.fInterruptOccurred = TRUE; - ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt calculated against You by %s", TeamNameStrings[npSoldier->bTeam]); + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"You have interrupted %s", TeamNameStrings[npSoldier->bTeam]); } else {