
Histórico de Curtidas
-
139 deu reputação a MarceLoko em Básico de SQL via LuaBoa noite!
Trago ao fórum um simples porém útil tutorial de manipulação dos valores da database.
O uso da database me garante melhor organização das minhas variáveis, em comparação a storages.
Por storages você está preso a valores numéricos. Via database, você pode atribuir nomes, utilizar strings, e organizar as variáveis em grupos.
Responderei dúvidas conforme for possível.
Para inserir uma linha nova em uma tabela
db.executeQuery("INSERT INTO `accounts` (`id` ,`name` ,`password`)VALUES ('5', 'marcelo', 'druida');") Neste exemplo, será adicionado na tabela accounts, uma nova conta marcelo/druida. (na verdade a senha é encriptada, mas serve como exemplo).
Para alterar valores na database
db.executeQuery("UPDATE players SET level = 1 WHERE id = 1 ;") Neste exemplo, o valor do level do player com ID 1 será alterado.
players representa a tabela que será mudada
level representa a coluna
WHERE id representa a restrição, para que seja modificado apenas o player 1
Você pode alterar várias colunas ao mesmo tempo e usar várias restrições:
db.executeQuery("UPDATE players SET level = 1, experience = 0, lookType = 128 WHERE vocation = 1, town_id = 2 ;") Neste exemplo, apenas o players Sorcerer que residem na town 2, terão o level, experience e outfit alterados.
Devo-lhes lembrar, que qualquer alteração nos players deve ser com o player offline.
Para isso, use: doRemoveCreature(cid) antes de alterar itens, mana, skills, etc. Sempre que o player sai os valores são atualizados, e a modificação será perdida!
Para deletar valores
db.executeQuery("DELETE FROM accounts WHERE id = 50 ;") Remove a conta id 50 da tabela.
Você pode usar mais que uma restrição:
WHERE premdays = 0, group_id = 1 Para pegar valores
Em uma única linha de valores
id = getPlayerGUIDByName(getPlayerName(cid)) local info = db.getResult("SELECT lastlogin, description FROM players WHERE id = " .. id .. " ;") local lastlogin = info:getDataInt("lastlogin") local description = info:getDataString("description") info:free() Explicação:
Em info é armazenada a consulta à database.
Para transformar a consulta em valores, você usa os métodos getDataInt e getDataString.
Após adquirir os valores, use o método free() para fechar a consulta.
Lembrando que você pode usar múltiplas restrições.
Múltiplas linhas
local player = db.getResult("SELECT * FROM `players` WHERE level = 50;") tabela = {} if player:getID() ~= -1 then while(true) do table.insert(tabela, {player:getDataInt("id"), player:getDataInt("cap"), player:getDataInt("balance")}) if not(player:next())then break end end player:free() else print("No database!") end return tabela Explicação:
Todos os players serão selecionados nesta consulta. O asterisco * representa que todas as colunas da tabela serão selecionados. Portanto, você pode pegar qualquer coluna que quiser.
O método getID() garante que a consulta foi bem sucedida. Caso contrário já retorna um erro.
O laço de repetição while(true) do garante que todas as linhas da consulta serão vistas.
Dentro do laço de repetição, será inserido na tabela = {} os valores da id, cap e balance.
if not(player:next())then break end garante que na ultima linha da consulta o laço de repetição chega ao fim.
Se por exemplo houver 3 players level 50, a tabela retornada terá o formato:
tabela = {{id1,cap1,balance1},{id2,cap2,balance2},{id3,cap3,balance3}}
------
Como complemento, deixo link para tópico do administrador Matheus
http://www.tibiaking.com/forum/topic/2023-phpmyadmin-comandos-uteis/
Bons estudos!
Abraços!
-
139 recebeu reputação de Doidodepeda em Adicionar Função Randomlocal id_arma = 7707 --id da arma usada function onStatsChange(cid, attacker, type, combat, value) if isPlayer(target) and type == COMBAT_PHYSICALDAMAGE and (getPlayerSlotItem(attacker, CONST_SLOT_RIGHT).itemid == id_arma or getPlayerSlotItem(attacker, CONST_SLOT_LEFT).itemid == id_arma) then if math.random(1, 5) == 1 then doCreatureAddHealth(attacker, value) end end return true end
-
139 recebeu reputação de sauryon em Script Criar ponte...local function removeTileItemById(pos, itemId) for i = 0, 255 do pos.stackpos = i local item = getThingFromPos(pos) if item.itemid == itemId then doRemoveItem(item.uid, 1) return true end end return false end local tiles, var, ret = { {x = 1468, y = 947, z = 6}, {x = 1469, y = 947, z = 6} }, 5901, 9230 local duracao = 10 -- em segundos function onUse(cid, item, fromPosition, itemEx, toPosition) local t = getTileItemById(tiles[1], ret).uid if t > 0 then return true end if not doPlayerRemoveItem(cid, var, 4) then doPlayerSendCancel(cid, 'Você precisa de 4 madeiras para construir a ponte.') doSendMagicEffect(getThingPos(cid), 2) return true end for i = 1, #tiles do doCreateItem(ret, 1, tiles[i]) addEvent(removeTileItemById, duracao*1000, tiles[i], ret) doSendMagicEffect(tiles[i], CONST_ME_POFF) end return true end
-
139 recebeu reputação de PsyMcKenzie em CONDITION_BLEEDING erro com spell em ot 8.6Já tentou alterar para CONDITION_PHYSICAL?
-
139 deu reputação a GuiAmaro em Benedetta - A cidade lavada do pecado,
Download: Clique Aqui
Scan: Clique Aqui
Descrição: Ilha completinha para vocês galera os que quiserem acompanhar o show-off do Mapa segue o video abaixo. Gosto de criar um mapa depois de forjar um RPG curto sobre o local para despertar mais criatividade na hora de criar os locais e nesta cidade eu me baseei na história de Moisés e as 10 pragas do Egito do livro Êxodo da Bíblia onde as caves são locais devastado por um poder Divino que castigou seres que adoravam coisas que não importavam e traziam desgraça aos locais e as pessoas boas que habitavam a Ilha, e o castigo levou tudo isso que danificava o lado bom da ilha ao subsolo dela e o que era bom e gracioso ficou na parte do térreo da Ilha. Eu dei referência a duas das 10 pragas do Egito em um andar e é representada pela praga que torno as águas do Egito em sangue e no andar abaixo o minimap desenha uma Rã que foi uma das pragas que caiu sobre a nação de Ramsés II.
Acompanhem o video, se puderem compartilhem com os amigos de vocês que se interessem por mapas únicos. Fiz o mapa do zero durante 1 mês nas minhas horas vagas. Dentro do canal vocês encontrarão vídeos de como eu mapeio, outra cidade e uma hunt, quem quiser se inscrever para acompanhar meus conteúdos agradeço. Ficaria mais grato ainda se vocês curtirem e compartilharem o video em outras comunidades que não tenho acesso. Mapeio tem 10 anos e quero enriquecer bastante a área de mapping da comunidade.
REPORTEM BUGS
-
139 deu reputação a Endless em 3 Game Ui DesignOlá, vou deixar para vocês alguns Game UI Design para utilizarem em seus projetos juntamente com as fontes de cada Game UI. Vale lembrar que elas não são de autoria minha e desconheço os autores, encontrei em 1 fórum obscuro chinês. Única coisa que peço é não repostar esse conteúdo em outros fóruns.
O link de Download de todos juntamente com os Scan de cada um estão logo abaixo. Bjs de luz e boa sorte em seus projetos.
PS: Os arquivos estão tudo em formato .psd (photoshop)
Game Ui Design 1:
Game Ui Design 2:
Game Ui Design 3:
-
139 deu reputação a Cat em Teias de Aranha congeladasFree for use
-
139 deu reputação a Cat em Itens e TokensEu fiz esses tokens menores e editei uns jewels do Tibia e estou disponibilizando pra vcs. Acompanha também uns anéis e colares que tem no Tibia porém versão holy/death.
-
139 recebeu reputação de raphadoidera em Magia de Área com Delay.@raphadoidera
-
139 recebeu reputação de Enenra em Spell dando index a nil valueO Dr. Frankestein ficaria orgulhoso desse código.
Pelo que eu entendi deveria ser isso:
-
139 recebeu reputação de Fabi Marzan em Spell - Big Regeneration@elielder
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local voc_bonus = { -- valor da cura adicional, ex: 0%, 10%, 50%, 100%, 200% ["Tanque"] = 50, ["Suporte"] = 25, ["Dano"] = 0, } local table_vocs = { -- last_id é o último id da vocação, a tabela precisa estar em ordem crescente. [1] = {last_id = 12, voc = "Naruto", classe = "Dano"}, [2] = {last_id = 20, voc = "Sasuke", classe = "Dano"}, [3] = {last_id = 30, voc = "Chouji", classe = "Tanque"}, [4] = {last_id = 40, voc = "Hidan", classe = "Tanque"}, [5] = {last_id = 50, voc = "Hashirama", classe = "Suporte"}, [6] = {last_id = 60, voc = "Obito", classe = "Suporte"}, } local function getBonus(cid, base) local pvoc = getPlayerVocation(cid) for k, _ in ipairs(table_vocs) do if pvoc <= table_vocs[k].last_id then bonus = voc_bonus[table_vocs[k].classe]/100 + 1 total = base * bonus return total end end end function onGetPlayerMinMaxValues(cid, level, magLevel) local min = ((level*0)+(magLevel*0)+200) local max = ((level*0)+(magLevel*0)+250) return getBonus(cid, min), getBonus(cid, max) end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetPlayerMinMaxValues") function onCastSpell(cid, var) return doCombat(cid, combat, var) end
-
139 recebeu reputação de ZeeroBR em (Resolvido) Pedido Spell de invisibilidadePq vc não usa a do nightwolf? Não funciona no seu server?
-
139 recebeu reputação de elielder em Spell - Big Regeneration@elielder
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) local voc_bonus = { -- valor da cura adicional, ex: 0%, 10%, 50%, 100%, 200% ["Tanque"] = 50, ["Suporte"] = 25, ["Dano"] = 0, } local table_vocs = { -- last_id é o último id da vocação, a tabela precisa estar em ordem crescente. [1] = {last_id = 12, voc = "Naruto", classe = "Dano"}, [2] = {last_id = 20, voc = "Sasuke", classe = "Dano"}, [3] = {last_id = 30, voc = "Chouji", classe = "Tanque"}, [4] = {last_id = 40, voc = "Hidan", classe = "Tanque"}, [5] = {last_id = 50, voc = "Hashirama", classe = "Suporte"}, [6] = {last_id = 60, voc = "Obito", classe = "Suporte"}, } local function getBonus(cid, base) local pvoc = getPlayerVocation(cid) for k, _ in ipairs(table_vocs) do if pvoc <= table_vocs[k].last_id then bonus = voc_bonus[table_vocs[k].classe]/100 + 1 total = base * bonus return total end end end function onGetPlayerMinMaxValues(cid, level, magLevel) local min = ((level*0)+(magLevel*0)+200) local max = ((level*0)+(magLevel*0)+250) return getBonus(cid, min), getBonus(cid, max) end setCombatCallback(combat, CALLBACK_PARAM_SKILLVALUE, "onGetPlayerMinMaxValues") function onCastSpell(cid, var) return doCombat(cid, combat, var) end
-
139 recebeu reputação de KR33 em (Resolvido)Ajuda com esse script efeito quando player logar [SCRIPT]@KR33 editei o meu último comentário com o a correção do código, agora está funcionando 100%.
-
139 recebeu reputação de Sun em (Resolvido)Ajuda com esse script efeito quando player logar [SCRIPT]Agora os erros estão explicados.
Finalizei o script do Sun, colocando os efeitos pra saírem por 5 segundos e centralizados devidamente no char.
-
139 deu reputação a Sun em (Resolvido)Ajuda com esse script efeito quando player logar [SCRIPT]local tabela_infos = { [0] = { Effect = 123, Storage = 259005, text = "Shinobi", color = COLOR_GREEN, efeito = 1}, -- ## [valor da storage] ## -- [1] = { Effect = 123, Storage = 259005, text = "Genin", color = COLOR_DARKBROWN, efeito = 2}, -- ## [valor da storage] ## -- [2] = { Effect = 123, Storage = 259005, text = "Chunin", color = COLOR_YELLOW, efeito = 2}, -- ## [valor da storage] ## -- [3] = { Effect = 123, Storage = 259005, text = "Jounin", color = COLOR_LIGHTGREEN, efeito = 2}, -- ## [valor da storage] ## -- [4] = { Effect = 123, Storage = 259005, text = "Akatsuki", color = COLOR_DARKRED, efeito = 2}, -- ## [valor da storage] ## -- [5] = { Effect = 123, Storage = 259005, text = "Captao A.", color = COLOR_WHITE, efeito = 2}, -- ## [valor da storage] ## -- [6] = { Effect = 123, Storage = 259005, text = "Anbu", color = COLOR_RED, efeito = 2} -- ## [valor da storage] ## -- } function onLogin(cid) for value, dados in pairs(tabela_infos) do if getPlayerStorageValue(cid, dados.Storage) == value then doSendMagicEffect(getPlayerPosition(cid), dados.efeito) doSendAnimatedText(getPlayerPosition(cid), dados.text, dados.color) end end return true end
agora em login.lua, cole isto acima do registerCreatureEvent
if getPlayerStorageValue(cid, 259005) == -1 then setPlayerStorageValue(cid, 259005, 0) end
e agora junto com registerCreatureEvent cole isto.
registerCreatureEvent(cid, "efeito")
e agora em creaturescript.xml
<event type="login" name="efeito" event="script" value="efeito.lua"/>
Este gif é para lhe mostrar como ficou, eu já configurei tudo para você, não precisa alterar nada além de efeito e text.
OBS: O ISTO É APENAS UMA ILUSTRAÇÃO, OU SEJA SE O PLAYER LOGAR NÃO IRA TROCAR O TEXTO SE ELE TIVER COM O VALOR DE SHINOBI.
@KR33
-
139 deu reputação a L3K0T em Deixando as Sprites mais Rápida no OTclientBom galera hoje vou ensinar a vocês como acelerar as Sprites do seu jogo pra ficar como do Tíbia Global, assista o vídeo abaixo que você vai entender.
Primeiramente vá na source do seu OTClient 0.6.6 "otclient-0.6.6\src\client"ou superior e abre o game.cpp depois de aberto procure.
if(version >= 1050) mude para
if(version <= 1050) Salve e Agora vá em const.h e procure.
INVISIBLE_TICKS_PER_FRAME = 500, ITEM_TICKS_PER_FRAME = 500, mude para
INVISIBLE_TICKS_PER_FRAME = 100, ITEM_TICKS_PER_FRAME = 100,
Feito isso salve e da Rebuild no compilador do otcliente que voce usa "recompilação limpa"
Depois de compilar vá no seu Object Builder e compile seu cliente pra "Improved Animations"
pronto, agora só usar
ATENÇÃO
USE SOMENTE EM CASO DE ERROS DO OTCLIENT, CASO NÃO LER SEU CLIENTE;
ache
function load() local version = g_game.getClientVersion() em baixo coloca
g_game.enableFeature(GameSpritesU32)
-
139 deu reputação a LeoTK em Como faço pra meu summon dar exeta res?ja fez o test com a skill original do exeta res porém colocar pro monstro usar?
OBS: pra registrar no monstro esse tipo de ataque não é pelo nome exeta res e sim pelo nome Challenge ou para o nome que for usar
Script
XML
<instant name="Challenge" words="exeta res" lvl="20" mana="30" prem="1" aggressive="0" exhaustion="1000" needlearn="0" event="script" value="support/challenge.lua"> <vocation id="0"/> </instant>
-
139 deu reputação a FlameArcixt em Não poder mover uma chest com ACTION ID do pisoEntão é quest, vc coloca o id dessa quest no brilho, e coloca o brilho em cima do chest, vai continuar ganhando o item, e o bau vai servir como enfeite, como se voce estivesse apertando ele
-
139 recebeu reputação de raphadoidera em SCRIPT DE MÍSSIL (Por Favor, me ajudem)local rng = math.random(0, 1) local toposA = {x = tpos.x + rng-1, y = tpos.y + rng, z = tpos.z} local toposB = {x = tpos.x + rng, y = tpos.y + rng-1, z = tpos.z}
Esse rng é pra gerar um número aleatório entre 0 e 1.
Esse número vai ser uma base pra alterar o destino dos 2 misseis adicionais.
O uso dele é pra modificar a coordenada do target (tpos), gerando duas novas coordenadas (diferentes entre sí) ao redor do target, a toposA e a toposB.
-
139 recebeu reputação de raphadoidera em SCRIPT DE MÍSSIL (Por Favor, me ajudem)Tinha feito o último rapidão pelo celular, agora ta certo:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, 41) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -78.2, 1, -88.2, 1) function onCastSpell(cid, var) local waittime = 2 -- Tempo de exhaustion local storage = 1000600 if exhaustion.check(cid, storage) then return false end local mypos = getCreaturePosition(cid) local tpos = getCreaturePosition(getCreatureTarget(cid)) local position1 = {x=tpos.x+1, y=tpos.y+1, z=tpos.z} local position2 = {x=mypos.x+3, y=mypos.y, z=mypos.z} local rng = math.random(0, 1) local toposA = {x = tpos.x + rng-1, y = tpos.y + rng, z = tpos.z} local toposB = {x = tpos.x + rng, y = tpos.y + rng-1, z = tpos.z} doSendMagicEffect(position1, 106) doSendMagicEffect(position2, 189) doSendDistanceShoot(mypos, toposA, 41) doSendDistanceShoot(mypos, toposB, 41) exhaustion.set(cid, storage, waittime) return doCombat(cid, combat, var) end
-
139 recebeu reputação de Will Oliveira em SCRIPT DE MÍSSIL (Por Favor, me ajudem)Coloca isso na linha acima do return(doCombat...):
local rng = math.random(0, 1)
local pos = getCreaturePosition(target)
local toposA = {x = pos.x + rng-1, y = pos.y + rng, z = pos.z}
local toposB = {x = pos.x + rng, y = pos.y + rng-1, z = pos.z}
doSendDistanceShoot(pos, toposA, 41)
doSendDistanceShoot(pos, toposB, 41)
-
139 recebeu reputação de GniusPlay em 0 Erro ao pokemon passar por cima de tilefunction onStepIn(cid, item, position, fromPosition)
if not isPlayer(cid) then return true end
if getPlayerGuildId(cid) > 0 then
doPlayerSendTextMessage(cid, 27, "Voce entrou, Guild "..getPlayerGuildName(cid)..".")
else
doPlayerSendTextMessage(cid, 27, "Desculpe,mais somente players que possuem guild pode entrar nessa area.")
doTeleportThing(cid, fromPosition)
end
return true
end
-
139 recebeu reputação de FlameArcixt em 0 Erro ao pokemon passar por cima de tilefunction onStepIn(cid, item, position, fromPosition)
if not isPlayer(cid) then return true end
if getPlayerGuildId(cid) > 0 then
doPlayerSendTextMessage(cid, 27, "Voce entrou, Guild "..getPlayerGuildName(cid)..".")
else
doPlayerSendTextMessage(cid, 27, "Desculpe,mais somente players que possuem guild pode entrar nessa area.")
doTeleportThing(cid, fromPosition)
end
return true
end
-
139 recebeu reputação de Mikethekingsz em SPELL ATTACKlocal chance = 50 local condition = createConditionObject(CONDITION_MUTED) setConditionParam(condition, CONDITION_PARAM_TICKS, 5000) function onCastSpell(cid, var) if not isPlayer(cid) then return false end if math.random(1,100) > chance then doSendAnimatedText(getCreaturePosition(cid), "Miss!", 215) return false end if exhaustion.check(cid, 13117) == true then doPlayerSendCancel(cid, "Podera usar novamente dentro de 15 segundos.") doSendMagicEffect(getCreaturePosition(cid), 2) return false end local tar = variantToNumber(var) if hasCondition(tar, CONDITION_MUTED) == true then return false else if isPlayer(tar) == true then doAddCondition(tar, condition) doSendAnimatedText(getCreaturePosition(tar), "Silenced!", 215) else doPlayerSendCancel(cid, "Silence can be cast only on other players.") return false end end exhaustion.set(cid, 13117, 15.0) return true end