Ir para conteúdo

Oneshot

Marquês
  • Total de itens

    1347
  • Registro em

  • Última visita

  • Dias Ganhos

    36

Tudo que Oneshot postou

  1. Só tinha um errinho ^^ local config = { exhaust = 10, -- tempo sem segundos que ficara em exaust storage = 13896, manapercent = 75, -- mana em porcentagem que ira retirar } local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, 52) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -5.5, -32, -2.9, -400) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, 52) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -5.5, -32, -2.9, -400) arr1 = { {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 2, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0}, } arr2 = { {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 3, 0, 0, 0}, } local area1 = createCombatArea(arr1) local area2 = createCombatArea(arr2) setCombatArea(combat1, area1) setCombatArea(combat2, area2) local function spell(parameters) doCombat(parameters.cid, parameters.combat2, parameters.var) end function onCastSpell(cid, var) if (getPlayerStorageValue(cid, config.storage) <= os.time()) then if getPlayerMana(cid) >= ((config.manapercent/100)*getCreatureMaxMana(cid)) then doPlayerAddMana(cid, -((config.manapercent/100)*getCreatureMaxMana(cid))) setPlayerStorageValue(cid, config.storage, os.time()+config.exhaust) local parameters = { cid = cid, var = var, combat2 = combat2 } addEvent(spell, 500, parameters) return doCombat(cid, combat1, var) else doPlayerSendCancel(cid, "você nao tem mana o suficiente.") end else doPlayerSendCancel(cid, "Você precisa aguardar "..config.exhaust.." segundos para acumular o espírito.") end return TRUE end
  2. - Crie um arquivo de extensão LUA com o nome de itemTeleport na pasta data/actions/scripts. Cole este conteúdo: local config = { teleportTo = {x=100, y=100, z=7}, --[[Coordenadas de Destino]] failChance = 10 --[[Chance em porcentagem do item não teleportar]] } function onUse(cid, item, fromPosition, itemEx, toPosition) if(math.random(1, 100) > config.failChance) then doTeleportThing(cid, config.teleportTo) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você foi teletransportado com sucesso!") doRemoveItem(item.uid, 1) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "O item falhou e quebrou!") doRemoveItem(item.uid, 1) end return true end - Abra seu arquivo XML actions e cole esta tag, <action itemid="" event="script" value="itemTeleport.lua"/> O campo itemid pode ser editado para o ID do item responsável pela ação de teleportar.
  3. Por que não usar uma única linha de tabela para simbolizar essas linhas de configuração aqui? -- item necessário para fazer a busca local i_required = 2268 -- contagem de item necessário para fazer a busca local i_required_count = 1 -- recompensa padrão id item (crystal coins) local i_reward = 2160 -- contagem de recompensa id padrão (10) local i_reward_count = 10 Podendo ficar assim: local item = {required = {2268, 1}, reward = {2160, 10}} De modo que na hora que o NPC faz a verificação, podemos usar, if(doPlayerRemoveItem(cid, item.required[1], item.required[2])) then doPlayerAddItem(cid, item.reward[1], item.reward[2]) end Economiza algumas linhas, haha! Bom script
  4. Ah, entendo como funciona, Você quer que quando de use em um item, permita ao usuário usar uma talkaction, Isso pode ser feito de modo que na action adicione uma storage ao player, assim o jogador poderá usar a talkaction com uma verificação de valor de storage. Poderei fazer, mas daqui um tempinho,
  5. Oneshot

    Mover Monstros

    Vamos reunir algumas explicações, aí poderei te ajudar, - Não tem nenhum monstro, você dá use no itemID 2550, e clica em um lugar e um monstro é sumonado naquele lugar? Caso tenha um jogador naquele lugar, ele mudará de outfit?
  6. Oneshot

    Arrumar Este Script

    Fiz um sistema bem versátil, onde você pode adicionar um pet para cada vocação, Segue o script abaixo, local config = { exhaustTime = 20, --[[exhaustTime em segundos]] exhaustStorage = 3278 --[[storage do Exhaust]] } local pet = { [{2, 6}] = {monsterName="Dragon Hatchling", evolutionName="Dragon", superEvolutionName="Dragon Lord", evolutionTime=10, superEvolutionTime=15, maxSummons=1} } function onUse(cid, item, fromPosition, itemEx, toPosition) if(getPlayerStorageValue(cid, config.exhaustStorage) <= os.time()) then for i, v in pairs(pet) do if(isInArray(i, getPlayerVocation(cid))) then if(table.maxn(getCreatureSummons(cid)) < v.maxSummons) then local mid = doCreateMonster(v.monsterName, getThingPosition(cid)) doConvinceCreature(cid, mid) doRemoveItem(item.uid, 1) setPlayerStorageValue(cid, config.exhaustStorage, os.time()+config.exhaustTime) addEvent(onPetEvolution, v.evolutionTime*1000, cid, mid) else doPlayerSendCancel(cid, "You can\'t summon more pets") end else doPlayerSendCancel(cid, "You don\'t have a vocation to summon pets") end end else doPlayerSendCancel(cid, "You are exhausted.") end return true end function onPetEvolution(cid, mid) doRemoveCreature(mid) for i, v in pairs(pet) do if(isInArray(i, getPlayerVocation(cid))) then local evo = doCreateMonster(v.evolutionName, getThingPosition(cid)) doConvinceCreature(cid, evo) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your pet has evolved") addEvent(onPetSuperEvolution, v.superEvolutionTime*1000, cid, evo) end end end function onPetSuperEvolution(cid, evo) doRemoveCreature(evo) for i, v in pairs(pet) do if(isInArray(i, getPlayerVocation(cid))) then local evo2 = doCreateMonster(v.superEvolutionName, getThingPosition(cid)) doConvinceCreature(cid, evo2) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Your pet has super evolved") end end end Para adicionar pets, você deve adicionar linhas nessa tabela, local pet = { [{2, 6}] = {monsterName="Dragon Hatchling", evolutionName="Dragon", superEvolutionName="Dragon Lord", evolutionTime=10, superEvolutionTime=15, maxSummons=1} } Por exemplo, a tabela poderá ficar assim, se você quiser adicionar um pet para Sorcerers. local pet = { [{2, 6}] = {monsterName="Dragon Hatchling", evolutionName="Dragon", superEvolutionName="Dragon Lord", evolutionTime=10, superEvolutionTime=15, maxSummons=1}, [{1, 5}] = {monsterName="Fire Elemental", evolutionName="Massive Fire Elemental", superEvolutionName="Fire Overlord", evolutionTime=150, superEvolutionTime=500, maxSummons=1} } Lembre-se que cada linha tem que ter uma VÍRGULA no final, com exceção da última linha, E não esqueça de deixar o monstro convencível no arquivo dele! Veja se funciona, pois eu testei e funcionou.
  7. Ops, falha minha, Teste com o script que vou passar abaixo, lembrando que essa Action deve ser atribuída ao ID 2160. function onUse(cid, item, frompos, item2, topos) if (doRemoveItem(item.uid, 100)) then doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have changed 100 crystal coins to 1 ruby coin") doPlayerAddItem(cid, 13685, 1) else doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have changed 1 crystal coin to 100 platinum coin") doPlayerAddItem(cid, 2152, 100) end return true end Abraços,
  8. A função doItemSetAttribute(uid, attr, value), presente nos servidores com base no The Forgotten Server, não é capaz de editar esse tipo de atributo no item. Então acho que é impossível mudar a resistência elemental de um item com uma Action.
  9. Oneshot

    Arrumar Este Script

    Certo, a primeira coisa que você deve fazer, é abrir o arquivo da criatura Dragon e mudar isso aqui: <flag convinceable="0"/> Para isso aqui: <flag convinceable="1"/> Pois a criatura em si não é "convencível" por natureza, você terá que "forçar" isso. Agora sobre um script, eu poderei arrumar-lo, criar uma versão mais atualizada. Basta algum tempo, Abraços
  10. Muito estranho, rapaz. Acabei de abrir um servidor de testes para ver seu script e ele está funcionando perfeitamente. Um "heal" diferente para cada vocação.
  11. Você está dando /reload spells antes de testar, né?
  12. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat1, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat1, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat1, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos Sorcerers]] function onGetFormulaValues1(cid, level, maglevel) local min = 100 local max = 101 return min, max end setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues1") local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat2, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat2, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat2, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos druids]] function onGetFormulaValues2(cid, level, maglevel) local min = ((level*1)+(maglevel*6)) local max = ((level*1)+(maglevel*7)) return min, max end setCombatCallback(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues2") local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat3, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat3, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat3, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos paladins]] function onGetFormulaValues3(cid, level, maglevel) local min = ((level*10)+(maglevel*(25/10))) local max = ((level*10)+(maglevel*3)) return min, max end setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues3") local combat4 = createCombatObject() setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat4, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat4, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat4, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat4, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos knights]] function onGetFormulaValues4(cid, level, maglevel) local min = ((level*5)+(maglevel*40)) local max = ((level*5)+(maglevel*50)) return min, max end setCombatCallback(combat4, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues4") function onCastSpell(cid, var) if isInArray({1, 5}, getPlayerVocation(cid)) then doCombat(cid, combat1, var) elseif isInArray({2, 6}, getPlayerVocation(cid)) then doCombat(cid, combat2, var) elseif isInArray({3, 7}, getPlayerVocation(cid)) then doCombat(cid, combat3, var) elseif isInArray({4, 8}, getPlayerVocation(cid)) then doCombat(cid, combat4, var) end return true end
  13. Isso porque você criou as funções que retornam dano com o mesmo nome, todas elas. Tente criar essa função com um número na frente, igual você faz com as variáveis de combate, Veja o script abaixo que eu consertei e tente entender, local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat1, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat1, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat1, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos Sorcerers]] function onGetFormulaValues1(cid, level, maglevel) local min = 100 local max = 101 return min, max end setCombatCallback(combat1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues1") local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat2, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat2, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat2, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos druids]] function onGetFormulaValues2(cid, level, maglevel) local min = ((level*1)+(maglevel*6)) local max = ((level*1)+(maglevel*7)) return min, max end setCombatCallback(combat2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues2") local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat3, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat3, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat3, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos paladins]] function onGetFormulaValues3(cid, level, maglevel) local min = ((level*10)+(maglevel*(25/10))) local max = ((level*10)+(maglevel*3)) return min, max end setCombatCallback(combat3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues3") local combat4 = createCombatObject() setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat4, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat4, COMBAT_PARAM_AGGRESSIVE, FALSE) setCombatParam(combat4, COMBAT_PARAM_TARGETCASTERORTOPMOST, TRUE) setCombatParam(combat4, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) --[[Fórmula dos knights]] function onGetFormulaValues4(cid, level, maglevel) local min = ((level*5)+(maglevel*40)) local max = ((level*5)+(maglevel*50)) return min, max end setCombatCallback(combat4, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues4") function onCastSpell(cid, var) if isInArray({1, 5}, getPlayerVocation(cid)) then return doCombat(cid, combat1, var) elseif isInArray({2, 6}, getPlayerVocation(cid)) then return doCombat(cid, combat2, var) elseif isInArray({3, 7}, getPlayerVocation(cid)) then return doCombat(cid, combat3, var) elseif isInArray({4, 8}, getPlayerVocation(cid)) then return doCombat(cid, combat4, var) end end Teste e reporte no tópico o funcionamento ;D
  14. Você cometeu um erro na primeira magia, Você não precisa usar a função onTargetTile e as variáveis acombat (1, 2 e etc...), pois pelo que percebi você está usando um efeito normal e não um efeito de animação. Então o script ficaria assim: local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -4.0, -57, -1.0, -160) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -6.0, -57, -1.0, -100) local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, -6.0, -57, -1.0, -100) local combat4 = createCombatObject() setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat4, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combat4, COMBAT_FORMULA_LEVELMAGIC, -6.0, -57, -1.0, -100) local combat5 = createCombatObject() setCombatParam(combat5, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat5, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combat5, COMBAT_FORMULA_LEVELMAGIC, -6.0, -57, -1.0, -100) local combat6 = createCombatObject() setCombatParam(combat6, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combat6, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combat6, COMBAT_FORMULA_LEVELMAGIC, -6.0, -57, -1.0, -100) arr1 = { {1, 0, 0}, {0, 2, 0}, {0, 0, 0}, } arr2 = { {0, 1, 0}, {0, 2, 0}, {0, 0, 0}, } arr3 = { {0, 0, 1}, {0, 2, 0}, {0, 0, 0}, } arr4 = { {0, 0, 1}, {0, 2, 0}, {0, 0, 0}, } arr5 = { {0, 1, 0}, {0, 2, 0}, {0, 0, 0}, } arr6 = { {1, 0, 0}, {0, 2, 0}, {0, 0, 0}, } local area1 = createCombatArea(arr1) local area2 = createCombatArea(arr2) local area3 = createCombatArea(arr3) local area4 = createCombatArea(arr4) local area5 = createCombatArea(arr5) local area6 = createCombatArea(arr6) setCombatArea(combat1, area1) setCombatArea(combat2, area2) setCombatArea(combat3, area3) setCombatArea(combat4, area4) setCombatArea(combat5, area5) setCombatArea(combat6, area6) local function onCastSpell1(parameters) doCombat(parameters.cid, combat1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, combat2, parameters.var) end local function onCastSpell3(parameters) doCombat(parameters.cid, combat3, parameters.var) end local function onCastSpell4(parameters) doCombat(parameters.cid, combat4, parameters.var) end local function onCastSpell5(parameters) doCombat(parameters.cid, combat5, parameters.var) end local function onCastSpell6(parameters) doCombat(parameters.cid, combat6, parameters.var) end function onCastSpell(cid, var) local parameters = { cid = cid, var = var} addEvent(onCastSpell1, 100, parameters) addEvent(onCastSpell2, 250, parameters) addEvent(onCastSpell3, 400, parameters) addEvent(onCastSpell4, 550, parameters) addEvent(onCastSpell5, 700, parameters) addEvent(onCastSpell6, 850, parameters) return TRUE end Verei como fazer os dois próximos scripts, se encontrar uma maneira, te contactarei.
  15. Cara, não dá para saber o que são esses "pontinhos muito loucos" (imagem péssima), Os efeitos que o FoxWorld deve ter, são efeitos que a equipe desse servidor colocou através da edição de cliente, Então, é impossível fazer um script com efeitos desse servidor, Vou rever o script acima e testar em algum servidor de versão 840
  16. Vamos juntar fatos, Fica claro que os efeitos do Foxworld são diferentes dos efeitos do Tibia. Só criar um loop infinito, que provavelmente vai dar crash no servidor, haha. Logo, o script dessa tal Gema Espiritual ficaria assim, local efeito = { [1, 5] = CONST_ME_FIREAREA, [2, 6] = CONST_ME_POISONAREA, [3, 7] = CONST_ME_HOLYAREA, [4, 8] = CONST_ME_HITAREA } function onUse(cid, item, fromPosition, itemEx, toPosition) local i = 1 if isPlayer(cid) then while i == 1 doSendMagicEffect(getThingPosition(cid), efeito[getPlayerVocation(cid)]) end doRemoveItem(item.uid, 1) end return true end Basta criar um arquivo LUA com o nome que você preferir, na pasta actions/scripts, e colar o conteúdo acima. Depois abrir o arquivo XML actions e adicionar a tag abaixo: <action itemid="ID DO ITEM" event="script" value="nome do arquivo.lua"/> Teste e reporte no tópico o funcionamento, Obs: O efeito não irá parar mesmo . Abraços.
  17. É bem fácil fazer um NPC que só atenda se o jogador tiver tal outfit e addons. Você pode usar as duas funções: canPlayerWearOutfit(cid, looktype[, addon = 0]) ou canPlayerWearOutfitId(cid, outfit[, addon = 0]) O script do seu NPC ficaria mais ou menos assim: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function greetCallback(cid) local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid if getPlayerSex(cid) == 1 then if canPlayerWearOutfitId(cid, 268, 2) then npcHandler:setMessage(MESSAGE_GREET, "Hello Nightmare Master! I want {help} from you!") talkState[talkUser] = 1 else npcHandler:setMessage(MESSAGE_GREET, "I don\'t talk with stranges") npcHandler:releaseFocus(cid) end end return true end function msgCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid end npcHandler:setCallback(CALLBACK_GREET, greetCallback) npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Este exemplo simples acima de NPC, faz com que ele só responda ao "Hi" e "Hello" de forma positiva, se o jogador for do sexo Masculino e tiver outfit 268 com 2 addons, no caso o NPC iria responder, "Hello Nightmare Master! I want {help} from you!". Lembrando que é se o jogador tiver a outfit, não se o jogador está vestido com a outfit. Se o jogador não ser do sexo Masculino e não tiver a outfit, o NPC vai responder "I don't talk with stranges". Abraços.
  18. É algo simples de se fazer, é necessário apenas criar 4 váriaveis de combate, 1 para cada vocação. O script da 'ultimate healing rune' ficaria assim: local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat1, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat1, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat1, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) setHealingFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 10, 12) --[[Fórmula dos Sorcerers]] local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat2, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat2, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat2, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) setHealingFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 10, 12) --[[Fórmula dos Druids]] local combat3 = createCombatObject() setCombatParam(combat3, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat3, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat3, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat3, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat3, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) setHealingFormula(combat3, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 10, 12) --[[Fórmula dos Paladins]] local combat4 = createCombatObject() setCombatParam(combat4, COMBAT_PARAM_TYPE, COMBAT_HEALING) setCombatParam(combat4, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat4, COMBAT_PARAM_AGGRESSIVE, false) setCombatParam(combat4, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat4, COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) setHealingFormula(combat4, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 10, 12) --[[Fórmula dos Knights]] function onCastSpell(cid, var) if isInArray({1, 5}, getPlayerVocation(cid)) then return doCombat(cid, combat1, var) elseif isInArray({2, 6}, getPlayerVocation(cid)) then return doCombat(cid, combat2, var) elseif isInArray({3, 7}, getPlayerVocation(cid)) then return doCombat(cid, combat3, var) elseif isInArray({4, 8}, getPlayerVocation(cid)) then return doCombat(cid, combat4, var) end end É só modificar as fórmulas a seu gosto Abraços.
  19. SoulFamily, Nesse caso, você deveria abrir o script que faz a função desse item, que provavelmente está em Actions. E fazer uma função verificadora para vocações VIPs, baseando-se no Tibia, seriam quatro vocações e a função verificadora ficaria assim: if isInArray({9, 10, 11, 12}, getPlayerVocation(cid)) then bloco true else bloco false end O bloco true fará a função do item e o bloco false fará, exemplo, uma mensagem de erro ("Você não é VIP para usar esse item") Abraços
  20. SoulFamily, Acho que o modo mais simples mesmo, seria bloquear o uso de itens VIP para vocações não-VIP. Isso é feito dentro de dois arquivos XML: weapons e movements. O primeiro para armamentos em geral, o segundo para equipamentos. Ao abrir o primeiro arquivo, você irá deverá localizar estes tipos de tags nele, <melee id="ID DO ITEM" level="LEVEL REQUERIDO" unproperly="1" event="function" value="default"/> Para fazer com que apenas certas vocações usem o item, você deverá usar o tipo de tag abaixo, <melee id="ID DO ITEM" level="LEVEL REQUERIDO" unproperly="1" event="function" value="default"> <vocation id="ID DA VOCATION"/> </melee>] ID DO ITEM - ID do armamento VIP LEVEL REQUERIDO - Se houver, Level necessário para usar o item, ID DA VOCATION - Vocação que pode usar o item, você pode criar 'n' linhas para 'n' vocações. Agora vejamos o segundo arquivo, onde você encontrará tags que nem essas abaixo, <movevent type="Equip" itemid="ID DO ITEM" slot="SLOT" level="LEVEL" event="function" value="onEquipItem"/> Para restringir o uso a certas vocações, basta fazer tags parecidas com essas, <movevent type="Equip" itemid="ID DO ITEM" slot="SLOT" level="LEVEL" event="function" value="onEquipItem"> <vocation id="ID DA VOCATION"/> </moveevent> ID DO ITEM - ID do equipamento VIP. SLOT - O slot onde o item é equipado, se é uma armadura, o slot é 'armor' e assim por diante. Veja abaixo os slots: LEVEL - Level requerido para equipar o item, 0 se não for necessário. ID DA VOCATION - Vocação que pode usar o item, você pode criar 'n' linhas para 'n' vocações. Acho que é só isso, Abraços.
  21. RdeoN Só substituir seu sistema VIP por este: -- Script SYtem vip 1.0 -- function onSay(cid, words, param) if(words == "!buyvip") then if doPlayerRemoveItem(cid, 5809) == TRUE then local days = 10 local daysvalue = days * 24 * 60 * 60 local storageplayer = getPlayerStorageValue(cid, 13540) local timenow = os.time() if getPlayerStorageValue(cid, 13540) - os.time() <= 0 then time = timenow + daysvalue else time = storageplayer + daysvalue end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Foram adicionados ".. days .." dias de VIP no seu character.") setPlayerStorageValue(cid, 13540, time) local quantity = math.floor((getPlayerStorageValue(cid, 13540) - timenow)/(24 * 60 * 60)) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você tem ".. quantity .." dias de VIP restantes.") else doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você precisa de "..price.." gp's para colocar vip.") end elseif(words == "!vipdays") then local timenow = os.time() local quantity = math.floor((getPlayerStorageValue(cid, 13540) - timenow)/(24 * 60 * 60)) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você tem ".. (quantity < 0 and 0 or quantity) .." dias de VIP no seu character.") elseif(words == "/checkvip") then if getPlayerAccess(cid) == 5 then if not param then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.") end local player = getPlayerByName(param) if not isPlayer(player) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player "..player.." not found.") end local timenow = os.time() local quantity = math.floor((getPlayerStorageValue(player, 13540) - timenow)/(24 * 60 * 60)) doPlayerPopupFYI(cid, "O jogador tem ".. (quantity < 0 and 0 or quantity) .." dias de VIP no character.") return TRUE end elseif(words == "/addvip") then if getPlayerAccess(cid) == 5 then local t = string.explode(param, ",") if not t[2] then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Invalid param specified.") end local player = getPlayerByName(t[1]) local days = t[2] if not isPlayer(player) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Player "..player.." not found.") end local daysvalue = days*3600*24 local storageplayer = getPlayerStorageValue(player, 13540) local timenow = os.time() local time = storageplayer <= 0 and (timenow + daysvalue) or (storageplayer + daysvalue) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Foram adicionados "..days.." dias de VIP no seu character.") setPlayerStorageValue(player, 13540, time) local quantity = math.floor((getPlayerStorageValue(player,13540) - timenow)/(3600*24)) doPlayerSendTextMessage(player, MESSAGE_INFO_DESCR, "Você tem "..quantity.." dias de VIP restantes.") end elseif(words == "/delvip") then if getPlayerAccess(cid) == 5 then local dec = MESSAGE_INFO_DESCR if(param == "") then return TRUE,doPlayerSendTextMessage(cid,18,"Command param required.")end local C,t = {},string.explode(param, ",") C.pos = getPlayerPosition(cid) C.uid = getCreatureByName(t[1]) C.time = ((tonumber(t[2]) == nil) and 1 or tonumber(t[2]))*3600*24 --Tempo da vip por dia. C.days = (tonumber(t[2]) == nil) and 1 or tonumber(t[2]) --Dias de vip. if(getPlayerStorageValue(C.uid,13540) < C.time)then doPlayerSendTextMessage(cid,dec,'O jogador '..t[1]..' não possui '..C.days..' dias de vip.') else doPlayerSendTextMessage(cid,dec,'Você removeu '..C.days..' dias de vip do player '..t[1]..'.') setPlayerStorageValue(C.uid,13540,getPlayerStorageValue(C.uid,13540)-C.time) end doSendMagicEffect(C.pos, math.random(28,30)) end end return TRUE end Abraços
  22. Zuth kimu, Bom, você deverá adicionar a função que faz isso no script da Crystal Coin, Então o script ficaria mais ou menos assim: function onUse(cid, item, frompos, item2, topos) if (getPlayerItemCount(cid, 2160) == 100) then doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have changed 100 crystal coins to 1 ruby coin") doPlayerRemoveItem(cid, 2160, 100) doPlayerAddItem(cid, 13685, 1) else doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have changed 1 crystal coin to 100 platinum coin") doPlayerRemoveItem(cid, 2160, 1) doPlayerAddItem(cid, 2152, 1) end return TRUE end Teste e reporte no tópico o funcionamento. Abraços
  23. GodBz Ops, falha minha, O script se localiza na pasta data/creaturescripts/scripts. Não sei o nome, mas ele normalmente vem como pvparena.lua.
  24. É um script bem básico, O funcionamento dessa alavanca destrói com o RPG de um servidor, por isso, é mais recomendando para servidores de rates altas e para diversão dos jogadores e, também, para substituir o chato diálogo do NPC por algo mais rápido e versátil. Obrigado por compartilhar o conteúdo com a comunidade!
  25. Oneshot

    Dúvida Sobre Spell!

    kilat, Imagine assim, Cada personagem do jogo tem um creatureID distinto e a cada creatureID são atribuídos variáveis de memória que podem assumir qualquer valor ao longo do tempo, seja booleano, analógico ou uma string. São, se não me engano, 65535 variáveis de memória. Essas são as chamadas storages. Teoricamente elas ficam na personagem, mas acho que não dá para fazer algo com elas em websites, Você só pode "setar" os valores das storages com setPlayerStorageValue(cid, storage, value) e pegar os valores das storages com getPlayerStorageValue(cid, storage) Abraços,
  • Quem Está Navegando   0 membros estão online

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