Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. Claro, você cometeu alguns erros básicos. Primeiro, você atribui a variável level, o level atual do jogador, depois verifica se tal é maior ou igual a 8 e manda a mensagem. Mesmo que o jogador continue no 8 e evolua, por exemplo, Sword Fighting, a mensagem seria mandada. O mais correto a fazer seria se utilizar dos parâmetros que a função fornece para você. local vocations = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} function onAdvance(cid, skill, oldLevel, newLevel) if skill == SKILL__LEVEL then if newLevel >= 8 then if isInArray(vocations, getPlayerVocation(cid)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você recebeu cinco stat points. Para checar seus pontos, digite !points") end end end return true end
  2. Meu Deus... não sei contar quantas vezes me perdi nesse código macarrônico aí. function onSay(cid, words, param) if(words == "!points") then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você tem "..getPoints(cid).." Points.") elseif(words == "!rankpoints") then local max_players,str = 20,"" str = "--[ RANK POINTS ]--\n\n" query = db.getResult("SELECT `name`, `points` FROM `players` WHERE `points` > -1 AND `id` > 6 AND `group_id` < 2 ORDER BY `points` DESC, `name` ASC;") if (query:getID() ~= -1) then k = 1 while true do str = str .. "\n " .. k .. ". " .. query:getDataString("name") .. " - [" .. query:getDataInt("points") .. "]" k = k + 1 if not(query:next()) or k > max_players then break end end query:free()end if str ~= "" then doShowTextDialog(cid,6500, str) end elseif(words == "/addpoints") then if getPlayerAccess(cid) == 5 then local t = string.explode(param, ",") if not t[1] or not t[2] then return TRUE,doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.") end local player = getPlayerByName(t[1]) local points = tonumber(t[2]) or 1 local pid = getPlayerByNameWildcard(t[1]) if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then db.executeQuery("UPDATE players SET `points` = `points` + ".. points .." WHERE `name` = ".. db.escapeString(t[1]) ..";") doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "você adicionou "..points.." Points do jogador "..t[1]) return true end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "você adicionou "..points.." Points do jogador "..t[1]) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Foram adicionados "..points.." Points no seu character.") addPoints(player,points) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Você agora tem "..getPoints(player).." Points.") end elseif(words == "/delpoints") then if getPlayerAccess(cid) == 5 then local t = string.explode(param, ",") if not t[1] or not t[2] then return TRUE,doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.") end local player = getPlayerByName(t[1]) local points = tonumber(t[2]) or 1 local pid = getPlayerByNameWildcard(t[1]) if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then db.executeQuery("UPDATE players SET `points` = `points` - ".. points .." WHERE `name` = ".. db.escapeString(t[1]) ..";") doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "você removeu "..points.." Points do jogador "..t[1]) return true end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "você removeu "..points.." Points do jogador "..t[1]) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Foram removidos "..points.." Points do seu character.") removePoints(player,points) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Você agora tem "..getPoints(player).." Points.") end elseif(words == "/setpoints") then if getPlayerAccess(cid) == 5 then local t = string.explode(param, ",") if not t[1] or not t[2] then return TRUE,doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.") end local player = getPlayerByName(t[1]) local points = t[2] local pid = getPlayerByNameWildcard(t[1]) if(not pid or (isPlayerGhost(pid) and getPlayerGhostAccess(pid) > getPlayerGhostAccess(cid))) then return TRUE,doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player with this name doesn\'t exist or is offline.") end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Agora o jogador "..t[1].." tem "..points.." Points no seu character.") doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "agora você tem "..points.." Points do seu character.") setPoints(player,points) end end return TRUE end
  3. Toma aí data/creaturescripts/scripts/advanceequip.lua local config = { [1] = { [CONST_SLOT_HEAD] = 2323, [CONST_SLOT_ARMOR] = 8871, [CONST_SLOT_RIGHT] = 0, [CONST_SLOT_LEFT] = 8901, [CONST_SLOT_LEGS] = 7730, [CONST_SLOT_FEET] = 2195 }, [2] = { [CONST_SLOT_HEAD] = 2323, [CONST_SLOT_ARMOR] = 8871, [CONST_SLOT_RIGHT] = 0, [CONST_SLOT_LEFT] = 8901, [CONST_SLOT_LEGS] = 7730, [CONST_SLOT_FEET] = 2195 }, [3] = { [CONST_SLOT_HEAD] = 2498, [CONST_SLOT_ARMOR] = 8891, [CONST_SLOT_RIGHT] = 0, [CONST_SLOT_LEFT] = 2520, [CONST_SLOT_LEGS] = 2470, [CONST_SLOT_FEET] = 2195 }, [4] = { [CONST_SLOT_HEAD] = 2498, [CONST_SLOT_ARMOR] = 2487, [CONST_SLOT_RIGHT] = 0, [CONST_SLOT_LEFT] = 2520, [CONST_SLOT_LEGS] = 2470, [CONST_SLOT_FEET] = 2645 } } function onAdvance(cid, skill, oldLevel, newLevel) if(skill == SKILL__LEVEL) then if(newLevel == 65) then if not config[getPlayerVocation(cid)] then return true end local tmp = config[getPlayerVocation(cid)] for slotid, itemid in pairs(tmp) do local g = getPlayerSlotItem(cid, slotid) if g.uid > 0 then doRemoveItem(g.uid) end if itemid > 0 then doPlayerAddItemEx(cid, doCreateItemEx(itemid, 1), false, slotid) end end end end return true end creaturescripts.xml <event type="advance" name="AdvanceEquip" event="script" value="advanceequips.lua"/> login.lua registerCreatureEvent(cid, "AdvanceEquip") Lembrando que em alguns servidores antigos, como o 0.3.6pl1, não tem como adicionar o equipamento EXATAMENTE em um certo slot. Abraços.
  4. Oneshot

    2 dúvidas o.O

    1. Não, não funcionaria. Você precisa pensar em um algoritmo usando for para checar todas as posições ao redor do jogador, para isso, dê uma olhada na imagem abaixo: Veja que marquei dois pontos, um na ponto superior-esquerdo que tem as coordenadas [-1; -1] e o outro no ponto inferior-direito que tem as coordenadas [1; 1] em relação a posição do jogador. Levando em consideração que posições são tabelas que possuem três variáveis dentro - x; y; z - e que essas variáveis são valores numéricos, basta então fazer um for entre -1 e 1 somando a variável do for a posição base, que no caso, seria a posição do jogador. Mas no caso teríamos que usar dois for indenpendentes um do outro, um para a variável x e outro para a variável y, uma vez que se usarmos apenas um for, ele iteraria entre -1, 0 e 1, somaria esses valores a posição base simultaneamente e acabaríamos verificando apenas as posições diagonais. Logo nosso rascunho fica mais ou menos assim: function onUse(cid, item, fromPosition, itemEx, toPosition) local position = getThingPosition(cid) for x = -1, 1 do for y = -1, 1 do local tmp = {x = position.x + x, y = position.y + y, z = position.z} if getTileItemById(tmp, 2160).uid > 0 or getTopCreature(tmp).uid > 0 then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "SSD") break end end end return true end Por exemplo, no caso acima, fiz para verificar se tinha o item crystal coin ao redor do jogador ou uma criatura. 2. Querys são algo bem simples mesmo, vou só falar o básico delas. Divida elas em dois tipos, alterar e obter. Ou seja uma estrutura de query serve para alterar os campos do banco de dados e a outra serve para obter algo do banco de dados. UPDATE table SET column = value SELECT column FROM table Claro que fazer algo assim vai selecionar todas as linhas de uma certa coluna. É aí que entra o WHERE que serve como um filtro para o que você quer. UPDATE table SET x = y WHERE a = b SELECT x FROM table WHERE a = b Você pode intercalar vários "filtros" do WHERE com AND UPDATE table SET x = y WHERE a = b AND c = d SELECT x FROM table WHERE a = b AND c = d Bem simples mesmo. Claro que tem algumas coisas extras como IN, ORDER BY, dentre outros.
  5. Você me pediu um comando que comprasse uma backpack cheia de Amulet of Loss e não um comando que comprasse X quantidade de Amulet of Loss em uma backpack. Mas, enfim, né... function onSay(cid, words, param, channel) local backpack = doCreateItemEx(1988, 1) local count = tonumber(param) or 1 local cost = (count * 500) if(not doPlayerRemoveMoney(cid, cost)) then doPlayerSendCancel(cid, "Sorry, you do not have enough money.") return true end for n = 1, count do doAddContainerItemEx(backpack, doCreateItemEx(2173, 1)) end doPlayerAddItemEx(cid, backpack) return true end
  6. Não, cara, não tem nada a ver. Tanto faz com ponto-e-vírgula ou sem. Você simplesmente está achando que executou a query, mas não executou nada ou executou na database errada.
  7. Alguns segundos com a pesquisa do fórum: http://www.xtibia.com/forum/topic/137376-criar-um-item-com-id-propria-usando-o-item-editor/
  8. Nossa e você espera que todos venham fazer uma boa ação te dando scripts, mapas e etcétera, etcétera para que você criar seu servidor? Isso sim é o cúmulo de querer tudo na mão, meu velho. O fórum tem uma barra de pesquisa: Ela serve justamente para procurar coisas. Basta digitar uma ou mais palavras-chave que você pode encontrar vários tópicos relacionados e, provavelmente, encontrar o que procura para seu servidor. Abraços.
  9. Pelo que eu entendi da gambiarra monstra, é um script para servidores de war que dá exp para jogadores que matam outros jogadores, mas pune aqueles que usam Multiclient. O outro pedido, só com pequenas edições nas sources.
  10. Nome: Pull/Push Spells Autor: Oneshot Tipo: Magia Já vi vários pedidos de magias que puxem ou empurrem monstros e jogadores, então resolvi fazer essas duas magias. Pull Spell local function doPullCreature(target, cid) if target > 0 then if not isNpc(target) then local position = getThingPosition(cid) local fromPosition = getThingPosition(target) local x = ((fromPosition.x - position.x) < 0 and 1 or ((fromPosition.x - position.x) == 0 and 0 or -1)) local y = ((fromPosition.y - position.y) < 0 and 1 or ((fromPosition.y - position.y) == 0 and 0 or -1)) local toPosition = {x = fromPosition.x + x, y = fromPosition.y + y, z = fromPosition.z} if doTileQueryAdd(target, toPosition) == 1 and getTileInfo(toPosition).house == false then doTeleportThing(target, toPosition, true) end end end end local spell = {} spell.config = { [3] = { damageType = 1, areaEffect = 2, area = { {0, 0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 3, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 0, 0} } }, [2] = { damageType = 1, areaEffect = 2, area = { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 3, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0} } }, [1] = { damageType = 1, areaEffect = 2, area = { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 1, 3, 1, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0} } } } spell.combats = {} for _, config in ipairs(spell.config) do local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, config.damageType) setCombatParam(combat, COMBAT_PARAM_EFFECT, config.areaEffect) function onTargetCreature(cid, target) doPullCreature(target, cid) end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") setCombatArea(combat, createCombatArea(config.area)) table.insert(spell.combats, combat) end function onCastSpell(cid, var) for n = 1, #spell.combats do addEvent(doCombat, (n * 150) - 150, cid, spell.combats[n], var) end return true end Push Spell local function doPushCreature(target, cid) if target > 0 then if not isNpc(target) then local position = getThingPosition(cid) local fromPosition = getThingPosition(target) local x = ((fromPosition.x - position.x) < 0 and -1 or ((fromPosition.x - position.x) == 0 and 0 or 1)) local y = ((fromPosition.y - position.y) < 0 and -1 or ((fromPosition.y - position.y) == 0 and 0 or 1)) local toPosition = {x = fromPosition.x + x, y = fromPosition.y + y, z = fromPosition.z} if doTileQueryAdd(target, toPosition) == 1 and getTileInfo(toPosition).house == false then doTeleportThing(target, toPosition, true) end end end end local spell = {} spell.config = { [3] = { damageType = 1, areaEffect = 2, area = { {0, 0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 3, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 0, 0} } }, [2] = { damageType = 1, areaEffect = 2, area = { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 3, 1, 1, 0}, {0, 1, 1, 1, 1, 1, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0} } }, [1] = { damageType = 1, areaEffect = 2, area = { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 1, 3, 1, 0, 0}, {0, 0, 1, 1, 1, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0} } } } spell.combats = {} for _, config in ipairs(spell.config) do local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, config.damageType) setCombatParam(combat, COMBAT_PARAM_EFFECT, config.areaEffect) function onTargetCreature(cid, target) doPushCreature(target, cid) end setCombatCallback(combat, CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") setCombatArea(combat, createCombatArea(config.area)) table.insert(spell.combats, combat) end function onCastSpell(cid, var) for n = 1, #spell.combats do addEvent(doCombat, (n * 150) - 150, cid, spell.combats[n], var) end return true end Abraços.
  11. Tópico movido para a seção de dúvidas e pedidos resolvidos.
  12. Não, meu velho, você não executou. Pois o erro simplesmente é sobre a não-existência da coluna points.
  13. Ah, toma aí, vai. function onSay(cid, words, param, channel) local backpack = doCreateItemEx(1988, 1) local amount = getContainerCap(backpack) local cost = (amount * 500) if(not doPlayerRemoveMoney(cid, cost)) then doPlayerSendCancel(cid, "Sorry, you do not have enough money.") return true end for i = 1, getContainerCap(backpack) do doAddContainerItemEx(backpack, doCreateItemEx(2173, 1)) end doPlayerAddItemEx(cid, backpack) return true end Só registrar o comando como !bpaol.
  14. Você tem que executar a query para criar a coluna points na tabela players ALTER TABLE `players` ADD `points` INT NOT NULL DEFAULT 0;
  15. Não. Fiz assim, testei assim e funcionou assim. Se quiser fazer suas próprias modificações, a vontade, amigão. Abraços.
  16. Sim, eu sei qual é o problema. O console acusa que em alguma linha dos dois scripts, está ocorrendo uma comparação entre um valor númerico e algo está retornando nil (ou nulo). Só achar as linhas e consertar. Abraços.
  17. Não possuo a mínima ideia de como fazer com Distance Effect e mesmo com Effect é inviável, uma vez que você iria precisar mandar várias vezes o mesmo efeito no caminho do Kagemane no Jutsu. Seria melhor com itens mesmo.
  18. local config = { prices = { [2173] = 250, [NEW_ITEM] = NEW_PRICE, [NEW_ITEM] = NEW_PRICE }, words = { ["aol"] = "amulet of loss" } } A outra tabela só mexe se você quiser adicionar abreviações.
  19. É que no caso ele quis só exemplificar como funcionaria a magia, no que ela foi baseada. Dá até para fazer ela desse jeito do vídeo, mas você iria precisar criar esses itens de "sombra" (horizontal, vertical e diagonal) que aparecem no vídeo rs.
  20. local config = { prices = { [2173] = 250 }, words = { ["aol"] = "amulet of loss" } } function onSay(cid, words, param, channel) if(param == "") then doPlayerSendCancel(cid, words .." [item name]") return true end if(config.words[param]) then param = config.words[param] end local id = getItemIdByName(param, false) if(not id) then doPlayerSendCancel(cid, "This item does not exist.") return true end if(not config.prices[id]) then doPlayerSendCancel(cid, "Sorry, you can not buy this item.") return true end local backpack = doCreateItemEx(1988, 1) local amount = getContainerCap(backpack) local cost = config.prices[id] * amount if(not doPlayerRemoveMoney(cid, cost)) then doPlayerSendCancel(cid, "Sorry, you do not have enough money.") return true end for i = 1, getContainerCap(backpack) do doAddContainerItemEx(backpack, doCreateItemEx(id, 1)) end doPlayerAddItemEx(cid, backpack) return true end Tá aí, meu velho, fiz um sistema básico de compra por backpacks pra você. /bp aol Dá pra colocar qualquer item pra ser vendido aí. Só configurar o preço unitário. Abraços.
  21. Crie um arquivo chamado outfits.lua em data/creaturescripts/scripts. Cole o código abaixo: local outfits = { [1] = { [25] = 86, [50] = 98, [100] = 122 }, [2] = { [25] = 91, [50] = 103, [100] = 127 }, [3] = { [25] = 96, [50] = 108, [100] = 132 }, [4] = { [25] = 101, [50] = 113, [100] = 137 } } function onLogin(cid) registerCreatureEvent(cid, "Outfits") return true end function onAdvance(cid, skill, fromLevel, toLevel) if not outfits[getPlayerVocation(cid)] then return true end local tmp = outfits[getPlayerVocation(cid)] if not tmp[toLevel] then return true end local looktype = tmp[toLevel] doSetCreatureOutfit(cid, looktype, -1) return true end Adicione essas linhas em seu creaturescripts.xml <event type="login" name="PlayerLogin37" event="script" value="outfits.lua"/> <event type="advance" name="Outfits" event="script" value="outfits.lua"/> Só configurar essa parte aqui a seu gosto local outfits = { [1] = { [25] = 86, [50] = 98, [100] = 122 }, [2] = { [25] = 91, [50] = 103, [100] = 127 }, [3] = { [25] = 96, [50] = 108, [100] = 132 }, [4] = { [25] = 101, [50] = 113, [100] = 137 } } Seguindo sempre o modelo local outfits = { [1] = { [25] = 86, [50] = 98, [100] = 122, [NEW_LEVEL] = NEW_OUTFIT }, [2] = { [25] = 91, [50] = 103, [100] = 127, [NEW_LEVEL] = NEW_OUTFIT }, [3] = { [25] = 96, [50] = 108, [100] = 132, [NEW_LEVEL] = NEW_OUTFIT }, [4] = { [25] = 101, [50] = 113, [100] = 137, [NEW_LEVEL] = NEW_OUTFIT }, [NEW_VOCATION_ID] = { [NEW_LEVEL] = NEW_OUTFIT, [NEW_LEVEL] = NEW_OUTFIT } } Abraços.
  22. if talkState[talkUser] == 3 then local password = tonumber(msg) or "" if password == "" then selfSay("Digite uma senha numérica válida.", cid) return true end local item = doCreateItemEx(2475, 1) doItemSetAttribute(item, "_password", password) doPlayerAddItemEx(cid, item) selfSay("Aqui está seu novo cartão.", cid) return true end
  23. Oneshot

    (Duvida) OtClient

    Vocês complicaram demais, uma coisa que era para ser deveras simples. Abra seu arquivo client.lua em modules/client e procure por isso: function Client.startup() -- Play startup music (The Silver Tree, by Mattias Westlund) g_sounds.playMusic(musicFilename, 3) connect(g_game, { onGameStart = function() g_sounds.stopMusic(3) end }) connect(g_game, { onGameEnd = function() g_sounds.playMusic(musicFilename, 3) end }) -- Check for startup errors local errtitle = nil local errmsg = nil if g_graphics.getRenderer():lower():match('gdi generic') then errtitle = tr('Graphics card driver not detected') errmsg = tr('No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance.') end -- Show entergame if errmsg or errtitle then local msgbox = displayErrorBox(errtitle, errmsg) msgbox.onOk = function() EnterGame.firstShow() end else EnterGame.firstShow() end end Antes do último end, coloque isso: EnterGame.setUniqueServer("127.0.0.1", 7171, 860) Ficando assim: function Client.startup() -- Play startup music (The Silver Tree, by Mattias Westlund) g_sounds.playMusic(musicFilename, 3) connect(g_game, { onGameStart = function() g_sounds.stopMusic(3) end }) connect(g_game, { onGameEnd = function() g_sounds.playMusic(musicFilename, 3) end }) -- Check for startup errors local errtitle = nil local errmsg = nil if g_graphics.getRenderer():lower():match('gdi generic') then errtitle = tr('Graphics card driver not detected') errmsg = tr('No graphics card detected, everything will be drawn using the CPU,\nthus the performance will be really bad.\nPlease update your graphics driver to have a better performance.') end -- Show entergame if errmsg or errtitle then local msgbox = displayErrorBox(errtitle, errmsg) msgbox.onOk = function() EnterGame.firstShow() end else EnterGame.firstShow() end EnterGame.setUniqueServer("127.0.0.1", 7171, 860) end Os três parâmetros são: EnterGame.setUniqueServer(IP, Port, Protocol) Abraços.
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...