←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Przekazanie ze Stocka wszystkich stringów


Najlepsza odpowiedź Rivit 19.05.2022 18:39

czekaj, ale no w funkcji `tescik` cos nie tak jest. Do tablicy dodajesz tablicę (ArrayPushArray) a w funkcji sortującej wyciągasz dane za pomocą ArrayGetCell, to tutaj też musisz dobrać się do tablicy przez ArrayGetArray i wtedy wybrać po czym sortujesz, czy po stringu, bo tak wnioskuję (wtedy uzyc jakiegos strcmp), czy po liczbie (wtedy zwykłe porównanie). Tak więc nie oczekiwałbym, że po bezmyślnym przekopiowaniu kodu z dokumentacji zacznie wszystko magicznie działać.

 

Jak dasz w pełni działający fragment kodu, to Ci to mogę zrobić. Mam na myśli jakis mini-plugin, który będzie miał już wypełnione dane i trzeba będzie posortować je, ale no idziesz w dobrym kierunku.

 

Pamiętaj, że jak tworzysz tablicę lokalnie przez ArrayCreate, to trzeba wywołać dla niej ArrayDestroy.

Przejdź do postu

  • +
  • -
mlekovita - zdjęcie mlekovita 17.05.2022

Siemanko mam pytanie do kodu - jak odebrać wszystkie stringi(nazwy itemow) z tablicy które maja id = 2?

 

stock get_info(id, return[] = "", length)
{
	static item[itemsInfo];
	for(new i=0; i<ArraySize(items); i++) {
		ArrayGetArray(items, i, item);
	
		if(id == itemsId[i]) // sprawdza czy id ze stocka jest rowne identyfikatorom z tablicy // {"Nazwa", 2}, {"Innanazwa", 2}
		{
		copy(return, length, item[ITEM_NAME]); // Jesli tak to kopiuje nazwy do tablicy return
		return 0;
		}
	}
	
	return item[ITEM_NAME]; // wyswietla zawartosc skopiowanej tablicy
}


public tesscik(id){
	new cos[64];
	get_info(2, cos, charsmax(cos));
	client_print(id, print_chat, "%s", cos);
}


POWYŻSZY kod wywolany za pomoca funkcji tesscik pokazuje jeden rekord , a co jakbym chciał wyświetlić wszystkie które maja ten sam id? Bo co ciekawe jeżeli zrobię pętle która będzie wyglądać tak:

 

for(new i=0; i<ArraySize(items); i++) {
	get_info(2, cos, charsmax(cos));
	client_print(id, print_chat, "%s", cos); // powinno wyswietlic wszystkie nazwy ktore maja id 2
}

TO: zostanie wyświetlona ta sama nazwa kilka razy. Więc jak ją zmodyfikować by wyświetliło wszystkie?


Użytkownik mlekovita edytował ten post 17.05.2022 11:53
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 17.05.2022

Można to zrobic na kilka sposobów. Np. W pętli gdzie wołasz get_info musisz zadeklarować tablicę tablic (czyli tablica 2d), potem zmodyfikowac tak get_info, żeby każdy item wpisywało do kolejnej tablicy, a potem przelecieć pętlą po wszystkich tablicach i wypisać.

 

Inna opcja to zrobić funkcję podobną do get_info, ale ona nie będzie zwracać a wypisywać od razu.

Odpowiedz

  • +
  • -
mlekovita - zdjęcie mlekovita 17.05.2022

A koniec koncow jak takie cos posortowac od najmniejszej do najwiekszej?

Nazwa = 1
Innanazwa = 2
Innainna = 3
Użytkownik mlekovita edytował ten post 17.05.2022 21:20
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 17.05.2022

Były chyba jakieś funkcje do sortowania:

ArraySort

SortCustom2D

 

Zależy też po czym chcesz sortować, czy po jakiejś liczbie czy łańcuchu znaków.

Odpowiedz

  • +
  • -
mlekovita - zdjęcie mlekovita 19.05.2022

W sumie to zrobilem taki kod ale niestety on nie sortuje tylko dla sprawdzenia wyswietlilem komorke 0 z Array i jest 1 a potem leca dziwne liczby (1, 50, 100532, 182878124, 16, 0)
 
[[Tak wyglada tablica ktora nalezy posortowac:
itemm[0] = 23,
itemm[1] = 5,
itemm[2] = 1,
itemm[3] = 7,
itemm[4] = 11,
itemm[5] = 12
]]
public tescik(id) {
	new itemm[6];
	new temp[8];
	new Array:tablica = ArrayCreate(64);
	for(new i=0; i<ArraySize(items); i++)
	{
		get_info(i, 3, itemm, charsmax(itemm));
		ArrayPushArray(tablica, itemm);
	}
		ArraySort(tablica, "malejaco");
	
for(new j=0; j<ArraySize(items); j++) {
		ArrayGetArray(tablica, j, temp);
}
		client_print(id, print_chat, "%d, %d, %d, %d, %d, %d", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]);
		ArrayDestroy(tablica);
}

public malejaco(Array:a, item1, item2){
	if(ArrayGetCell(a, item1) < ArrayGetCell(a, item2))return 1;
	if(ArrayGetCell(a, item1) > ArrayGetCell(a, item2))return -1;
	return 0;
}

 


Użytkownik mlekovita edytował ten post 19.05.2022 15:33
Odpowiedz

  • +
  • -
mlekovita - zdjęcie mlekovita 19.05.2022

Pisze nowy post bo tego nie da sie edytować: Otoz nie potrafie zrobic sortowania zeby Nazwa  to bylo 1, Inna nazwa to 5 itd. (od najmniejszej do najwiekszej). Ponizszy kod tworzy takie tablice:
 

itemm[0][0] = "Nazwa",
itemm[0][1] = "Inna nazwa",
itemm[0][2] = "costam",
itemm[0][3] = "test",
itemm[0][4] = "testcos",
itemm[0][5] = "cosiktam"
 
itemm[1][0] = 23,
itemm[1][1] = 5,
itemm[1][2] = 1,
itemm[1][3] = 7,
itemm[1][4] = 11,
itemm[1][5] = 12
 
public tescik(id) {
	new dane[10][2][32];
	
	for(new i=0; i<ArraySize(items); i++)
	{
		get_info(i, 0, itemm[i][0], charsmax(itemm));
		get_info(i, 1, itemm[i][1], charsmax(itemm));
			client_print(id, print_chat, "%s, %d", dane[i][0], dane[i][1]);
	}
}

 

Odpowiedz

  • +
  • -
Najlepsza odpowiedź Rivit - zdjęcie Rivit 19.05.2022

czekaj, ale no w funkcji `tescik` cos nie tak jest. Do tablicy dodajesz tablicę (ArrayPushArray) a w funkcji sortującej wyciągasz dane za pomocą ArrayGetCell, to tutaj też musisz dobrać się do tablicy przez ArrayGetArray i wtedy wybrać po czym sortujesz, czy po stringu, bo tak wnioskuję (wtedy uzyc jakiegos strcmp), czy po liczbie (wtedy zwykłe porównanie). Tak więc nie oczekiwałbym, że po bezmyślnym przekopiowaniu kodu z dokumentacji zacznie wszystko magicznie działać.

 

Jak dasz w pełni działający fragment kodu, to Ci to mogę zrobić. Mam na myśli jakis mini-plugin, który będzie miał już wypełnione dane i trzeba będzie posortować je, ale no idziesz w dobrym kierunku.

 

Pamiętaj, że jak tworzysz tablicę lokalnie przez ArrayCreate, to trzeba wywołać dla niej ArrayDestroy.

Odpowiedz

  • +
  • -
mlekovita - zdjęcie mlekovita 19.05.2022

udało się! dzięki za pomoc :D


Użytkownik mlekovita edytował ten post 19.05.2022 19:28
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 19.05.2022

Ja już nie wiem co Ty chcesz osiągnąć. Robisz ArrayPushArray lub String a w sortowaniu robisz ArrayGetCell....

 

Nie rozumiem też po co własne sortowanie zrobiłeś jak ArraySort robi dokładnie to samo :P

Odpowiedz

  • +
  • -
mlekovita - zdjęcie mlekovita 19.05.2022

Bo ArraySort nie sortuje dwóch różnych tablic dynamicznych (String, num) a nie wiedzialem jak posortować to w jednej :P

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 20.05.2022

Możesz w funkcji sortującej pobrać ArrayGetArray zamiast ArrayGetCell lub ArrayGetString. Po to masz zmienne "item1" i "item2", to są indexy aktualnie porównywanych elementów.

Generalnie twój problem byłby już dawno rozwiązany, gdybyś przy tworzeniu tematu opisał go lepiej i dał jakiś "żywy" przykład tego, co chcesz osiągnąć. Nikt tutaj nie jest maszyną i raczej nikt nie chce się domyślać o co chodzi poprzez czytanie tematu napisanego językiem oficjalnym lub tak, że sam się w tym gubisz. Tl;dr - Mów co ci trzeba, a nie pier**lisz :P
Odpowiedz

  • +
  • -
mlekovita - zdjęcie mlekovita 20.05.2022

No w sumie to napisałem wszystko co chciałem (Sortowanie listy itemow wzgledem szans na dropnięcie) osiągnąć tylko jakbyś mógł pokazać testowy kod jak ma sie to odnieść do całości bo nie rozumiem tego ArraySort
 

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 20.05.2022

Sortowanie struktury:
 

Spoiler

 
Co daje nam:
Spoiler

Użytkownik Robiin edytował ten post 20.05.2022 17:41
Odpowiedz