Ir para conteúdo

Featured Replies

Postado

.Qual servidor ou website você utiliza como base? 

OTServBR - Global (https://github.com/opentibiabr/OTServBR-Global)

 

Qual o motivo deste tópico? 

No servidor que estou utilizando como base, os três prey slots vem liberados por padrão. Eu gostaria de bloquear o terceiro slot, e permitir liberá-lo através da compra na game store.

 

A informação desses slots fica guardada na tabela "prey_slots", onde temos as colunas "player_id, num, state e unlocked". A coluna "num" identifica qual slot é (0, 1 ou 2). A coluna "state" identifica se o slot está sem nenhum bixo selecionado, se há algum bixo selecionado ou se está inativa. A coluna "unlocked" identifica se o slot está liberado ou desativado (0 ou 1).

 

Por padrão, quando você loga pela primeira vez no char, é registrado na tabela "prey_slots" os seguites registros:

Cabeçalho: player_id, num, state, unlocked.

x, 0, 3, 1

x, 1, 3, 1

x, 2, 3, 1

 

Onde "x" é o id do player, state = 3 para todos indicando que o slot está disponível para selecionar alguma criatura, e unlocked = 1 para todos indicando que o player "x" possui permissão de utilizar o slot.

 

Essa informação de como os registros serão registrados nessa tabela fica nesse trecho de código do arquivo "src/iologindata.cpp":

 

Spoiler

// New Prey
bool IOLoginData::loadPlayerPreyData(Player* player) 
{
	Database& db = Database::getInstance();
	DBResult_ptr result;
	std::ostringstream query;
	query << "SELECT `num`, `state`, `unlocked`, `current`, `monster_list`, `free_reroll_in`, `time_left`, `next_use`, `bonus_type`, `bonus_value`, `bonus_grade` FROM `prey_slots` WHERE `player_id` = " << player->getGUID();
	if ((result = db.storeQuery(query.str()))) {
		do {
			uint16_t slotNum = result->getNumber<uint16_t>("num");
			player->preySlotState[slotNum] = result->getNumber<uint16_t>("state");
			player->preySlotUnlocked[slotNum] = result->getNumber<uint16_t>("unlocked");
			player->preySlotCurrentMonster[slotNum] = result->getString("current");
			player->preySlotMonsterList[slotNum] = result->getString("monster_list");
			player->preySlotFreeRerollIn[slotNum] = result->getNumber<uint16_t>("free_reroll_in");
			player->preySlotTimeLeft[slotNum] = result->getNumber<uint16_t>("time_left");
			player->preySlotNextUse[slotNum] = result->getNumber<uint32_t>("next_use");
			player->preySlotBonusType[slotNum] = result->getNumber<uint16_t>("bonus_type");
			player->preySlotBonusValue[slotNum] = result->getNumber<uint16_t>("bonus_value");
			player->preySlotBonusGrade[slotNum] = result->getNumber<uint16_t>("bonus_grade");
		} while (result->next());
	}
	else {
		query.str(std::string());
		DBInsert preyDataQuery("INSERT INTO `prey_slots` (`player_id`, `num`, `state`, `unlocked`, `current`, `monster_list`, `free_reroll_in`, `time_left`, `next_use`, `bonus_type`, `bonus_value`, `bonus_grade`) VALUES ");
		for (size_t num = 0; num < PREY_SLOTNUM_THIRD + 1; num++) {
			query << player->getGUID() << ',' << num << ',' << 3 << ',' << 1 << ',' << db.escapeString("") << ',' << db.escapeString("") << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0;
			if (!preyDataQuery.addRow(query)) {
				return false;
			}
		}
		if (!preyDataQuery.execute()) {
			return false;
		}
		// Reload player data
		return loadPlayerPreyData(player);
	}

	return true;
}

 

 

Então para bloquear o terceiro slot por padrão, pensei em alterar a query que insere os registros, desse jeito:

 

De:

DBInsert preyDataQuery("INSERT INTO `prey_slots` (`player_id`, `num`, `state`, `unlocked`, `current`, `monster_list`, `free_reroll_in`, `time_left`, `next_use`, `bonus_type`, `bonus_value`, `bonus_grade`) VALUES ");
		for (size_t num = 0; num < PREY_SLOTNUM_THIRD + 1; num++) {
			query << player->getGUID() << ',' << num << ',' << 3 << ',' << 1 << ',' << db.escapeString("") << ',' << db.escapeString("") << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0;

 

Para:

DBInsert preyDataQuery("INSERT INTO `prey_slots` (`player_id`, `num`, `state`, `unlocked`, `current`, `monster_list`, `free_reroll_in`, `time_left`, `next_use`, `bonus_type`, `bonus_value`, `bonus_grade`) VALUES ");
		for (size_t num = 0; num < PREY_SLOTNUM_THIRD + 1; num++) {
			query << player->getGUID() << ',' << num << ',' << "CASE WHEN `num` = 2 THEN 1 ELSE 3 END" << ',' << "CASE WHEN `num` = 2 THEN 0 ELSE 1 END" << ',' << db.escapeString("") << ',' << db.escapeString("") << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0 << ',' << 0;

 

Até ai beleza... Consegui - de um jeito bem porco - bloquear o terceiro slot por padrão. Porém agora não sei o que fazer para liberar esse slot quando o player compra na gamestore. Atualmente, quando o jogador compra o slot na gamestore, ele recebe o storage id "63253" com o valor "1", porém nada mais acontece. Pensei então em botar para atribuir o storage e então logo em seguida rodar o update na tabela "prey_slots" atualizando os valores de "state" para 3 e "unlocked" para 1 onde "num" for 2, e quando isso acontece, ele até atualiza no banco de dados porém o slot não é liberado instantaneamente para o player, teoricamente ele deveria deslogar e logar para que sejam lidos os novos valores dessa tabela, mas quando ele reloga, os valores de "state" e "unlocked" voltam para 1 e 0 respectivamente.

 

Já tentei colocar esse mesmo update no arquivo "data/creaturescript/scripts/others/logout.lua", verificando se o player possui a storage e se o valor de "unlocked" for 0, mas não funcionou.

 

Não vou conseguir postar as minhas tentativas além desse de/para que postei acima do arquivo iologindata.cpp porque esmurrei tanto os arquivos que acabei fazendo muita merda e tive que retornar para o ponto onde estava quando apenas deixei o terceiro slot bloqueado.

 

Me falta muito conhecimento a respeito da sintaxe C++ e também LUA, por isso estou me ferrando tanto, e por isso também que optei por bloquear o terceiro slot pela query ao invés de ir por um caminho mais descente.

 

Se alguém puder me ajudar, ficarei muito grato e com certeza darei rep++ para todos que pelo menos tentarem me ajudar.

 

Caso faltei com alguma informação essencial, por gentileza me questione abaixo que forneço o que for preciso.

 

Perdoem-me pelo textão, eu sei, TLDR mas tentei ser o mais claro o possível e agora já são 13:32 e estou trabalhando em implementações e correções desde ontem de tarde, então já estou bem lesado kkk.

 

Está surgindo algum erro? Se sim coloque-o aqui. 

--

 

Você tem o código disponível? Se tiver publique-o aqui: 

--

 

Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui. 

--

Editado por VitorNM (veja o histórico de edições)

nbeTETb.png?1

 

  • 8 months later...
Postado

Quando você cria um char e loga a primeira vez vem os 3 liberados? Não tou familiarizado com client 12+, mas se sim, isso deve ter alguma opção no config.lua, ou ele pega dos samples seus vc teria q modificar ai, caso for o samples vc modifica na database do contrario esqueça a database e o iologindata.cpp alias volta as alterações que vc fez, o iologindata.cpp apenas carrega as informações que ta na database e seta no char, e ao desloga sava elas na database novamente. Você mudando ai não ira influenciar mesmo pois o jogo nao comunica com a database pra saber se vc tem prey, somente no login e logout, vc teria que usar a função mostrada ai pra desbloquar 

player->preySlotUnlocked[slotNum] = valor;

onde slotNum é o qual slot 0 a 2, e valor é 0 ou 1 como vc disse, feito isso quando ele efetuar o logout ira salvar, e hr q logar ira puxar oq foi salvo. Como vc pode definir isso corretamente nao sei te falar pois nao conheço nada desse sistema, mas em gambiarras poderia colocar uma verificação de storage no fim do load, se tiver ela seta a função unlocked e vende a storage no gamestore, ou se souber editar o gamestore pode fazer por ele mesmo setar ela...

Não posso te ajuda especificamente pq nao sei, e nao to com tempo pra aprende, mas se tentar ou tiver duvida so pergunta.

Discord: Naze#3578

 

Ter Linux Dentro de Windows com Acesso 'localhost' para testes e +

AutoLoot Otimizado Direto na Source (tfs 0.4/otx)

 

// Pirataria é crime, original é roubo, compartilhar é legal.

 

tumblr_muk78tEwDQ1qah4nko1_500.gif

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo