diff --git a/client/global/view.cpp b/client/global/view.cpp index 4dc528ea..adbf2ed2 100644 --- a/client/global/view.cpp +++ b/client/global/view.cpp @@ -956,7 +956,9 @@ void V_CalcFirstPersonRefdef( ref_params_t *pparams ) lastorg = pparams->simorg; } - V_InterpolatePos( pparams ); // smooth predicting moving in multiplayer + +// probably not needs in Xash3D +// V_InterpolatePos( pparams ); // smooth predicting moving in multiplayer lasttime = pparams->time; v_origin = pparams->vieworg; diff --git a/engine/common.h b/engine/common.h index 9fd669ca..b97aee38 100644 --- a/engine/common.h +++ b/engine/common.h @@ -220,6 +220,7 @@ edict_t *CL_GetLocalPlayer( void ); int CL_GetMaxClients( void ); byte CL_GetMouthOpen( int entityIndex ); bool SV_GetComment( const char *savename, char *comment ); +void SV_LoadProgs( const char *name ); void SV_ForceMod( void ); void CL_MouseEvent( int mx, int my ); void CL_AddLoopingSounds( void ); diff --git a/engine/uimenu/ui_creategame.c b/engine/uimenu/ui_creategame.c index 1dec49ec..8bb3865d 100644 --- a/engine/uimenu/ui_creategame.c +++ b/engine/uimenu/ui_creategame.c @@ -36,6 +36,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define ID_PASSWORD 9 #define ID_DEDICATED 10 +#define ID_MSGBOX 11 +#define ID_MSGTEXT 12 +#define ID_YES 13 +#define ID_NO 14 + #define MAPNAME_LENGTH 20 #define TITLE_LENGTH 20+MAPNAME_LENGTH @@ -58,6 +63,13 @@ typedef struct menuField_s password; menuCheckBox_s dedicatedServer; + // newgame prompt dialog + menuAction_s msgBox; + menuAction_s dlgMessage1; + menuAction_s dlgMessage2; + menuAction_s yes; + menuAction_s no; + menuScrollList_s mapsList; menuAction_s hintMessage; char hintText[MAX_SYSPATH]; @@ -73,7 +85,7 @@ UI_CreateGame_Begin static void UI_CreateGame_Begin( void ) { if( Host_ServerState()) - Cbuf_ExecuteText( EXEC_APPEND, "disconnect\n" ); + Cbuf_ExecuteText( EXEC_NOW, "killserver\n" ); Cvar_SetValue( "deathmatch", 1.0f ); // FIXME Cvar_SetValue( "sv_maxclients", com.atoi( uiCreateGame.maxClients.buffer )); @@ -87,6 +99,45 @@ static void UI_CreateGame_Begin( void ) else Cbuf_ExecuteText( EXEC_APPEND, "exec server.rc\n" ); } +static void UI_PromptDialog( void ) +{ + if( !Host_ServerState()) + { + UI_CreateGame_Begin(); + return; + } + + // toggle main menu between active\inactive + // show\hide quit dialog + uiCreateGame.advOptions.generic.flags ^= QMF_INACTIVE; + uiCreateGame.done.generic.flags ^= QMF_INACTIVE; + uiCreateGame.cancel.generic.flags ^= QMF_INACTIVE; + uiCreateGame.maxClients.generic.flags ^= QMF_INACTIVE; + uiCreateGame.hostName.generic.flags ^= QMF_INACTIVE; + uiCreateGame.password.generic.flags ^= QMF_INACTIVE; + uiCreateGame.dedicatedServer.generic.flags ^= QMF_INACTIVE; + uiCreateGame.mapsList.generic.flags ^= QMF_INACTIVE; + + uiCreateGame.msgBox.generic.flags ^= QMF_HIDDEN; + uiCreateGame.dlgMessage1.generic.flags ^= QMF_HIDDEN; + uiCreateGame.dlgMessage2.generic.flags ^= QMF_HIDDEN; + uiCreateGame.no.generic.flags ^= QMF_HIDDEN; + uiCreateGame.yes.generic.flags ^= QMF_HIDDEN; + +} + +/* +================= +UI_MsgBox_Ownerdraw +================= +*/ +static void UI_MsgBox_Ownerdraw( void *self ) +{ + menuCommon_s *item = (menuCommon_s *)self; + + UI_FillRect( item->x, item->y, item->width, item->height, uiPromptBgColor ); +} + /* ================= UI_CreateGame_GetMapsList @@ -152,11 +203,17 @@ static void UI_CreateGame_Callback( void *self, int event ) // UNDONE: not implemented break; case ID_DONE: - UI_CreateGame_Begin(); + UI_PromptDialog(); break; case ID_CANCEL: UI_PopMenu(); break; + case ID_YES: + UI_CreateGame_Begin(); + break; + case ID_NO: + UI_PromptDialog(); + break; } } @@ -281,7 +338,47 @@ static void UI_CreateGame_Init( void ) uiCreateGame.password.generic.callback = UI_CreateGame_Callback; uiCreateGame.password.maxLenght = 16; + uiCreateGame.msgBox.generic.id = ID_MSGBOX; + uiCreateGame.msgBox.generic.type = QMTYPE_ACTION; + uiCreateGame.msgBox.generic.flags = QMF_INACTIVE|QMF_HIDDEN; + uiCreateGame.msgBox.generic.ownerdraw = UI_MsgBox_Ownerdraw; // just a fill rectangle + uiCreateGame.msgBox.generic.x = 192; + uiCreateGame.msgBox.generic.y = 256; + uiCreateGame.msgBox.generic.width = 640; + uiCreateGame.msgBox.generic.height = 256; + + uiCreateGame.dlgMessage1.generic.id = ID_MSGTEXT; + uiCreateGame.dlgMessage1.generic.type = QMTYPE_ACTION; + uiCreateGame.dlgMessage1.generic.flags = QMF_INACTIVE|QMF_HIDDEN; + uiCreateGame.dlgMessage1.generic.name = "Starting a new game will exit"; + uiCreateGame.dlgMessage1.generic.x = 248; + uiCreateGame.dlgMessage1.generic.y = 280; + + uiCreateGame.dlgMessage2.generic.id = ID_MSGTEXT; + uiCreateGame.dlgMessage2.generic.type = QMTYPE_ACTION; + uiCreateGame.dlgMessage2.generic.flags = QMF_INACTIVE|QMF_HIDDEN; + uiCreateGame.dlgMessage2.generic.name = "any current game, OK to exit?"; + uiCreateGame.dlgMessage2.generic.x = 248; + uiCreateGame.dlgMessage2.generic.y = 310; + + uiCreateGame.yes.generic.id = ID_YES; + uiCreateGame.yes.generic.type = QMTYPE_ACTION; + uiCreateGame.yes.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_HIDDEN; + uiCreateGame.yes.generic.name = "Ok"; + uiCreateGame.yes.generic.x = 380; + uiCreateGame.yes.generic.y = 460; + uiCreateGame.yes.generic.callback = UI_CreateGame_Callback; + + uiCreateGame.no.generic.id = ID_NO; + uiCreateGame.no.generic.type = QMTYPE_ACTION; + uiCreateGame.no.generic.flags = QMF_HIGHLIGHTIFFOCUS|QMF_HIDDEN; + uiCreateGame.no.generic.name = "Cancel"; + uiCreateGame.no.generic.x = 530; + uiCreateGame.no.generic.y = 460; + uiCreateGame.no.generic.callback = UI_CreateGame_Callback; + UI_CreateGame_GetMapsList(); + if( !Host_ServerState()) SV_LoadProgs( "server" ); // force to get user mp_variables UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.background ); UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.banner ); @@ -294,6 +391,11 @@ static void UI_CreateGame_Init( void ) UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.dedicatedServer ); UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.hintMessage ); UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.mapsList ); + UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.msgBox ); + UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.dlgMessage1 ); + UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.dlgMessage2 ); + UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.no ); + UI_AddItem( &uiCreateGame.menu, (void *)&uiCreateGame.yes ); } /* diff --git a/engine/uimenu/ui_langame.c b/engine/uimenu/ui_langame.c index 5d650fca..7fe94580 100644 --- a/engine/uimenu/ui_langame.c +++ b/engine/uimenu/ui_langame.c @@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" +#include "com_library.h" #include "ui_local.h" #include "client.h" @@ -181,6 +182,8 @@ UI_LanGame_Init */ static void UI_LanGame_Init( void ) { + string libpath; + Mem_Set( &uiLanGame, 0, sizeof( uiLanGame_t )); com.strncat( uiLanGame.hintText, "Game", GAME_LENGTH ); @@ -274,6 +277,11 @@ static void UI_LanGame_Init( void ) uiLanGame.gameList.generic.callback = UI_LanGame_Callback; uiLanGame.gameList.itemNames = uiLanGame.gameDescriptionPtr; + // server.dll needs for reading savefiles or startup newgame + Com_BuildPath( "server", libpath ); + if( !FS_FileExists( libpath )) + uiLanGame.createGame.generic.flags |= QMF_GRAYED; // server.dll is missed - remote servers only + UI_AddItem( &uiLanGame.menu, (void *)&uiLanGame.background ); UI_AddItem( &uiLanGame.menu, (void *)&uiLanGame.banner ); UI_AddItem( &uiLanGame.menu, (void *)&uiLanGame.joinGame ); diff --git a/todo.log b/todo.log index 5cfab9c9..5119eb73 100644 --- a/todo.log +++ b/todo.log @@ -14,6 +14,11 @@ fopen Sprite Lerping - рисуем два соседних кадра, чем больше lerpValue, тем больше прозрачность у старого кадра и тем меньше прозрчности у нового (верхняя граница - значение renderamt, заданное юзером) +0 - восток +90 - север + + + Отложенные задачи: 1. Поддержка loop для ogg vorbis 2. переписать studiomdl для использования VFS