darkeyren 13 Postado Outubro 2, 2015 Share Postado Outubro 2, 2015 (editado) Fala galera, hoje trago pra vocês meu Fishing System... Eu ainda não sou nem um programador experiente mas consegui fazer esse sistema, eu fiz ele faz um bom tempo... Não programo mais em Lua, apenas C++... Mas espero que gostem... Caso achem algo que seria desnecessário ou outra maneira mais fácil de fazer tal coisa só dizer, estou aberto a críticas. Bem, vamos lá!. - Crie um arquivo chamado fish.lua em Actions e coloque: local waterTiles = {4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4664, 4665, 4666} --qnt = quantidade de pokes que pode vim (randomico) -- isca 0 para pokes que vem sem isca. local fishIsca = { ["Bug"] = {skill = 10, isca = 0, qnt = 2}, ["Rat"] = {skill = 10, isca = 2678, qnt = 1}, ["Dragon Lord"] = {skill = 10, isca = 2676, qnt = 1}, ["Demon"] = {skill = 10, isca = 3976, qnt = 1}, ["Dragon"] = {skill = 10, isca = 3976, qnt = 1}, } minTime = 10 -- minimo de segundos para balangar a vara. fishs = {} function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) if item:getId() ~= 2389 then doFishing(player, item, fromPosition, itemEx, toPosition, isHotkey) if iscaId ~= 0 then player:removeItem(iscaId, 1) end else pickFishing(player, item, fromPosition, itemEx, toPosition, isHotkey) end end function doFishing(player, item, fromPosition, itemEx, toPosition, isHotKey, oldOutfit) if player:getStorageValue(fishingStorage) == 0 then local tileId = itemEx:getId() local iscaId = player:getStorageValue(iscaId) local playerSkill = player:getEffectiveSkillLevel(SKILL_FISHING) if isInArray(waterTiles, tileId) then fishPosition = itemEx:getPosition() if iscaId ~= 0 then for a, b in pairs(fishIsca) do if playerSkill >= fishIsca[a].skill then if iscaId == fishIsca[a].isca then table.insert(fishs, a) end end end end if iscaId == 0 then for a, b in pairs(fishIsca) do if playerSkill >= fishIsca[a].skill then if iscaId == fishIsca[a].isca then table.insert(fishs, a) end end end end else return true end if #fishs >= 1 then player:setStorageValue(timeFish, minTime + (math.random(5, 10) + os.time())) player:getPosition():sendDistanceEffect(itemEx:getPosition(), 32) if iscaId ~= 0 then if not player:removeItem(iscaId, 1) then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Sua isca "..configFish[iscaId].name.." acabou ou ela nao esta no seu inventario.") player:setStorageValue(iscaId, 0) player:unregisterEvent("Fishing") else player:registerEvent("Fishing") player:setStorageValue(fishingStorage, 1) end else player:registerEvent("Fishing") player:setStorageValue(fishingStorage, 1) end end else return true end end function pickFishing(player, item, fromPosition, itemEx, toPosition, isHotKey, oldOutfit) local iscaId = player:getStorageValue(iscaId) if item:getId() == 2389 then if player:getStorageValue(fishingStorage) == 2 then local randomFish = fishs[math.random(#fishs)] for i = 1, math.random(1, fishIsca[randomFish].qnt) do local pokeFish = Game.createMonster(randomFish, player:getPosition()) end fishs = {} player:setStorageValue(fishingStorage, 0) player:addSkillTries(SKILL_FISHING, 1) player:unregisterEvent("Fishing") else player:setStorageValue(fishingStorage, 0) player:unregisterEvent("Fishing") end return true end end - Agora crie outro arquivo em Actions chamado isca.lua e coloque: function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) local isca = item:getId() local iscaTable = 0 if not configFish[isca] then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "isca inexistente.") return true end for a, b in pairs(configFish) do if a == isca then iscaTable = a end end if player:getStorageValue(iscaId) == isca then player:setStorageValue(iscaId, 0) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, configFish[isca].name.." foi retirada da vara.") else player:setStorageValue(iscaId, iscaTable) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, configFish[isca].name.." foi colocada na vara.") end end Agora em Creaturescripts crie um arquivo chamado fishing.lua e coloque: function onThink(player, interval, lastExecution, thinkInterval) if not player then return true end local playerPos = player:getPosition() -- se tiver algo no caminho if not playerPos:isSightClear(fishPosition, false) then player:unregisterEvent("Fishing") player:setStorageValue(fishingStorage, 0) end --fica olhando para isca / mandando effects lookToDirection(playerPos, fishPosition, player) if player:getStorageValue(fishingStorage) ~= 2 then fishPosition:sendMagicEffect(27) end -- se a distancia for muito grande da isca if playerPos:getDistance(fishPosition) > 5 then player:setStorageValue(fishingStorage, 0) player:say("Voce perdeu sua isca.", TALKTYPE_MONSTER_SAY) player:unregisterEvent("Fishing") return true end -- Tempo pra puxar / perder a isca. local currentTime = os.time() local fishTime = player:getStorageValue(timeFish) if currentTime > fishTime then player:say("Sua isca esta balangando..", TALKTYPE_MONSTER_SAY) player:setStorageValue(fishingStorage, 2) fishPosition:sendMagicEffect(28) if currentTime > fishTime + 15 then player:say("Demorou muito e perdeu a isca.", TALKTYPE_MONSTER_SAY) player:setStorageValue(fishingStorage, 0) player:unregisterEvent("Fishing") end end return true end e registre esse evento no creaturescripts.xml <event type="think" name="Fishing" script="fishing.lua"/> - Agora na sua lib adicione isso: --Fishing System configFish = { [2678] = {name = "coconut"}, [2676] = {name = "banana"}, [3976] = {name = "worm"} } timeFish = 2001 -- Tempo do Fishing fishingStorage = 2002 -- Puxar / Jogar iscaId = 2003 -- IscaId fishPosition = nil -- Posicao da isca na agua --END Fishing System Bem, eu acho que é isso, espero não estar esquecendo nada... Enjoy. Editado Novembro 28, 2015 por DarkeyreN Link para o comentário Compartilhar em outros sites More sharing options...
FlamesAdmin 261 Postado Outubro 2, 2015 Share Postado Outubro 2, 2015 Será útil, obrigado por compartilhar. Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Outubro 2, 2015 Share Postado Outubro 2, 2015 Parece ta bacana, só uma coisa, em relação ao uso de storage, tu pode substituir isso por uma condition outfit. E tem mais uma coisa, quando anda no pxg ele para a pesca, tu pode fazer isso pelo onThink mesmo que tu ja usou ai, so verificar se ele andou mesmo e tals. não me lembro agora se tem alguma callback pra onMove no tfs 1.x, vou dar uma olhada. Uma coisa bacana seria tambem fazer uma relação entre fishing level e quantidade de pokes que podem vir, algo como: local num = math.min(math.max(1, math.floor((playerSkill - fishIsca.skill) /10)), 4) Tu disse que programa em c++, math.min e max são a mesma do c++ std::min std::max , dai isso vai fazer vir o maximo de 4 pokes, e a cada 10 skills que tu exceder a skill da isca tu adiciona mais um pokemon pra poder vir dai é só math.random(num) e pronto xD Link para o comentário Compartilhar em outros sites More sharing options...
darkeyren 13 Postado Outubro 2, 2015 Autor Share Postado Outubro 2, 2015 Parece ta bacana, só uma coisa, em relação ao uso de storage, tu pode substituir isso por uma condition outfit. E tem mais uma coisa, quando anda no pxg ele para a pesca, tu pode fazer isso pelo onThink mesmo que tu ja usou ai, so verificar se ele andou mesmo e tals. não me lembro agora se tem alguma callback pra onMove no tfs 1.x, vou dar uma olhada. Uma coisa bacana seria tambem fazer uma relação entre fishing level e quantidade de pokes que podem vir, algo como: local num = math.min(math.max(1, math.floor((playerSkill - fishIsca.skill) /10)), 4) Tu disse que programa em c++, math.min e max são a mesma do c++ std::min std::max , dai isso vai fazer vir o maximo de 4 pokes, e a cada 10 skills que tu exceder a skill da isca tu adiciona mais um pokemon pra poder vir dai é só math.random(num) e pronto xD Obrigado pela dica em relação ao min/max e condition outfit., quando tiver um tempo pretendo atualizar.. Em questão a movimentação, pelo menos quando eu jogava ele não perdia a isca quando andava, só se ficasse de frente pra algo (block) ou ficasse muito distante da isca, e quando andava ele sempre virava pro lado que estava a isca... Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Outubro 2, 2015 Share Postado Outubro 2, 2015 Pode ter mudado entao, faz um tempo bom que eu nao jogo kk, lembro quando implantaram o sistema la, era assim, se tu andasse ele parava de pescar e trocava o outfit xD Link para o comentário Compartilhar em outros sites More sharing options...
shept 11 Postado Novembro 18, 2015 Share Postado Novembro 18, 2015 (editado) cara, excelente, to tentando fazer funcionar aqui, ainda não testei,mas estou com duvida na tag do creaturescript... outra coisa, estou com duvida, eu tenho que registrar o event no login também? edit: cansei de testar aqui, não dá erros no console mas não consigo fazer funcionar, testando apenas com uma isca! e 2 items, um pra ser a vara que usa pra fazer a tentativa e outro item pra puxar o fish mas ambos não dá em nada, sem erros Editado Novembro 18, 2015 por shept Link para o comentário Compartilhar em outros sites More sharing options...
darkeyren 13 Postado Novembro 28, 2015 Autor Share Postado Novembro 28, 2015 cara, excelente, to tentando fazer funcionar aqui, ainda não testei,mas estou com duvida na tag do creaturescript... outra coisa, estou com duvida, eu tenho que registrar o event no login também? edit: cansei de testar aqui, não dá erros no console mas não consigo fazer funcionar, testando apenas com uma isca! e 2 items, um pra ser a vara que usa pra fazer a tentativa e outro item pra puxar o fish mas ambos não dá em nada, sem erros Desculpe não ter respondido antes, acho que o problema é que esqueci de colocar que tem que registrar o evento no creaturescripts.xml <event type="think" name="Fishing" script="fishing.lua"/> Link para o comentário Compartilhar em outros sites More sharing options...
shept 11 Postado Novembro 29, 2015 Share Postado Novembro 29, 2015 Desculpe não ter respondido antes, acho que o problema é que esqueci de colocar que tem que registrar o evento no creaturescripts.xml <event type="think" name="Fishing" script="fishing.lua"/> não cara, não é isso ... eu vi que estava faltando essa tag, eu não sou um doente mental que não consegue perceber uma tag faltando, deve ser outro problema, amanhã vou fazer mais testes e ver o que pode estar acontecendo pra dar um parecer, não parece que tenha alguém com o mesmo erro, afinal ninguém se pronunciou que testou e tal Link para o comentário Compartilhar em outros sites More sharing options...
Nu77 81 Postado Novembro 29, 2015 Share Postado Novembro 29, 2015 não cara, não é isso ... eu vi que estava faltando essa tag, eu não sou um doente mental que não consegue perceber uma tag faltando, deve ser outro problema, amanhã vou fazer mais testes e ver o que pode estar acontecendo pra dar um parecer, não parece que tenha alguém com o mesmo erro, afinal ninguém se pronunciou que testou e tal Registrou ao Player? ( Geralmente feito pelo script login.lua ) Se não, nunca vai funcionar pois é utilizado o evento onThink que precisa ser registrado ao Player. Link para o comentário Compartilhar em outros sites More sharing options...
shept 11 Postado Novembro 29, 2015 Share Postado Novembro 29, 2015 (editado) Registrou ao Player? ( Geralmente feito pelo script login.lua ) Se não, nunca vai funcionar pois é utilizado o evento onThink que precisa ser registrado ao Player. de fato não havia registrado, mas agora apareceu um erro monstro edit: ao que parece essas funções não existem no tfs 1.2 isSightClear lookToDirection [C]: at 0x7ff6283fba10 [C]: in function 'isSightClear' data/creaturescripts/scripts/others/fish.lua:8: in function <data/creaturescripts/scripts/others/fish.lua:1> Editado Novembro 29, 2015 por shept Link para o comentário Compartilhar em outros sites More sharing options...
Punchlines Nemmo 85 Postado Dezembro 25, 2017 Share Postado Dezembro 25, 2017 Funciona em TSF 3.6 ? Link para o comentário Compartilhar em outros sites More sharing options...
KaboFlow 54 Postado Fevereiro 21, 2021 Share Postado Fevereiro 21, 2021 Em 02/10/2015 em 08:34, darkeyren disse: Fala galera, hoje trago pra vocês meu Fishing System... Eu ainda não sou nem um programador experiente mas consegui fazer esse sistema, eu fiz ele faz um bom tempo... Não programo mais em Lua, apenas C++... Mas espero que gostem... Caso achem algo que seria desnecessário ou outra maneira mais fácil de fazer tal coisa só dizer, estou aberto a críticas. Bem, vamos lá!. - Crie um arquivo chamado fish.lua em Actions e coloque: Mostrar conteúdo oculto local waterTiles = {4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619, 4620, 4621, 4622, 4623, 4624, 4625, 4664, 4665, 4666} --qnt = quantidade de pokes que pode vim (randomico) -- isca 0 para pokes que vem sem isca. local fishIsca = { ["Bug"] = {skill = 10, isca = 0, qnt = 2}, ["Rat"] = {skill = 10, isca = 2678, qnt = 1}, ["Dragon Lord"] = {skill = 10, isca = 2676, qnt = 1}, ["Demon"] = {skill = 10, isca = 3976, qnt = 1}, ["Dragon"] = {skill = 10, isca = 3976, qnt = 1}, } minTime = 10 -- minimo de segundos para balangar a vara. fishs = {} function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) if item:getId() ~= 2389 then doFishing(player, item, fromPosition, itemEx, toPosition, isHotkey) if iscaId ~= 0 then player:removeItem(iscaId, 1) end else pickFishing(player, item, fromPosition, itemEx, toPosition, isHotkey) end end function doFishing(player, item, fromPosition, itemEx, toPosition, isHotKey, oldOutfit) if player:getStorageValue(fishingStorage) == 0 then local tileId = itemEx:getId() local iscaId = player:getStorageValue(iscaId) local playerSkill = player:getEffectiveSkillLevel(SKILL_FISHING) if isInArray(waterTiles, tileId) then fishPosition = itemEx:getPosition() if iscaId ~= 0 then for a, b in pairs(fishIsca) do if playerSkill >= fishIsca[a].skill then if iscaId == fishIsca[a].isca then table.insert(fishs, a) end end end end if iscaId == 0 then for a, b in pairs(fishIsca) do if playerSkill >= fishIsca[a].skill then if iscaId == fishIsca[a].isca then table.insert(fishs, a) end end end end else return true end if #fishs >= 1 then player:setStorageValue(timeFish, minTime + (math.random(5, 10) + os.time())) player:getPosition():sendDistanceEffect(itemEx:getPosition(), 32) if iscaId ~= 0 then if not player:removeItem(iscaId, 1) then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Sua isca "..configFish[iscaId].name.." acabou ou ela nao esta no seu inventario.") player:setStorageValue(iscaId, 0) player:unregisterEvent("Fishing") else player:registerEvent("Fishing") player:setStorageValue(fishingStorage, 1) end else player:registerEvent("Fishing") player:setStorageValue(fishingStorage, 1) end end else return true end end function pickFishing(player, item, fromPosition, itemEx, toPosition, isHotKey, oldOutfit) local iscaId = player:getStorageValue(iscaId) if item:getId() == 2389 then if player:getStorageValue(fishingStorage) == 2 then local randomFish = fishs[math.random(#fishs)] for i = 1, math.random(1, fishIsca[randomFish].qnt) do local pokeFish = Game.createMonster(randomFish, player:getPosition()) end fishs = {} player:setStorageValue(fishingStorage, 0) player:addSkillTries(SKILL_FISHING, 1) player:unregisterEvent("Fishing") else player:setStorageValue(fishingStorage, 0) player:unregisterEvent("Fishing") end return true end end - Agora crie outro arquivo em Actions chamado isca.lua e coloque: Mostrar conteúdo oculto function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) local isca = item:getId() local iscaTable = 0 if not configFish[isca] then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "isca inexistente.") return true end for a, b in pairs(configFish) do if a == isca then iscaTable = a end end if player:getStorageValue(iscaId) == isca then player:setStorageValue(iscaId, 0) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, configFish[isca].name.." foi retirada da vara.") else player:setStorageValue(iscaId, iscaTable) player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, configFish[isca].name.." foi colocada na vara.") end end Agora em Creaturescripts crie um arquivo chamado fishing.lua e coloque: Mostrar conteúdo oculto function onThink(player, interval, lastExecution, thinkInterval) if not player then return true end local playerPos = player:getPosition() -- se tiver algo no caminho if not playerPos:isSightClear(fishPosition, false) then player:unregisterEvent("Fishing") player:setStorageValue(fishingStorage, 0) end --fica olhando para isca / mandando effects lookToDirection(playerPos, fishPosition, player) if player:getStorageValue(fishingStorage) ~= 2 then fishPosition:sendMagicEffect(27) end -- se a distancia for muito grande da isca if playerPos:getDistance(fishPosition) > 5 then player:setStorageValue(fishingStorage, 0) player:say("Voce perdeu sua isca.", TALKTYPE_MONSTER_SAY) player:unregisterEvent("Fishing") return true end -- Tempo pra puxar / perder a isca. local currentTime = os.time() local fishTime = player:getStorageValue(timeFish) if currentTime > fishTime then player:say("Sua isca esta balangando..", TALKTYPE_MONSTER_SAY) player:setStorageValue(fishingStorage, 2) fishPosition:sendMagicEffect(28) if currentTime > fishTime + 15 then player:say("Demorou muito e perdeu a isca.", TALKTYPE_MONSTER_SAY) player:setStorageValue(fishingStorage, 0) player:unregisterEvent("Fishing") end end return true end e registre esse evento no creaturescripts.xml <event type="think" name="Fishing" script="fishing.lua"/> - Agora na sua lib adicione isso: Mostrar conteúdo oculto --Fishing System configFish = { [2678] = {name = "coconut"}, [2676] = {name = "banana"}, [3976] = {name = "worm"} } timeFish = 2001 -- Tempo do Fishing fishingStorage = 2002 -- Puxar / Jogar iscaId = 2003 -- IscaId fishPosition = nil -- Posicao da isca na agua --END Fishing System Bem, eu acho que é isso, espero não estar esquecendo nada... Enjoy. ajuda em Actions Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados