Gabriel, achei aqui no xtibia um comando para !ban por storage feito pelo Omega e alterei para funcionar de acordo com o seu ot pokemon.
No login.lua seu localizado na pasta data\creaturescripts\scripts você irá apagar tudo e colocar isto:
local config = {
loginMessage = getConfigValue('loginMessage'),
useFragHandler = getBooleanFromString(getConfigValue('useFragHandler'))
}
--alterado v2.6 tabelas soh em lib/configuration.lua;
function onLogin(cid)
if isPlayerBanned(cid) and getPlayerStorageValue(cid,banCount) >= 3 then
return false
end
if isPlayerBanned(cid) then
local reason = getPlayerBanReason(cid)
if reason ~= "" then
setPlayerStorageValue(cid,banCount,getPlayerStorageValue(cid,banCount)+1)
doTeleportThing(cid,getPlayerTemplePos(cid))
addEvent(doKickPlayerIf,5000,cid)
doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING,'Voce foi banido por '..reason..' e sera kickado em 5 segundos.')
mayNotMove(cid,true)
else
setPlayerStorageValue(cid,banCount,getPlayerStorageValue(cid,banCount)+1)
doTeleportThing(cid,getPlayerTemplePos(cid))
addEvent(doKickPlayerIf,5000,cid)
mayNotMove(cid,true)
doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING,'Voce esta banido e sera kickado em 5 segundos.')
end
doMutePlayer(cid, 5)
return true
end
if getPlayerLevel(cid) >= 1 and getPlayerLevel(cid) <= 10 then --alterado v2.8
doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 0)
else
doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, (getPlayerLevel(cid) >= 200 and 100 or math.floor(getPlayerLevel(cid)/2)) )
end
doCreatureSetDropLoot(cid, false)
local accountManager = getPlayerAccountManager(cid)
if(accountManager == MANAGER_NONE) then
local lastLogin, str = getPlayerLastLoginSaved(cid), config.loginMessage
if(lastLogin > 0) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, str)
str = "Your last visit was on " .. os.date("%a %b %d %X %Y", lastLogin) .. "."
else
str = str
end
doPlayerSendTextMessage(cid, MESSAGE_STATUS_DEFAULT, str)
elseif(accountManager == MANAGER_NAMELOCK) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Hello, it appears that your character has been namelocked, what would you like as your new name?")
elseif(accountManager == MANAGER_ACCOUNT) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Hello, type 'account' to manage your account and if you want to start over then type 'cancel'.")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Hello, type 'account' to create an account or type 'recover' to recover an account.")
end
if getCreatureName(cid) == "Account Manager" then
local outfit = {}
if accountManagerRandomPokemonOutfit then
outfit = {lookType = getPokemonXMLOutfit(oldpokedex[math.random(151)][1])}
else
outfit = accountManagerOutfit
end
doSetCreatureOutfit(cid, outfit, -1)
return true
end
if(not isPlayerGhost(cid)) then
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT)
end
local outfit = {}
if getPlayerVocation(cid) == 0 then
doPlayerSetMaxCapacity(cid, 0)
doPlayerSetVocation(cid, 1)
setCreatureMaxMana(cid, 6)
doPlayerAddSoul(cid, -getPlayerSoul(cid))
setPlayerStorageValue(cid, 19898, 0)
if getCreatureOutfit(cid).lookType == 128 then
outfit = {lookType = 510, lookHead = math.random(0, 132), lookBody = math.random(0, 132), lookLegs = math.random(0, 132), lookFeet = math.random(0, 132)}
elseif getCreatureOutfit(cid).lookType == 136 then
outfit = {lookType = 511, lookHead = math.random(0, 132), lookBody = math.random(0, 132), lookLegs = math.random(0, 132), lookFeet = math.random(0, 132)}
end
doCreatureChangeOutfit(cid, outfit)
end
registerCreatureEvent(cid, "dropStone") --alterado v2.7
--alterado v2.6.1
registerCreatureEvent(cid, "ShowPokedex") --alterado v2.6
registerCreatureEvent(cid, "ClosePokedex") --alterado v2.6
registerCreatureEvent(cid, "WatchTv")
registerCreatureEvent(cid, "StopWatchingTv")
registerCreatureEvent(cid, "WalkTv")
registerCreatureEvent(cid, "RecordTv")
--registerCreatureEvent(cid, "Death")
registerCreatureEvent(cid, "PlayerLogout")
registerCreatureEvent(cid, "WildAttack")
registerCreatureEvent(cid, "Idle")
registerCreatureEvent(cid, "PokemonIdle")
registerCreatureEvent(cid, "EffectOnAdvance")
registerCreatureEvent(cid, "GeneralConfiguration")
registerCreatureEvent(cid, "ReportBug")
registerCreatureEvent(cid, "LookSystem")
registerCreatureEvent(cid, "T1")
registerCreatureEvent(cid, "T2")
registerCreatureEvent(cid, "task_count")
if getPlayerStorageValue(cid, 99284) == 1 then
setPlayerStorageValue(cid, 99284, -1)
end
if getPlayerStorageValue(cid, 6598754) >= 1 or getPlayerStorageValue(cid, 6598755) >= 1 then
setPlayerStorageValue(cid, 6598754, -1)
setPlayerStorageValue(cid, 6598755, -1)
doRemoveCondition(cid, CONDITION_OUTFIT) --alterado v2.9 \/
doTeleportThing(cid, posBackPVP, false)
doCreatureAddHealth(cid, getCreatureMaxHealth(cid))
end
doChangeSpeed(cid, -(getCreatureSpeed(cid)))
--///////////////////////////////////////////////////////////////////////////--
local storages = {17000, 63215, 17001, 13008, 5700}
for s = 1, #storages do
if not tonumber(getPlayerStorageValue(cid, storages[s])) then
if s == 3 then
setPlayerStorageValue(cid, storages[s], 1)
elseif s == 4 then
setPlayerStorageValue(cid, storages[s], -1)
else
if isBeingUsed(getPlayerSlotItem(cid, 8).itemid) then
setPlayerStorageValue(cid, storages[s], 1) --alterado v2.6
else
setPlayerStorageValue(cid, storages[s], -1)
end
end
doPlayerSendTextMessage(cid, 27, "Sorry, but a problem occurred on the server, but now it's alright")
end
end
--/////////////////////////////////////////////////////////////////////////--
if getPlayerStorageValue(cid, 17000) >= 1 then -- fly
local item = getPlayerSlotItem(cid, 8)
local poke = getItemAttribute(item.uid, "poke")
doChangeSpeed(cid, getPlayerStorageValue(cid, 54844))
doRemoveCondition(cid, CONDITION_OUTFIT)
doSetCreatureOutfit(cid, {lookType = flys[poke][1] + 351}, -1)
local apos = getFlyingMarkedPos(cid)
apos.stackpos = 0
if getTileThingByPos(apos).itemid <= 2 then
doCombatAreaHealth(cid, FIREDAMAGE, getFlyingMarkedPos(cid), 0, 0, 0, CONST_ME_NONE)
doCreateItem(460, 1, getFlyingMarkedPos(cid))
end
doTeleportThing(cid, apos, false)
if getItemAttribute(item.uid, "boost") and getItemAttribute(item.uid, "boost") >= 50 and getPlayerStorageValue(cid, 42368) >= 1 then
sendAuraEffect(cid, auraSyst[getItemAttribute(item.uid, "aura")]) --alterado v2.8
end
local posicao = getTownTemplePosition(getPlayerTown(cid))
markFlyingPos(cid, posicao)
elseif getPlayerStorageValue(cid, 63215) >= 1 then -- surf
local item = getPlayerSlotItem(cid, 8)
local poke = getItemAttribute(item.uid, "poke")
doSetCreatureOutfit(cid, {lookType = surfs[poke].lookType + 351}, -1) --alterado v2.6
doChangeSpeed(cid, getPlayerStorageValue(cid, 54844))
if getItemAttribute(item.uid, "boost") and getItemAttribute(item.uid, "boost") >= 50 and getPlayerStorageValue(cid, 42368) >= 1 then
sendAuraEffect(cid, auraSyst[getItemAttribute(item.uid, "aura")]) --alterado v2.8
end
elseif getPlayerStorageValue(cid, 17001) >= 1 then -- ride
local item = getPlayerSlotItem(cid, 8)
local poke = getItemAttribute(item.uid, "poke")
if rides[poke] then
doChangeSpeed(cid, getPlayerStorageValue(cid, 54844))
doRemoveCondition(cid, CONDITION_OUTFIT)
doSetCreatureOutfit(cid, {lookType = rides[poke][1] + 351}, -1)
if getItemAttribute(item.uid, "boost") and getItemAttribute(item.uid, "boost") >= 50 and getPlayerStorageValue(cid, 42368) >= 1 then
sendAuraEffect(cid, auraSyst[getItemAttribute(item.uid, "aura")]) --alterado v2.8
end
else
setPlayerStorageValue(cid, 17001, -1)
doRegainSpeed(cid) --alterado v2.6
end
local posicao2 = getTownTemplePosition(getPlayerTown(cid))
markFlyingPos(cid, posicao2)
elseif getPlayerStorageValue(cid, 13008) >= 1 then -- dive
if not isInArray({5405, 5406, 5407, 5408, 5409, 5410}, getTileInfo(getThingPos(cid)).itemid) then
setPlayerStorageValue(cid, 13008, 0)
doRegainSpeed(cid) --alterado v2.6
doRemoveCondition(cid, CONDITION_OUTFIT)
return true
end
if getPlayerSex(cid) == 1 then
doSetCreatureOutfit(cid, {lookType = 1034, lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet}, -1)
else
doSetCreatureOutfit(cid, {lookType = 1035, lookHead = getCreatureOutfit(cid).lookHead, lookBody = getCreatureOutfit(cid).lookBody, lookLegs = getCreatureOutfit(cid).lookLegs, lookFeet = getCreatureOutfit(cid).lookFeet}, -1)
end
doChangeSpeed(cid, 800)
elseif getPlayerStorageValue(cid, 5700) > 0 then --bike
doChangeSpeed(cid, -getCreatureSpeed(cid))
doChangeSpeed(cid, getPlayerStorageValue(cid, 5700)) --alterado v2.8
if getPlayerSex(cid) == 1 then
doSetCreatureOutfit(cid, {lookType = 1394}, -1)
else
doSetCreatureOutfit(cid, {lookType = 1393}, -1)
end
elseif getPlayerStorageValue(cid, 75846) >= 1 then --alterado v2.9 \/
doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), false)
setPlayerStorageValue(cid, 75846, -1)
sendMsgToPlayer(cid, 20, "You have been moved to your town!")
else
doRegainSpeed(cid) --alterado v2.6
end
if getPlayerStorageValue(cid, 22545) >= 1 then --golden arena
setPlayerStorageValue(cid, 22545, -1) --alterado v2.4
doTeleportThing(cid, getClosestFreeTile(cid, posBackGolden), false)
setPlayerRecordWaves(cid) --alterado v2.7
end
if useKpdoDlls then
doUpdateMoves(cid) --alterado v2.4 soh pra quem quiser... ;p
doUpdatePokemonsBar(cid)
end
return true
end
Adicione no 050-function.lua localizado em data\lib o código abaixo:
function isOnline(cid)
local onl = getOnlinePlayers()
for i=1,#onl do
if getPlayerByName(onl[i]) == cid then
return true
end
end
return false
end
function doKickPlayerIf(cid)
if isOnline(cid) then
doRemoveCreature(cid)
end
end
function getPlayerTemplePos(cid)
local town = getPlayerTown(cid)
local temple = getTownTemplePosition(town)
return temple or false
end
function doBanPlayer(cid,days,reason)
if reason ~= false and reason ~= nil and isPlayer(cid) then
setPlayerStorageValue(cid,banReason,reason)
end
if days ~= false and days ~= nil and isPlayer(cid) then
local bantime = ((days * 60 * 60 * 24) + os.time(t))
setPlayerStorageValue(cid,banStorage,bantime)
doRemoveCreature(cid)
return true
elseif isPlayer(cid) then
setPlayerStorageValue(cid,banStorage,0)
doRemoveCreature(cid)
return true
end
return false
end
function isPlayerBanned(cid)
if not isPlayer(cid) then
return false
elseif getPlayerStorageValue(cid,banStorage) == 0 then
return true
elseif getPlayerStorageValue(cid,banStorage) == -1 then
return false
elseif getPlayerStorageValue(cid,banStorage) >= os.time(t) then
return true
end
return false
end
function doUnbanPlayer(name)
if getPlayerGUIDByName(name) then
pid = getPlayerGUIDByName(name)
else
return false
end
if getCreatureByName(name) then
local cid = getCreatureByName(name)
if isPlayer(cid) then
doRemoveCreature(cid)
end
end
if db.query("UPDATE `player_storage` SET `value`=-1 WHERE `player_id` = "..pid.." AND `key`="..banStorage..";") == true then
db.query("UPDATE `player_storage` SET `value`=-1 WHERE `player_id` = "..pid.." AND `key`="..banCount..";")
db.query("UPDATE `player_storage` SET `value`=-1 WHERE `player_id` = "..pid.." AND `key`="..banReason..";")
return true
end
return false
end
function getPlayerBanReason(cid)
if isPlayer(cid) then
local reason = getPlayerStorageValue(cid,banReason)
if reason == -1 then
reason = ""
end
return reason
end
return false
end
Adicione no 000-constant.lua localizado em data\lib o código abaixo:
banStorage = 918171623
banCount = 918171624
banReason = 918171625
Crie um arquivo chamado nban.lua em data\talkactions\scripts com o código:
function onSay(cid,words,param)
if words == '!ban' then
local param = string.lower(param)
local param = string.explode(param,',')
if not param[1] then
doPlayerSendTextMessage(cid,27,'You must specify a player to ban.')
return true
elseif(not param[2]) then
local player = getPlayerByName(param[1])
if isPlayer(player) then
doBanPlayer(player,false)
else
doPlayerSendTextMessage(cid,27,param[1]..' is not a valid player.')
end
elseif param[3] then
local player = getPlayerByName(param[1])
local days = tonumber(param[2])
local reason = tostring(param[3])
if days and reason then
doBanPlayer(player,days,reason)
doPlayerSendTextMessage(cid,27,'You have banned '..param[1]..' for '..param[2]..' days. Reason: '..param[3]..'.')
else
doPlayerSendTextMessage(cid,27,'Invalid parameters.')
end
else
if type(tonumber(param[2])) == 'number' then
local player = getPlayerByName(param[1])
local days = tonumber(param[2])
if days ~= false and days ~= nil then
doBanPlayer(player,days)
doPlayerSendTextMessage(cid,27,'You have banned '..param[1]..' for '..param[2]..' days.')
else
doPlayerSendTextMessage(cid,27,'Invalid parameter number 2: '..param[2]..'.')
end
else
local reason = param[2]
local player = getPlayerByName(param[1])
doBanPlayer(player,false,reason)
doPlayerSendTextMessage(cid,27,'You have banned '..param[1]..'. Reason: '..param[2]..'.')
end
end
elseif words == '!unban' then
if doUnbanPlayer(param) then
doPlayerSendTextMessage(cid,27,'Player '..param..' foi desbanido.')
else
doPlayerSendTextMessage(cid,27,param..' is\'n a valid player.')
end
end
return true
end
E em talkactions.xml localizado em data\talkactions\scripts você coloca o código abaixo uma linha antes de </talkactions>:
<talkaction log="yes" access="4" words="!ban;!unban" event="script" value="nban.lua"/>
Para saber como usar, basta visitar o tópico do autor inicial:
http://www.xtibia.com/forum/topic/225250-comando-ban-v20/
Quando players forem banidos e/ou logarem enquanto estiverem banidos, aparecerá um erro no console, mas basta ignorar... testei aqui e funcionou perfeitamente... eu tentei arrumar os erros, mas não conheço muito bem servidores de pokemon...