Skocz do zawartości
Opublikowano

Cześć.

Już od jakiegoś czasu staram się znaleźć sposób na dodanie wartości procentowej obok wyświetlanego bonusy jakie postać posiada pod uitarget do nonplayer.

 

Udało mi się ustalić, że użycie funkcji GetStatus z player, zwraca mi null

Taka metoda:

 

	def GetBonusAgainst(self):
		bonus = player.GetStatus()
		print "Debug Bonus Value:", bonus
		return bonus


W log.txt daje wartosc

0201 21:39:24674 :: Debug Bonus Value:0201 21:39:24674 ::  0201 21:39:24674 :: None0201 21:39:24674 :: 

 

Metoda SetHP u mnie wygląda tak:

 

	def SetHP(self, hpNow, hpMax):
		if not self.hpGauge.IsShow():	
			def __getAI(flag):
				name = ['Zwierzeta', 'Nieumarle', 'Diably', 'Ludzie', 'Orki', 'Mistyki', 'Odpornosc na Lod', 'Odpornosc na Ogien']
				flags = []
				for i in xrange(7, -1, -1):  # Zaczynamy od 7, bo mamy 8 elementów w liście 'name'
					if (flag & (1 << i)):  # Sprawdzamy, czy bit na pozycji i jest ustawiony
						try:
							flags.insert(0, "%s" % name[i])  # Dodajemy flagi na początek listy
						except:
							continue
				return flags
			flags = __getAI(nonplayer.GetRaceFlagByVID(self.GetTargetVID()))
			bonusAgainstMonster = self.GetBonusAgainst()
			if bonusAgainstMonster > 0 or len(flags) != 0:
				flagsText = ", ".join(flags)
				bonusNameText = "Bonusy: " + flagsText + (", " if flagsText and bonusAgainstMonster > 0 else "")
			else:
				bonusNameText = "Bonusy: Brak"

			self.bonusName.SetText(bonusNameText)
			
			self.bonusName.UpdateRect()
			self.bonusName.Show()

			self.SetSize(550, 48)
			self.name.SetPosition(6, 9)
			self.name.SetWindowHorizontalAlignLeft()
			self.name.SetHorizontalAlignLeft()
			self.hpGauge.Show()
			self.hpText.Show()
			self.closeButton.Show()
			self.dropButton.Show()
		self.hpGauge.SetPosition(267, 35)
		self.hpGauge.SetWindowVerticalAlignBottom()
		self.hpGauge.UpdateRect()
		self.hpGauge.MakeGauge(230, "red")
		self.hpGauge.SetPercentage(hpNow, hpMax)
		iMinHPText = '.'.join([i - 3 < 0 and str(hpNow)[:i] or str(hpNow)[i-3:i] for i in range(len(str(hpNow)) % 3, len(str(hpNow))+1, 3) if i])
		iMaxHPText = '.'.join([i - 3 < 0 and str(hpMax)[:i] or str(hpMax)[i-3:i] for i in range(len(str(hpMax)) % 3, len(str(hpMax))+1, 3) if i])
		hpPercentage = max(0, (float(hpNow) / max(1, float(hpMax)) * 100))
		self.hpText.SetText("%s / %s (%.2f%%)" % (iMinHPText, iMaxHPText, hpPercentage))
		self.UpdatePosition()

 

 

Tak na 75% jestem pewny że logika odnośnie % bonusów w SetHP jest poprawna, problem zaczyna się już na samym początku gdy chciałem użyć GetStatus do pobrania wartości bonusów, ale może ktoś mnie oświeci bo jestem blady, a problem może być błachy.
 

Import player już standardowo był w pliku, a więc to nie problem z brakiem importu.

No i widok z gry obowiązkowo

obraz.png.b43ea9dedafb10737956f7283323c527.png

Rozwiązane przez atk

Przejdź do rozwiązania

Featured Replies

Opublikowano

Funkcją GetStatus musisz pobierać jakiś konkretny bonus który istnieje na serwerze. Ty stworzyłeś jakoś pustą metodę GetBonusAgainst, która pobiera - nic. 😁

Opublikowano
  • Autor

 

3 minuty temu, Sevence napisał(a):

Funkcją GetStatus musisz pobierać jakiś konkretny bonus który istnieje na serwerze. Ty stworzyłeś jakoś pustą metodę GetBonusAgainst, która pobiera - nic. 😁

To jest jakiś trop xD

Opublikowano

U siebie mam cos takiego moze w czyms pomoze 🙂

 

