View difference between Paste ID: muErDtyu and ZznB7ZgT
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);