• 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!

Nowy storage?

Seminari

Banned User
Joined
Dec 13, 2009
Messages
1,496
Reaction score
34
Location
Poland
Więc tak, chciałbym stworzyć nowy storage, który by działał tak jak zwyczajny (setPlayerStorageValue/getPlayerStorageValue) chodzi mi o storage ten zwykły dla gracza który my parametry cid, key, value

chciałbym dokładnie go skopiować tylko potem zmienić nazwę na
PlayerQuestStorage by także miał warunki key value


chcę tak zrobić ponieważ:
1. Mam ostry zapierdol ze storagami i wykorzystałem ich w pizdu dużo, wiem, że jeszcze w chuj zostało, ale wolę to lepiej ogarnąć, po za tym na queststorage bym opierał same questy, co też by potem ułatwiło mi w paru rzeczach


Pytanie, jak to dokładnie zrobić krok po kroku co muszę do jakich plików w source dodać? Z pytaniem przyszedłem na forum, bo wolę czegoś nie spierdolić.
 
Ja wale, nie chce tego samego storage co jest tylko chce zrobić nowy czaisz? Oprócz normalnych player_storage w bazie by miał się zapisywać jako player_QuestStorage

...
 
Nie chcę właśnie by leciało od razu do bazy bo to strasznie będzie zamulać zapewnie, chcę zrobić to dokładnie jak zwykły storage, (on się zapisuje przy save'ie oraz przy relogu postaci tak btw)
 
Spróbuje to tak jak najjaśniej opisać. Na początku trzeba duplikować tablicę ze storage'ami, i oczywiście podmienić jej nazwę, wszystko znajdziesz w pliku creature.h, wystarczy tam jeszcze dodać odpowiednie funkcje, służące do obsługi iteratora, typu getStorageBegin, getStorageEnd.
Póżniej, gdy to zrobisz musisz dodać funkcję, która będą pobierać, ustawiać dane, nie musisz (jeśli oczywiście nie chcesz) dodawać także dodatkowych funkcji typu: getCreatureStorageList itd. Wystarczy wszystko zrobić analogicznie do oryginałów.
PHP:
int32_t LuaInterface::luaGetCreatureStorage(lua_State* L)
{
	//getCreatureStorage(cid, key)
	std::string key = popString(L);
	ScriptEnviroment* env = getEnv();
	if(Creature* creature = env->getCreatureByUID(popNumber(L)))
	{
		std::string strValue;
		if(!creature->getStorage(key, strValue))
		{
			lua_pushnumber(L, -1);
			lua_pushnil(L);
			return 2;
		}

		int32_t intValue = atoi(strValue.c_str());
		if(intValue || strValue == "0")
			lua_pushnumber(L, intValue);
		else
			lua_pushstring(L, strValue.c_str());
	}
	else
	{
		errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND));
		lua_pushboolean(L, false);
	}

	return 1;
}
Oczywiście na końcu, musisz to wszystko zapisać do tablicy. Jeśli chodzi o sprawę MySQL wystarczy, że obejdzie się do duplikacji starej (player_storage), i podmiany nazwy. Teraz wystarczy, że przejdziesz do pliku iologindata.cpp, i w funkcji savePlayer dodać procedurę, analogiczną do tej
PHP:
	query.str("");
	query << "DELETE FROM `player_storage` WHERE `player_id` = " << player->getGUID();
	if(!db->query(query.str()))
		return false;

	player->generateReservedStorage();
	query_insert.setQuery("INSERT INTO `player_storage` (`player_id`, `key`, `value`) VALUES ");
	for(StorageMap::const_iterator cit = player->getStorageBegin(); cit != player->getStorageEnd(); ++cit)
	{
		sprintf(buffer, "%u, %s, %s", player->getGUID(), db->escapeString(cit->first).c_str(), db->escapeString(cit->second).c_str());
		if(!query_insert.addRow(buffer))
			return false;
	}

	if(!query_insert.execute())
		return false;

Gdybym coś namieszał to pisz, jestem troszeczkę nie wyspany, i mogłem się poplątać.
 
nie chcesz, aby od razu do bazy leciało? to zapisuj w tablicy, a podczas server save/player save wysyłaj do bazy, tak samo, żeby nie pobierało co chwile danych z bazy - przy logowaniu gracza zapisujesz do tablicy jego storage i śmiga.
 
Back
Top