[OtClient] Auto-Loot

Gengo
Por Gengo
em Clients

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia

Fala ai galera do xtibia estou aqui trazendo mais um module para o otClient.
Esses dias atras estavo jogando pokestorm e me deparei com o autoloot e decidi fazer um parecido com o deles e então pensei porque não trazer para a comunidade? Afinal não vejo muitos modulos de autoloot para otClient o unico que vi foi o autoloot da DxP, porem não é muito intuitivo comparado com modulo da pokestorm, bom sem mais enrolação vamos lá.

 

Feito o download do arquivo, coloque-o na pasta do seu otClient em /modules/ e pronto já é possível "utilizar-lo", porem com algumas exceções de algumas configurações básicas que temos que fazer para poder utilizar-lo com algumas eficiências.

 

Na pasta do seu otClient/data/ crie uma pasta chamada items e coloque o seus arquivos items.otb e items.xml.

Vai até a pasta do seu otClient/modules/game_things abre o arquivo things.lua e procure a função load(), e coloque o seguinte:

g_things.loadOtb ('/items/items.otb')
g_things.loadXml('/items/items.xml')

Obs: Não se assustem quando entrarem no client para logar, no inicio vai dar uma travada, mas depois de esperar uns segundos ele normaliza, pois o único problema é que o carregamento dos arquivos dos items eles são demorados.

 

Também é preciso fazer umas configurações rápida na parte do servidor para poder funcionar.


Copie e cole esse script e coloque na pasta do servidor em  mods/ e de o nome de autoloot.xml

Spoiler
<?xml version="1.0" encoding="ISO-8859-1"?>
<mod name="Loot System" version="1.0" author="Vodkart And Mkalo" contact="none.com" enabled="yes">
<config name="Loot_func"><![CDATA[

info = {
	AutomaticDeposit = true,
	BlockMonsters = {},
	BlockItemsList = {2123,2515},
	Max_Slots = {free = 3, premium = 5},
	Storages = {27000,28001,28002}
}
function setPlayerStorageTable(cid, storage, tab)
	local tabstr = "&"
	for i,x in pairs(tab) do
		tabstr = tabstr .. i .. "," .. x .. ";"
	end
	setPlayerStorageValue(cid, storage, tabstr:sub(1, #tabstr-1))
end
function getPlayerStorageTable(cid, storage)
	local tabstr = getPlayerStorageValue(cid, storage)
	local tab = {}
	if type(tabstr) ~= "string" then
		return {}
	end
	if tabstr:sub(1,1) ~= "&" then
		return {}
	end
	local tabstr = tabstr:sub(2, #tabstr)
	local a = string.explode(tabstr, ";")
	for i,x in pairs(a) do
		local b = string.explode(x, ",")
		tab[tonumber(b[1]) or b[1]] = tonumber(b[2]) or b[2]
	end
	return tab
end
function isInTable(cid, item)
	for _,i in pairs(getPlayerStorageTable(cid, info.Storages[1]))do
		if tonumber(i) == tonumber(item) then
			return true
		end
	end
	return false
end
function addItemTable(cid, item)
	local x = {}
	for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do
		table.insert(x,getPlayerStorageTable(cid, info.Storages[1])[i])
	end
	if x ~= 0 then
		table.insert(x,tonumber(item))
		setPlayerStorageTable(cid, info.Storages[1], x)
	else
		setPlayerStorageTable(cid, info.Storages[1], {item})
	end
end
function removeItemTable(cid, item)
	local x = {}
	for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do
		table.insert(x,getPlayerStorageTable(cid, info.Storages[1])[i])
	end
	for i,v in ipairs(x) do
		if tonumber(v) == tonumber(item) then
			table.remove(x,i)
		end
	end
	return setPlayerStorageTable(cid, info.Storages[1], x)
end
function ShowItemsTabble(cid)
	local n,str = 0,"[+] Auto Loot Commands [+]\n\n!autoloot item name --> To add ou Remove item from list.\n!autoloot money --> To collect gold automatically.\n!autoloot clear --> To clear the list.\n!autoloot on/off --> To enable or disable the collecting of items in the system.\n\n[+] Auto Loot Info [+]\n\nSystem: "..(getPlayerStorageValue(cid, info.Storages[3]) <= 0 and "Activated" or "Disabled")..".\nGold Collecting: "..(getPlayerStorageValue(cid, info.Storages[2]) > 0 and "Activated" or "Disabled")..".\nBalance Total: ["..getPlayerBalance(cid).."] gp's.\nMaximum Slots: ["..#getPlayerStorageTable(cid, info.Storages[1]).."/"..(isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free).."]\n\n[+] Auto Loot Slots [+]\n\n"
	for i = 1,#getPlayerStorageTable(cid, info.Storages[1]) do
		n = n + 1
		str = str.."Slot "..n.." - "..getItemNameById(getPlayerStorageTable(cid, info.Storages[1])[i]).."\n"
	end
	return doPlayerPopupFYI(cid, str)
end
function getContainerItems(containeruid)
	local items = {}
	local containers = {}
	if type(getContainerSize(containeruid)) ~= "number" then
		return false
	end
	for slot = 0, getContainerSize(containeruid)-1 do
		local item = getContainerItem(containeruid, slot)
		if item.itemid == 0 then
			break
		end
		if isContainer(item.uid) then
			table.insert(containers, item.uid)
		end
		table.insert(items, item)
	end
	if #containers > 0 then
		for i,x in ipairs(getContainerItems(containers[1])) do
			table.insert(items, x)
		end
		table.remove(containers, 1)
	end
	return items
end
function getItemsInContainerById(container, itemid) -- Function By Kydrai
	local items = {}
	if isContainer(container) and getContainerSize(container) > 0 then
		for slot=0, (getContainerSize(container)-1) do
			local item = getContainerItem(container, slot)
			if isContainer(item.uid) then
				local itemsbag = getItemsInContainerById(item.uid, itemid)
				for i=0, #itemsbag do
					table.insert(items, itemsbag[i])
				end
			else
				if itemid == item.itemid then
					table.insert(items, item.uid)
				end
			end
		end
	end
	return items
end
function doPlayerAddItemStacking(cid, itemid, amount) -- revisado
	local item, _G = getItemsInContainerById(getPlayerSlotItem(cid, 3).uid, itemid), 0
	if #item > 0 then
		for _ ,x in pairs(item) do
			local ret = getThing(x)
			if ret.type < 100 then
				doTransformItem(ret.uid, itemid, ret.type+amount) 
				if ret.type+amount > 100 then
					doPlayerAddItem(cid, itemid, ret.type+amount-100)
				end
				break
			else
				_G = _G+1
			end
		end
		if _G == #item then
			doPlayerAddItem(cid, itemid, amount)
		end
	else
		return doPlayerAddItem(cid, itemid, amount)
	end
end
function AutomaticDeposit(cid,item,n)
	local deposit = item == tonumber(2160) and (n*10000) or tonumber(item) == 2152 and (n*100) or (n*1)
	return doPlayerDepositMoney(cid, deposit)
end
function corpseRetireItems(cid, pos)
	local check = false
	for i = 0, 255 do
		pos.stackpos = i
		tile = getTileThingByPos(pos)
		if tile.uid > 0 and isCorpse(tile.uid) then
			check = true break
		end
	end
	if check == true then
		local items = getContainerItems(tile.uid)
		for i,x in pairs(items) do
			if isInArray(getPlayerStorageTable(cid, info.Storages[1]), tonumber(x.itemid)) or getPlayerStorageValue(cid, info.Storages[2]) > 0 and isInArray({2148,2152,2160},tonumber(x.itemid)) then
				if isItemStackable(x.itemid) then
					doPlayerAddItemStacking(cid, x.itemid, x.type)
					if info.AutomaticDeposit == true and isInArray({2148,2152,2160}, tonumber(x.itemid)) then
						AutomaticDeposit(cid,x.itemid,x.type)
					end
				else
					doPlayerAddItem(cid, x.itemid)
				end
				doRemoveItem(x.uid)
			end
		end
	end
end
]]></config>
<event type="login" name="LootLogin" event="script"><![CDATA[
function onLogin(cid)
	registerCreatureEvent(cid, "LootEventKIll")
	if isPremium(cid) and getPlayerStorageValue(cid, 27001) <= 0 then
		setPlayerStorageValue(cid, 27001, 1)
	elseif getPlayerStorageValue(cid, 27001) > 0 and not isPremium(cid) then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[Auto Loot] You premium is Over, Start a new list!")
		setPlayerStorageValue(cid, 27001, -1)
		setPlayerStorageValue(cid, info.Storages[1], -1)
	end
	return true
end]]></event>
<event type="kill" name="LootEventKIll" event="script"><![CDATA[
domodlib('Loot_func')
function onKill(cid, target, lastHit) 
	if isPlayer(cid) and getPlayerStorageValue(cid, info.Storages[3]) <= 0 and isMonster(target) and not isInArray(info.BlockMonsters, getCreatureName(target):lower()) then
		addEvent(corpseRetireItems, 0, cid ,getThingPos(target))
	end
	return true
end]]></event>
<talkaction words="!autoloot;/autoloot" event="buffer"><![CDATA[
domodlib('Loot_func')
local slots = isPremium(cid) and info.Max_Slots.premium or info.Max_Slots.free
if not param:lower() or param:lower() == "" then
	return true
elseif param:lower() == "clean" then
	setPlayerStorageValue(cid, info.Storages[1], -1)
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] Your list has been cleaned.") 
	return true
elseif isInArray({"on","off"}, param:lower()) then
	setPlayerStorageValue(cid, info.Storages[3], getPlayerStorageValue(cid, info.Storages[3]) <= 0 and 1 or 0)
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"[Auto Loot] "..(getPlayerStorageValue(cid, info.Storages[3]) > 0 and "Stopped" or "Started")..".")
	return true
end

local param = string.explode(param, ",")
if param[1]:lower() == "add" then
local item = getItemIdByName(param[2], false)
if not item then
	doPlayerSendCancel(cid, "This item does not exist.")
	return true
end
local var = isInTable(cid, item)

if isInArray(info.BlockItemsList, item) then
	doPlayerSendCancel(cid, "You can not add this item in the list!")
	return true
elseif not var and #getPlayerStorageTable(cid, info.Storages[1]) >= slots then
	doPlayerSendCancel(cid, "max "..slots.." from auto loot") return true
end
if not var then
	addItemTable(cid, item)
end
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[AutoLoot] You added the item ["..param[2].."] in the list")
elseif param[1]:lower() == "remove" then
	local item = getItemIdByName(param[2], false)
	if not item then
		doPlayerSendCancel(cid, "This item does not exist.")
		return true
	end
	removeItemTable(cid, item)
	doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[AutoLoot] You removed the item ["..param[2].."] from the list")
end

return true]]></talkaction>
</mod>

 


Ainda na pasta do seu servidor abre o arquivo /data/creaturescripts/scripts/login.lua e coloque o seguinte script dentro da função onLogin:

local loot = ''
for i = 1, #getPlayerStorageTable(cid, info.Storages[1]) do
  loot = loot..getItemInfo(getPlayerStorageTable(cid, info.Storages[1])[i]).clientId..'-'..getItemNameById(getPlayerStorageTable(cid, info.Storages[1])[i])..'@'
end
doSendPlayerExtendedOpcode(cid, 157, loot)


Feito todos os passos corretamente, configurado certo, deve ficar assim no game:

auto_loot.png.24d504b065011ea525edd52e66a9f355.png

 

Bom espero que tenham entendido e gostado, não sou muito de ficar escrevendo tutorial, até uma próxima. 

 

Download

 

Créditos

Spoiler

Gengo(eu) - módule para o otClient.

Vodkart e Mkalo - autoloot na parte do servidor.

 

Black Clover

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 25/11/18Posts: 12

Muito bom! Irei testar mais tarde ?

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia
2 minutos atrás, Thalles Vitor disse:

Seus sistemas são excelentes! vou usa-lo, bom se não for pedir demais é possível que o autoloot funcione sem o button de autoloot?  no caso da imagem em png,quero que funcione sem botão se puder ajudar.

Você fala usar sem o topbutton que fica lá no topo?

 

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia

É só remover essa linha:

btnAutoLoot = modules.client_topmenu.addRightGameToggleButton('lootButton', tr('Auto-Loot'), 'loot', toggle)

E caso queira chamar pela tecla de atalho utilize essa:

g_keyboard.bindKeyPress('Ctrl+E', toggle)

 

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia
3 minutos atrás, Thalles Vitor disse:

data/creaturescripts/scripts/login.lua:onLogin
Description:
data/creaturescripts/scripts/login.lua:22: attempt to call global 'doSendPlayerExtendedOpcode' (a nil value)
stack traceback:
        data/creaturescripts/scripts/login.lua:22: in function <data/creaturescripts/scripts/login.lua:8>

E seu servidor tem suporte a opcodes?

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia
2 minutos atrás, Thalles Vitor disse:

Acho que sim ,meu servidor é base OTPokémon

Certeza? Me parece se não me engano o erro fala que vc não tem a função doSendPlayerExtendedOpcode e ainda manda algo nulo.

Ou então você deve ter configurado algo errado, por favor faça um teste com outra coisa só para tirar a duvida se vc tem essa função, já tem 2 servidores que testei esse autoloot e estão funcionando normal sem esse erro que vc cita.

Tiu Biel

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 26/09/18Posts: 16Gênero: MasculinoChar no Tibia: [ADM] Baker

Oi amigo, coloquei tudo certinho no meu, mas ao matar o Pokémon ele não pega o loot selecionado na aba, sabe o por que?

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia
6 minutos atrás, Tiu Biel disse:

Oi amigo, coloquei tudo certinho no meu, mas ao matar o Pokémon ele não pega o loot selecionado na aba, sabe o por que?

Tenta outro autoloot da parte do servidor para poketibia e adapta para usar no módulo, como o autoloot que fica no servidor não foi eu que desenvolvi, não vou saber oque pode estar ocorrendo de errado no seu.

Tiu Biel

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 26/09/18Posts: 16Gênero: MasculinoChar no Tibia: [ADM] Baker

Ah sim, vlw REP+

Shiroe

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 13/11/17Posts: 18Gênero: Masculino

@Gengo estou com o seguinte erro:

[16/01/2019 19:24:37] [Error - LuaScriptInterface::loadFile] data/creaturescripts/scripts/login.lua:21: unexpected symbol near 'ï'
[16/01/2019 19:24:37] [Warning - Event::loadScript] Cannot load script (data/creaturescripts/scripts/login.lua)
[16/01/2019 19:24:37] data/creaturescripts/scripts/login.lua:21: unexpected symbol near 'ï'


O código:
 

Spoiler
local config = {
	loginMessage = getConfigValue('loginMessage'),
	useFragHandler = getBooleanFromString(getConfigValue('useFragHandler'))
}

--alterado v2.6 tabelas soh em lib/configuration.lua;

function onLogin(cid)

	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 loot = ''
for i = 1, #getPlayerStorageTable(cid, info.Storages[1]) do
  loot = loot..getItemInfo(getPlayerStorageTable(cid, info.Storages[1])[i]).clientId..'-'..getItemNameById(getPlayerStorageTable(cid, info.Storages[1])[i])..'@'
end
doSendPlayerExtendedOpcode(cid, 157, loot)

	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, 7)
		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
    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, "atk")
	registerCreatureEvent(cid, "ExtendedOpcode")

	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
    
	return true
end

 

 

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia
2 horas atrás, Rookie disse:

@Gengo estou com o seguinte erro:

[16/01/2019 19:24:37] [Error - LuaScriptInterface::loadFile] data/creaturescripts/scripts/login.lua:21: unexpected symbol near 'ï'
[16/01/2019 19:24:37] [Warning - Event::loadScript] Cannot load script (data/creaturescripts/scripts/login.lua)
[16/01/2019 19:24:37] data/creaturescripts/scripts/login.lua:21: unexpected symbol near 'ï'


O código:
 

  Mostrar conteúdo oculto

local config = {
	loginMessage = getConfigValue('loginMessage'),
	useFragHandler = getBooleanFromString(getConfigValue('useFragHandler'))
}

--alterado v2.6 tabelas soh em lib/configuration.lua;

function onLogin(cid)

	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 loot = ''
for i = 1, #getPlayerStorageTable(cid, info.Storages[1]) do
  loot = loot..getItemInfo(getPlayerStorageTable(cid, info.Storages[1])[i]).clientId..'-'..getItemNameById(getPlayerStorageTable(cid, info.Storages[1])[i])..'@'
end
doSendPlayerExtendedOpcode(cid, 157, loot)

	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, 7)
		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
    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, "atk")
	registerCreatureEvent(cid, "ExtendedOpcode")

	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
    
	return true
end

 

 

O erro que acontece é que quando cópia código daqui do forum e coloca em um editor, vem bugado, escreva manualmente ou atente-se os caracteres especiais do code que veio bugado do forum e corriga no seu.

braisvilela

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 22/12/18Posts: 5

Aqui vai até a tela de Login, escolho o personagem e o jogo não loga, o que pode ser?

Gengo

avatar
Cavaleiro
Cavaleiro

INFOS

Grupo: CavaleiroRegistrado: 10/03/13Posts: 177Gênero: MasculinoChar no Tibia: stor akia
3 minutos atrás, braisvilela disse:

Aqui vai até a tela de Login, escolho o personagem e o jogo não loga, o que pode ser?

Devido o carregamento dos arquivo do item xml e otb, ele gera uma lentidão na hora de carregar, porem uma vez carregada ele fica normal, espere um pouco e veras que vai carregar, mas é logico se vc fez tudo certo.

braisvilela

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 22/12/18Posts: 5

Mas mano eu Tentei e nao deu certo rs

Ele só da lag quando abre o cliente, dps fica de boa mas ele não loga na conta...
Vc tem whatsapp para contato?

Step Records

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 24/05/18Posts: 82Gênero: Masculino
Citar


[06/02/2019 16:41:03] [Error - CreatureScript Interface]
[06/02/2019 16:41:03] data/creaturescripts/scripts/player/login.lua:onLogin
[06/02/2019 16:41:03] Description:
[06/02/2019 16:41:03] data/creaturescripts/scripts/player/login.lua:170: attempt to index global 'info' (a nil value)
[06/02/2019 16:41:03] stack traceback:
[06/02/2019 16:41:03]     data/creaturescripts/scripts/player/login.lua:170: in function <data/creaturescripts/scripts/player/login.lua:43>

Eu tenho um problema, eu recebo este erro, você poderia me ajudar?

Mylogin.lua


 

Citar

local config = {
    loginMessage = getConfigValue('loginMessage'),
    useFragHandler = getBooleanFromString(getConfigValue('useFragHandler'))
}
local megasStones = {15131, 15133, 15136, 15793, 15783, 15781, 15794, 15784, 15780, 15792}
local megasToPlayer = {
    ["Alakazite"] = {id = 15131, megaID = "", pokeName = "Alakazam"},
    ["Blastoisinite"] = {id = 15133, megaID = "", pokeName = "Blastoise"},    
    ["Gengarite"] = {id = 15136, megaID = "", pokeName = "Gengar"},    
    
    ["Venusaurite"] = {id = 15793, megaID = "", pokeName = "Venusaur"},    
    ["Kangaskhanite"] = {id = 15783, megaID = "", pokeName = "Kangaskhan"},
    ["Tyranitarite"] = {id = 15781, megaID = "", pokeName = "Tyranitar"},
    ["Ampharosite"] = {id = 15794, megaID = "", pokeName = "Ampharos"},    
    ["Scizorite"] = {id = 15784, megaID = "", pokeName = "Scizor"},    
    
    ["Aggronite"] = {id = 15780, megaID = "", pokeName = "Aggron"},        
    ["Blazikenite"] = {id = 15792, megaID = "", pokeName = "Blaziken"},    
}


function BetaItem(cid)
    if getPlayerStorageValue(cid, storages.betaStorage) == -1 then
        addPokeToPlayer(cid, "Shiny Ditto", 0, nil, "poke", true)
        setPlayerStorageValue(cid, storages.betaStorage, 1)
        doSendMsg(cid, "Você ganhou um Shiny Ditto, uma TV Cam e uma Mega Stone para testalos a vontade.")
        
        item = doCreateItemEx(12330)
        doItemSetAttribute(item, "unique", getCreatureName(cid))
        doPlayerAddItemEx(cid, item)
        
        local mega = megasStones[math.random(1, #megasStones)]
        
        for a, b in pairs(megasToPlayer) do
            if mega == b.id then
                addPokeToPlayer(cid, b.pokeName, 0, nil, "shinyyume", true, a)
                break
            end
        end    
    end
end

function onLogin(cid)    

    
    doPlayerSetVocation(cid, 10)
    doSendPlayerExtendedOpcode(cid, 126, "nao")
    doResetPlayerTVSystem(cid)
    
    if not isGod(cid) then
       setPlayerGroupId(cid, 1)
       doRegainSpeed(cid)
    end
    
        if isGod(cid) then -- Resetar diarias se for God
            setPlayerStorageValue(cid, storages.miniQuests.storDayTask1, -1)
            setPlayerStorageValue(cid, storages.miniQuests.storDayTask2, -1)
            setPlayerStorageValue(cid, storages.miniQuests.storDayTask3, -1)
            setPlayerStorageValue(cid, storages.miniQuests.storDayTask4, -1)
        end
        
    if getPlayerLevel(cid) >= 1 and getPlayerLevel(cid) <= 10 then
       doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, 0)
    else     
       doPlayerSetLossPercent(cid, PLAYERLOSS_EXPERIENCE, (getPlayerLevel(cid) >= 200 and 100 or math.floor(getPlayerLevel(cid)/2)) )
    end

    doRegainSpeed(cid)
 print(getCreatureName(cid).. " Se ha conectado")
 --////// storages \\\\\\--
 setPlayerStorageValue(cid, 98988, 0)
   doEreaseDuel(cid)
   setPlayerStorageValue(cid, 500, -1)
   setPlayerStorageValue(cid, 8085, 0)
   --// duel
   setPlayerStorageValue(cid, storages.requestCountPlayer, 0)
   setPlayerStorageValue(cid, storages.requestCountPokemon, 0)
   setPlayerStorageValue(cid, storages.requestedPlayer, 0)
   --// duel
 --////// storages \\\\\\--
 
 --////// Eventos \\\\\\--
registerCreatureEvent(cid, "GodLight")
     registerCreatureEvent(cid, "ShowPokedex")
     registerCreatureEvent(cid, "ClosePokedex")
      registerCreatureEvent(cid, "Mail")
     registerCreatureEvent(cid, "WildAttack")
     registerCreatureEvent(cid, "GuildMotd")
     registerCreatureEvent(cid, "Idle")
     registerCreatureEvent(cid, "ReportBug")
     registerCreatureEvent(cid, "AdvanceSave")
     --Adicionados \/
     registerCreatureEvent(cid, "PlayerLogout")
     registerCreatureEvent(cid, "LookSystem")
     registerCreatureEvent(cid, "Opcode")
     registerCreatureEvent(cid, "EmeraldShop")
     registerCreatureEvent(cid, "PokeStats")
     registerCreatureEvent(cid, "PokeWalk")
     registerCreatureEvent(cid, "PokeSleep")
     registerCreatureEvent(cid, "MoveItem")
     registerCreatureEvent(cid, "UpLevel")
     registerCreatureEvent(cid, "BlockWords")
     --registerCreatureEvent(cid, "PartySystem")
     registerCreatureEvent(cid, "Target")
     registerCreatureEvent(cid, "GeneralConfiguration")
     registerCreatureEvent(cid, "EffectOnAdvance")
     registerCreatureEvent(cid, "TradeRequest")
     registerCreatureEvent(cid, "TradeAccpet")
     registerCreatureEvent(cid, "onAdvance")
     registerCreatureEvent(cid, "onAdvance2")
     registerCreatureEvent(cid, "onAdvance3")
     registerCreatureEvent(cid, "onAdvance4")
     registerCreatureEvent(cid, "onAdvance5")
 --////// Eventos \\\\\\--
 
    if(not isPlayerGhost(cid)) then
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT)
    end
   
local legs = getPlayerSlotItem(cid, CONST_SLOT_LEGS)
local ball = getPlayerSlotItem(cid, ?

    if getPlayerSlotItem(cid, CONST_SLOT_FEET).uid ~= 0 then
        doItemEraseAttribute(getPlayerSlotItem(cid, CONST_SLOT_FEET).uid, "healthChanged")
    end
    --doOTCSendPokemonHealth(cid)
    --doClearPokemonStatus(cid)

    if isRiderOrFlyOrSurf(cid) and ball.uid ~= 0 then
    local pokeName = getItemAttribute(ball.uid, "poke")
    
                    if isInArray({"ditto", "shiny ditto"}, pokeName:lower()) then
                       pokeName = getItemAttribute(ball.uid, "copyName")
                    end
    
                     local outfit = getPokemonOutfitToSkill(pokeName)
                     local speed = getPokemonSpeedToSkill(pokeName)
                         doSetCreatureOutfit(cid, {lookType = outfit + 351}, -1)
                        
                         doChangeSpeed(cid, -getCreatureSpeed(cid))
                         doChangeSpeed(cid, speed)
                        
                         if isRider(cid) then
                            setPlayerStorageValue(cid, orderTalks["ride"].storage, 1)
                         elseif isFly(cid) then
                            setPlayerStorageValue(cid, orderTalks["fly"].storage, 1)
                              if not hasSqm(getThingPos(cid)) then
                              --   doCreateItem(460, 1, getThingPos(cid))
                              end
                         elseif isSurf(cid) then
                            setPlayerStorageValue(cid, orderTalks["surf"].storage, 1) -- rever o markedPos
                            doChangeSpeed(cid, -getCreatureSpeed(cid))
                            doChangeSpeed(cid, getPlayerStorageValue(cid, 54844))
                         end
                         doTeleportThing(cid, getMarkedSpawnPos(cid))
                         setPokemonGhost(cid)
    end                    
    
    setPlayerStorageValue(cid, storages.gobackDelay, -1)
    setPlayerStorageValue(cid, storages.pokedexDelay, -1)
    setPlayerStorageValue(cid, 154585, -1)
    doAddFirstItemsToPlayer(cid)
    --doAddShoppingItem(cid)
        
    -- otclient life
        doSendLifePokeToOTC(cid)
    -- otclient life
    
    local loot = ''
        for i = 1, #getPlayerStorageTable(cid, info.Storages[1]) do
        loot = loot..getItemInfo(getPlayerStorageTable(cid, info.Storages[1])).clientId..'-'..getItemNameById(getPlayerStorageTable(cid, info.Storages[1]))..'@'
end
doSendPlayerExtendedOpcode(cid, 157, loot)
    
    
    return true
end
function doAddFirstItemsToPlayer(cid)
local config = {
            storage = 30001,
            items = {1988, 1987, 2382, 2120, 2550, 2580, 7385, 2395}
            -- 7385 (pokeinfo)
            -- 2395 (portfoil)  ok
            -- 2382    (pokedex)    ok
            -- 2550 (order)        ok
            -- 1987 (bag)        ok
            -- 1988 (badge case)    ok
            -- 2120 (rope)        ok
            -- 2580 (fishing rod)    ok
        }
            setPlayerCap(cid, 7)
            if getCreatureName(cid) == "Account Manager" then
                doSetCreatureOutfit(cid, {lookType = 655}, -1)
            return true
            end
            if getPlayerStorageValue(cid, storages.BugFishing) ~= -1 then return true end
            
            if getPlayerSlotItem(cid, CONST_SLOT_ARMOR).itemid > 0 then
            return true
            end
            
            for _, id in ipairs(config.items) do
                doPlayerAddItem(cid, id, 1)
            end
            local bag = getPlayerItemById(cid, false, 1988).uid
            doAddContainerItem(bag, 12267, 1)
            doAddContainerItem(bag, 12266, 1)
            doAddContainerItem(bag, 12264, 1)
            doAddContainerItem(bag, 12265, 1)
            doAddContainerItem(bag, 12263, 1)
            doAddContainerItem(bag, 12262, 1)
            doAddContainerItem(bag, 12261, 1)
            doAddContainerItem(bag, 12260, 1)
            setPlayerStorageValue(cid, duelTable.wins, 0)
            setPlayerStorageValue(cid, duelTable.loses, 0)
            local pokeBag = getPlayerItemById(cid, false, 1987).uid
            setPlayerStorageValue(cid, storages.BugFishing, 1)
            doTeleportThing(cid, getTownTemplePosition(1), false)

return true
end

local itensShopping = {
    [1] = {{2394, 100}, {12344, 25}, {12286, 2}},
    [2] = {{2391, 200}, {2393, 100}, {2392, 100}},
    [3] = {{12832, 1}},
    [4] = {{12286, 1}},
    [5] = {premiumDays = 30}
}

function doAddShoppingItem(cid)
    local allItems = {}
    local compra = 0
    local msg = ""
    local result = db.getResult("SELECT itemID, compraID FROM playercompras WHERE playerID = '" .. getPlayerGUID(cid) .. "' AND entregue = 0")
    if result:getID() ~= -1 then
        compra = result:getDataInt("compraID")
        allItems[#allItems+1] = result:getDataInt("itemID")
        db.executeQuery("UPDATE playercompras SET entregue = 13 WHERE compraID = ".. compra ..";")
        while(result:next()) do
            allItems[#allItems+1] = result:getDataInt("itemID")
            compra = result:getDataInt("compraID")
            db.executeQuery("UPDATE playercompras SET entregue = 13 WHERE compraID = ".. compra ..";")
        end
    end
    
    if #allItems > 0 then
        for i = 1, #allItems do
            if allItems == 5 then
                doPlayerAddPremiumDays(cid, itensShopping[allItems].premiumDays)
                msg = "Seu pacote de '30 premium days' foi adicionado a sua conta com sucesso!"
                doSendMsg(cid, msg)
            else
            local bag = doCreateItemEx(12694) -- cubone bag de gratis
                for j = 1, #itensShopping[allItems] do
                    doAddContainerItem(bag, itensShopping[allItems][j][1], itensShopping[allItems][j][2])
                end
            
                doPlayerSendMailByName(getCreatureName(cid), bag, 1)
                msg = "Os itens que foram comprados pelo shopping foram enviados para seu cp."
                doSendMsg(cid, msg)
            end
        end
    end
end

function addSkillsToDB(cid)
        local str1 = "INSERT INTO player_skills (player_id, skillid, value, count) VALUES (" .. getPlayerGUID(cid) .. ", 5, 5, 0);"
        local str2 = "INSERT INTO player_skills (player_id, skillid, value, count) VALUES (" .. getPlayerGUID(cid) .. ", 6, 5, 0);"
            db.executeQuery(str1)
            db.executeQuery(str2)
end