modulised paintball and adding headshot mode

This commit is contained in:
Stev 2018-09-10 00:37:47 +01:00
parent 3d9eb93cef
commit e597f9559a

View File

@ -0,0 +1,607 @@
/*
* Irresistible Gaming (c) 2018
* Developed by Steven Howard
* Module: paintball.pwn
* Purpose: paintball related features
*/
/* ** Includes ** */
#include < YSI\y_hooks >
/* ** Definitions ** */
#define MAX_PAINTBALL_ARENAS ( 6 )
/* Beast Functions */
#define SendClientMessageToPaintball(%0,%1,%2,%3) \
do{foreach(new fI : Player){if (p_inPaintBall{fI}&&p_PaintBallArena{fI}==(%0))format(szNormalString,sizeof(szNormalString),(%2),%3),SendClientMessage(fI,(%1),szNormalString);}}while(False)
/* ** Variables ** */
enum E_PAINTBALL_DATA
{
E_NAME[ 16 ], E_HOST, E_PASSWORD[ 5 ],
E_LIMIT, E_WEAPONS[ 3 ], E_PLAYERS,
E_ARENA, Float: E_ARMOUR, Float: E_HEALTH,
bool: E_ACTIVE, bool: E_PASSWORDED, bool: E_REFILLER,
E_CD_TIMER
};
enum E_PAINTBALL_ARENAS
{
Float: E_X, Float: E_Y, Float: E_Z,
E_INTERIOR, E_NAME[ 16 ]
};
new
g_paintballArenaData [ ] [ E_PAINTBALL_ARENAS ] =
{
{ 1412.639892, -1.787510, 1000.924377, 1 , "Warehouse 1" },
{ 1302.519897, -1.787510, 1001.028259, 18, "Warehouse 2" },
{ 1063.650400, 2134.9487, 10.82030000, 0 , "Warehouse 3" },
{ -2659.28170, 1410.3884, 910.1703000, 3 , "Jizzy's" },
{ 296.8772000, 174.79120, 1007.171900, 3 , "LV-PD" },
//{ 1265.012900, -775.0262, 1091.906300, 5 , "Mad Doggs" },
{ -1401.68950, 107.43800, 1032.273400, 1 , "Stadium 1" },
{ 2193.399700, -1142.272, 1029.796900, 15, "Jefferson Motel" },
{ -949.294600, 1887.0156, 5.000000000, 17, "Sherman Dam" },
{ 1721.863800, -1655.338, 20.96800000, 18, "Atrium" }
},
g_paintballData [ MAX_PAINTBALL_ARENAS ] [ E_PAINTBALL_DATA ],
bool: p_LeftPaintball [ MAX_PLAYERS char ],
p_PaintBallArena [ MAX_PLAYERS char ],
// Iterator
Iterator:paintball<MAX_PAINTBALL_ARENAS>
;
/* ** Hooks ** */
#if defined AC_INCLUDED
hook OnPlayerDeathEx(playerid, killerid, reason, Float: damage, bodypart)
#else
hook OnPlayerDeath(playerid, killerid, reason)
#endif
{
if ( p_inPaintBall{ killerid } == true )
{
new
a = p_PaintBallArena{ killerid };
if ( g_paintballData[ a ] [ E_REFILLER ] )
{
SetPlayerHealth( killerid, g_paintballData[ a ] [ E_HEALTH ] );
SetPlayerArmour( killerid, g_paintballData[ a ] [ E_ARMOUR ] );
}
return 1;
}
return 1;
}
hook OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
if ( ( dialogid == DIALOG_PAINTBALL ) && response )
{
for( new id, x = 0; id < MAX_PAINTBALL_ARENAS; id ++ )
{
if ( x == listitem )
{
if ( Iter_Contains(paintball, id) )
{
if ( !g_paintballData[ id ] [ E_ACTIVE ] )
{
SendError( playerid, "This paintball lobby is currently not active and being edited." );
listPaintBallLobbies( playerid );
return 1;
}
if ( g_paintballData[ id ] [ E_PASSWORDED ] && !isnull( g_paintballData[ id ] [ E_PASSWORD ] ) && !strmatch( g_paintballData[ id ] [ E_PASSWORD ], "NULL" ) )
{
if ( g_Debugging ) {
SendClientMessageToRCON( COLOR_YELLOW, "PAINTBALL: host %s, passworded %d, password %s", ReturnPlayerName( g_paintballData[ id ] [ E_HOST ] ), g_paintballData[ id ] [ E_PASSWORDED ], g_paintballData[ id ] [ E_PASSWORD ] );
}
p_PaintBallArena{ playerid } = id;
SendServerMessage( playerid, "You are trying to join the paintball lobby: "COL_GREY"%s", g_paintballData[ id ] [ E_NAME ] );
ShowPlayerDialog( playerid, DIALOG_PAINTBALL_PW, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Join", "{FFFFFF}This lobby requires a password.", "Join", "Back" );
return 1;
}
JoinPlayerPaintball( playerid, id );
}
else
{
if ( hasPaintBallArena( playerid ) )
return SendError( playerid, "You already have an paintball arena set. You've been spawned." ), SpawnPlayer( playerid );
if ( GetPlayerCash( playerid ) < 5000 )
return listPaintBallLobbies( playerid ), SendError( playerid, "You're insufficient of funds. ($5,000)" ), 1;
if ( !CreatePaintballLobby( id, playerid, "Paintball", 8, 0 ) )
return SendError( playerid, "Unable to create lobby due to an error. Maybe someone's occupied the slot?" );
GivePlayerCash( playerid, -5000 );
showPaintBallLobbyData( playerid, id );
p_PaintBallArena{ playerid } = id;
}
break;
}
x ++;
}
}
if ( dialogid == DIALOG_PAINTBALL_PW )
{
if ( response )
{
new
szPassword[ 5 ];
strreplacechar( inputtext, '\\', '/' );
if ( IsPlayerJailed( playerid ) ) return SendError( playerid, "This is no longer available as you're in jail." );
if ( !Iter_Contains( paintball, p_PaintBallArena{ playerid } ) ) return SendError( playerid, "This lobby no longer exists." );
if ( sscanf( inputtext, "s[5]", szPassword ) ) return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_PW, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Join", "{FFFFFF}This lobby requires a password.\n\n"COL_RED"Incorrect password, please try again.", "Join", "Back" );
if ( g_paintballData[ p_PaintBallArena{ playerid } ] [ E_PASSWORDED ] ) {
if ( !strmatch( szPassword, g_paintballData[ p_PaintBallArena{ playerid } ] [ E_PASSWORD ] ) ) return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_PW, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Join", "{FFFFFF}This lobby requires a password.\n\n"COL_RED"Incorrect password, please try again.", "Join", "Back" );
}
else SendServerMessage( playerid, "Seems like the lobby you were trying to join is not passworded anymore." );
JoinPlayerPaintball( playerid, p_PaintBallArena{ playerid } );
}
else listPaintBallLobbies( playerid );
}
if ( dialogid == DIALOG_PAINTBALL_EDIT )
{
if ( response )
{
SetPVarInt( playerid, "paintball_edititem", listitem );
switch( listitem )
{
case 0 .. 4: ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?", "Commit", "Back" );
case 5:
{
new iLobby = p_PaintBallArena{ playerid };
g_paintballData[ iLobby ] [ E_REFILLER ] = !g_paintballData[ iLobby ] [ E_REFILLER ];
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" Upon death, armour and/or health will%s be restored.", g_paintballData[ iLobby ] [ E_REFILLER ] == false ? ( " not" ) : ( "" ) );
showPaintBallLobbyData( playerid, iLobby );
}
case 6: ShowPlayerPaintballArenas( playerid );
case 7 .. 9: ShowPlayerDialog( playerid, DIALOG_PAINTBALL_WEP, DIALOG_STYLE_LIST, "{FFFFFF}Paintball - Edit", ""COL_RED"Remove Weapon On This Slot\n9mm Pistol\nSilenced Pistol\nDesert Eagle\nShotgun\nSawn-off Shotgun\nSpas 12\nMac 10\nMP5\nAK-47\nM4\nTec 9\nRifle\nSniper", "Select", "Cancel");
}
}
else
{
new
i = p_PaintBallArena{ playerid };
if ( !g_paintballData[ i ] [ E_ACTIVE ] )
{
g_paintballData[ i ] [ E_ACTIVE ] = true;
JoinPlayerPaintball( playerid, i );
SendServerMessage( playerid, "You can edit your lobby with "COL_GREY"/paintball edit"COL_WHITE"." );
}
}
}
if ( dialogid == DIALOG_PAINTBALL_EDIT_VAL )
{
new
iLobby = p_PaintBallArena{ playerid };
if ( response )
{
switch( GetPVarInt( playerid, "paintball_edititem" ) )
{
case 0: // name
{
new
szName[ 16 ];
if ( sscanf( inputtext, "s[16]", szName ) )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Invalid Lobby Name.", "Commit", "Back" );
if ( strlen( inputtext ) < 3 || strlen( inputtext ) >= 16 )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"The lobby name must be ranged between 3 and 16 characters.", "Commit", "Back" );
format( g_paintballData[ iLobby ] [ E_NAME ], 16, "%s", szName );
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby name has been updated by %s(%d)", ReturnPlayerName( playerid ), playerid );
}
case 1: // pw
{
new
szPassword[ 5 ];
if ( sscanf( inputtext, "s[5]", szPassword ) ) return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"The password can only be a maximum of 4 characters. Set to NULL to disable.", "Commit", "Back" );
if ( !strlen( szPassword ) || strlen( szPassword ) >= 5 ) return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"The password can only be a maximum of 4 characters. Set to NULL to disable.", "Commit", "Back" );
if ( strmatch( szPassword, "NULL" ) )
{
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby password has been%sdisabled.", " " );
g_paintballData[ iLobby ] [ E_PASSWORDED ] = false;
}
else
{
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby password has been changed to: "COL_GREY"%s"COL_WHITE".", szPassword );
g_paintballData[ iLobby ] [ E_PASSWORDED ] = true;
}
format( g_paintballData[ iLobby ] [ E_PASSWORD ], 5, "%s", szPassword );
}
case 2: // limit
{
new iLimit;
if ( sscanf( inputtext, "d", iLimit ) )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Ensure the player capacity is an integer.", "Commit", "Back" );
if ( iLimit < 2 || iLimit > 32 )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Please specify between 2 and 32 players.", "Commit", "Back" );
if ( iLimit < g_paintballData[ iLobby ] [ E_PLAYERS ] )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Your limit can not be less than the number of players joined already.", "Commit", "Back" );
g_paintballData[ iLobby ] [ E_LIMIT ] = iLimit;
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby player limit has been set to %d.", g_paintballData[ iLobby ] [ E_LIMIT ] );
}
case 3: // health
{
new Float: fHealth;
if ( sscanf( inputtext, "f", fHealth ) )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Ensure the player capacity is a numerical number.", "Commit", "Back" );
if ( fHealth < 1 || fHealth > 150 )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Please specify between 1 and 150 health.", "Commit", "Back" );
g_paintballData[ iLobby ] [ E_HEALTH ] = fHealth;
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby spawn health has been set to %0.2f.", g_paintballData[ iLobby ] [ E_HEALTH ] );
respawnAllInPaintballLobby( iLobby );
}
case 4: // armour
{
new Float: fArmour;
if ( sscanf( inputtext, "f", fArmour ) )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Ensure the player capacity is a numerical number.", "Commit", "Back" );
if ( fArmour < 0 || fArmour > 150 )
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT_VAL, DIALOG_STYLE_INPUT, "{FFFFFF}Paintball - Edit", "{FFFFFF}What would you like to set the value of this to?\n\n"COL_RED"Please specify between 0 and 150 armour.", "Commit", "Back" );
g_paintballData[ iLobby ] [ E_ARMOUR ] = fArmour;
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby spawn armour has been set to %0.2f.", g_paintballData[ iLobby ] [ E_ARMOUR ] );
respawnAllInPaintballLobby( iLobby );
}
}
showPaintBallLobbyData( playerid, iLobby );
}
else showPaintBallLobbyData( playerid, iLobby );
}
if ( dialogid == DIALOG_PAINTBALL_ARENAS )
{
new
iLobby = p_PaintBallArena{ playerid };
if ( response )
{
g_paintballData[ iLobby ] [ E_ARENA ] = listitem;
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby arena has been set to %s.", g_paintballArenaData[ listitem ] [ E_NAME ] );
respawnAllInPaintballLobby( iLobby );
showPaintBallLobbyData( playerid, iLobby );
}
else showPaintBallLobbyData( playerid, iLobby );
}
if ( dialogid == DIALOG_PAINTBALL_WEP )
{
new
iLobby = p_PaintBallArena{ playerid };
if ( response )
{
if ( !listitem )
g_paintballData[ iLobby ] [ E_WEAPONS ] [ GetPVarInt( playerid, "paintball_edititem" ) - 7 ] = 0;
else
g_paintballData[ iLobby ] [ E_WEAPONS ] [ GetPVarInt( playerid, "paintball_edititem" ) - 7 ] = 21 + listitem;
SendClientMessageToPaintball( iLobby, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" The lobby weapon set has been%supdated.", " " );
respawnAllInPaintballLobby( iLobby );
showPaintBallLobbyData( playerid, iLobby );
}
else showPaintBallLobbyData( playerid, iLobby );
}
return 1;
}
/* ** Functions ** */
function paintballCountDown( paintballid, time )
{
if ( paintballid == -1 )
return;
if ( !time )
{
foreach(new playerid : Player)
{
if ( IsPlayerInPaintBall( playerid ) && p_PaintBallArena{ playerid } == paintballid )
{
GameTextForPlayer( playerid, "~g~GO!", 2000, 3 );
PlayerPlaySound( playerid, 1057, 0.0, 0.0, 0.0 );
}
}
g_paintballData[ paintballid ] [ E_CD_TIMER ] = 0xFFFF;
}
else
{
foreach(new playerid : Player)
{
if ( IsPlayerInPaintBall( playerid ) && p_PaintBallArena{ playerid } == paintballid )
{
GameTextForPlayer( playerid, sprintf( "~y~%d", time ), 2000, 3 );
PlayerPlaySound( playerid, 1056, 0.0, 0.0, 0.0 );
}
}
g_paintballData[ paintballid ] [ E_CD_TIMER ] = SetTimerEx( "paintballCountDown", 960, false, "dd", paintballid, time - 1 );
}
}
stock CreatePaintballLobby( pid, playerid, const szLobbyName[ 16 ], iPlayerCap, iArena, Float: fHealth = 100.0, Float: fArmour = 100.0 )
{
if ( !Iter_Contains(paintball, pid) )
{
format( g_paintballData[ pid ] [ E_NAME ], 16, "%s", szLobbyName );
g_paintballData[ pid ] [ E_PASSWORD ] [ 0 ] = '\0';
g_paintballData[ pid ] [ E_PASSWORDED ] = false;
g_paintballData[ pid ] [ E_HOST ] = playerid;
g_paintballData[ pid ] [ E_PLAYERS ] = 0;
g_paintballData[ pid ] [ E_LIMIT ] = iPlayerCap;
g_paintballData[ pid ] [ E_WEAPONS ] [ 0 ] = 0;
g_paintballData[ pid ] [ E_WEAPONS ] [ 1 ] = 0;
g_paintballData[ pid ] [ E_WEAPONS ] [ 2 ] = 0;
g_paintballData[ pid ] [ E_ARMOUR ] = fHealth;
g_paintballData[ pid ] [ E_HEALTH ] = fArmour;
g_paintballData[ pid ] [ E_ARENA ] = iArena;
g_paintballData[ pid ] [ E_ACTIVE ] = false;
g_paintballData[ pid ] [ E_REFILLER ] = false;
g_paintballData[ pid ] [ E_CD_TIMER ] = 0xFFFF;
Iter_Add(paintball, pid);
return true;
}
return false;
}
stock DestroyPaintballArena( p )
{
if ( !Iter_Contains(paintball, p) )
return false;
Iter_Remove(paintball, p);
g_paintballData[ p ] [ E_HOST ] = INVALID_PLAYER_ID;
g_paintballData[ p ] [ E_PLAYERS ] = 0;
g_paintballData[ p ] [ E_ACTIVE ] = false;
g_paintballData[ p ] [ E_CD_TIMER ] = 0xFFFF;
return true;
}
stock listPaintBallLobbies( playerid )
{
if ( p_WantedLevel[ playerid ] ) return SendError( playerid, "You mustn't be wanted to join a paintball arena." );
if ( p_Class[ playerid ] != CLASS_CIVILIAN ) return SendError( playerid, "You must be a civilian to join a paintball arena." );
new
szLobbies[ 64 * MAX_PAINTBALL_ARENAS + 64 ];
for( new p = 0; p < MAX_PAINTBALL_ARENAS; p++ )
{
if ( !g_paintballData[ p ] [ E_ACTIVE ] && !Iter_Contains(paintball, p) ) {
format( szLobbies, sizeof( szLobbies ), "%s{334D5C}Vacant Paintball Slot ($5,000)\n", szLobbies );
}
else if ( Iter_Contains(paintball, p) ) {
format( szLobbies, sizeof( szLobbies ), "%s%s%s[%02d/%02d] %s hosted by %s\n",
szLobbies, g_paintballData[ p ] [ E_PASSWORDED ] ? ( "{DF4949}" ) : ( "{53B240}" ), g_paintballData[ p ] [ E_ACTIVE ] ? ( "" ) : ( "{EFC94C}" ), g_paintballData[ p ] [ E_PLAYERS ], g_paintballData[ p ] [ E_LIMIT ], g_paintballData[ p ] [ E_NAME ], ReturnPlayerName( g_paintballData[ p ] [ E_HOST ] )
);
}
}
return ShowPlayerDialog( playerid, DIALOG_PAINTBALL, DIALOG_STYLE_LIST, "{FFFFFF}Paintball - Selection", szLobbies, "Select", "Cancel" );
}
stock showPaintBallLobbyData( playerid, id, second_button[ ] = "Join Game" )
{
format( szLargeString, sizeof( szLargeString ), "Lobby Name\t\t"COL_GREY"%s"COL_WHITE"\nLobby Password\t%s"COL_WHITE"\nPlayer Capacity\t\t"COL_GREY"%d"COL_WHITE"\nHealth\t\t\t"COL_GREY"%0.2f%%"COL_WHITE"\nArmour\t\t\t"COL_GREY"%0.2f%%"COL_WHITE"\nRefill Health/Armour\t%s"COL_WHITE"\nArena\t\t\t"COL_GREY"%s"COL_WHITE"\nPrimary Weapon\t"COL_GREY"%s"COL_WHITE"\nSecondary Weapon\t"COL_GREY"%s"COL_WHITE"\nTertiary Weapon\t"COL_GREY"%s",
g_paintballData[ id ] [ E_NAME ], g_paintballData[ id ] [ E_PASSWORDED ] == true ? ( ""COL_GREEN"ENABLED" ) : ( ""COL_RED"DISABLED" ), g_paintballData[ id ] [ E_LIMIT ], g_paintballData[ id ] [ E_HEALTH ], g_paintballData[ id ] [ E_ARMOUR ], g_paintballData[ id ] [ E_REFILLER ] == true ? ( ""COL_GREEN"ENABLED" ) : ( ""COL_RED"DISABLED" ), g_paintballArenaData[ g_paintballData[ id ] [ E_ARENA ] ] [ E_NAME ],
ReturnWeaponName( g_paintballData[ id ] [ E_WEAPONS ] [ 0 ] ), ReturnWeaponName( g_paintballData[ id ] [ E_WEAPONS ] [ 1 ] ), ReturnWeaponName( g_paintballData[ id ] [ E_WEAPONS ] [ 2 ] )
);
ShowPlayerDialog( playerid, DIALOG_PAINTBALL_EDIT, DIALOG_STYLE_LIST, "{FFFFFF}Paintball - Lobby Settings", szLargeString, "Change", second_button );
}
stock ShowPlayerPaintballArenas( playerid )
{
static
szArenas[ 16 * sizeof( g_paintballArenaData ) ];
if ( szArenas[ 0 ] == '\0' )
{
for( new i; i < sizeof( g_paintballArenaData ); i++ )
{
strcat( szArenas, g_paintballArenaData[ i ] [ E_NAME ] );
strcat( szArenas, "\n" );
}
}
ShowPlayerDialog( playerid, DIALOG_PAINTBALL_ARENAS, DIALOG_STYLE_LIST, "{FFFFFF}Paintball - Edit", szArenas, "Select", "Back" );
}
stock JoinPlayerPaintball( playerid, p )
{
if ( !IsPlayerConnected( playerid ) )
return -1;
if ( !Iter_Contains( paintball, p ) )
return -1;
if ( g_paintballData[ p ] [ E_PLAYERS ] >= g_paintballData[ p ] [ E_LIMIT ] )
return SendError( playerid, "This lobby is currently full, you're unable to join it." );
p_PaintBallArena { playerid } = p;
p_inPaintBall { playerid } = true;
g_paintballData [ p ] [ E_PLAYERS ] ++;
SpawnToPaintball( playerid, p );
SendClientMessageFormatted( playerid, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" You've joined the paintball area: "COL_GREY"%s"COL_WHITE".", g_paintballData[ p ] [ E_NAME ] );
return 1;
}
stock SpawnToPaintball( playerid, p )
{
if ( !IsPlayerConnected( playerid ) )
return;
if ( !Iter_Contains( paintball, p ) )
return;
new
iArena = g_paintballData[ p ] [ E_ARENA ];
ResetPlayerWeapons( playerid );
GivePlayerWeapon( playerid, g_paintballData[ p ] [ E_WEAPONS ] [ 0 ], 16000 );
GivePlayerWeapon( playerid, g_paintballData[ p ] [ E_WEAPONS ] [ 1 ], 16000 );
GivePlayerWeapon( playerid, g_paintballData[ p ] [ E_WEAPONS ] [ 2 ], 16000 );
SetPlayerHealth( playerid, g_paintballData[ p ] [ E_HEALTH ] );
SetPlayerArmour( playerid, g_paintballData[ p ] [ E_ARMOUR ] );
SetPlayerPos( playerid, g_paintballArenaData[ iArena ] [ E_X ], g_paintballArenaData[ iArena ] [ E_Y ], g_paintballArenaData[ iArena ] [ E_Z ] );
SetPlayerInterior( playerid, g_paintballArenaData[ iArena ] [ E_INTERIOR ] );
SetPlayerVirtualWorld( playerid, p + 10000 );
}
stock LeavePlayerPaintball( playerid )
{
if ( !IsPlayerConnected( playerid ) )
return;
new
p = -1;
if ( !hasPaintBallArena( playerid, p ) )
p = p_PaintBallArena{ playerid }; // Backup
if ( IsPlayerInPaintBall( playerid ) )
{
p_inPaintBall { playerid } = false;
p_LeftPaintball { playerid } = true;
g_paintballData [ p ] [ E_PLAYERS ] --;
}
if ( !Iter_Contains( paintball, p ) )
return;
if ( g_paintballData[ p ] [ E_HOST ] == playerid )
{
new
oldHost = g_paintballData[ p ] [ E_HOST ];
foreach(new i : Player)
{
if ( IsPlayerInPaintBall( i ) && p_PaintBallArena{ i } == p && playerid != i )
{
g_paintballData[ p ] [ E_HOST ] = i;
SendClientMessageFormatted( i, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" %s(%d) is now the leader of the lobby.", ReturnPlayerName( i ), i );
break;
}
}
if ( oldHost == g_paintballData[ p ] [ E_HOST ] )
{
SendClientMessage( playerid, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" There is no one playing in your lobby therefore the game has been destroyed." );
DestroyPaintballArena( p );
}
}
}
stock respawnAllInPaintballLobby( lobby )
{
foreach(new i : Player)
{
if ( IsPlayerInPaintBall( i ) && p_PaintBallArena{ i } == lobby && GetPlayerState( i ) != PLAYER_STATE_WASTED && IsPlayerSpawned( i ) )
SpawnPlayer( i ), SendServerMessage( i, "As the lobby host changed some settings, you've been spawned." );
}
}
stock hasPaintBallArena( playerid, &arena = -1 )
{
foreach(new i : paintball) {
if ( g_paintballData[ i ] [ E_HOST ] == playerid ) {
arena = i;
return true;
}
}
return false;
}
/* ** Commands ** */
CMD:pb( playerid, params[ ] ) return cmd_paintball( playerid, params );
CMD:paintball( playerid, params[ ] )
{
if ( !IsPlayerInPaintBall( playerid ) )
return SendError( playerid, "You're not in any paintball lobby." );
if ( !hasPaintBallArena( playerid ) )
return SendError( playerid, "This command requires you to be the host of a lobby." );
new
id = p_PaintBallArena{ playerid },
pID
;
if ( strmatch( params, "edit" ) )
{
showPaintBallLobbyData( playerid, id, "Close" );
}
else if ( !strcmp( params, "kick", false, 4 ) )
{
if ( sscanf( params[ 5 ], #sscanf_u, pID ) ) return SendUsage( playerid, "/paintball kick [PLAYER_ID]" );
else if ( !IsPlayerConnected( pID ) ) return SendError( playerid, "This player is not connected." );
else if ( !IsPlayerInPaintBall( pID ) ) return SendError( playerid, "This player is not in paintball." );
else if ( p_PaintBallArena{ pID } != id ) return SendError( playerid, "This player is not in your paintball lobby." );
else if ( pID == playerid ) return SendError( playerid, "You cannot kick yourself." );
else
{
SendClientMessageToPaintball( id, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" %s(%d) has left the lobby (KICKED)", ReturnPlayerName( pID ), pID );
LeavePlayerPaintball( pID );
SetPlayerHealth( pID, -1 );
}
}
else if ( !strcmp( params, "leader", false, 6 ) )
{
if ( sscanf( params[ 7 ], #sscanf_u, pID ) ) return SendUsage( playerid, "/paintball paintball [PLAYER_ID]" );
else if ( !IsPlayerConnected( pID ) ) return SendError( playerid, "This player is not connected." );
else if ( !IsPlayerInPaintBall( pID ) ) return SendError( playerid, "This player is not in paintball." );
else if ( p_PaintBallArena{ pID } != id ) return SendError( playerid, "This player is not in your paintball lobby." );
else if ( pID == playerid ) return SendError( playerid, "You cannot apply this action to yourself." );
else
{
g_paintballData[ id ] [ E_HOST ] = pID;
SendClientMessageToPaintball( id, -1, ""COL_GREY"[PAINTBALL]"COL_WHITE" %s(%d) is the new paintball leader.", ReturnPlayerName( pID ), pID );
}
}
else if ( !strcmp( params, "countdown", false, 6 ) )
{
new
iSeconds;
if ( sscanf( params[ 10 ], "D(10)", iSeconds ) ) return SendUsage( playerid, "/paintball countdown [SECONDS]" );
else if ( iSeconds < 1 || iSeconds > 30 ) return SendError( playerid, "Please specify countdown seconds between 1 and 30." );
else
{
SendServerMessage( playerid, "You have started a countdown from %d in your paintball game.", iSeconds );
KillTimer( g_paintballData[ id ] [ E_CD_TIMER ] );
g_paintballData[ id ] [ E_CD_TIMER ] = SetTimerEx( "paintballCountDown", 960, false, "dd", id, iSeconds - 1 );
}
}
else SendUsage( playerid, "/paintball [EDIT/KICK/COUNTDOWN/LEADER]" );
return 1;
}