-
Notifications
You must be signed in to change notification settings - Fork 118
/
Copy pathpause.inc
208 lines (169 loc) · 5.63 KB
/
pause.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#if defined pause_included
#endinput
#endif
#define pause_included
/**************************************
// pause.inc || v2.0 || Last Updated: 19 Sept, 2018 || By Gammix
***************************************
// List Of Functions
native IsPlayerPaused(playerid);
native GetPlayerPausedTime(playerid);
***************************************
// List Of Callbacks
forward OnPlayerPause(playerid);
OnPlayerResume(playerid, pausedtime);
**************************************/
enum E_PLAYER_PAUSED_DATA {
PLAYER_PAUSED_LAST_CLASSID,
PLAYER_PAUSED_LAST_UPDATE,
PLAYER_PAUSED_TIMER,
bool:PLAYER_PAUSED_VALID
}
static playerPauseData[MAX_PLAYERS][E_PLAYER_PAUSED_DATA];
#if defined OnPlayerPause
forward OnPlayerPause(playerid);
#endif
#if defined OnPlayerResume
forward OnPlayerResume(playerid, pausedtime);
#endif
public OnPlayerConnect(playerid) {
playerPauseData[playerid][PLAYER_PAUSED_LAST_CLASSID] = -1;
playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE] = -1;
playerPauseData[playerid][PLAYER_PAUSED_TIMER] = -1;
playerPauseData[playerid][PLAYER_PAUSED_VALID] = false;
#if defined Pause_OnPlayerConnect
return Pause_OnPlayerConnect(playerid);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerConnect
#undef OnPlayerConnect
#else
#define _ALS_OnPlayerConnect
#endif
#define OnPlayerConnect Pause_OnPlayerConnect
#if defined Pause_OnPlayerConnect
forward Pause_OnPlayerConnect(playerid);
#endif
public OnPlayerRequestClass(playerid, classid) {
if (playerPauseData[playerid][PLAYER_PAUSED_VALID] == true) {
if (playerPauseData[playerid][PLAYER_PAUSED_LAST_CLASSID] != classid) {
#if defined OnPlayerResume
OnPlayerResume(playerid, (gettime() - playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE]));
#endif
KillTimer(playerPauseData[playerid][PLAYER_PAUSED_TIMER]);
playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE] = gettime();
playerPauseData[playerid][PLAYER_PAUSED_TIMER] = -1;
playerPauseData[playerid][PLAYER_PAUSED_VALID] = false;
}
}
playerPauseData[playerid][PLAYER_PAUSED_LAST_CLASSID] = classid;
#if defined Pause_OnPlayerRequestClass
return Pause_OnPlayerRequestClass(playerid, classid);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerRequestClass
#undef OnPlayerRequestClass
#else
#define _ALS_OnPlayerRequestClass
#endif
#define OnPlayerRequestClass Pause_OnPlayerRequestClass
#if defined Pause_OnPlayerRequestClass
forward Pause_OnPlayerRequestClass(playerid, classid);
#endif
public OnPlayerRequestSpawn(playerid) {
if (playerPauseData[playerid][PLAYER_PAUSED_VALID] == true) {
#if defined OnPlayerResume
OnPlayerResume(playerid, (gettime() - playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE]));
#endif
playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE] = gettime();
playerPauseData[playerid][PLAYER_PAUSED_TIMER] = -1;
playerPauseData[playerid][PLAYER_PAUSED_VALID] = false;
}
#if defined Pause_OnPlayerRequestSpawn
return Pause_OnPlayerRequestSpawn(playerid);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerRequestSpawn
#undef OnPlayerRequestSpawn
#else
#define _ALS_OnPlayerRequestSpawn
#endif
#define OnPlayerRequestSpawn Pause_OnPlayerRequestSpawn
#if defined Pause_OnPlayerRequestSpawn
forward Pause_OnPlayerRequestSpawn(playerid);
#endif
public OnPlayerSpawn(playerid) {
if (playerPauseData[playerid][PLAYER_PAUSED_TIMER] == -1) {
playerPauseData[playerid][PLAYER_PAUSED_TIMER] = SetTimerEx("__OnPlayerPauseCheck", 1000, true, "i", playerid);
}
#if defined Pause_OnPlayerSpawn
return Pause_OnPlayerSpawn(playerid);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerSpawn
#undef OnPlayerSpawn
#else
#define _ALS_OnPlayerSpawn
#endif
#define OnPlayerSpawn Pause_OnPlayerSpawn
#if defined Pause_OnPlayerSpawn
forward Pause_OnPlayerSpawn(playerid);
#endif
public OnPlayerUpdate(playerid) {
if (playerPauseData[playerid][PLAYER_PAUSED_VALID] == true) { // player finally updated after being paused
#if defined OnPlayerResume
OnPlayerResume(playerid, (gettime() - playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE]));
#endif
playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE] = gettime();
playerPauseData[playerid][PLAYER_PAUSED_TIMER] = SetTimerEx("__OnPlayerPauseCheck", 1000, true, "i", playerid);
playerPauseData[playerid][PLAYER_PAUSED_VALID] = false;
}
playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE] = gettime();
#if defined Pause_OnPlayerUpdate
return Pause_OnPlayerUpdate(playerid);
#else
return 1;
#endif
}
#if defined _ALS_OnPlayerUpdate
#undef OnPlayerUpdate
#else
#define _ALS_OnPlayerUpdate
#endif
#define OnPlayerUpdate Pause_OnPlayerUpdate
#if defined Pause_OnPlayerUpdate
forward Pause_OnPlayerUpdate(playerid);
#endif
forward __OnPlayerPauseCheck(playerid);
public __OnPlayerPauseCheck(playerid) {
new time = gettime();
if ((time - playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE]) >= 5) { // if player hasn't updated in 5 seconds
KillTimer(playerPauseData[playerid][PLAYER_PAUSED_TIMER]);
playerPauseData[playerid][PLAYER_PAUSED_TIMER] = -1;
playerPauseData[playerid][PLAYER_PAUSED_VALID] = true;
#if defined OnPlayerPause
OnPlayerPause(playerid);
#endif
}
return 1;
}
stock IsPlayerPaused(playerid) {
if (playerid < 0 || playerid >= MAX_PLAYERS)
return 0;
return playerPauseData[playerid][PLAYER_PAUSED_VALID];
}
stock GetPlayerPausedTime(playerid) {
if (playerid < 0 || playerid >= MAX_PLAYERS)
return 0;
if (playerPauseData[playerid][PLAYER_PAUSED_VALID] == false)
return 0;
return (gettime() - playerPauseData[playerid][PLAYER_PAUSED_LAST_UPDATE]);
}