-
Total de itens
26 -
Registro em
-
Última visita
Tudo que brainless postou
-
http://www.xtibia.com/forum/lofiversion/in...hp/t104419.html os comandos doPlayerAddItem e doPlayerRemoveItem continuam iguais
-
sinceramente? só bati o olho no seu script, nem analisei muito a dica que eu tenho é a seguinte: assumindo que vc já definiu no mapEditor todos os actionId dos tiles e eles são 1234561, 1234562, 1234563, 1234564, 1234565, 1234566, 1234567, 1234568 agora vc vai no arquivo data\movements\movements.xml e adiciona: <movement event="stepIn" actionid="123456X" script="poi.lua" /> onde X = terminação do tile, ao final, vc terá que ter 8 novos movements, todos apontando para o arquivo poi.lua vamos ao que interessa data\movements\scripts\poi.lua local vars = {"Verminor","Infernatil","Tafariel","Apocalypse","Pumim","Bazir","Ashfalor"} function onStepIn(cid, item, pos) if (not isPlayer(cid)) then return FALSE end for i=1,7 do if item.actionid == 123456..i then if getPlayerStorageValue(cid,123456..i) == -1 then setPlayerStorageValue(cid,123456..i,1) doPlayerSendTextMessage(cid,MESSAGE_EVENT_ADVANCE,'You have touched '..var[i]..'\'s throne and absorbed some of his spirit.') else doPlayerSendTextMessage(cid,MESSAGE_EVENT_ADVANCE,'You have already absorbed some '..vars[i]..'\'s spirit.') end end end if item.actionid == 1234568 then local spirits = 0 for i=1,7 do spirits = spirits + getPlayerStorageValue(cid,123456..i) end if spirits == 7 then doPlayerSendTextMessage(cid,MESSAGE_EVENT_ADVANCE,'You\'ve absorbed enough energy! You may pass.') else doTransformItem(item.uid,item.itemid+1) doPlayerSendTextMessage(cid,MESSAGE_EVENT_ADVANCE,'Sorry, but you did not absorb enough energy!') end end end cara, viciei em loops, fica muito mais fácil pra corrigir, arruma-se uma vez e arruma-se para todas revisei o script umas 5 vezes sem exagero, mas como não foi testado, não está livre de erros qualquer coisa, copie as mensagens de erro do console ou, como estou trabalhando com loopings, se o erro ficar se repetindo, faça um PrintScreen do console ok?
-
se não me engano, a partir da versão 8.1 (voltei a acompanhar otServers esse ano), os NPC's começaram a trabalhar em módulos. não digo que o seu está errado, mas dessa maneira está mais fácil e prática de configurar. dispensa a criação de códigos vazios (onPlayerChangeOutfit() end) e o script fica mais limpo e fácil de encontrar erros. exemplo disso foi o aviso que o PsyMagic deu... abri o script, troquei UM valor e fim... está funcionando não é npc novo.. o funcionamento é o mesmo, as falas são as mesmas apenas o script foi modificado para uma melhor execução, edição e um melhor trabalho em cima do mesmo mas é uma questão de preferência né... obrigado por testar... como disse, não consigo criar itens começados em 2 pelo /i (/i 2121 1) dá aquela janelinha que não posso passar o nº da minha acc.... o erro, ja aviso aqui que foi meu, é simples... basta trocar if doPlayerTakeItem(cid, exchange.takeId, exchange.takeCount) > 0 then por if doPlayerTakeItem(cid, exchange.takeId, exchange.takeCount) == LUA_NO_ERROR then
-
tenta o meuuu o/ =P local phrases = { "Hello, |PLAYERNAME|! It's a pretty sunny day, no?", "How rude!", "Wait! I'm talking.", "Farewell, |PLAYERNAME|...", noGold="Sorry, you don't have enough gold.", noItem="Sorry, you don't have the item.", tradeOk="It's done.", no="Changed your mind, uh?!", trade={"Do you want to trade","by","at cost of","gps?"} } local exchanges = { {takeId=6530, takeCount=1, giveId=2640, giveCount=1, cost=10000, keywords={'soft boots'}} {takeId=5944, takeCount=1, giveId=6529, giveCount=10, cost=5000, keywords={'infernal bolts'}} } local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) 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 local setMessages = {1,16,22,2} for i = 1,4 do npcHandler:setMessage(setMessages[i],phrases[i]) local function itemExchange(cid, message, keywords, parameters, node) local exchange = exchanges[parameters.action] if (not npcHandler:isFocused(cid)) then return false end if (doPlayerTakeItem(cid, exchange.takeId, exchange.takeCount) > 0) then if (doPlayerRemoveMoney(cid, exchange.cost)) > 0) then doPlayerAddItem(cid, exchange.giveItem, exchange.giveCount) npcHandler:say(phrases.tradeOk,cid) else npcHandler:say(phrases.noGold,cid) end else npcHandler:say(phrases.noItem,cid) end keywordHandler:moveUp(1) return TRUE end for i = 1, #exchanges do local exchange = exchanges[i] for a = 1, #exchange.keywords do local say = phrases.trade say = say[1]..' '..getItemName(exchange.takeId)..' '..say[2]..' '..getItemName(exchange.giveId)..' '..say[3]..' '..exchange.cost..' '..say[4] local node=keywordHandler:addKeyword({exchange.keywords[a]}, StdModule.say, {npcHandler=npcHandler, onlyFocus=true, text=say}) node:addChildKeyword({'yes'}, itemExchange, {action = i}) node:addChildKeyword({'no'}, StdModule.say, {npcHandler=npcHandler, onlyFocus=true, moveup=1, text=phrases.no}) end end npcHandler:addModule(FocusModule:new())
-
o spawn no banco SQL é definido pela coluna TOWN_ID que deve ser equivalente à cidade que vc configurou no map editor....
-
espero que ajude local exchanges = { {takeId = 2487, takeCount = 1, giveId = 5887, giveCount = 1, keywords = {'crown armor','piece of royal steel'}}, {takeId = 2195, takeCount = 1, giveId = 5891, giveCount = 1, keywords = {'boh','enchanted chicken wings'}}, {takeId = 2498, takeCount = 2, giveId = 5884, giveCount = 1, keywords = {'fighting spirit','royal helmet'}}, {takeId = 2475, takeCount = 4, giveId = 5885, giveCount = 1, keywords = {'warriors sweat','warrior helmet'}}, {takeId = 5879, takeCount = 10, giveId = 5886, giveCount = 1, keywords = {'spool of yarn','giant spider silk'}}, {takeId = 2393, takeCount = 1, giveId = 5892, giveCount = 1, keywords = {'crude iron','giant sword'}}, {takeId = 2462, takeCount = 1, giveId = 5888, giveCount = 1, keywords = {'devil helmet','piece of hell steel'}}, {takeId = 2516, takeCount = 1, giveId = 5889, giveCount = 1, keywords = {'dragon shield','piece of draconian steel'}}, } local phrases = { "Hello, |PLAYERNAME|! I'm a blacksmith. Did you bring something to me?", "How rude!", "Wait! I'm talking.", "You don't have required items", "Thank you so much.", "Farewell, |PLAYERNAME|", "Ohh, this is bad", trade1="Do you want to trade your", trade2="by" } local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) 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 npcHandler:setMessage(MESSAGE_GREET, phrases[1]) npcHandler:setMessage(MESSAGE_WALKAWAY, phrases[2]) npcHandler:setMessage(MESSAGE_PLACEDINQUEUE, phrases[3]) npcHandler:setMessage(MESSAGE_FAREWELL, phrases[6]) local function cyclopsExchange(cid, message, keywords, parameters, node) local exchange = exchanges[parameters.id] if (not npcHandler:isFocused(cid)) then return false end if doPlayerTakeItem(cid, exchange.takeId, exchange.takeCount) > 0 then doPlayerAddItem(cid, exchange.giveId, exchange.giveCount) npcHandler:say(phrases[5], cid) else npcHandler:say(phrases[4], cid) end keywordHandler:moveUp(1) return TRUE end for i = 1, #exchanges do local exchange = exchanges[i] for a = 1, #exchange.keywords do local node = keywordHandler:addKeyword({exchange.keywords[a]}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text =phrases.trade1..' '..getItemName(exchange.takeId)..' '..phrases.trade2..' '..getItemName(exchange.giveId)..'?'}) node:addChildKeyword({'yes'}, cyclopsExchange, {id = i}) node:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, moveup = 1, text = phrases[7]}) end end npcHandler:addModule(FocusModule:new()) está testado e 90% funcional.. meu GM não cria items começados em 2 =/ então só pude testar a giant spider silk faça o teste com o resto se quiser adicionar mais alguma troca, basta adicionar dentro de exchanges seguindo o padrão: {takeId = x, takeCount = y, giveId = a, giveCount = b, keywords{'key1','key2','key3'...}} takeId = item a ser retirado do player takeCount = quantidade de itens necessária giveId = item a ser entregue ao player giveCount = número de items que serão entregues OU em caso de items especiais... como runas ou fluids, aqui vem a propriedade do item ex: giveId = 2268, giveCount = 50 entrega UMA sd, com 50 cargas giveId = 2006, giveCount = 2 entrega UMA flask contendo blood e por fim, para traduzir as falas do NPC, basta alterar as phrases, os valores dentro das aspas se quiser npc channel, dê uma olhada neste link http://www.xtibia.com/forum/84x-Npc-Channe...nn-t103175.html
-
arquivo data\talkactions\scripts\save.lua se não existir, crie function onSay(cid, words, param) saveData() end arquivo data\talkactions\talkactions.xml adicione <talkaction words="!save" script="save.lua"/> a linha acima deve vir antes de </talkactions> arquivo data\xml\commands.xml adicione <command cmd="!save" group="2" acctype="5"/> a linha acima deve vir antes de </commands> se não der certo, avise, há uma maneira alternativa
-
Action, Talkaction Ou Creaturescripts...
tópico respondeu ao FER1561422 de brainless em Lixeira Pública
abaixo da linha do Godely vc coloca essa: doSendMagicEffect(getPlayerPosition(cid),4) -
arquivo data\movements\movements.xml <movevent event="Equip" itemid="XXXX" slot="AAAA" function="onEquipItem"> <vocation name="Sorcerer"/> <vocation name="Master Sorcerer" showInDescription="0"/> <vocation name="Druid"/> <vocation name="Elder Druid" showInDescription="0"/> <vocation name="Paladin"/> <vocation name="Royal Paladin" showInDescription="0"/> <vocation name="Knight"/> <vocation name="Elite Knight" showInDescription="0"/> </movement> <movevent event="DeEquip" itemid="XXXX" slot="AAAA" function="onDeEquipItem"> xxxx = id do item aaaa = feet / necklace / ring / head / armor / legs / shield function = onEquipItem e onDeEquipItem vocations são colocadas para permitir que apenas tal vocação utilize o item showInDescription="0" é usada para omitir a vocação, pra descrição não ficar muito grande 'Este item só pode ser utilizado por Paladins e Royal Paladins...' fica 'Este item só pode ser utilizado por Paladins...' para permitir que todas as vocations utilizem um equip, apague as tags <vocations> aí sim vc pode adicionar no arquivo data\items\items.xml, as propriedades do item que vc quer que ele adicione ou defenda
-
Como Criar Todos Os Postos De Um Otserv?
tópico respondeu ao Geobarfag de brainless em Lixeira Pública
kra vc precisa configurar 3 estágios, tudo no banco de dados sql primeiro estágio: GROUPS vá na tabela groups, e edite os dois grupos já existentes GOD e Gamemaster, na coluna ID para 5 e 4 respectivamente. crie os dois grupos restantes Consellor e Tutor com os IDs 3 e 2 e no campo FLAGS, preencha conforme a tabela: -- OT Adm ------- 2196372430840 -- GM ----------- 2199023230968 -- Consellor ---- 2060510154716 -- Tutor -------- 1374414798848 -- Player ------- 0 a figura a seguir serve como exemplo, o banco de dados pode apresentar leves diferenças segundo estágio: ACCOUNTS agora na tabela accounts, localize as colunas TYPE e GROUP_ID e preencha conforme o grupo equivalente criado na tabela anterior -- 1 - Player -- 2 - Tutor -- 3 - Consellor -- 4 - GM -- 5 - Server Admin (GOD) segue o exemplo de um server admin terceiro estágio: PLAYERS na tabela PLAYERS, localize o jogador que irá ocupar algum cargo especial, e basta mudar a coluna GROUP_ID para o ID equivalente, semelhante ao segundo estágio espero ter sanado sua dúvida -
desculpe a demora... não tenho costume de acessar aos fins de semana... vai o script aí local goods = { {id=2, name='blood', cost=50}, {id=11, name='oil', cost=100}, } local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) 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 local function createList() local goodslist = '' for i = 1, #goods - 1 do if (i > 1) and (i < #goods) then goodslist = goodslist..',' end goodslist = goodslist..' '..goods[i].name end if #goods > 1 then goodslist = goodslist..' and '..goods[#goods].name end return goodslist end npcHandler:setMessage(MESSAGE_GREET, "Hmm...Hello |PLAYERNAME|. I sell vials of "..createList()) function buyFluids(cid, message, keywords, parameters, node) if (not npcHandler:isFocused(cid)) then return false end if doPlayerRemoveMoney(cid, goods[parameters.id].cost) == TRUE then doPlayerAddItem(cid, 2006, 1, goods[parameters.id].id) npcHandler:say('Here is your '..goods[parameters.id].name, (cid)) else npcHandler:say('Are you joking me? You dont have the money!!', (cid)) end keywordHandler:moveUp(1) return true end local node={} for i = 1, #goods do local node1 = keywordHandler:addKeyword({goods[i].name}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Do you want to buy '..goods[i].name..' for '..goods[i].cost..' gps?'}) node1:addChildKeyword({'yes'}, buyFluids, {id = i}) node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, moveup = 1, text = 'OK, back when you want to buy something.'}) end npcHandler:addModule(FocusModule:new()) testado e funcional... tfs 2.0 ATENÇÃO pra eu fazer os testes, foi necessário baixar uma versão atualizada do items.otb e colocar na pasta data/items se vc notar que o npc está vendendo vials vazias, pode baixar uma versão atualizada do items.otb em http://www.speedyshare.com/609501539.html scan
-
script principal reduzido, se interessar: function onUse(cid,item,frompos,item2,topos) number = math.random(1,100) chance = 80 minItem = 1 maxItem = 3 mind = 300 maxd = 500 if chance > 100 or chance == 0 then chance = 100 end ----------------- Variables ---------------------- coords = { {topos.x+1,topos.y-2,topos.z}, {topos.x-1,topos.y+2,topos.z}, {topos.x+2,topos.y+1,topos.z}, {topos.x-1,topos.y-2,topos.z}, {topos.x+2,topos.y-1,topos.z}, {topos.x-2,topos.y-1,topos.z}, {topos.x-2,topos.y+1,topos.z}, {topos.x+1,topos.y+2,topos.z}, {topos.x+2,topos.y,topos.z}, {topos.x+1,topos.y,topos.z} } combinations = { {2,3,4,5}, {3,8,9,10}, {10,5,8,3}, {6,1,5,4} } local summon(params) doSendMagicEffect(topos,0) doTargetCombatHealth(0, cid, COMBAT_EARTHDAMAGE, -290, -510, CONST_ME_BIGPLANTS) if params.option == 'multi' then for i = 1,4 do doSummonCreature(params.monster, coords[combinations[params.coord1][i]]) end elseif params.option == 'double' then doSummonCreature(params.monster, coords[params.coord1]) doSummonCreature(params.monster, coords[params.coord2]) else doSummonCreature(params.monster, coords[params.coord1]) end end --------------------Demon oak(O braço esquerdo da arvore)-------------------- if item2.itemid == 8289 then leftspikedball = getPlayerStorageValue(cid,20000) if leftspikedball == -1 or leftspikedball == 0 then if number <= chance then surp = math.random(minItem, maxItem) if surp == 1 then local params = {option='multi', coord=1} if number <= 75 then params={monster='bone beast'} else params={monster='lich'} end end if surp == 2 then local params = {option='double', coord1=4, coord2=6} if number <= 75 then params={monster='lich', monster2='giant spider'} else params={monster='grim reaper', monster2='dark torturer'} end end if surp == 3 then if number <= 50 then local params = {monster="undead dragon", option="single", coord1=1} else local params = {option='',monster1='grim reaper',monster2='dark torturer',coord1=2,coord2=7} end end else doSendMagicEffect(topos,2) setPlayerStorageValue(cid,20000,1) end else doSendMagicEffect(topos,2) end return 1 end --------------------Demon oak(O passaro atrás da arvore)-------------------- if item2.itemid == 8288 then bird = getPlayerStorageValue(cid,20001) if bird == -1 or bird == 0 then if number <= chance then surp = math.random(minItem, maxItem) if surp == 1 then local params = {coord1=2, option='multi'} if number <= 75 then params{monster='banshee'} else params={monster='braindeath'} end end if surp == 2 then local params = {option='double', coord1=3, coord2=8} if number <= 75 then params={monster='demon', monster2='diabolic imp'} else params={monster='blightwalker', monster2='betrayed wraith'} end end if surp == 3 then if number <= 50 then local params={option = 'single', monster='undead dragon', coord1=7} else local params={option='',coord1=7,coord2=10,monster1='grim reaper',monster1='dark torturer'} end end else doSendMagicEffect(topos,2) setPlayerStorageValue(cid,20001,1) end else doSendMagicEffect(topos,2) end return 1 end --------------------Demon oak(O braço direito da arvore)-------------------- if item2.itemid == 8290 then rightspikedball = getPlayerStorageValue(cid,20002) if rightspikedball == -1 or rightspikedball == 0 then if number <= chance then surp = math.random(minItem, maxItem) if surp == 1 then local params = {option='multi', coord1=3} if number <= 75 then params={monster='lich'} else local params={monster='grim reaper'} end end if surp == 2 then local params={option='double', coord1=8, coord2=3} if number <= 75 then params={monster1='dark torturer', monster2='demon'} else params={monster1='diabolic imp', monster2='diabolic imp'} end end if surp == 3 then if number <= 50 then local params={option='single', monster='hand of cursed fate', coord1=2} else local params={option='double', monster='grim reaper', coord1=2, coord2=7, monster2='grim reaper'} end end else doSendMagicEffect(topos,2) setPlayerStorageValue(cid,20002,1) end else doSendMagicEffect(topos,2) end return 1 end --------------------Demon oak(O rosto da arvore)-------------------- if item2.itemid == 8291 then faceoftree = getPlayerStorageValue(cid,20003) if faceoftree == -1 or faceoftree == 0 then if number <= chance then surp = math.random(minItem, maxItem) if surp == 1 then local params={option='multi', coord1=4} if number <= 75 then params={monster='vampire'} else params={monster='diabolic imp'} end end if surp == 2 then local params={option='double', coord1=6, coord2=4} if number <= 75 then params={monster='demon', monster2='grim reaper'} else params={monster='hand of cursed fate', monster2='hand of cursed fate'} end end if surp == 3 then local params={option='double', coord1=7, coord2=2} if number <= 50 then params={monster='undead dragon', monster2='hand of cursed fate'} else params={monster='grim reaper', monster2='hand of cursed fate'} end end else doSendMagicEffect(topos,2) setPlayerStorageValue(cid,20003,1) end else doSendMagicEffect(topos,2) end return 1 end addEvent(summon, 100, params) return 0 end se encontrarem erros, favo postar as mensagens do console... fica mais fácil encontrar a linha
-
local combatDist = createCombatObject() setCombatParam(combatDist, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combatDist, COMBAT_PARAM_EFFECT, 0) setCombatParam(combatDist, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatFormula(combatDist, COMBAT_FORMULA_LEVELMAGIC, -0.4, -20, -0.5, 0) local condition = createConditionObject(CONDITION_PARALYZE) setConditionParam(condition, CONDITION_PARAM_TICKS, 2000) --setConditionParam(condition, CONDITION_PARAM_SPEED, -900) setConditionFormula(condition, -0.9, 0, -0.9, 0) setCombatCondition(combatDist, condition) function onCastSpell(cid, var) if getCreatureTarget(cid) ~= 0 then return doCombat(cid, combatDist, numberToVariant(target)) else return doCombat(cid, combat, var) end
-
Problema Com Uma Quest, Ajudem Por Favor!
tópico respondeu ao gnomow157 de brainless em Lixeira Pública
testada e 100% funcional (tfs 2.0) --Parchment by DuFF local delay = 30 -- tempo em segundos do exhausted setGlobalStorageValue(101, os.time()) local demoSpawns = { {x=1475, y=307, z=14}, {x=1475, y=317, z=14}, {x=1487, y=307, z=14}, {x=1487, y=317, z=14} } function onUse(cid, item, frompos, item2, topos) local tempo = getGlobalStorageValue(101) if tempo <= os.time() then doPlayerSendTextMessage(cid,22,"You have found 10 crystal coins.") for a=1,#demoSpawns do doSummonCreature("Demon",demoSpawns[a]) end doSendMagicEffect(topos,12) doPlayerAddItem(cid,2160,10) setGlobalStorageValue(101,delay+os.time()) else doPlayerSendCancel(cid, "Sorry, not possible.") end return 1 end só uma curiosidade: da direita pra esquerda: 1 - script inicial que ele trouxe pra nós 2 - desenvolvimento do script 3 - script terminado =) -
Problema Com Uma Quest, Ajudem Por Favor!
tópico respondeu ao gnomow157 de brainless em Lixeira Pública
tudo pra ganhar um postzinho hein... podia ter apenas reportado o tópico e deixado as instruções pra moderação... enfim.... noobinhu é esse o erro mesmo... mas ao invés de trocar por PlayerStorageValue, tem q trocar por GlobalStorageValue, pq o exhaust da action tem q valer pra todos os players, não apenas pra um só eu já tinha feito esse fix... mas quando fui testar aqui pra repassar, não acontece nada... o script é até chamado mas não faz o q deveria fazer... -
Problema Com Uma Quest, Ajudem Por Favor!
tópico respondeu ao gnomow157 de brainless em Lixeira Pública
não manda nem a msg "Sorry, not possible." ??? verifique no console, se clicando na parchment não aparece algum erro... tente assim, limpe o log, clique na parchment e veja o console, lá será exibido se houver qualquer erro verifique também pra mim, se no banco de dados, na tabela global_storage, existe a key 101 com algum valor adicionado -
bom, a área de variação acho que está certa de 300 a 400 agora quem faz os testes é você no fator multiplicativo leve em consideração que vc está multiplicando pelo dano de um ataque normal 0.1 = 10% 0.25 = 1/4 do valor 0.5 = 1/2 do valor 0.8 = 80% do valor se o Knight estiver batendo 30 em um monstro ele tiraria +3 +8 +15 +24
-
até sei... mas quem judia é esse seu 'no máximo, 450' o q eu posso fazer por vc é assim ó 0,300,0.1,400 desse jeito, o dano base varia entre 300 a 400 + 10% do dano comum ex, vc tá hitando 50 de um monstro... usa a spell ela vai tirar 300~400 + 5 entendeu?
-
Problema Com Uma Quest, Ajudem Por Favor!
tópico respondeu ao gnomow157 de brainless em Lixeira Pública
tp, eu acho q deu na mesma... pq vc ta setando o valor das variáveis antes de verificar se ela já existe ou está em exausted... enfim... ele vai testar e dizer se deu certo --Parchment by DuFF local delay = 1 -- tempo em minutos delay = delay * 60 * 1000 local demoSpawns = { {x=1475, y=307, z=14}, {x=1475, y=317, z=14}, {x=1487, y=307, z=14}, {x=1487, y=317, z=14} } local tempo = getStorageValue(101) if tempo == nil then tempo = 0 end function onUse(cid, item, frompos, item2, topos) playerpos = getPlayerPosition(cid) if (item.uid == 5555) and (tempo <= os.time()) then doPlayerSendTextMessage(cid,22,"You have found 10 crystal coins.") player2pos = {x=703, y=600, z=7} doTeleportThing(cid,player2pos) for a = 1, #demoSpawns do doSummonCreature("Demon", demoSpawns[a]) end doTeleportThing(cid,playerpos) doSendMagicEffect(topos,12) coins_uid = doPlayerAddItem(cid,2160,10) else setStorageValue(101,os.time() + delay) doPlayerSendCancel(cid, "Sorry, not possible.") end return 1 end -
mina <- descartado / minB / maxA / maxB nesse caso, ele falharia às vezes e se vc disse q está dando 1200, às vezes ele daria 1600 pra ele não falhar nunca, vc colocaria assim: 0,1,1.4,1 0 <- descartado / dano mínimo = 1 / dano máximo = 140% do dano da arma + 1 pra estar tirando 1200 cada hit da arma deve estar tirando ~850... tente dar uma revisada nas skills do char q vc está utilizando para teste
-
[onlogin Action]anti Multi-client(mc) [8.4] (consertei)
tópico respondeu ao ravockz de brainless em Lixeira Pública
o script é furada =x basicamente ele verifica se existem dois players logados no mesmo IP não é isso?? e se vários players acessam de uma lan house???? =o -
função: setCombatFormula(CombatObject, FormulaType, minA, minB, maxA, maxB) CombatObject = objeto criado através da função createCombatObject(). Deve ser armazenado em uma variável FormulaType = 0 - indefinido 1 - magic level 2 - skill 3 - dano direto minA = mínimo multiplicativo pelo tipo da fórmula minB = mínimo de dano estático maxA = máximo multiplicativo pelo tipo da fórmula maxB = máximo de dano estático fim de teoria, vamos à prática: caso1 - spell mágica, dependente de ml, player de ML 50 setCombatFormula(combat, 1, 1,0,2,600) fator multiplicativo => mínimo 50, máximo 100 dano extra da spell => de 0 a 600 um player de lvl 20 ml 50 tiraria - com sorte - 700 de damage da vítima caso2 - spell física, dependente de skill, player de skill 50, arma de ataque 30 setCombatFormula(Combat, 2,1,0,2,0) Suponhamos que com essas skills vc esteja hitando 60~70 do seu alvo fator multiplicativo => mínimo 60, máximo 140 a spell não possui dano extra caso3 - spell de dano independente setCombatFormula(Combat, 3, 0,100,0,300) esta spell tiraria sempre de 100 a 300 sem levar em conta ml ou skill de quem a utiliza resumo: seria como vc fazer dano = math.random(minA, maxA) + math.random(minB, maxB) ---------------------------------------------------------- edit... pesquisando um pouquinho mais... descobri aqui mesmo no xtibia, um link q o ta4e passou das sources, onde se calculam os dados dos damages explicando min = (([LEVEL * 2] + [ML * 3]) * 1 * minA) + minB max = (([LEVEL * 2] + [ML * 3]) * 1 * maxA) + minB caso 1 - mínimo = (([20 * 2] + [50 * 3]) * 1) + 0 = 190 máximo = (([20*2] + [50 * 3]) * 2) + 600 = 980 variação da spell(level20, ml50) = 190 ~ 980 explicando min = minB (note que, para formula_skill, o valor de minA é descartado) max = dano da arma * maxA + maxB caso 2 - mínimo = 1 máximo = 60 * 2 + 0 = 120 variação da spell(arma dando 60 de damage) = 1 ~ 120 PS.: DEIXEI A ÁREA ERRADA MESMO APÓS O EDIT PARA FICAR COMO APRENDIZADO xD
-
Como Mudar O Local Onde O Char Aparece Após A Morte?
tópico respondeu ao marlonfifas de brainless em Lixeira Pública
alisson axo q vc trocou as bolas, meu caro... pensa cmg... se ele tiver q trocar o lugar onde os players saem via banco de dados.. vc n concorda cmg q pra cada player q for criado, o cara tem q avisar o dono do ot pra mudar no DB pra poder jogar?? sim, é no config.lua q se muda o primeiro spawn do player, e no DB muda onde foi o último logOut do player -
a tarde toda trabalhando nisso =).. claro, dps de ter descoberto o problema... assim kra... primeiro de tudo... pra spell sair em volta do char... vc tem q desabilitar o atributo direction="1" no arquivo spells.xml feito isso... temos um outro problema... a spell ficará fixa, apontando sempre pra um determinado local quando for acionada. para contornar isso, fazemos a mesma spell 4 vezes, 1 para cada direção, e nos utilizamos da função getPlayerLookDir(cid) lembrando que o nome da função pode variar, de acordo com a versão do server. Para verificar, consulte o arquivo lua_functions dentro da pasta doc agora a particularidade da sua spell... ela é executada em 3 estágios... sendo 4 configurações por estágio... nos dá um total de 12 spells a serem configuradas... abusei dos loopings só não coloquei mais loops pq não consegui manipular array[array[]] para dar uma encurtada no arquivo o resultado final segue abaixo: -- SPELL DE EFEITO FÍSICO local areaPhysical = { { {0, 2, 1}, {0, 1, 0}, {1, 0, 0} }, { {1, 0, 0}, {0, 1, 2}, {0, 0, 1} }, { {0, 0, 1}, {0, 1, 0}, {1, 2, 0} }, { {1, 0, 0}, {2, 1, 0}, {0, 0, 1} } } local combatPhysical = {} for i = 1, 4 do combatPhysical[i] = createCombatObject() setCombatParam(combatPhysical[i], COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combatPhysical[i], COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) setCombatFormula(combatPhysical[i], COMBAT_FORMULA_LEVELMAGIC, -1, -5, -0.5, -15) local combatArea = createCombatArea(areaPhysical[i]) setCombatArea(combatPhysical[i], combatArea) end -- ÁREA DE EFEITO DEFESA DA ARMADURA local areaArmour = { { {1, 2, 0}, {0, 1, 0}, {0, 0, 1} }, { {0, 0, 1}, {0, 1, 2}, {1, 0, 0} }, { {1, 0, 0}, {0, 1, 0}, {0, 2, 1} }, { {0, 0, 1}, {2, 1, 0}, {1, 0, 0} } } local combatArmour = {} for i = 1, 4 do combatArmour[i] = createCombatObject() setCombatParam(combatArmour[i], COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combatArmour[i], COMBAT_PARAM_EFFECT, CONST_ME_BLOCKHIT) setCombatFormula(combatArmour[i], COMBAT_FORMULA_LEVELMAGIC, -1, -5, -0.5, -15) local combatArea = createCombatArea(areaArmour[i]) setCombatArea(combatArmour[i], combatArea) end -- ÁREA DE EFEITO SANGUE local areaBlood = { { {0, 0, 2}, {1, 1, 1} }, { {1, 0}, {1, 0}, {1, 2} }, { {1, 1, 1}, {0, 0, 2} }, { {2, 1}, {0, 1}, {0, 1} } } local combatBlood = {} for i = 1, 4 do combatBlood[i] = createCombatObject() setCombatParam(combatBlood[i], COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatParam(combatBlood[i], COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD) setCombatFormula(combatBlood[i], COMBAT_FORMULA_LEVELMAGIC, -1, -5, -0.5, -15) local combatArea = createCombatArea(areaBlood[i]) setCombatArea(combatBlood[i], combatArea) end -- FIM DOS EFEITOS local function castSpells(parameters) doCombat(parameters.cid, parameters.combat, parameters.var) end function onCastSpell(cid, var) dirNow = getPlayerLookDir(cid) + 1 local combat = {combatPhysical[dirNow], combatArmour[dirNow], combatBlood[dirNow]} local delays = {100,250,400} for i = 1, 3 do parameters = {cid = cid, var = var, combat = combat[i]} addEvent(castSpells, delays[i], parameters) end end
-
[action] Só Passa Na Porta Se Tiver O Item Na Bp
tópico respondeu ao Quilante de brainless em Lixeira Pública
coloque uma questdoor no seu mapa e adicione uma UniqueID à ela arquivo data\actions\actions.xml arquivo data\actions\scripts\minhaquest.lua
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.