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
 

Robiin - zdjęcie

Robiin

Rejestracja: 26.12.2015
Aktualnie: Nieaktywny
Poza forum Ostatnio: dziś, 20:13
*****

#760521 Natyw zwraca tylko 1 literę

Napisane przez Robiin w 09.08.2019 16:24

Nie mam pojęcia skąd ten kod wytrzasnąłeś i dalczego był napisany w ten sposób, ale był zły.
 

Spoiler


  • +
  • -
  • 1


#760517 Natywy - zrozumienie API w amxxie

Napisane przez Robiin w 09.08.2019 15:46

Poprzedni tutorial napisany w tym temacie przez R3X był nieco pomieszany i moim zdaniem skupiał sie na niepotrzebnych elementach.
 
Czym są natywy?
 
Kluczowym elementem programowania jest API, którym w AMXXie są natywy.
Natywy to sposób komunikacji pomiędzy dwoma pluginami.
 
Pluginy podzielę na dwa typy:

  • Plugin źródłowy - ten, w którym tworzymy natywy i ich działanie
  • Plugin docelowy - ten, w którym będziemy używać natywów

Dzięki natywom możemy z pluginu źródłowego pobrać dane w pluginie docelowym lub je dowolnie modyfikować.
Przykładem idealnie odwzorowującym zasadę działania natywów jest exp mod.
Plugin exp moda może mieć w sobie zmienne pokroju

  • userExp - zmienna, która przechowuje ilość expa, którą dany gracz posiada
  • userLevel - zmienna, która przechowuje poziom gracza

Co jeśli chcemy wiedzieć jaki poziom ma gracz, lub ile ma expa?
Nie ma najmniejszego problemu w pluginie exp moda - w końcu mamy zmienne userExp i userLevel, ale co jeśli chcemy wiedzieć ile gracz ma expa i potrzebujemy tych danych w innym pluginie?
 
Z odpowiedzią przychodzą natywy - jak już wcześniej wspomniałem, pozwalają nam na komunikacje między pluginami.
 
 
Jak wykorzystać natywy?
 
Mimo, że w tutorialu rexa wydawało się to bardzo skomplikowane, natywy są bardzo proste w swojej zasadzie działania.
 
Prosty przykład, jak pobrać jakąś wartość z innego pluginu:
 
Plugin źródłowy:

#include <amxmodx>

#define AUTHOR "aSior - amxx.pl/user/60210-asiorr/"

new const jakasWartosc = 7;

public plugin_init()
{
	register_plugin("x", "v0.1", AUTHOR);
}

// Natywy musza byc rejestrowane w plugin_natives za pomocą register_native.
public plugin_natives()
{
	// Rejestracja natywu o nazwie "pobierzWartosc", który wykona funkcję "publicNatywuPobierzWartosc".
	register_native("pobierzWartosc", "publicNatywuPobierzWartosc");
}

// Co się wykona, kiedy w innym pluginie zostanie użyte pobierzWartosc.
public publicNatywuPobierzWartosc()
{
	return jakasWartosc;
}

 
Plugin docelowy:

#include <amxmodx>

#define AUTHOR "aSior - amxx.pl/user/60210-asiorr/"

native pobierzWartosc();

public plugin_init()
{
	register_plugin("x", "v0.1", AUTHOR);

	new wartosc = pobierzWartosc();

	log_amx("Wartosc = %i", wartosc); // "Wartosc = 7"
}

 
 
Pliki .inc
 
Pliki z roszerzeniem 'inc' to nic innego jak pliki tekstowe, które zawierają zbiór natywów (i nie tylko).
Jak wygląda plik .inc w pluginie dodającym nową walutę:

#if defined _moneySystem_included
	#endinput
#endif

#define _moneySystem_included

native SetMoney(id, value);
native GetMoney(id);
native AddMoney(id, value);

Po krótce: pliki .inc są używane po to, żeby za każdym razem nie pisać 15 linijek z "native SetMoney(id, value);" i całą resztą natywów.

 

Na co pozwalają natywy

 

Dzięki nim wiemy jaki gracz ma poziom, exp, ile ma AP, JBPacków czy jaką ma klasę. To tylko powierzchowne przykłady, a natywy mogą zostać wykorzystane na tak wiele sposobów, że kiedy je lepiej poznamy, otwierają nam się drzwi na tak wiele opcji zaprogramowania pluginu, że ogranicza nas już tylko wyobraźnia.

 

 

 

Co dalej?

 

Jeśli dopiero nauczyłeś się czym są natywy - idź spróbuj sam. Oczywiście po przeczytaniu tego nie masz prawa zrozumieć wszystkiego ot tak, ale z drugiej strony nikt nie będzie Cię trzymał za rączkę.

Podrzucam parę tematów, z których można wyciągnąć informacje o tym, jak natywy zostały użyte w praktyce:

