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
Split
13.08.2017
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.
Robiin
13.08.2017
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
Ogen Dogen
13.08.2017
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
Split
13.08.2017
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 matematykanew 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)+ ograniczenieif (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) }
_McHappy
13.08.2017
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
Split
14.08.2017
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 matematykanew 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)+ ograniczenieif (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 ?
_McHappy
14.08.2017
Ogen Dogen
14.08.2017
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 matematykanew 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)+ ograniczenieif (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 ?
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
Split
14.08.2017
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
Ogen Dogen
16.08.2017
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
Split
17.08.2017
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"}, // 0Spró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
Najlepsza odpowiedź
_McHappy
23.08.2017
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