Ir para conteúdo

Featured Replies

Postado

Buenas, TK!

Um usuário pediu ajuda em um script, onde queria limitar para a quest ser feita apenas uma vez por IP, mesmo que ainda seja possível mudá-lo, resolvi postar aqui xd

 

Execute esse código SQL no seu banco de dados MySQL, para a criação da tabela onde ficarão as storages e o IP armazenado do player:

CREATE TABLE player_ip_storage(
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	player_id INT NOT NULL,
	ip CHAR(15) NOT NULL,
	storage INT NOT NULL
);

ALTER TABLE player_ip_storage ADD CONSTRAINT FK_PLAYER_ID FOREIGN KEY (player_id) REFERENCES players(id);

 

Ou caso seja SQLITE, utilize esse código:

CREATE TABLE player_ip_storage(
	player_id INT NOT NULL,
	ip CHAR(15) NOT NULL,
	storage INT NOT NULL
);

ALTER TABLE player_ip_storage ADD CONSTRAINT FK_PLAYER_ID FOREIGN KEY (player_id) REFERENCES players(id);

 

Crie um arquivo chamado nazo-functions.lua em data/lib e adicione o seguinte conteúdo:

-- by Nazo (tibiaking.com)
-- IP Storage System

function getIpQuestStatus(cid, storage)
	storages = db.getResult("SELECT * FROM `player_ip_storage` WHERE `ip` = \"" .. doConvertIntegerToIp(getPlayerIp(cid)) .. "\" and `storage` = "..storage..";")
	if(storages:getID() ~= -1) then
		return false
	end
	return true
end

function setIpQuestStatus(cid, storage)
	db.executeQuery("INSERT INTO player_ip_storage(player_id, ip, storage) VALUES("..getPlayerGUID(cid)..",\""..doConvertIntegerToIp(getPlayerIp(cid)).."\","..storage..")")
	return true
end

 

Agora, quando você tiver uma quest, adicione na verificação a função getIpQuestStatus na checagem junto, e quando finalizar a quest utilize o setIpQuestStatus, com os parâmetros cid e número da storage, porém a função só armazena que essa storage tem algo no banco de dados, ou seja, a quest já foi feita, você não armazena o valor da storage junto (como a função normal que geralmente adiciona "1" na storage).

 

Exemplo de quest abaixo:

-- by Nazo (tibiaking.com)
config = {
	storage = 123123,	-- storage da quest
	premio = {2160, 1}	-- {itemid, quantia}
}
function onUse(cid, item, frompos, item2, toPosition)
	queststatus = getPlayerStorageValue(cid,config.storage)
	if(queststatus == -1 and getIpQuestStatus(cid, config.storage)) then	-- note que eu só adicionei a função, nenhuma comparação, explicarei abaixo do código
		doPlayerSendTextMessage(cid,22,"Tome seu prêmio.")
		doPlayerAddItem(cid,config.premio[1],config.premio[2])
		setPlayerStorageValue(cid,config.storage,1)
		setIpQuestStatus(cid,config.storage)								-- função que adiciona a storage no banco de dados
	else
		doPlayerSendTextMessage(cid,22,"Você já fez esta quest.")
	end
end

 

Explicação básica do motivo da função não possuir comparação na verificação e ficar como a seguir:
 

if(getIpQuestStatus(cid, config.storage)) then

Quando você faz um if, com uma função dentro sem comparações, ela continuará o bloco de comando apenas se o retorno da mesma for verdadeiro, assim quando você fizer a quest, e tentar novamente, o get retorna falso, e isso cancela a condição e vai para o bloco de comando do "else".

Postado

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

  • 2 months later...
Postado

ola descupa reviver o topico mas tem como colcar essa funçao ne um npc

no meu server tem o npc de presente diario e gostaria de colcar para verificar o ip do player caso a pessoa cria varios mcs para pegar o premium diario

so uma vez por ip acada 24 horas

segue o script do npc

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end
function creatureSayCallback(cid, type, msg)
if(not npcHandler:isFocused(cid)) then
return false
end
local talkUser,msg = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid, msg:lower()
local config = {
level = 5000,
hours = 24,
storage = 58485,
rewards = {{itemid = 11192,chance = 30}} -- itens que ele poderá ganhar 
}
function doAddReward()
a = true
while a == true do
local m = math.random(1,#config.rewards)
if config.rewards[m].chance > math.random(1, 100) then
doPlayerAddItem(cid, config.rewards[m].itemid, isItemStackable(config.rewards[m].itemid) and 100 or 1)
npcHandler:say("seu prêmio foi: "..getItemNameById(config.rewards[m].itemid), cid)
a = false
end
end
end
if isInArray({"presente","present"}, msg) then
if getPlayerLevel(cid) < config.level then
npcHandler:say("Desculpe, mas você precisa ter no minimo level "..config.level.." para receber sua recompensa diaria.", cid)
else
npcHandler:say("você deseja receber seu presente agora?! {yes}", cid)
talkState[talkUser] = 1
end
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
if getPlayerStorageValue(cid,config.storage) <= os.time() then
doAddReward()
setPlayerStorageValue(cid, config.storage, os.time()+config.hours*3600)
else
npcHandler:say("Desculpe, mas você deve aguardar até "..os.date("%d %B %Y %X ", getPlayerStorageValue(cid,config.storage)).." para pegar seu presente novamente!", cid)
talkState[talkUser] = 0
end
elseif msg == "no" then  
selfSay("Then not", cid)  
talkState[talkUser] = 0  
npcHandler:releaseFocus(cid)  
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

obrigado + rep

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.6k

Informação Importante

Confirmação de Termo