Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Sniper Elite - zdjęcie

Sniper Elite

Rejestracja: 13.01.2011
Aktualnie: Nieaktywny
Poza forum Ostatnio: 26.07.2025 23:08
*****

#752319 Paczka ZM EXP by CSnajper

Napisane przez NEQU# w 22.09.2018 23:05

Jakby ktoś chciał - https://nofile.io/f/...3bb87a54229ca6b max 71lvl, sporo różnych innych dodatków. Mi już nie potrzebne leży i się kurzy :)


  • +
  • -
  • 4


#734253 [PORADNIK] Mapy z workshopu

Napisane przez plx211 w 03.01.2017 16:39

WSTĘP


Workshop niesie ze sobą wiele korzyści, choćby takie że możemy mieć 2 mapy o takiej samej nazwie ponieważ ich id jest unikatowe, inną zaletą to że client pobiera mapy bezpośrednio z workshopu dzięki czemu nie jesteśmy "zmuszeni" do posiadania FastDL.

Poradnik pisany wręcz na kolanije, więc wybaczcie ewentualne błędy :)
Mam nadzieję że komuś się przyda.

W przypadku niektórych hostingów, authkey oraz +host_workshop_map mogą się znależć w web configu servera ;)

//TODO: Wzbogacić poradnik o kolekcje (jeśli komuś chce się pisać)

GENEROWANIE KLUCZA STEAMWEB API



Aby server mógł komunikować się z workshopem, musimy wygenerować klucz steamweb api, w tym celu:

  1. Zaloguj się na https://steamcommunity.com
  2. Udaj się na https://steamcommunity.com/dev/apikeypowinno ukazać ci się coś takiego:
    Spoiler
  3. Wpisz w pole "Nazwa domeny" adres swojej domeny (lub ip servera)
  4. Zakceptuj regulamin
  5. Kliknij zielony przycisk "Zarejestruj się"

Po wykonaniu tych czyności powinno ukazać ci się coś takiego:

Spoiler

Łatwo odczytać gdzie znajduje się nasz klucz, w mojm przypadku to:

FE26B33FF6A8795A57980BBC64822D99

Pamiętaj jednak aby nikomu tego KLUCZA NIE UDOSTĘPNIAĆ!

DODAWANIE KLUCZA DO SERVERA



Skoro mamy już klucz to możemy go dodać do servera, w tym celu do komendy startowej servera dodajemy:

-authkey {NASZ_KLUCZ}

W mojm przypadku komenda startowa wygląda tak:

./srcds_run -game csgo -console -usercon +game_type 0 +game_mode 0 +map de_dust2 +sv_setsteamaccount XXX -net_port_try 1 -authkey FE26B33FF6A8795A57980BBC64822D99

ODCZYTYWANIE ID MAPY



Znajdźmy wpierw sobie jakąś mape, w tym celu udajemy się na http://steamcommunit...readytouseitems
Ja wybrałem sobie mape awp_lego_b2 która się znajduje pod adresem http://steamcommunit...s/?id=826486474
Link do mapy jest bardzo ważny bo to właśnie z niego odczytujemy id, jak widać w tym przypadku id to:

826486474

Na wszelki wypadek:

Spoiler


WGRYWANIE MAPY



Załadowanie mapy z workshopu sprowadza się jedynie do wpisania w konsole servera:

host_workshop_map {ID_MAPY}

W mojm przypadku:

host_workshop_map 826486474

Po wpisaniu komedny server pobierze mape do

maps/workshop/{ID_MAPY}

poczym ją odpali

Spoiler

Aby udowodnić że mapa została załadowana, tak wygląda wynik komedny

status

Spoiler


AUTOSTART MAPY



Jeśli chcemy aby dana mapa automatycznie się uruchamiała w przypadku startu servera musimy w skrypcie startowym zamienić:

+map {de_d...}

Na:

+host_workshop_map {ID_MAPY}

Przykładowo w mojm przypadku wyglądało by to tak:

./srcds_run -game csgo -console -usercon +game_type 0 +game_mode 0 +sv_setsteamaccount XXX -net_port_try 1 -authkey FE26B33FF6A8795A57980BBC64822D99 +host_workshop_map 826486474

SPRAWDZANIE JAKIE MAMY POBRANE MAPY


maps workshop

CIEKAWE LINKI



https://forums.allie...d.php?p=2081908
https://developer.va...erver_Operators


  • +
  • -
  • 3


#234811 Spec HP List

Napisane przez DarkGL w 09.04.2011 12:11

Dołączona grafika
Plugin zaproponowany przez Speedo
w tym temacie
wyświetla on liste żyjących tt i ct wraz z ich hp osobom na spect/osobom nieżyjącym (do ustawienia w cvarach)

Dołączona grafika
halflife08.jpg

Dołączona grafika
//co ile ma odświeżać informacje o hp graczy ustawiając na 0.0 informacje beda odświeżane co zadanie obrażeń
spec_hp_refresh 2.0
//ilu ma maks ludzi pokazywac dla  teamu czyli jesli zyje 6 graczy pokaze info tylko o 5 itp. (5 optymalne nie zakrywa calego ekranu <img src='http://img.amxx.pl/public/style_emoticons/default/wink.gif' class='bbc_emoticon' alt=';)' /> )
spec_hp_many 5
//kto widzi liste 1 - osoby siedzace na spect 2 - wszyscy niezywy czyli jesli ktos zginal a jest w ct lub tt to tez widzi informacje
spec_hp_kto 2

Dołączona grafika
Załączony plik  spec_hp.sma   2,42 KB  710 Ilość pobrań
  spec_hp.amxx
Załączony plik  spec_hp.amxx   3,65 KB  16 Ilość pobrań

  • +
  • -
  • 3


#736544 Prośba o modyfikacje klasy [2]

Napisane przez Robiin w 17.02.2017 14:51

Dlaczego w 

public plugin_precache()

masz

precache_model("models/eStrikeCODMOD/p_ak47.mdl");
precache_model("models/eStrikeCODMOD/v_ak47.mdl");
precache_model("models/eStrikeCODMOD/p_ak47.mdl");
precache_model("models/eStrikeCODMOD/p_ak47.mdl");

dwa razy?

 

Gotowiec z dmg i poprawionym powyższym błędem

Załączone pliki


  • +
  • -
  • 2


#736556 Prośba o modyfikacje klasy [3]

Napisane przez retsam. w 17.02.2017 17:47

Proszę.

Załączone pliki


  • +
  • -
  • 1


#730879 RoundSound by Lenka (18)

Napisane przez Lenka w 19.09.2016 17:55

  • Ilość kawałków  18
  • Typ dźwięku  mp3 /120/256/320 kbps
  • Długość utworów  14 - 21 sek





Lista utworów

 

  1. Alien Cut Ft. Renee - Boom (TWISTERZ ReMix)
  2. Andrew Spencer - What A Feeling (DISCOTEK ReMix)
  3. Backstreet Boys - I Want It That Way (Anstandslos & Durchgeknallt ReMix) [1]
  4. Backstreet Boys - I Want It That Way (Anstandslos & Durchgeknallt Remix) [2]
  5. Bee Gees - Stayin' Alive (KOSTA Club Edit)
  6. Cash Cash & Digital Farm Animals Ft. Nelly - Millionaire (Alan Walker ReMix)
  7. Cleo - Zabiorę Nas (Kr8 x CandyCrash Bootleg)
  8. Darius & Finlay - Rock Me Amadeus (In Melbourne) (Club Mix)
  9. Darude - Sandstorm 2k16 (DISCOTEK & PANCZA Bootleg)
  10. Deorro Ft. Elvis Crespo - Bailar (DNF & Vnalogic x TWISTERZ Bootleg)
  11. DJ Deka Ft. Enikő & Atesz - Ez Az Éj (Club Mix 2)
  12. Ewelina Lisowska - Prosta Sprawa
  13. House Of Pain & TBMA Vs. Slider & Magnit - Jump Around (Sergey Kutsuev Mash)
  14. Masters At Work - Work (Don Pablo &. Triks 2k16 ReMix)
  15. Mc Hammer - Can't Touch This (DJ SHTOPOR ReMix) [1]
  16. Mc Hammer - Can't Touch This (DJ SHTOPOR ReMix) [2]
  17. Mike Williams Ft. Gwen Stefani - Sweet & Sour (Sykes Ben Mashup)
  18. Zara Larsson - Ain't My Fault


    ! Enjoy !
    :^D


    ..:: POBIERZ PACZKĘ ::..

    http://www95.zippysh...MWPTd/file.html



     

  • +
  • -
  • 7


#730107 Paczka DeathMatch [DM] by Nelka.

Napisane przez Nelkaa w 28.08.2016 15:48

Witam, chciałabym przedstawić wam moją pierwszą paczkę. Paczka przed napisaniem tematu była sprawdzana na testowym serwerze i na szczęście nie sypała errorami w konsoli. Zachęcam do pobierania i sprawdzania paczuszki.

 

OPIS

W paczce znajduję się znany każdemu mod DeathMatch. Czyli po wejściu na serwer wybiera się broń z menu, które od razu po odrodzeniu wyskakuje. Po zabiciu przeciwnika odradza cię ponownie i tak w kółko, aż do końca mapy.

 

CVARY

amx_vampire_hp 20 // ilość HP za zwykłe zabicie

amx_vampire_hp_hs 40 // ilość HP za zabicie HeadShotem

amx_vampire_max_hp 120 // maksymalna ilość HP gracza

