SHOW:
|
|
- or go back to the newest paste.
1 | //------------------------------------------------------------// | |
2 | // DERBY DE DEMOLICIÓN | |
3 | // 01/05/2024 4:00 PM Venezuela | |
4 | // Versión: 1.0 (Beta) | |
5 | // Realizada por Romer para la comunidad Adobe Roleplay | |
6 | // Todos los Derechos reservados. | |
7 | //------------------------------------------------------------// | |
8 | #include <a_samp.inc> | |
9 | #include <streamer.inc> | |
10 | #include <zcmd.inc> | |
11 | #include <foreach.inc> | |
12 | ||
13 | //==== Configuración ============ | |
14 | #define SHOOTER_WORLD (399) // World Minijuego | |
15 | #define SHOOTER_TIME (110000) // Tiempo en Milisegundos | |
16 | #define DEFAULT_SHOOTER_TIME (115) // Tiempo en segundos | |
17 | ||
18 | #define COLOR_WHITE 0xFFFFFFFF | |
19 | #define COLOR_WHITEP 0xFFE4C4FF | |
20 | #define COLOR_RED 0xFF0000FF | |
21 | #define COLOR_YELLOW 0xFFFF00FF | |
22 | #define RED_E "{FF0000}" | |
23 | #define WHITE_E "{FFFFFF}" | |
24 | #define SHOOTER "{FFFFFF}[{00FF5D}DERBY{FFFFFF}]{FFFFFF}" | |
25 | #define function%0(%1) forward %0(%1); public %0(%1) | |
26 | new shstr[200]; | |
27 | new SHOOTER_Players, // Contador de Jugadores | |
28 | SHOOTER_Count, // Cuenta Regresiva para empezar | |
29 | SHOOTER_Timer, // Timer | |
30 | SHOOTER_Started, | |
31 | SHTimer, | |
32 | bool:InShooter[MAX_PLAYERS], // Se inicia o no se inicia | |
33 | SHOOTER_Active; // Minijuego activo o inactivo | |
34 | ||
35 | new tShootertime = -1, | |
36 | ShooterGameTime = DEFAULT_SHOOTER_TIME; | |
37 | ||
38 | new Float:POS[3]; | |
39 | new Text:SHTD; | |
40 | new SpawnVehicle[MAX_PLAYERS]; | |
41 | ||
42 | new Float:RandomSpawnMap[][4] = //Coordenadas Randoms en LS | |
43 | { | |
44 | {2052.3774,-2601.4272,13.5469,88.407}, | |
45 | {1722.2308,-2633.4995,13.5469,358.4798}, | |
46 | {1459.9255,-2452.4858,13.5547,264.1655}, | |
47 | {2006.3190,-2424.8120,13.5469,112.197}, | |
48 | {1913.9677,-2537.0171,13.5469,88.3839} | |
49 | }; | |
50 | ||
51 | enum ShooterEnum | |
52 | { | |
53 | S_ROCKET_OBJECT, | |
54 | S_ROCKET_TIMER, | |
55 | } | |
56 | new Shooter[MAX_PLAYERS][ShooterEnum]; | |
57 | ||
58 | ||
59 | //============ Configuración=============== | |
60 | ||
61 | ||
62 | public OnFilterScriptInit() | |
63 | { | |
64 | print("\n--------------------------------------"); | |
65 | print(" Derby de demolición iniciado"); | |
66 | print("--------------------------------------\n"); | |
67 | for(new i = 0, j = GetPlayerPoolSize()+1; i < j; i++) if(IsPlayerConnected(i)) | |
68 | { | |
69 | CallLocalFunction("OnPlayerConnect", "i", i); | |
70 | } | |
71 | ||
72 | ShooterGameTime = DEFAULT_SHOOTER_TIME; | |
73 | SHTimer = SetTimer("OnTimeUpdate", 1000, true); | |
74 | SHOOTER_Players = 0; | |
75 | tShootertime = -1; | |
76 | ||
77 | return 1; | |
78 | } | |
79 | ||
80 | public OnFilterScriptExit() | |
81 | { | |
82 | for(new i = 0, j = GetPlayerPoolSize()+1; i < j; i++) if(IsPlayerConnected(i)) | |
83 | { | |
84 | CallLocalFunction("OnPlayerDisconnect", "id", i, 3); | |
85 | } | |
86 | KillTimer(SHTimer); | |
87 | return 1; | |
88 | } | |
89 | public OnPlayerSpawn(playerid) | |
90 | { | |
91 | ||
92 | return 0; | |
93 | } | |
94 | forward OnTimeUpdate(); | |
95 | public OnTimeUpdate() | |
96 | { | |
97 | if(SHOOTER_Active == 1) | |
98 | { | |
99 | ShooterGameTime--; | |
100 | format(shstr, sizeof(shstr), "~w~Tiempo Restante: ~r~~h~%s", GameTimeConvert(ShooterGameTime)); | |
101 | TextDrawSetString(SHTD, shstr); | |
102 | } | |
103 | else | |
104 | { | |
105 | TextDrawSetString(SHTD, "~w~Tiempo Restante: ~r~~h~-:-"); | |
106 | } | |
107 | return 1; | |
108 | } | |
109 | GameTimeConvert(seconds) | |
110 | { | |
111 | new etmp[16]; | |
112 | new minutes = floatround(seconds / 60); | |
113 | seconds -= minutes * 60; | |
114 | format(etmp, sizeof(etmp), "%i:%02i", minutes, seconds); | |
115 | return etmp; | |
116 | } | |
117 | public OnPlayerConnect(playerid) | |
118 | { | |
119 | InShooter[playerid] = false; | |
120 | SHTD = TextDrawCreate(480.400024, 342.320007, "Tiempo Restante: EN ESPERA"); | |
121 | TextDrawLetterSize(SHTD,0.235999, 1.398399); | |
122 | TextDrawAlignment(SHTD, 1); | |
123 | TextDrawColor(SHTD, -1); | |
124 | TextDrawSetShadow(SHTD, 0); | |
125 | TextDrawSetOutline(SHTD, 1); | |
126 | TextDrawBackgroundColor(SHTD, 255); | |
127 | TextDrawFont(SHTD, 1); | |
128 | TextDrawSetProportional(SHTD, 1); | |
129 | return 1; | |
130 | } | |
131 | ||
132 | public OnPlayerDisconnect(playerid, reason) | |
133 | { | |
134 | if(InShooter[playerid] == true) | |
135 | { | |
136 | RemoveFromSHOOTER(playerid); | |
137 | } | |
138 | return 1; | |
139 | } | |
140 | ||
141 | public OnPlayerDeath(playerid, killerid, reason) | |
142 | { | |
143 | ||
144 | if(InShooter[playerid] == true) | |
145 | { | |
146 | RemoveFromSHOOTER(playerid); | |
147 | } | |
148 | return 1; | |
149 | } | |
150 | CMD:salirderby(playerid) | |
151 | { | |
152 | if(InShooter[playerid] == true) // Derby | |
153 | { | |
154 | SetPlayerPos(playerid, 1555.400390, -1675.611694, 16.195312, 0.0, 0, 0, true); | |
155 | SetPlayerVirtualWorld(playerid, 0); | |
156 | SendClientMessage(playerid, COLOR_WHITEP, ""SHOOTER" Has abandonado el derby."); | |
157 | RemoveFromSHOOTER(playerid); | |
158 | } | |
159 | else SendClientMessage(playerid, COLOR_WHITEP, ""RED_E" No puedes usar este comando ahora mismo."); | |
160 | return 1; | |
161 | } | |
162 | CMD:derby(playerid) | |
163 | { | |
164 | if(SHOOTER_Players >= 20) return SendClientMessage(playerid, COLOR_WHITE, ""RED_E"Disculpe, el derby alcanzó el máximo de jugadores"); | |
165 | if(InShooter[playerid] == true) return SendClientMessage(playerid, COLOR_WHITE, ""RED_E"Ya estás en este minijuego, escribe /salirderby para salir de este minijuego"); | |
166 | if(SHOOTER_Active == 1) return SendClientMessage(playerid, COLOR_WHITE, ""RED_E"El Derby ya ha comenzado!"); | |
167 | ||
168 | if(IsPlayerInAnyVehicle(playerid)) | |
169 | { | |
170 | RemovePlayerFromVehicle(playerid); | |
171 | } | |
172 | if(SHOOTER_Started == 0) | |
173 | { | |
174 | SHOOTER_StartGame(); | |
175 | SHOOTER_Started = 1; | |
176 | } | |
177 | InShooter[playerid] = true; | |
178 | new PlayerName[24]; | |
179 | GetPlayerName(playerid, PlayerName, sizeof(PlayerName)); | |
180 | format(shstr, sizeof(shstr),""SHOOTER" %s se ha unido al derby de demolición[/derby]", PlayerName); | |
181 | SendClientMessage(playerid, COLOR_WHITE, shstr); | |
182 | SHOOTER_Players++; | |
183 | SHOOTER_SetPlayer(playerid); | |
184 | return 1; | |
185 | } | |
186 | SHOOTER_SetPlayer(playerid) | |
187 | { | |
188 | if(IsPlayerInAnyVehicle(playerid)) RemovePlayerFromVehicle(playerid); | |
189 | TextDrawShowForPlayer(playerid, SHTD); | |
190 | ResetPlayerWeapons(playerid); | |
191 | SetPlayerHealth(playerid, 100); | |
192 | TogglePlayerControllable(playerid, false); | |
193 | new vd; | |
194 | switch(random(3)) | |
195 | { | |
196 | case 0: vd = 504; | |
197 | case 1: vd = 494; | |
198 | case 2: vd = 528; | |
199 | } | |
200 | new rand = random(sizeof(RandomSpawnMap)); | |
201 | SpawnVehicle[playerid] = CreateVehicle(vd , RandomSpawnMap[rand][0], RandomSpawnMap[rand][1], RandomSpawnMap[rand][2], RandomSpawnMap[rand][3], random(255),random(255),(60 * 60)); | |
202 | SetPlayerPos(playerid, RandomSpawnMap[rand][0], RandomSpawnMap[rand][1],RandomSpawnMap[rand][2]+1.5); | |
203 | SetPlayerFacingAngle(playerid, RandomSpawnMap[rand][3]+3); | |
204 | SetVehicleVirtualWorld(SpawnVehicle[playerid], SHOOTER_WORLD); | |
205 | SetPlayerVirtualWorld(playerid, SHOOTER_WORLD); | |
206 | PutPlayerInVehicle(playerid, SpawnVehicle[playerid], 0); | |
207 | SetCameraBehindPlayer(playerid); | |
208 | } | |
209 | ||
210 | SHOOTER_StartGame() | |
211 | { | |
212 | SHOOTER_Count = 20; | |
213 | SHOOTER_Timer = SetTimer("SHOOTERCountDown", 1000, true); | |
214 | ||
215 | SendClientMessageToAll(COLOR_RED, ""SHOOTER" Derby de demolición iniciado, escribe /derby para participar!"); | |
216 | return 1; | |
217 | } | |
218 | ||
219 | function SHOOTERCountDown() | |
220 | { | |
221 | new strk[100]; | |
222 | SHOOTER_Count--; | |
223 | if(SHOOTER_Count == 0) | |
224 | { | |
225 | format(strk, sizeof(strk), "~r~~h~Derby Iniciado~w~!!"); | |
226 | } | |
227 | else | |
228 | { | |
229 | switch(SHOOTER_Count) | |
230 | { | |
231 | case 25, 15, 5: | |
232 | { | |
233 | format(shstr, sizeof(shstr), ""SHOOTER" El derby de demolición iniciará en %d segundos, escribe /derby para participar", SHOOTER_Count); | |
234 | SendClientMessageToAll(0xFFFFFFFF, shstr); | |
235 | } | |
236 | } | |
237 | } | |
238 | ||
239 | foreach(Player, ii) | |
240 | { | |
241 | if(InShooter[ii] == true) | |
242 | { | |
243 | GameTextForPlayer(ii, strk, 2000, 3); | |
244 | } | |
245 | } | |
246 | if(SHOOTER_Count <= 0) | |
247 | { | |
248 | KillTimer(SHOOTER_Timer); | |
249 | format(shstr, sizeof(shstr), ""SHOOTER" El derby de demolición ha comenzado. buena suerte!"); | |
250 | SendClientMessageToAll(0xFFFFFFFF, shstr); | |
251 | foreach(Player, ii) | |
252 | { | |
253 | if(InShooter[ii] == true) | |
254 | { | |
255 | SetCameraBehindPlayer(ii); | |
256 | PlayerPlaySound(ii, 3200, 0, 0, 0); | |
257 | TogglePlayerControllable(ii, true); | |
258 | ExecSHOOTERTimer(); | |
259 | } | |
260 | } | |
261 | if(SHOOTER_Players <= 1) | |
262 | { | |
263 | SHOOTER_Cancel(); | |
264 | SendClientMessageToAll(COLOR_YELLOW, ""SHOOTER" El derby ha terminado por no haber los jugadores suficientes!(Minimo 2 jugadores)"); | |
265 | foreach(Player, ii) | |
266 | { | |
267 | if(InShooter[ii] == true) | |
268 | { | |
269 | InShooter[ii] = false; | |
270 | RemoveFromSHOOTER(ii); | |
271 | } | |
272 | } | |
273 | } | |
274 | else SHOOTER_Active = 1; | |
275 | } | |
276 | return 1; | |
277 | } | |
278 | function ExecSHOOTERTimer() | |
279 | { | |
280 | KillTimer(tShootertime); | |
281 | tShootertime = SetTimer("EndSHOOTER", SHOOTER_TIME, false); | |
282 | return 1; | |
283 | } | |
284 | function EndSHOOTER() | |
285 | { | |
286 | foreach(Player, ii) | |
287 | { | |
288 | if(InShooter[ii] == true && SHOOTER_Active ==1) | |
289 | { | |
290 | InShooter[ii] = false; | |
291 | SetPlayerVirtualWorld(ii, 0); | |
292 | format(shstr, sizeof(shstr), ""SHOOTER" El derby ha acabado. Tiempo terminado."); | |
293 | SendClientMessageToAll(COLOR_WHITEP, shstr); | |
294 | SpawnPlayer(ii); | |
295 | SHOOTER_Cancel(); | |
296 | TextDrawHideForPlayer(ii, SHTD); | |
297 | if(SpawnVehicle[ii] != -1) | |
298 | { | |
299 | DestroyVehicle(SpawnVehicle[ii]); | |
300 | SpawnVehicle[ii] = -1; | |
301 | } | |
302 | } | |
303 | } | |
304 | return 1; | |
305 | } | |
306 | ||
307 | RemoveFromSHOOTER(playerid) | |
308 | { | |
309 | InShooter[playerid] = false; | |
310 | SetPlayerVirtualWorld(playerid, 0); | |
311 | SetPlayerPos(playerid, 1098.2443,1610.6401,12.5469); | |
312 | SpawnPlayer(playerid); | |
313 | ResetPlayerWeapons(playerid); | |
314 | TextDrawHideForPlayer(playerid, SHTD); | |
315 | if(SpawnVehicle[playerid] != -1) | |
316 | { | |
317 | DestroyVehicle(SpawnVehicle[playerid]); | |
318 | SpawnVehicle[playerid] = -1; | |
319 | } | |
320 | if(SHOOTER_Active == 1) | |
321 | { | |
322 | SHOOTER_Players--; | |
323 | ||
324 | if(SHOOTER_Players == 1 || SHOOTER_Players <= 0) | |
325 | { | |
326 | CheckShooter(); | |
327 | } | |
328 | } | |
329 | return 1; | |
330 | } | |
331 | function CheckShooter() | |
332 | { | |
333 | if(SHOOTER_Players == 1) | |
334 | { | |
335 | foreach(Player, ii) | |
336 | { | |
337 | if(InShooter[ii] == true) | |
338 | { | |
339 | new PlayerName[24]; | |
340 | GetPlayerName(ii, PlayerName, sizeof(PlayerName)); | |
341 | format(shstr,sizeof(shstr),""SHOOTER" %s(%i) ganó el derby de demolición!{E8D04C} Premio: $12,000", PlayerName ,ii); | |
342 | SendClientMessageToAll(COLOR_WHITEP, shstr); | |
343 | GameTextForPlayer(ii, "~g~~h~~h~Felicidades!", 3000, 3); | |
344 | SendClientMessage(ii, COLOR_WHITEP, ""SHOOTER" Acabas de ganar el derby!"); | |
345 | GivePlayerMoney(ii, 12000); | |
346 | } | |
347 | if(SpawnVehicle[ii] != -1) | |
348 | { | |
349 | DestroyVehicle(SpawnVehicle[ii]); | |
350 | SpawnVehicle[ii] = -1; | |
351 | } | |
352 | SHOOTER_Cancel(); | |
353 | } | |
354 | } | |
355 | return 1; | |
356 | } | |
357 | ||
358 | SHOOTER_Cancel() | |
359 | { | |
360 | SHOOTER_Players = 0; | |
361 | SHOOTER_Active = 0; | |
362 | SHOOTER_Count = 0; | |
363 | SHOOTER_Started = 0; | |
364 | KillTimer(tShootertime); | |
365 | ShooterGameTime = DEFAULT_SHOOTER_TIME; | |
366 | return 1; | |
367 | } | |
368 | ||
369 | ||
370 | ||
371 | ||
372 | public OnObjectMoved(objectid) | |
373 | { | |
374 | foreach(new i : Player) | |
375 | { | |
376 | if(objectid == Shooter[i][S_ROCKET_OBJECT]) | |
377 | { | |
378 | new Float:pos[3]; | |
379 | ||
380 | GetObjectPos(objectid, pos[0], pos[1], pos[2]); | |
381 | CreateExplosion(pos[0], pos[1], pos[2], 11, 3.0); | |
382 | DestroyObject(objectid); | |
383 | ||
384 | KillTimer(Shooter[i][S_ROCKET_TIMER]); | |
385 | Shooter[i][S_ROCKET_TIMER] = -1; | |
386 | } | |
387 | } | |
388 | return 1; | |
389 | } | |
390 | ||
391 | ||
392 | public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) | |
393 | { | |
394 | if(newkeys & KEY_FIRE && GetPlayerState(playerid) == PLAYER_STATE_DRIVER && InShooter[playerid] == true) | |
395 | { | |
396 | if(InShooter[playerid] == true && SHOOTER_Active == 1) | |
397 | { | |
398 | new vehicleid = GetPlayerVehicleID(playerid); | |
399 | if(IsValidObject(Shooter[playerid][S_ROCKET_OBJECT])) return GameTextForPlayer(playerid, "~y~Recargando Cohetes...", 2000, 3); | |
400 | ||
401 | if(Shooter[playerid][S_ROCKET_TIMER] != -1) KillTimer(Shooter[playerid][S_ROCKET_TIMER]); | |
402 | Shooter[playerid][S_ROCKET_TIMER] = SetTimerEx("OnPlayerShootRocket", 250, true, "i", playerid); | |
403 | ||
404 | new Float:pos[4]; | |
405 | GetVehiclePos(vehicleid, pos[0], pos[1], pos[2]); | |
406 | GetVehicleZAngle(vehicleid, pos[3]); | |
407 | ||
408 | Shooter[playerid][S_ROCKET_OBJECT] = CreateObject(345, pos[0], pos[1], pos[2], 0.0, 0.0, pos[3]); | |
409 | ||
410 | new Float:distance = 50.0; | |
411 | MoveObject(Shooter[playerid][S_ROCKET_OBJECT], pos[0] + (distance * floatsin(-pos[3], degrees)), pos[1] + (distance * floatcos(-pos[3], degrees)), pos[2], 50.0); | |
412 | return 1; | |
413 | } | |
414 | } | |
415 | if(newkeys & KEY_CROUCH && GetPlayerState(playerid) == PLAYER_STATE_DRIVER) // Jump | |
416 | { | |
417 | if(InShooter[playerid] == true) | |
418 | { | |
419 | if(GetPVarInt(playerid, "UsedJump") ==1) | |
420 | { | |
421 | GameTextForPlayer(playerid, "~y~Super Salto Cooldown", 3000, 3); | |
422 | return true; | |
423 | } | |
424 | SetPVarInt(playerid, "UsedJump", 1); | |
425 | SetTimerEx("ResetJump", 8000, false, "i", playerid); | |
426 | new vID = GetPlayerVehicleID(playerid); | |
427 | GetVehicleVelocity(vID, POS[0], POS[1], POS[2]); | |
428 | SetVehicleVelocity(vID, POS[0], POS[1], POS[2] + 0.3); | |
429 | } | |
430 | } | |
431 | return 1; | |
432 | } | |
433 | function ResetJump(playerid) | |
434 | { | |
435 | if(IsPlayerConnected(playerid)) DeletePVar(playerid, "UsedJump"); | |
436 | } | |
437 | forward OnPlayerShootRocket(playerid); | |
438 | public OnPlayerShootRocket(playerid) | |
439 | { | |
440 | new Float:pos[3]; | |
441 | GetObjectPos(Shooter[playerid][S_ROCKET_OBJECT], pos[0], pos[1], pos[2]); | |
442 | foreach(new i : Player) | |
443 | { | |
444 | if(i != playerid) | |
445 | { | |
446 | if(IsPlayerInRangeOfPoint(i, 5.0, pos[0], pos[1], pos[2])) | |
447 | { | |
448 | CreateExplosion(pos[0], pos[1], pos[2], 11, 3.0); | |
449 | DestroyObject(Shooter[playerid][S_ROCKET_OBJECT]); | |
450 | ||
451 | KillTimer(Shooter[playerid][S_ROCKET_TIMER]); | |
452 | Shooter[playerid][S_ROCKET_TIMER] = -1; | |
453 | break; | |
454 | } | |
455 | } | |
456 | } | |
457 | return 1; | |
458 | } |