Skocz do zawartości

Przystosowanie kodu od symulacji dropu pod pliki entry

Opublikowano

Cześć

 

Dostosuje mi ktoś ten kod pod entry?

 

struct DropItem
{
	char szName[ITEM_NAME_MAX_LEN + 1];
	DWORD count;
};

ACMD(do_drop)
{
	if (!ch || !ch->GetDesc()) { return; }
	char arg1[256], arg2[256];

	two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2));

	if (!*arg1 || !*arg2)
	{
		ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: drop_simul <mob vnum> <count>");
		return;
	}

	DWORD vnum = 0;
	str_to_number(vnum, arg1);
	DWORD loopCount = 0;
	str_to_number(loopCount, arg2);

	if (vnum == 0 || loopCount == 0)
	{
		ch->ChatPacket(CHAT_TYPE_INFO, "Syntax: drop_simul <mob vnum> <count>");
		return;
	}

	auto* mob = CMobManager::instance().Get(vnum);
	if (!mob)
	{
		ch->ChatPacket(CHAT_TYPE_INFO, "Mob vnum: %u not found", vnum);
		return;
	}


	std::vector<LPITEM> dropVec;
	std::unordered_map<DWORD/*vnum*/, DropItem> dropMap;

	if (ITEM_MANAGER::instance().CreateMobDropVec(vnum, dropVec))
	{
		for (const auto& item : dropVec)
		{
			if (!item) { continue; }
			
			const auto itemVnum = item->GetVnum();
			const auto itemCount = item->GetCount();
			
			if (itemVnum == 0 || itemCount == 0) { continue; }
		
			const auto& it = dropMap.find(itemVnum);
			if (it != dropMap.end())
			{
				it->second.count += itemCount;
			}
			else
			{
				DropItem dropItem{};
				dropItem.count = itemCount;
				strlcpy(dropItem.szName, item->GetName(), sizeof(dropItem.szName));
				dropMap[itemVnum] = dropItem;
			}

			M2_DESTROY_ITEM(item);
		}

		ch->ChatPacket(CHAT_TYPE_PARTY, "############### |cFF6d8cf2|H|h(%d)x %s|h|r DROP SIMULATION ###############", loopCount, mob->m_table.szLocaleName);

		const auto& func = [&](auto& pair)
		{
			auto& [vnum, dropItem] = pair;
			dropItem.count *= loopCount;
			ch->ChatPacket(CHAT_TYPE_PARTY, "Item: %s - Count: %u", dropItem.szName, dropItem.count);
		};

		std::for_each(dropMap.begin(), dropMap.end(), func);
	}
}

 

@Sevence😄 

Rozwiązane przez Sevence

Przejdź do rozwiązania

Featured Replies

Opublikowano

A z czym masz problem? Pliki EntryCore to oryginalna baza, nie ma wielu zmian, dropu nawet nie tykałem. 

Opublikowano
5 minutes ago, Sevence said:

A z czym masz problem? Pliki EntryCore to oryginalna baza, nie ma wielu zmian, dropu nawet nie tykałem. 

Dodałem sobie niedawno wiki dropu, no i w niej nawet pokazuje, że np. w dzikim psie są żółcie do dropu.

Opublikowano
Teraz, Krystian napisał(a):

Dodałem sobie niedawno wiki dropu, no i w niej nawet pokazuje, że np. w dzikim psie są żółcie do dropu.

To problem z systemem. Ja wcale nie modyfikowałem kodu od dropu w żadnym stopniu. 

Opublikowano
  • Autor
error: undefined symbol: do_drop(CHARACTER*, char const*, int, int)
>>> referenced by cmd.cpp
>>>               obj/cmd.o:(cmd_info)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
gmake: *** [Makefile:131: /usr/home/mt2/share/game_new] Error 1
Błąd podczas kompilacji!

 

 

Nie wiem bo w paczcce było tylko co wyżej, a do cmd.cpp sam dodałem:

 

{"drop", do_drop, 0, POS_DEAD, GM_IMPLEMENTOR},

 

oraz to:

 

ACMD(do_drop);

 

Tu się gdzieś generuje errorlog_game ? bo to skopiowałem z putty

 

ale czy to np na entry nie powinno byc inaczej zapisane ? 
 

std::vector<LPITEM> dropVec;
std::unordered_map<DWORD/*vnum*/, DropItem> dropMap;

 

 

Pliki:

cmd_general.cpp - https://pastebin.com/SRGFCtY1

cmd.cpp - https://pastebin.com/q9pFkyuz

Edytowane przez Marchewa

Opublikowano

Wrzucasz tą funkcję w cmd_gm.cpp i cmd.cpp + dopisujesz właśnie do tablicy command_info. 

 

13 minut temu, Marchewa napisał(a):

Tu się gdzieś generuje errorlog_game ? bo to skopiowałem z putty

Nie ma takiego pliku wszystkie błędy pojawiają się bezpośrednio w konsoli. 

 

13 minut temu, Marchewa napisał(a):

ale czy to np na entry nie powinno byc inaczej zapisane ? 

Przecież to vektor do przechowywania potencjalnie wylosowanych przedmiotów w ramach nowej funkcji. 

 

 

Jeśli tak zrobiłeś, spróbuj zrobić pełną rekompilację game. 

Opublikowano
  • Autor
9 minut temu, Sevence napisał(a):

Wrzucasz tą funkcję w cmd_gm.cpp i cmd.cpp + dopisujesz właśnie do tablicy command_info. 

 

Nie ma takiego pliku wszystkie błędy pojawiają się bezpośrednio w konsoli. 

 

Przecież to vektor do przechowywania potencjalnie wylosowanych przedmiotów w ramach nowej funkcji. 

 

 

Jeśli tak zrobiłeś, spróbuj zrobić pełną rekompilację game. 

 

wrzuciłem to do cmd_gm.cpp i wyskakuje

 

cmd_gm.cpp:121:31: error: no member named 'CreateMobDropVec' in 'ITEM_MANAGER'
  121 |         if (ITEM_MANAGER::instance().CreateMobDropVec(vnum, dropVec))
      |             ~~~~~~~~~~~~~~~~~~~~~~~~ ^
1 error generated.
gmake: *** [Makefile:127: obj/cmd_gm.o] Error 1
gmake: *** Waiting for unfinished jobs....
Błąd podczas kompilacji!

 

CMD_GM.cpp - https://pastebin.com/sxPFmXY6

Edytowane przez Marchewa

Opublikowano
  • Rozwiązanie

Brakuje Ci funkcji 'CreateMobDropVec' w item_manager.cpp oryginalnie taka nie istnieje. 

Opublikowano
  • Autor

Racja kod był niekompletny znalazłem inna wersję z wyciekiem pamięci ale na testy styknie.

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