Você está desconectado.

Conecte-se e veja nossos conteúdos exclusivos!
Contato: supp.pokeking@gmail.com

Contato: supp.pokeking@gmail.com

Compartilhe
Ir em baixo
avatar
Administrador
Administrador
Reputação : 60
Eu sou : Webmaster
Tópicos : 20
Data de Cadastro : 24/01/2018
Ver perfil do usuário

IP Storage System

em 27/1/2018, 21:26
Buenas, PK!

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:
Spoiler:
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:

Spoiler:
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:
Spoiler:
-- by Nazo (pokeking7.forumeiros.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:
Spoiler:
-- by Nazo (pokeking7.forumeiros.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:
Código:
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".

Créditos:
Nazo.
Voltar ao Topo
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum