View difference between Paste ID: McyB2PUj and CXef16am
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
}