Guest User

Stewie` Fader R3

a guest
Mar 12th, 2013
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <a_samp>
  2.  
  3. forward Fader_PlayerProcess(playerid);
  4. stock fadeIn(playerid, ms, color = 0x000000FF);
  5. stock fadeOut(playerid, ms, color = 0x000000FF);
  6.  
  7. static const
  8.     MAX_TRANSPARENCY = 0xFF,
  9.     TIMER_FRAME = 50;
  10.    
  11. enum {
  12.     FADE_IN = 1,
  13.     FADE_OUT
  14. }
  15.  
  16. enum E_PLAYER_FADE_INFO {
  17.     PlayerText:fadeText,
  18.     fadeCurrentAlpha,
  19.    
  20.     fadeTotalFrames,
  21.     fadeTransparencyPerFrame,
  22.     fadeColor,
  23.    
  24.     fadeTimer,
  25.     fadeType
  26. }
  27. static gPlayerFadeInfo[MAX_PLAYERS][E_PLAYER_FADE_INFO];
  28.  
  29. #define CAP_MAX(%0) ((%0 > MAX_TRANSPARENCY) ? (MAX_TRANSPARENCY) : %0)
  30. #define CAP_MIN(%0) ((%0 < 0) ? (0) : %0)
  31.  
  32. /* Natives:
  33. *   native fadeIn(playerid, ms, color = 0x000000FF);
  34. *   native fadeOut(playerid, ms, color = 0x000000FF);
  35. *
  36. *   por Stewie`
  37. */
  38.  
  39. stock fadeIn(playerid, ms, color = 0x000000FF) {
  40.     if(!IsPlayerConnected(playerid))
  41.         return 0;
  42.        
  43.     // pegar a transparência atual da textdraw
  44.     new alpha = gPlayerFadeInfo[playerid][fadeCurrentAlpha];
  45.     // no caso da textdraw tiver a transparência cheia, ou mais do que o permitido, o nosso trabalho está feito
  46.     if((MAX_TRANSPARENCY - alpha) <= 0) {
  47.         gPlayerFadeInfo[playerid][fadeCurrentAlpha] = MAX_TRANSPARENCY;
  48.         gPlayerFadeInfo[playerid][fadeType] = 0;
  49.  
  50.         PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | alpha);
  51.         PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]);
  52.         return 1;
  53.     }
  54.     // configurar o tipo de fade que estamos aplicando
  55.     gPlayerFadeInfo[playerid][fadeType] = FADE_IN;
  56.    
  57.     // mover um byte para a direita para 'apagar' a transparência
  58.     // e '>>' para não voltar para o começo os primeiros bits
  59.     gPlayerFadeInfo[playerid][fadeColor] = color >> 8;
  60.  
  61.     // a quantidade de frames que o PlayerProcess irá processar
  62.     // você pode perceber que a duração é dividida pelos frames por processamento e, se existe restante, é adicinado mais um processamento
  63.     gPlayerFadeInfo[playerid][fadeTotalFrames] = ((ms / TIMER_FRAME) + _:((ms % TIMER_FRAME) > 0));
  64.     // o tanto de transparência que será adicionado por cada processamento
  65.     // no fim, deve ser checado a quantidade de transarência que a textdraw possui
  66.     // a transparência que será adicionada até o final é dividida pela quantidade de frames que serão rodados
  67.     gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] =  (MAX_TRANSPARENCY - alpha) / gPlayerFadeInfo[playerid][fadeTotalFrames];
  68.    
  69.     if(gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] <= 0) {
  70.         gPlayerFadeInfo[playerid][fadeType] = 0;
  71.         return 1;
  72.     }
  73.    
  74.     PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | alpha);
  75.     PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]);
  76.     // se não existir o timer, criá-lo!
  77.     if(!gPlayerFadeInfo[playerid][fadeTimer]) {
  78.         gPlayerFadeInfo[playerid][fadeTimer] = SetTimerEx("Fader_PlayerProcess", TIMER_FRAME, 1, "i", playerid);
  79.     }
  80.     return 1;
  81. }
  82.  
  83. stock fadeOut(playerid, ms, color = 0x000000FF) {
  84.     if(!IsPlayerConnected(playerid))
  85.         return 0;
  86.        
  87.     // pegar a transparência atual da textdraw
  88.     new alpha = gPlayerFadeInfo[playerid][fadeCurrentAlpha];
  89.     // no caso da textdraw não tiver nenhuma transparênca, sair
  90.     if(alpha <= 0) {
  91.         gPlayerFadeInfo[playerid][fadeCurrentAlpha] = MAX_TRANSPARENCY;
  92.         gPlayerFadeInfo[playerid][fadeType] = 0;
  93.  
  94.         PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | alpha);
  95.         PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]);
  96.         return 1;
  97.     }
  98.     // configurar o tipo de fade que estamos aplicando
  99.     gPlayerFadeInfo[playerid][fadeType] = FADE_OUT;
  100.    
  101.     // mover um byte para a direita para 'apagar' a transparência
  102.     // e '>>' para não voltar para o começo os primeiros bits
  103.     gPlayerFadeInfo[playerid][fadeColor] = color >> 8;
  104.  
  105.     // a quantidade de frames que o PlayerProcess irá processar
  106.     // você pode perceber que a duração é dividida pelos frames por processamento e, se existe restante, é adicinado mais um processamento
  107.     gPlayerFadeInfo[playerid][fadeTotalFrames] = ((ms / TIMER_FRAME) + _:((ms % TIMER_FRAME) > 0));
  108.     // o tanto de transparência que será subtraída por cada processamento
  109.     // no fim, deve ser checado a quantidade de transarência que a textdraw possui
  110.     // a transparência que será subtraída até o final é dividida pela quantidade de frames que serão rodados
  111.     gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] =  (alpha) / gPlayerFadeInfo[playerid][fadeTotalFrames];
  112.    
  113.     if(gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] <= 0) {
  114.         gPlayerFadeInfo[playerid][fadeType] = 0;
  115.         return 1;
  116.     }
  117.    
  118.     PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | alpha);
  119.     PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]);
  120.     // se não existir o timer, criá-lo!
  121.     if(!gPlayerFadeInfo[playerid][fadeTimer]) {
  122.         gPlayerFadeInfo[playerid][fadeTimer] = SetTimerEx("Fader_PlayerProcess", TIMER_FRAME, 1, "i", playerid);
  123.     }
  124.     return 1;
  125. }
  126.  
  127. public Fader_PlayerProcess(playerid) {
  128.     // se o fade foi desligado para o player, mas o timer ainda está ativo
  129.     if(gPlayerFadeInfo[playerid][fadeType] == 0) {
  130.         // se o timer existe
  131.         if(gPlayerFadeInfo[playerid][fadeTimer] > 0) {
  132.             KillTimer(gPlayerFadeInfo[playerid][fadeTimer]);
  133.             gPlayerFadeInfo[playerid][fadeTimer] = 0;
  134.  
  135.             PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | gPlayerFadeInfo[playerid][fadeCurrentAlpha]);
  136.             PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]);
  137.         }
  138.     }
  139.    
  140.     switch(gPlayerFadeInfo[playerid][fadeType]) {
  141.         case FADE_IN: {
  142.             gPlayerFadeInfo[playerid][fadeCurrentAlpha] += gPlayerFadeInfo[playerid][fadeTransparencyPerFrame];
  143.             gPlayerFadeInfo[playerid][fadeCurrentAlpha] = CAP_MAX(gPlayerFadeInfo[playerid][fadeCurrentAlpha]);
  144.            
  145.             PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | gPlayerFadeInfo[playerid][fadeCurrentAlpha]);
  146.             PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]);
  147.            
  148.             if(gPlayerFadeInfo[playerid][fadeCurrentAlpha] == MAX_TRANSPARENCY) {
  149.                 gPlayerFadeInfo[playerid][fadeType] = 0;
  150.                 KillTimer(gPlayerFadeInfo[playerid][fadeTimer]);
  151.                 gPlayerFadeInfo[playerid][fadeTimer] = 0;
  152.             }
  153.         }
  154.         case FADE_OUT: {
  155.             gPlayerFadeInfo[playerid][fadeCurrentAlpha] -= gPlayerFadeInfo[playerid][fadeTransparencyPerFrame];
  156.             gPlayerFadeInfo[playerid][fadeCurrentAlpha] = CAP_MIN(gPlayerFadeInfo[playerid][fadeCurrentAlpha]);
  157.            
  158.             PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | gPlayerFadeInfo[playerid][fadeCurrentAlpha]);
  159.             PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]);
  160.            
  161.             if(gPlayerFadeInfo[playerid][fadeCurrentAlpha] == 0) {
  162.                 gPlayerFadeInfo[playerid][fadeType] = 0;
  163.                 KillTimer(gPlayerFadeInfo[playerid][fadeTimer]);
  164.                 gPlayerFadeInfo[playerid][fadeTimer] = 0;
  165.             }
  166.         }
  167.     }
  168.     return 1;
  169. }
  170.  
  171. public OnPlayerConnect(playerid) {
  172.     new tmp[E_PLAYER_FADE_INFO];
  173.     gPlayerFadeInfo[playerid] = tmp;
  174.  
  175.     new PlayerText:text = CreatePlayerTextDraw(playerid, -20.0, -20.0, "_");
  176.     gPlayerFadeInfo[playerid][fadeText] = text;
  177.     // detalhes
  178.     PlayerTextDrawUseBox(playerid, text, 1);
  179.     PlayerTextDrawBoxColor(playerid, text, 0xFFFFFF00);
  180.     PlayerTextDrawLetterSize(playerid, text, 680.0, 500.0);
  181.     PlayerTextDrawTextSize(playerid, text, 680.0, 500.0);
  182.     return 1;
  183. }
  184.  
  185. public OnPlayerDisconnect(playerid,reason) {
  186.     gPlayerFadeInfo[playerid][fadeTimer] = 0;
  187.     return 1;
  188. }
  189.  
  190. #if defined _ALS_OnPlayerConnect
  191.     #undef OnPlayerConnect
  192. #else
  193.     #define _ALS_OnPlayerConnect
  194. #endif
  195. #define OnPlayerConnect FD_OnPlayerConnect
  196. forward FD_OnPlayerConnect(playerid);
  197.  
  198. #if defined _ALS_OnPlayerDisconnect
  199.     #undef OnPlayerDisconnect
  200. #else
  201.     #define _ALS_OnPlayerDisconnect
  202. #endif
  203. #define OnPlayerDisconnect FD_OnPlayerDisconnect
  204. forward FD_OnPlayerDisconnect(playerid,reason);
Advertisement
Add Comment
Please, Sign In to add comment