• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!
  • 2026 staff recruitment is open! Check it out and consider applying!

getAllItemHoldingCount

MeNi

*^#%$%
Joined
Jul 23, 2008
Messages
183
Reaction score
12
Otóż mam taką sobie funkcyjkę w TFSie:

Code:
uint32_t Container::getItemHoldingCount() const
{
	uint32_t counter = 0;
	for(ContainerIterator it = begin(); it != end(); ++it)
		++counter;

	return counter;
}

i na jej podstawie chciałbym zrobić coś takiego:

Code:
uint32_t Container::getAllItemHoldingCount(const uint32_t rec) const
{	
	if(rec > g_config.getNumber(ConfigManager::MAX_ITEM_COUNT))
		return rec+1;
		
	uint32_t counter = 0;
	
	for(ContainerIterator it = begin(); it != end(); ++it)
	{
        if(const Container* container = (*it)->getContainer())
			counter = container->getAllItemHoldingCount(counter) + 1;
		else
			[COLOR="#FF0000"]counter = 1;[/COLOR]
	}
	
	return counter;
}

niestety, ale ta druga funkcja nie działa, zawsze zwraca jakieś dziwne wyniki z okolic 0,1,2, co jest nie tak?



// EDIT:

Code:
uint32_t Container::getAllItemHoldingCount(const uint32_t rec) const
{	
	if(rec > g_config.getNumber(ConfigManager::MAX_ITEM_COUNT))
		return rec+1;
		
	uint32_t counter = 0;
	
	for(ContainerIterator it = begin(); it != end(); ++it)
	{
        if(const Container* container = (*it)->getContainer())
			counter = container->getAllItemHoldingCount(counter) + 1;
		else
			[COLOR="#00FF00"]++counter;[/COLOR]
	}
	
	return counter;
}
 
Last edited:
Teraz funkcja działa tak, że jeśli itemy są w pierwszym bp (tym, w którym funkcja jest pierwszy raz wywolywana) to są liczone pojednyńczo, jeśli są w bp, który jest w głownym bp, to są liczone podwójnie, jeśli głębiej, to odpowiednio n-razy... funkcja wygląda tak:

Code:
uint32_t Container::getAllItemHoldingCount(uint32_t rec)
{	
    std::clog << "G-ENTERED" << std::endl;
	if(rec > g_config.getNumber(ConfigManager::MAX_ITEM_COUNT))
		{std::clog << "G-RET-REC:" << rec+1 << std::endl; return rec+1;}
		
	uint32_t counter = 0;
	for(ContainerIterator it = begin(); it != end(); ++it)
	{
		std::clog << "G-FOR" << std::endl;
        if(Container* container = it->getContainer())
			{std::clog << "G-CONT-REC:" << counter+rec << "/CTR:" << counter << std::endl; counter += container->getAllItemHoldingCount(counter+rec) + 1;}
		else
			{std::clog << "G-ITEM-CTR:" << counter << std::endl; ++counter;}
	}
	std::clog << "G-END-RET:" << counter << std::endl;
	return counter;
}

dla takiej struktury:
bp0=(item,item,bp1,item,item)
bp1=(item,item)
zwraca 9 itemów, zamiast 7:

Code:
[21:41:11.609] G-ENTERED
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:0
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:1
[21:41:11.609] G-FOR
[21:41:11.609] G-CONT-REC:2/CTR:2
[21:41:11.609] G-ENTERED
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:0
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:1
[21:41:11.609] G-END-RET:2
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:5
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:6
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:7
[21:41:11.609] G-FOR
[21:41:11.609] G-ITEM-CTR:8
[21:41:11.609] G-END-RET:9

[21:41:11.609] ALLITEMZ = 9

dla takiej struktury:
bp0=(item,item,bp1,item,item)
bp1=(item,item,item,item)
zwraca 13 itemów, zamiast 9:

Code:
[21:42:55.671] G-ENTERED
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:0
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:1
[21:42:55.671] G-FOR
[21:42:55.671] G-CONT-REC:2/CTR:2
[21:42:55.671] G-ENTERED
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:0
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:1
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:2
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:3
[21:42:55.671] G-END-RET:4
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:7
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:8
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:9
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:10
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:11
[21:42:55.671] G-FOR
[21:42:55.671] G-ITEM-CTR:12
[21:42:55.671] G-END-RET:13

[21:42:55.671] ALLITEMZ = 13

co jest nie tak?
 
Twoje założenie zlicza wszystkie przedmioty w danym kontenerze oraz we wszystkich kontenerach, jakie gracz posiada.
BP2 = { Item, Item } / += 2
BP1 = { Item, Item } / += 2
BP0 = { BP1, BP2 } / += 2 + BP1 + BP2

Wynik = BP0 + BP1 + BP2
 
Wynik = BP0 + BP1 + BP2

tak powinno byc, ale z jakiegos dziwnego powodu liczy nikotre itemy podwojnie/potrojnie itp...

tutaj co mam w backpacku:
Gq2ku.png


i zamiast wyniku 9 itemów podaje 13:

funkcja idzie mniej więcej tak:

Code:
pierwszy pick (+1)
drugi pick (+1)
wchodzi do bp, 1,2,3,4-ty pick -> return 4;
backpack (+1) + itemy w bp (+4)
// do tego miejsca działa dobrze, ale tutaj zamiast:
pick (+1)
pick (+1)
koniec
// jest:
pick (+1)
pick (+1)
[COLOR="#FF0000"]pick (+1)
pick (+1)
pick (+1)
pick (+1)[/COLOR] // na czerwono zlicza jeszcze raz picki z drugiego bp, które już zliczało wcześniej
koniec
 
