Líderes
Conteúdo Popular
Exibindo conteúdo com a maior reputação em 01/31/16 em todas áreas
-
[SQL] Tutorial Básico
Administrador e 3 outros reagiu a Caronte por um tópico no fórum
Olá pessoal, hoje tenho um tempo livre para dedicar, e decidi criar um tutorial de SQL, nele vou explicar algumas coisas básicas, e algumas que pesquisei para ter certeza do que estou passando, no final do tutorial vou fornecer fontes, que podem ser usadas como forma de estudo. Antes de começar, vou utilizar algumas formatações para facilitar: Esse tutorial pode ser usado para MySQL também, pois o MySQL como o próprio nome já dá enfase, usa uma interface em SQL - que é uma linguagem, não confunda SQL com SQLite Studio ou MySQL. Primeiramente tenho que explicar o que é: SQL - (Structured Query Language) Linguagem de Consulta Estruturada, é uma linguagem de banco de dados, ou seja, serve para guardar, consultar e editar quase quaisquer dados. No seu arquivo .sql que fica na sua pasta \schemas, contém uma database salva através de vários QUERYS, como eu disse antes, querys são parte da interface do SQL, e com eles, você pode jogar num MySQL que abrirá magicamente, ou simplesmente executará os querys preenchendo sua database. Exemplo de arquivo .SQL: Os arquivos .s3db são do SQLite Studio, essa extensão de arquivo é usada para armazenar a database para o programa em específico. Trecho retirado de: http://www.w3schools.com/sql/sql_syntax.asp Querys - query, pode ser traduzido para: pergunta, questão, dúvida. Eles são usados em tudo dentro da linguagem, tudo que você faz com seus dados na database, é um query que roda no interpretador. Cada tabela contém colunas, e cada coluna, contém data = dados, e o conjunto de dados forma a sua database, através da organização de rows e colunas. Vou explicar melhor na prática: Sintaxe - é todo o conjunto de comandos de uma linguagem. que serve para montar a lógica. Umas das sintaxes do SQL: SELECT - Extrai dados da database UPDATE - Atualiza dados da database DELETE - Deleta dados de uma database INSERT INTO - Insere novos dados dentro da database CREATE DATABASE - Cria uma nova database ALTER DATABASE - Altera uma database CREATE TABLE - Cria uma nova tabela ALTER TABLE - Modifica uma tabela DROP TABLE - Deleta uma tabela CREATE INDEX - Cria um index DROP INDEX - Deleta um index DISTINCT - Usa-se junto com SELECT para distinguir o que selecionar WHERE - Usa para impor condições AND - Usa para somar condições OR - Usa para subtrair condições ...E etc... Acesse este link, é um interpretador de querys, com uma database. No canto direito "You Database:" você pode visualizar os dados, e restaurar, restaure quando você fizer alguma merda (como deletar ou alterar algo sem querer). Lá dentro, escreva isto, e aperte "Run SQL >>" , o interpretador irá rodar/executar o query. SELECT * FROM Customers; Essa expressão acima, seleciona * (todos os dados) da tabela Customers (poderia ser tabela Accounts ou Players), que contém várias rows/fileiras (um total de 91), vamos diminuir utilizando outro comando, para diminuir a quantidade de informação: SELECT * FROM Customers WHERE CustomerID < 4; Ótimo, agora ficará assim: Para explicar o que é o que: Quando usamos um QUERY para selecionar, seguimos o seguinte padrão: SELECT coluna FROM tabela WHERE coluna=1; Ou SELECT ContactName FROM Customers WHERE Address="Obere Str. 57" isso vai selecionar direto "Maria Anders" pois os endereços são únicos... Essa situação pode ser usada no tibia por exemplo, para selecionar o noivo ou noiva no marriage system, já que eles precisam ser colocados no banco de dados. Os storages não são nada mais nada menos do que dados da database, que são chamados e alterados através de querys, por LUA ou C++... Vale lembrar pessoal que para usar um query em LUA, é só usar a função: db.query("SELECT * FROM `accounts`") o query dentro foi somente um exemplo. Fontes: http://www.w3schools.com/sql/ http://www.1keydata.com/pt/sql/ Não usei, mas é uma opção em português. Recomendo muito o w3schools, não só para sql, mas para tudo que tiver lá, eles explicam muito bem. Bom, foi isso pessoal, espero que tenham gostado e que ajude nas suas empreitadas QUALQUER Crítica construtiva ou sugestão pode comentar abaixo. Posso fazer outros tópicos de sql, caso este esteja bom. Suporte no tópico. :smile_positivo:4 pontos -
Base usada: PDA by Slicer, v1.9 Para quem não conhece o sistema de mega evoluções, recomendo acessar este link. A diferença é que a pedra (mega stone) não ocupa o espaço de um Held Item tier Y (visto que não são todos os servidores que possuem Held Itens). Instalação do sistema (atenção nos detalhes) data/lib: cooldown bar.lua: Troque o código da função getNewMoveTable(table, n) por este: function getNewMoveTable(table, n) if table == nil then return false end local moves = {table.move1, table.move2, table.move3, table.move4, table.move5, table.move6, table.move7, table.move8, table.move9, table.move10, table.move11, table.move12} local returnValue = moves if n then returnValue = moves[n] end return returnValueend No código da função doUpdateMoves(cid), troque o segundo: table.insert(ret, "n/n,") por: local mEvolveif not getCreatureName(summon):find("Mega") and getItemAttribute(getPlayerSlotItem(cid, 8).uid, "megaStone") then if not isInArray(ret, "Mega Evolution,") then table.insert(ret, "Mega Evolution,") mEvolve = true endendif not mEvolve then table.insert(ret, "n/n,")end Depois, em pokemon moves.lua: Troque: min = getSpecialAttack(cid) * table.f * 0.1 --alterado v1.6 por: min = getSpecialAttack(cid) * (table and table.f or 0) * 0.1 --alterado v1.6 Código da spell: elseif spell == "Mega Evolution" then local effect = xxx --Efeito de mega evolução. if isSummon(cid) then local pid = getCreatureMaster(cid) if isPlayer(pid) then local ball = getPlayerSlotItem(pid, 8).uid if ball > 0 then local attr = getItemAttribute(ball, "megaStone") if attr and megaEvolutions[attr] then local oldPosition, oldLookdir, health_percent_lost = getThingPos(cid), getCreatureLookDir(cid), (getCreatureMaxHealth(cid) - getCreatureHealth(cid)) * 100 / getCreatureMaxHealth(cid) doItemSetAttribute(ball, "poke", megaEvolutions[attr][2]) doSendMagicEffect(getThingPos(cid), effect) doRemoveCreature(cid) doSummonMonster(pid, megaEvolutions[attr][2]) local newPoke = getCreatureSummons(pid)[1] doTeleportThing(newPoke, oldPosition, false) doCreatureSetLookDir(newPoke, oldLookdir) adjustStatus(newPoke, ball, true, false) doCreatureAddHealth(newPoke, -(health_percent_lost * getCreatureMaxHealth(newPoke) / 100)) if useKpdoDlls then addEvent(doUpdateMoves, 5, pid) end end end end end Depois, em configuration.lua: megaEvolutions = { --[itemid] = {"poke_name", "mega_evolution"}, [11638] = {"Charizard", "Mega Charizard X"}, [11639] = {"Charizard", "Mega Charizard Y"},} Agora, em data/actions/scripts, código da mega stone: function onUse(cid, item) local mEvolution, ball = megaEvolutions[item.itemid], getPlayerSlotItem(cid, 8).uid if not mEvolution then return doPlayerSendCancel(cid, "Sorry, this isn't a mega stone.") elseif ball < 1 then return doPlayerSendCancel(cid, "Put a pokeball in the pokeball slot.") elseif #getCreatureSummons(cid) > 0 then return doPlayerSendCancel(cid, "Return your pokemon.") elseif getItemAttribute(ball, "poke") ~= mEvolution[1] then return doPlayerSendCancel(cid, "Put a pokeball with a(n) "..mEvolution[1].." in the pokeball slot.") elseif getItemAttribute(ball, "megaStone") then return doPlayerSendCancel(cid, "Your pokemon is already holding a mega stone.") end doItemSetAttribute(ball, "megaStone", item.itemid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Now your "..getItemAttribute(ball, "poke").." is holding a(n) "..getItemNameById(item.itemid)..".") doRemoveItem(item.uid) return trueend Depois, em goback.lua: Abaixo de: if not pokes[pokemon] then return trueend coloque: if pokemon:find("Mega") then local normalPoke = megaEvolutions[getItemAttribute(item.uid, "megaStone")][1] if normalPoke then doItemSetAttribute(item.uid, "poke", normalPoke) pokemon = normalPoke end end Depois, em data/creaturescripts/scripts, look.lua: Abaixo de: local boost = getItemAttribute(thing.uid, "boost") or 0 coloque: local extraInfo, megaStone = "", getItemAttribute(thing.uid, "megaStone")if megaStone then extraInfo = getItemNameById(megaStone) if pokename:find("Mega") then pokename = megaEvolutions[megaStone][1] endend Depois, acima do primeiro: doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, table.concat(str)) coloque: if extraInfo ~= "" then table.insert(str, "\nIt's holding a(n) "..extraInfo..".")end Já em data/talkactions/scripts, move1.lua: Abaixo de: function doAlertReady(cid, id, movename, n, cd) coloque: if movename == "Mega Evolution" then return true end Troque: if not move then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return true end por: if not move then local isMega = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "megaStone") if not isMega or name:find("Mega") then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return true end local moveTable, index = getNewMoveTable(movestable[name]), 0 for i = 1, 12 do if not moveTable[i] then index = i break end end if tonumber(it) ~= index then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.") return true end local needCds = true --Coloque false se o pokémon puder mega evoluir mesmo com spells em cooldown. if needCds then for i = 1, 12 do if getCD(getPlayerSlotItem(cid, 8).uid, "move"..i) > 0 then return doPlayerSendCancel(cid, "To mega evolve, all the spells of your pokemon need to be ready.") end end end move = {name = "Mega Evolution", level = 0, cd = 0, dist = 1, target = 0} end E troque: doCreatureSay(cid, ""..getPokeName(mypoke)..", "..msgs[math.random(#msgs)]..""..move.name.."!", TALKTYPE_SAY) por: local spellMessage = msgs[math.random(#msgs)]..""..move.name.."!"if move.name == "Mega Evolution" then spellMessage = "Mega Evolve!"enddoCreatureSay(cid, getPokeName(mypoke)..", "..spellMessage, TALKTYPE_SAY) Se não quiser que o "Mega" apareça no nome do pokémon, vá em data/lib, level system.lua: Acima de: if getItemAttribute(item, "nick") then nick = getItemAttribute(item, "nick")end coloque: if nick:find("Mega") then nick = nick:match("Mega (.*)") if not pokes[nick] then nick = nick:explode(" ")[1] end end Caso queiram que cada mega evolução tenha um clã específico: Em move1.lua, acima de: move = {name = "Mega Evolution", level = 0, cd = 0, dist = 1, target = 0, f = 0, t = "?"} coloque: local megaEvoClans = { --[mega_stone_id] = "clan_name", [91912] = "Volcanic", [91913] = "Seavell", --etc,}if megaEvoClans[isMega] then if getPlayerClanName(cid) ~= megaEvoClans[isMega] then return doPlayerSendCancel(cid, "You can't mega evolve this pokemon.") endend Finalizando o tópico após uma pequena reestruturação na indexação, gostaria de levantar algo que acredito ser bem claro: o sistema é cheio de detalhes, muitas vezes minuciosos. Um simples erro e bugs aparecem por toda parte. Se você encontrou algum, pelo menos uma das duas seguintes condições acontecem: Base DIFERENTE da usada. Peço desculpas, mas não pretendo adaptar o sistema para todas as bases diferentes que aparecerem. Se a base for a mesma, você com certeza errou em algum ponto da instalação. O sistema foi testado inúmeras vezes, não apenas por mim, e seu funcionamento foi seguidamente comprovado. Façam bom uso, invocadores.1 ponto
-
Author:Printer Como funciona: Instalação: Vá em actions/actions.xml e adicione essa linha: <action actionid="8000" script="tronEventLever.lua" /> Vá em actions/scripts e crie um arquivo chamado ''tronEventLever.lua'' e adicione isso dentro: function onUse(player, item, fromPosition, target, toPosition, isHotkey) if item.itemid == 1945 then if tronEvent:onUseLever(player) == false then return true end end item:transform(item.itemid == 1945 and 1946 or 1945) return true end Agora vá em movements/movements.xml e remova essas linhas: <movevent event="AddItem" itemid="1492" function="onAddField" /> <movevent event="StepIn" itemid="1493" function="onStepInField" /> <movevent event="StepIn" itemid="1500" function="onStepInField" /> <movevent event="AddItem" itemid="1500" function="onAddField" /> <movevent event="StepIn" itemid="1506" function="onStepInField" /> <movevent event="AddItem" itemid="1506" function="onAddField" /> E adicione essas linhas: <movevent event="StepIn" itemid="1492" script="tronEventMovement.lua" /> <movevent event="StepIn" itemid="1500" script="tronEventMovement.lua" /> <movevent event="StepIn" itemid="1506" script="tronEventMovement.lua" /> Vá em movements/scripts e crie um arquivo chamado "tronEventMovement.lua" e adicione isso dentro: function onStepIn(creature, item, position, fromPosition) local player = creature:getPlayer() if player == nil then return false end position:sendMagicEffect(CONST_ME_FIREAREA) tronEvent:onPlayerDeath(player, tonumber(item:getAttribute(ITEM_ATTRIBUTE_TEXT)) or 0) return true end Agora em data/global.lua,adicione essa linha: dofile('data/tronEvent.lua') Create new lua inside data folder and name it: "tronEvent.lua" and paste this: http://pastebin.com/qdjptfYe1 ponto
-
Potions por alavanca configurado por Talkaction
Administrador reagiu a giots por um tópico no fórum
Este é um sistema para comprar potions por alavanca, só que podendo configurar a quantidade de potions a ser comprada. Exemplo: !potions 50 ~~comprará 50 potions a cada vez que usar a alavanca. Primeiro vou dar o exemplo da gmp Crie um arquivo em data/actions/scripts com o nome de greatmp.lua e coloque: em actions.lua coloque : Agora em talkactions Crie um arquivo chamado potions.lua e coloque: em talkactions.lua coloque: Agora vá no rme e coloque o action id 1515 na alavanca que irá ser usada Extras: movements para o jogador na primeira vez que ele passar em movements, crie potions.lua e coloque: movements.lua ***Para evitar que os jogadores joguem lixo em cima das potions de ilustração, vá no rme e coloque o item 1548 (invisible blocking item) em cima delas. Scripts das outras potions abaixo: mana potion great health potion: spirit potion: strong health potion strong mana potion: ultimate health potion: créditos: eu1 ponto -
Servidor 10.90 | Windows 32/64 Bits | Versão Final
lokoga reagiu a Marco Oliveira por um tópico no fórum
Opa mano tudo bem ? então este datapack não possui as quests do global não.... também não possui o mapa. Mas se você quiser da pra colocar o mapa e configurar tudo certinho, mas para isso EU recomendaria você a baixar um datapack do fórum já configurado pra global e usar somente a disto. Tópico Atualizado sources adicionada e problemas corrigidos.... Acabei de corrigir esse problema maninho, refaça o download e seja feliz... Adicionei as sources ao download...1 ponto -
Talkaction para retirar premium points do Site
Dennyz Dias reagiu a Danihcv por uma questão
Update: O script continha um bug que permitia crashar o servidor (caso o player botasse um numero negativo) e tambem caso o parametro não fosse um numero, o player falava uma mensagem normal. Esse erros foram corrigidos: situationpoints.lua: local pointObj = 2160 --id do item "points" function getAccountPoints(cid) local res = db.getResult('SELECT `premium_points` FROM `accounts` WHERE id='..getPlayerAccountId(cid)..'') if(res:getID() == -1) then return false end local ret = res:getDataInt("premium_points") res:free() return tonumber(ret) end function onSay(cid, words, param) if (words == '!sacar') then if param ~= "" then if tonumber(param) ~= nil then if 0 >= tonumber(param) then doPlayerSendCancel(cid, "O valor precisa ser acima de zero.") elseif 0 < tonumber(param) and tonumber(param) <= getAccountPoints(cid) then doPlayerAddItem(cid, pointObj, tonumber(param)) db.executeQuery('UPDATE `accounts` SET `premium_points`='..getAccountPoints(cid) - tonumber(param)..' WHERE id='.. getPlayerAccountId(cid)..'') newPoints = getAccountPoints(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Você ainda possui '..newPoints..' premium points em sua conta.') else doPlayerSendCancel(cid, "Você não tem tantos premium points assim.") end else doPlayerSendCancel(cid, "O valor precisa ser um numero.") end else doPlayerSendCancel(cid, "Você precisa especificar um valor.") end elseif (words == '!saldo') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Seu saldo no shopping atual é de '..getAccountPoints(cid)..' Premium points.') elseif (words == '!depositar') then if param ~= "" then if tonumber(param) ~= nil then if 0 >= tonumber(param) then doPlayerSendCancel(cid, "O valor precisa ser acima de zero.") elseif 0 < tonumber(param) and tonumber(param) <= getPlayerItemCount(cid, pointObj) then doPlayerRemoveItem(cid, pointObj, tonumber(param)) db.executeQuery('UPDATE `accounts` SET `premium_points`='..getAccountPoints(cid) + tonumber(param)..' WHERE id='.. getPlayerAccountId(cid)..'') newPoints = getAccountPoints(cid) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Você acabou de depositar '..param..' premium points no shopping. Seu saldo agora é de '..newPoints..' premium points.') else doPlayerSendCancel(cid, "Você não tem tantos premium points assim.") end else doPlayerSendCancel(cid, "O valor precisa ser um numero.") end else doPlayerSendCancel(cid, "Você precisa especificar um valor.") end end return true end A tag em talkactions.xml permanece a mesma.1 ponto
Líderes está configurado para São Paulo/GMT-03:00