←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Zapis 1(true) do nvault

  • +
  • -
Toldi - zdjęcie Toldi 12.10.2017

Siemka. Mam takie pytanie do was. Jak zrobić żeby plugin zapisywał w nvault tylko wartości true (1)? Mam taką pętlę w zapisie:

for(new i; i < MAX_SKINS_KNIFE; i++)
    {    
        format(String, 7, "^"%d^" ", skins_knife[id][i][1]);
        add(vaultdata, 255, String);
        
    }

Próbowałem zrobić to w taki sposób lecz wtedy po zmianie mapy serwer dostaje crash z powodem naruszenia pamięci (jakoś tak).

for(new i; i < MAX_SKINS_KNIFE; i++)
    {    
        if(skins_knife[id][i][1] == 1) 
        {
            format(String, 7, "^"%d^" ", skins_knife[id][i][1]);
            add(vaultdata, 255, String);
        }
        
    }

i jeszcze w taki sposób chociaż to to samo w sumie.

for(new i; i < MAX_SKINS_KNIFE; i++)
    {    
        if(skins_knife[id][i][1] == 0) // lub też !=1
        continue;

            format(String, 7, "^"%d^" ", skins_knife[id][i][1]);
            add(vaultdata, 255, String);
        
        
    }

Pierwszy raz stosuję zapis taki po przez pętlę bo miałem nadzieje że mocno oszczędzę pamięć i szybkość wczytywanie się serwera gdyby do vault trafiały tylko zmiennie = 1. Aktualnie zapisują się też 0 (false) i już to widzę gdy na serwer wejdzie parę set osób zapis wtedy będzie mocno zasyfiony przez co zwolni mi serwer a tego chcę uniknąć. Ktoś coś poradzi?

 

Odpowiedz

  • +
  • -
Robiin - zdjęcie Robiin 12.10.2017

new bool:zyje[33];
if(is_user_alive(id)) zyje[id]=true

if(zyje[id]) wykonaj dalsza instrukcje

Nie musisz sprawdzać po wartościach, a skoro jest to boolean, to lets give it a try.

Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 12.10.2017

+ za chęć optymalizacji pluginu, jednak już na wstępie poleciłbym Ci zastanowić się nad algorytmem wczytywania danych dla powyższej metody zapisu - możesz tam napotkać pewien problem ;)

Odpowiedz

  • +
  • -
Toldi - zdjęcie Toldi 12.10.2017

Zrobiłem ten zapis lecz gdy kupie skina z pozycji np. 9 i 12 to po zmianie mapy w menu skinów mam odblokowanego skina z pozycji 1 i 2. Przynajmniej wiem czym to jest spowodowane lecz nie potrafię wam to w czytelny sposób przedstawić :). Wymyślałem żeby zrobić zmienną bool która przybiera wartość true; gdy gracz kupi pierwszego skina i w zapisie sprawdzać że jeżeli jest równa 0 to po prostu nie będzie tego gracza wrzucać do zapisu. Na pewno zawsze trochę to zoptymalizuje plugin przed graczami, którzy wbijają na serwer tylko od tak sobie. Myślałem też zrobić że jeżeli gracz nie ma skina do żeby dodawało " "(pustka w klamrach) ale to w sumie to samo jak by się tam znalazło 0 no chyba że się mylę.

Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 13.10.2017

Rzeczywiście, wstawienie pustego pola w cudzysłowy nic nie zmieni. Aby osiągnąć pożądany efekt musiałbyś stworzyć zapis oparty na "wyliczaniu" posiadanych przez gracza skinów.

 

Jakby to wyglądało:

Załóżmy, że gracz posiada 3 skiny z 5 istniejących:

  ID  |  Nazwa skinu

   1  |  Skin nr 1 *
   2  |  Skin nr 2
   3  |  Skin nr 3
   4  |  Skin nr 4 *
   5  |  Skin nr 5 *

* Skiny posiadane przez gracza

Obecny zapis (który chciałbyś zoptymalizować) wygląda w ten sposób:

"nazwa gracza" "1" "0" "0" "1" "1"

Chcąc usunąć te zera w środku, można zrobić to innym sposobem:

"nazwa gracza" "1" "4" "5"

W powyższym zapisie użyłem jedynie ID danego skinu, aby zasygnalizować, że gracz posiada skin z tym właśnie ID.

Odczytując linię zapisu, wystarczyłoby odczytać kolejne ID skinów i zmienić wartość zmiennej jakasZmienna[id][ID_SKINU] = true;

 

W ten sposób częściowo zmniejszysz rozmiar pliku nVault.


Użytkownik _McHappy edytował ten post 13.10.2017 19:10
Odpowiedz

  • +
  • -
Toldi - zdjęcie Toldi 14.10.2017

No właśnie tak myślałem żeby ID broni robić i po tym zapisywać/odczytywać ich z zapisu wtedy bym nie musiał wszystkich wartości zapisywać tylko wartość =true; oraz kolejność skinów w menu podczas odczytu nie była by po kolei tylko w zależności od numeru skina w menu. Dzięki Panowie za porady. Jedynie co mogę dać to + ale zawsze coś niż nic :). Jeszcze raz dzięki :)

Odpowiedz