SHOW:
|
|
- or go back to the newest paste.
1 | #include <a_samp> | |
2 | ||
3 | forward Fader_PlayerProcess(playerid); | |
4 | forward OnPlayerFadeIn(playerid); | |
5 | forward OnPlayerFadeOut(playerid); | |
6 | stock fadeIn(playerid, ms, color = 0x000000FF); | |
7 | stock fadeOut(playerid, ms, color = 0x000000FF); | |
8 | ||
9 | static const | |
10 | MAX_TRANSPARENCY = 0xFF, | |
11 | - | TIMER_FRAME = 50; |
11 | + | TIMER_FRAME = 25; |
12 | ||
13 | enum { | |
14 | FADE_IN = 1, | |
15 | FADE_OUT | |
16 | } | |
17 | ||
18 | enum E_PLAYER_FADE_INFO { | |
19 | PlayerText:fadeText, | |
20 | fadeCurrentAlpha, | |
21 | ||
22 | fadeTotalFrames, | |
23 | fadeTransparencyPerFrame, | |
24 | fadeColor, | |
25 | ||
26 | fadeTimer, | |
27 | fadeType | |
28 | } | |
29 | static gPlayerFadeInfo[MAX_PLAYERS][E_PLAYER_FADE_INFO]; | |
30 | ||
31 | #define CAP_MAX(%0) ((%0 > MAX_TRANSPARENCY) ? (MAX_TRANSPARENCY) : %0) | |
32 | #define CAP_MIN(%0) ((%0 < 0) ? (0) : %0) | |
33 | ||
34 | /* Natives: | |
35 | * native fadeIn(playerid, ms, color = 0x000000FF); | |
36 | * native fadeOut(playerid, ms, color = 0x000000FF); | |
37 | * | |
38 | * por Stewie` | |
39 | */ | |
40 | ||
41 | stock fadeIn(playerid, ms, color = 0x000000FF) { | |
42 | if(!IsPlayerConnected(playerid)) | |
43 | return 0; | |
44 | ||
45 | // pegar a transparência atual da textdraw | |
46 | new alpha = gPlayerFadeInfo[playerid][fadeCurrentAlpha]; | |
47 | // no caso da textdraw tiver a transparência cheia, ou mais do que o permitido, o nosso trabalho está feito | |
48 | if((MAX_TRANSPARENCY - alpha) <= 0) { | |
49 | gPlayerFadeInfo[playerid][fadeCurrentAlpha] = MAX_TRANSPARENCY; | |
50 | gPlayerFadeInfo[playerid][fadeType] = 0; | |
51 | ||
52 | PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | alpha); | |
53 | PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]); | |
54 | return 1; | |
55 | } | |
56 | // configurar o tipo de fade que estamos aplicando | |
57 | gPlayerFadeInfo[playerid][fadeType] = FADE_IN; | |
58 | ||
59 | // mover um byte para a direita para 'apagar' a transparência | |
60 | // e '>>' para não voltar para o começo os primeiros bits | |
61 | gPlayerFadeInfo[playerid][fadeColor] = color >> 8; | |
62 | ||
63 | // a quantidade de frames que o PlayerProcess irá processar | |
64 | // você pode perceber que a duração é dividida pelos frames por processamento e, se existe restante, é adicinado mais um processamento | |
65 | gPlayerFadeInfo[playerid][fadeTotalFrames] = ((ms / TIMER_FRAME) + _:((ms % TIMER_FRAME) > 0)); | |
66 | // o tanto de transparência que será adicionado por cada processamento | |
67 | // no fim, deve ser checado a quantidade de transarência que a textdraw possui | |
68 | // a transparência que será adicionada até o final é dividida pela quantidade de frames que serão rodados | |
69 | gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] = (MAX_TRANSPARENCY - alpha) / gPlayerFadeInfo[playerid][fadeTotalFrames]; | |
70 | ||
71 | if(gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] <= 0) { | |
72 | gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] = 10; | |
73 | } | |
74 | ||
75 | PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | alpha); | |
76 | PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]); | |
77 | // se não existir o timer, criá-lo! | |
78 | if(!gPlayerFadeInfo[playerid][fadeTimer]) { | |
79 | gPlayerFadeInfo[playerid][fadeTimer] = SetTimerEx("Fader_PlayerProcess", TIMER_FRAME, 1, "i", playerid); | |
80 | } | |
81 | return 1; | |
82 | } | |
83 | ||
84 | stock fadeOut(playerid, ms, color = 0x000000FF) { | |
85 | if(!IsPlayerConnected(playerid)) | |
86 | return 0; | |
87 | ||
88 | // pegar a transparência atual da textdraw | |
89 | new alpha = gPlayerFadeInfo[playerid][fadeCurrentAlpha]; | |
90 | // no caso da textdraw não tiver nenhuma transparênca, sair | |
91 | if(alpha <= 0) { | |
92 | gPlayerFadeInfo[playerid][fadeCurrentAlpha] = MAX_TRANSPARENCY; | |
93 | gPlayerFadeInfo[playerid][fadeType] = 0; | |
94 | ||
95 | PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | alpha); | |
96 | PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]); | |
97 | return 1; | |
98 | } | |
99 | // configurar o tipo de fade que estamos aplicando | |
100 | gPlayerFadeInfo[playerid][fadeType] = FADE_OUT; | |
101 | ||
102 | // mover um byte para a direita para 'apagar' a transparência | |
103 | // e '>>' para não voltar para o começo os primeiros bits | |
104 | gPlayerFadeInfo[playerid][fadeColor] = color >> 8; | |
105 | ||
106 | // a quantidade de frames que o PlayerProcess irá processar | |
107 | // você pode perceber que a duração é dividida pelos frames por processamento e, se existe restante, é adicinado mais um processamento | |
108 | gPlayerFadeInfo[playerid][fadeTotalFrames] = ((ms / TIMER_FRAME) + _:((ms % TIMER_FRAME) > 0)); | |
109 | // o tanto de transparência que será subtraída por cada processamento | |
110 | // no fim, deve ser checado a quantidade de transarência que a textdraw possui | |
111 | // a transparência que será subtraída até o final é dividida pela quantidade de frames que serão rodados | |
112 | gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] = (alpha) / gPlayerFadeInfo[playerid][fadeTotalFrames]; | |
113 | ||
114 | if(gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] <= 0) { | |
115 | gPlayerFadeInfo[playerid][fadeTransparencyPerFrame] = 10; | |
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 | CallLocalFunction("OnPlayerFadeIn", "i", playerid); | |
154 | } | |
155 | } | |
156 | case FADE_OUT: { | |
157 | gPlayerFadeInfo[playerid][fadeCurrentAlpha] -= gPlayerFadeInfo[playerid][fadeTransparencyPerFrame]; | |
158 | gPlayerFadeInfo[playerid][fadeCurrentAlpha] = CAP_MIN(gPlayerFadeInfo[playerid][fadeCurrentAlpha]); | |
159 | ||
160 | PlayerTextDrawBoxColor(playerid, gPlayerFadeInfo[playerid][fadeText], (gPlayerFadeInfo[playerid][fadeColor] << 8) | gPlayerFadeInfo[playerid][fadeCurrentAlpha]); | |
161 | PlayerTextDrawShow(playerid, gPlayerFadeInfo[playerid][fadeText]); | |
162 | ||
163 | if(gPlayerFadeInfo[playerid][fadeCurrentAlpha] == 0) { | |
164 | gPlayerFadeInfo[playerid][fadeType] = 0; | |
165 | KillTimer(gPlayerFadeInfo[playerid][fadeTimer]); | |
166 | gPlayerFadeInfo[playerid][fadeTimer] = 0; | |
167 | ||
168 | CallLocalFunction("OnPlayerFadeOut", "i", playerid); | |
169 | } | |
170 | } | |
171 | } | |
172 | return 1; | |
173 | } | |
174 | ||
175 | public OnPlayerConnect(playerid) { | |
176 | new tmp[E_PLAYER_FADE_INFO]; | |
177 | gPlayerFadeInfo[playerid] = tmp; | |
178 | ||
179 | new PlayerText:text = CreatePlayerTextDraw(playerid, -20.0, -20.0, "_"); | |
180 | gPlayerFadeInfo[playerid][fadeText] = text; | |
181 | // detalhes | |
182 | PlayerTextDrawUseBox(playerid, text, 1); | |
183 | PlayerTextDrawBoxColor(playerid, text, 0xFFFFFF00); | |
184 | PlayerTextDrawLetterSize(playerid, text, 680.0, 500.0); | |
185 | PlayerTextDrawTextSize(playerid, text, 680.0, 500.0); | |
186 | ||
187 | if (funcidx("Fader_OnPlayerConnect") != -1) | |
188 | { | |
189 | return CallLocalFunction("Fader_OnPlayerConnect", "i", playerid); | |
190 | } | |
191 | return 1; | |
192 | } | |
193 | ||
194 | public OnPlayerDisconnect(playerid,reason) { | |
195 | gPlayerFadeInfo[playerid][fadeTimer] = 0; | |
196 | ||
197 | if (funcidx("Fader_OnPlayerDisconnect") != -1) | |
198 | { | |
199 | - | #define OnPlayerConnect FD_OnPlayerConnect |
199 | + | return CallLocalFunction("Fader_OnPlayerDisconnect", "ii", playerid, reason); |
200 | - | forward FD_OnPlayerConnect(playerid); |
200 | + | } |
201 | return 1; | |
202 | } | |
203 | ||
204 | #if defined _ALS_OnPlayerConnect | |
205 | #undef OnPlayerConnect | |
206 | #else | |
207 | - | #define OnPlayerDisconnect FD_OnPlayerDisconnect |
207 | + | |
208 | - | forward FD_OnPlayerDisconnect(playerid,reason); |
208 | + | |
209 | #define OnPlayerConnect Fader_OnPlayerConnect | |
210 | forward Fader_OnPlayerConnect(playerid); | |
211 | ||
212 | #if defined _ALS_OnPlayerDisconnect | |
213 | #undef OnPlayerDisconnect | |
214 | #else | |
215 | #define _ALS_OnPlayerDisconnect | |
216 | #endif | |
217 | #define OnPlayerDisconnect Fader_OnPlayerDisconnect | |
218 | forward OnPlayerDisconnect(playerid, reason); |