Ir para conteúdo
  • Cadastre-se

Duvida no Evento Team Battle (MOD)


Posts Recomendados

Pessoal eu tenho esse evento aqui, mas eu estou tendo um certa dificuldade com ele pois o mesmo esta funcionando 99%
Meu problema é que quando os players começam a ir para o evento, se o primeiro player a entrar no teleporte não sair da pocisão que ele se encontra na sala de espera, outros players não conseguem entrar. Dando este aviso: patient till the event starts and don't logout:
 
Segue o script abaixo:




Full auto Team BattleEvent(v2.0) for 0.3.6PL1 :

1- I currently rescripted this event from scratch again.

2- This version is much more better than the one before, it is more cleaner, clearer and with more options.

3- This version dislike the previous one , was tested on 0.3.6PL1 and works just fine.

4- Removed the npc part it is now based on tp creation.

5- More silent boradcasting for in event progress and no spam, I hope!

6- you now get the options to show event stats on cancel msg area and (to / not to) show left players with names each x interval.

8- Team balancer have been added to only balance count in both teams.

9- Added a countdown option before fight starts.

10- Now starts on a defined time every day



--[[Local Config]]--

--//storages

inBlue = 9900
inRed = 9901
joiner = 9907

blueKills = 9902
redKills = 9903

eventRecruiting = 9904
eventStarted = 9905
eventTime = 9906

itemToGet = 9908
countItemToGet = 9909

nextExecute = 9910

blueCount = 9911
redCount = 9912

--// Positions

teleporterPosition = {x = 1585, y = 1025, z = 7}

waitRoomPlace = {x = 1477, y = 1314, z = 7}

waitRoomDimensions = {
startPos = {x = 1473, y = 1312, z = 7},
endPos = {x = 1482, y = 1316 , z = 7}
}


eventPlaceDimensions = {
startPos = {x = 1458, y = 1290, z = 7},
endPos = {x = 1513, y = 1307, z = 7}
}
blueTeamPos = {x = 1517, y = 1298, z = 7}
redTeamPos = {x = 1453, y = 1297, z = 7}


--// General settings

recruitTime = 1

minimumPlayersJoins = 1

balanceTeams = false


removeTeleportOnEventEnd = true

eventMaxTime = 15

showEventSats = true


sendLeftPlayers = true
intervalToSendLeftPlayers = 11


countDownOnStart = true


countDownFrom = 10

minJoinLevel = 8

rewards = {

[65] = { {2476,1} , {"gold coin",500} },
[25] = { {"golden armor",1} , {2152,90} },
[10] = { {"dragon scale mail",1} , {"crystal coin",10} }
}
]]>
domodlib('teamSetting')

