poxa, bem legal isso, nunca tinha visto um script com essa função embora sempre procurei um brigadão cara vai facilitar muito a vida dos GODs porae ;D :button_ok:
Este é um vip system por account, ou seja, um sistema de vip válido para todos os characters de uma determinada conta.
O script foi testado no TFS 0.3.6 - 8.54.
E no site Gesior 0.3.4 beta4.
Em caso de erros ou dúvidas é só postar.
Funções do Script
Função necessária para começar a usar o script:
installVip() -> Cria a coluna no banco de dados para usar o sistema de vip (testei somente em sqlite, mas acredito que funcione em mysql)
Funções que utilizam o account id:
doTeleportPlayersByAccount(acc, topos) -> Teleporta todos os players da account
getVipTimeByAccount(acc) -> Pega o tempo de vip
setVipTimeByAccount(acc, time) -> Edita o tempo de vip
getVipDaysByAccount(acc) -> Pega o tempo de vip em dias
isVipAccount(acc) -> Verifica se é vip
addVipDaysByAccount(acc, days) -> Adiciona dias de vip
doRemoveVipDaysByAccount(acc, days) -> Remove dias de vip
getVipDateByAccount(acc) -> Pega a data e hora que irá terminar a vip
Funções que utilizam o creature id (cid):
doTeleportPlayers(cid, topos) -> Teleporta todos os players da account
getVipTime(cid) -> Pega o tempo de vip
setVipTime(cid, time) -> Edita o tempo de vip
getVipDays(cid) -> Pega o tempo de vip em dias
isVip(cid) -> Verifica se é vip
addVipDays(cid, days) -> Adiciona dias de vip
doRemoveVipDays(cid, days) -> Remove dias de vip
getVipDate(cid) -> Pega a data e hora que irá terminar a vip
Inserindo as funções
Abra a pasta data/lib, crie um arquivo lua e coloque:
vipAccount.lua
--[[
Name: Vip System by Account
Version: 1.0
Author: Kydrai
Forum: http://www.xtibia.com/forum/topic/136543-vip-system-by-account-v10/
[Functions]
-- Install
installVip()
-- By Account
doTeleportPlayersByAccount(acc, topos)
getVipTimeByAccount(acc)
setVipTimeByAccount(acc, time)
getVipDaysByAccount(acc)
isVipAccount(acc)
addVipDaysByAccount(acc, days)
doRemoveVipDaysByAccount(acc, days)
getVipDateByAccount(acc)
-- By Player
doTeleportPlayers(cid, topos)
getVipTime(cid)
setVipTime(cid, time)
getVipDays(cid)
isVip(cid)
addVipDays(cid, days)
doRemoveVipDays(cid, days)
getVipDate(cid)
]]--
-- Install
function installVip()
if db.executeQuery("ALTER TABLE `accounts` ADD viptime INT(15) NOT NULL DEFAULT 0;") then
print("[Vip System] Vip System instalado com sucesso!")
return TRUE
end
print("[Vip System] Não foi possível instalar o Vip System!")
return FALSE
end
-- By Account
function doTeleportPlayersByAccount(acc, topos)
if db.executeQuery("UPDATE `players` SET `posx` = "..topos.x..", `posy` = "..topos.y..", `posz` = "..topos.z.." WHERE `account_id` = "..acc..";") then
return TRUE
end
return FALSE
end
function getVipTimeByAccount(acc)
local vip = db.getResult("SELECT `viptime` FROM `accounts` WHERE `id` = "..acc..";")
if vip:getID() == -1 then
print("[Vip System] Account not found!")
return FALSE
end
return vip:getDataInt("viptime")
end
function setVipTimeByAccount(acc, time)
if db.executeQuery("UPDATE `accounts` SET `viptime` = "..time.." WHERE `id` = "..acc..";") then
return TRUE
end
return FALSE
end
function getVipDaysByAccount(acc)
local vipTime = getVipTimeByAccount(acc)
local timeNow = os.time()
local days = math.ceil((vipTime - timeNow)/(24 * 60 * 60))
return days <= 0 and 0 or days
end
function isVipAccount(acc)
return getVipDaysByAccount(acc) > 0 and TRUE or FALSE
end
function addVipDaysByAccount(acc, days)
if days > 0 then
local daysValue = days * 24 * 60 * 60
local vipTime = getVipTimeByAccount(acc)
local timeNow = os.time()
local time = getVipDaysByAccount(acc) == 0 and (timeNow + daysValue) or (vipTime + daysValue)
setVipTimeByAccount(acc, time)
return TRUE
end
return FALSE
end
function doRemoveVipDaysByAccount(acc, days)
if days > 0 then
local daysValue = days * 24 * 60 * 60
local vipTime = getVipTimeByAccount(acc)
local time = vipTime - daysValue
setVipTimeByAccount(acc, (time <= 0 and 1 or time))
return TRUE
end
return FALSE
end
function getVipDateByAccount(acc)
if isVipAccount(acc) then
local vipTime = getVipTimeByAccount(acc)
return os.date("%d/%m/%y %X", vipTime)
end
return FALSE
end
-- By Player
function doTeleportPlayers(cid, topos)
doTeleportPlayersByAccount(getPlayerAccountId(cid), topos)
end
function getVipTime(cid)
return getVipTimeByAccount(getPlayerAccountId(cid))
end
function setVipTime(cid, time)
return setVipTimeByAccount(getPlayerAccountId(cid), time)
end
function getVipDays(cid)
return getVipDaysByAccount(getPlayerAccountId(cid))
end
function isVip(cid)
return isVipAccount(getPlayerAccountId(cid))
end
function addVipDays(cid, days)
return addVipDaysByAccount(getPlayerAccountId(cid), days)
end
function doRemoveVipDays(cid, days)
return doRemoveVipDaysByAccount(getPlayerAccountId(cid), days)
end
function getVipDate(cid)
return getVipDateByAccount(getPlayerAccountId(cid))
end
Exemplos de uso
Talkaction
GOD:
/installvip
/addvip name, days
/removevip name, days
/checkvip name
function onSay(cid, words, param, channel)
local t = param:explode(",")
local name, days = t[1], tonumber(t[2])
if words == "/installvip" then
if installVip() then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Vip System instalado com sucesso!")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Não foi possível instalar o Vip System!")
end
elseif words == "/addvip" then
if name then
if days then
local acc = getAccountIdByName(name)
if acc ~= 0 then
addVipDaysByAccount(acc, days)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip ao "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar essa quantidade de dia(s) de vip.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar dia(s) de vip a este player.")
end
elseif words == "/removevip" then
if name then
if days then
local acc = getAccountIdByName(name)
if acc ~= 0 then
doRemoveVipDaysByAccount(acc, days)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você retirou "..days.." dia(s) de vip do "..name..", agora ele possui "..getVipDaysByAccount(acc).." dia(s) de vip.")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar essa quantidade de dia(s) de vip.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode retirar dia(s) de vip a este player.")
end
elseif words == "/checkvip" then
if name then
local acc = getAccountIdByName(name)
if acc ~= 0 then
local duration = getVipDateByAccount(acc)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O "..name.." possui "..getVipDaysByAccount(acc).." dias de vip."..(duration and (" Ela irá durar até "..duration..".") or ""))
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode visualizar os dias de vip a este player.")
end
end
return TRUE
end
vipaccplayer.lua:
function onSay(cid, words, param, channel)
if words == "/buyvip" then
local price = 1000000
local days = 30
if doPlayerRemoveMoney(cid, price) then
addVipDays(cid, days)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você adicionou "..days.." dia(s) de vip, agora você possui "..getVipDays(cid).." dia(s) de vip.")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa de "..price.." para adicionar "..days.." dia(s) de vip.")
end
elseif words == "/vipdays" then
local duration = getVipDate(cid)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or ""))
end
return TRUE
end
Movement (Tile)
Coloque actionid 15000 em um tile onde somente os vips poderão passar.
function onStepIn(cid, item, position, fromPosition)
if isVip(cid) == FALSE then
doTeleportThing(cid, fromPosition, false)
doSendMagicEffect(position, CONST_ME_MAGIC_BLUE)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Somente players vip podem passar.")
end
return TRUE
end
Creaturescript (Login)
Quando player logar irá verificar se a vip do player acabou, se sim então irá teleportar todos os players da account para o templo, se não irá mostrar o tempo da vip.
function onLogin(cid)
local vip = isVip(cid)
if getVipTime(cid) > 0 and vip == FALSE then
local townid = 1
doPlayerSetTown(cid, townid)
local templePos = getTownTemplePosition(getPlayerTown(cid))
doTeleportThing(cid, templePos, false)
setVipTime(cid, 0)
doTeleportPlayers(cid, templePos)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sua Vip acabou!")
elseif vip == TRUE then
local duration = getVipDate(cid)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você possui "..getVipDays(cid).." dia(s) de vip."..(duration and (" Ela irá durar até "..duration..".") or ""))
end
return TRUE
end
Action (Door)
Coloque actionid 15001 na door onde somente os vips poderão passar. Use a porta gate of expertise (id: 1227)
actions.xml:
<action actionid="15001" script="vipdoor.lua"/>
vipdoor.lua:
function onUse(cid, item, fromPosition, itemEx, toPosition)
if isVip(cid) == FALSE then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Somente players vip podem passar.")
elseif item.itemid == 1227 then
doTransformItem(item.uid, item.itemid + 1)
doTeleportThing(cid, toPosition)
end
return TRUE
end
NPC (Vendedor de VIP)
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
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 buyVip(cid, message, keywords, parameters, node)
if(not npcHandler:isFocused(cid)) then
return false
end
if doPlayerRemoveMoney(cid, parameters.price) then
addVipDays(cid, parameters.days)
npcHandler:say('Thanks, you buy '..parameters.days..' vip days. You have '..getVipDays(cid)..' vip days.', cid)
else
npcHandler:say('Sorry, you don\'t have enough money.', cid)
end
npcHandler:resetNpc()
return true
end
local node1 = keywordHandler:addKeyword({'vip'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Do you want buy 30 vip days for 1000000 gp\'s?'})
node1:addChildKeyword({'yes'}, buyVip, {price = 1000000, days = 30})
node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Ok, then.', reset = true})
npcHandler:addModule(FocusModule:new())
Erros e Soluções
Configurando o Gesior
Com essa configuração irá aparecer o vip status do player no site e será possível vender vip pelo site.
Se eu esqueci de alguma coisa é só avisar.
public function getVipDays()
{
if( !isset($this->data['viptime']) || !isset($this->data['lastday']) )
{
throw new E_OTS_NotLoaded();
}
return ceil(($this->data['viptime'] - time()) / (24*60*60));
}
Depois de:
~||0.0.1||~
*Contém apenas 2 cidades por enquanto.
*Área de teleports para as hunts.
*Sistema de Prisão.
*Por inquanto temos as principais quests como: Pits of Inferno (POI), Demon Helmet, Annihilator, Inquisition, entre outras.
*Soft boots pode ser recarregada pelo NPC Jenny que fica ao sudeste da Mix City.
*Itens e monstros do update estão 100% completos.
*Magias totalmente balanceadas seguindo o padrão do Tibia Global.
*Addons do update estão 100%.
*Sistema de voar (Créditos ao Forcera).
*Distro TCS modificado com amplas proteções - Totalmente Estável.
*Highscores.
*Bed System 100%.
~||0.0.2||~
*Agora você pode logar com 4 protocolos do Tibia: 8.54 | 8.55 | 8.56 | 8.57
*3 Cidades (Mix City - Vip City - Thunder City).
*Nova área de Teleports.
*MEGA reformulação da cidade principal e suas proximidades com o máximo de RPG.
*Quests que não funcionavam, agora estão 100%.
*Mix City com 51 casas a disposição.
*Vip System (Comando para Player: !vipdays | !buyvip || Comando para GOD: /addvip | /delvip)
*Básico sistema de montaria.
*Reformulação de algumas Hunts.
*Reformulação da entrada da Pits of Inferno Quest (POI).
*Algumas hunts para a cidade vip.
*Balanceamento das vocações.
*Alguns bugs foram corrigidos.
~||Patch1||~
*Erros no Vip System arrumados. Agora está 100%.
~||0.0.3||~
*Nova área de Teleports.
*MEGA reformulação da cidade principal e suas proximidades com o máximo de RPG.
*Reformulação de algumas Hunts.
*Novas caves.
*Tiquanda foi totalmente reformulada com o máximo de RPG.
*Todas as caves estão com o máximo de RPG.
*Modificaçõs no distro, está 100% estável.
*Quest de pequeno port agora estão funcionando.
*Bug no npc que não vendia rods e wands.
*Pequenos bugs corrigidos.
*Inquisition Adicionada.
- Fotos:
*Templo
*Saída sul de Mix City.
*Npc vendedor de food.
*Depot
*Annihilator Quest
*Entrada da cave de Demons.
*Hydras
*Barco para a Vip City.
*Demon Helmet Quest
*Inquisition Quest
*Minimap
- Account do GOD Mix:
Account: 2
Password: 2
Download: Clique aqui para fazer o Download do Mix Yourots 0.0.3 (8.54-57)
Scan: Clique aqui para ver o Scan.
Quer o Mix Yourots em protocolo 8.60?
Veja nosso tópico 8.60 CLICANDO AQUI.
Quem Está Navegando
0 membros estão online
Nenhum usuário registrado visualizando esta página.