Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

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
 

Zdjęcie

[ROZWIĄZANE] SQL_ThreadQuery do każdej tabeli osobno - mała wydajność?Jak temu zaradzić?


  • Zamknięty Temat jest zamknięty
20 odpowiedzi w tym temacie

#1 oeN.

    Wszechwidzący

  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 28.06.2015 18:23

Witam,

 

Mam w bazie 5 tabel, w każdej są dane gracza, by je wczytać używam takiego kodu (jest to jeden z 5):

public CheckData(id) {
	if(!gConnected) return
	
	new Data[1]
	Data[0] = id
	new qCommand[512], szName[64]
	get_user_name(id, szName, charsmax(szName))
	
	[...]
	
	format(qCommand, charsmax(qCommand), "SELECT * FROM `AK47` WHERE `nick` = '%s'", szName)
	SQL_ThreadQuery(gTuple, "CheckHandlerAK47", qCommand, Data, 1)
	
	[...]
	
	[...]
	
	[...]
	
	[...]
}
public CheckHandlerM4A1(FailState, Handle:Query, Error[], Errorcode, Data[], DataSize)
{
	new id = Data[0]
	if(Errorcode)
		log_amx("Blad w zapytaniu: %s [CheckDataM4A1]", 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 [CheckDataM4A1]")
		return PLUGIN_CONTINUE
	}
	
	if(SQL_MoreResults(Query)){
		pM4A1[id][1] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Cyrex"))
		pM4A1[id][2] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "DragonKing"))
		pM4A1[id][3] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Assimov"))
		pM4A1[id][4] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "Nuclear"))
	}
	
	return PLUGIN_CONTINUE;
}

No i teraz, jak wejdzie nagle 30 osób po zmianie mapy, to trochę to mija zanim wszystko się załaduje. Druga sprawa to zapis, potrafi nieźle namieszać i komuś się nie zapisze.

public SaveData(id) {
	if(!gConnected || !Loaded[id]) return
	
	new Data[1]
	Data[0] = id
	new qCommand[768], szName[64]
	get_user_name(id, szName, charsmax(szName))
	
	[...]
	
	[...]
	
	format(qCommand, charsmax(qCommand), "UPDATE M4A1 SET Cyrex='%d', DragonKing='%d', Assimov='%d', Nuclear='%d' WHERE nick='%s'", pM4A1[id][1], pM4A1[id][2], pM4A1[id][3], pM4A1[id][4], szName);
	SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
	
	[...]
	
	[...]
	
	[...]
}

I teraz przez to wszystko, dawanie banów na serwerze trwa nawet kilka minut (Amxbans). Jakieś pomysły jak to zoptymalizować?


Użytkownik oeN. edytował ten post 28.06.2015 18:24

  • +
  • -
  • 0

#2 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 466
Wszechobecny

  • Postów:2448
Offline

Napisano 28.06.2015 20:48

Kiedyś Gwyn pisał, że lepiej zbierać info o wchodzących i wychodzących i jeden raz na końcu mapy wykonać zapytanie. Raz, a porządnie, co do wczytki to już się tak nie da. Gdzieś był ten tutorial piękny :X


  • +
  • -
  • 0

Sprzedam Paczkę CoD pod CS 1.6 (JEST WIELE WERSJI DO WYBORU TEJ PACZKI) na lvl od 201 - 601

Silnik (8 nowych statystyk, poprawiony zapis, dodatkowy exp, pozbyto się CurWeapon). Ponad 100 perków (do wyboru do koloru). Sklep, NOWE MISJE (QUESTY), premium i super premium, AUKCJE, KLANY, zapis nVault, 4 zestawy modeli bronii do wyboru!

JESTEŚ ZAINTERESOWANY KUPNEM? NAPISZ WIADOMOŚĆ DO MNIE!


#3 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 28.06.2015 20:59

Może jednak dało by rade coś w tym stylu zrobić? Ktoś coś wie na ten temat więcej?


  • +
  • -
  • 0

#4 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 29.06.2015 08:31

Jedyny sposób to ograniczyć ilość zapytań.

 

Dlaczego posiadasz aż 5 tabel? Nie da rady tego upchnąć w jednej?

Dorzuć cache przy zmianie mapy - zapisz lokalnie dane wszystkich osób obecnych na serwerze przed zmianą i wczytaj je tuż po zmianie.

Dodaj cache przy zapisie - twórz zapytanie zapisu zbiorcze dla wszystkich graczy: Plugin + Baza danych


  • +
  • -
  • 0
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#5 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 29.06.2015 09:45

Zrobiłem 5 żebym mógł łatwo wszystko rozczytać. Tak to bym musiał zrobić 26 kolumn.

Czyli gdybym zrobił jedna tabelę z 26 kolumnami i postarał się zrobić zapis w jednym zapytaniu to polepszyło by to działanie?
Tylko jest mały problem, zrobienie tego w jednym formacie jest prawie niemożliwe, używam add żeby nie było za długie w jednej linijce ale problem leży w zmiennych, jest ich za dużo w format i plugin się nie kompiluje.


radim (29.06.2015 12:03):
Samemu nie można edytować czy jak?

Użytkownik radim edytował ten post 29.06.2015 12:03

  • +
  • -
  • 0

#6 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 29.06.2015 14:35

Podaj dokładnie co w tej tabeli przechowujesz, jest wielce prawdopodobne że można to ułożyć inaczej niż w 26 kolumnach.

Poza tym za długi format to nie przeszkoda, można użyć 2ch :)
  • +
  • -
  • 0
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#7 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 29.06.2015 14:46

public SaveData(id) {
	if(!gConnected || !Loaded[id]) return
	
	new Data[1]
	Data[0] = id
	new qCommand[768], szName[64]
	get_user_name(id, szName, charsmax(szName))
	
	format(qCommand, charsmax(qCommand), "UPDATE Noze SET Bayonet='%d', Butterfly='%d', Flip='%d', Gut='%d', Huntsman='%d', Karambit='%d', M9='%d' WHERE nick='%s'", pKnife[id][1], pKnife[id][2], pKnife[id][3], pKnife[id][4], pKnife[id][5], pKnife[id][6], pKnife[id][7], szName);
	SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
	
	format(qCommand, charsmax(qCommand), "UPDATE AK47 SET Vulcan='%d', Redline='%d', Assimov='%d', FireSerpent='%d' WHERE nick='%s'", pAK47[id][1], pAK47[id][2], pAK47[id][3], pAK47[id][4], szName);
	SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
	
	format(qCommand, charsmax(qCommand), "UPDATE M4A1 SET Cyrex='%d', DragonKing='%d', Assimov='%d', Nuclear='%d' WHERE nick='%s'", pM4A1[id][1], pM4A1[id][2], pM4A1[id][3], pM4A1[id][4], szName);
	SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
	
	format(qCommand, charsmax(qCommand), "UPDATE AWP SET Hawking='%d', Redline='%d', Assimov='%d', DragonLore='%d' WHERE nick='%s'", pAWP[id][1], pAWP[id][2], pAWP[id][3], pAWP[id][4], szName);
	SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
	
	format(qCommand, charsmax(qCommand), "UPDATE DGL SET Asking='%d', Engraved='%d', Conspiracy='%d', Skrillex='%d' WHERE nick='%s'", pDGL[id][1], pDGL[id][2], pDGL[id][3], pDGL[id][4], szName);
	SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
	
	format(qCommand, charsmax(qCommand), "UPDATE Skrzynie SET Klucz='%d', CaseAK47='%d', CaseM4A1='%d', CaseAWP='%d', CaseDGL='%d' WHERE nick='%s'", pKey[id], pCaseAK47[id], pCaseM4A1[id], pCaseAWP[id], pCaseDGL[id], szName);
	SQL_ThreadQuery(gTuple, "SaveHandler", qCommand, Data, 1)
}

