Ir para conteúdo
  • Cadastre-se

Programação [TFS 1.3] Problema com terceira prey slot


Posts Recomendados

.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

 

Link para o post
Compartilhar em outros sites
  • 8 months later...

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

Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.


  • Conteúdo Similar

    • Por Muvuka
      Alguem tem anti-nuker igual a esse 
       

       
    • Por Muvuka
      [SQLite] -=[TFS]=- 0.4 8.60 Alguem faz apk mobile pra mim ip: dexsoft.ddns.net
       
      pra mim
       
      https://www.mediafire.com/file/5klqnyy6k7jda0u/OTClientV8.rar/file
       
      TA TUDO AI
    • Por yuriowns
      Salve rapazes, estou precisando de um client próprio para o meu servidor 7.4, preciso que algum programador experiente e com referências faça um client do jeito que eu procuro. Responda aqui para fazermos um orçamento, obrigado!

      Não sei se estou no lugar certo, se não me desculpem e peço que movam por gentileza!
    • Por paulo thush
      Pessoal to com um grande problema, estou com um servidor TFS 1.4x 10.98, recentemente começou dar um problema, sempre quando falava "trade" com o npc dava um erros, com qual quer npc, o erro e o seguinte.
       
       
      me falaram que o problema e nas sourcer que precisava mudar umas coisas me passaram um link no github esse aqui 
      https://github.com/otland/forgottenserver/pull/3996/files
       
      porem eu vi vídeos no youtube ensinando a compilar, já vi muitos tópicos como compilar a sourcer, ai quando vou compilar da esse erro
      já tentei instalar, desinstala muitas coisas, alterar também não vai, minha sourcer e essa 
      https://github.com/otland/forgottenserver
       
       
      Alguém poderia me ajuda com esse erro, ou ate compilar 100% as sourcer. os Tópicos que eu tentei para compilar e esse daqui, se não poder o link me desculpe.
      https://forums.otserv.com.br/index.php?/forums/topic/169234-windowsvc2019-compilando-sources-tfs-14-vcpkg/
       
      alguém me da uma luz por favor kkk
    • Por Ryzek
      Uso tfs 0.4 trunk3884 bem simples.
      Queria acrescentar magic effects para 255 pois o meu só vai até 69. Encontrei um tópico que falava sobre porém parece ter sido removido, não consigo acessar!
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo