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

2 Pytania


Najlepsza odpowiedź _McHappy, 23.08.2017 07:36

Bez rzutowania na float, musisz to zrobić inaczej.

new procent = (missionProgress[id] / str_to_num(missionData[missionSelected[id]][3])) * 100

Załóżmy:

missionProgress[id] = 16
str_to_num(missionData[missionSelected[id]][3])) = 70

Dla Twojego kodu:

(missionProgress[id] / str_to_num(missionData[missionSelected[id]][3])) * 100  ->  (16 / 70) * 100  ->  0 * 100 = 0 

[ Tak działa dzielenie 'div' - całkowite. 
Brana pod uwagę jest tylko część całkowita dzielenia - dlatego: 16/70={0,2285...}=0 ]

Prawidłowe podejście:

(missionProgress[id]*100) / str_to_num(missionData[missionSelected[id]][3])  ->  (16 * 100) / 70  ->  160 / 70 = 22 

[ Przedstawiając wynik jako liczbę zmiennoprzecinkową, postęp wyniósłby ~22,9%,
ale pamiętajmy, że wykorzystujemy tylko dzielenie całkowite, które zawsze zaokrągla w dół. ]
Przejdź do postu


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

#1 Split

    Programista

  • Power User

Reputacja: 106
Zaawansowany

  • Postów:490
  • Imię:Szymon
  • Lokalizacja:Opole
Offline

Napisano 13.08.2017 07:28

Cześć. Mam dwa pytania do osób, które będą potrafiły mi odpowiedzieć na pytanie.
 
1. W jaki sposób mogę użyć jako "number" pole tabeli w którym znajduje się numer ?
 
new const missionData[][][] = {
{"I", "kill", "Zabij 10 osob", "10", "400"},
{"I", "damage", "Zadaj 1000 obrazen", "1000", "400"},
	
{"I", "bomb_plant", "Podloz 10 bomb", "10", "500"},
{"I", "bomb_defuse", "Rozbroj 10 bomb", "10", "500"}
}
Gdy usunę " " i zostawię samą liczbę, czyli tak:

new const missionData[][][] = {
// I
{"I", "kill", "Zabij 10 osob", 10, 400},
{"I", "damage", "Zadaj 1000 obrazen", 1000, 400},
	
{"I", "bomb_plant", "Podloz 10 bomb", 10, 500},
{"I", "bomb_defuse", "Rozbroj 10 bomb", 10, 500},
}
Wyskakuje taki błąd:

// C:\Users\oszym\Desktop\scripting WINDOWS\missions.sma(159) : error 033: array must be indexed (variable "missionData")
// C:\Users\oszym\Desktop\scripting WINDOWS\missions.sma(164 -- 165) : error 033: array must be indexed (variable "-unknown-")
Oczywiście linijka 159

if (missionProgress[id] >= missionData[missionValue[id]][3])
A to linijki od 164 - 165

new xp = missionData[missionValue[id]][4]
set_user_xp(id, get_user_xp(id) + xp)
2. Kolejne pytanie brzmi następująco. Mam ustawione w tabeli że grasz musi podłożyć np. 10 bomb, czyli:

{"I", "bomb_plant", "Podloz 10 bomb", 10, 500},
10 jest to liczba jaką gracz musi osiągnąć aby otrzymać prezent.

Posiadam zmienną "missionProgress". Chciałem ją zrobić w procentach. Tylko nie wiem jak za to się zabrać. Chodzi mi o równanie jakie muszę wykonać aby dawało procenty do 100%, gdy potrzeba 10 podlozyc bombe.

Poniżej pełny kod:
if (equal(missionData[missionValue[id]][1], "bomb_plant"))
{
	if (missionProgress[id] >= missionData[missionValue[id]][3])
	{
		missionValue[id] = -1
		missionProgress[id] = -1
				
		new xp = missionData[missionValue[id]][4]
		set_user_xp(id, get_user_xp(id) + xp)
				
		ColorChat(id, GREEN, "[Misje]^x01 Ukonczyles(as) misje. Otrzymujesz nagrode w postaci^x03 %i^x01 XP.", xp)
	}
			
	else
	{
		missionProgress[id] += 1 // TUTAJ CHCĘ ZROBIĆ DODAWANIE PROGRESU, ALE ZEBY NIE ZACHODZILO WIECEJ NIZ 100% GDY NP GRACZ MUSI ZAPLANTOWAC 10 RAZY.
				
		ColorChat(id, GREEN, "[Misje]^x01 Dobrze Ci idzie ! Postep wykonanej misji^x03 %i%%", missionProgress[id])
	}
}
Myślę że opisałem dokładnie problemy.
  • +
  • -
  • 0

LoL, 500 postów ;D


#2 Robiin

    Godlike

  • Support Team

Reputacja: 1 107
Super Hero

  • Postów:2 050
  • Imię:Robert
  • Lokalizacja:Wrocław
Online

Napisano 13.08.2017 11:40

Jeżeli chodzi o procenty, to zaczerpnij z cod moda od Peyota, tam doświadczenie jest domyślnie w %.

if (missionProgress[id] >= missionData[missionValue[id]][3])

zmienna missionData jest trójwymiarowa, co wiąże się z błędem, kiedy wykorzystasz 2/3 możliwych opcji, a przynajmniej tak to biorę na logikę i doświadczenie :P

 

 


  • +
  • -
  • 1

Nie dołączam do żadnej sieci, nie pomagam z tworzeniem paczek, nie napisze pluginów za zero.


#3 Split

    Programista

  • Autor tematu
  • Power User

Reputacja: 106
Zaawansowany

  • Postów:490
  • Imię:Szymon
  • Lokalizacja:Opole
Offline

Napisano 13.08.2017 14:57

Okej, dzięki za pomoc.

close
  • +
  • -
  • 0

LoL, 500 postów ;D


#4 Ogen Dogen

    Czempion

  • Power User

Reputacja: 261
Wszechwidzący

  • Postów:837
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Dąbrowa Górnicza
Offline

Napisano 13.08.2017 21:28

1. Nie możesz, bo cała tablica musi być tego samego typu. Za to możesz konwertować tekst na liczbę - https://amxx.pl/doku...1372/str-to-num

2. Obliczanie procentów to czysta matematyka ;)

new procenty = (liczbaPodlozonychBomb / liczbaWymaganychBomb) * 100; // bez ułamków
new Float:procenty = floatmul(floatdiv(float(liczbaPodlozonychBomb), float(liczbaWymaganychBomb)), 100); // z ułamkami (pamiętaj aby sformatować na wyjściu w celu uniknięcia okresu np. 1/3)

+ ograniczenie

if (missionProgress[id] < 100) missionProgress[id]++;
else // koniec misji

  • +
  • -
  • 1

b_350_20_360204_C20008_FFFFFF_000000.png 193.33.176.115:27015

 

94e23d811c.png

 


#5 Split

    Programista

  • Autor tematu
  • Power User

Reputacja: 106
Zaawansowany

  • Postów:490
  • Imię:Szymon
  • Lokalizacja:Opole
Offline

Napisano 13.08.2017 23:29

1. Nie możesz, bo cała tablica musi być tego samego typu. Za to możesz konwertować tekst na liczbę - https://amxx.pl/doku...1372/str-to-num
2. Obliczanie procentów to czysta matematyka ;)

new procenty = (liczbaPodlozonychBomb / liczbaWymaganychBomb) * 100; // bez ułamków
new Float:procenty = floatmul(floatdiv(float(liczbaPodlozonychBomb), float(liczbaWymaganychBomb)), 100); // z ułamkami (pamiętaj aby sformatować na wyjściu w celu uniknięcia okresu np. 1/3)
+ ograniczenie
if (missionProgress[id] < 100) missionProgress[id]++;
else // koniec misji

 
Mam kolejne pytanie. Otóż. Dlaczego to ma problem ze wczytywaniem danych z vault ? Zapisuje ale nie wczytuje i w tym jest problem.

Sprawdzanie:

if (loadTest(id, numberX[id] + item))
{
	ColorChat(id, GREEN, "[COD:MW 4]^x01 Juz jestes w bazie")
		
	return PLUGIN_CONTINUE
}
Jeżeli by ktoś pytał. numberX[id] + item dobrze zwraca numer.

Funkcje:

public loadTest(id, number)
{
	new
		vaultKey[64],
		vaultData[255]
		
	new userName[32]
	get_user_name(id, userName, 32)
			
	format(vaultKey, 64, "%s-test", userName)
	format(vaultData, 255, "%i", number)
		
	nvault_get(gVault, vaultKey, vaultData, 255)
		
	// load
	return str_to_num(vaultData) > 0 ? true : false;
}

public saveTest(id, number)
{
	new
		vaultKey[64],
		vaultData[255]
		
	new userName[32]
	get_user_name(id, userName, 32)
	
	format(vaultKey, 64, "%s-test", userName)
	format(vaultData, 255, "%i", number)
		
	// save
	nvault_set(gVault, vaultKey, vaultData)
	
	ColorChat(id, GREEN, "%s - %i", userName, number)
}

  • +
  • -
  • 0

LoL, 500 postów ;D


#6 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 13.08.2017 23:46

format(vaultData, 255, "%i", number)
nvault_get(gVault, vaultKey, vaultData, 255)

Formatujesz vaultData, a potem i tak jest to nadpisywane przez nvault_get(). Kombinuj dalej ;)

Ps. Przy wczytywaniu ciągu znaków do zmiennych musisz zarezerwować komórkę na terminator ciągu znaków (stringa) - zwiększ wielkość tablic przy deklaracji o +1.

Użytkownik _McHappy edytował ten post 13.08.2017 23:49

  • +
  • -
  • 1

#7 Split

    Programista

  • Autor tematu
  • Power User

Reputacja: 106
Zaawansowany

  • Postów:490
  • Imię:Szymon
  • Lokalizacja:Opole
Offline

Napisano 14.08.2017 01:37

1. Nie możesz, bo cała tablica musi być tego samego typu. Za to możesz konwertować tekst na liczbę - https://amxx.pl/doku...1372/str-to-num
2. Obliczanie procentów to czysta matematyka ;)

new procenty = (liczbaPodlozonychBomb / liczbaWymaganychBomb) * 100; // bez ułamków
new Float:procenty = floatmul(floatdiv(float(liczbaPodlozonychBomb), float(liczbaWymaganychBomb)), 100); // z ułamkami (pamiętaj aby sformatować na wyjściu w celu uniknięcia okresu np. 1/3)
+ ograniczenie
if (missionProgress[id] < 100) missionProgress[id]++;
else // koniec misji


Po zastosowaniu Twojego kodu mam błędy:
 
error 033: array must be indexed (variable "missionData")
warning 204: symbol is assigned a value that is never used: "text"
//
if (missionSelected[id] >= 0)
{
	new procent = (missionProgress[id] / missionData[missionSelected[id]][3]) * 100;
		
	set_hudmessage(0, 255, 0, 0.80, -1.0, 0, 0.0, 1.0)
	ShowSyncHudMsg(id, gSyncHudObj, "[Postep: %i%%]", procent)
}

format(vaultData, 255, "%i", number)
nvault_get(gVault, vaultKey, vaultData, 255)

Formatujesz vaultData, a potem i tak jest to nadpisywane przez nvault_get(). Kombinuj dalej ;)

Ps. Przy wczytywaniu ciągu znaków do zmiennych musisz zarezerwować komórkę na terminator ciągu znaków (stringa) - zwiększ wielkość tablic przy deklaracji o +1.


Nie rozumiem. Mógłbyś trochę jaśniej ? :D
  • +
  • -
  • 0

LoL, 500 postów ;D


#8 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 14.08.2017 09:59

Powiedz lepiej, jak widzisz działanie swojego systemu ładowania danych. Pozwoli to szybciej wskazać poprawny algorytm.
  • +
  • -
  • 0

#9 Ogen Dogen

    Czempion

  • Power User

Reputacja: 261
Wszechwidzący

  • Postów:837
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Dąbrowa Górnicza
Offline

Napisano 14.08.2017 12:29

 

1. Nie możesz, bo cała tablica musi być tego samego typu. Za to możesz konwertować tekst na liczbę - https://amxx.pl/doku...1372/str-to-num
2. Obliczanie procentów to czysta matematyka ;)

new procenty = (liczbaPodlozonychBomb / liczbaWymaganychBomb) * 100; // bez ułamków
new Float:procenty = floatmul(floatdiv(float(liczbaPodlozonychBomb), float(liczbaWymaganychBomb)), 100); // z ułamkami (pamiętaj aby sformatować na wyjściu w celu uniknięcia okresu np. 1/3)
+ ograniczenie
if (missionProgress[id] < 100) missionProgress[id]++;
else // koniec misji

Po zastosowaniu Twojego kodu mam błędy:
 
error 033: array must be indexed (variable "missionData")
warning 204: symbol is assigned a value that is never used: "text"
//
if (missionSelected[id] >= 0)
{
	new procent = (missionProgress[id] / missionData[missionSelected[id]][3]) * 100;
		
	set_hudmessage(0, 255, 0, 0.80, -1.0, 0, 0.0, 1.0)
	ShowSyncHudMsg(id, gSyncHudObj, "[Postep: %i%%]", procent)
}

format(vaultData, 255, "%i", number)
nvault_get(gVault, vaultKey, vaultData, 255)

Formatujesz vaultData, a potem i tak jest to nadpisywane przez nvault_get(). Kombinuj dalej ;)

Ps. Przy wczytywaniu ciągu znaków do zmiennych musisz zarezerwować komórkę na terminator ciągu znaków (stringa) - zwiększ wielkość tablic przy deklaracji o +1.


Nie rozumiem. Mógłbyś trochę jaśniej ? :D

 

 

1. Z tego co widzę to missionData ma 3 wymiary, a ty używasz tylko 2.

2. Jeżeli spodziewasz się, że twój string będzie miał rozmiar n to zadeklaruj jego rozmiar n+1, bo potrzebujesz jeszcze przechować tzw. null terminator. Symbol, dzięki któremu wiadomo gdzie się kończy tekst - https://en.wikipedia...rminated_string


  • +
  • -
  • 1

b_350_20_360204_C20008_FFFFFF_000000.png 193.33.176.115:27015

 

94e23d811c.png

 


#10 Split

    Programista

  • Autor tematu
  • Power User

Reputacja: 106
Zaawansowany

  • Postów:490
  • Imię:Szymon
  • Lokalizacja:Opole
Offline

Napisano 14.08.2017 13:48

Dzięki za pomoc. Rozwiązałem problem z zapisywaniem i działa wyśmienicie. Tylko nadal jest problem z procentami. Cały czas wyświetla się 0%, gdy zabijam kogoś to nadal ta liczba jest taka sama. Masz jakieś pomysły jak można to naprawić ?

Kod wygląda następująco:
new procent = (missionProgress[id] / str_to_num(missionData[missionSelected[id]][3])) * 100

set_hudmessage(0, 255, 0, 0.80, -1.0, 0, 0.0, 1.0)
ShowSyncHudMsg(id, gSyncHudObj, "[%i%%]", procent)
3 argument to jest to:
{"wersja", "typ", "tresc", "1 (TUTAJ PODAJE LICZBE OSOB)", "exp"}, // 0

  • +
  • -
  • 0

LoL, 500 postów ;D


#11 Ogen Dogen

    Czempion

  • Power User

Reputacja: 261
Wszechwidzący

  • Postów:837
  • GG:
  • Steam:steam
  • Imię:Marcin
  • Lokalizacja:Dąbrowa Górnicza
Offline

Napisano 16.08.2017 19:19

Dzięki za pomoc. Rozwiązałem problem z zapisywaniem i działa wyśmienicie. Tylko nadal jest problem z procentami. Cały czas wyświetla się 0%, gdy zabijam kogoś to nadal ta liczba jest taka sama. Masz jakieś pomysły jak można to naprawić ?

Kod wygląda następująco:

new procent = (missionProgress[id] / str_to_num(missionData[missionSelected[id]][3])) * 100

set_hudmessage(0, 255, 0, 0.80, -1.0, 0, 0.0, 1.0)
ShowSyncHudMsg(id, gSyncHudObj, "[%i%%]", procent)
3 argument to jest to:
{"wersja", "typ", "tresc", "1 (TUTAJ PODAJE LICZBE OSOB)", "exp"}, // 0

Spróbuj %0.1f%%. Nie testowałem.

Ewentualnie %i / 100

//edit zakładając, że wyświetla poprawnie zmienną a nie rzeczywiście jest zerem


  • +
  • -
  • 1

b_350_20_360204_C20008_FFFFFF_000000.png 193.33.176.115:27015

 

94e23d811c.png

 


#12 Split

    Programista

  • Autor tematu
  • Power User

Reputacja: 106
Zaawansowany

  • Postów:490
  • Imię:Szymon
  • Lokalizacja:Opole
Offline

Napisano 17.08.2017 15:16

 

Dzięki za pomoc. Rozwiązałem problem z zapisywaniem i działa wyśmienicie. Tylko nadal jest problem z procentami. Cały czas wyświetla się 0%, gdy zabijam kogoś to nadal ta liczba jest taka sama. Masz jakieś pomysły jak można to naprawić ?

Kod wygląda następująco:

new procent = (missionProgress[id] / str_to_num(missionData[missionSelected[id]][3])) * 100

set_hudmessage(0, 255, 0, 0.80, -1.0, 0, 0.0, 1.0)
ShowSyncHudMsg(id, gSyncHudObj, "[%i%%]", procent)
3 argument to jest to:
{"wersja", "typ", "tresc", "1 (TUTAJ PODAJE LICZBE OSOB)", "exp"}, // 0

Spróbuj %0.1f%%. Nie testowałem.

Ewentualnie %i / 100

//edit zakładając, że wyświetla poprawnie zmienną a nie rzeczywiście jest zerem

 

 

 

Nie pomaga. Jak zamienię zmienne stronami to jednak coś działa ale zamiast odejmować to leci tak:

100% 200% 300% itp


  • +
  • -
  • 0

LoL, 500 postów ;D


#13 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 23.08.2017 07:36   Najlepsza odpowiedź

Bez rzutowania na float, musisz to zrobić inaczej.

new procent = (missionProgress[id] / str_to_num(missionData[missionSelected[id]][3])) * 100

Załóżmy:

missionProgress[id] = 16
str_to_num(missionData[missionSelected[id]][3])) = 70

Dla Twojego kodu:

(missionProgress[id] / str_to_num(missionData[missionSelected[id]][3])) * 100  ->  (16 / 70) * 100  ->  0 * 100 = 0 

[ Tak działa dzielenie 'div' - całkowite. 
Brana pod uwagę jest tylko część całkowita dzielenia - dlatego: 16/70={0,2285...}=0 ]

Prawidłowe podejście:

(missionProgress[id]*100) / str_to_num(missionData[missionSelected[id]][3])  ->  (16 * 100) / 70  ->  160 / 70 = 22 

[ Przedstawiając wynik jako liczbę zmiennoprzecinkową, postęp wyniósłby ~22,9%,
ale pamiętajmy, że wykorzystujemy tylko dzielenie całkowite, które zawsze zaokrągla w dół. ]

Użytkownik _McHappy edytował ten post 23.08.2017 07:42

  • +
  • -
  • 1

#14 Split

    Programista

  • Autor tematu
  • Power User

Reputacja: 106
Zaawansowany

  • Postów:490
  • Imię:Szymon
  • Lokalizacja:Opole
Offline

Napisano 23.08.2017 15:23

Działa. Bardzo dziękuję za pomoc.

Problem rozwiązany.
  • +
  • -
  • 0

LoL, 500 postów ;D





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

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