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
 

Zdjęcie

Zarządzanie niewidzialnością w cod mod - rozkmina systemu


Najlepsza odpowiedź GwynBleidD, 06.07.2015 19:41

W trie trzymasz niewidzialność dla każdego pluginu/perka/klasy czy czego tam chcesz. W arrayu będzie z tym problem, dlaczego?

Załóżmy, że masz 1 klasę, 2 perki i jeszcze jakiś item, wszystkie dają niewidzialność, klasa daje w zależności od levelu, perki i item zawsze tyle samo.

Niech będzie, że perk 1 daje 20%, perk 2 daje 30% i item daje też 30%.

Gracz ma klasę, perka 1 i item, akurat ma taki level, że level daje mu 20%, w Arrayu jest więc zapisane: 20% 20% 30%, gracz zmienia perk na ten drugi, co robisz? Przejdź do postu


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
10 odpowiedzi w tym temacie

#1 Rivit

    Godlike

  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 06.07.2015 10:57

Witam,

zauważyłem, że coś nie styka z niewidzialnością w cod mod, wniknąłem głębiej i znalazłem - niewidzialność pierwotna zostaje nadpisana przez coś innego (np z perku, sklepu)

 

 

 

Jak napisać taki system, który będzie zarządzać tym wszystkim?

Wiem, że to musi być w jednym pluginie (zrobiłem natyw już)

public UstawRendering(id, ile)
{
	if(rendering_gracza[id] > ile)
	{
		rendering_gracza[id] = ile
		ZastosujRender(id)
	}
}

public ZastosujRender(id)
{
	if(g_statystyki[id][KAMUFLAZ] < rendering_gracza[id])
		fm_set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, g_statystyki[id][KAMUFLAZ]);
	else
		fm_set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderTransAlpha, rendering_gracza[id]);
}

To by działało, gdyby nie jeden fakt - w tym cod mod jest statystyka, sklep, perki, klasy - wszystko ma niewidzialność...

 

W tej chwili kod porównuje niewidzialność z bieżącą i jeżeli mniejsza to ustawia, ale jest błąd:

 

Mam klase, która ma 150 widoczności (widoczność ustawiana w cod_class_enabled)

Nabijam jakiś tam poziom i dowalam wszystko w statystyke niewidzialność.

Odradzam się i co widze? A no to, że kod działa, widoczność jest ta ze statystyki, a nie z klasy

Ale resetuje punkty i co? G**** Widoczność jest normalna... 255, nie ta z klasy (klasa miała 170), a powinna być z klasy

 

 

 

Jak to zrobić, taką porównywarkę? Myślałem, żeby trzymać gdzieś stary render gracza, ale jak to resetować potem itp.

Problem jest typu - wymyśl algorytm,

 

jeżeli coś niezrozumiałe to pytać


  • +
  • -
  • 0

#2 DarkGL

    Nie oddam ciasteczka !

  • Administrator

Reputacja: 6 553
Godlike

  • Postów:11 976
  • GG:
  • Steam:steam
  • Imię:Rafał
  • Lokalizacja:Warszawa
Offline

Napisano 06.07.2015 11:29

Aktualnie pisze coś takiego


  • +
  • -
  • 1

#3 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 06.07.2015 13:08

Pytanie... Czy udostępnisz?
  • +
  • -
  • 0

#4 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

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

Napisano 06.07.2015 14:49

Problem jest, ale nie aż tak poważny... Wcale nie musisz trzymać tego w 1 pluginie :)

 

1. Rejestrujesz natyw o nazwie dla przykładu przelicz_niewidzialnosc

2. Dla każdego pluginu, który choć raz użył tego natywu rejestrujesz forward

3. W forwardzie każdy plugin, który korzysta z niewidzialności przy każdym jego wykonaniu dla danego gracza, określa jaką powinien mieć niewidzialność - jeśli ma np perk, ustalamy mu 20%, jeśli nie ma nic, ustalamy mu 100% (czyli widoczny). Wynik po prostu zostaje zwrócony w forwardzie

4. Po wykonaniu wszystkich forwardów plugin główny wybiera najmniejszą wartość lub dokonuje jakichś "szacunków" żeby wyliczyć wartość na innej podstawie (np średnią)

 

Jeśli chcesz zmienić niewidzialność graczowi, dbasz o to by Twój plugin w forwardzie zwrócił odpowiednią wartość, a następnie wykonujesz przelicz_niewidzialnosc.

 

Podejście numer dwa - lista niewidzialności.

 

1. Rejestrujesz 2 natywy: zarejestruj_niewidzialnosc i ustaw_niewidzialnosc

2. zarejestruj_niewidzialnosc tworzy nowy wpis w trie w którym jako klucz podajesz swoją dowolną, unikalną nazwę (czyli np dla perku XX będzie to po prostu perk_XX), a jako wartość 100% (czy tam 255, czy 1, czy cokolwiek innego, zależy od tego jak niewidzialność jest ustawiana) oznaczającą brak niewidzialności

3. gdy plugin chce zmienić graczowi niewidzialność, wykonuje ustaw_niewidzialnosc z odpowiednią wartością, plugin główny zapisuje ją na odpowiednniej pozycji w trie i wybiera z trie najmniejszą wartość, ustawiając ją graczowi. Jeśli trie jest puste, ustawia brak niewidzialności.

 

przykład użycia:

zarejestruj_niewidzialnosc('perk_superasny')

ustaw_niewidzialnosc(id, 'perk_superasny', 30)

 

Podejście numer trzy - własny system (np punktowy)

 

Ustalasz jakiś system punktowy, od którego będzie zależeć ile niewidzialności ma gracz, każdy plugin będzie mógł dodać punkty lub je zabrać.

 

Podejście numer cztery - sprawdzanie wartości niewidzialności

 

Każdy plugin będzie posługiwał się wartościami od 0.0 do 1.0, jeśli będzie chciał ustawić graczowi niewidzialność:

1. pobierze jego aktualny poziom niewidzialności

2. przemnoży go przez swoją wartość

3. ustawi otrzymaną liczbę jako wartość niewidzialności

 

Jeśli będzie chciał zabrać, po prostu zamiast mnożenia użyje dzielenia.

 

W ten sposób jeśli 1 plugin ustawi graczowi niewidzialność na 0.5 i drugi również na 0.5, dostanie on w efekcie wartość 0.25.


  • +
  • -
  • 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


#5 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 06.07.2015 15:30

Gwyn, dziękuję za odpowiedź, jak zawsze wiele mi to pomaga, ogólną wizję już mam.

 

 

Nie chcę, aby wyliczało średnią, chcę żeby spośród x, które w tym czasie ma ustawione, wybrało najmniejszą i ustawiło, jeżeli "skończy się" ta najmniejsza (drop perka) to ustawia najmniejszą z możliwych już...

 

 

 

Pomysł z pakowaniem tego do Trie nie jest taki głupi...

A jakby w jakiejś tablicy trzymać wszystkie wartośći, które mu dodałem?

Potem jakiś natyw do usuwania tego z tablicy

 

 

Tylko jak to wykonać...

Będę mieć id gracza lub nazwe (Trie lub Array), do tego dochodzą jeszcze wartośći, które muszą być trzymane pod jednym kluczem (wyciągam wszystkie i wybieram największą

 

Array trzymający Array?


  • +
  • -
  • 0

#6 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

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

Napisano 06.07.2015 17:49

A jakby w jakiejś tablicy trzymać wszystkie wartośći, które mu dodałem?

Musisz w jakiś sposób śledzić jaki plugin ustawił jaką wartość - stąd pomysł z trie, bo wtedy możesz sobie każdą zmianę "podpisać" :) Właściwie to rejestrowania tutaj nawet nie potrzebujesz, po prostu zmienić.

Będę mieć id gracza lub nazwe (Trie lub Array), do tego dochodzą jeszcze wartośći, które muszą być trzymane pod jednym kluczem (wyciągam wszystkie i wybieram największą

Array trzymający Array?

new Trie:invisibility[33];

new client_connect(id) {
    invisibility[id] = TrieCreate()
}
to Ci coś mówi? :)

Prawdopodobnie będziesz potrzebował tandemu - Array + Trie, inaczej ciężko będzie znaleźć najmniejszą wartość. W Arrayu trzymasz klucze z Trie, dzięki czemu możesz po Trie iterować.
  • +
  • -
  • 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


#7 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 06.07.2015 18:33


new Trie:invisibility[33];

new client_connect(id) {
invisibility[id] = TrieCreate()
}

 

Nie mówi wszystko :/

 

Czyli mam Trie dla każdego gracza, ale co mi z tego?

 

Nie rozumiem tego kompletnie

 

 

 

 

Mam Trie dla każdego gracza, nie mogę tam trzymać wartości niewidzialności?

 

 

A jakby zrobić Array dla każdego?


  • +
  • -
  • 0

#8 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

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

Napisano 06.07.2015 19:41   Najlepsza odpowiedź

W trie trzymasz niewidzialność dla każdego pluginu/perka/klasy czy czego tam chcesz. W arrayu będzie z tym problem, dlaczego?

Załóżmy, że masz 1 klasę, 2 perki i jeszcze jakiś item, wszystkie dają niewidzialność, klasa daje w zależności od levelu, perki i item zawsze tyle samo.

Niech będzie, że perk 1 daje 20%, perk 2 daje 30% i item daje też 30%.

Gracz ma klasę, perka 1 i item, akurat ma taki level, że level daje mu 20%, w Arrayu jest więc zapisane: 20% 20% 30%, gracz zmienia perk na ten drugi, co robisz?
  • +
  • -
  • 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


#9 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 06.07.2015 19:57

Stop,

dlaczego w Trie niewidzialność każdego itemu/perku?

Dlaczego nie stowrzyć Trie dla gracza i w nim tablice i tam pakować to co gracz dostanie?

Edit

No dobra, mam Trie do którego dostanę się po nicku, co tam mam trzymać? Uchwyt do Array? Wtedy to będzie cell czy array?
GwynBleidD (06.07.2015 22:12):
No właśnie to co opisałeś mam na myśli...

  • +
  • -
  • 0

#10 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 08.07.2015 07:38

Zrobiłem tak,

new Array:render[33]

w putinserver tworze

w disconnect destroy

 

 

 

Teraz gdy jakis perk bedzie chcial zmienic to Push jego wartość i wywołaj funkcje ustawiającą niewidzialność.

 

Algorytm szukający najmniejszą sam sobie napiszę.

 

proszę nie zamykać, może być potrzebne


  • +
  • -
  • 0

#11 Rivit

    Godlike

  • Autor tematu
  • Support Team

Reputacja: 1 319
Godlike

  • Postów:4 380
Offline

Napisano 10.07.2015 20:04

Dobra, wszystko jest gotowe, ale są bugi...

I jest taka sprawa, że gdy zginę trzymając nóż to w następnej rundzie będę miał w moim "niewidzialnościowym" Array'u wartość '55', bo zginąłem na nożu. Juz miałem dopisywać kod, który po śmierci zabierze to 55, ale co jeżeli inny plugin będzie mieć taką samą niewidzialność ustawioną? Po prostu usunie mu :/

 

Jak to rozwiązać?

 


  • +
  • -
  • 1




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

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