Co to jest?
Jest to specjalny rodzaj zmiennej, która może być obsługiwana z poziomu innego pluginu przy użyciu odpowienich natyw.
Te natywy to:
/* Sprawdza czy XVar o podanej nazwie istnieje. */ native xvar_exists( const name[] ); /* Zwraca unikalne ID XVara. Jeśli nie istnieje zwraca -1. */ native get_xvar_id( const name[] ); /* Zwraca liczbę naturalna XVara. Id to wartość zwrócona przez get_xvar_id(). */ native get_xvar_num( id ); /* Zwraca liczbę rzeczywistą XVara. Id to wartość zwrócona przez get_xvar_id(). */ native Float:get_xvar_float( id ); /* Ustawia wartosc dla XVara. Id to wartość zwrócona przez get_xvar_id(). */ native set_xvar_num( id, value = 0 ); /* Ustawia liczbę rzeczywistą dla XVara. Id to wartość zwrócona przez get_xvar_id(). */ native set_xvar_float( id, Float:value = 0.0 );
Do tworzenia XVara służy słowo public.
Wygląda to mniej więcej tak:
public XvarExample;
public Float:XvarExampleFloat;
public bool:XvarExampleBool;
XVary mogą być tylko globalne, w przypadku próby użycia XVara jako zmienną lokalną, kompilator zasygnalizuję błąd.
Jak z tego korzystać ?
Najprostsze użycie XVarów wygląda tak:
#1
#include <amxmodx>
public XvarExample; /* Tworzymy xvary różnego typu */
public Float:XvarExampleFloat; /* Tutaj mamy Floata */
public bool:XvarExampleBool; /* A tutaj Boola */
public plugin_init()
{
register_plugin("XVar Tutorial", "1.0.0", "Owner dla AMXX.PL")
XvarExample = 100;
XvarExampleBool = true;
XvarExampleFloat = 1337.666;
}
#2
#include <amxmodx>
new g_pXvarPointers[3];
new bool:g_bXvarValue;
new Float:g_fXvarValue;
new g_iXvarValue;
public plugin_init()
{
register_plugin("XVar Tutorial", "1.0.0", "Owner dla AMXX.PL")
if(xvar_exists("XvarExample"))
g_pXvarPointers[0] = get_xvar_id("XvarExample");
if(xvar_exists("XvarExampleBool"))
g_pXvarPointers[1] = get_xvar_id("XvarExampleBool");
if(xvar_exists("XvarExampleFloat"))
g_pXvarPointers[2] = get_xvar_id("XvarExampleFloat");
g_iXvarValue = get_xvar_num(g_pXvarPointers[0]);
g_bXvarValue = bool:get_xvar_num(g_pXvarPointers[1]);
g_fXvarValue = get_xvar_float(g_pXvarPointers[2]);
}
Zaś ustawianie wartości wygląda następująco:
// ustawia wartośc dla liczby całkowitej
set_xvar_num( g_pXvarPointers[0], 10 );
// ustawia wartość dla zmiennej logicznej
set_xvar_num( g_pXvarPointers[1], false );
// ustawia wartość dla liczby rzeczywistej
set_xvar_float( g_pXvarPointers[2], 19.6 );
Podwojenia
Podwojenia są to 2 Xvary o takiej samej nazwie. Gdy chcemy z poziomu innego pluginu ustawić wartość dla niego, wartość Xvara zostanie zmieniona w tym pluginie, który jest wyżej w plugins.ini, poniżej przykład:
// To jest #1 plugin w plugins.ini
#include <amxmodx>
public bool:ShowRoundMessage;
public plugin_init()
{
register_plugin("New Round Displayer", "1.0.0", "Owner dla AMXX.PL");
register_event("HLTV", "NewRound", "a", "1=0", "2=0");
}
public NewRound()
{
if(ShowRoundMessage)
client_print(0, print_center, "Round Started");
}
// To jest #2 plugin w plugins.ini
#include <amxmodx>
public bool:ShowRoundMessage;
public plugin_init()
{
register_plugin("New Round Displayer", "1.0.0", "Owner dla AMXX.PL");
register_event("HLTV", "NewRound", "a", "1=0", "2=0");
}
public NewRound()
{
if(ShowRoundMessage)
client_print(0, print_center, "Round Started");
}
Zgadza się, te 2 pluginy są identyczne. Aby pokazać jak działa podwojenie potrzebny jest #3 plugin, który zmieni wartość naszego XVara:
#include <amxmodx>
new g_pXvar;
public plugin_init()
{
register_plugin("New Round Displayer Enabler", "1.0.0", "Owner dla AMXX.PL");
if((g_pXvar = get_xvar_id("ShowRoundMessage")) != -1)
set_xvar_num(g_pXvar, true);
}
Po rozpoczęciu rundy, pokaże się tylko jeden komunikat - co za tym idzie, wartość została zmieniona tylko dla pluginu #1.
Na zakończenie
To chyba wszystko jeśli chodzi o Xvary. W razie niejasności pisać a postaram się jak najszybciej to poprawić.