Ir para conteúdo
  • Cadastre-se

(Resolvido)GlobalStorages ou Storage para players


Ir para solução Resolvido por Tadelho,

Posts Recomendados

Base: 

TFS 0.4.0

 

Qual erro está surgindo/O que você procura?

 

Resolvi fazer um script para quando o player pisasse em um determinado SQM, surgisse um NPC em certo ponto do mapa. A minha ideia era que o npc surgisse apenas uma vez, então resolvi utilizar uma globalstorage para que assim que o primeiro player acionasse o evento, todos os demais não conseguissem. O script funcionou perfeitamente, e de fato apenas o primeiro player consegue trazer o NPC para o local desejado. O problema é que a global storage não fica salva no valor que eu determinei (no caso, "1") e quando o servidor é fechado/reinicia, os outros jogadores conseguem acionar o evento - o que eu não quero que aconteça.

 

Gostaria de saber se as globalstorage permanecessem salvas, ou o que fazer para que elas fiquem salvas. 

Notei que no config.lua há a seguinte opção:     "saveGlobalStorage = true", mas ela já está configurada como "true", então não creio que seja isso.

 

Acho que não é a opção ideal, mas para solucionar o caso, também seria possível atualizar a storage de todos os players do servidor (ao invés de utilizar a global storage). Se alguém puder me ajudar com o script, eu agradeço.

 

Imagino que ficaria algo como: "for (id do primeiro ao último player do banco de dados)

atualizar o value de uma key da tabela player_storage", mas eu não faço ideia de como isso fica em código.

 

 

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

local pos = {x=875,y=398,z=7} -- Local do NPC

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
	if getGlobalStorageValue(9000) <= 0 then 
		if isPlayer(cid) and getPlayerAccess(cid) < 3 and getPlayerStorageValue(cid, 9000) <= 0 then
			doCreateNpc("GoblinAssustadoOesteCidade", pos)
		end
		setGlobalStorageValue(9000, 1)
	end		
   return true
end 

 

Link para o post
Compartilhar em outros sites
local pos = {x=875,y=398,z=7} -- Local do NPC

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
	if not (npc_tile) then
		if getGlobalStorageValue(9000) <= 0 then 
			if isPlayer(cid) and getPlayerAccess(cid) < 3 and getPlayerStorageValue(cid, 9000) <= 0 then
				npc_tile = doCreateNpc("GoblinAssustadoOesteCidade", pos)
			end
			setGlobalStorageValue(9000, 1)
		end
	end
   return true
end 

Acredito que isso resolva, colega. A solução é guardar o uid do npc criado e fazer a verificação se ele existe ou não cada vez que o jogador pisar no piso. Caso não resolva, buscaremos outra forma para solucionar isso aí, :). 

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites

@lordzetros o problema é que eu quero que seja um evento único ao longo de todo o jogo, entende? Esse NPC inclusive irá sumir depois de outro acontecimento. Preciso que o aparecimento dele fique registrado mesmo depois do servidor ser fechado/reiniciado. Eu pretendia utilizar as storages porque depois as usarei como andamento de uma quest que vale para todo e qualquer jogador.

 

Eu sei que isso será possível da seguinte forma:

1) a globalstorage 9000 recebe o valor 1 e isso fica salvo, mesmo quando o servidor reiniciar (seria o ideal, acredito), ou...

2) todos os players recebem o valor 1 na player_storage 9000.

Link para o post
Compartilhar em outros sites

@Tadelho Estranho, nunca vi esse caso do globalStorage não salvar, eu ia recomendar dá uma olhada no config.lua, mas como você já disse que alterou para true, já deveria está funcionando. 

 

Em questão de alterar o storage, o mais viável para se fazer isso seria atualizando pela database, já que nem todos os jogadores estariam online. Daqui a pouco penso em uma solução para isso. 

Feliz daquele que ensina o que sabe, e aprende o que ensina.

 

               

star-wars-animated-gif-23.gif

Link para o post
Compartilhar em outros sites

Não precisa usar global storage, pega o cid do npc:

 

 

local pos = {x=875,y=398,z=7} -- Local do NPC
local npc = "GoblinAssustadoOesteCidade"
function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
	if isPlayer(cid) and getPlayerAccess(cid) < 3 then
		local creature = getCreatureByName(npc)		
		if creature ~= nil then
			doPlayerSendTextMessage(cid, MESSAGE_EVENT_DEFAULT, "O NPC ja esta andando por este mapa!.")
		else
			doCreateNpc(npc, pos)
		end	
	end
	return true
end

 

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites

@Vodkart, se você puder, leia a resposta anterior que deixei. Eu preciso registrar o evento do NPC ter aparecido alguma vez para seguir uma quest válida para todos os players. Não estou tendo problemas em duplicar o NPC nem nada. Enquanto o servidor está rodando o script funciona perfeitamente conforme o planejado. O problema é que ao fechar/reiniciar o servidor a globalstorage perde o valor e aí tudo recomeça, o que eu não quero que aconteça. Para solucionar isso eu preciso ou manter o valor da globalstorage, que eu não sei por que diabos some, ou atualizar o valor de uma storage dos players (o que consumiria mais processamento e memória, mas estou disposto a tentar ).

 

Edit: vou deixar de lado o código e explicar com palavras a mecânica esperada. Talvez ajude.

 

-> Se o NPC ainda não apareceu na história do servidor, um jogador pode fazê-lo aparecer ao pisar em um sqm.

-> Se o NPC já apareceu alguma vez na história, ele não deve aparecer jamais, em hipótese alguma, mesmo que o servidor seja reiniciado e etc.

 

Para solucionar isso eu imaginei que a globalstorage servisse, ou um registro geral em todos os players.

Editado por Tadelho
Atualização de informações. (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

executa essa query:

 

 

CREATE TABLE npc_quest (
    create   	INT             NOT NULL
                              DEFAULT 0,
    PRIMARY KEY ( id ) 
);

 

 

e usa o script assim:

 

local pos = {x=875,y=398,z=7} -- Local do NPC
local npc = "GoblinAssustadoOesteCidade"
function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
	if isPlayer(cid) and getPlayerAccess(cid) < 3 then
       if db.getResult("SELECT `create` FROM `npc_quest`;"):getDataInt("create") <= 0 then
			doCreateNpc(npc, pos)
			db.executeQuery("UPDATE `npc_quest` SET `create` = 1;")
		end	
	end
	return true
end

 

 

futuramente, quando for "remover o npc usa esta linha para voltar para 0

 

db.executeQuery("UPDATE `npc_quest` SET `create` = 0;")

 

 

-------------------------------------------------------------

 

ai para dar sequencia a sua quest, e se ele tiver aparecido alguma vez na vida, você usa assim:

 

if db.getResult("SELECT `create` FROM `npc_quest`;"):getDataInt("create") > 0 then
-- sim o npc ja foi criado alguma vez
end

 

-----------------------------------------------------------------------------------------------

@Tadelho

 

Conseguiu? fiz exatamente o que descreveu... aguardo respostas!

vodkart_logo.png

[*Ninguém será digno do sucesso se não usar suas derrotas para conquistá-lo.*]

 

DISCORDvodkart#6090

 

Link para o post
Compartilhar em outros sites

@Vodkart irei testar logo menos e já respondo. É que este padrão se repetirá muitas vezes com outras actions e conforme a história da quest avança. O valor da tabela mudará muitas vezes por isso eu estava tentando lidar com as storages com as quais sou mais familiarizado e sei que funcionam bem para gerenciar isso.

 

A propósito, eu fiz um teste aqui: tentei executar a função pronta de "doServerSave" logo após mudar o valor da globalstorage para ver se assim salvava, e obtive uma mensagem de erro no console.

 

setGlobalStorageValue(9000, 1)
			doSaveServer()

image.thumb.png.6516dbc86b7f686e9d1f052e727d64cb.png

 

 

Isso explicaria o porquê da globalstorage não salvar?

Link para o post
Compartilhar em outros sites
  • Solução

@Vodkart , exatamente. Só descobri isso porque executei um serversave, até então eu não tinha recebido qualquer mensagem de erro.
 

Consegui resolver, aparentemente! Eu simplesmente adicionei a coluna "world_id" na tabela "global_storage" e agora está funcionando. Fechei e abri o servidor e agora o script original funciona da maneira esperada e novos jogadores não ativam mais o script. O evento ocorre apenas uma vez!

 

Ficou assim:

image.thumb.png.88f7da6aef4684df750d2a3135284d5d.png

image.thumb.png.cc59c4b58cd692058aca2e140182e1cb.png

 

 

Obrigado a todos que deram atenção ao tópico! O problema não era no script, mas sim no meu database.

 

Obs: eu coloquei o valor padrão do world_id como "0" porque este é valor configurado no meu config.lua. Se alguém que estiver lendo isso utilizar um valor diferente, terá de adaptar.

Editado por Tadelho (veja o histórico de edições)
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.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo