[Tutorial]Crearea unui cvar.

Tutoriale scripting, cod si portiuni de cod.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Post Reply
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

18 Jul 2014, 16:36

Salut,astazi o sa va invat cum sa va adaugati propriile cvaruri.
Am sa dau un exemplu simplu pentru a putea intelege,cand omoram pe cineva sa ne dea x viata(setata prin cvar).
Pas 1.Deschidem amxx studio,inceputul de baza al unui plugin.Deci vom avea asa:

Code: Select all

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "author"


public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	// Add your code here...
}
Pas 2:Sub biblioteca amxmisc adaugam fun(cu fun dam viata playerului,merge si cu fakemeta,fakemeta util insa este mai bine asa):

Code: Select all

#include <amxmodx>
#include <amxmisc>
#include <fun>
Pas 3: Deasupra la plugin_init creem o variabila globala simpla:

Code: Select all

new pHealth
Pas 4:In plugin_init inregistram cvarul si adaugam urmatorul event:

Code: Select all

register_event("DeathMsg","ev_msg","a");
	
	pHealth = register_cvar("cvar_health","15")
register_event("DeathMsg","ev_msg","a") = eventul care detecteaza:
-cand jucatorul face kill.
-cand un jucator se sinucide.
-cand un jucator este omorat.

pHealth = register_cvar("cvar_health","15"):
-pHealth = variabila noastra cu care 'creem acest cvar'
register_cvar = inregistram cvarul
cvar_health = cvarul pe care il adaugam in amxx.cfg
15 = valoarea acestui cvar.

Pas 5: Facem publicul eventului si anume ev_msg fara niciun param,paramurile o sa ni le 'creem' singuri in interiorul codului.Am lasat explicatiile in cod pentru a intelege mai bine:

Code: Select all

public ev_msg( ) {
	static kiler,victima //creem 2 variabile statice pentru a mai 'scurta' din cod
	// read_data(1) = kilerul
        //read_data(2) = victima
	kiler = read_data(1) //stocam read_data(1) in variabila kiler.
	victima = read_data(2) //stocam read_data(2) in variabila victim
	
	if(kiler != victima && is_user_alive(kiler)) //daca kilerul nu este egal cu victima si kilerul este in viata atunci executam urmatoarele instructiuni:
	{
		set_user_health(kiler,get_user_health(kiler) + get_pcvar_num(pHealth)) // + get_pcvar_num(pHealth) v-a lua valoarea din amxx.cfg,in caz ca in amxx.cfg nu gaseste acest cvar v-a lua direct din plugin.
		client_print(kiler,print_chat,"Felicitari ai primit %d HP pentru kilul facut",get_pcvar_num(pHealth)) //ii vom printa un mesaj in chat kilerului cum ca a facut kill si a primit x Hp.
	}
}
COD COMPLET:

Code: Select all

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <fun>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "author"

new pHealth

public plugin_init() {
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	register_event("DeathMsg","ev_msg","a");
	
	pHealth = register_cvar("cvar_health","15")
}

public ev_msg( ) {
	static kiler,victima
	
	kiler = read_data(1)
	victima = read_data(2)
	
	if(kiler != victima && is_user_alive(kiler))
	{
		set_user_health(kiler,get_user_health(kiler) + get_pcvar_num(pHealth))
		client_print(kiler,print_chat,"Felicitari ai primit %d HP pentru kilul facut",get_pcvar_num(pHealth))
	}
}
Sper ca ati inteles,nu sunt foarte bun la explicatii..
User avatar
DaNNe.
Fost moderator
Fost moderator
Posts: 2811
Joined: 08 Nov 2013, 20:43
Detinator Steam: Da
CS Status: Activitate scăzută
SteamID: /id/FurienMaster
Reputatie: Nick anterior: DnD. Gold, Emrys
0.5/3
Fost moderator ajutator
Fost Membru Club eXtreamCS (doua luni)
Has thanked: 244 times
Been thanked: 129 times
Contact:

18 Jul 2014, 17:43

register_event("DeathMsg","ev_msg","a") = eventul care detecteaza:
-cand jucatorul face kill.
-cand un jucator se sinucide.
-cand un jucator este omorat.
- arma cu care se face kill-ul
- daca kill-ul este facut prin HeadShot.

Frumos si bun pentru incepatori. La mai multe! :D
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

18 Jul 2014, 18:03

DaNNe. wrote:
register_event("DeathMsg","ev_msg","a") = eventul care detecteaza:
-cand jucatorul face kill.
-cand un jucator se sinucide.
-cand un jucator este omorat.
- arma cu care se face kill-ul
- daca kill-ul este facut prin HeadShot.

Frumos si bun pentru incepatori. La mai multe! :D
Sunt multe chestii,flagul,read_data(3)/4,pot sa specific si arma etc nu am stat sa le scriu pe toate deoarece un incepator nu le i-a pe toate odata,o i-a de jos se mai documenteaza...+ ca este un tutorial despre cvaruri nu deathmsg ;))
Mersi.
User avatar
Snow.
Membru, skill +1
Membru, skill +1
Posts: 243
Joined: 18 Mar 2014, 21:59
Detinator Steam: Nu
Has thanked: 58 times
Been thanked: 24 times

18 Jul 2014, 19:46

scosmynnnn wrote: Sunt multe chestii,flagul,read_data(3)/4,pot sa specific si arma etc nu am stat sa le scriu pe toate deoarece un incepator nu le i-a pe toate odata,o i-a de jos se mai documenteaza...+ ca este un tutorial despre cvaruri nu deathmsg ;))
Asta voiam sa iti spun. Daca tutorialul se refera strict la cvar'uri, nu trebuia sa il incurci cu acel event. Evident ca trebuia sa ii gasesti si o atributie, dar puteai sa folosesti ceva mai simplu, un incepator nu mai intelege nimic :)

Niste observatii:
Pas 3: Deasupra la plugin_init creem o variabila globala simpla:
Cod:
new pHealth
*Nu conteaza unde o pui. Nu schimba cu nimic faptul ca o creezi deasupra la plugin_init, sau dedasupt.
*Poti face printr-o variabila, sau poti inregistra direct :
register_cvar( "nume cvar", "valoare cvar" );
In acest caz, trebuie sa folosesti astfel respectivul cvar:
get_cvar_num( "nume cvar" )
Arkshine spunea ca diferenta dintre "get_cvar_num" si "get_pcvar_num" consta in faptul ca la a 2-a viteza este de 5 ori mai mare.

*Tu ai folosit un caz particular, pentru variabile de tip "integer".
-Pentru float -> get_pcvar_float // get_cvar_float.
-Pentru string -> get_pcvar_string // get_cvar_string.

*Pentru mesaje ( chat/hud/etc. )
- %d / %i, pentru variabile de tip integer.
- %f, pentru variabile de tip float. Daca vreti spre exeplu doar cu o zecimala: %.1f .
- %s, pentru variabile de tip string.
Ion Creanga - Romania Juna, 1869 wrote:Stiu ca sunt prost, dar cand ma uit in jurul meu, prind curaj !
Image
Cosmin
Fost moderator
Fost moderator
Posts: 9362
Joined: 06 Jul 2013, 22:08
Detinator Steam: Da
Detinator server CS: Nu
Reputatie: Fost eXtream Mod
Fost Scripter eXtreamCS
Nume anterior: scosmynnnn
Has thanked: 492 times
Been thanked: 547 times

18 Jul 2014, 19:57

Snow acest tutorial este de baza,evident ca nimeni nu o sa se incurce de la inceput cu floaturi..multe nu am specificat deoarece aceasta este baza de ce sa te apuci sa adaugi la un plugin cvaruri daca tu nu sti ca un cvar de tip integer se 'scrie' %i,%d si stringurile %s.

Variabilele se scriu de obicei deasupra la init/constante :-? e urat jos de tot,nu prea am intalnit asa..totusi trebuie sa arate si putin frumos :)

get_pcvar_num/float este mai rapid decat get_cvar_num/float,eu nu am citit pe allied ci mi-a spus cineva dupa forumul asta care are cunostinte destul de bune in amxx.

Cvarurile se pot folosi in multe situatii,e si get_cvar_pointer, get_cvar_string dar asta e putin diferit decat num si anume,trebuie sa creezi o noua variabila la el,etc..
User avatar
HamletEagle
Fost moderator
Fost moderator
Posts: 750
Joined: 21 Sep 2013, 15:05
Detinator Steam: Da
CS Status: Inactiv cateva zile.
SteamID: privat
Reputatie: Fost Scripter eXtreamCS.com
Fost Moderator ajutator
Has thanked: 19 times
Been thanked: 85 times

18 Jul 2014, 20:27

Puteai sa detalizei si tu mai mult...
Last edited by Cosmin on 18 Jul 2014, 20:38, edited 1 time in total.
Reason: Daca as sta sa detaliez mai mult ar insemna sa stau 2 ore,cvarurile sunt destul de complexe chiar daca nu par.
Daca vreti ajutorul meu, nu dati bump la topic, fara intrebari de genu "cat mai dureaza/mai astept mult?".
User avatar
DaNNe.
Fost moderator
Fost moderator
Posts: 2811
Joined: 08 Nov 2013, 20:43
Detinator Steam: Da
CS Status: Activitate scăzută
SteamID: /id/FurienMaster
Reputatie: Nick anterior: DnD. Gold, Emrys
0.5/3
Fost moderator ajutator
Fost Membru Club eXtreamCS (doua luni)
Has thanked: 244 times
Been thanked: 129 times
Contact:

19 Jul 2014, 20:55

@Snow:
*Pentru mesaje ( chat/hud/etc. )
- %d / %i, pentru variabile de tip integer.
- %f, pentru variabile de tip float. Daca vreti spre exeplu doar cu o zecimala: %.1f .
- %s, pentru variabile de tip string.
N-are rost sa le zici inca de integer, string sau float. Ii bagi in ceata mai rau. :))
Last edited by Cosmin on 20 Jul 2014, 14:10, edited 1 time in total.
Reason: pai de integer le-am aratat,trebuia sa dau un exemplu cu unul din ele.
User avatar
HamletEagle
Fost moderator
Fost moderator
Posts: 750
Joined: 21 Sep 2013, 15:05
Detinator Steam: Da
CS Status: Inactiv cateva zile.
SteamID: privat
Reputatie: Fost Scripter eXtreamCS.com
Fost Moderator ajutator
Has thanked: 19 times
Been thanked: 85 times

14 Oct 2014, 19:40

Nu stai 2 ore. Uite mai jos tot ce trebuie stiut despre cvaruri.

Introducere:

Cvarurile au aparut datorita necesitatii de a putea modifica anumite valori sau modul de gandire al unui plugin fara sa fie nevoie sa editam si sa compilam din nou pluginul respectiv.

Generalitati:
Cvarurile pot retine valori de tip float,string,integer.

Floaturi: oricine stie putina matematica a auzit despre numerele cu virgula, in pawn acestea se numesc "float".
Exemplu: 0.3245, 33.34, 11.87, 1.0
Se foloseste %f / %.1f ( va aparea doar o zecimala ).

Code: Select all

new Float: fMyFloat
Stringuri: de obicei "cuvinte", si semne de punctuatie.
Exemplu: alabala, 1.1.1.1 ( chiar daca este format din integere nu este integer,este string deoarece contine "."). Daca il printam cu %i va arata 1111 ( fara acele puncte ).

Code: Select all

new MyString[ 5 ]
MyString[ 0 ] = "a"
MyString[ 1 ] = "b"
MyString[ 2 ] = "c"
MyString[ 3 ] = "d"
MyString[ 4 ] = "e"
Important este ca in pawn stringurile nu sunt separate de arrayuri ( nu ma refer la cele dinamice ). Adica,pentru a stoca un string avem nevoie de un array, in fiecare celula, de la 0 la lungime_maxima -1 vom avea cate o litera. In cazul nostru, daca printam MyString vom obtine abcde. Nu e obligatoriu sa specificati celula in care se afla litera: new MyString [ 5 ] = "abcde". Se utilizeaza %s:

Code: Select all

client_print(0, print_chat, "String: %s", MyString)
Integere: sunt numerele intregi.
Exemplu: 1,2,3,-78
Se foloseste %i sau %d.

Creearea unui cvar:
Orice cvar se creeaza folosind nativa register_cvar( "nume", "valoare")

Code: Select all

new g_pCvar1,g_pCvar2,g_pCvar3

g_pCvar1 = register_cvar("primul_meu_cvar", "5")
g_pCvar2 = register_cvar("al_doilea_cvar", "abcd")
g_pCvar3 = register_cvar("altul", 3.4)
Numele variabilelor care retin cvarurile nu conteaza. g indica ca este o variabila globala, iar p ca este un pcvar. Acest tip de prefixare se numeste HN ( hungarian notation ). Prin conventie,se scrie cu litera mare prima litera din fiecare cuvant ( nu e necesar, dar arata mai frumos ).

Code: Select all

Citirea valorii dintr-un cvar:
Pentru a citi valoarea retinuta intr-un cvar se folosesc native ce depinde de tipul de date pe care acesta il stocheaza:

Code: Select all

Float: get_pcvar_float ( )
String: get_pcvar_string ( )
Integere: get_pcvar_num ( )
Exemplu:

Float:

Code: Select all

new cvar = register_cvar ( "ceva", 1.3 )
new Float: cvar_value = get_pcvar_float ( cvar )
Integer:

Code: Select all

new cvar = register_cvar ( "ceva", 14 )
new cvar_value = get_pcvar_num ( cvar )
Stringuri:

Code: Select all

new cvar = register_cvar ( "ceva", "alabala")
new szString [ 15 ] /* lungimea este aleasa de mine,chiar daca valoarea are 6 litere, am ales 15...vor ramane cateva celule libere*/
get_pcvar_string( cvar, szString, sizeof szString -1 )/* se scade unu din lungime deoarece ultima celula a unui array trebuie sa fie 0 )*/

Code: Select all

Pointere:
Ca sa putem accesa valorile cvarurilor in alte pluginuri folosim get_cvar_pointer ( "cvar" ).
Exemplu:

Code: Select all

new value, cvar_value
value = get_cvar_pointer ( "mp_timelimit" )
cvar_value = get_pcvar_num ( value )
Sau direct:

Code: Select all

new ceva = get_pcvar_num ( get_cvar_pointer ( "mp_timelimit" ) )
Diferenta dintre cvar si pcvar:
Simplu,pcvarurile sunt mai rapide deoarece nu se mai cauta prin lista de cvaruri numele cvarului pe care il vrei, se salveaza un pointer catre el.
Daca vreti ajutorul meu, nu dati bump la topic, fara intrebari de genu "cat mai dureaza/mai astept mult?".
ReaD1nG
Membru, skill +1
Membru, skill +1
Posts: 237
Joined: 26 Jul 2013, 17:48
Detinator Steam: Da
Has thanked: 65 times
Been thanked: 13 times

05 Aug 2015, 05:28

Mi-a fost de folos.
Image
Post Reply

Return to “Scripting”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 2 guests