/* Copyright © 2010, tuty
Life Transfer is free software;
you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Life Transfer; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
/* --| Includem tot ce ne trebuie */
#include < amxmodx >
#include < amxmisc >
#include < cstrike >
#include < hamsandwich >
#include < fun >
/* --| Fortam 'punct si virgula' la fiecare sfarsit de linie */
#pragma semicolon 1
/* --| Definitii pentru plugin */
#define PLUGIN_VERSION "5.0.2"
#define MAX_PLAYERS 32
/* --| Globale.. */
new gSayText;
new gMenuId;
new gFragToBonus;
new gInviter[ MAX_PLAYERS + 1 ];
/* --| Un mic bool-ean */
new bool:is_user_invited[ MAX_PLAYERS + 1 ];
new bool:has_already_invited[ MAX_PLAYERS + 1 ];
/* --| Stocam numerele pentru meniu.. in cazul asta 1 si 2 */
const KEYS = MENU_KEY_1 | MENU_KEY_2;
/* --| Definim sunetul nostru pentru a il putea folosi in mai multe locuri */
#define LIFE_TRANSFERED_SOUND "fvox/vitalsigns_on.wav"
/* --| Si incepem ... */
public plugin_init()
{
/* --| Inregistram pluginul sa apara in lista */
register_plugin( "DR: Life Transfer", PLUGIN_VERSION, "tuty" );
/* --| Un event cand ia playeru spawn */
RegisterHam( Ham_Spawn, "player", "bacon_Spawn", 1 );
/* --| Inregistram comenzile de say pentru a verifica comanda /transfer */
register_clcmd( "say", "cmdSayTransfer" );
register_clcmd( "say_team", "cmdSayTransfer" );
/* --| Stocam cate ceva :D */
gSayText = get_user_msgid( "SayText" );
gMenuId = register_menuid( "Transfer" );
/* --| Inregistram meniul */
register_menucmd( gMenuId, KEYS, "transfer_menu" );
/* --| Inregistram cvarul pentru fraguri */
gFragToBonus = register_cvar( "lt_fragbonus", "3" );
}
/* --| Cand jucatorul se conecteaza pe server */
public client_connect( id )
{
/* --| Cand jucatorul se conecteaza nu are invitatie trimisa si nu este nici invitat */
is_user_invited[ id ] = false;
has_already_invited[ id ] = false;
}
/* --| Cand jucatorul iese de pe server */
public client_disconnect( id )
{
/* --| Cand jucatorul se deconecteaza nu are invitatie trimisa si nu este nici invitat */
is_user_invited[ id ] = false;
has_already_invited[ id ] = false;
}
/* --| Dam precache la sunet.. */
public plugin_precache()
{
precache_sound( LIFE_TRANSFERED_SOUND );
}
/* --| Acum aflam daca jucatorul a scris /transfer <nume> */
public cmdSayTransfer( id )
{
new szSaid[ 300 ], szCommand[ 20 ];
/* --| Citim ce scrie jucatoru, stergem ghilimelele */
read_args( szSaid, charsmax( szSaid ) );
remove_quotes( szSaid );
/* --| Stergem spatiile de la inceput si sfarsit */
trim( szSaid );
/* --| Daca nu a scris nimic dam return */
if( !strlen( szSaid ) )
{
return PLUGIN_CONTINUE;
}
/* --| Impartim comanda si stringu( ce a zis jucatoru ) */
parse( szSaid, szCommand, charsmax( szCommand ), szSaid, charsmax( szSaid ) );
if( equal( szCommand, "/transfer" ) )
{
/* --| Verificam daca jucatorul e mort, sa nu execute comanda */
if( !is_user_alive( id ) )
{
color_print( id, "^4[ tutY.DR ]^1 You must be alive to use transfer command!" );
return PLUGIN_HANDLED;
}
/* --| Daca jucatoru e in echipa teroristilor, dam return cu mesaj */
if( cs_get_user_team( id ) == CS_TEAM_T )
{
color_print( id, "^4[ tutY.DR ]^1 Only ^3CT^1 can use transfer command!" );
return PLUGIN_HANDLED;
}
/* --| Aflam <numele>, adica tinta de la comanda transfer */
new iTarget = cmd_target( id, szSaid, 10 );
/* --| Luam numele tintei */
new Name[ 32 ];
get_user_name( iTarget, Name, charsmax( Name ) );
/* --| Daca nu e valida tinta, sau nu exista, dam return */
if( !iTarget )
{
color_print( id, "^4[ tutY.DR ] ^1This user doesn't exist!" );
return PLUGIN_HANDLED;
}
/* --| Daca tinta nu e in echipa cu cel care executa comanda, dam return */
if( cs_get_user_team( id ) != cs_get_user_team( iTarget ) )
{
color_print( id, "^4[ tutY.DR ] ^3%s^1 is not from your team!", Name );
return PLUGIN_HANDLED;
}
/* --| Verificam daca tinta este in viata, si dam return daca da */
if( is_user_alive( iTarget ) )
{
color_print( id, "^4[ tutY.DR ] ^3%s ^1is already alive :) !", Name );
return PLUGIN_HANDLED;
}
/* --| Verificam daca nu a fost trimisa deja o invitatie de transfer acelui jucator, daca da, dam return */
if( is_user_invited[ iTarget ] == true )
{
color_print( id, "^4[ tutY.DR ] ^1A transfer invitation was already sent to ^3%s^1!", Name );
return PLUGIN_HANDLED;
}
/* --| Verificam sa vedem daca jucatoru a transferat viata cuiva sa nu mai poata transfera pana tura viitoare */
if( has_already_invited[ iTarget ] == true )
{
color_print( id, "^4[ tutY.DR ] ^1You already sent a invitation! Wait for next spawn!" );
return PLUGIN_HANDLED;
}
/* --| Trimitem invitatia, si dam un mic print celui care a trimiso */
send_invitation( id, iTarget );
color_print( id, "^4[ tutY.DR ]^1 A transfer invitation was sent to ^3%s", Name );
}
/* --| Dam return continue pentru ca, daca jucatorul a scris corect /transfer <nume> sa apara in chat ce a scris */
return PLUGIN_CONTINUE;
}
/* --| Acum meniul */
public transfer_menu( id, key )
{
/* --| Aflam cine a cerut invitatia */
new inviter = gInviter[ id ];
/* --| Luam numele tintei, si celui care a facut invitatia */
new Name[ MAX_PLAYERS ], Name2[ MAX_PLAYERS ];
get_user_name( id, Name, charsmax( Name ) );
get_user_name( inviter, Name2, charsmax( Name2 ) );
new iFrags = get_pcvar_num( gFragToBonus );
/* --| Acum impartim butoanele, 1 si 2 */
switch( key )
{
/* --| Cazul 1, executam comenzile de transfer */
case 0:
{
/* --| Dam respawn la tinta, si il ucidem pe cel care a facut invitatia, apoi ii setam echipa la CT, pentru a nu-l arata pe spec! */
ExecuteHamB( Ham_CS_RoundRespawn, id );
cs_set_user_team( id, CS_TEAM_CT );
user_silentkill( inviter );
/* --| Setam cateva fraguri bonus celui care a trimis invitatia */
set_user_frags( inviter, get_user_frags( inviter ) + iFrags );
/* --| Un mic delay cand setam originea tintei, in locul unde invitatorul a executat comanda */
set_task( 0.2, "doOrigin", id );
is_user_invited[ id ] = false;
has_already_invited[ inviter ] = true;
/* --| Puscam doua printuri in chat la cel care a facut invitatia, si la toti ca x si-a transferat viata lui y */
color_print( inviter, "^4[ tutY.DR ]^1 Transfer invitation was accepted by ^3%s^1! You got^4 %d^1 frags for transfer!", Name, iFrags );
color_print( 0, "^4[ tutY.DR ] ^3%s^1 transfered his life to ^4%s^1!", Name2, Name );
/* --| Acum ca tinta e vie, sa emitem un sunet care se aude la oarece distanta */
emit_sound( id, CHAN_VOICE, LIFE_TRANSFERED_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM );
}
/* --| Cazul 2, nu facem nimic, deoarece nu a acceptat transferul */
case 1:
{
/* --| Dam un mic print celui care a facut invitatia, ca nu a acceptat */
color_print( inviter, "^4[ tutY.DR ]^1 Transfer invitation was declined by ^3%s^1!", Name );
is_user_invited[ id ] = false;
has_already_invited[ inviter ] = false;
}
}
is_user_invited[ id ] = false;
has_already_invited[ inviter ] = false;
}
/* --| Acum setam originea tintei in locul unde a fost jucatorul care a executat comanda */
public doOrigin( id )
{
/* --| Luam originea celui care a executat comanda, si o luam de la locul unde i se aflau picioarele adica 0 */
new iOrigin[ 3 ];
get_user_origin( gInviter[ id ], iOrigin, 0 );
iOrigin[ 2 ] += 10;
/* --| Setam originea tintei in locul celuilalt */
set_user_origin( id, iOrigin );
/* --| Aplicam un mic efect de teleport :D */
message_begin( MSG_PVS, SVC_TEMPENTITY, iOrigin );
write_byte( TE_TELEPORT );
write_coord( iOrigin[ 0 ] );
write_coord( iOrigin[ 1 ] );
write_coord( iOrigin[ 2 ] );
message_end();
}
/* --| Cand jucatorul a luat spawn, resetam transferurile */
public bacon_Spawn( id )
{
if( is_user_alive( id ) )
{
has_already_invited[ id ] = false;
}
}
/* --| Cateva stocuri, de trimis invitatia sa apara meniul si de color chat( culori in chat ) */
/* --| Trimitem invitatia */
stock send_invitation( inviter, target )
{
new szMenu[ 400 ], iLen;
/* --| Aflam numele celui care a executat comanda */
new Name[ MAX_PLAYERS ];
get_user_name( inviter, Name, charsmax( Name ) );
/* --| Titlul meniului */
iLen = formatex( szMenu, charsmax( szMenu ), "\rDo you accept life transfer from \w%s\r?^n^n", Name );
/* --| Acum adaugam optiunea 1 si 2 */
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r1. \wYes, of course^n" );
iLen += formatex( szMenu[ iLen ], charsmax( szMenu ) - iLen, "\r2. \wNo, no way^n" );
/* --| Afisam meniul tintei */
show_menu( target, KEYS, szMenu, 3, "Transfer" );
/* --| Tinta acum e egala cu cel care a facut invitatia */
gInviter[ target ] = inviter;
/* --| Setam ca este deja trimisa o invitatie acestui jucator */
is_user_invited[ target ] = true;
/* --| Dupa 3 secunde atunci cand dispare meniul, facem sa nu mai aiba invitatia daca nu raspunde... */
set_task( 3.0, "removeInvite", target );
}
/* --| Resetam invitatiile */
public removeInvite( target )
{
is_user_invited[ target ] = false;
}
/* --| Acum stocul de color chat( culori specifice in chat ) */
stock color_print( id, const message[], { Float, Sql, Result, _ }:... )
{
new Buffer[ 300 ],Buffer2[ 300 ];
new players[ MAX_PLAYERS ], index, num, i;
formatex( Buffer2,charsmax( Buffer2 ), "%s", message );
vformat( Buffer, charsmax( Buffer ), Buffer2, 3 );
get_players( players, num, "c" );
if( id )
{
if( !is_user_connected( id ) )
{
return;
}
message_begin( MSG_ONE_UNRELIABLE, gSayText, _, id );
write_byte( id );
write_string( Buffer );
message_end();
}
else
{
for( i = 0; i < num;i++ )
{
index = players[ i ];
if( !is_user_connected( index ) )
{
continue;
}
message_begin( MSG_ONE_UNRELIABLE, gSayText, _, index );
write_byte( index );
write_string( Buffer );
message_end();
}
}
}
/* --| Cam atat, sfarsitul pluginului... A fost greu h? */