Spoiler
def ShowAgainstBonuses(self):
		dwRaceFlag = nonplayer.GetRaceFlagByVID(self.GetTargetVID())
		dwType = nonplayer.GetTypeByVID(self.GetTargetVID())
		dwRank = nonplayer.GetRankByVID(self.GetTargetVID())

		self.RACE_FLAG_TO_NAME = {
			1 << 0  : localeInfo.RACE_ANIMAL,
			1 << 1 	: localeInfo.RACE_UNDEAD,
			1 << 2  : localeInfo.RACE_DEVIL,
			1 << 3  : localeInfo.RACE_HUMAN,
			1 << 4  : localeInfo.RACE_ORC,
			1 << 5  : localeInfo.RACE_MILGYO
		}

		self.RACE_FLAG_TO_BONUS_POINT = {
			1 << 0  : 44,
			1 << 1 	: 47,
			1 << 2  : 48,
			1 << 3  : 43,
			1 << 4  : 45,
			1 << 5  : 46,
		}

		def HAS_FLAG(value, flag):
			return (value & flag) == flag

		#todo change this in the future to not use int values

		attbonuses = []

		for i in xrange(20):
			curFlag = 1 << i
			if HAS_FLAG(dwRaceFlag, curFlag):
				if self.RACE_FLAG_TO_NAME.has_key(curFlag):
					bonusVal = player.GetStatus(self.RACE_FLAG_TO_BONUS_POINT[curFlag])
					attbonuses.append(self.RACE_FLAG_TO_NAME[curFlag] % bonusVal)

		if dwType == 2:
			attbonuses.append(localeInfo.RACE_METIN % player.GetStatus(162))

		if dwRank == 4 and dwType != 2:
			attbonuses.append(localeInfo.RACE_BOSS % player.GetStatus(163))

		if dwRank == 5 and dwType != 2:
			attbonuses.append(localeInfo.RACE_DUNG_BOSS % player.GetStatus(164))

		if len(attbonuses) == 0:
			self.bonusName.SetText("Brak aktywnego bonusu")
		else:
			self.bonusName.SetText("Bonus: " + ', '.join(attbonuses))
			print "attbonuses: ",', '.join(attbonuses)

 

 

Opublikowano

że takie coś ?

Screenshot_1.png

Opublikowano
  • Autor
14 minut temu, Denis napisał(a):

że takie coś ?

Screenshot_1.png

Ta, już jakoś to wygląda u mnie ale chętnie dostanę jakieś wskazówki 😅

Opublikowano

@atk To pokaż co tam stworzyłeś i jakie masz problemy. 

Opublikowano
  • Autor

Jutro odpowiem 🙂 Nie ma mnie przy komputerz

  • Sevence zmienił(a) tytuł na Problem z wyświetleniem wartości bonusów w uiTarget
Opublikowano
  • Autor
18 godzin temu, lachimek napisał(a):

U siebie mam cos takiego moze w czyms pomoze 🙂

 

  Pokaż ukrytą zawartość
def ShowAgainstBonuses(self):
		dwRaceFlag = nonplayer.GetRaceFlagByVID(self.GetTargetVID())
		dwType = nonplayer.GetTypeByVID(self.GetTargetVID())
		dwRank = nonplayer.GetRankByVID(self.GetTargetVID())

		self.RACE_FLAG_TO_NAME = {
			1 << 0  : localeInfo.RACE_ANIMAL,
			1 << 1 	: localeInfo.RACE_UNDEAD,
			1 << 2  : localeInfo.RACE_DEVIL,
			1 << 3  : localeInfo.RACE_HUMAN,
			1 << 4  : localeInfo.RACE_ORC,
			1 << 5  : localeInfo.RACE_MILGYO
		}

		self.RACE_FLAG_TO_BONUS_POINT = {
			1 << 0  : 44,
			1 << 1 	: 47,
			1 << 2  : 48,
			1 << 3  : 43,
			1 << 4  : 45,
			1 << 5  : 46,
		}

		def HAS_FLAG(value, flag):
			return (value & flag) == flag

		#todo change this in the future to not use int values

		attbonuses = []

		for i in xrange(20):
			curFlag = 1 << i
			if HAS_FLAG(dwRaceFlag, curFlag):
				if self.RACE_FLAG_TO_NAME.has_key(curFlag):
					bonusVal = player.GetStatus(self.RACE_FLAG_TO_BONUS_POINT[curFlag])
					attbonuses.append(self.RACE_FLAG_TO_NAME[curFlag] % bonusVal)

		if dwType == 2:
			attbonuses.append(localeInfo.RACE_METIN % player.GetStatus(162))

		if dwRank == 4 and dwType != 2:
			attbonuses.append(localeInfo.RACE_BOSS % player.GetStatus(163))

		if dwRank == 5 and dwType != 2:
			attbonuses.append(localeInfo.RACE_DUNG_BOSS % player.GetStatus(164))

		if len(attbonuses) == 0:
			self.bonusName.SetText("Brak aktywnego bonusu")
		else:
			self.bonusName.SetText("Bonus: " + ', '.join(attbonuses))
			print "attbonuses: ",', '.join(attbonuses)

 

 

 

Nakierowało i to bardzo, dziękuje za kod, edytowałem pod siebie. Natomiast mam problem z faktycznymi wartościami tych bonusów, sprawdziłem logiem że GetStatus podaje prawidłową wartość ( postać ma 100% na nieumarle i faktycznie tyle podaje w logu), ale w praktyce w grze wyswietla się wartosc 0. Może ktoś coś widzi, czego ja nie widze.

 

Spoiler
	def ShowAgainstBonuses(self):
		dwRaceFlag = nonplayer.GetRaceFlagByVID(self.GetTargetVID())

		def HAS_FLAG(value, flag):
			return (value & flag) == flag

		RACE_FLAG_TO_BONUS_STATUS = {
			1 << 0: (localeInfo.RACE_ANIMAL, player.GetStatus(18)),
			1 << 1: (localeInfo.RACE_UNDEAD, player.GetStatus(21)),
			1 << 2: (localeInfo.RACE_DEVIL, player.GetStatus(22)),
			1 << 3: (localeInfo.RACE_HUMAN, player.GetStatus(17)),
			1 << 4: (localeInfo.RACE_ORC, player.GetStatus(19)),
			1 << 5: (localeInfo.RACE_MONSTER, player.GetStatus(63)),
			1 << 6: (localeInfo.RACE_MISTIC, player.GetStatus(20)),
			# Dodaj wiecej flag na wzór
		}

		attbonuses = []
		for flag, (race_name, status_id) in RACE_FLAG_TO_BONUS_STATUS.items():
			if HAS_FLAG(dwRaceFlag, flag):
				bonusVal = player.GetStatus(status_id)
				attbonuses.append("{}: {}%".format(race_name, bonusVal))

		if len(attbonuses) == 0:
			self.bonusName.SetText("Brak aktywnego bonusu")
		else:
			self.bonusName.SetText("Bonus: " + ', '.join(attbonuses))

 

 

image.png.868821a1b20b8868b89d2b7fe5eeacc0.png

Edytowane przez atk

Opublikowano
2 minuty temu, atk napisał(a):

 

Nakierowało i to bardzo, dziękuje za kod, edytowałem pod siebie. Natomiast mam problem z faktycznymi wartościami tych bonusów, sprawdziłem logiem że GetStatus podaje prawidłową wartość ( postać ma 100% na nieumarle i faktycznie tyle podaje w logu), ale w praktyce w grze wyswietla się wartosc 0. Może ktoś coś widzi, czego ja nie widze.

 

  Pokaż ukrytą zawartość
	def ShowAgainstBonuses(self):
		dwRaceFlag = nonplayer.GetRaceFlagByVID(self.GetTargetVID())

		def HAS_FLAG(value, flag):
			return (value & flag) == flag

		RACE_FLAG_TO_BONUS_STATUS = {
			1 << 0: (localeInfo.RACE_ANIMAL, player.GetStatus(18)),
			1 << 1: (localeInfo.RACE_UNDEAD, player.GetStatus(21)),
			1 << 2: (localeInfo.RACE_DEVIL, player.GetStatus(22)),
			1 << 3: (localeInfo.RACE_HUMAN, player.GetStatus(17)),
			1 << 4: (localeInfo.RACE_ORC, player.GetStatus(19)),
			1 << 5: (localeInfo.RACE_MONSTER, player.GetStatus(63)),
			1 << 6: (localeInfo.RACE_MISTIC, player.GetStatus(20)),
			# Dodaj wiecej flag na wzór
		}

		attbonuses = []
		for flag, (race_name, status_id) in RACE_FLAG_TO_BONUS_STATUS.items():
			if HAS_FLAG(dwRaceFlag, flag):
				bonusVal = player.GetStatus(status_id)
				attbonuses.append("{}: {}%".format(race_name, bonusVal))

		if len(attbonuses) == 0:
			self.bonusName.SetText("Brak aktywnego bonusu")
		else:
			self.bonusName.SetText("Bonus: " + ', '.join(attbonuses))

 

 

image.png.868821a1b20b8868b89d2b7fe5eeacc0.png

pokaż kod 🙂

Opublikowano
  • Autor
Teraz, Denis napisał(a):

pokaż kod 🙂

Jest w spoilerze 😊

Opublikowano

edit: pokaz kod aktualnej tabeli bonusów

Edytowane przez Denis

Opublikowano
  • Autor
2 minuty temu, Denis napisał(a):

pokaz  uicharacter

https://pastebin.com/GNZAHPHS

Opublikowano

Wujek Denis to jest gość ID się nie zgadzało 🙂

Działa już poprawnie ?

Opublikowano

To wrzućcie rozwiązanie, żeby ktoś kto będzie miał podobny problem miał rozwiązanie. 🙂

Opublikowano
  • Autor
  • Rozwiązanie
W dniu 2.02.2024 o 17:53, Denis napisał(a):

Wujek Denis to jest gość ID się nie zgadzało 🙂

Działa już poprawnie ?

Dziękuje @Denis, zmiana tych ID przyśpieszyło w naprawie.

Co do odpowiedzi na moje pytanie, zrobiłem przerwe weekendową, a więc dopiero teraz

Należy sprawdzać jaką zmienną faktycznie się wyświetla i co ona przetrzymuje w sobie. U mnie był problem z tym, że nie używałem w kodzie zmiennej odpowiadającej za wartości w dobrym miejscu, ot cała zagadka. Działa już poprawnie. Dziękuje za odpowiedzi. Jak zawsze problem błachy, co mnie tiltuje w takich momentach jak ten 🤣
@Sevence Można zamknąć, bardzo proszę.
image.png.ad04210393afddcea6f367af1cf54ab0.png

  • Sevence zablokował(a) ten temat
Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.