←  Problemy

AMXX.pl: Support AMX Mod X i SourceMod

»

ta sama "ilosc licznika" po uzyciu...

Oporowiec.'s Photo Oporowiec. 24.01.2014

siema :)
mam swoj plugin w, ktorym znajduje sie zmienna licznik i nalicza ona ile razy gracz uzyl danej komendy, jest taka mozliwosc zeby "licznik" pozostal ten sam po uzyciu komendy retry lub recconect ?
proszę o przykladowy plugin.

Quote

  • +
  • -
Filip1512's Photo Filip1512 25.01.2014

Najlepiej zrobić zapis nvault bądź mysql, ale z mysql na takie pierdoły będzie zbędny.

Quote

Oporowiec.'s Photo Oporowiec. 25.01.2014

ale mi chodzi o to zeby na nowej mapie juz licznik byl zerowany..

 

@ps

za co dostalem - ?

Quote

  • +
  • -
xenos's Photo xenos 29.01.2014

To i tak musisz gdzieś  przechowywać te dane, zwykła tablica Ci nie wystarczy.
Gdyż nie masz pojęcia ilu user ów bd wchodziło, chyba że zrobisz ogromną przykładowo 100, do której bd zapisywał nicki.
Tablica 2 wymiarowa -> 1 wymiar = nick 2gi wymiar= "zliczanie';

Tablice przeszukiwałbyś pod względem nicku czy taki nick już istnieje jeżeli tak to ma pobrać z 2giej wartości to "zliczenie" i przypisać do obecnego.
Przy małym serwerze to mogło by zadziałać lecz przy większym nie bardzo,. Jednocześnie trzeba zwrócić uwagę na wydajność( w przypadku optymistycznej wartości jest to  algorytm rzędu n^2) więc mało optymalny.

Jednocześnie mający charakterystyczny błąd -> co w momencie przekroczenia ilości osób w tablicy(więcej osób wejdzie niż tablica ma rozmiar)
Wtedy dla tych kolejnych będzie sypał errorami( wyjście poza tablice)
Dodatkowo "powiększenie tablicy" o kolejne rozmiary, zwiększy czas przeszukiwania jej .

Dlatego albo zapis+odczyt z pliku tekstowego
Bądź nvault/mysql;
W przypadku mysqla -> mniejsze obciążenie dla serwera gdyż zapytania wykonywały by się po stronie serwera mysql.

A przy starcie nowej mapy, wykonywała by się komenda czyszcząca daną tabele w mysqlu.
Więc co nowa mapa= to nowe zliczanie.






 


 

Quote

  • +
  • -
sebul's Photo sebul 29.01.2014

Przecież takie dane, można spokojnie zmieścić nawet w tablicy 32-elementowej, tylko trzeba by te elementy usuwać po kilkunastu/dziesięciu sekundach, bo przecież reconnect nie trwa jakoś bardzo długo. Wykorzystywanie do czegoś takiego mysql, to czysta głupota, nawet jak dla mnie nvault/plik też jest złym pomysłem, bo na pewno wydajniej jest wczytywać coś z tablicy niż z czegokolwiek innego.
Quote

  • +
  • -
xenos's Photo xenos 29.01.2014

zapis do tablicy - wartość N

Funkcja  czyszczenia->
Sprawdzająca czy dany gracz jest() (jazda po wszystkich elementach) tablicy -> N
jesli  nie to, to wywołaj -> funkcje czasowa, ze za x sek ma usunąć jego z tablicy z tablicy ->liniowe

[usunięc] rekordu - liniowe


I teraz założenie pesymistyczne, 
A co w momencie gdy przed usunięciem, a wpisaniem nowej wartości tablica się przepełni?
Błąd ? no wiadomo .

Reconnect zależny od sprzętu więc trzeba też wsiąść pod uwagę tą sferę.
Dlatego nie skróci się czasu "usunięcia" poniżej 1s(nawet do wychwycenia funkcji client_connect). A na poważnych serwerowniach w ciągu 1s chce wbić na serwer 5 graczy gdy serwer jest full.

Więc twoja propozycja jest nie wydajna, oraz posiada błędy krytyczne.
Gdyż nie zakłada wszystkich możliwych opcji.
Ps: dziękuje za minus -1 . Chociaż mój post nie złamał regulaminu oraz rozwiązanie podane nie działa na szkodę klienta, a pkt reputacji są dla niektórych zabawką :)
(to też można  podać pod minus)










 

Quote

  • +
  • -
GeDox's Photo GeDox 29.01.2014

@up
Poczytaj o trie i array :)

@topic
Proponuje wykorzystanie trie z zapisem na nick:)
Edited by GeDox, 29.01.2014 17:02.
Quote

  • +
  • -
sebul's Photo sebul 29.01.2014

I teraz założenie pesymistyczne, 
A co w momencie gdy przed usunięciem, a wpisaniem nowej wartości tablica się przepełni?
Błąd ? no wiadomo .

Jaki błąd? Jak przy pisaniu kodu nie założysz sobie takiej sytuacji, to oczywiście, będzie błąd, ale czy ja gdzieś napisałem, żeby nie brać tego pod uwagę? Przecież samo napisanie to, że można wykorzystać N elementową tablicę, od razu oznacza, że trzeba się zabezpieczyć przed przepełnieniem, dodatkowo tablice, to nie tylko zwykłe
new tablica[32];

tak jak to już wyżej zostało napisane.
 

Reconnect zależny od sprzętu więc trzeba też wsiąść pod uwagę tą sferę.
Dlatego nie skróci się czasu "usunięcia" poniżej 1s(nawet do wychwycenia funkcji client_connect). A na poważnych serwerowniach w ciągu 1s chce wbić na serwer 5 graczy gdy serwer jest full.

Nie wiem jaki związek miało by tutaj wbijanie graczy na serwer, przecież coś zapisuję się tylko przy wychodzeniu gracza i nawet przy 32 slotach, raczej gracze nie wychodzą częściej niż raz na ok. 10 sekund (albo nawet i więcej), więc bez problemu usuwanie można ustawić na jakieś 5-10 sekund po wyjściu gracza.
 

Więc twoja propozycja jest nie wydajna, oraz posiada błędy krytyczne.
Gdyż nie zakłada wszystkich możliwych opcji.
Ps: dziękuje za minus -1 . Chociaż mój post nie złamał regulaminu oraz rozwiązanie podane nie działa na szkodę klienta, a pkt reputacji są dla niektórych zabawką :)
(to też można  podać pod minus)

O błędach krytycznych napisałem, a to czy jest wydajna, na pewno jest lepszym rozwiązaniem niż "zaprzęganie" do tak prostej czynności mysql. A minus? Nie musisz łamać regulaminu, żeby go dostać, nie musisz też działać na czyjąś szkodę, po prostu mam taką możliwość, więc go dałem, a dlaczego? Wywnioskuj to sobie z moich postów, bo za darmo go nie dostałeś.
Quote