--[[Conditions don't touch]]--
local bmale = createConditionObject(CONDITION_OUTFIT)
setConditionParam(bmale, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(bmale, {lookType = math.random(128,134), lookHead = 88, lookBody = 88, lookLegs = 88, lookFeet = 88, lookTypeEx = 0, lookAddons = 3})

local bfemale = createConditionObject(CONDITION_OUTFIT)
setConditionParam(bfemale, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(bfemale, {lookType = math.random(136,142), lookHead = 88, lookBody = 88, lookLegs = 88, lookFeet = 88, lookTypeEx = 0, lookAddons = 3})

local rmale = createConditionObject(CONDITION_OUTFIT)
setConditionParam(rmale, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(rmale, {lookType = math.random(128,134), lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94, lookTypeEx = 0, lookAddons = 3})

local rfemale = createConditionObject(CONDITION_OUTFIT)
setConditionParam(rfemale, CONDITION_PARAM_TICKS, -1)
addOutfitCondition(rfemale, {lookType = math.random(136,142),lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94, lookTypeEx = 0, lookAddons = 3})

local infight = createConditionObject(CONDITION_INFIGHT,-1)
--[[Local Config]]--

--[[Functions]]--

-- General info
function isFightOn()
return getStorage(eventStarted) > 0
end
function isRecruitOn()
return getStorage(eventRecruiting) > 0
end
function getMinJoinLevel()
return minJoinLevel
end
function getJoiners()
joiners = {}
for _,cid in ipairs(getPlayersOnline()) do
if isJoiner(cid) then
if isInRecruitArea(cid) or isInFightArea(cid) then
table.insert(joiners,cid)
end
end
end
return joiners
end

function getLeftMembersNames(team)
str = "Oponents left("..#team..") :"
left = ""
for k,cid in ipairs(team) do left = (left ..""..(k == 1 and "" or ", ")..""..getCreatureName(cid).."["..getPlayerLevel(cid).."]" ) end
str = str .." " .. (left == "" and "none" or left).. "."
return str
end
function disPlayEventStats()
if not showEventSats then return false end
if getStorage(eventTime) - os.time() <= 0 then return false end

left = os.date("%M:%S",(getStorage(eventTime) - os.time()))
for _,cid in ipairs(getJoiners()) do
oponentsLeft = isBlue(cid) and #getRedMembers() or #getBlueMembers()
teamMatesLeft = isBlue(cid) and math.max(0,#getBlueMembers()-1) or math.max(0,#getRedMembers()-1)
doPlayerSendCancel(cid,"Time left: ".. left.." || Oponents left: "..oponentsLeft.."/"..oponentCount(cid).." || Team-mates left: "..teamMatesLeft.."/".. math.max(0,matesCount(cid)-1))
end

end

function doSendLeftPlayers()
if not sendLeftPlayers then return false end
if intervalToSendLeftPlayers <= 10 then return false end
for _,cid in ipairs(getJoiners()) do
doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],getLeftMembersNames(isRed(cid) and getBlueMembers() or getRedMembers()))
end
end

function getBlueMembers()
members = {}
for _,cid in ipairs(getPlayersOnline()) do
if isBlue(cid) then
table.insert(members,cid)
end
end
return members
end
function getRedMembers()
members = {}
for _,cid in ipairs(getPlayersOnline()) do
if isRed(cid) then
table.insert(members,cid)
end
end
return members
end


-- starting fight

function startRecruiting()
doSetStorage(eventRecruiting,1)
end
function startEvent()
doSetStorage(eventRecruiting,-1)

if removeTeleportOnEventEnd then
tp = getTileItemById(teleporterPosition,1387).uid
if tp > 0 then doRemoveItem(tp) end
end

if not balanceTeams() then
resetEvent()
return false
end
for _,cid in ipairs(getBlueMembers()) do
doTeleportThing(cid,blueTeamPos,false)
doSendMagicEffect(getThingPos(cid),10)
end
setBlueCount(#getBlueMembers())
for _,cid in ipairs(getRedMembers()) do
doTeleportThing(cid,redTeamPos,false)
doSendMagicEffect(getThingPos(cid),10)
end
setRedCount(#getRedMembers())
startCountDown()
return true
end

function setBlueCount(count)
doSetStorage(blueCount,-1)
doSetStorage(blueCount,count)
end
function oponentCount(cid)
return isBlue(cid) and getStorage(redCount) or getStorage(blueCount)
end
function matesCount(cid)
return isBlue(cid) and getStorage(blueCount) or getStorage(redCount)
end

function setRedCount(count)
doSetStorage(redCount,-1)
doSetStorage(redCount,count)
end
function balanceTeams()
members = getJoiners()
if #members < minimumPlayersJoins then
doBroadcastMessage("Team-Battle event was cancelled as only ".. #members .. " players joined.")
return false
end
if (math.mod(#members,2) ~= 0) then
kicked = members[#members]
clearTeamEventStorages(kicked)
doPlayerSendTextMessage(kicked,MESSAGE_TYPES["info"],"Sorry, you have been kicked out of event for balancing both teams.")
end
count = 1
for _,cid in ipairs(getJoiners()) do
if (math.mod(count,2) ~= 0) then
addToBlue(cid)
else
addToRed(cid)
end
count = count + 1
end
return true
end
function startCountDown()
if(countDownOnStart) then
for _,cid in ipairs(getJoiners()) do
doCreatureSetNoMove(cid,true)
for i = 0,countDownFrom do
addEvent(doPlayerSendTextMessage,i*1000, cid, MESSAGE_TYPES["info"], (i == 0 and countDownFrom or countDownFrom-i) )
end
end
addEvent(startFight,(countDownFrom+1)*1000)
else
startFight()
end
end
function startFight()
doSetStorage(eventStarted,1)
for _,cid in ipairs(getJoiners()) do
doCreatureSetNoMove(cid,false)
doPlayerSendTextMessage(cid,MESSAGE_TYPES["warning"],"Fight Starts!")
end
addEvent(endTeamEvent,eventMaxTime*60*1000,"maxTime")
doSetStorage(eventTime,os.time()+eventMaxTime*60)
end

function teleportToWaitRoom(cid)
doTeleportThing(cid,waitRoomPlace)
doSendMagicEffect(waitRoomPlace,10)
if getPlayerGroupId(cid) < 4 then
addToJoiners(cid)
end
doPlayerSendTextMessage(cid,MESSAGE_TYPES["blue"],"Please be patient till the event starts and don't logout.")
return true
end



-- Modifing teams & checking member states
function isBlue(cid)
return (getPlayerStorageValue(cid,inBlue) > 0)
end
function isRed(cid)
return (getPlayerStorageValue(cid,inRed) > 0)
end
function isJoiner(cid)
return (getPlayerStorageValue(cid,joiner) > 0)
end
function addToBlue(cid)
setPlayerStorageValue(cid,inBlue,1)
doAddCondition(cid, (getPlayerSex(cid) == 1) and bmale or bfemale)
doAddCondition(cid,infight)
end
function addToRed(cid)
setPlayerStorageValue(cid,inRed,1)
doAddCondition(cid, (getPlayerSex(cid) == 1) and rmale or rfemale)
doAddCondition(cid,infight)
end
function addToJoiners(cid)
setPlayerStorageValue(cid,joiner,1)
end
function removeFromBlue(cid)
setPlayerStorageValue(cid,inBlue,-1)
end
function removeFromRed(cid)
setPlayerStorageValue(cid,inRed,-1)
end
function removeFromjoiners(cid)
setPlayerStorageValue(cid,joiner,-1)
end
function isInRecruitArea(cid)
return isInRange(getThingPos(cid),waitRoomDimensions.startPos,waitRoomDimensions.endPos)
end
function isInFightArea(cid)
return isInRange(getThingPos(cid),eventPlaceDimensions.startPos,eventPlaceDimensions.endPos)
end
function clearTeamEventStorages(cid)
if isInRecruitArea(cid) or isInFightArea(cid) then
doTeleportThing(cid,getTownTemplePosition(getPlayerTown(cid)))
doSendMagicEffect(getThingPos(cid),10)
end

if isFightOn() then
if isJoiner(cid) then
if isBlue(cid) then
addRedKills()
elseif isRed(cid) then
addBlueKills()
end
doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],"You have died in Team-Battle Event.")
end
end

removeFromjoiners(cid)
removeFromBlue(cid)
removeFromRed(cid)
doRemoveConditions(cid, false)

end
function haveUnrecivedReward(cid)
return getPlayerStorageValue(cid,itemToGet) > 0 and getPlayerStorageValue(cid,countItemToGet) > 0
end
function recieveLateReward(cid)
if haveUnrecivedReward(cid) then
if not doPlayerAddItem(cid,getPlayerStorageValue(cid,itemToGet),getPlayerStorageValue(cid,countItemToGet),false) then
msg = "You need to free some space then relog to take your reward."
doPlayerSendTextMessage(cid,MESSAGE_TYPES["warning"],msg)
else
setPlayerStorageValue(cid,itemToGet,-1)
setPlayerStorageValue(cid,countItemToGet,-1)
doPlayerSendTextMessage(cid,MESSAGE_TYPES["info"],"You have recieved your reward.")
end
end
end

-- Win or lose
function thereIsAWinner()
if redWon() or blueWon() then
return true
end
return false
end
function blueWon()
return( (#getBlueMembers() > 0 ) and ( #getRedMembers() == 0) )
end
function redWon()
return( (#getRedMembers() > 0) and (#getBlueMembers() == 0) )
end
function isDraw()
return #getBlueMembers() == #getRedMembers()
end
function getWinner()
if #getBlueMembers() > #getRedMembers() then
return {getBlueMembers(),getRedMembers(),"Blue team won."}
elseif #getRedMembers() > #getBlueMembers() then
return {getRedMembers(),getBlueMembers(),"Red team won."}
else
return { {},{},"it was a draw."}
end
end


-- Adding kills
function addBlueKills()
doSetStorage(blueKills, math.max(1,getStorage(blueKills)+1))
end
function addRedKills()
doSetStorage(redKills, math.max(1,getStorage(redKills)+1))
end

-- Ending event

function endTeamEvent(type)
if isFightOn() then
doSetStorage(eventStarted,-1)
doBroadcastMessage("Team-Battle event ended and "..getWinner()[3])
if not isDraw() then
win(getWinner()[1],type)
lose(getWinner()[2],type)
else
draw()
end
end
addEvent(resetEvent,2 * 1000) --- tp player to home remove all storages and reset event global storages
end

function getPercent()
rand= math.random(1,100)
prev = 0
chosenItem = 0
for k, v in pairs(rewards) do
if rand > prev and rand <= k+prev then
chosenItem = k
break
else
prev = k+prev
end
end
return chosenItem
end

function generateReward(cid)
percent = getPercent()
if percent == 0 then
print("Error in the reward item. Please inform Doggynub.")
return true
end

randomizer = rewards[percent][math.random(1,#rewards[percent])]
item = not tonumber(randomizer[1]) and getItemIdByName(randomizer[1]) or randomizer[1]
count = isItemStackable(item) and math.min(randomizer[2],100) or 1
if item == nil or item == 0 then
print("Error in the item format. Please inform Doggynub.")
return true
end

msg = "You have won ".. (count == 1 and "a" or count) .." " .. getItemNameById(item) .. "" .. (count == 1 and "" or "s").."."

if not doPlayerAddItem(cid,item,count,false) then
msg = msg.. "You need to free some space then relog to take your reward."
setPlayerStorageValue(cid,itemToGet,item)
setPlayerStorageValue(cid,countItemToGet,count)
end

doPlayerSendTextMessage(cid,MESSAGE_TYPES["white"],msg)

end



function generateStatsMessage(cid, type, stats)
msg = {
["KO"] = { ["win"] = "Event ended. Your team have won by killing all oponent's team members. You will recieve your reward shortly, check incoming messages.",
["lose"] = "Event ended. Your team have lost as the Oponent team killed all your team's members."
},
["maxTime"] = {
["win"] = "Event max-time finished and your team have won. You will recieve your reward shortly, check incoming messages.",
["lose"] = "Event max-time finished and your team have lost.",
["draw"] = "Event max-time finished and it is a draw.(no team won)"
}
}
doPlayerSendTextMessage(cid,MESSAGE_TYPES["info"],msg[type][stats])

end
function win(winners,type)
for _,cid in ipairs(winners) do
generateStatsMessage(cid, type, "win")
generateReward(cid)
end
end
function lose(losers,type)
for _,cid in ipairs(losers) do
generateStatsMessage(cid, type, "lose")
end
end
function draw()
for _,cid in ipairs(getJoiners()) do
generateStatsMessage(cid, "maxTime", "draw")
end
end

function resetEvent()
doSetStorage(eventRecruiting,-1)
doSetStorage(nextExecute,-1)
doSetStorage(eventStarted,-1)
doSetStorage(eventTime,-1)
doSetStorage(blueKills,-1)
doSetStorage(redKills,-1)
for _,cid in ipairs(getPlayersOnline()) do
if isBlue(cid) or isRed(cid) or isJoiner(cid) then
clearTeamEventStorages(cid)
end
end
end


]]>
domodlib('teamFunctions')

function onLogin(cid)
clearTeamEventStorages(cid)
recieveLateReward(cid)

registerCreatureEvent(cid, "teamEventStats")
registerCreatureEvent(cid, "teambattleLogout")
registerCreatureEvent(cid, "teambattleCombat")
return true
end
]]>
domodlib('teamFunctions')

function onCombat(cid, target)
if isFightOn() then
if isBlue(cid) and isBlue(target) then
return false
end
if isRed(cid) and isRed(target) then
return false
end
end
return true
end

]]>
domodlib('teamFunctions')

function onLogout(cid)
clearTeamEventStorages(cid)
if thereIsAWinner() then
endTeamEvent("KO")
end
return true
end

]]>
domodlib('teamFunctions')

corpse_ids = {
[0] = 3065, -- female
[1] = 3058 -- male
}
function onStatsChange(cid, attacker, type, combat, value)
if combat == COMBAT_HEALING then
return true
end
if getCreatureHealth(cid) > value then
return true
end

if isInFightArea(cid) and isFightOn() then
if isBlue(cid) or isRed(cid) then
corpse = doCreateItem(corpse_ids[getPlayerSex(cid)], 1, getThingPos(cid))
doCreateItem(2016, 2, getThingPos(cid))
clearTeamEventStorages(cid)
doItemSetAttribute(corpse, "description", "You recognize "..getCreatureName(cid)..". He was killed by "..(isMonster(attacker) and "a "..string.lower(getCreatureName(attacker)) or isCreature(attacker) and getCreatureName(attacker) or "a field item")..".n[Team-Event kill]")
doCreatureAddHealth(cid,getCreatureMaxHealth(cid))
if thereIsAWinner() then
endTeamEvent("KO")
end

return false

end

end

return true
end
]]>

domodlib('teamFunctions')

function onTimer()
resetEvent()
if getTileItemById(teleporterPosition,1387).uid < 1 then
tp = doCreateItem(1387,1,teleporterPosition)
doItemSetAttribute(tp, "aid", 9990)
end

startRecruiting()
for i = 0, recruitTime-1 do
addEvent(doBroadcastMessage, i * 60* 1000,"Team-Battle event is recruting players by entering event tp. Fight begins in "..(i == 0 and recruitTime or recruitTime-i).." minutes.",MESSAGE_TYPES["warning"])
end

addEvent(startEvent, recruitTime * 60 * 1000)

return true
end


]]>

domodlib('teamFunctions')

function onThink()
if isFightOn() then
disPlayEventStats()

if getStorage(nextExecute) == -1 or getStorage(nextExecute) <= os.time() then
doSendLeftPlayers()
doSetStorage(nextExecute,os.time()+intervalToSendLeftPlayers)
end
end
return true
end

]]>
domodlib('teamFunctions')

function onStepIn(cid, item, position, fromPosition)
if not isRecruitOn() then
doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],"Event isn't currently opened.")
doTeleportThing(cid,fromPosition)
doSendMagicEffect(fromPosition,2)
return true
end
if getPlayerLevel(cid) < getMinJoinLevel() then
doPlayerSendTextMessage(cid,MESSAGE_TYPES["orange"],"Only players of level ".. getMinJoinLevel().. "+ can join this event.")
doTeleportThing(cid,fromPosition)
return true
end
teleportToWaitRoom(cid)
return true
end


]]>

Link para o post
Compartilhar em outros sites

Já pensou em colocar uma escada do outro lado e cercar ela pra não ter mais volta? Ai sempre que chegarem do outro lado do teleport, a escada faria o player andar pra frente automaticamente. Quando ele andar, ele sai da escada. Se tu cercar a escada, não tem como ele voltar nela e nem ficar encima dela trapando os outros players. Não manjo de script, mas seria uma solução.

Link para o post
Compartilhar em outros sites

Já pensou em colocar uma escada do outro lado e cercar ela pra não ter mais volta? Ai sempre que chegarem do outro lado do teleport, a escada faria o player andar pra frente automaticamente. Quando ele andar, ele sai da escada. Se tu cercar a escada, não tem como ele voltar nela e nem ficar encima dela trapando os outros players. Não manjo de script, mas seria uma solução.

 

Brother, obrigado pela dica, porem eu já tinha pensando em algo parecido, na verdade eu pensei em colocar as coordenados para os players cairem em cima de um teleporte onde enviariam eles para um lugar diferente, porem o erro fica 50% solucionado, pois, quando o evento começa e um time chega a ganhar no final, os mesmos são teletransportados para o templo, e neste caso o erro atua novamente.

Link para o post
Compartilhar em outros sites

só tu apagar a parte do script
 

function teleportToWaitRoom(cid)
doTeleportThing(cid,waitRoomPlace)
doSendMagicEffect(waitRoomPlace,10)
if getPlayerGroupId(cid) < 4 then
addToJoiners(cid)
end
doPlayerSendTextMessage(cid,MESSAGE_TYPES["blue"],"Please be patient till the event starts and don't logout.")
return true
end

Ajudei? REP+

 

 

 
 
Spriter: |||||||||| 10%

 

Link para o post
Compartilhar em outros sites

Siga a dica do amigo rodrigorodrigues
Certamente funcionara.

tibiaking.png
 

www.optimuserver.com

[email protected]

Skype: optimus.host

TEL: (16) 98849-6902

 

Acesse já e garanta seu servidor com um dos melhores Firewall existentes no mercado!

Link para o post
Compartilhar em outros sites

Segue o erro:

 

[07/05/2014 21:10:03] [Error - MoveEvents Interface]


[07/05/2014 21:10:03] buffer:onStepIn
[07/05/2014 21:10:03] Description:
[07/05/2014 21:10:03] [string "loadBuffer"]:15: attempt to call global 'teleportToWaitRoom' (a nil value)
[07/05/2014 21:10:03] stack traceback:
[07/05/2014 21:10:03] [string "loadBuffer"]:15: in function <[string "loadBuffer"]:3>

 

Editado por markim1986 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Tente adicionar um end no final do codigo.

tibiaking.png
 

www.optimuserver.com

[email protected]

Skype: optimus.host

TEL: (16) 98849-6902

 

Acesse já e garanta seu servidor com um dos melhores Firewall existentes no mercado!

Link para o post
Compartilhar em outros sites

o erro que tá dando é nisso daqui (no final do script)

teleportToWaitRoom(cid)

ele tá executando uma função que você removeu, logo, você deverá remover essa parte também.

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

o erro que tá dando é nisso daqui (no final do script)

teleportToWaitRoom(cid)

ele tá executando uma função que você removeu, logo, você deverá remover essa parte também.

 

Removi essa parte também, o script executa sem erros, o teleporte abre no templo, mas quando eu piso nele, o mesmo não envia para a sala de espera, mas tambem não da erro no console.

Link para o post
Compartilhar em outros sites

não envia porque vc removeu a função que enviava pra waiting room ué auhauhauh se os caras falaram que dava certo era pra dar certo

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo