Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- identifier, config = ...
- if config.centerPosMore then
- config.centerPos.x, config.centerPos.y =
- config.centerPos.x+config.centerPosMore.x,
- config.centerPos.y+config.centerPosMore.y
- end
- duel = CreateTemplate("duel", identifier)
- duel:blockJoinWhenStart()
- duel:setCanTeleportInside(false)
- duel:setCanUseReviveInside(false)
- duel:setCanUsePotionsInside(false)
- duel:setCanUseMedicineInside(false)
- duel:setResetFunction(
- function()
- duel:setBattleActive(false)
- duel:setThrowItemsOnTheFloorInside(true)
- duel:setCanFlyInside(true)
- duel:setCanRideInside(true)
- end)
- duel:setupVariables(
- function()
- duel.m.totalTime = 0
- duel.m.queueType = 1
- duel.m.playersCanTurn = true
- duel.m.canUseSpells = true
- duel.m.playerUsedFirstPoke = {false, false, false, false}
- duel.m.playerElos = {}
- duel.m.playersDown = {0, 0}
- end)
- duel:setStopFunction(
- function(whoAreWin, penalty)
- local players = duel:getPlayers()
- local winner, loser, winnerElo, loserElo, newEloWinner, newEloLoser, whoAreLoser
- if duel.m.queueType == 2 then
- winnerElo, loserElo, newEloWinner, newEloLoser, whoAreLoser = {}, {}, {}, {}, {}
- end
- if not (penalty) then
- local timeStart = duel.m.totalTime-(config.totalTime*60)
- if getTime()-timeStart < 180 then
- penalty = config.otherPenaltys
- else
- penalty = 0
- end
- end
- for x = 1, #players do
- local current = players[x]
- current:set("inDuel", nil)
- current:set("cantMoveItens", nil)
- if not duel.m.playersCanTurn then
- current:teleport(current:getPosInStorage("posSoloDuelArena"..identifier))
- end
- if whoAreWin then
- if duel.m.queueType == 1 then
- if whoAreWin:getCid() == current:getCid() then
- winner = current
- winnerElo = duel.m.playerElos[x]
- else
- loser = current
- loserElo = duel.m.playerElos[x]
- end
- else
- if current:getCid() == whoAreWin[1]:getCid() or current:getCid() == whoAreWin[2]:getCid() then
- if not winner then
- if x == 1 or x == 3 then
- winner = 1
- else
- winner = 2
- end
- end
- else
- table.insert(whoAreLoser, current)
- if not loser then
- if x == 1 or x == 3 then
- loser = 1
- else
- loser = 2
- end
- end
- end
- end
- else
- current:sendBlueMessage(config.msgDraw)
- end
- setBlockDuel(current:getCid(), false)
- duel:exit(current)
- end
- if whoAreWin then
- if duel.m.queueType == 1 then
- newEloWinner, newEloLoser = doSoloDuelRating(winnerElo, loserElo, 1, 0)
- newEloLoser = newEloLoser-penalty
- winner:sendBlueMessage(string.format(config.msgWinner, math.floor(newEloWinner)))
- loser:sendBlueMessage(string.format(config.msgLoser, math.floor(newEloLoser)))
- config.funcStop(players, whoAreWin, {{player = winner, newElo = newEloWinner}, {player = loser, newElo = newEloLoser}}, duel.m.queueType)
- else
- newEloWinner, newEloLoser = doTeamDuelRating(duel.m.playerElos[winner], duel.m.playerElos[loser], 1, 0)
- for x = 1, 2 do
- newEloLoser[x] = newEloLoser[x]-penalty
- whoAreWin[x]:sendBlueMessage(string.format(config.msgWinner, math.floor(newEloWinner[x])))
- whoAreLoser[x]:sendBlueMessage(string.format(config.msgLoser, math.floor(newEloLoser[x])))
- end
- config.funcStop(players, whoAreWin, {{player = whoAreWin[1], newElo = newEloWinner[1]}, {player = whoAreWin[2], newElo = newEloWinner[2]}, {player = whoAreLoser[1], newElo = newEloLoser[1]}, {player = whoAreLoser[2], newElo = newEloLoser[2]}}, duel.m.queueType)
- end
- end
- end)
- function startAfter()
- local players = duel:getPlayers()
- local canStart = {}
- for x = 1, #players do
- players[x]:backMountary()
- players[x]:backPokemon()
- canStart[x] = false
- if #players[x]:getActivePokeballList() >= config.numberPokesDuel then
- if getTilePzInfo(players[x]:getPosition()) == TRUE then
- canStart[x] = true
- end
- end
- end
- if duel.m.queueType == 1 then
- if canStart[1] == false or canStart[2] == false then
- local whoAreWin = false
- if canStart[1] == true and canStart[2] == false then
- whoAreWin = players[1]
- elseif canStart[1] == false and canStart[2] == true then
- whoAreWin = players[2]
- end
- duel:stop(whoAreWin, config.penaltyDisqualification)
- return
- end
- else
- if (canStart[1] == false or canStart[3] == false) or (canStart[2] == false or canStart[4] == false) then
- local whoAreWin = false
- if (canStart[1] == true and canStart[3] == true) and (canStart[2] == false or canStart[4] == false) then
- whoAreWin = {players[1], players[3]}
- elseif (canStart[2] == true and canStart[4] == true) and (canStart[1] == false or canStart[3] == false) then
- whoAreWin = {players[2], players[4]}
- end
- duel:stop(whoAreWin, config.penaltyDisqualification)
- return
- end
- end
- for index, current in pairs(players) do
- current:setPosInStorage("posSoloDuelArena"..identifier, current:getPosition())
- current:teleport({x=config.centerPos.x+config.bornDistance[duel.m.queueType][index].x,y=config.centerPos.y+config.bornDistance[duel.m.queueType][index].y,z=config.centerPos.z})
- if index == 3 or index == 4 then
- current:setLookDir(getDirectionTo(current:getPosition(), {x=config.centerPos.x, y=config.centerPos.y+1, config.centerPos.z}))
- else
- current:setLookDir(getDirectionTo(current:getPosition(), config.centerPos))
- end
- current:sendBlueMessage(config.msgDelay)
- end
- duel.m.canUseSpells = false
- duel.m.playersCanTurn = false
- duel:addEvent(startMainDuel, config.delayToStart*1000, nil)
- --duel:setBattleActive(true)
- duel:setThrowItemsOnTheFloorInside(false)
- duel:setCanFlyInside(false)
- duel:setCanRideInside(false)
- local timesToSend = {30, 20, 5, 1, 1, 1, 1}
- local correctString = {30, 10, 5, 4, 3, 2, 1}
- startClockMsgs({msgType = "second", format = timesToSend, index = -1, correctString = correctString})
- end
- function startClockMsgs(params)
- if not duel:isActive() then -- remove error msg; this module needs a rework
- return
- end
- local msgType, format, index, correctString = params.msgType, params.format, params.index, params.correctString
- local players = duel:getPlayers()
- if index >= 0 then
- index = index+1
- for _, current in pairs(players) do
- if msgType == "first" then
- current:sendBlueMessage("|" .. correctString[index].."| seconds to start.")
- else
- current:sendBlueMessage("You have |"..correctString[index].."| seconds to choose your pokemon.")
- end
- end
- else
- index = 0
- end
- params.index = index
- if format[index+1] then
- duel:addEvent(startClockMsgs, format[index+1]*1000, params)
- end
- end
- duel:setStartFunction(
- function(eloPlayer1, eloPlayer2)
- local players = duel:getPlayers()
- if #players >= 4 then
- duel.m.queueType = 2
- end
- duel.m.playerElos = {eloPlayer1, eloPlayer2}
- duel.m.totalTime = getTime()+(config.totalTime*60)
- duel:addEvent(startAfter, config.delayToEnter*1000, nil)
- for index, current in pairs(players) do
- current:set("inDuel", true)
- local nameAndClan
- if duel.m.queueType == 1 then
- if index == 1 then
- nameAndClan = players[2]:getName().." ("..players[2]:getFirstVocationName()..", Level: "..players[2]:getLevel()..")"
- else
- nameAndClan = players[1]:getName().." ("..players[1]:getFirstVocationName()..", Level: "..players[1]:getLevel()..")"
- end
- else
- if index == 1 or index == 3 then
- nameAndClan = players[2]:getName().." ("..players[2]:getFirstVocationName()..", Level: "..players[2]:getLevel()..") and "..players[4]:getName().." ("..players[4]:getFirstVocationName()..", Level: "..players[4]:getLevel()..")"
- else
- nameAndClan = players[1]:getName().." ("..players[1]:getFirstVocationName()..", Level: "..players[1]:getLevel()..") and "..players[3]:getName().." ("..players[3]:getFirstVocationName()..", Level: "..players[3]:getLevel()..")"
- end
- end
- stopDuel(current:getCid())
- setBlockDuel(current:getCid(), true)
- current:sendRedMessage("Match Found! " .. string.format(config.msgBeforeEnter, nameAndClan))
- end
- local timesToSend = {30, 20, 5, 1, 1, 1, 1}
- local correctString = {30, 10, 5, 4, 3, 2, 1}
- startClockMsgs({msgType = "first", format = timesToSend, index = -1, correctString = correctString})
- config.funcStart(players)
- end)
- function startMainDuel()
- local players = duel:getPlayers()
- playersReady = {true, true}
- for x = 1, #players do
- players[x]:set("cantMoveItens", nil)
- if not (players[x]:getFirstSummon()) then
- if duel.m.queueType == 1 then
- playersReady[x] = false
- else
- if x == 1 or x == 3 then
- playersReady[1] = false
- else
- playersReady[2] = false
- end
- end
- end
- setBlockDuel(players[x]:getCid(), false)
- end
- if playersReady[1] == false or playersReady[2] == false then
- local whoAreWin = false
- if playersReady[1] == true and playersReady[2] == false then
- if duel.m.queueType == 1 then
- whoAreWin = players[1]
- else
- whoAreWin = {players[1], players[3]}
- end
- elseif playersReady[1] == false and playersReady[2] == true then
- if duel.m.queueType == 1 then
- whoAreWin = players[2]
- else
- whoAreWin = {players[2], players[4]}
- end
- end
- duel:stop(whoAreWin, config.penaltyDisqualification)
- return
- else
- if duel.m.queueType == 1 then
- startDuel({{cid = players[1]:getCid()}, {cid = players[2]:getCid()}}, config.numberPokesDuel)
- else
- startDuel({{cid = players[1]:getCid()}, {cid = players[3]:getCid()}, {cid = players[2]:getCid()}, {cid = players[4]:getCid()}}, config.numberPokesDuel)
- end
- end
- duel:addEvent(function() duel.m.canUseSpells = true end, 5*1000, nil)
- end
- function onWinDuelInArena(params)
- if not duel:isActive() then return end
- local player = GetCreature(params.cid)
- local players = duel:getPlayers()
- if duel.m.queueType == 1 then
- for x = 1, #players do
- if players[x]:getCid() == player:getCid() then
- duel:stop(player)
- return true
- end
- end
- else
- for x = 1, #players do
- if players[x]:getCid() == player:getCid() then
- if x == 1 or x == 3 then
- duel:stop({players[1], players[3]})
- else
- duel:stop({players[2], players[4]})
- end
- return true
- end
- end
- end
- return true
- end
- g_Events.addEvent("onWinDuel", "onWinDuelInArena"..identifier, onWinDuelInArena)
- duel:setLoopFunction(
- function()
- local currentTime = getTime()
- if currentTime > duel.m.totalTime or g_game.getTournament().hasFinishedSubscriptions() then
- duel:stop(false)
- end
- end, 1000)
- duel:createAction("canTurn", function() return duel.m.playersCanTurn end, "canTurnInSoloDuel", true)
- duel:createAction("canWalkToPosition", function() return duel.m.playersCanTurn end, "canWalkInSoloDuel", true)
- g_Events.addEvent("canPokemonCastSpell", "soloDuelArenaCanUseSpell"..identifier,
- function(params)
- if not duel:isActive() then return true end
- local monster = GetCreature(params.cid)
- local master = monster:getMaster()
- if master == nil then
- return true
- end
- local player = GetCreature(master)
- if not player:get("inDuel") then return true end
- for _, current in pairs(duel:getPlayers()) do
- if current:getCid() == player:getCid() then
- return duel.m.canUseSpells
- end
- end
- return true
- end)
- g_Events.addEvent("canSummonPokemon", "soloDuelArenaCanUsePoke"..identifier,
- function(params)
- if not duel:isActive() then return true end
- local player = GetCreature(params.cid)
- if not player:get("inDuel") then return true end
- for _, current in pairs(duel:getPlayers()) do
- if current:getCid() == player:getCid() then
- if not duel.m.canUseSpells then
- player:set("cantMoveItens", true)
- end
- return true
- end
- end
- return true
- end)
- duel:addFuncOnPlayerLogout(function(player)
- local players = duel:getPlayers()
- if duel.m.queueType == 1 then
- if player:getCid() == players[1]:getCid() then
- duel:stop(players[2], config.penaltyDisqualification)
- else
- duel:stop(players[1], config.penaltyDisqualification)
- end
- else
- if player:getCid() == players[1]:getCid() or player:getCid() == players[3]:getCid() then
- duel:stop({players[2], players[4]}, config.penaltyDisqualification)
- else
- duel:stop({players[1], players[3]}, config.penaltyDisqualification)
- end
- end
- return true
- end)
- runOnce("canMoveItensInSoloDuel", function()
- function canMoveItensInSoloDuel(params)
- local player = GetCreature(params.cid)
- if player:get("cantMoveItens") then
- return false
- end
- return true
- end
- g_Events.addEvent("canDragThings", "canMoveItensInSoloDuel", canMoveItensInSoloDuel)
- end)
- function start(player1, player2, eloPlayer1, eloPlayer2, player21, player22, eloInd1, eloInd2)
- if not (player21 and player22) then
- if duel:multipleJoin({player1, player2}) then
- duel:start(eloPlayer1, eloPlayer2)
- return true
- end
- else
- if duel:multipleJoin({player1, player2, player21, player22}) then
- duel:start(eloInd1, eloInd2)
- return true
- end
- end
- return false
- end
- function stop()
- if duel:isActive() then
- duel:stop()
- return true
- else
- return false
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement