-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
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
-
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
-
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.
-
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.
-
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
-
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.
-
dúvida Como criar novos itens 8.60 com a mesma Sprite mais com ids difente?
tópico respondeu ao ravely13 de Oneshot em Lixeira Pública
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/ -
pedido [Encerrado] ajuda para otserv...
tópico respondeu ao mussu369 de Oneshot em Tópicos Sem Resposta
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. -
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.
-
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.
-
Tópico movido para a seção de dúvidas e pedidos resolvidos.
-
Não, meu velho, você não executou. Pois o erro simplesmente é sobre a não-existência da coluna points.
-
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.
-
Você tem que executar a query para criar a coluna points na tabela players ALTER TABLE `players` ADD `points` INT NOT NULL DEFAULT 0;
-
Não. Fiz assim, testei assim e funcionou assim. Se quiser fazer suas próprias modificações, a vontade, amigão. Abraços.
-
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.
-
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.
-
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.
-
É 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.
-
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.
-
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.
-
Vou ficar com o #6
-
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
-
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.