amx_reklama_www "adres Twojego forum" // Zezwala wejść graczowi z adresem tego forum.

amx_reklama_sp "1" // 1 - Kick gracza z reklamą // 2 - Zmiana nicku na "REKLAMA"

amx_bulletdamage_recieved "1" // 1 - włącza, 0 - wyłacza pokazywanie otrzymanych obrażeń.

amx_bulletdamage "1" // 0 - plugin wyłączony, 1 - pokazuje zadane obrażenia, 2 - pokazuje zadane obrażenia, ale nie przez ściane

grenade_tr (Standardowo - 2) [0-Brak,1-Losowy kolor,2-Losowy{?},3-Kolor drużyny]

grenade_he "255000000" - Kolor lini dla He Granata

grenade_fb "000000255" - Kolor lini dla FlashBanga

grenade_sg "000255000" - Kolor lini dla Smoke Granata

ngm_frag_pts 2 // liczba pozytywnych punktów przyznawana za zwykłe zabójstwo

ngm_frag_hs_pts 3 // liczba pozytywnych punktów przyznawana za zabójstwo w głowę

ngm_tk_pts 3 // liczba pozytywnych punktów przyznawana za zabójstwo w głowę

ngm_zgon_pts 1 // liczba negatywnych punktów przyznawana za zostanie zabitym

ngm_zgon_hs_pts 2 // liczba negatywnych punktów przyznawana za zostanie zabitym w głowę

ngm_plant 1 // liczba pozytywnych punktów przyznawana za rozpoczęcie podkładania bomby

ngm_planted 2 // liczba pozytywnych punktów przyznawana za podłożenie bomby

ngm_explode 5 // liczba pozytywnych punktów przyznawana za zdetonowanie bomby

ngm_defuse 3 // liczba pozytywnych punktów przyznawana za rozpoczęcie rozbrajania bomby

ngm_defused 5 // liczba pozytywnych punktów przyznawana za rozbrajenie bomby

ngm_hostage 1 // liczba pozytywnych punktów przyznawana za rozpoczęcie ratowania zakładnika

ngm_resque 2 // liczba pozytywnych punktów przyznawana za uratowanie zakładnika

ngm_typ 0 // 0 - tryb sumowanych punktów, 1 - tryb punktów sortowanych

ngm_punkty 1 // 1 - pokazuje punkty, 0 - nie pokazuje punktów

ngm_samobojstwo 2 // liczba negatywnych punktów przyznawana za popełnienie samobójstwa / zabicie się

amx_tracers < 1|0 >



włącza/wyłącza plugin

amx_trace_handguns < 1|0 >



włącza/wyłącza ślady przy broni krótkiej

amx_trace_shotguns < 1|0 >



włącza/wyłącza ślady przy shotgun'ach

amx_trace_smgguns < 1|0 >



włącza/wyłącza ślady przy pistotach maszynowych (SMG,MP5...)

amx_trace_riffleguns < 1|0 >



włącza/wyłącza ślady przy karabinach maszynowych (AK47, M4A1...)

amx_trace_snipeguns < 1|0 >



włącza/wyłącza ślady przy snajperkach (SCOUT, AWM...)

amx_trace_hide_silen < 1|0 >



1 : ukrywa ślady przy wytłumionych broniach

0 : nie ukrywa śladów przy wytłumionych broniach

amx_trace_hltv < 1|0 >



jeśli ustawienia graczy* są włączone to 1 wyświetla ślady w HLTV

amx_trace_laser_color < RRRGGGBBB >



kolor lasera, tylko w wersji z laserem (weapon_laser_tracers.*)

PLUGINS.INI

ultimate_sounds.amxx

vampire.amxx

;anty_reklama.amxx

;reklama.amxx

abd.amxx

ad_manager.amxx

hpk_pl.amxx

ptb.amxx

admin_freelook.amxx

mutemenu.amxx

admin_spec_esp.amxx

polski_cs.amxx

vip.amxx

fragcounter.amxx

amx_showip.amxx

najlepszygraczmapy.amxx

snow.amxx

;advanced_weapon_tracers.amxx

snowNew.amxx

skull.amxx

CO POSIADA VIP?

1. Ciche Chodzenie
2. Multi Jump (4)
3. Po wpisaniu "/vips" jesteś na liście
4. Przywitanie gdy VIP wchodzi na Serwer
 

 

INSTALACJA

1. Pobieramy paczkę z linku poniżej.

2. Rozpakowujemy pliki do swojego serwera do folderu cstrike.

3. Dopisujemy cvary oraz pluginy do plugins.ini, które są wypisane w osobnym folderze.

 

DOWNLOAD


http://www38.zippysh...bcjEj/file.html

 

 


  • +
  • -
  • 4


#724765 Program do naprawy Windows 10.

Napisane przez plx211 w 13.04.2016 18:10

Polecam jakas dystrybucjie Linux'a


  • +
  • -
  • 2


#731403 Szukam funkcji do skoku

Napisane przez SecretARczi w 09.10.2016 16:27

***** macc pomoze ktos czy wyjebane

 


  • +
  • -
  • -1


#731086 Zabezpieczenie pluginu

Napisane przez Ogen Dogen w 27.09.2016 14:07

Obsługa MySQL w AMXX jest dosyć oporna, jak pisałem swój pierwszy plugin z wykorzystaniem bazy to się wzorowałem na kodzie tego silnika cod - https://amxx.pl/topi...zapisem-na-sql/+ poradnik co kolega wyżej podał.

Bardzo mi to pomogło zrozumieć jak to jest zorganizowane, mimo że w innych językach już wcześniej używałem baz SQL.


  • +
  • -
  • 1


#144797 MySQL - z czym to się je.

Napisane przez Owner123 w 17.06.2010 14:31

Witam.
Na wstępnie chciałbym powiedzieć, że nie będę opisywał tu zapytań MySQL ponieważ to mija się z celem. Jeśli ktoś chce się pouczyć zapytań MySQL zapraszam na uw-team.org (nie wiem czy taka reklama jest dozwolona, jeśli tak to prosiłbym o nie wlepianie mi warna). Szczerze polecam Wideotutorial Unknow'a na temat MySQL.
Życzę miłej lekturki.

MySQL, cóż to takiego ?

Edit. Thx 4 R3X
SQL - Structured Query Language (pl. strukturalny język zapytań), jest to nowoczesny język, dzięki któremu można posługiwać się bazami danych. MySQL to popularna odmiana serwera, które potrafi przetwarzać zapytania w tym języku.

Przejdźmy do sedna.
Aby móc zacząć pracować, musimy dołączyć do swojego pluginu dyrektywą #include odpowiednią biblioteke:

#include <sqlx>


Dobra mamy już odpowiednie narzędzia aby zacząć

Są 2 metody, pracy na bazach danych. Ja opiszę tutaj sposób, który używam osobiście i który sprawdza się w wielu przypadkach (m.in. Diablo Mod).
Ta metoda opiera się tylko na utworzeniu "pojemnika" który przechowuje dane dostępowe do bazy danych i odpowiednim użyciu go.
Możemy go stworzyć funkcją SQL_MakeDbTuple:
native Handle:SQL_MakeDbTuple(const host[], const user[], const pass[], const db[], timeout=0);

Po kolei:
const host[] - adres Hosta. Np. db4free.net, 127.0.0.1
const user[] - login. np. root
const pass[] - hasło.
const db[] - nazwa bazy danych. np. nauka
timeout=0 - tego parametru nie będę opisywał. Najlepiej zostawić tak jak jest.

Przykładowe użycie:
new Handle:Tuple = SQL_MakeDbTuple("127.0.0.1", "root", "", "nauka")

Najlepiej aby zmienne, które są właśnie "pojemnikiem" były globalne.

W jaki sposób wykonać jakieś zapytanie ?

A więc tak, są 2 metody wykonywania zapytań do bazy danych:

- Bezpośrednia (NON-Threaded)
- Pośrednia (Threaded)

Poniżej postaram się opisać obie metody.

Pośrednia / Threaded

Ta metoda przy dużej ilości wpisów w bazie (30k++) zaczyna działać z dużym opóźnieniem, nie ważne na jak dobrym hostingu mamy ulokowaną bazę danych. Jednak jest o wieele bezpieczniejsza. Na czym polega jej bezpieczeństwo?
Otóż tą metodą otrzymujemy wynik później, jednak nie powoduje ona lagów - w przeciwieństwie do NON-Threaded (w niektórych przypadkach, które potem opiszę).

Aby posłuzyć się tą metodą jest funkcja SQL_ThreadQuery:
native SQL_ThreadQuery(Handle:db_tuple, const handler[], const query[], const data[]="", dataSize=0);


Handle:db_tuple - uchwyt do "pojemnika"(nie wiedziałem jak to inaczej określić). Niezbędny aby cokolwiek zrobić.
const handler - nazwa funkcji publicznej która zostanie wywołana PO wykonaniu zapytania.
const query[] - treść zapytania. Jeśli jest skomplikowane lub wymaga użycia %d lub %s to wtedy należy to odpowiednio przygotować komendą format().
Podziękowania dla G[o]Q.
const data[]="" oraz dataSize=0 - parametry opcjonalne.

data to jakby tablica parametrow a dataSize to ich ilosc tak jak parametry w set_task o czym jest osobny poradnik


Przykładowe użycie:

new Handle:gTuple, bool:gConnected
[...]
//Tworzymy "pojemnik" i ustawiamy zmienną gConnected na true jeśli wszystko obeszło się bez przeszkód.

SaveData(id)
{
if(!gConnected) return

new Data[1]
Data[0] = id
new qCommand[512], szName[32]
get_user_name(id, szName, charsmax(szName))
format(qCommand, sizeof qCommand-1, "INSERT INTO nauka VALUES(%s, %i, %i);", szName, iPlayerXP[id], iPlayerLvl[id])
SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
}

public SaveHandler(FailState, Handle:Query, Error[], Errorcode, Data[], DataSize)
{
new id = Data[0]
if(Errorcode)
log_amx("Blad w zapytaniu: %s [SaveData]", Error)

if(FailState == TQUERY_CONNECT_FAILED)
{
log_amx("Nie mozna podlaczyc sie do bazy danych.")
return PLUGIN_CONTINUE
}
else if(FailState == TQUERY_QUERY_FAILED)
{
log_amx("Zapytanie anulowane [SaveData]")
return PLUGIN_CONTINUE
}

return PLUGIN_CONTINUE
}


Oczywiście zamiast funkcji log_amx, możemy posłużyć się funkcją log_to_file.
Przedstawiłem tu zapis Nicku, Xp i Levela graczy do bazy MySQL.

A co z odczytem ?
Powyższa instrukcja spowoduje, dodanie kolejnego wpisu do bazy danych. Nie ważne czy taki wpis już istnieje czy nie.
Aby sprawdzić czy dany wpis istnieje musimy posłużyć się kolejnym zapytaniem:
new Handle:gTuple, bool:gConnected
[...]
//Tworzymy "pojemnik" i ustawiamy zmienną gConnected na true jeśli wszystko obeszło się bez przeszkód.

CheckData(id)
{
if(!gConnected) return

new Data[1]
Data[0] = id
new qCommand[512], szName[32]
get_user_name(id, szName, charsmax(szName))
format(qCommand, sizeof qCommand-1, "SELECT * FROM `nauka` WHERE `nick` = '%s'", szName)
SQL_ThreadQuery(gTuple, "CheckHandler", qCommand, Data, 1)
}

public CheckHandler(FailState, Handle:Query, Error[], Errorcode, Data[], DataSize)
{
new id = Data[0]
if(Errorcode)
log_amx("Blad w zapytaniu: %s [CheckData]", Error)

if(FailState == TQUERY_CONNECT_FAILED)
{
log_amx("Nie mozna podlaczyc sie do bazy danych.")
return PLUGIN_CONTINUE
}
else if(FailState == TQUERY_QUERY_FAILED)
{
log_amx("Zapytanie anulowane [CheckData]")
return PLUGIN_CONTINUE
}

if(!SQL_MoreResults(Query)) // Nie znaleziono wpisów w bazie danych. Możemy spokojnie utworzyć.
DodajWpis(id)
else // A jednak coś znalazł ! Żeby nie robić kolejnej funkcji od razu odczytujemy.
{
iPlayerXp[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "exp")) // Ponieważ funkcja SQL_ReadResult wymaga ID pola, a my go nie mamy musimy posłużyć się funkcją SQL_FieldNameToNum.
iPlayerLvl[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "lvl")) // j/w
}

return PLUGIN_CONTINUE
}


Tutaj za wiele chyba tłumaczyć nie muszę. Sprawdzamy czy rekordy w bazie danych istnieją. Jeśli nie, to dodajemy, ale jak istnieje od razu odczytujemy dane.

Przechodzenie z jednego wpisu do drugiego
Załóżmy, że zapytanie SELECT zwróci nam kilka rekordów. Powyższa metoda nie zadziała poprawnie albo zadziała inaczej niż przewidywaliśmy.
Wtedy przydatna jest komenda SQL_NextRow(Handle:Query).
Przykład (zaczerpnięty z DiabloModa):
while(SQL_MoreResults(Query))
{
new i = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "klasa"))
srv_avg[i] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "AVG"))
SQL_NextRow(Query)
}

Jak zapewne wiadomo - klas w Diablo Modzie jest 8. Zatem zapytanie powyższe zapytanie SELECT odczyta zawartość tylko dla Maga a dla reszty nic by to nie zmieniło. Tutaj zastosowano pętle while która sprawdza czy nadal są jakieś zapytania, jeśli już nie ma - przerwij. Jak już wspomniałem funkcja SQL_NextRow powoduje przeskoczenie z jednego zapytania na drugie, zmniejszając przy tym wartość zwracaną funkcji SQL_MoreResults().

Dla tych co nie rozumieją zbytnio mechanizmu działania
No dobrze. Zapytanie SELECT zwróciło nam 3 rekordy. Chcemy odczytać wszystkie 3, więc tutaj musimy użyć naszej funkcji - SQL_NextRow. Ponieważ, funkcja SQL_MoreResults zwraca ilość rekordów które zostały do odczytania jeśli nic nie zrobiliśmy ma obecnie wartość 3. Dla pomocy kod:
while(SQL_MoreResults(Query))
{
//kod
SQL_NextRow(Query)
}

Po pierwszym obrocie pętli przesuneliśmy się z rekordu pierwszego, na rekord drugi i już wartość zwracana przez funkcje SQL_MoreResults(Query) ma obecnie 2. Teraz możemy bez przeszkód odczytać zawartość kolejnego rekordu.

NOWE!!!
Bezpośrednia / NON-Threaded
Ta metoda daje natychmiastowy zwrot rezultatu ALE pod warunkiem że bazę danych mamy ulokowaną na tej samej maszynie co serwer. W przeciwnym wypadku na serwerze będą ściny serwera i masakryczne pingi.
Aby móc zacząć robić cokolwiek musimy się wpierw połączyć z bazą:

Handle:SQL_Connect(Handle:sqlTuple, &error, szError[], len);

I tutaj strzeżcie się! Pamiętajcie aby ZAWSZE użyc SQL_FreeHandle(Handle:db) jak skończycie majstrować z bazą ! Jak tego nie będziecie robić, serwer będzie crashować bez żadnych error logów. Przykładowe połączenie z bazą wygląda następująco:

public client_authorized(id)
{
new Handle:hConnection, iError, szError[256];

if((hConnection = SQL_Connect(g_hSqlTuple, iError, szError, 255)))
{
// operacje na bazie danych
}
else
{
log_error(AMX_ERR_GENERAL, "Brak polaczenia z baza danych !");
log_error(AMX_ERR_GENERAL, "Kod bledu: %i", iError);
log_error(AMX_ERR_GENERAL, "Tresc bledu: %s", szError);
}

SQL_FreeHandle(hConnection); // PAMIETAJ O TYM BO INACZEJ CZEKA CIE ZGUBA !!!
}


I co to daje ? W metodzie pośredniej takie coś było zbędne!
Otóż użycie tego daje nam możliwość bezpośredniego wprowadzania zapytań do bazy danych. Aby wprowadzić zapytanie musimy użyć 2 funkcji:

Handle:SQL_PrepareQuery(Handle:connection, fmt[], any:...);
bool:SQL_Execute(Handle:query);

Dla ścisłości: funkcja SQL_Execute naprawdę nie zwraca typu bool tylko typ int. Jednak napisałem bool aby uświadomić Tobie, Drogi czytelniku, aby ta funkcja zwraca tylko wartości 1 i 0 aby nas poinformować o tym czy wykonanie zapytania SQL przebiegło poprawnie.
Przejdźmy do małego opisu parametrów:
SQL_PrepareQuery:
Pierwszy parametr:
Uchwyt zwrócony przez funkcje SQL_Connect. Tak, właśnie dlatego było nam potrzebne ręczne połączenie się z bazą!
Drugi i reszta parametrów: Treść zapytania. Jest to w miarę elastyczne ponieważ możemy używać znacznikow %d, %s itd. Uwaga! Nie zalecam używanie tu zapytań typu UPDATE ! Zamiast tego polecam użycie zapytań REPLACE, jednak aby działały one poprawnie wymagane jest utworzenie klucza PRIMARY, UNIQUE lub INDEX. Dlaczego? Nawet jeśli kod jest w pełni zoptymalizowany i baza danych stoi na localhoscie, przy dużej ilości rekordów (100k+, czasem 50k+) powodowane są ścinki i lagi serwera.
Rezultat: Uchwyt do wykonania zapytania. Ta funkcja tylko przygotowuje zapytanie !!! Zapytanie jest wykonywane dopiero przy użyciu funkcji SQL_Execute()! I niech was ręka boska broni! Tutaj też uzywajcie funkcji SQL_FreeHandle()!!! Tak samo jak w przypadku SQL_Connect nie użycie tego powoduje crashe serwera bez żadnych logów!

SQL_Execute:
Jest tutaj tylko jeden parametr: Uchwyt zwrócony przez funkcje SQL_PrepareQuery. Wykonanie tej funkcji jest równoznaczne z wywołaniem zapytania, wcześniej przygotowanego przez funkcje SQL_PrepareQuery.

Dobra koniec teorii, czas na podanie przykładowego kodu:

public client_authorized(id)
{
new Handle:hConnection, iError, szError[256];

if((hConnection = SQL_Connect(g_hSqlTuple, iError, szError, 255)))
{
new szNick[32];
get_user_name(id, szNick, 31);

new Handle:hQuery = SQL_PrepareQuery(hConnection, "SELECT * FROM tabela WHERE `nick` = '%s'", szNick);

if(SQL_Execute(hQuery))
{
new num = 0;
while(SQL_MoreResults(hQuery))
{
num = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "klasa"));
g_iPlayerLvl[id][num] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "lvl"));
g_iPlayerExp[id][num] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "exp"));
SQL_NextRow(hQuery)
}
}
else
{
SQL_QueryError(hQuery, szError, 255);
log_error(AMX_ERR_GENERAL, "Blad w zapytaniu !");
log_error(AMX_ERR_GENERAL, "Kod bledu: %i", iError);
log_error(AMX_ERR_GENERAL, "Tresc bledu: %s", szError);
}

SQL_FreeHandle(hQuery); // Niech was reka boska broni, przed zapomnieniem o tym
}
else
{
log_error(AMX_ERR_GENERAL, "Brak polaczenia z baza danych !");
log_error(AMX_ERR_GENERAL, "Kod bledu: %i", iError);
log_error(AMX_ERR_GENERAL, "Tresc bledu: %s", szError);
}

SQL_FreeHandle(hConnection);
}


Dałem kod razem z SQL_Connect abyście dobrze widzieli w jaki sposób posługiwać się uchwytem do połączenia.

Jak zapewne widać zmian w korzystaniu z SQL_ReadResult i SQL_NextRow nie ma.

Na tym kończę ten tutorial!

Myślę że opisałem najważniejsze rzeczy. Jeśli ktoś chce poznać resztę funkcji które oferuję biblioteka sqlx wystarczy zajrzeć do pliku sqlx.inc który znajduję się w addons/amxmodx/scripting/include. Co prawda po angielsku, ale chyba z jakiejś przyczyny powstały tłumacze internetowe, prawda ? Dobrym punktem odniesienia jest Diablo Mod. Posiada on szereg funkcji dzięki którym możemy majstrować w bazie MySQL.

Wszelkie błędy, niedopowiedzenia oraz literówki lub inne badziewa, proszę zgłaszać w tym temacie.
Wszelka krytyka mile widziana smile.gif


  • +
  • -
  • 31


#723493 Cmod czyli RPG Kit

Napisane przez plx211 w 26.03.2016 18:53

Jak zwykle z gory przepraszam za brak Polskich znakow, oraz ewentualne bledy ortograficzne/interpunkcyjine

Wstep



Chcial bys zalozyc server CodMod, DiabloMod, lub jakis inny?
Ale nie chce ci sie pisac systemu exp'a, item'ow, klas?
Ten plugin (a raczej te pluginy) sa wlasnie dla ciebie
Cmod to zbior pluginów, ktory ulatwi ci szybkie napisanie (a juz w krotce skonfigurowanie) swojego wlasnego RPG Moda.
W aktualnej wersji najbardziej skorzystaja osoby ktore znaja sie na scriptingu w SP, ale obiecuje ze niedlugo to sie zmienni ;)

Zawartosc



Na dzien dzisjejszy w paczce znajdziesz:

  • Cmod_ClassCore plugin odpowiedzialny za klasy (tworzenie, usuwanie, forwardy)
  • Cmod_ExpCore plugin odpowiedzialny za system exp'a
  • Cmod_ItemCore plugin odpowiedzialny za itemy (tworzenie, usuwanie, forwardy)
  • Cmod_SkillCore plugin odpowiedzialny za skille (tworzenie, usuwanie, forwardy)
  • Cmod_PreparedSkill plugin odpowiedzialny za konfiguracjie skilli
  • Cmod_StatsCore plugin odpowiedzialny za statystyki

Roznice od poprzedniej wersji



Kod od ostatniego prototypu zostal napisany kilku krotnie, publikuje ta wersjie ze wzgledu na to ze jestem z niej najbardziej zadowolony (ale czas oceni jak bedzie sie to sprawdzac).
Klasy/itemy z prototypu nie beda dzialac pod ta wersjia!!!

Jaka jest roznica od prototypu?
Miedzy innymi:

  • Rozbicie kodu na odzielnne pluginy
  • Nowa idea
  • Kod oparty na skladni SP 1.7+
  • Prawie wszystkie dane oparte na tablicach dynamicznych (Dzięki ktorym nie trzeba ustawiac limitu klas/itemow/itp.)

Twoja pomoc



Chcesz pomoze w rozwoju, ale nie wiesz co zrobic?
od razu ci powiem ze mile widziane jest:

  • Dolaczenie sie do rozwoju Cmod'a (chetnie będę przyjmowal Pull request)
  • Dawanie propozycji co mozna by stworzyc itp.
  • Zglaszanie bledow z jak najwieksza iloscia informacji
  • Datki

Poradniki



Co jakis czas będę pisal poradnik, ktory bedzie przyblizal ta magie :)
Juz teraz mozesz przeczytac:

Download



Najnowsze wydanie
Kod zrodlowy

Do kompilacji wymagany jest:
SP 1.8+

Changelog:
Spoiler

  • +
  • -
  • 5


#722581 Informacja, opis znajdź sposób.

Napisane przez plx211 w 10.03.2016 08:58

Masz nastepujace mozliwosci:

MOTD (napisales poprzez stronę www dlatego linux zapewnne ci go nie polecil)
Zalety:
- najwieksza mozliwa ilosc danych do wyswietlenia
- mozliwosc formatowania przy pomocy html + css

Wady:
- na csgo sa problemy z odpaleniem, kiedys trzeba bylo wykonac maly trick, nie wiem jak jest teraz
- dosc dlugo sie wlacza
- zaslania prawie caly ekran

Hudcenter:
Zalety:
- nie zaslania tak bardzo ekranu gry (zalezy od ustawiebia skali gui w ustawieniach clienta)
- mozliwosc uzywanua niektorych znacznikow html (na przyklad kolor fontu)
- mozliwosc wywolywania co x czasu uzyskujac cos na krztalt hudmsg z 1.6

Wady:
- ograniczona ilosc znakow
- po pomniejszeniu czcionki maksymalnie 5 linijek moze wyswietlic

Menu:
Zalety:
- lezy w wygodnym miejscu do czytania
- moze nawet calkiem duzo danych pomiescic
- mozna rozbic dane na kilka stron

Wady:
- czasami jest opuznienie w wyswietleniu menu/zmiannie strony
- zbyt duza ilosc textu w jednej linij denerwuje
- blokuje klawisze nuneryczne (jak jest wlaczone nie mozesz np. [1] zmienic broni)
- brak mozliwosci zmianny kolorow (mozna ustaeic dana linije na pomaranczowo lub szaro)

Czat:
Zalety:
- mozliwoac uzycia kolorow (colorchat, ale jest ich chyba z 10 tylko)
- moze przechowac duza ilosc danych

Wady:
- przy duzej ilosci graczy utrudnione czytanie

Konsola:
To samo co czat tylko bez kolorow

Sprite:
Zalety:
- mozliwosc wstawienia obrazkow

Wady:
- trzeba sie nagimnastykowac (sprite wyswietla jedynie obrazki)
- przy duzej ilosci ciezko z wydajnoscia

Pisane z pamieci i z telefonu
  • +
  • -
  • 2


#715985 Paczka ZM EXP by CSnajper

Napisane przez CzilajT w 10.12.2015 00:18

Haha Snajper udostepniaj paczke ktora ma bledy wiecej serwerow z bledami wiecej osob do mnie przyjdzie a przy okazji kazdy plugin mam od nowa tworzony bo twoja sypaly tysiacami bledow 1 log z dnia wazy 20 MB ciekawe nieprawdasz.

Powiedz tez im ze masz dodane w 3 plikach sma  key croling moze nawet nie zauwaza ktos bedzie mial Uprawnienia HeadAdmina co jakis czas zmojej strony to tyle.

 

Niech udostępnia i nie pozwala aby ktoś taki jak ty przywłaszczał sobie czyjąś prace nie przyznawszy się do tego,że naprawdę ty tego nie napisałeś i "zakrywać" się "argumentami" wyciągniętymi z d*py które nie mają najmniejszego sensu,co ma zaśmiecanie logów do przywłaszczania sobie czyjejś pracy? Po swoim wymyślonym "poprawianiu" bo jestem w 100% pewny,że za wiele nie zmieniłeś,piszesz,że paczke ty zrobiłeś mimo iż nawet napisanie misji na zombiaka zajęło by ci rok bo musiałbyś pochłonać wiedzę podstawową o programowaniu której nie posiadasz.

Szkoda wielka,że połowa ludzi z tego serwera przeszła na nowy serwer z powodu twojej osoby po tym jak się dowiedzieli nieco o twojej osobie i jak nam "groziłeś" niczym mały chłopiec ;)


  • +
  • -
  • 2


#719423 [ROZWIĄZANE] Eleminator rorzutó

Napisane przez heniu1111 w 31.01.2016 10:49

Da się do klasy dodać eliminator rozrzutu ale czy plugin taki jest to nie wiem...

Jak dodać do klasy eliminator? 

 

Do

 

 

public plugin_init()

 

 

dodać 

register_forward(FM_PlayerPreThink, "PreThink");
register_forward(FM_UpdateClientData, "UpdateClientData", 1)

I na koniec klasy (na sam dół) dodać

public PreThink(id)
{
if(ma_klase[id])
set_pev(id, pev_punchangle, {0.0,0.0,0.0})
}

public UpdateClientData(id, sw, cd_handle)
{
if(ma_klase[id])
set_cd(cd_handle, CD_PunchAngle, {0.0,0.0,0.0})
}

 

 


  • +
  • -
  • 1