Tylko to. Zwykłe 0/1 Ma/Niema.

 

Przykładowe kilka wpisów:

If3Goow.png?1


Użytkownik oeN. edytował ten post 29.06.2015 14:47

  • +
  • -
  • 0

#8 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 466
Wszechobecny

  • Postów:2448
Offline

Napisano 29.06.2015 14:59

Może suma bitowa zamiast ma/nie ma?

Zapisywać tylko sumę bitowa... Tak jak w cod mod są trzymane bonusowe bronie gracza
  • +
  • -
  • 0

Sprzedam Paczkę CoD pod CS 1.6 (JEST WIELE WERSJI DO WYBORU TEJ PACZKI) na lvl od 201 - 601

Silnik (8 nowych statystyk, poprawiony zapis, dodatkowy exp, pozbyto się CurWeapon). Ponad 100 perków (do wyboru do koloru). Sklep, NOWE MISJE (QUESTY), premium i super premium, AUKCJE, KLANY, zapis nVault, 4 zestawy modeli bronii do wyboru!

JESTEŚ ZAINTERESOWANY KUPNEM? NAPISZ WIADOMOŚĆ DO MNIE!


#9 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 29.06.2015 15:22

Czyli według tego:

http://amxx.pl/topic...ru-jak-skrócić/

 

Wcześniej tego nie użyłem bo zrezygnowałem z bardzo dużej ilości danych, miało ich być 30+ ale wszystko wskazuje na to że jednak muszę z tego skorzystać.

Czeka mnie chyba bardzo dużo edycji, tutaj kod do Skinów M4A1:

new pM4A1Skin[33];
new pM4A1[33][5];

new const M4A1skinV[][] = {
	"0",
	"models/weedcs_go/GOskin/m4a1/v_cyrex.mdl",
	"models/weedcs_go/GOskin/m4a1/v_dragonking.mdl",
	"models/weedcs_go/GOskin/m4a1/v_assimov.mdl",
	"models/weedcs_go/GOskin/m4a1/v_nuclear.mdl"
}

new const M4A1skinP[][] = {
	"0",
	"models/weedcs_go/GOskin/m4a1/p_cyrex.mdl",
	"models/weedcs_go/GOskin/m4a1/p_dragonking.mdl",
	"models/weedcs_go/GOskin/m4a1/p_assimov.mdl",
	"models/weedcs_go/GOskin/m4a1/p_nuclear.mdl"
}

public PrecacheM4A1() {
	for(new i=1;i<=4;i++) {
		precache_model(M4A1skinV[i])
		precache_model(M4A1skinP[i])
	}
}

public TakeM4A1(id) {
	for(new i=1;i<=4;i++) {
		pM4A1[id][i] = 0;
	}
}

public M4A1skin(id) {
	new menu = menu_create("Skin M4A1", "M4A1SkinHandle");
	new menucallback = menu_makecallback("M4A1SkinCallBack");
	
	menu_additem(menu, "Domyslny", _, _, menucallback)
	menu_additem(menu, "Cyrex", _, _, menucallback)
	menu_additem(menu, "Dragon King", _, _, menucallback)
	menu_additem(menu, "Assimov", _, _, menucallback)
	menu_additem(menu, "Nuclear", _, _, menucallback)
	
	menu_display(id, menu);
	
	return PLUGIN_HANDLED;
}

public M4A1SkinCallBack(id, menu, item) {
	if(item == 0)
		return ITEM_ENABLED;
		
	else if(item == 1 && !pM4A1[id][1])
		return ITEM_DISABLED;
	
	else if(item == 2 && !pM4A1[id][2])
		return ITEM_DISABLED;
	
	else if(item == 3 && !pM4A1[id][3])
		return ITEM_DISABLED;
	
	else if(item == 4 && !pM4A1[id][4])
		return ITEM_DISABLED;
	
	return ITEM_ENABLED;
}

public M4A1SkinHandle(id, menu, item) {
	if(item == MENU_EXIT) {
		menu_destroy(menu)
		return PLUGIN_HANDLED;
	}
	
	switch(item) {
		case 0: pM4A1Skin[id] = 0;
		
		case 1: pM4A1Skin[id] = 1;
		case 2: pM4A1Skin[id] = 2;
		case 3: pM4A1Skin[id] = 3;
		case 4: pM4A1Skin[id] = 4;
	}
	
	return PLUGIN_CONTINUE;
}

public SetM4A1Skin(id) {
	if(pM4A1Skin[id] && weapon == CSW_M4A1) {
		entity_set_string(id, EV_SZ_viewmodel, M4A1skinV[pM4A1Skin[id]]);
		entity_set_string(id, EV_SZ_weaponmodel, M4A1skinP[pM4A1Skin[id]]);
	}
}

I teraz zrobienie tego ze stockami, coś mi się tu nie podoba. Przykład:

if(item == 1 && !pM4A1[id][1])
		return ITEM_DISABLED;

Zmienić na to?

if(item == 1 && !user_hasSkin(id, 1))
		return ITEM_DISABLED;

Użytkownik oeN. edytował ten post 29.06.2015 15:44

  • +
  • -
  • 0

#10 TibacK

    Diler pod gimnazjum dla niepełnosprawnych dzieci

  • Power User

Reputacja: 466
Wszechobecny

  • Postów:2448
Offline

Napisano 29.06.2015 16:24

public M4A1SkinCallBack(id, menu, item) {
	if(!item)
		return ITEM_ENABLED;
		
	if(!pM4A1[id][item])
		return ITEM_DISABLED	

       return ITEM_ENABLED;
}
To chyba tak można skrócić, jeżeli pM4A1[][0] trzyma zawsze jedynke to można nawet wyrzucić pierwszy warunek :D
  • +
  • -
  • 0

Sprzedam Paczkę CoD pod CS 1.6 (JEST WIELE WERSJI DO WYBORU TEJ PACZKI) na lvl od 201 - 601

Silnik (8 nowych statystyk, poprawiony zapis, dodatkowy exp, pozbyto się CurWeapon). Ponad 100 perków (do wyboru do koloru). Sklep, NOWE MISJE (QUESTY), premium i super premium, AUKCJE, KLANY, zapis nVault, 4 zestawy modeli bronii do wyboru!

JESTEŚ ZAINTERESOWANY KUPNEM? NAPISZ WIADOMOŚĆ DO MNIE!


#11 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 29.06.2015 16:34

Po co te kombinacje?

