Jump to content

darkeyren

Recommended Posts

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.

Edited by DarkeyreN
Link to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

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 to comment
Share on other sites

  • 1 month later...

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

Edited by shept
Link to comment
Share on other sites

  • 2 weeks later...

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 to comment
Share on other sites

 

 

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 to comment
Share on other sites

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 to comment
Share on other sites

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>
Edited by shept
Link to comment
Share on other sites

  • 2 years later...
  • 3 years later...
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 to comment
Share on other sites

×
×
  • Create New...