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
 

pro100wHS - zdjęcie

pro100wHS

Rejestracja: 11.03.2014
Aktualnie: Nieaktywny
Poza forum Ostatnio: 09.07.2015 09:09
-----

Moje tematy

[ROZWIĄZANE] Źle przekazywany argument w natywie

29.06.2015 09:23

Mam 2 pluginy:

1. adminchat

2. własny plugin od zarządzania wiadomościami

 

Adminchat ma za zadanie wysłać za pomocą natywu ID gracza co użył adminchata oraz wiadomość. Problemów w wiadomością nie mam, ale źle przekazuje ID. Wstawiałem sobie w obu pluginach funkcję od wychwytywania jakie ID jest wysyłane i jakie odbierane. Wyniki:

- w adminchat wysyła 1 (poprawnie)

- w drugim pluginie odbiera 11 (zła wartość)

 

Czy może macie jakieś pomysły co to wywołuje? Jak to rozwiązać? Nie wchodzi w grę opcja id=id-10

 

Kod z adminchata:

native przechwyc_tekst(id, wiadomosc[])


public cmdSayAdmin(id)
{
	new said[2];
	read_argv(1, said, 1);
	
	if(said[0] != '@')
	return PLUGIN_CONTINUE;
	
	new message[192], name[32], authid[32], userid;
	new players[32], inum;
	
	read_args(message, 191);
	remove_quotes(message);
	get_user_authid(id, authid, 31);
	get_user_name(id, name, 31);
	userid = get_user_userid(id);
	
	log_amx("Chat: ^"%s<%d><%s><>^" chat ^"%s^"", name, userid, authid, message[1]);
	log_message("^"%s<%d><%s><>^" triggered ^"amx_chat^" (text ^"%s^")", name, userid, authid, message[1]);
	
	if(is_user_admin(id))
	{
		ColorChat(id, GREEN, "(%s) %s : %s", "ADMIN", name, message[1]);
	}
	else
	{
		ColorChat(id, GREEN, "(%s) %s : %s", "GRACZ", name, message[1]);
	}

	get_players(players, inum);
	
	for(new i=0; i<inum; ++i)
	{
		if(players[i] != id && get_user_flags(players[i]) & g_AdminChatFlag)
		{
			ColorChat(players[i], GREEN, "(%s) %s : %s", is_user_admin(id) ? "ADMIN" : "GRACZ", name, message[1]);
			#if defined SOUND
			client_cmd(players[i],"mp3 play sound/beep-07.mp3");
			#endif
		}
	}
	przechwyc_tekst(id, message)
	return PLUGIN_HANDLED;
}

kod natywu w drugim pluginie:

public plugin_natives()
{
	register_native("przechwyc_tekst", "przechwytywanie");
}
public przechwytywanie(id, wiadomosc[])
{
	if(!plugin_wlaczony)
		return 0;
	if(typ != 1)
		return 0;
	new wiad[150]
	
	get_string(2, wiad, 149)
	
	//log_to_file("addons/amxmodx/logs/testy.txt", "PRZECHWYCILEM: %s, ID: %i", wiad, id);
	if(containi(wiad, od_przechwytywania[wybrane_pytanie][0]) != -1 ) 
	{
		
		new nod[4], nock[40]
		get_user_name(id, nock, 39)
		num_to_str(id_drzewka, nod, 3)
		TrieSetString(nicki,nod,nock)
		TrieSetString(odpowiedzi,nod,wiad)
		id_drzewka++
		return 0
	}
	return 0 
}

[KOSZ] problem z set_user_gravity oraz z float.inc::operator

07.01.2015 13:51


L 01/07/2015 - 03:52:35: Start of error session.
L 01/07/2015 - 03:52:35: Info (map "de_dust2x2") (file "addons/amxmodx/logs/error_20150107.log")
L 01/07/2015 - 03:52:56: [FUN] Invalid player 10
L 01/07/2015 - 03:52:56: [AMXX] Displaying debug trace (plugin "QTM_CodMod.amxx")
L 01/07/2015 - 03:52:56: [AMXX] Run time error 10: native error (native "set_user_gravity")
L 01/07/2015 - 03:52:56: [AMXX]    [0] float.inc::operator*(Float:,_:) (line 108)
L 01/07/2015 - 03:52:56: [AMXX]    [1] QTM_CodMod.sma::Odrodzenie (line 345)

Zacznę od funkcji publicznej Odrodzenie. 

 

public Odrodzenie(id)
{ 
  set_user_gravity(id, 1.0-(grawitacja_gracza[id]*0.0004411764));//ta liczba po przecinku to wspolczynnik zmiany grawitacji

  if(!task_exists(id+ZADANIE_POKAZ_INFORMACJE))
    set_task(0.1, "PokazInformacje", id+ZADANIE_POKAZ_INFORMACJE, _, _, "b");

  if(nowa_klasa_gracza[id])
    UstawNowaKlase(id);


  if(!klasa_gracza[id])
  {
    WybierzKlase(id);
    return PLUGIN_CONTINUE;
  }


  DajBronie(id);
  ZastosujAtrybuty(id);

  if(poziom_gracza[id] < min_lvl)
  {
    client_print(id,print_chat,"[Cs-wakacje.p] Wykrylem duze problemy z balansem lvli na serwerze");
    client_print(id,print_chat,"[Cs-wakacje.p] W ramach tego dostales %i LVL na start",min_lvl);
    UstawDoswiadczenie(id,PobierzDoswiadczeniePoziomu(min_lvl)+1);
    poziom_gracza[id] = min_lvl;
    SprawdzPoziom(id);
  }
  if(punkty_gracza[id] > 0)
    PrzydzielPunkty(id);


  return PLUGIN_CONTINUE;
}

Jedyny natyw z biblioteki fun to jest właśnie set_user_gravity. Teraz(pisząc ten temat) wpadłem na zastosowanie warunku:

if(is_user_alive(id) && !is_user_bot(id) && !is_user_hltv(id))
{
  set_user_gravity(id, 1.0-(grawitacja_gracza[id]*0.0004411764));//ta liczba po przecinku to wspolczynnik zmiany grawitacji
}

Chyba powinno to rozwiązać problem z invalid player, tak?

 

Przejdźmy dalej- co dokładnie oznacza ten błąd:

 

float.inc::operator*(Float:,_:)

Wywala go w linii :

new limitzdrowie = 500;

Nie wiem co za błąd tu widzi... Czy może jednak to jest problem związany z mnożeniem przez 0 w set_user_gravity? Jeżeli tak to można by to naprawić takim kodem:

if(is_user_alive(id) && !is_user_bot(id) && !is_user_hltv(id))
{
set_user_gravity(id, 1.0-(float(grawitacja_gracza[id]+1)*0.0004411764));//ta liczba po przecinku to wspolczynnik zmiany grawitacji
}

Tu najbardziej mnie będzie dręczyła niedokładność w liczbie zmiennoprzecinkowej. ..

 

Nie chcę eksperymentować tego, co wyżej napisałem bezpośrednio na serwerze, żeby czegoś więcej nie schrzanić. 

 

Załączam kod całego pluginu. 

 

Z góry dzięki za pomoc :)

 

Załączony plik  QTM_CodMod.sma   48,79 KB  32 Ilość pobrań
  QTM_CodMod.amxx

Problem z floatround

29.12.2014 13:51

Witam. Zbytnio się nie bawiłem z liczbami zmiennoprzecinkowymi, ale postanowiłem zacząć.

Zacznę od omówienia do czego ma to służyć. Każdy gracz posiada posiada pewną zmienną(załóżmy np. poziom[33]). Zmienna ta przyjmuje wartość od 0 do 400. Wartość ta jest liczbą całkowitą. Chciałem, aby na podstawie tej zmiennej graczowi była przypisywana ranga. Stworzyłem więc takie "cudo":

new const ranga[6][]={
"Ranga I",
"Ranga II",
"Ranga III",
"Ranga IV",
"Ranga V",
"Ranga IV"
}

Następnie w hudzie dałem wyświetlanie tej rangi w zależności od wartości zmiennej poziom[id]. Otrzymałem takie coś:

ShowSyncHudMsg(id, SyncHudObj, ".:|Stopien : %s|:.", ranga[floatround((poziom[id]+1)/100, floatround_ceil)]);

Dałem tam poziom[id]+1, żeby nie było dzielenia 0 przez 100

 

Oraz patrząc na budowę floatround widać, że dałem zaokrąglanie w górę. Teoretycznie, jeżeli zmienna poziom[id] przyjmie wartość np.  300 to floatround powinno zwrócić 4. Tak się jednak nie dzieje, bo non stop przy zmiennej poziom[id] większej niż 100 zwraca tę samą wartość(nie zmienia się ranga). Postanowiłem więc pominąć wyświetlanie rangi, ustalić stałą wartość pod poziom[id] oraz zmienić formatowanie tekstu(na wyświetlanie liczb). Otrzymałem więc:

ShowSyncHudMsg(id, SyncHudObj, ".:|Stopien : %d|:.", floatround((300+1)/100, floatround_ceil));

Wyświetliło:

 

.:|Stopien : 1|:.

I proszę mi powiedzieć, jaki ja tu błąd zrobiłem? floatround konstruowałem wg dokumentacji amxx

[Błąd] Nie wyświetla menu po wpisaniu komendy

08.09.2014 12:30

Mam mały problem dotyczący menu. Plugin wydaje się być dobrze napisany, w kompilatorze brak errorów, na serwie nie ma logów dot tego pluginu, a jednak nie działa.

 

Plugin to menu serwera, czyli dane kontaktowe, dostępne komendy itd. Załączam sma.

 

Proszę o wskazanie błędów, dlaczego po wpisaniu na serwie /menu nie wyświetla ów menu

Problem ze statystykami i natychmiastowym zabijaniem(1/x z broni)

22.07.2014 10:26

Witam.

Jeżeli zły dział to z góry przepraszam, ale tak na prawdę ten temat nadaje się do działu pytania jak i problemy.

Ostatnio chciałem zmienić w statystykach pewną zależność. Normalnie 1ptk w zdrowie dodaje 1HP. Ja chciałem to zmienić na:

2ptk = 1 HP

 

Znalazłem sobie linijkę od tego:

maksymalne_zdrowie_gracza[id] = 100.0+PobierzZdrowie(id, 1, 1, 1);

Zmieniłem na:

maksymalne_zdrowie_gracza[id] = 100.0+PobierzZdrowie(id, 1, 1, 1)*0,5;

Odpaliłem to, w miarę działało. Dlaczego w miarę? Podstawowe punkty w zdrowie zdefiniowane bezpośrednio w klasie dawało na zasadzie 

1ptk=1hp

natomiast punkty przydzielane przez gracza

2ptk=1hp

 

Nie było to dla mnie uciążliwe, bo te kilka hp w te czy we wte nie robiło dla mnie różnicy. Problem się zaczął jak ktoś miał np. 1/1 z awp. Perk(ten który dawał 1/1 z AWP) dziwnym trafem traktował punkty w zdrowie zdefiniowane bezpośrednio w  klasie jak i zdrowie przydzielone przez gracza jednakowo, czyli 

2 ptk = 1 hp.

 

Tak więc nie zabierało wystarczająco hp przeciwnikowi. Powodowało to, że przeciwnik nie dednął, a przekręciła mu się kamerka na bok(tak jak by padł). Mógł natomiast strzelać i chodzić. 

 

Można by oczywiście przerabiać pluginy dające 1/x z broni, ale byłoby to trochę uciążliwe. Teraz pytanie, jak rozwiązać ten problem, żeby edytować co najwyżej silnik.

 

Aby nie szukać załączam link do podstawowego silnika codmod by QTM_Peyote.

 

http://amxx.pl/topic...-mw-mod-update/

 

Za pomoc z góry dzięki. Odwdzięczę się plusami(nie tylko jednym).