←  Poradniki oraz Łatki

AMXX.pl: Support AMX Mod X i SourceMod

»

Fix
[5.9l] Zła redukcja obrażeń po zwiększeniu...

  • +
  • -
sebul - zdjęcie sebul 06.12.2010

Nie wiem czy ktoś to zauważył, ale po zwiększeniu lvl (czyli i max statów, a dokładniej zręczności), redukcja obrażeń trochę źle działa, gdyż przy 50 pkt w zręczności miało się już praktycznie max % redukcji tych obrażeń, a dodawanie powyżej 50 pkt w zręczność, mało co dawało i tak mając 100 pkt w zręczności, redukcja obrażeń była prawie taka sama jak przy 50 punktach. Oczywiście jest na to rozwiązanie ;]
Znajdź wszystkie
player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/100)

zamień na
player_damreduction[id] = damachange(X, Y, Z);

Dodaj gdziekolwiek w sma, np. przed "public reset_skill(id)"


I Opcja bez zmiany sposobu obliczeń
stock Float:damachange(maxstat, skill, dziel) {
if(skill > 0)
return (47.3057*(1.0-floatpower(2.7182,-(0.06798/(maxstat/50))*float(skill)))/dziel);

return 0.0;
}
  • zamiast X wpisz maksymalną wartość statystyki, czyli w standardzie jest to 50
  • zamiast Y wpisz statystykę, która będzie w obliczeniach, czyli dla redukcji obrażeń będzie to "player_agility[id]"
  • zamiast Z wpisz liczbę przez którą redukcja obrażeń będzie się dzielić, im większa liczba, tym mniejsza będzie redukcja, w standardzie jest 100

II Opcja ze zmianą sposobu obliczania redukcji, jak dla mnie ta opcja jest lepsza, przy większej ilości punktów dodanych w zręczność, 1 punkt daje więcej niż przy standardowych wyliczeniach
stock Float:damachange(maxstat, skill, Float:dziel) {
if(skill > 0) {
new Float:qwe = float(skill)/maxstat;
new Float:bonus = (2.0-floatpower(2.0, qwe))/(dziel*4);
if(bonus < 0.0) bonus = 0.0;
return bonus+qwe/dziel;
}

return 0.0;
}

  • zamiast X wpisz maksymalną wartość statystyki, np. 50
  • zamiast Y wpisz statystykę, która będzie w obliczeniach, czyli dla redukcji obrażeń będzie to "player_agility[id]"
  • zamiast Z wpisz liczbę zmiennoprzecinkową, przez którą redukcja obrażeń będzie się dzielić, jeśli wpiszesz 2.0 to maksymalna wartość redukcji będzie wynosić 50%, im większa liczba, tym mniejsza będzie redukcja
Odpowiedz

  • +
  • -
ZiuTeK - zdjęcie ZiuTeK 06.12.2010

A czy nie latwiej i prosciej bedzie zmieniac wartosc 100 ?
Skoro przy 100 levelach dzielimy ta wartosc przez 100 to analogicznie przy 200 podzielimy przez 200, przy 400 przez 400.
Po co komu te obliczenia ?
Dla 200 leveli

player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/200)
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 06.12.2010

A czy nie latwiej i prosciej bedzie zmieniac wartosc 100 ?
Skoro przy 100 levelach dzielimy ta wartosc przez 100 to analogicznie przy 200 podzielimy przez 200, przy 400 przez 400.
Po co komu te obliczenia ?
Dla 200 leveli

player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.06798*float(player_agility[id])))/200)

Niestety nie łatwiej... tamte obliczenia to wyższa szkoła jazdy ^^ i tutaj samo zwiększenie dzielnika da tylko to, że będziemy mieli mniejszą wartość i tym sposobem max redukcja obrażeń, będzie wynosić przy 200 lvl, tylko ok. 24%
A zresztą zobacz sobie to -> Google ;] i jak chcesz to się pobaw z tymi cyframi.

I jeszcze coś, jeśli by zrobić tym sposobem co podałeś, to i tak dalej przy 50 pkt zręczności miało by się praktycznie tyle samo redukcji obrażeń, co przy 100 pkt.
Użytkownik sebul edytował ten post 06.12.2010 21:19
Odpowiedz

cesik - zdjęcie cesik 17.02.2011

a czy wartosc dla 150 lvl-a bedzie nastepujaca?
0,10197
i bedzie szlo tak?
player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0,10197*float(player_agility[id])))/150)

Użytkownik cesik edytował ten post 17.02.2011 21:03
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 17.02.2011

Google
Czyli musisz wpisać tam 0.04532, a dokładniej
player_damreduction[id] = (47.3057*(1.0-floatpower( 2.7182, -0.04532*float(player_agility[id])))/100)

No i pamiętaj, że przecinek tutaj działa inaczej, musi być koniecznie kropka.
Odpowiedz

  • +
  • -
Divic - zdjęcie Divic 18.04.2011

K moj blad.. nie pozmieniałem danych we wszystkich linijkach

Ja u siebie dałem ze można we wszystki staty dac max 100 pkt :P ciężej jest bo nie rozwinie się każdej umiejętności xD
Użytkownik Divic edytował ten post 18.04.2011 14:35
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 18.04.2011

Przy 100 lvlach to standard, bo tam masz max 50 pkt.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 02.09.2011

Do poradnika dodałem dwie opcje, według mnie może komuś się przydać, tym bardziej, że ta druga opcja jest bardziej odpowiednia, bo redukcja zwiększa się takim samym tempem, z tym że przy mniejszej ilości punktów w zręczność gracz dostaje większy bonus do redukcji.

Pierwszy post został jeszcze poprawiony, wcześniej zapomniałem o tym, że przecież są itemy na dodanie dodatkowych punktów do statów.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 01.11.2011

Pierwszy post zaktualizowany, poprawiłem stock do obliczania redukcji obrażeń.
Odpowiedz

  • +
  • -
glut - zdjęcie glut 12.02.2012

Błąd w kodzie :) W II sposobie :)

zamiast:

stock Float:damachange(maxstat, skill, Float:dziel) {
	    if(skill > 0) {
			    new Float:qwe = float(skill)/maxstat;
			    new Float:bonus = (2.0-floatpower(2.0, qwe))/(dziel*4);
			    if(bonus < 0.0) bonus = 0.0;
			    return bonus+qwe/dziel;
	    }
	    return 0.0;
}

dajcie

stock Float:damagereduction(maxstat, skill, Float:dziel) {
	    if(skill > 0) {
			    new Float:qwe = float(skill)/maxstat;
			    new Float:bonus = (2.0-floatpower(2.0, qwe))/(dziel*4);
			    if(bonus < 0.0) bonus = 0.0;
			    return bonus+qwe/dziel;
	    }
	    return 0.0;
}

sebul (12.02.2012 13:49):
Raczej niedopatrzenie, które i tak nie wpływa bezpośrednio na działanie fixa ^^
Odpowiedz

  • +
  • -
ogieR8 - zdjęcie ogieR8 29.12.2014

Sorry, że wracam do wątku, ale odnośnie nazwy tematu.. a gdyby tak ..

player_damreduction[id] = oblicz_redukcje(max_level, skill, Float:dzielnik) 

np.

player_damreduction[id] = oblicz_redukcje(200, player_agility[id], 2.0)

i gdzieś tam na dole stock

stock Float:oblicz_redukcje(max, skill, Float:dziel) {
	if(skill > 0) {
		new Float:yyy = (max / (100 / dziel)) * 1.0
		new Float:xxx = 1.0 - ((skill / yyy) / 100)
		return xxx;
	}
	return 1.0;
}

100/dziel = maxymalny poziom redukcji w %

Chcemy 50% ? 50 = 100/x   x = 2.0

Chcemy 100% redukcji ? 100=100/x   x = 1.0
 
Czy takie wyjście jest dobre ? Pytam tych wyżej ustawionych, bo wzory raczej są dobre, ale nie wiem czy float wpuściłem w dobrych miejscach :X I wydaję mi się ten sposób bardziej realny. X%max_statystyki = X%max_redukcji 
 
Nie rozumiem po co tak kombinować, proste sposoby są najlepsze, takie mam zdanie, a teraz testuje :)

 

Wyniki testu

Spoiler

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 29.12.2014

Nie chcę mi się tego co napisałeś teraz analizować, ale moja funkcja z założenia miała dawać więcej bonusu na samym początku (przy mniejszej ilości punktów statystyki).
Odpowiedz