Por
Nazo
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".
Posts Recomendados
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.