Será útil, obrigado por compartilhar.
- Fórum
- OTServ
- Recursos
- Scripting
- Actions e Talkactions
- [TFS 1.X] Fishing System (PXG)
[TFS 1.X] Fishing System (PXG)
Por darkeyren, 02 de out. de 2015 em Actions e Talkactions
info
Grupo: Infante
Registrado: 28/01/12
Posts: 1.6k
Reputação: +262
Gênero: Masculino

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
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...
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
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 por shept
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"/>
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 ![]()
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.
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 por shept
info
Grupo: Campones
Registrado: 17/05/16
Posts: 72
Reputação: +85
Gênero: Masculino
Char no Tibia: Walox®

Funciona em TSF 3.6 ?
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:
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.
ajuda em Actions








info
Grupo: Artesão
Registrado: 21/12/10
Posts: 122
Reputação: +13
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:
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 ende registre esse evento no creaturescripts.xml
- 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 SystemBem, eu acho que é isso, espero não estar esquecendo nada... Enjoy.
Editado Novembro 28 por DarkeyreN