-
Total de itens
1347 -
Registro em
-
Última visita
-
Dias Ganhos
36
Tudo que Oneshot postou
-
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?
-
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.
-
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,
-
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.
-
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
-
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.
-
Você está dando /reload spells antes de testar, né?
-
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
-
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
-
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.
-
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
-
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.
-
É 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.
-
É 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.
-
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
-
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.
-
[Talkaction] Vipsistem Por Item N Por Gold
tópico respondeu ao gmacc023 de Oneshot em Lixeira Pública
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 -
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
-
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.
-
É 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!
-
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,
-
pc98, Bom, responderei a dúvida sobre as duas funções, Praticamente elas fazem a mesma coisa, são relacionadas com o combate em si, mas uma é um evento que ocorrerá quando você ATACAR uma criatura (onAttack) e a outra, é um evento que ocorrerá quando você INICIAR UM COMBATE com uma criatura, tornar-la um alvo (onCombat). Para o script, eu recomendo a função onCombat, de forma que você nem possa tornar a criatura um alvo, de forma que o script ficaria assim. function onCombat(cid, target) if (isPlayer(cid) and isPlayer(target)) then if (getPlayerVocation(cid) ~= getPlayerVocation(target)) then doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUMAYNOTATTACKTHISPLAYER) return false end end return true end Lembre-se de registrar uma tag no arquivo XML creaturescripts. <event type="combat" name="vocationCombat" event="script" value="o nome do arquivo.lua"/> E registrar o evento no arquivo LUA login (creaturescripts/scripts) registerCreatureEvent(cid, "vocationCombat") Teste e reporte no tópico o funcionamento, Abraços,
-
Igorinowz, Então, cara, Você se certificou de colocar a tag desse item no seu arquivo XML movements que se encontra em data/movements? Se não, coloque o que vou passar abaixo, antes de </movements>. <movevent type="Equip" itemid="6095" slot="armor" event="function" value="onEquipItem"/> <movevent type="DeEquip" itemid="6095" slot="armor" event="function" value="onDeEquipItem"/> Até mais,
-
kilat, Haha! Se não fosse pelo meu erro, teria funcionado também, Agora, vejamos se entendi, você quer uma verificação se o jogador aprendeu a magia para poder invocar-la? No caso seria com a função getPlayerLearnedInstantSpell(cid, name), ele retorna um valor booleano [verdadeiro = o jogador aprendeu a magia, falso = o contrário]. Vou usar o script do Vodkart, que está menos propenso a erros. local combat1 = createCombatObject() setCombatParam(combat1, COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) setCombatParam(combat1, COMBAT_PARAM_EFFECT, CONST_ME_BIGCLOUDS) setCombatFormula(combat1, COMBAT_FORMULA_LEVELMAGIC, -1.3, -30, -1.6, 0) local combat2 = createCombatObject() setCombatParam(combat2, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat2, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatFormula(combat2, COMBAT_FORMULA_LEVELMAGIC, -1.6, -50, -1.8, 0) local area1 = createCombatArea(AREA_CROSS5X5) setCombatArea(combat1, area1) local area2 = createCombatArea(AREA_CROSS5X5) setCombatArea(combat2, area2) function onCastSpell(cid, var) if (isPremium(cid) == TRUE and getPlayerVocation(cid) == 9) then return doCombat(cid, combat2, var) elseif (getPlayerLearnedSpell(cid, "Rage of the Skies")) then return doCombat(cid, combat1, var) else doPlayerSendCancel(cid, "You can\'t use this spell") end end Até mais,
-
Zuth kimu, O NPC não aceita, bem, moeda ou item. Ele só verifica se o jogador pode pagar os preços com uma função, veja abaixo: if pay(cid, 20000) then e if pay(cid, 7000) then Se o jogador pagar esse valor, o NPC irá prosseguir com a programação da rotina, do contrário irá mandar uma mensagem de que o jogador não possui dinheiro. Se você quiser mudar isso para remover itens do jogador, você pode fazer com essa função lógica: if doPlayerRemoveItem(cid, ID DO ITEM, QUANTIDADE) then Se você quiser registrar um novo tipo de moeda, poderá ir ao arquivo XML items e no item, adicionar essa chave: <attribute key="worth" value="VALOR DA MOEDA" /> Lembrando que o VALOR DA MOEDA se refere a uma só moeda, por exemplo, o valor de uma crystal coin é 10000 Até mais,
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.