Code:
for(ContainerIterator it = begin(); it != end(); ++it)
	{
		std::clog << "G-FOR" << std::endl;
        if(Container* container = it->getContainer())
			{std::clog << "G-CONT-REC:" << counter+rec << "/CTR:" << counter << std::endl; counter += container->getAllItemHoldingCount(counter+rec) + 1;}
		else
			{std::clog << "G-ITEM-CTR:" << counter << std::endl; ++counter;}
	}

>.>
Czytaj co napisałem wyżej + analizuj swój algorytm, bo z tego co widzę, nie masz bladego pojęcia o nim. :blink:

//teraz doczytałem
Wynik = BP0 + BP1 + BP2

tak powinno byc, ale z jakiegos dziwnego powodu liczy nikotre itemy podwojnie/potrojnie itp...
Oj, tu się mylisz. Myślałem, że zrozumiesz, ale okej, rozpiszę Ci to:
Wynik = BP0 + BP1 + BP2 / rozbijamy
Wynik = 2 + BP1 + BP2 + BP1 + BP2 / gdzie 2 oznacza ilość przedmiotów w BP0
 
tak, chwilke po napisaniu tego postu zalapalem, ze getItemHoldingCount() standardowo robi to, co ja chcialem osiagnac (wszystkie itemy w glab backpacków, a nie traktuje backpack w środku, jako jeden item, nawet jak nie jest pusty)
 
teraz mam pewnien problem z dodaniem czegoś takiego:

Code:
const Cylinder* topParent = getTopParent();

if(topParent->getItemHoldingCount() + addCount > g_config.getNumber(ConfigManager::MAX_ITEM_COUNT))
	return RET_THISISIMPOSSIBLE;

do Container::__queryAdd w container.cpp

Code:
~source\container.cpp invalid conversion from `const Cylinder*' to `const Container*'

chodzi tutaj o to, że getTopParent() jest "Cylinder*", a do wywołania getItemHoldingCount() potrzebny jest "Container*"
 
Więc w czym problem, bo nie rozumiem? Kompilator sam wytyka Ci błąd, zresztą sam go opisałeś. Naucz się odczytywać logi.
 
wiem co oznacza błąd, nie wiem jak rozwiązać mój problem, żeby go nie było.

Może inaczej:

mam taką funkcję:

Code:
ReturnValue Container::__queryAdd(int32_t index, const Thing* thing, uint32_t count, uint32_t flags) const
{
// (...)
}
i chcę z jej wnętrza pobrać do zmiennej np. const Container* topParent najwyższy bp/inny container, w którym znajduje się container, do którego dodajemy item przez __queryAdd, aby potem wywołać getItemHoldingCount() i zliczyć wszystkie przedmioty, które są w całej gałęzi backpacków/innych kontenerów, zaczynając od piewrwszego.

Przykład

BP0: [item,item,BP1,item,item]
BR1: [item,BP2]
BP2: [item,item,BP3]
BP3: [item]

i powiedzmy, że wkładam przedmiot do BP2. Wywoływane jest Container::__queryAdd dla BP2, i jeśli użyję tutaj getItemHoldingCount() to zliczy tylko itemy z BP2 i BP3, dlatego chcę pobrać do zmiennej topParent BP0 i dla niego uruchomić topParent->getItemHoldingCount() żeby zliczyć wszystkie przedmioty (BP0,BP1,BP2,BP3)

Próbowałem w następujący sposób:

Code:
ReturnValue Container::__queryAdd(int32_t index, const Thing* thing, uint32_t count, uint32_t flags) const
{
(...)
const Cylinder* topParent = getTopParent();

if(topParent->getItemHoldingCount() + addCount > g_config.getNumber(ConfigManager::MAX_ITEM_COUNT))
	return RET_THISISIMPOSSIBLE;
}

ale getTopParent() zwraca Cylinder* (nutaj nie wiem, czym różni się on od Container* i do czego służy, bo w niektórych miejscach w kodzie jest do niego porównywany, wiec jest to coś podobnego do Container* prawdopodobnie)

próbowałem tak:
Code:
ReturnValue Container::__queryAdd(int32_t index, const Thing* thing, uint32_t count, uint32_t flags) const
{
(...)
Container* topParent = this;
while (topParent->getParentContainer())
{
	topParent = topParent->getParentContainer();
}

if(topParent->getItemHoldingCount() + addCount > g_config.getNumber(ConfigManager::MAX_ITEM_COUNT))
	return RET_THISISIMPOSSIBLE;

wtedy mam błąd:

Code:
~source\container.cpp invalid conversion from `const Container* const' to `Container*'

Jakieś pomysły, jak to zrobić?
 
@Meni Owszem, mam jeden, naucz się podstaw C++. Niby coś tam edytujesz, ale edytujesz to na czuja.
@Seminari a jakim cudem chcesz sprawdzić, czy gracz ma zamiar dodać coś do plecaka?
 
@Meni Owszem, mam jeden, naucz się podstaw C++. Niby coś tam edytujesz, ale edytujesz to na czuja.
@Seminari a jakim cudem chcesz sprawdzić, czy gracz ma zamiar dodać coś do plecaka?

i tak źle robicie tego fixa, da się go obejść łatwo
 
A ja zrobiłem takiego fixa na 2k itemków. Tylko że w internalMove/AddItem ;p.

Hm, a jeśli masz w bp 2000 itemów, i dolozysz jeszcze jeden w wolne miejsce, to wyswietli wiadomosc np. too many items in container, i nic sie nie stanie, czy itemek ktory dodajesz zniknie?
 

Similar threads

Back
Top