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.