hlmod.hu
https://hlmod.hu/

Csapatkeveréshez kódigény
https://hlmod.hu/viewtopic.php?f=10&t=25452
Oldal: 1 / 1

Szerző:  regener [ 2016.07.10. 18:33 ]
Hozzászólás témája:  Csapatkeveréshez kódigény

Egy plugint (Advanced Team Transfer) alakítottam át saját használatra hogy cseréljem a csapatokat igény szerint chatről, viszont szeretnék bele egy keverés részt is, de a csapatlétszámoknál kicsit elakadtam.
Itt járok, s egy kis segítséget megköszönnék :D
  1. new players[32], x;
  2. get_players(players,x,"h");
  3. if (x==0)   return PLUGIN_HANDLED;
  4. new counter = 0
  5. for(new a = 0; a < x; a++)
  6. {
  7.     counter++
  8.     if(counter == 2)
  9.     {
  10.         new countT = getPlayersNum(CS_TEAM_T)
  11.         new countCT = getPlayersNum(CS_TEAM_CT)
  12.         if(countT >= countCT+2 || countCT >= countT+2)
  13.             return PLUGIN_CONTINUE;
  14.            
  15.         if(get_user_team(players[a])==1)
  16.             cs_set_user_team (players[a], CS_TEAM_CT)
  17.         if(get_user_team(players[a])==2)
  18.             cs_set_user_team (players[a], CS_TEAM_T)
  19.         counter = 0
  20.     }
  21. }



  1. getPlayersNum(CsTeams:Team)
  2. {
  3.     new iCount = 0, pnum = 0, players[32];
  4.     get_players(players, pnum);
  5.  
  6.     for(new i = 1; i <= pnum; i++)
  7.     {
  8.         if(is_user_connected(i))
  9.         {
  10.             if(cs_get_user_team(i) == Team)
  11.             {
  12.                 ++iCount;
  13.             }
  14.         }
  15.     }
  16.     return iCount;
  17. }

Szerző:  demon [ 2016.07.11. 01:34 ]
Hozzászólás témája:  Re: Csapatkeveréshez kódigény

1. for ciklusban felesleges a counter változó, ha már minden második eset kell neked akkor csak egyszerűen kettesével lépkedsz a for-ban ( for ( new a = 0; a < x; a += 2 ) ).
2. Nem kell minden for lépésnél lekérni a CT illetve T játékosok számát, elég 1x a for előtt, illetve az if rész ( if(countT >= countCT+2 || countCT >= countT+2) ) is mehet a foron kívülre, mivel elég 1x leellenőrizni a létszámot.
3. Van egyszerűbb módja is a játékosok megszámlálására.

  1. public asd( )
  2. {
  3.     new iPlayers[ 32 ], iPlayerCount;
  4.     get_players( iPlayers, iPlayerCount, "h" );
  5.    
  6.     new iTeams[ CsTeams ];
  7.     GetPlayerCount( iTeams );
  8.    
  9.     if ( iTeams[ CS_TEAM_T ] >= iTeams[ CS_TEAM_CT ] + 2 || iTeams[ CS_TEAM_CT ] >= iTeams[ CS_TEAM_T ] + 2 )
  10.         return PLUGIN_HANDLED;
  11.    
  12.     for ( new i, iPlrId; i < iPlayerCount; i += 2 )
  13.     {
  14.         iPlrId = iPlayers[ i ];
  15.         if ( cs_get_user_team( iPlrId ) == 1 )
  16.             cs_set_user_team ( iPlrId, CS_TEAM_CT )
  17.         else if ( cs_get_user_team( iPlrId ) == 2 )
  18.             cs_set_user_team ( iPlrId, CS_TEAM_T )
  19.     }
  20. }
  21.        
  22. stock GetPlayerCount( iTeamPlayers[ CsTeams ] )
  23. {
  24.     static iPlayers[ 32 ], iPlayerCount;
  25.    
  26.     get_players( iPlayers, iPlayerCount );
  27.    
  28.     for ( new i = 0 ; i < iPlayerCount ; ++i )
  29.         ++iTeamPlayers[ cs_get_user_team( iPlayers[ i ] ) ];
  30. }

Szerző:  regener [ 2016.07.11. 02:01 ]
Hozzászólás témája:  Re: Csapatkeveréshez kódigény

Köszi, viszont ha jól értelmezem a kódod akkor itt ha egyik csapat sem több 2-vel mint a másik, akkor átrak minden 2. embert valahová, viszont lehet hogy az átrakás után már mondjuk 2 vagy annál több lesz a csapatlétszámok különbsége.

1. Igaz, nemtudom miért nem jutott eszembe
2. Azért kértem le folyamatosan a létszámot hogy addig fusson amíg ez meg nem történik, mert ilyenkor lehet hogy 5v5-ből kialakul mondjuk 3v7 vagy ilyesmi, az autobalance meg 2 kör addig meg megy az adminok szidása...
2.1 Most jöttem rá hogy nem is return kell nekem itt hanem break, mert ezután nem tud lefutni az üzenet az átrakásról :D
(dhudmessage van amit mindenki megkap hogy lássák mi történt, igaz a játékosok fele rákérdez hogy miért őt rakta át, amikor a fél képernyő méretű üzenet ott virít a képébe a kör végén/elején - kör végén történik a mozgatás)
3. igaz, de nem vagyok egy nagy szaki még

Szerző:  Akosch:. [ 2016.07.11. 04:20 ]
Hozzászólás témája:  Re: Csapatkeveréshez kódigény

Szövegesen le tudnád írni, h mi a pontos cél?

Viszont eddig, amit nem tartanék hülyeségnek:
  1. fnTeamTransfer( )
  2. {
  3.     new iCTs[ MAX_PLAYERS + 1 ], iTs[ MAX_PLAYERS + 1 ], iNumOfCTs, iNumOfTs;
  4.  
  5.     get_players( iCTs, iNumOfCTs, "ce", "CT" );
  6.     get_players( iTs, iNumOfTs, "ce", "T" );
  7.  
  8.     if ( -2 <= ( iNumOfCTs - iNumOfTs ) <= 2 ) // ha nincs az egyik csapatban 2-vel több
  9.     {
  10.         for ( new i; i < iNumOfCTs; ++i )
  11.             cs_set_user_team( iCTs[ i ], CS_TEAM_T );
  12.         for ( new i; i < iNumOfTs; ++i )
  13.             cs_set_user_team( iTs[ i ], CS_TEAM_CT );
  14.     }
  15. }


De még egyszer mondom, nem teljesen értettem meg a célod a kódból.

Szerző:  regener [ 2016.07.11. 10:15 ]
Hozzászólás témája:  Re: Csapatkeveréshez kódigény

Igaz, kicsit hülyén írtam le.

Tehát Már van egy funkció amely simán megcseréli a 2 csapatot és ezenkívül szeretnék egy olyan keverést amely nem az egész csapatot érinti hanem mondjuk minden 2. játékost csak és azokat cseréli meg. De azt se akarom hogy mondjuk ha minden második játékos CT akkor átrakja mindet T-be és totál unbalanced legyen.

Valami olyasmi lehet hogy letárolni az a CT és T játékosokat és a letároltakból cserélni ugyanannyi mennyiségűt?

Illetve a "get_players( iTs, iNumOfTs, "ce", "T" )" az bugos, csak akkor jó ha szűrsz hozzá az a vagy a b flagra, ezért van másként lekérve.

Oldal: 1 / 1 Minden időpont UTC+02:00 időzóna szerinti
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/