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) The corrupt fear us. The honest support us. The heroic join us.
Postado Dezembro 14, 2014 10 anos Será que com muitos players, não daria um certo lag no sv? Tony Araújo
Postado Dezembro 14, 2014 10 anos Autor Eis a questão, meu caro @Orochi Elf. Acredito que isso pode variar. The corrupt fear us. The honest support us. The heroic join us.
Postado Dezembro 14, 2014 10 anos @Orochi Elf, também to com éssa mesma dúvida Att,Dieguiin XP »»http://baiakfull.com/««
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 Nem todo loop infinito é ruim ;P User *eu = new User("otteN"); RepSystem<User> *myRep = new RepSystem<User>("jóinha"); myRep->setAlvo(eu); /* só por ser criado já sou o melhor membro */ while(eu->isMelhorMembro()){ myRep->reputar(); }
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.