Postado Dezembro 14, 2014 10 anos 0100001101101111011001000110010101110011001000000110010001100101011101100110010101101100011011110111000001100101011001000010000001100010011110010010000001010011011101010110100101100011011010010110010001100101 Eu observei que muitos desconhecem a New Library v. 1.2, feita por (um grande amigo e programador/scripter) xWhiteWolf. Então resolvi fazer o uso de algumas de suas funções para tentar expandir o reconhecimento da existência delas, que podem ser muito úteis em diversas situações. Bom, "loop effect" é uma função com uma condição de teste verdadeira que nunca termina (loop) sobre um shoot type effect (os distance effects). Quando aplicada a um creatureID, gera efeitos de distância infinitos nas posições entorno do mesmo. Porém, eu fiz pequenas alterações na função original para ficar adequada à talkaction. Primeiramente, adicione as seguintes funções à sua lib, no arquivo 050-function.lua (data/lib): function loopEffect(uid, effect, key) -- modified function of xWhiteWolfs library local delay = 0.3 -- exhausted do efeito em decimais, sendo 0.3 = 300 milissegundos local effectPositions = getPositionsByDirection(uid) doSendDistanceShoot(effectPositions[math.random(#effectPositions)], effectPositions[math.random(#effectPositions)], effect) addEvent(function() if isCreature(uid) and getPlayerStorageValue(uid, key) >= 0 then loopEffect(uid, effect, key) end end, 1000 * delay) return true end function getPositionsByDirection(uid) pos = getCreaturePosition(uid) positionsByDirection = { [0] = { [1] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [2] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0}, [3] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [4] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0}, [5] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [6] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0}, [7] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [8] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0}, [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0} }, [1] = { [1] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [2] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0}, [3] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [4] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0}, [5] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [6] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0}, [7] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [8] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0}, [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0} }, [2] = { [1] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [2] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0}, [3] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [4] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0}, [5] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [6] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0}, [7] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [8] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0}, [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0} }, [3] = { [1] = {x = pos.x - 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [2] = {x = pos.x, y = pos.y - 1, z = pos.z, stackpos = 0}, [3] = {x = pos.x + 1, y = pos.y - 1, z = pos.z, stackpos = 0}, [4] = {x = pos.x + 1, y = pos.y, z = pos.z, stackpos = 0}, [5] = {x = pos.x + 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [6] = {x = pos.x, y = pos.y + 1, z = pos.z, stackpos = 0}, [7] = {x = pos.x - 1, y = pos.y + 1, z = pos.z, stackpos = 0}, [8] = {x = pos.x - 1, y = pos.y, z = pos.z, stackpos = 0}, [9] = {x = pos.x, y = pos.y, z = pos.z, stackpos = 0} } } return positionsByDirection[getCreatureLookDirection(uid)] end Fiz duas maneiras de um player adquirir esse efeito: Quest (por chest ou o que preferir): loopeffquest.lua (data/actions/scripts): local t = { effect = 18, -- shoot type number qstor = 70001, -- quest storage stor = 70707 -- loopEffect storage } function onUse(cid, item) if getPlayerStorageValue(cid, t.qstor) < 1 then setPlayerStorageValue(cid, t.qstor, 1) setPlayerStorageValue(cid, t.stor, t.effect) loopEffect(cid, t.effect, t.stor) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'You have found a magic chest and now you received a constant effect.') else doPlayerSendCancel(cid, 'You already received the constant effect before.') end return true end Tag - actions.xml (data/actions): <action actionid="ACTIONID" script="loopeffquest.lua"/> TalkAction de adição/remoção: loopeffect.lua (data/talkactions/scripts): function onSay(cid, words, param, channel) local stor = 70707 -- loopEffect storage local p = string.explode(param, ",") local pid, ts, tn = getPlayerByNameWildcard(p[1]), tostring(p[1]), tonumber(p[2]) if (words == '/addloopeff') then if (param == '') then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Enter the player name and the loop effect (shoot type number) you want to assign to the player. Thus: /addloopeff Player, 18') end if (not ts or not tn or p[3]) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Invalid parameter specified.') end if (tn < 0 or tn > CONST_ANI_LAST) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'The shoot type effect number cannot be lower than 0 and higher than '..CONST_ANI_LAST) end if (not pid) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' not found.') end if (getPlayerStorageValue(pid, stor) >= 0) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' is already with loop effect.') end setPlayerStorageValue(pid, stor, tn) loopEffect(pid, tn, stor) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'You assigned the loop effect '..tn..' to the player '..ts) elseif (words == '/removeloopeff') then if (param == '') then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Enter the player name you want to remove the loop effect. Thus: /removeloopeff Player') end if (not ts or p[2]) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Invalid parameter specified.') end if (not pid) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' not found.') end if (getPlayerStorageValue(pid, stor) < 0) then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Player '..ts..' is not with loop effect.') end setPlayerStorageValue(pid, stor, -1) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, 'You removed the loop effect of the player '..ts) end return true end Tag - talkactions.xml (data/talkactions): <talkaction log="yes" words="/addloopeff;/removeloopeff" access="5" event="script" value="loopeffect.lua"/> loopeffect.lua (data/creaturescripts/scripts): function onLogin(cid) local stor = 70707 -- loopEffect storage if getPlayerStorageValue(cid, stor) >= 0 then loopEffect(cid, getPlayerStorageValue(cid, stor), stor) end return true end Tag - creaturescripts.xml (data/creaturescripts): <event type="login" name="LoopEffect" event="script" value="loopeffect.lua"/> Os parâmetros da talkaction são simples. Para adicionar um loop effect ao player: /addloopeff playerName, shootTypeNumber Ex: /addloopeff Suicide, 18 Para remover o loop effect de um player: /addloopeff playerName Ex: /removeloopeff Suicide Nota: mesmo que o player faça logout, o loopEffect retornará quando ele logar novamente. Só vai parar se você o remover do player, com a talkaction. É isso. Talvez não seja muito útil em servidores globais, manter esse efeito de shoot type infinito. Mas eu queria compartilhar com vocês; espero que sirva de ajuda pra alguém. Editado Dezembro 14, 2014 10 anos por Suicide (veja o histórico de edições)
Postado Dezembro 14, 2014 10 anos Autor Eis a questão, meu caro @Orochi Elf. Acredito que isso pode variar.
Postado Janeiro 4, 2015 10 anos Gostei bastante, porém to com a mesma dúvida dos outros :/ EHUAEHAUEHAU, curti vc botar em binário o Codes developed by Suicide
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.