Owszem, suma bitowa jest fajnym rozwiązaniem i nawet bym je zastosował (w zapytaniach SQL też można stosować operacje bitowe, więc nadal będzie możliwość znalezienia graczy, którzy mają X w broni Y.
 
Ale...
 

+----+------+--------+-------------+
| id | nick | weapon |  properties |
+----+------+--------+-------------+
|  1 | oeN. | AK47   |  0b00001111 |
|  2 | oeN. | M4A1   |  0b00001001 |
|  3 | oeN. | Scout  |  0b00000000 |
|  4 | oeN. | AWP    |  0b00001100 | 
|  5 | FRoM | AK47   |  0b00001100 |
+----+------+--------+-------------+

Jedna tabela, bez niepotrzebnych kolumn. Jak sobie kiedyś wymyślisz żeby wybrać wszystkich graczy mających X na dowolnej broni to jest to bajecznie proste, dodasz kiedyś nową broń to nie będziesz musiał nic w strukturze bazy danych ruszać. Prawda, że ładniej? Jak potrzebujesz pomocy przy tworzeniu zapytań to dawaj śmiało.

 

I nigdy nie zapominaj o kolumnie id, kiedyś np przez błąd w pluginie doda Ci się do bazy 10 rekordów z tym samym nickiem gracza i będzie mu losowo wybierało co już odblokował jak wejdzie na serwer. Ciekawe jak bez ID usuniesz tylko niepotrzebne rekordy, zostawiając jeden?

 

No i nie zapomnij o unikalnych indeksach, tutaj np para kolumn nick i weapon powinna być objęta kluczem unikalnym, żeby mieć pewność że dla żadnego gracza nie utworzą się 2 rekordy dla tej samej broni.


  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#12 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 29.06.2015 16:52

No to po kolei.

Stworzyłem tabele:

CREATE TABLE CSGOMOD (id INT NOT NULL AUTO_INCREMENT,
                      nick VARCHAR(35) NOT NULL,
                      weapon VARCHAR(35) NOT NULL,
                      skin VARCHAR(35) NOT NULL DEFAULT 0,
                      PRIMARY KEY (`id`),
                      UNIQUE KEY `nick`  (`nick`,`weapon`))

Wpisanie gracza do tabeli, przykład do broni AK47:

INSERT INTO CSGOMOD (`nick`, `weapon`) VALUES ('%s', 'AK47') ON DUPLICATE KEY UPDATE `nick`='%s', `weapon`='AK47';

Zaznaczamy dane:

SELECT * FROM `CSGOMOD` WHERE `nick` = '%s' AND `weapon` = 'AK47'

Zapisujemy dane:

UPDATE CSGOMOD SET skin='%d' WHERE nick='%s' AND weapon='AK47'

Wszystko dobrze? Baza zrobiona? Co dalej? Nie mogę pojąć tych stocków.


Użytkownik oeN. edytował ten post 29.06.2015 16:52

  • +
  • -
  • 0

#13 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 29.06.2015 18:59

SELECT * FROM `CSGOMOD` WHERE `nick` = '%s' AND `weapon` = 'AK47'

Tutaj nie musisz w warunku podawać weapon, pobierzesz wtedy wszystkie bronie dla danego gracza.

 

UPDATE CSGOMOD SET skin='%d' WHERE nick='%s' AND weapon='AK47'

Tego nie potrzebujesz, aktualizacją zajmie się:

INSERT INTO CSGOMOD (`nick`, `weapon`) VALUES ('%s', 'AK47') ON DUPLICATE KEY UPDATE `nick`='%s', `weapon`='AK47';

jeśli masz prawidłowo unikalne klucze ułożone. Oczywiście musisz dodać do tego zapytania skin. Zalety? Możesz zaktualizować wiele rekordów jednym zapytaniem (wszystkich na serwerze) i nie musisz w kodzie rozróżniać tworzenia od aktualizacji danych.


GwynBleidD (29.06.2015 19:02):
Musisz tylko zmienić w INSERT INTO część po ON DUPLICATE KEY UPDATE, żeby nie podawać 2x tych samych danych do zapytania, inaczej możesz zaktualizować tylko 1 rekord na raz.

  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#14 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 29.06.2015 19:55

Próbuję tego INSERT INTO tak zbudować jak mówisz ale nic, jakoś mi nie wychodzi. Mógłbyś coś poradzić albo napisać jak ma wyglądać?

Próbowałem coś w tym stylu:

INSERT INTO CSGOMOD (`nick`) VALUES ('%s') ON DUPLICATE KEY UPDATE `nick`='%s', `skin`='%d';

Jednak nic.

Teraz tylko co ma odpowiadać za to skin? Jaka zmienna? Jak mam ją używać? Mam rozumieć że przez bity używając tych stocków, teraz tylko czy mam do każdej broni zrobić osobny stock? I jak mam wiedzieć kiedy gracz ma dwa skiny na raz?


  • +
  • -
  • 0

#15 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 29.06.2015 21:43

INSERT INTO CSGOMOD (`nick`, `weapon`, `skin`) VALUES ('%s', '%s', %d) ON DUPLICATE KEY UPDATE `nick`=VALUES(`nick`), `weapon`=VALUES(`weapon`), `skin`=VALUES(`skin`);

W ten sposób dodajesz lub aktualizujesz jednego gracza, a tutaj:

INSERT INTO CSGOMOD (`nick`, `weapon`, `skin`) VALUES ('%s', '%s', %d), ('%s', '%s', %d), ('%s', '%s', %d) ON DUPLICATE KEY UPDATE `nick`=VALUES(`nick`), `weapon`=VALUES(`weapon`), `skin`=VALUES(`skin`);

trzech na raz :)

 

Jako skin używasz po prostu liczby.

 

 


  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#16 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 29.06.2015 22:09

Tylko że wciąż muszę zrobić kilka zapytań na jednego gracza z racji że jest kilka broni, tak? Bo co mam podstawić za weapon, jaką zmienną i po co mam to robić używając zmiennej?

 

Np. mam 4 skiny:

1. Vulcan

2. Redline

3. Assimov

4. FireSerpent

 

Skin = 1 to Vulcan

Skin = 2 to Redline

[...]

Tak? Jeśli tak to w takim razie, jak mam te liczby zapisać do jednego wiersza? Sumować? 1+2 = 3 czyli Vulcan i Redline?


  • +
  • -
  • 0

#17 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 30.06.2015 11:05

Przedstawmy to bitowo:
new VULCAN      = 0b00000001
new REDLINE     = 0b00000010
new ASSIMOV     = 0b00000100
new FIRESERPENT = 0b00001000
W ten sposób każdy skin ma swój bit. Żeby przydzielić graczowi skin robisz tak:
skiny[id][weapon] |= REDLINE
Aby odebrać:
skiny[id][weapon] &= ~REDLINE
Aby sprawdzić czy ma dany skin:
if (skiny[id][weapon] & REDLINE)
Aby sprawdzić czy ma kilka skinów na raz:
if ((skiny[id][weapon] & (REDLINE|ASSIMOV|FIRESERPENT)) == (REDLINE|ASSIMOV|FIRESERPENT))
Aby sprawdzić czy ma którykolwiek z tych 3 skinów:
if (skiny[id][weapon] & (REDLINE|ASSIMOV|FIRESERPENT))
To, co jest w zmiennej skiny[id][weapon] zapisujesz do bazy (lub odczytujesz z bazy liczbę bezpośrednio do tej zmiennej). Proste?

I nie potrzebujesz kilku zapytań:

INSERT INTO `CSGOMOD` (`name`, `weapon`, `skin`) VALUES ('gracz', 'ak47', 3), ('gracz', 'm4a1', 2) ON DUPLICATE....

  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#18 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 30.06.2015 11:44

Za weapon ma odpowiadać zmienna? O taka?

new weapon {
	AK47,
	M4A1,
	AWP,
	DEAGLE,
	KNIFE
}

Użytkownik oeN. edytował ten post 30.06.2015 11:44

  • +
  • -
  • 0

#19 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 30.06.2015 12:17

Taka to raczej nie zadziała :) A to już jest Twoja broszka, bo nie wiem jak w samym pluginie przechowujesz kto ma jakie skiny.
  • +
  • -
  • 1
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
 
1988650.png?theme=dark

#20 oeN.

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 78
Zaawansowany

  • Postów:274
  • Lokalizacja:Dom
Offline

Napisano 30.06.2015 12:44

Od tego mam zmienne: pAK47[33][5], pM4A1[33][5], pKnife[33][8] itp.

A jak ktoś sobie chce wybrać skin do danej broni to używam pM4A1Skin[33] i tablicy z modelami.

Ten cały pomysł z weapon całkiem wyprowadził mnie z rytmu...

 

//edit

Porobiłem co nieco zmian w zapisie, wszystko jest w jednej tabeli, użyłem INSERT INTO zamiast UPDATE SET, dodałem ID żeby nie było powtórzeń i muszę przyznać że ładnie wszystko działa, brak jakichkolwiek oznak złego działania serwera, wszystko dobrze i szybko się wczytuje/zapisuje, jest bardzo dobrze. Dziękuje Ci za pomoc, trochę wyszedłem na głupka ale człowiek uczy się cały czas.


  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych