home *** CD-ROM | disk | FTP | other *** search
/ Revista CD Expert 51 / PCGamer51_17Demos.iso / games / CM / CyclingManagerDemoCangas.exe / CyclingManagerDemo / MenuServer / UserClient.cnc < prev    next >
Text File  |  2001-07-02  |  22KB  |  988 lines

  1.  
  2. // ******************************************************
  3. // * Function : Player server connect/disconnect callback
  4. // * Parameters : client : client connected/disconnected
  5. // * 
  6. // * Add/Remove the client to/from the client list
  7. // *******************************************************
  8. func void UserConnectCB (Net_Client _client)
  9. {
  10.     print("<< client connection: waiting for login...\n");
  11.     
  12. }
  13.  
  14. func void UserDisconnectCB (Net_Client _client)
  15. {
  16.     var szx szLogin;
  17.     var i32x iUserId;
  18.     var i32x iDivisionId;
  19.     var i32x iPreRaceTeamId;
  20.  
  21.     print("<< client disconnection...\n");
  22.  
  23.     iUserId = NetClient_GetId(_client);
  24.     if (iUserId>0)
  25.     {
  26.         print("Remove logged client : ");
  27.         println(itoa(iUserId));
  28.         
  29.         // get division
  30.         iDivisionId = Join_GetIntFromKey(g_stJoins.m_iUser_DivisionId,    iUserId);
  31.  
  32.         // get client list
  33.         var Net_ClientList pClientList;
  34.         pClientList = NetServer_GetClientList( g_pServer, iDivisionId-1);
  35.         
  36.         // update database
  37.         Join_SetIntFromKey(g_stJoins.m_iUser_iInRaceReady,    iUserId, 0);
  38.         Join_SetIntFromKey(g_stJoins.m_iUser_iConnected,    iUserId, 0);
  39.  
  40.         // inform gateway
  41.         if (g_stGateway.m_pClient)
  42.         {
  43.             // Retrieve gateway user id
  44.             szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_szLogin, iUserId);
  45.             g_stGateway.m_pClient << mGateway_UserDisconnection(szLogin);
  46.         }
  47.  
  48.         // inrace ?
  49.         // Client disconnected while in race
  50.         // Remove game client of Game Server
  51.         if (g_stVirtualDay.m_iActivePhase==G_iPhase_InRace)
  52.         {
  53.             iPreRaceTeamId = Join_GetIntFromKey( g_stJoins.m_iUser_iPreRaceTeamId, iUserId);
  54.             g_a_stPreRaceClientDivisions[iDivisionId-1].a_Clients[iPreRaceTeamId] = G_pNullClient;
  55.             RemoveClient(iDivisionId-1,iPreRaceTeamId);
  56.         }
  57.         
  58.         // remove client from list
  59.         NetClientList_DelClient( pClientList, _client, 0);
  60.  
  61.         // notify users
  62.         fnNotifyUserLogout(iUserId);
  63.     }
  64.     else if(iUserId<0)
  65.     {
  66.         var i32x iGuestID;
  67.         println("Guest disconnection...");
  68.  
  69.         // Guest identifier are negative
  70.         iGuestID = -iUserId;
  71.  
  72.         var Net_ClientList pClientList;
  73.         pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  74.  
  75.         // inform gateway
  76.         if (g_stGateway.m_pClient)
  77.         {
  78.             // Retrieve gateway user id
  79.             szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_GuestLogin, iGuestID);
  80.             g_stGateway.m_pClient << mGateway_UserDisconnection(szLogin);
  81.         }
  82.  
  83.         // Free guest slot
  84.         Join_SetIntFromKey(g_stJoins.m_iUser_GuestFree, iGuestID, g_iGUEST_STATUS_Free);
  85.         Join_SetStringFromKey(g_stJoins.m_iUser_GuestLogin, iGuestID, "0");
  86.  
  87.         // remove client from list
  88.         NetClientList_DelClient( pClientList, _client, 0);
  89.  
  90.         // notify clients
  91.         fnNotifyGuestLogout(iGuestID);
  92.     }
  93.     else
  94.     {
  95.         print("removed unlogged client...\n");
  96.     }
  97.  
  98.     // remove client
  99.     NetClient_Destroy(_client);    
  100. }
  101.  
  102.  
  103.  
  104.  
  105. // *********************
  106. // user login
  107. // *********************
  108. func void fnUserLogin (szx _szLogin, szx _szGatewayAuthorization)
  109. {
  110.     var i32x ok;
  111.     print(_szLogin);
  112.     print(" trying to login..\n");
  113.     
  114.     // get client
  115.     var Net_Client client;
  116.     client = GetCurrentClient();
  117.  
  118.     var i32x i;
  119.     var i32x user,manager,teamID,guest,guestok;
  120.     var i32x iDivision;
  121.     var szx szAuthorization;
  122.     var Net_ClientList pClientList;
  123.  
  124.     guestok = 0;
  125.     ok = 1;
  126.     user = -1;
  127.     manager = -1;
  128.     teamID = -1;
  129.  
  130.     // get user
  131.     user = Join_FindKeyFromStringData(g_stJoins.m_iUser_szLogin, _szLogin);
  132.     if(user == -1)
  133.     {
  134.         print("User not found\n");
  135.         ok = 0;
  136.  
  137.         // ** internet : skip authorization...
  138.         // Check free guest user ID
  139.         guest = Join_FindKeyFromStringData(g_stJoins.m_iUser_GuestLogin,_szLogin);
  140.         if(guest < 0)
  141.         {
  142.             guest = Join_FindKeyFromIntData(g_stJoins.m_iUser_GuestFree,g_iGUEST_STATUS_Free);
  143.             if(guest > 0)
  144.             {                
  145.                 // Fill guest slot
  146.                 Join_SetIntFromKey(        g_stJoins.m_iUser_GuestFree,    guest,g_iGUEST_STATUS_Guest);
  147.                 Join_SetStringFromKey(    g_stJoins.m_iUser_GuestLogin,    guest,_szLogin);
  148.                 Join_SetStringFromKey(    g_stJoins.m_iUser_GuestPassword,guest,_szLogin);
  149.             }
  150.         }
  151.         
  152.         if(guest >= 0)
  153.         {
  154.             // Okay for guest connection
  155.             print(" Guest connection with ID : ");println(itoa(guest));
  156.             guestok = 1;
  157.         }
  158.     }
  159.  
  160.     if(guestok == 1)
  161.     {
  162.         // Guest connection
  163.  
  164.         // Check guest authorization
  165.         szAuthorization = Join_GetStringFromKey(g_stJoins.m_iUser_GuestPassword, guest);
  166.         if (strcmp(szAuthorization,_szGatewayAuthorization)!=0)
  167.         {
  168.             print("guest authorization failed !\n");
  169.             println(_szLogin);
  170.             println(_szGatewayAuthorization);
  171.             println(szAuthorization);
  172.             println(itoa(guest));
  173.             guestok = 0;
  174.         }
  175.  
  176.         if(guestok==1)
  177.         {
  178.             // Guest identifier are negative
  179.             // Set client identifier to -guest id
  180.             NetClient_SetId(client,-guest);
  181.  
  182.             // Then add it to the menuserver guest client list
  183.             pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  184.             NetClientList_AddClient( pClientList, client);
  185.  
  186.             if(IsGameModeEnded())
  187.             {
  188.                 // Set client to game over
  189.                 NetClient_SetInterface(client,iGameOver);
  190.             }
  191.             else
  192.             {
  193.                 // Set client to guest interface
  194.                 NetClient_SetInterface(client,iGuestInterface);
  195.             }
  196.  
  197.             // Guest slot is no more free
  198.             Join_SetIntFromKey(g_stJoins.m_iUser_GuestFree,guest,g_iGUEST_STATUS_Guest);
  199.             Join_SetStringFromKey(g_stJoins.m_iUser_GuestLogin,guest,_szLogin);
  200.  
  201.             // Inform gateway
  202.             g_stGateway.m_pClient << mGateway_UserConnection(_szLogin);
  203.  
  204.             // Inform client
  205.             client << mUser_GameGuestOK(guest,g_stGame.m_szAdminLogin);
  206.             client << mUser_GameConfig(GetMode(),GetCalendarMode(),0,IsGameModeEnded());
  207.  
  208.             // notify clients
  209.             fnNotifyGuestLogin(guest,_szLogin);
  210.         }
  211.     }
  212.     else
  213.     {
  214.         // Registered user connection
  215.         // authorization
  216.         if (ok==1)
  217.         {
  218.             szAuthorization = Join_GetStringFromKey(g_stJoins.m_iUser_szPassword, user);
  219.             if (strcmp(szAuthorization,_szGatewayAuthorization)!=0)
  220.             {
  221.                 print("user authorization failed !\n");
  222.                 ok = 0;
  223.             }
  224.         }
  225.  
  226.         // get manager
  227.         if (ok==1)
  228.         {
  229.             manager = Join_GetIntFromKey(g_stJoins.m_iUser_ManagerId, user);
  230.             
  231.             if (manager == -1)
  232.             {
  233.                 print("No manager for user ");
  234.                 println(itoa(user));
  235.  
  236.                 ok = 0;
  237.             }
  238.         }
  239.  
  240.         // get team
  241.         if (ok==1)
  242.         {
  243.             teamID = Join_GetIntFromKey(g_stJoins.m_iManager_TeamId, manager);
  244.             
  245.             if (teamID == -1)
  246.             {
  247.                 print("No team for user ");
  248.                 print(itoa(user));
  249.                 ok = 0;
  250.             }
  251.         }
  252.  
  253.         // get division
  254.         if (ok==1)
  255.         {
  256.             //return 1 2 3 or 4: loosers
  257.             iDivision = Join_GetIntFromKey(g_stJoins.m_iUser_DivisionId, user)-1;
  258.  
  259.             if ((iDivision<0)||(iDivision>G_iNumDivision))
  260.             {
  261.                 print("wrong division\n");
  262.                 ok = 0;
  263.             }
  264.         }
  265.  
  266.         if (ok==1)
  267.         {
  268.             pClientList = NetServer_GetClientList( g_pServer, iDivision);
  269.             if (NetClientList_FindClient(pClientList, user))
  270.             {
  271.                 print("duplicated login\n");
  272.                 ok = 0;
  273.             }
  274.         }
  275.  
  276.         // add client
  277.         if (ok==1)
  278.         {
  279.             NetClient_SetId(client,user);
  280.             
  281.             //inform gateway
  282.             g_stGateway.m_pClient << mGateway_UserConnection(_szLogin);
  283.             
  284.             // Then add it to the menuserver and corresponding resolution server    
  285.             NetClientList_AddClient( pClientList, client);
  286.             
  287.             // update database
  288.             Join_SetStringFromKey(    g_stJoins.m_iUser_szPassword,    user, _szGatewayAuthorization);
  289.             Join_SetIntFromKey(        g_stJoins.m_iUser_iConnected,    user, 1);
  290.             
  291.             // inrace ?
  292.             if(g_stVirtualDay.m_iActivePhase == G_iPhase_InRace)
  293.             {
  294.                 var i32x iPreRaceTeamId;
  295.                 iPreRaceTeamId = GetPreRaceIDFromTeamID(teamID);
  296.                 Join_SetIntFromKey(g_stJoins.m_iUser_iInRaceReady, user, 0);
  297.                 Join_SetIntFromKey(g_stJoins.m_iUser_iPreRaceTeamId, user, iPreRaceTeamId);
  298.                 g_a_stPreRaceClientDivisions[iDivision].a_Clients[iPreRaceTeamId] = client;
  299.             }
  300.             
  301.             // inform client
  302.             client << mUser_GameLoginOK (_szGatewayAuthorization,user,manager,teamID,g_stGame.m_szAdminLogin);
  303.             client << mUser_GameConfig(GetMode(),GetCalendarMode(),0,IsGameModeEnded());
  304.  
  305.             // notify clients
  306.             fnNotifyUserLogin(user);
  307.             
  308.             if(IsGameModeEnded())
  309.             {
  310.                 // Set client to game over
  311.                 NetClient_SetInterface(client,iGameOver);
  312.             }
  313.             else
  314.             {
  315.                 if(g_stVirtualDay.m_iActivePhase == G_iPhase_Management)
  316.                 {
  317.                     NetClient_SetInterface(client,iManagement);
  318.                 }
  319.                 if(g_stVirtualDay.m_iActivePhase == G_iPhase_PreRace)
  320.                 {
  321.                     NetClient_SetInterface(client,iPreRace);
  322.                 }
  323.                 if(g_stVirtualDay.m_iActivePhase == G_iPhase_InRace)
  324.                 {
  325.                     NetClient_SetInterface(client,iInRace);
  326.                     
  327.                     // Client connected while in race
  328.                     // Add game client to Game Server
  329.                     var i32x iPreRaceTeamId;
  330.                     var szx szIP;
  331.                     if(GetGameServerState(iDivision)==1)
  332.                     {
  333.                         iPreRaceTeamId = GetPreRaceIDFromTeamID(teamID);
  334.                         if(iPreRaceTeamId == -1)
  335.                         {
  336.                             print("Team not in race : ");
  337.                             println(itoa(teamID));
  338.                         }
  339.                         else
  340.                         {
  341.                             print("Adding client to resolution server.\n");
  342.                             AddPassword(iDivision,_szGatewayAuthorization,iPreRaceTeamId);
  343.                             client << mUser_InRaceServer (GetGameServerPort(iDivision));
  344.                             client << mUser_InRaceStart(iPreRaceTeamId);
  345.                         }
  346.                     }
  347.                 }
  348.             }
  349.         }
  350.         else
  351.         {
  352.             NetClient_Disconnect(client);
  353.         }
  354.     }
  355. }
  356.  
  357. //User set udp flow
  358. func void fnSetUDPFlow (f32x _fValue)
  359. {
  360.         // get client
  361.     var Net_Client pClient;
  362.     var i32x iUserID;
  363.     
  364.     pClient = GetCurrentClient();
  365.     iUserID = NetClient_GetId(pClient);
  366.     
  367.     println("Script : fnSetUDPFlow");
  368.  
  369.     if(fnIsAdmin(iUserID)>0)
  370.     {
  371.         println("Script : fnSetUDPFlow for admin");
  372.  
  373.         SetUDPFlow(_fValue);
  374.     }
  375. }
  376.  
  377.  
  378. // *********************
  379. // *** Notifications ***
  380. // *********************
  381.  
  382.  
  383. func void fnNotifyGuestLogin(i32x iGuestID, szx szLogin)
  384. {
  385.     var i32x i, j, iNumClients;
  386.     var Net_ClientList pClientList;
  387.     var Net_Client pClient;
  388.     
  389.     i=0;
  390.     while (i<G_iNumDivision)
  391.     {
  392.         // notify registered users
  393.         pClientList = NetServer_GetClientList( g_pServer, i);
  394.         iNumClients = NetClientList_GetSize(pClientList);
  395.         
  396.         j = 0;
  397.         while (j<iNumClients)
  398.         {
  399.             pClient = NetClientList_GetClient(pClientList,j);
  400.             pClient << mUser_NotifyGuestLogin(iGuestID, szLogin);
  401.             j=j+1;
  402.         }
  403.         i=i+1;
  404.     }
  405.  
  406.     // notify registered guests
  407.     pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  408.     iNumClients = NetClientList_GetSize(pClientList);
  409.  
  410.     i = 0;
  411.     while (i<iNumClients)
  412.     {
  413.         pClient = NetClientList_GetClient(pClientList,i);
  414.         pClient << mUser_NotifyGuestLogin(iGuestID, szLogin);
  415.         i=i+1;
  416.     }
  417. }
  418.  
  419. func void fnNotifyGuestLogout(i32x iGuestID)
  420. {
  421.     var i32x i, j, iNumClients;
  422.     var Net_ClientList pClientList;
  423.     var Net_Client pClient;
  424.  
  425.     i=0;
  426.     while (i<G_iNumDivision)
  427.     {
  428.         // notify registered users
  429.         pClientList = NetServer_GetClientList( g_pServer, i);
  430.         iNumClients = NetClientList_GetSize(pClientList);
  431.         
  432.         j = 0;
  433.         while (j<iNumClients)
  434.         {
  435.             pClient = NetClientList_GetClient(pClientList,j);
  436.             pClient << mUser_NotifyGuestLogout(iGuestID);
  437.             j=j+1;
  438.         }
  439.         i=i+1;
  440.     }
  441.  
  442.     // notify registered guests
  443.     pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  444.     iNumClients = NetClientList_GetSize(pClientList);
  445.  
  446.     i = 0;
  447.     while (i<iNumClients)
  448.     {
  449.         pClient = NetClientList_GetClient(pClientList,i);
  450.         pClient << mUser_NotifyGuestLogout(iGuestID);
  451.         i=i+1;
  452.     }
  453. }
  454.  
  455.  
  456. func void fnNotifyUserLogin(i32x iUserId)
  457. {
  458.     var i32x i, j, iNumClients;
  459.     var Net_ClientList pClientList;
  460.     var Net_Client pClient;
  461.     
  462.     i=0;
  463.     while (i<G_iNumDivision)
  464.     {
  465.         // notify registered users
  466.         pClientList = NetServer_GetClientList( g_pServer, i);
  467.         iNumClients = NetClientList_GetSize(pClientList);
  468.         
  469.         j = 0;
  470.         while (j<iNumClients)
  471.         {
  472.             pClient = NetClientList_GetClient(pClientList,j);
  473.             pClient << mUser_NotifyUserLogin(iUserId);
  474.             j=j+1;
  475.         }
  476.         i=i+1;
  477.     }
  478.  
  479.     // notify registered guests
  480.     pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  481.     iNumClients = NetClientList_GetSize(pClientList);
  482.  
  483.     i = 0;
  484.     while (i<iNumClients)
  485.     {
  486.         pClient = NetClientList_GetClient(pClientList,i);
  487.         pClient << mUser_NotifyUserLogin(iUserId);
  488.         i=i+1;
  489.     }
  490. }
  491.  
  492. func void fnNotifyUserLogout(i32x iUserId)
  493. {
  494.     var i32x i, j, iNumClients;
  495.     var Net_ClientList pClientList;
  496.     var Net_Client pClient;
  497.  
  498.     i=0;
  499.     while (i<G_iNumDivision)
  500.     {
  501.         // notify registered users
  502.         pClientList = NetServer_GetClientList( g_pServer, i);
  503.         iNumClients = NetClientList_GetSize(pClientList);
  504.         
  505.         j = 0;
  506.         while (j<iNumClients)
  507.         {
  508.             pClient = NetClientList_GetClient(pClientList,j);
  509.             pClient << mUser_NotifyUserLogout(iUserId);
  510.             j=j+1;
  511.         }
  512.         i=i+1;
  513.     }
  514.  
  515.     // notify registered guests
  516.     pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  517.     iNumClients = NetClientList_GetSize(pClientList);
  518.  
  519.     i = 0;
  520.     while (i<iNumClients)
  521.     {
  522.         pClient = NetClientList_GetClient(pClientList,i);
  523.         pClient << mUser_NotifyUserLogout(iUserId);
  524.         i=i+1;
  525.     }
  526. }
  527.  
  528. func void fnNotifyUserReady(i32x iUserId)
  529. {
  530.     var i32x i, j, iNumClients;
  531.     var Net_ClientList pClientList;
  532.     var Net_Client pClient;
  533.     
  534.     i=0;
  535.     while (i<G_iNumDivision)
  536.     {
  537.         // notify registered users
  538.         pClientList = NetServer_GetClientList( g_pServer, i);
  539.         iNumClients = NetClientList_GetSize(pClientList);
  540.         
  541.         j = 0;
  542.         while (j<iNumClients)
  543.         {
  544.             pClient = NetClientList_GetClient(pClientList,j);
  545.             pClient << mUser_NotifyUserReady(iUserId);
  546.             j=j+1;
  547.         }
  548.         i=i+1;
  549.     }
  550.  
  551.     // notify registered guests
  552.     pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  553.     iNumClients = NetClientList_GetSize(pClientList);
  554.  
  555.     i = 0;
  556.     while (i<iNumClients)
  557.     {
  558.         pClient = NetClientList_GetClient(pClientList,i);
  559.         pClient << mUser_NotifyUserReady(iUserId);
  560.         i=i+1;
  561.     }
  562. }
  563. func void fnNotifyUserNotReady(i32x iUserId)
  564. {
  565.     var i32x i, j, iNumClients;
  566.     var Net_ClientList pClientList;
  567.     var Net_Client pClient;
  568.     
  569.     i=0;
  570.     while (i<G_iNumDivision)
  571.     {
  572.         // notify registered users
  573.         pClientList = NetServer_GetClientList( g_pServer, i);
  574.         iNumClients = NetClientList_GetSize(pClientList);
  575.         
  576.         j = 0;
  577.         while (j<iNumClients)
  578.         {
  579.             pClient = NetClientList_GetClient(pClientList,j);
  580.             pClient << mUser_NotifyUserNotReady(iUserId);
  581.             j=j+1;
  582.         }
  583.         i=i+1;
  584.     }
  585.  
  586.     // notify registered guests
  587.     pClientList = NetServer_GetClientList( g_pServer, G_iGuestClientList);
  588.     iNumClients = NetClientList_GetSize(pClientList);
  589.  
  590.     i = 0;
  591.     while (i<iNumClients)
  592.     {
  593.         pClient = NetClientList_GetClient(pClientList,i);
  594.         pClient << mUser_NotifyUserNotReady(iUserId);
  595.         i=i+1;
  596.     }
  597. }
  598.  
  599. // *********************
  600. // *** Admin command ***
  601. // *********************
  602.  
  603. func i32x fnIsAdmin(i32x iUserID)
  604. {
  605.     var szx szUserLogin;        
  606.     var i32x iIsAdmin;
  607.     var i32x iGuestID;
  608.     iIsAdmin = 0;
  609.     
  610.     if(iUserID>0)
  611.     {
  612.         // user
  613.         szUserLogin = Join_GetStringFromKey(g_stJoins.m_iUser_szLogin,iUserID);
  614.         if(strcmp(szUserLogin,g_stGame.m_szAdminLogin) == 0)
  615.         {
  616.             iIsAdmin = 1;
  617.         }
  618.     }
  619.     else if(iUserID<0)
  620.     {
  621.         // guest
  622.         iGuestID = -iUserID;
  623.         szUserLogin = Join_GetStringFromKey(g_stJoins.m_iUser_GuestLogin, iGuestID);
  624.         if(strcmp(szUserLogin,g_stGame.m_szAdminLogin) == 0)
  625.         {
  626.             iIsAdmin = 1;
  627.         }
  628.     }
  629.     
  630.     return iIsAdmin;
  631. }
  632.  
  633.  
  634. func void fnAdminKickGuest(szx _szLogin)
  635. {
  636.     // get client
  637.     var Net_Client pClient;
  638.     var Net_ClientList pClientList;
  639.     var i32x iUserID;
  640.     var i32x iGuestID;
  641.     pClient = GetCurrentClient();
  642.     iUserID = NetClient_GetId(pClient);
  643.     
  644.     if(fnIsAdmin(iUserID)>0)
  645.     {
  646.         iGuestID = Join_FindKeyFromStringData(g_stJoins.m_iUser_GuestLogin, _szLogin);
  647.         if (iGuestID>0)
  648.         {
  649.             if ((iGuestID!=iUserID) &&(iGuestID!=-iUserID))
  650.             {
  651.                 // disconnect
  652.                 print("admin kicks out guest ");
  653.                 println(_szLogin);
  654.                 pClientList = NetServer_GetClientList(g_pServer,G_iGuestClientList);
  655.                 pClient = NetClientList_FindClient(pClientList,-iGuestID);
  656.                 if (pClient)
  657.                     NetClient_Disconnect(pClient);
  658.             }
  659.         }
  660.     }
  661. }
  662.  
  663. func void fnAdminKickUser(szx _szLogin)
  664. {
  665.     var Net_Client pClient;
  666.     var Net_ClientList pClientList;
  667.  
  668.     var i32x iUserID;
  669.     var i32x iDivision;
  670.     var i32x iKickUserID;
  671.  
  672.     // get client
  673.     pClient = GetCurrentClient();
  674.     iUserID = NetClient_GetId(pClient);
  675.     
  676.     if(fnIsAdmin(iUserID)>0)
  677.     {
  678.         iKickUserID = Join_FindKeyFromStringData(g_stJoins.m_iUser_szLogin, _szLogin);
  679.         if (iKickUserID>0)
  680.         {
  681.             if (iKickUserID!=iUserID)
  682.             {
  683.                 // kick user
  684.                 print("admin kicks out user");
  685.                 println(_szLogin);
  686.                 
  687.                 // get client
  688.                 iDivision = Join_GetIntFromKey(g_stJoins.m_iUser_DivisionId,iKickUserID)-1;
  689.                 pClientList = NetServer_GetClientList(g_pServer,iDivision);
  690.                 pClient = NetClientList_FindClient(pClientList,iKickUserID);
  691.                 
  692.                 // unsubscribe & Disconnect
  693.                 fnUnsubscribeUser(iKickUserID);
  694.                 if (pClient)
  695.                     NetClient_Disconnect(pClient);
  696.             }
  697.         }
  698.     }
  699. }
  700.  
  701. // valid next phase
  702. func void fnCallNextPhaseNull()
  703. {
  704. }
  705. func void fnCallNextPhase()
  706. {
  707.     // get client
  708.     var Net_Client pClient;
  709.     var i32x iUserID,iNumUsers,iUser,bLaunch;
  710.     pClient = GetCurrentClient();
  711.     iUserID = NetClient_GetId(pClient);
  712.  
  713.     if(iUserID>0)
  714.     {
  715.         // Valid registered user
  716.         print("User ");print(itoa(iUserID));print(" Ready.\n");
  717.  
  718.         // Check is launch ready flag
  719.         Join_SetIntFromKey(g_stJoins.m_iUser_iLaunchGame,iUserID,1);
  720.  
  721.         // notify users
  722.         fnNotifyUserReady(iUserID);
  723.  
  724.         // if all users are ready launch race !
  725.         bLaunch = true;
  726.         iUser = 0;
  727.         iNumUsers = Join_GetNumRows(g_stJoins.m_iUser_iLaunchGame);
  728.         while(iUser<iNumUsers)
  729.         {
  730.             if(Join_GetIntFromIndex(g_stJoins.m_iUser_iConnected,iUser) == 1)
  731.             {
  732.                 if(Join_GetIntFromIndex(g_stJoins.m_iUser_iLaunchGame,iUser) == 0)
  733.                 {
  734.                     bLaunch = false;
  735.                 }
  736.             }
  737.             iUser = iUser + 1;
  738.         }
  739.  
  740.         if(bLaunch)
  741.         {
  742.             // Reset ready flags
  743.             iUser = 0;
  744.             while(iUser<iNumUsers)
  745.             {
  746.                 if(Join_GetIntFromIndex(g_stJoins.m_iUser_iConnected,iUser) == 1)
  747.                 {
  748.                     fnNotifyUserNotReady(Join_GetIntFromIndex(g_stJoins.m_iUser_iID,iUser));
  749.                 }
  750.                 Join_SetIntFromIndex(g_stJoins.m_iUser_iLaunchGame,iUser,0);
  751.                 iUser = iUser + 1;
  752.             }
  753.             
  754.             // Launch race server
  755.             print("Launch race server...\n");
  756.             NextPhase(); // PreRace phase
  757.             NextPhase(); // InRace phase
  758.         }
  759.     }
  760. }
  761. // Cancel next phase
  762. func void fnCancelNextPhaseNull()
  763. {
  764. }
  765. func void fnCancelNextPhase()
  766. {
  767.     // get client
  768.     var Net_Client pClient;
  769.     var i32x iUserID;
  770.     pClient = GetCurrentClient();
  771.     iUserID = NetClient_GetId(pClient);
  772.  
  773.     if(iUserID>0)
  774.     {
  775.         // Valid registered user
  776.         // Uncheck is launch ready flag
  777.         Join_SetIntFromKey(g_stJoins.m_iUser_iLaunchGame,iUserID,0);
  778.  
  779.         // notify users
  780.         fnNotifyUserNotReady(iUserID);
  781.     }
  782. }
  783.  
  784. func void fnAdminCallNextStageNull()
  785. {
  786. }
  787. func void fnAdminCallNextStage()
  788. {
  789.     print("<< next stage..\n");
  790.  
  791.     // get client
  792.     var Net_Client pClient;
  793.     var i32x iUserID;
  794.     pClient = GetCurrentClient();
  795.     iUserID = NetClient_GetId(pClient);
  796.  
  797.     if(fnIsAdmin(iUserID)>0)
  798.     {
  799.         // Don't skip stage in Stage mode
  800.         if(g_stGame.m_iMode != g_iGAMEMODE_SingleRace)
  801.         {
  802.             // Skip stage
  803.             NextStage();
  804.             // Compute CPU roster for next stage
  805.             ManageRoster();
  806.         }
  807.     }
  808. }
  809.  
  810.  
  811. func void fnConsoleSpeed(i32x iSpeed)
  812. {
  813.     if(G_iDebugVersion)
  814.     {
  815.         if(iSpeed<=0)
  816.         {
  817.             SetRaceSpeed(0);
  818.         }
  819.         else if(iSpeed>=64)
  820.         {
  821.             SetRaceSpeed(64);
  822.         }
  823.         else
  824.         {
  825.             SetRaceSpeed(iSpeed);
  826.         }
  827.     }
  828.     else
  829.     {
  830.         // get client
  831.         var Net_Client pClient;
  832.         var i32x iUserID;
  833.         pClient = GetCurrentClient();
  834.         iUserID = NetClient_GetId(pClient);
  835.  
  836.         if(fnIsAdmin(iUserID)>0)
  837.         {
  838.             if(iSpeed<=0)
  839.             {
  840.                 SetRaceSpeed(0);
  841.             }
  842.             else if(iSpeed>=8)
  843.             {
  844.                 SetRaceSpeed(8);
  845.             }
  846.             else
  847.             {
  848.                 SetRaceSpeed(iSpeed);
  849.             }
  850.         }
  851.         else
  852.         {
  853.             print("###NOT Admin User can't set speed###\n");
  854.  
  855.         }
  856.     }
  857. }
  858. func void fnConsoleSpeed_Null(i32x iSpeed)
  859. {}
  860.  
  861.  
  862. func void fnConsoleDelta(i32x iDelta)
  863. {
  864.     if(G_iDebugVersion)
  865.     {
  866.         SetRaceDelta(iDelta);
  867.     }
  868. }
  869. func void fnConsoleDelta_Null(i32x iDelta)
  870. {}
  871.  
  872.  
  873. // *********************
  874. // user subscribe
  875. // *********************
  876. func void fnUserSubscribe(i32x _iTeamID)
  877. {
  878.     var i32x iGuestID;
  879.     // get client
  880.     var Net_Client pClient;
  881.     pClient = GetCurrentClient();
  882.  
  883.     // Client is a guest
  884.     iGuestID = -NetClient_GetId(pClient);
  885.     
  886.     if(iGuestID>0)
  887.     {
  888.         var i32x iPlayer;
  889.  
  890.         print("<< guest client trying to subscribe team :");
  891.         println(Join_GetStringFromKey(g_stJoins.m_iTeam_szName,_iTeamID ));
  892.  
  893.         // Check if team has no human manager
  894.         iPlayer = Join_GetIntFromKey( g_stJoins.m_iTeam_iUserId, _iTeamID);
  895.  
  896.         if(iPlayer==0)
  897.         {
  898.             var szx szLogin;
  899.             // Free team
  900.  
  901.             // Retrieve gateway user id from GAM_guestuser
  902.             szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_GuestLogin,iGuestID);
  903.  
  904.             // subscribe user
  905.             fnSubscribeUser(iGuestID,_iTeamID);
  906.         }
  907.         else
  908.         {
  909.             // Unvalid team
  910.             println("Team not free !");
  911.             // inform client
  912.             pClient<<mUser_GameSubscribeCancel();
  913.         }
  914.     }
  915.     else
  916.     {
  917.         print("Unvalid Guest ID for subscription :");
  918.         println(itoa(iGuestID));
  919.  
  920.         // Flood ?
  921.     }
  922. }
  923.  
  924.  
  925. // *********************
  926. // user Unsubscribe
  927. // *********************
  928. func void fnUserUnsubscribeNull()
  929. {
  930. }
  931. func void fnUserUnsubscribe()
  932. {
  933.     var i32x iUserID;
  934.     // get client
  935.     var Net_Client pClient;
  936.     pClient = GetCurrentClient();
  937.  
  938.     // Client is a registered user
  939.     iUserID = NetClient_GetId(pClient);
  940.  
  941.  
  942.     if(iUserID>0)
  943.     {
  944.         var i32x iPlayer;
  945.         var i32x iTeamID;
  946.  
  947.         // Retrieve team id of client
  948.         iTeamID = Join_GetIntFromKey(g_stJoins.m_iUser_iTeamId,iUserID);
  949.  
  950.         print("<< client trying to unsubscribe from team :");
  951.         print(Join_GetStringFromKey(g_stJoins.m_iTeam_szName,iTeamID ));
  952.         print("... ");
  953.  
  954.         // Check if team has human manager
  955.         iPlayer = Join_GetIntFromKey( g_stJoins.m_iTeam_iUserId, iTeamID);
  956.  
  957.         if(iPlayer>0)
  958.         {
  959.             var szx szLogin;
  960.             // team is not free
  961.  
  962.             // Retrieve gateway login from GAM_user
  963.             szLogin = Join_GetStringFromKey(g_stJoins.m_iUser_szLogin,iUserID);
  964.  
  965.             fnUnsubscribeUser(iUserID);
  966.         }
  967.         else
  968.         {
  969.             // Unvalid team
  970.             println("Team already free !");
  971.             // inform client
  972.             pClient<<mUser_GameUnsubscribeCancel();
  973.         }
  974.     }
  975.     else
  976.     {
  977.         print("Unvalid User ID for unsubscription :");
  978.         println(itoa(iUserID));
  979.  
  980.         // Flood ?
  981.     }
  982. }
  983.  
  984.  
  985.  
  986.  
  987.  
  988.