Cod mod

Jailbreak

Zombie

 

 

Po przeczytaniu różnych kodów nadejdzie czas na zapoznanie się z takimi rzeczami jak:

  • Style natywów
  • Typy danych zwracane przez natywy
  • Formatowanie napisów / działanie na tablicach w natywach

 

Do podglądu zostawiam również stronę dokumentacji: register_native.


  • +
  • -
  • 14


#760515 Natyw zwraca tylko 1 literę

Napisane przez Robiin w 09.08.2019 14:42

W amxxie nie możesz zwrócić więcej niż jednej wartości. Dlatego właśnie tworzymy osobną zmienną i robimy get_user_name(indeks, zmienna, charsmax(zmienna)) - przypisujemy nick gracza do 'zmienna' funkcją get_user_name i w ten sposób nie musimy nic zwracać.

 

Zamiast

return aData[GangName]

daj

set_string(2, aData[GangName], 32);

A w argumentach natywu zamiast

g_nazwa_gildi(id)

daj

g_nazwa_gildi(id, output[], outputSize);

  • +
  • -
  • 2


#760500 Pytanie o hosting

Napisane przez Robiin w 08.08.2019 22:37

W 2019 roku pukawka i 1s1k to moim zdaniem jedyne sensowne opcje, jakie pozostały. Które wybierzesz zależy od ciebie.

Moje odczucia co do tych dwóch:

  • 1shot1kill - stabilniejsze, przejrzyste, bardzo łatwo się odnaleźć jeśli wiesz czego szukasz, support bez języka oficjalnego, lepsza konsola
  • pukawka - beginner-friendly, spory wybór ofert, mysql w cenie, ładnie rozłożone zakładki na stronie

 

Żadne z tych nie jest idealne, ale mimo wszystko ja bym szedł w 1s1k.


  • +
  • -
  • 2


#760489 Błąd HUD

Napisane przez Robiin w 08.08.2019 11:56

Możesz spróbować jeszcze tego, powinno pomóc na /hud i zmniejszyć częstotliwość zanikania hudu.

Załączone pliki


  • +
  • -
  • 1


#760487 Błąd HUD

Napisane przez Robiin w 08.08.2019 11:49

U mnie w grze wygląda to tak:

 

26ffWxN.jpg

 

Nawet napisałem w pythonie skrypt, żebym czegoś przypadkiem nie przeoczył:

 

fgXpbHR.jpg

 

Jak widzisz, działa dobrze. Pokazuje Ci Silver I i nazwę serwera, bo coś jest powalone z indeksami. Dla indeksu == 0 nick będzie nazwą serwera, a statystyki z get_user_stats będą == 0, więc i funkcja getRankIndex zwróci 0, co za tym idzie wyświetli rangę Silver I.

 

 

 

 

Co do /hud:

set_hudmessage(0, 85, 255, 0.0, 0.17, 0, 6.0, 12.0, 0.1, 0.1);

12.0 odpowiada za czas, jaki wiadomośc będzie się utrzymywała na hudzie.


  • +
  • -
  • 1


#760484 Przekazywanie danych w menu / Tworzenie menu z nickami graczy

Napisane przez Robiin w 08.08.2019 11:24

W związku z przestarzałym tematem i kodem, który ciągle widzę, że się pojawia:

Spoiler

 

Dodaję na szybko wam snippet, który wygląda ładniej i generalnie nie używa starych metod:

 

Przekazywanie indeksu gracza AMXX 1.8.3 i niżej:

Spoiler

 

Przekazywanie indeksu gracza AMXX 1.9 i wyżej:

Spoiler

 

 

Opcja jeszcze krótsza:

Spoiler

 

Przekazywanie wielu wartości w menu:

Spoiler

 

Przekazywanie dwóch stringów:

Spoiler

 


  • +
  • -
  • 12


#760339 Plugin liczący fragi z każdej broni osobno

Napisane przez Robiin w 03.08.2019 19:50

Jeśli znajdziesz kogoś, kto Ci to napisze, to nie ma przecież żadnej filozofii;

  • Deklaracja zmiennej userStatTrak[33][33];
  • Rejestracja eventu zabicia;
  • Pobieranie id broni zabójcy;
  • userStatTrak[killer][weaponIndex]++;
  • Zapis do MySQL

To wszystko można zrobić w godzinę albo i pół. Na pewno znajdziesz też gotowce.


  • +
  • -
  • 1


#760338 Mieszanie się rekordów mysql.

Napisane przez Robiin w 03.08.2019 19:43

W ReadData robisz escape string na pustej zmiennej 'name', a używasz nazwa_gracza, która jeszcze nie jest 'przerobiona', bo ReadData wykonuje się od razu po połączeniu. Jeśli to nie to, będziemy szukać dalej.

 

Zmienna nazwa_gracza jest tablicą jednowymiarową - przechowa najwyżej jeden napis.

Zmień deklaracje z

new nazwa_gracza[64]

na

new nazwa_gracza[33][64]

a przy pobieraniu nazwy rób

get_user_name(id, nazwa_gracza[id], charsmax(nazwa_gracza[]));
public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size)
{
	if(failstate != TQUERY_SUCCESS)
	{
		return PLUGIN_CONTINUE;
	}
	return PLUGIN_CONTINUE;
}

^ empty statement / bezsensowny statement


  • +
  • -
  • 1


#760334 Dodanie "Postęp X/X" i zmiana "Fragi" oraz "Ranking"...

Napisane przez Robiin w 03.08.2019 16:31

105 linijka na


		return i - 1;

  • +
  • -
  • 1


#760330 Kolor hud

Napisane przez Robiin w 03.08.2019 14:37

Spoiler

 

Like that?


  • +
  • -
  • 1


#760328 Dodanie "Postęp X/X" i zmiana "Fragi" oraz "Ranking"...

Napisane przez Robiin w 03.08.2019 14:12

Nie pisz mi wiecej na PW, sam zobaczę temat jak będę miał czas.

 

Nie sprawdzałem, nie testowałem.

Załączone pliki


  • +
  • -
  • 1


#760289 Poszukiwane serwery i nie tylko

Napisane przez Robiin w 01.08.2019 15:06

Wenti i granie fair-play, wzajemny szacunek i wysoka jakość - przecież to się nie trzyma kupy :)

 

I co się stało z waszym zombie? Kiedyś był fajny.


  • +
  • -
  • 1


#760265 [ROZWIĄZANE] Pytanie odnoście MYSQL

Napisane przez Robiin w 31.07.2019 19:55


Jeszcze jedno, jak zapisać stringa w sql i go odczytać?

 

Przecież już zapisujesz - nick. 

// Tworzenie tabeli:
CREATE TABLE IF NOT EXISTS `tableName` (`userName` VARCHAR(33), `someValue` INT(10), `someOtherValue` VARCHAR(33));

// Insertowanie wartości:
INSERT INTO `tableName` (userName, someValue, someOtherValue) VALUES ('abcd', '0', 'efgh');

// Pobieranie wartości:
SELECT * FROM `tableName` WHERE `userName` = 'abcd';

// Aktualizowanie wartości:
UPDATE `tableName` SET `someValue` = '1' WHERE `userName` = 'abcd'; 

Wszystkie zapytania powinny kończyć się średnikiem. Zapytania w kodzie możesz rozbijać na sekcje wieloliniowe poprzez użycie backslasha (\) na końcu linii (niektóre edytory tekstu mogą wywalać błąd, że string nie został zakończony [bo edytor nie znajdzie " na końcu linijki], ale tym się nie przejmuj). Robisz to tak:

format(mysqlRequest, charsmax(mysqlRequest),
						"INSERT INTO `tableName`\
						(userName, someValue, someOtherValue)\
						VALUES ('abcd', '0', 'efgh'");

Możesz odczytywać konkretne wartości zamiast wszystkich:

Odczyt wszystkich rekordów względem wartości 'someValue' jeśli jest >= 0:

SELECT * FROM `tableName` WHERE `someValue` >= '0';

Odczyt konkretej wartości rekordów, których wartość someOtheValue jest równa "efgh":

SELECT `userName` FROM `tableName` WHERE `someOtherValue` = 'efgh';

Ważna jest ta funkcja i to, żebyś wiedział co tak naprawdę robi:

stock mysql_escape_string(output[], len)
{
	static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" };
	static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" };
	for(new i; i < sizeof szReplaceIn; i++)
		replace_all(output, len, szReplaceIn[i], szReplaceOut[i]);
}

Jest to zabezpieczenie przed mysql injection.

 

 

Usprawnienie tworzenia tabeli:

CREATE TABLE IF NOT EXISTS `tableNane`
(
    `userName` VARCHAR(33) NOT NULL PRIMARY KEY ,
    `someValue` INT(10) NOT NULL UNSIGNED,
    `someOtherValue` VARCHAR(33) NOT NULL
);
Spoiler

  • +
  • -
  • 1


#760256 Zabezpieczenie na modele i mapy

Napisane przez Robiin w 31.07.2019 16:50

Można jakoś zabezpieczyć się przed skopiowaniem modelu/mapy przez graczy?

Wiem, że gracze muszą mieć plik po swojej stronie, ale czy można jakoś uniknąć skopiowania

W grę wchodzi możliwość wykonywania poleceń na graczu (bez ograniczeń, chodzi o komendę np. nadpisującą plik), zależy mi tylko na uniknięciu skopiowania pliku lub zablokowaniu możliwości użycia go na innych serwerach.


  • +
  • -
  • 1