Jump to content

Omega

Recommended Posts

A pedido de um membro, vou postar esse evento que eu fiz aqui há bastante tempo já. Dei umas boas testadas na época, mas peço que postem os erros caso os encontrem.

 

Informações

  • A cada intervalo de tempo definido, o servidor escolhe automaticamente um alvo entre os jogadores online e anuncia (broadcast). Esse jogador se manterá como alvo por um período também configurável de tempo e, quando for morto, o jogador que o matar receberá itens definidos na configuração.
  • O level mínimo e o grupo a que pode pertencer podem ser configurados.
  • As opções incluem desabilitar o logout do alvo e forçar a escolha de um novo alvo caso o outro morra ou dê logout.

 

Códigos

  • data/lib/targetlib.lua

 

 

targetStorage = 9800
targetTime = 9801
targetConfig = 
{
 targetCanLogOut = false, -- true para o alvo poder dar logout
 resetTargetOnLogOut = true, -- true para sortear outro alvo quando o alvo der logout (nao importa se a opcao de cima for true)
 resetTargetAlways = true, -- true para quando um alvo morrer ou logar, o server designará outro alvo
 ignoredGroups = {3,4,5,6}, -- Coloque quais grupos não poderão ser adicionados como alvos (1-player, 2-tutor, 3-senior tutor, 4-GM,5-CM, 6-GOD)
 targetTime = 5, -- Tempo que o jogador ficará como alvo (minutos)
 minLevel = 50, -- Level mínimo para ser escolhido como alvo
}
targetRewards = -- Recompensas que o cara que matar o alvo ganhará
{
 level = 3,
 xp = false,
 item1 = false,
 item2 = false,
 money = 10000,
 msg = 'Voce matou o alvo e conseguiu sua recompensa!',
 }
 
function getNewTarget()
	local players = table.getn(getPlayersOnline()) and getPlayersOnline() or {}
	local target = false
	local i = 0
	for _,pid in pairs(players) do
		if getPlayerLevel(pid) >= targetConfig.minLevel and not isInArray(targetConfig.ignoredGroups,getPlayerGroupId(pid)) then			
			i = i + 1
		end
	end
	if i == 0 then
		return true
	end
	repeat		
		target = players[math.random(1,#players)]
	until (getPlayerLevel(target) > targetConfig.minLevel and not isInArray(targetConfig.ignoredGroups,getPlayerGroupId(target))) or i == 0	
	return target
end
 
function setTarget()
	local players = getPlayersOnline()
	local target = table.getn(players) > 1 and getNewTarget() or false
	if target then
		local time = (targetConfig.targetTime * 60) + os.time(t)
		setPlayerStorageValue(target,targetStorage,1)
		setPlayerStorageValue(target,targetTime,time)
		doBroadcastMessage('O alvo eh '..getCreatureName(target)..'. Mate-o em ate '..targetConfig.targetTime..' minutos para ganhar a recompensa!')
	else
		return false
	end
	return true
end

function isTarget(cid)
	if not isPlayer(cid) then
		return false
	end
	if getPlayerStorageValue(cid,targetStorage) == 1 then
		return (getPlayerStorageValue(cid,targetTime) - os.time(t)) > 0 and true or false
	end
	return false
end

function endTarget(cid)
	if isPlayer(cid) then
		doBroadcastMessage(getCreatureName(cid)..' nao eh mais o alvo.')
		setPlayerStorageValue(cid,targetStorage,-1)
		setPlayerStorageValue(cid,targetTime,-1)
	end
	return true
end

function resetTarget()
	local players = getPlayersOnline()
	for _,pid in ipairs(players) do
		if isTarget(pid) then
			endTarget(pid)
		end
	end
	return true
end

 

 

 

  • data/creaturescripts/scripts/targetcreature.lua

 

 

function onKill(cid, target, damage, flags)
    if not isPlayer(cid) then return true end
    if isTarget(target) then
        doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING,targetRewards.msg)
        endTarget(target)
        if targetRewards.item1 then
            doPlayerAddItem(cid,targetRewards.item1,1)
        end
        if targetRewards.item2 then
            doPlayerAddItem(cid,targetRewards.item2,1)
        end
        if targetRewards.level then
            doPlayerAddSkill(cid,8,targetRewards.level)
        end
        if targetRewards.xp then
            doPlayerAddExperience(cid,targetRewards.xp)
        end
        if targetRewards.money then
            doPlayerAddMoney(cid,targetRewards.money)
        end
        if targetConfig.resetTargetAlways == true then
            doBroadcastMessage(getCreatureName(cid)..' matou o alvo! Um novo alvo sera sorteado em breve!')
            addEvent(setTarget,5000)
        end
    end
    return true
end

function getPlayerTemplePos(cid)
    local town = getPlayerTown(cid)
    local temple = getTownTemplePosition(town)
    return temple or false
end

function onLogout(cid)
    if isPlayer(cid) then
        if isTarget(cid) then
            if targetConfig.targetCanLogOut == false then
                doPlayerSendCancel(cid,'Voce nao pode logar enquanto for o target.')
                doPlayerSendTextMessage(cid,21,'Espere '..(getPlayerStorageValue(cid,targetTime)-os.time(t))..' segundos.')
                return false
            end
            if targetConfig.resetTargetOnLogOut == true or targetConfig.resetTargetAlways == true then
                doBroadcastMessage('Outro alvo sera sorteado!')
                addEvent(setTarget,5000)
            end
        end
    end
    return true
end

function onLogin(cid)
    registerCreatureEvent(cid, "Target_Kill")
    if isTarget(cid) then
        endTarget(cid)
    end
    return true
end

 

 

 

  • data/globalevents/scripts/targetglobal.lua

 

 

function onThink()
    
    local dia = false -- Número do dia que o script será ativado [0-6 = doming-sábado] deixe false se quiser desativado
    local hora = false -- Hora de cada dia que esse script será ativado [0-23]

    local players = getPlayersOnline()
    local i = 0
    for _,pid in ipairs(players) do
        if isTarget(pid) then
            i = i + 1
        end
    end
    if i > 0 then
        return true
    end
    hora = tostring(hora)
    dia = tostring(dia)
    if dia then
        if hora then
            if hora == os.date("%H") and dia == os.date("%w") then
                setTarget()
                return true
            end
            return false
        else
            if dia == os.date("%w") then
                setTarget()
                return true
            end
            return false
        end
    elseif hora then
        if hora == os.date("%H") then
            setTarget()
            return true
        end
        return false
    else
        setTarget()
    end
    return true
end

 

 

 

Tags

  • creaturescripts.xml
<event type="kill" name="Target_Kill" event="script" value="targetcreature.lua"/>
<event type="login" name="TargetLogin" event="script" value="targetcreature.lua"/>
<event type="logout" name="TargetLogout" event="script" value="targetcreature.lua"/>
  • globalevents.xml
<globalevent name="Target System" interval="3600000" event="script" value="targetglobal.lua"/>

Configuração

 

Bom, ela é feita provavelmente só no arquivo targetlib.lua, mais precisamente nessa parte:

 

 

targetConfig = 
{
 targetCanLogOut = false, -- true para o alvo poder dar logout
 resetTargetOnLogOut = true, -- true para sortear outro alvo quando o alvo der logout (nao importa se a opcao de cima for true)
 resetTargetAlways = true, -- true para quando um alvo morrer ou logar, o server designará outro alvo
 ignoredGroups = {3,4,5,6}, -- Coloque quais grupos não poderão ser adicionados como alvos (1-player, 2-tutor, 3-senior tutor, 4-GM,5-CM, 6-GOD)
 targetTime = 5, -- Tempo que o jogador ficará como alvo (minutos)
 minLevel = 50, -- Level mínimo para ser escolhido como alvo
}
targetRewards = -- Recompensas que o cara que matar o alvo ganhará
{
 level = 3,
 xp = false,
 item1 = false,
 item2 = false,
 money = 10000,
 msg = 'Voce matou o alvo e conseguiu sua recompensa!',
 }

 

 

 

A outra parte é que você pode restringir o dia e a hora em que o evento ocorrerá no arquivo targetglobal.lua:

local dia = false -- Número do dia que o script será ativado [0-6 = doming-sábado] deixe false se quiser desativado
local hora = false -- Hora de cada dia que esse script será ativado [0-23]

Novamente, caso encontrem erros, digam qual é o erro e postem o que apareceu no executável ou apontem a parte do código que está dando erro.

Edited by omega blueheaven
Link to comment
Share on other sites

muito com REP +,vou testar ela aqui e te falo

 

assim se eu quiser todos os dias?

 

local dia = 0,1,2,3,4,5,6 -- Número do dia que o script será ativado [0-6 = doming-sábado] deixe false se quiser desativado
local hora = 8 -- Hora de cada dia que esse script será ativado [0-23]

Edited by kleitonalan321
Link to comment
Share on other sites

muito com REP +,vou testar ela aqui e te falo

 

assim se eu quiser todos os dias?

 

local dia = 0,1,2,3,4,5,6 -- Número do dia que o script será ativado [0-6 = doming-sábado] deixe false se quiser desativado

local hora = 8 -- Hora de cada dia que esse script será ativado [0-23]

pra todos os dias coloque 0-6

 

omega:

É possivel adicionar no script,que o target sobreviver o 5 minutos ele ganhe recompensa? E tambem que ele nao possa entrar em area PZ enquanto for o sorteado,e claro nao sortear alguem que esteja em PZ porque se nao ele nao vai querer sair né. rsrs

Link to comment
Share on other sites

Para que o evento ocorra todos os dias, deixe ambos como false (como está na configuração padrão do tópico). Não pretendo fazer mudanças por enquanto, por preguiça e por falta de tempo. Podem até deixar sugestões, mas vou me concentrar em consertar possíveis erros.

 

A essa altura, não é possível escolher mais que um dia para o evento ocorrer. Ou seja, o evento ocorrerá todos os dias ou apenas em um deles.

 

OBS.: creio ter encontrado um erro quanto à restrição de dia/hora. Alterei no tópico para corrigir.

Edited by omega blueheaven
Link to comment
Share on other sites

  • 3 weeks later...
×
×
  • Create New...